[
  {
    "path": ".gitignore",
    "content": "# Compiled class file\n*.class\n\n# Log file\n*.log\n\n# BlueJ files\n*.ctxt\n\n# Mobile Tools for Java (J2ME)\n.mtj.tmp/\n\n# Package Files #\n*.jar\n*.war\n*.ear\n*.zip\n*.tar.gz\n*.rar\n*.idea\n\n### IntelliJ IDEA ###\nlogs\n.idea\n*.iws\n*.iml\n*.ipr\nlog.*\n\n\n# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml\nhs_err_pid*\n"
  },
  {
    "path": "LICENSE",
    "content": "Apache License\nVersion 2.0, January 2004\nhttp://www.apache.org/licenses/\n\nTERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n1. Definitions.\n\n\"License\" shall mean the terms and conditions for use, reproduction, and\ndistribution as defined by Sections 1 through 9 of this document.\n\n\"Licensor\" shall mean the copyright owner or entity authorized by the copyright\nowner that is granting the License.\n\n\"Legal Entity\" shall mean the union of the acting entity and all other entities\nthat control, are controlled by, or are under common control with that entity.\nFor the purposes of this definition, \"control\" means (i) the power, direct or\nindirect, to cause the direction or management of such entity, whether by\ncontract or otherwise, or (ii) ownership of fifty percent (50%) or more of the\noutstanding shares, or (iii) beneficial ownership of such entity.\n\n\"You\" (or \"Your\") shall mean an individual or Legal Entity exercising\npermissions granted by this License.\n\n\"Source\" form shall mean the preferred form for making modifications, including\nbut not limited to software source code, documentation source, and configuration\nfiles.\n\n\"Object\" form shall mean any form resulting from mechanical transformation or\ntranslation of a Source form, including but not limited to compiled object code,\ngenerated documentation, and conversions to other media types.\n\n\"Work\" shall mean the work of authorship, whether in Source or Object form, made\navailable under the License, as indicated by a copyright notice that is included\nin or attached to the work (an example is provided in the Appendix below).\n\n\"Derivative Works\" shall mean any work, whether in Source or Object form, that\nis based on (or derived from) the Work and for which the editorial revisions,\nannotations, elaborations, or other modifications represent, as a whole, an\noriginal work of authorship. For the purposes of this License, Derivative Works\nshall not include works that remain separable from, or merely link (or bind by\nname) to the interfaces of, the Work and Derivative Works thereof.\n\n\"Contribution\" shall mean any work of authorship, including the original version\nof the Work and any modifications or additions to that Work or Derivative Works\nthereof, that is intentionally submitted to Licensor for inclusion in the Work\nby the copyright owner or by an individual or Legal Entity authorized to submit\non behalf of the copyright owner. For the purposes of this definition,\n\"submitted\" means any form of electronic, verbal, or written communication sent\nto the Licensor or its representatives, including but not limited to\ncommunication on electronic mailing lists, source code control systems, and\nissue tracking systems that are managed by, or on behalf of, the Licensor for\nthe purpose of discussing and improving the Work, but excluding communication\nthat is conspicuously marked or otherwise designated in writing by the copyright\nowner as \"Not a Contribution.\"\n\n\"Contributor\" shall mean Licensor and any individual or Legal Entity on behalf\nof whom a Contribution has been received by Licensor and subsequently\nincorporated within the Work.\n\n2. Grant of Copyright License.\n\nSubject to the terms and conditions of this License, each Contributor hereby\ngrants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free,\nirrevocable copyright license to reproduce, prepare Derivative Works of,\npublicly display, publicly perform, sublicense, and distribute the Work and such\nDerivative Works in Source or Object form.\n\n3. Grant of Patent License.\n\nSubject to the terms and conditions of this License, each Contributor hereby\ngrants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free,\nirrevocable (except as stated in this section) patent license to make, have\nmade, use, offer to sell, sell, import, and otherwise transfer the Work, where\nsuch license applies only to those patent claims licensable by such Contributor\nthat are necessarily infringed by their Contribution(s) alone or by combination\nof their Contribution(s) with the Work to which such Contribution(s) was\nsubmitted. If You institute patent litigation against any entity (including a\ncross-claim or counterclaim in a lawsuit) alleging that the Work or a\nContribution incorporated within the Work constitutes direct or contributory\npatent infringement, then any patent licenses granted to You under this License\nfor that Work shall terminate as of the date such litigation is filed.\n\n4. Redistribution.\n\nYou may reproduce and distribute copies of the Work or Derivative Works thereof\nin any medium, with or without modifications, and in Source or Object form,\nprovided that You meet the following conditions:\n\nYou must give any other recipients of the Work or Derivative Works a copy of\nthis License; and\nYou must cause any modified files to carry prominent notices stating that You\nchanged the files; and\nYou must retain, in the Source form of any Derivative Works that You distribute,\nall copyright, patent, trademark, and attribution notices from the Source form\nof the Work, excluding those notices that do not pertain to any part of the\nDerivative Works; and\nIf the Work includes a \"NOTICE\" text file as part of its distribution, then any\nDerivative Works that You distribute must include a readable copy of the\nattribution notices contained within such NOTICE file, excluding those notices\nthat do not pertain to any part of the Derivative Works, in at least one of the\nfollowing places: within a NOTICE text file distributed as part of the\nDerivative Works; within the Source form or documentation, if provided along\nwith the Derivative Works; or, within a display generated by the Derivative\nWorks, if and wherever such third-party notices normally appear. The contents of\nthe NOTICE file are for informational purposes only and do not modify the\nLicense. You may add Your own attribution notices within Derivative Works that\nYou distribute, alongside or as an addendum to the NOTICE text from the Work,\nprovided that such additional attribution notices cannot be construed as\nmodifying the License.\nYou may add Your own copyright statement to Your modifications and may provide\nadditional or different license terms and conditions for use, reproduction, or\ndistribution of Your modifications, or for any such Derivative Works as a whole,\nprovided Your use, reproduction, and distribution of the Work otherwise complies\nwith the conditions stated in this License.\n\n5. Submission of Contributions.\n\nUnless You explicitly state otherwise, any Contribution intentionally submitted\nfor inclusion in the Work by You to the Licensor shall be under the terms and\nconditions of this License, without any additional terms or conditions.\nNotwithstanding the above, nothing herein shall supersede or modify the terms of\nany separate license agreement you may have executed with Licensor regarding\nsuch Contributions.\n\n6. Trademarks.\n\nThis License does not grant permission to use the trade names, trademarks,\nservice marks, or product names of the Licensor, except as required for\nreasonable and customary use in describing the origin of the Work and\nreproducing the content of the NOTICE file.\n\n7. Disclaimer of Warranty.\n\nUnless required by applicable law or agreed to in writing, Licensor provides the\nWork (and each Contributor provides its Contributions) on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied,\nincluding, without limitation, any warranties or conditions of TITLE,\nNON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are\nsolely responsible for determining the appropriateness of using or\nredistributing the Work and assume any risks associated with Your exercise of\npermissions under this License.\n\n8. Limitation of Liability.\n\nIn no event and under no legal theory, whether in tort (including negligence),\ncontract, or otherwise, unless required by applicable law (such as deliberate\nand grossly negligent acts) or agreed to in writing, shall any Contributor be\nliable to You for damages, including any direct, indirect, special, incidental,\nor consequential damages of any character arising as a result of this License or\nout of the use or inability to use the Work (including but not limited to\ndamages for loss of goodwill, work stoppage, computer failure or malfunction, or\nany and all other commercial damages or losses), even if such Contributor has\nbeen advised of the possibility of such damages.\n\n9. Accepting Warranty or Additional Liability.\n\nWhile redistributing the Work or Derivative Works thereof, You may choose to\noffer, and charge a fee for, acceptance of support, warranty, indemnity, or\nother liability obligations and/or rights consistent with this License. However,\nin accepting such obligations, You may act only on Your own behalf and on Your\nsole responsibility, not on behalf of any other Contributor, and only if You\nagree to indemnify, defend, and hold each Contributor harmless for any liability\nincurred by, or claims asserted against, such Contributor by reason of your\naccepting any such warranty or additional liability.\n\nEND OF TERMS AND CONDITIONS\n\nAPPENDIX: How to apply the Apache License to your work\n\nTo apply the Apache License to your work, attach the following boilerplate\nnotice, with the fields enclosed by brackets \"{}\" replaced with your own\nidentifying information. (Don't include the brackets!) The text should be\nenclosed in the appropriate comment syntax for the file format. We also\nrecommend that a file or class name and description of purpose be included on\nthe same \"printed page\" as the copyright notice for easier identification within\nthird-party archives.\n\n   Copyright 2017 paascloud.net\n\n   Licensed under the Apache License, Version 2.0 (the \"License\");\n   you may not use this file except in compliance with the License.\n   You may obtain a copy of the License at\n\n     http://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \"AS IS\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License."
  },
  {
    "path": "README.md",
    "content": "## Spring Cloud 实战项目\n\n### 项目介绍\n```\n功能点：\n    模拟商城，完整的购物流程、后端运营平台对前端业务的支撑，和对项目的运维，有各项的监控指标和运维指标。\n技术点：\n       核心技术为springcloud+vue两个全家桶实现，采取了取自开源用于开源的目标，所以能用开源绝不用收费框架，整体技术栈只有\n    阿里云短信服务是收费的，都是目前java前瞻性的框架，可以为中小企业解决微服务架构难题，可以帮助企业快速建站。由于服务\n    器成本较高，尽量降低开发成本的原则，本项目由10个后端项目和3个前端项目共同组成。真正实现了基于RBAC、jwt和oauth2的\n    无状态统一权限认证的解决方案，实现了异常和日志的统一管理，实现了MQ落地保证100%到达的解决方案。\n\t\n\t核心框架：springcloud Edgware全家桶\n\t安全框架：Spring Security Spring Cloud Oauth2\n\t分布式任务调度：elastic-job\n\t持久层框架：MyBatis、通用Mapper4、Mybatis_PageHelper\n\t数据库连接池：Alibaba Druid\n\t日志管理：Logback\t前端框架：Vue全家桶以及相关组件\n\t三方服务： 邮件服务、阿里云短信服务、七牛云文件服务、钉钉机器人服务、高德地图API\n```\n### 平台目录结构说明\n\n\n```\n├─paascloud-master----------------------------父项目，公共依赖\n│  │\n│  ├─paascloud-eureka--------------------------微服务注册中心\n│  │\n│  ├─paascloud-discovery-----------------------微服务配置中心\n│  │\n│  ├─paascloud-monitor-------------------------微服务监控中心\n│  │\n│  ├─paascloud-zipkin--------------------------微服务日志采集中心\n│  │\n│  ├─paascloud-gateway--------------------------微服务网关中心\n│  │\n│  ├─paascloud-provider\n│  │  │\n│  │  ├─paascloud-provider-mdc------------------数据服务中心\n│  │  │\n│  │  ├─paascloud-provider-omc------------------订单服务中心\n│  │  │\n│  │  ├─paascloud-provider-opc------------------对接服务中心\n│  │  │\n│  │  ├─paascloud-provider-tpc------------------任务服务中心\n│  │  │\n│  │  └─paascloud-provider-uac------------------用户服务中心\n│  │\n│  ├─paascloud-provider-api\n│  │  │\n│  │  ├─paascloud-provider-mdc-api------------------数据服务中心API\n│  │  │\n│  │  ├─paascloud-provider-omc-api------------------订单服务中心API\n│  │  │\n│  │  ├─paascloud-provider-opc-api------------------对接服务中心API\n│  │  │\n│  │  ├─paascloud-provider-tpc-api------------------任务服务中心API\n│  │  │\n│  │  ├─paascloud-provider-sdk-api------------------可靠消息服务API\n│  │  │\n│  │  └─paascloud-provider-uac-api------------------用户服务中心API\n│  │\n│  ├─paascloud-common\n│  │  │\n│  │  ├─paascloud-common-base------------------公共POJO基础包\n│  │  │\n│  │  ├─paascloud-common-config------------------公共配置包\n│  │  │\n│  │  ├─paascloud-common-core------------------微服务核心依赖包\n│  │  │\n│  │  ├─paascloud-common-util------------------公共工具包\n│  │  │\n│  │  ├─paascloud-common-zk------------------zookeeper配置\n│  │  │\n│  │  ├─paascloud-security-app------------------公共无状态安全认证\n│  │  │\n│  │  ├─paascloud-security-core------------------安全服务核心包\n│  │  │\n│  │  └─paascloud-security-feign------------------基于auth2的feign配置\n│  │\n│  ├─paascloud-generator\n│  │  │\n│  │  ├─paascloud-generator-mdc------------------数据服务中心Mybatis Generator\n│  │  │\n│  │  ├─paascloud-generator-omc------------------数据服务中心Mybatis Generator\n│  │  │\n│  │  ├─paascloud-generator-opc------------------数据服务中心Mybatis Generator\n│  │  │\n│  │  ├─paascloud-generator-tpc------------------数据服务中心Mybatis Generator\n│  │  │\n│  │  └─paascloud-generator-uac------------------数据服务中心Mybatis Generator\n\n\n\n\n```\n\n\n### 特殊说明\n\n\n```\n这里做一个解释由于微服务的拆分受制于服务器，这里我做了微服务的合并，比如OAuth2的认证服务中心和用户中心合并，\n统一的one service服务中心和用户认证中心合并，支付中心和订单中心合并，其实这也是不得已而为之，\n只是做了业务微服务中心的合并，并没有将架构中的 注册中心 监控中心 服务发现中心进行合并。\n```\n\n\n### 作者介绍\n\n```\nSpring Cloud 爱好者,现就任于鲜易供应链平台研发部.\n```\n\n### QQ群交流\n ①：519587831（满）  \n ②：873283104（满）  \n ③：882458726（满）  \n ④：693445268    \n ⑤：813682656    \n ⑥：797334670    \n ⑦：797876073    \n ⑧：814712305    \n ⑨：……    \n\n### FAQ\n* [相关问题](https://github.com/paascloud/paascloud-master/wiki/%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98)\n\n## 配套项目\n\n```\n后端项目：https://github.com/paascloud/paascloud-master \n         https://gitee.com/paascloud/paascloud-master\n登录入口：https://github.com/paascloud/paascloud-login-web\n         https://gitee.com/paascloud/paascloud-login-web\n后端入口：https://github.com/paascloud/paascloud-admin-web\n         https://gitee.com/paascloud/paascloud-admin-web\n前端入口：https://github.com/paascloud/paascloud-mall-web\n         https://gitee.com/paascloud/paascloud-mall-web\n```\n\n### 传送门\n- 博客入口： http://blog.paascloud.net\n- 后端入口： http://admin.paascloud.net (支持微信登录体验)\n- 模拟商城: http://mall.paascloud.net (支持微信登录体验)\n- 文档手册: http://document.paascloud.net\n- github: https://github.com/paascloud\n- 操作手册: http://blog.paascloud.net/2018/06/10/paascloud/doc/\n\n### 架构图\n\n![项目架构图](http://img.paascloud.net/paascloud/doc/paascloud-project.png)\n\n\n\n\n\n\n"
  },
  {
    "path": "paascloud-common/paascloud-common-base/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\"\n         xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n         xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n    <modelVersion>4.0.0</modelVersion>\n    <parent>\n        <groupId>com.liuzm.paascloud.common</groupId>\n        <artifactId>paascloud-common</artifactId>\n        <version>1.0</version>\n    </parent>\n\n    <artifactId>paascloud-common-base</artifactId>\n\n    <properties>\n        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>\n        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>\n        <java.version>1.8</java.version>\n    </properties>\n\n    <dependencies>\n        <dependency>\n            <groupId>io.springfox</groupId>\n            <artifactId>springfox-swagger2</artifactId>\n        </dependency>\n    </dependencies>\n</project>"
  },
  {
    "path": "paascloud-common/paascloud-common-base/src/main/java/com/paascloud/base/constant/AliyunMqTopicConstants.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：AliyunMqTopicConstants.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\npackage com.paascloud.base.constant;\n\nimport com.google.common.collect.Lists;\nimport lombok.AccessLevel;\nimport lombok.NoArgsConstructor;\nimport org.springframework.util.CollectionUtils;\nimport org.springframework.util.StringUtils;\n\nimport java.util.ArrayList;\nimport java.util.HashSet;\nimport java.util.List;\nimport java.util.Set;\n\n/**\n * The class Aliyun mq topic constants.\n *\n * @author paascloud.net @gmail.com\n */\n@NoArgsConstructor(access = AccessLevel.PRIVATE)\npublic class AliyunMqTopicConstants {\n\n\t/**\n\t * The enum Uac mq topic enum.\n\t *\n\t * @author paascloud.net @gmail.com\n\t */\n\tpublic enum MqTopicEnum {\n\t\t/**\n\t\t * 发送短信.\n\t\t */\n\t\tSEND_SMS_TOPIC(\"SEND_SMS_TOPIC\", \"发送短信\"),\n\t\t/**\n\t\t * 发送邮件.\n\t\t */\n\t\tSEND_EMAIL_TOPIC(\"SEND_EMAIL_TOPIC\", \"发送邮件\"),\n\n\t\t/**\n\t\t * Tpc topic mq topic enum.\n\t\t */\n\t\tTPC_TOPIC(\"TPC_TOPIC\", \"TPC_TOPIC\"),\n\t\t/**\n\t\t * Opc topic mq topic enum.\n\t\t */\n\t\tOPC_TOPIC(\"OPC_TOPIC\", \"OPC_TOPIC\"),\n\t\t/**\n\t\t * Mdc topic mq topic enum.\n\t\t */\n\t\tMDC_TOPIC(\"MDC_TOPIC\", \"MDC_TOPIC\"),;\n\n\t\tMqTopicEnum(String topic, String topicName) {\n\t\t\tthis.topic = topic;\n\t\t\tthis.topicName = topicName;\n\t\t}\n\n\t\t/**\n\t\t * The Topic.\n\t\t */\n\t\tString topic;\n\t\t/**\n\t\t * The Topic name.\n\t\t */\n\t\tString topicName;\n\n\t\t/**\n\t\t * Gets topic.\n\t\t *\n\t\t * @return the topic\n\t\t */\n\t\tpublic String getTopic() {\n\t\t\treturn topic;\n\t\t}\n\n\t}\n\n\n\t/**\n\t * The enum Uac mq tag enum.\n\t *\n\t * @author paascloud.net @gmail.com\n\t */\n\tpublic enum MqTagEnum {\n\n\t\t/**\n\t\t * 注册获取验证码.\n\t\t */\n\t\tREGISTER_USER_AUTH_CODE(\"REGISTER_USER_AUTH_CODE\", MqTopicEnum.SEND_SMS_TOPIC.getTopic(), \"注册获取验证码\"),\n\t\t/**\n\t\t * 修改密码获取验证码.\n\t\t */\n\t\tMODIFY_PASSWORD_AUTH_CODE(\"MODIFY_PASSWORD_AUTH_CODE\", MqTopicEnum.SEND_SMS_TOPIC.getTopic(), \"修改密码获取验证码\"),\n\t\t/**\n\t\t * 忘记密码获取验证码.\n\t\t */\n\t\tFORGOT_PASSWORD_AUTH_CODE(\"FORGOT_PASSWORD_AUTH_CODE\", MqTopicEnum.SEND_EMAIL_TOPIC.getTopic(), \"忘记密码获取验证码\"),\n\n\t\t/**\n\t\t * 激活用户.\n\t\t */\n\t\tACTIVE_USER(\"ACTIVE_USER\", MqTopicEnum.SEND_EMAIL_TOPIC.getTopic(), \"激活用户\"),\n\t\t/**\n\t\t * 激活用户成功.\n\t\t */\n\t\tACTIVE_USER_SUCCESS(\"ACTIVE_USER_SUCCESS\", MqTopicEnum.SEND_EMAIL_TOPIC.getTopic(), \"激活用户成功\"),\n\t\t/**\n\t\t * 重置密码\n\t\t */\n\t\tRESET_LOGIN_PWD(\"RESET_LOGIN_PWD\", MqTopicEnum.SEND_EMAIL_TOPIC.getTopic(), \"重置密码\"),\n\n\t\t/**\n\t\t * 重置密码\n\t\t */\n\t\tRESET_USER_EMAIL(\"RESET_LOGIN_PWD\", MqTopicEnum.SEND_EMAIL_TOPIC.getTopic(), \"重置密码\"),\n\n\t\t/**\n\t\t * 删除生产者历史消息\n\t\t */\n\t\tDELETE_PRODUCER_MESSAGE(\"DELETE_PRODUCER_MESSAGE\", MqTopicEnum.TPC_TOPIC.getTopic(), \"删除生产者历史消息\"),\n\n\t\t/**\n\t\t * 删除消费者历史消息\n\t\t */\n\t\tDELETE_CONSUMER_MESSAGE(\"DELETE_CONSUMER_MESSAGE\", MqTopicEnum.TPC_TOPIC.getTopic(), \"删除消费者历史消息\"),\n\n\t\t/**\n\t\t * 发送异常日志.\n\t\t */\n\t\tSEND_DINGTALK_MESSAGE(\"SEND_EXCEPTION_LOG\", MqTopicEnum.OPC_TOPIC.getTopic(), \"发送异常日志\"),\n\n\t\t/**\n\t\t * 更新附件信息.\n\t\t */\n\t\tUPDATE_ATTACHMENT(\"UPDATE_ATTACHMENT\", MqTopicEnum.MDC_TOPIC.getTopic(), \"更新附件信息\"),\n\t\t/**\n\t\t * 删除附件信息\n\t\t */\n\t\tDELETE_ATTACHMENT(\"DELETE_ATTACHMENT\", MqTopicEnum.MDC_TOPIC.getTopic(), \"删除附件信息\"),;\n\t\t/**\n\t\t * The Tag.\n\t\t */\n\t\tString tag;\n\t\t/**\n\t\t * The Topic.\n\t\t */\n\t\tString topic;\n\t\t/**\n\t\t * The Tag name.\n\t\t */\n\t\tString tagName;\n\n\t\tMqTagEnum(String tag, String topic, String tagName) {\n\t\t\tthis.tag = tag;\n\t\t\tthis.topic = topic;\n\t\t\tthis.tagName = tagName;\n\t\t}\n\n\t\t/**\n\t\t * Gets tag.\n\t\t *\n\t\t * @return the tag\n\t\t */\n\t\tpublic String getTag() {\n\t\t\treturn tag;\n\t\t}\n\n\t\t/**\n\t\t * Gets topic.\n\t\t *\n\t\t * @return the topic\n\t\t */\n\t\tpublic String getTopic() {\n\t\t\treturn topic;\n\t\t}\n\t}\n\n\t/**\n\t * The class Consumer topics.\n\t *\n\t * @author paascloud.net @gmail.com\n\t */\n\t@NoArgsConstructor(access = AccessLevel.PRIVATE)\n\tpublic static final class ConsumerTopics {\n\n\t\t/**\n\t\t * The constant OPT.\n\t\t */\n\t\tpublic static final String OPT = buildOpcConsumerTopics();\n\t\t/**\n\t\t * The constant UAC.\n\t\t */\n\t\tpublic static final String UAC = buildUacConsumerTopics();\n\n\t}\n\n\tprivate static String buildOpcConsumerTopics() {\n\t\tList<TopicObj> topicObjList = new ArrayList<>();\n\n\t\tSet<String> sendSmsTagList = new HashSet<>();\n\t\tsendSmsTagList.add(MqTagEnum.REGISTER_USER_AUTH_CODE.getTag());\n\t\tSet<String> sendEmailTagList = new HashSet<>();\n\t\tsendEmailTagList.add(MqTagEnum.FORGOT_PASSWORD_AUTH_CODE.getTag());\n\t\tsendEmailTagList.add(MqTagEnum.ACTIVE_USER.getTag());\n\t\tsendEmailTagList.add(MqTagEnum.ACTIVE_USER_SUCCESS.getTag());\n\t\tsendEmailTagList.add(MqTagEnum.RESET_LOGIN_PWD.getTag());\n\t\tsendEmailTagList.add(MqTagEnum.RESET_USER_EMAIL.getTag());\n\n\t\ttopicObjList.add(new TopicObj(MqTopicEnum.SEND_SMS_TOPIC.getTopic(), sendSmsTagList));\n\t\ttopicObjList.add(new TopicObj(MqTopicEnum.SEND_EMAIL_TOPIC.getTopic(), sendEmailTagList));\n\n\t\tSet<String> deleteMessageTag = new HashSet<>();\n\t\tdeleteMessageTag.add(MqTagEnum.DELETE_CONSUMER_MESSAGE.getTag());\n\t\tdeleteMessageTag.add(MqTagEnum.DELETE_PRODUCER_MESSAGE.getTag());\n\n\t\ttopicObjList.add(new TopicObj(MqTopicEnum.TPC_TOPIC.getTopic(), deleteMessageTag));\n\n\t\tSet<String> mdcMqTag = new HashSet<>();\n\t\tmdcMqTag.add(MqTagEnum.UPDATE_ATTACHMENT.getTag());\n\t\tmdcMqTag.add(MqTagEnum.DELETE_ATTACHMENT.getTag());\n\n\t\ttopicObjList.add(new TopicObj(MqTopicEnum.MDC_TOPIC.getTopic(), mdcMqTag));\n\n\t\treturn buildOpcConsumerTopics(topicObjList);\n\n\t}\n\n\tprivate static String buildUacConsumerTopics() {\n\t\tList<TopicObj> topicObjList = Lists.newArrayList();\n\n\t\tSet<String> deleteMessageTag = new HashSet<>();\n\t\tdeleteMessageTag.add(MqTagEnum.DELETE_CONSUMER_MESSAGE.getTag());\n\t\tdeleteMessageTag.add(MqTagEnum.DELETE_PRODUCER_MESSAGE.getTag());\n\n\t\ttopicObjList.add(new TopicObj(MqTopicEnum.TPC_TOPIC.getTopic(), deleteMessageTag));\n\n\t\treturn buildOpcConsumerTopics(topicObjList);\n\n\t}\n\n\tprivate static String buildOpcConsumerTopics(List<TopicObj> topicList) {\n\n\t\tStringBuilder result = new StringBuilder();\n\n\t\tif (!CollectionUtils.isEmpty(topicList)) {\n\t\t\tfor (TopicObj topicObj : topicList) {\n\t\t\t\tString topic = topicObj.getTopic();\n\t\t\t\tSet<String> tagList = topicObj.getTagList();\n\n\t\t\t\tif (StringUtils.isEmpty(topic) || CollectionUtils.isEmpty(topicList)) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tStringBuilder tagInfo = new StringBuilder();\n\t\t\t\tfor (String tag : tagList) {\n\t\t\t\t\ttagInfo.append(tag).append(GlobalConstant.Symbol.PIPE);\n\t\t\t\t}\n\t\t\t\ttrimEnd(tagInfo, GlobalConstant.Symbol.PIPE);\n\t\t\t\tresult.append(topic).append(GlobalConstant.Symbol.AT).append(tagInfo).append(GlobalConstant.Symbol.COMMA);\n\t\t\t}\n\t\t}\n\t\ttrimEnd(result, GlobalConstant.Symbol.COMMA);\n\t\treturn result.toString();\n\n\t}\n\n\t/**\n\t * The class Topic obj.\n\t *\n\t * @author paascloud.net @gmail.com\n\t */\n\tstatic class TopicObj {\n\n\t\tprivate String topic;\n\t\tprivate Set<String> tagList;\n\n\t\t/**\n\t\t * Instantiates a new Topic obj.\n\t\t *\n\t\t * @param topic   the topic\n\t\t * @param tagList the tag list\n\t\t */\n\t\tTopicObj(String topic, Set<String> tagList) {\n\t\t\tthis.topic = topic;\n\t\t\tthis.tagList = tagList;\n\t\t}\n\n\t\t/**\n\t\t * Gets topic.\n\t\t *\n\t\t * @return the topic\n\t\t */\n\t\tString getTopic() {\n\t\t\treturn topic;\n\t\t}\n\n\t\t/**\n\t\t * Gets tag list.\n\t\t *\n\t\t * @return the tag list\n\t\t */\n\t\tSet<String> getTagList() {\n\t\t\treturn tagList;\n\t\t}\n\t}\n\n\tprivate static void trimEnd(StringBuilder stringBuilder, String suffix) {\n\t\tif (null == stringBuilder) {\n\t\t\treturn;\n\t\t}\n\t\tString str = stringBuilder.toString();\n\t\tif (!StringUtils.isEmpty(suffix) && !str.endsWith(suffix)) {\n\t\t\treturn;\n\t\t}\n\t\tstringBuilder.delete(str.length() - suffix.length(), str.length());\n\t}\n}\n"
  },
  {
    "path": "paascloud-common/paascloud-common-base/src/main/java/com/paascloud/base/constant/AliyunSmsConstants.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：AliyunSmsConstants.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\npackage com.paascloud.base.constant;\n\nimport com.google.common.collect.Lists;\nimport com.paascloud.base.enums.ErrorCodeEnum;\nimport com.paascloud.base.exception.BusinessException;\nimport org.springframework.util.StringUtils;\n\nimport java.util.Arrays;\nimport java.util.List;\n\n/**\n * The class Aliyun sms constants.\n *\n * @author paascloud.net@gmail.com\n */\npublic class AliyunSmsConstants {\n\n\t/**\n\t * 短信模板枚举\n\t */\n\tpublic enum SmsTempletEnum {\n\n\t\t/**\n\t\t * 通用模板(短信内容:验证码${code}, 您正在注册成为paasCloud用户, 感谢您的支持！)\n\t\t */\n\t\tUAC_PC_GLOBAL_TEMPLATE(\"UAC_PC_GLOBAL_TEMPLATE\", \"SMS_105115057\", \"code\"),;\n\n\t\tprivate String busType;\n\n\t\tprivate String templetCode;\n\n\t\tprivate String smsParamName;\n\n\t\tpublic static SmsTempletEnum getEnum(String templateCode) {\n\t\t\tSmsTempletEnum smsTempletEnum = null;\n\t\t\tfor (SmsTempletEnum ele : SmsTempletEnum.values()) {\n\t\t\t\tif (templateCode.equals(ele.getTempletCode())) {\n\t\t\t\t\tsmsTempletEnum = ele;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn smsTempletEnum;\n\t\t}\n\n\t\tpublic static boolean isSmsTemplate(String smsTemplateCode) {\n\n\t\t\tif (StringUtils.isEmpty(smsTemplateCode)) {\n\t\t\t\tthrow new BusinessException(ErrorCodeEnum.UAC10011020);\n\t\t\t}\n\t\t\tList<String> templetCodeList = getTemplateCodeList();\n\n\t\t\treturn templetCodeList.contains(smsTemplateCode);\n\t\t}\n\n\t\tpublic static List<SmsTempletEnum> getList() {\n\t\t\treturn Arrays.asList(SmsTempletEnum.values());\n\t\t}\n\n\t\tpublic static List<String> getTemplateCodeList() {\n\t\t\tList<String> templetCodeList = Lists.newArrayList();\n\t\t\tList<SmsTempletEnum> list = getList();\n\t\t\tfor (SmsTempletEnum templetEnum : list) {\n\t\t\t\tif (StringUtils.isEmpty(templetEnum.getTempletCode())) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\ttempletCodeList.add(templetEnum.getTempletCode());\n\t\t\t}\n\t\t\treturn templetCodeList;\n\t\t}\n\n\t\tSmsTempletEnum(String busType, String templetCode, String smsParamName) {\n\t\t\tthis.busType = busType;\n\t\t\tthis.templetCode = templetCode;\n\t\t\tthis.smsParamName = smsParamName;\n\t\t}\n\n\t\t/**\n\t\t * Gets bus type.\n\t\t *\n\t\t * @return the bus type\n\t\t */\n\t\tpublic String getBusType() {\n\t\t\treturn busType;\n\t\t}\n\n\t\t/**\n\t\t * Gets templet code.\n\t\t *\n\t\t * @return the templet code\n\t\t */\n\t\tpublic String getTempletCode() {\n\t\t\treturn templetCode;\n\t\t}\n\n\t\t/**\n\t\t * Gets sms param name.\n\t\t *\n\t\t * @return the sms param name\n\t\t */\n\t\tpublic String getSmsParamName() {\n\t\t\treturn smsParamName;\n\t\t}\n\t}\n\n\n}\n"
  },
  {
    "path": "paascloud-common/paascloud-common-base/src/main/java/com/paascloud/base/constant/GlobalConstant.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：GlobalConstant.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\npackage com.paascloud.base.constant;\n\n/**\n * The class Global constant.\n *\n * @author paascloud.net@gmail.com\n */\npublic class GlobalConstant {\n\n\t/**\n\t * The constant FILE_MAX_SIZE.\n\t */\n\tpublic static final long FILE_MAX_SIZE = 5 * 1024 * 1024;\n\tpublic static final String UNKNOWN = \"unknown\";\n\n\tpublic static final String X_FORWARDED_FOR = \"X-Forwarded-For\";\n\tpublic static final String X_REAL_IP = \"X-Real-IP\";\n\tpublic static final String PROXY_CLIENT_IP = \"Proxy-Client-IP\";\n\tpublic static final String WL_PROXY_CLIENT_IP = \"WL-Proxy-Client-IP\";\n\tpublic static final String HTTP_CLIENT_IP = \"HTTP_CLIENT_IP\";\n\tpublic static final String HTTP_X_FORWARDED_FOR = \"HTTP_X_FORWARDED_FOR\";\n\n\n\tpublic static final String LOCALHOST_IP = \"127.0.0.1\";\n\tpublic static final String LOCALHOST_IP_16 = \"0:0:0:0:0:0:0:1\";\n\tpublic static final int MAX_IP_LENGTH = 15;\n\n\tpublic static final String DEV_PROFILE = \"dev\";\n\tpublic static final String TEST_PROFILE = \"test\";\n\tpublic static final String PRO_PROFILE = \"pro\";\n\tpublic static final int TWO_INT = 2;\n\tpublic static final int M_SIZE = 1024;\n\tpublic static final String ROOT_PREFIX = \"paascloud\";\n\n\tpublic static final int EXCEPTION_CAUSE_MAX_LENGTH = 2048;\n\tpublic static final int EXCEPTION_MESSAGE_MAX_LENGTH = 2048;\n\n\tpublic static final String ZK_REGISTRY_SERVICE_ROOT_PATH = \"/paascloud/registry/service\";\n\tpublic static final String ZK_REGISTRY_ID_ROOT_PATH = \"/paascloud/registry/id\";\n\tpublic static final String ZK_REGISTRY_PRODUCER_ROOT_PATH = \"/paascloud/registry/producer\";\n\tpublic static final String ZK_REGISTRY_CONSUMER_ROOT_PATH = \"/paascloud/registry/consumer\";\n\tpublic static final String ZK_REGISTRY_SEQ = \"/paascloud/seq\";\n\n\tpublic interface Number {\n\t\tint THOUSAND_INT = 1000;\n\t\tint HUNDRED_INT = 100;\n\t\tint ONE_INT = 1;\n\t\tint TWO_INT = 2;\n\t\tint THREE_INT = 3;\n\t\tint FOUR_INT = 4;\n\t\tint FIVE_INT = 5;\n\t\tint SIX_INT = 6;\n\t\tint SEVEN_INT = 7;\n\t\tint EIGHT_INT = 8;\n\t\tint NINE_INT = 9;\n\t\tint TEN_INT = 10;\n\t\tint EIGHTEEN_INT = 18;\n\t}\n\n\n\t/**\n\t * 系统常量\n\t */\n\tpublic static final class Sys {\n\n\t\tprivate Sys() {\n\t\t}\n\n\t\t/**\n\t\t * 全局用户名\n\t\t */\n\t\tpublic static final String TOKEN_AUTH_DTO = \"CURRENT_USER_DTO\";\n\n\t\t/**\n\t\t * 超级管理员的用户ID\n\t\t */\n\t\tpublic static final Long SUPER_MANAGER_USER_ID = 1L;\n\t\t/**\n\t\t * 超级管理员的用户编号\n\t\t */\n\t\tpublic static final String SUPER_MANAGER_LOGIN_NAME = \"admin\";\n\t\t/**\n\t\t * 超级管理员角色ID\n\t\t */\n\t\tpublic static final Long SUPER_MANAGER_ROLE_ID = 1L;\n\t\t/**\n\t\t * 超级管理员组织ID\n\t\t */\n\t\tpublic static final Long SUPER_MANAGER_GROUP_ID = 1L;\n\t\t/**\n\t\t * 运营工作台ID\n\t\t */\n\t\tpublic static final Long OPER_APPLICATION_ID = 1L;\n\n\t\t/**\n\t\t * The constant MENU_ROOT.\n\t\t */\n\t\tpublic static final String MENU_ROOT = \"root\";\n\n\t\t/**\n\t\t * The constant DEFAULT_FILE_PATH.\n\t\t */\n\t\tpublic static final String DEFAULT_FILE_PATH = \"paascloud/file/\";\n\n\t\t/**\n\t\t * redis key default expire = 1MINUTES\n\t\t */\n\t\tpublic static final long REDIS_DEFAULT_EXPIRE = 1L;\n\t}\n\n\t/**\n\t * The class Symbol.\n\t *\n\t * @author paascloud.net@gmail.com\n\t */\n\tpublic static final class Symbol {\n\t\tprivate Symbol() {\n\t\t}\n\n\t\t/**\n\t\t * The constant COMMA.\n\t\t */\n\t\tpublic static final String COMMA = \",\";\n\t\tpublic static final String SPOT = \".\";\n\t\t/**\n\t\t * The constant UNDER_LINE.\n\t\t */\n\t\tpublic final static String UNDER_LINE = \"_\";\n\t\t/**\n\t\t * The constant PER_CENT.\n\t\t */\n\t\tpublic final static String PER_CENT = \"%\";\n\t\t/**\n\t\t * The constant AT.\n\t\t */\n\t\tpublic final static String AT = \"@\";\n\t\t/**\n\t\t * The constant PIPE.\n\t\t */\n\t\tpublic final static String PIPE = \"||\";\n\t\tpublic final static String SHORT_LINE = \"-\";\n\t\tpublic final static String SPACE = \" \";\n\t\tpublic static final String SLASH = \"/\";\n\t\tpublic static final String MH = \":\";\n\n\t}\n\n\t/**\n\t * The class Oss.\n\t *\n\t * @author paascloud.net@gmail.com\n\t */\n\tpublic static final class Oss {\n\t\tprivate Oss() {\n\t\t}\n\n\t\t/**\n\t\t * The constant DEFAULT_FILE_PATH.\n\t\t */\n\t\tpublic static final String DEFAULT_FILE_PATH = \"/default/\";\n\t}\n\n\n\t/**\n\t * 图片压缩高度和宽度\n\t */\n\tpublic static final int IMAGE_WIDTH = 1920;\n\t/**\n\t * The constant IMAGE_HEIGHT.\n\t */\n\tpublic static final int IMAGE_HEIGHT = 1280;\n\n\t/**\n\t * The constant Y.\n\t */\n\tpublic static final Integer Y = 1;\n\t/**\n\t * The constant N.\n\t */\n\tpublic static final Integer N = 0;\n\n\t/**\n\t * The enum Payment type enum.\n\t *\n\t * @author paascloud.net@gmail.com\n\t */\n\tpublic enum PaymentTypeEnum {\n\t\t/**\n\t\t * Online pay payment type enum.\n\t\t */\n\t\tONLINE_PAY(1, \"在线支付\");\n\n\t\tPaymentTypeEnum(int code, String value) {\n\t\t\tthis.code = code;\n\t\t\tthis.value = value;\n\t\t}\n\n\t\tprivate String value;\n\t\tprivate int code;\n\n\t\t/**\n\t\t * Gets value.\n\t\t *\n\t\t * @return the value\n\t\t */\n\t\tpublic String getValue() {\n\t\t\treturn value;\n\t\t}\n\n\t\t/**\n\t\t * Gets code.\n\t\t *\n\t\t * @return the code\n\t\t */\n\t\tpublic int getCode() {\n\t\t\treturn code;\n\t\t}\n\n\t\t/**\n\t\t * Code of payment type enum.\n\t\t *\n\t\t * @param code the code\n\t\t *\n\t\t * @return the payment type enum\n\t\t */\n\t\tpublic static PaymentTypeEnum codeOf(int code) {\n\t\t\tfor (PaymentTypeEnum paymentTypeEnum : values()) {\n\t\t\t\tif (paymentTypeEnum.getCode() == code) {\n\t\t\t\t\treturn paymentTypeEnum;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn null;\n\t\t}\n\n\t}\n}\n"
  },
  {
    "path": "paascloud-common/paascloud-common-base/src/main/java/com/paascloud/base/dto/BaseQuery.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：BaseQuery.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\npackage com.paascloud.base.dto;\n\nimport lombok.Data;\n\nimport java.io.Serializable;\n\n/**\n * The class Base query.\n *\n * @author paascloud.net@gmail.com\n */\n@Data\npublic class BaseQuery implements Serializable {\n\n\tprivate static final long serialVersionUID = 3319698607712846427L;\n\n\t/**\n\t * 当前页\n\t */\n\tprivate Integer pageNum = 1;\n\n\t/**\n\t * 每页条数\n\t */\n\tprivate Integer pageSize = 10;\n\n\t/**\n\t * 排序\n\t */\n\tprivate String orderBy;\n}\n"
  },
  {
    "path": "paascloud-common/paascloud-common-base/src/main/java/com/paascloud/base/dto/BaseTree.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：BaseTree.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\npackage com.paascloud.base.dto;\n\nimport lombok.Data;\n\nimport java.io.Serializable;\nimport java.util.List;\n\n/**\n * The class Base tree.\n *\n * @param <E>  the type parameter\n * @param <ID> the type parameter\n *\n * @author paascloud.net @gmail.com\n */\n@Data\npublic class BaseTree<E, ID> implements Serializable {\n\tprivate static final long serialVersionUID = -5703964834600572016L;\n\n\t/**\n\t * ID\n\t */\n\tprivate ID id;\n\n\t/**\n\t * 父ID\n\t */\n\tprivate ID pid;\n\n\t/**\n\t * 是否含有子节点\n\t */\n\tprivate boolean hasChild = false;\n\n\t/**\n\t * 子节点集合\n\t */\n\tprivate List<E> children;\n}"
  },
  {
    "path": "paascloud-common/paascloud-common-base/src/main/java/com/paascloud/base/dto/BaseVo.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：BaseVo.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\npackage com.paascloud.base.dto;\n\nimport com.fasterxml.jackson.annotation.JsonFormat;\nimport io.swagger.annotations.ApiModel;\nimport lombok.Data;\nimport org.springframework.format.annotation.DateTimeFormat;\n\nimport java.io.Serializable;\nimport java.util.Date;\n\n\n/**\n * The class Base vo.\n *\n * @author paascloud.net@gmail.com\n */\n@ApiModel\n@Data\npublic class BaseVo implements Serializable {\n\tprivate static final long serialVersionUID = -1695850022460957581L;\n\tprivate Long id;\n\n\t/**\n\t * 创建人\n\t */\n\tprivate String creator;\n\n\t/**\n\t * 创建人ID\n\t */\n\tprivate Long creatorId;\n\n\t/**\n\t * 创建时间\n\t */\n\t@DateTimeFormat(pattern = \"yyyy-MM-dd HH:mm:ss\")\n\t@JsonFormat(pattern = \"yyyy-MM-dd HH:mm:ss\", timezone = \"GMT+8\")\n\tprivate Date createdTime;\n\n\t/**\n\t * 最近操作人\n\t */\n\tprivate String lastOperator;\n\n\t/**\n\t * 最后操作人ID\n\t */\n\tprivate Long lastOperatorId;\n\n\t/**\n\t * 更新时间\n\t */\n\t@DateTimeFormat(pattern = \"yyyy-MM-dd HH:mm:ss\")\n\t@JsonFormat(pattern = \"yyyy-MM-dd HH:mm:ss\", timezone = \"GMT+8\")\n\tprivate Date updateTime;\n}\n"
  },
  {
    "path": "paascloud-common/paascloud-common-base/src/main/java/com/paascloud/base/dto/CheckValidDto.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：CheckValidDto.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\npackage com.paascloud.base.dto;\n\nimport io.swagger.annotations.ApiModel;\nimport io.swagger.annotations.ApiModelProperty;\nimport lombok.Data;\n\nimport java.io.Serializable;\n\n/**\n * The class Check valid dto.\n *\n * @author paascloud.net@gmail.com\n */\n@Data\n@ApiModel\npublic class CheckValidDto implements Serializable {\n\tprivate static final long serialVersionUID = 5178470476151416779L;\n\t/**\n\t * 校验的参数值\n\t */\n\t@ApiModelProperty(value = \"校验参数值\")\n\tprivate String validValue;\n\n\t/**\n\t * 参数类型(列)\n\t */\n\t@ApiModelProperty(value = \"参数类型\")\n\tprivate String type;\n}\n"
  },
  {
    "path": "paascloud-common/paascloud-common-base/src/main/java/com/paascloud/base/dto/GaodeBaseDto.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：GaodeBaseDto.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\npackage com.paascloud.base.dto;\n\nimport io.swagger.annotations.ApiModel;\nimport io.swagger.annotations.ApiModelProperty;\nimport lombok.Data;\n\nimport java.io.Serializable;\n\n/**\n * The class Gaode base dto.\n *\n * @author paascloud.net @gmail.com\n */\n@Data\n@ApiModel\npublic class GaodeBaseDto implements Serializable{\n\n\tprivate static final long serialVersionUID = 5894304327211503218L;\n\t/**\n\t * 状态\n\t */\n\t@ApiModelProperty(value = \"状态\")\n\tprivate String status;\n\n\t/**\n\t * 响应信息\n\t */\n\t@ApiModelProperty(value = \"响应信息\")\n\tprivate String info;\n\n\t/**\n\t * 响应编码\n\t */\n\t@ApiModelProperty(value = \"响应编码\")\n\tprivate String infocode;\n}\n"
  },
  {
    "path": "paascloud-common/paascloud-common-base/src/main/java/com/paascloud/base/dto/JobParameter.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：JobParameter.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\npackage com.paascloud.base.dto;\n\nimport com.google.common.base.Preconditions;\n\nimport java.io.Serializable;\n\n\n/**\n * The class Job task model.\n *\n * @author paascloud.net @gmail.com\n */\npublic class JobParameter implements Serializable {\n\tprivate static final long serialVersionUID = -610797345091216847L;\n\n\t/**\n\t * 每次查询数据量\n\t */\n\tprivate int fetchNum;\n\t/**\n\t * 取模条件\n\t */\n\tprivate String condition;\n\t/**\n\t * 取模条件\n\t */\n\tprivate String taskType;\n\n\tpublic int getFetchNum() {\n\t\tPreconditions.checkArgument(fetchNum != 0);\n\t\treturn fetchNum;\n\t}\n\n\tpublic void setFetchNum(int fetchNum) {\n\t\tthis.fetchNum = fetchNum;\n\t}\n\n\tpublic String getCondition() {\n\t\treturn condition;\n\t}\n\n\tpublic void setCondition(String condition) {\n\t\tthis.condition = condition;\n\t}\n\n\tpublic String getTaskType() {\n\t\treturn taskType;\n\t}\n\n\tpublic void setTaskType(String taskType) {\n\t\tthis.taskType = taskType;\n\t}\n\n\t@Override\n\tpublic String toString() {\n\t\tfinal StringBuilder sb = new StringBuilder(\"JobTaskParameter{\");\n\t\tsb.append(\"fetchNum=\").append(fetchNum);\n\t\tsb.append(\", condition='\").append(condition).append('\\'');\n\t\tsb.append(\", taskType='\").append(taskType).append('\\'');\n\t\tsb.append('}');\n\t\treturn sb.toString();\n\t}\n}\n"
  },
  {
    "path": "paascloud-common/paascloud-common-base/src/main/java/com/paascloud/base/dto/KvDto.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：KvDto.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\npackage com.paascloud.base.dto;\n\n\nimport lombok.Data;\n\nimport java.io.Serializable;\n\n/**\n * The class Kv dto.\n *\n * @author paascloud.net@gmail.com\n */\n@Data\npublic class KvDto<K, V> implements Serializable {\n\n\tprivate static final long serialVersionUID = -7712636075929650779L;\n\n\t/**\n\t * Instantiates a new Kv dto.\n\t */\n\tpublic KvDto() {\n\t}\n\n\t/**\n\t * Instantiates a new Kv dto.\n\t *\n\t * @param key   the key\n\t * @param value the value\n\t */\n\tpublic KvDto(K key, V value) {\n\t\tthis.key = key;\n\t\tthis.value = value;\n\t}\n\n\t/**\n\t * key\n\t */\n\tprivate K key;\n\t/**\n\t * value\n\t */\n\tprivate V value;\n\n}\n"
  },
  {
    "path": "paascloud-common/paascloud-common-base/src/main/java/com/paascloud/base/dto/LoginAuthDto.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：LoginAuthDto.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\npackage com.paascloud.base.dto;\n\nimport io.swagger.annotations.ApiModel;\nimport io.swagger.annotations.ApiModelProperty;\nimport lombok.Data;\n\nimport java.io.Serializable;\n\n/**\n * The class Login auth dto.\n *\n * @author paascloud.net@gmail.com\n */\n@Data\n@ApiModel(value = \"登录人信息\")\npublic class LoginAuthDto implements Serializable {\n\tprivate static final long serialVersionUID = -1137852221455042256L;\n\t@ApiModelProperty(value = \"用户ID\")\n\tprivate Long userId;\n\t@ApiModelProperty(value = \"登录名\")\n\tprivate String loginName;\n\t@ApiModelProperty(value = \"用户名\")\n\tprivate String userName;\n\t@ApiModelProperty(value = \"组织ID\")\n\tprivate Long groupId;\n\t@ApiModelProperty(value = \"组织名称\")\n\tprivate String groupName;\n\n\tpublic LoginAuthDto() {\n\t}\n\n\tpublic LoginAuthDto(Long userId, String loginName, String userName) {\n\t\tthis.userId = userId;\n\t\tthis.loginName = loginName;\n\t\tthis.userName = userName;\n\t}\n\n\tpublic LoginAuthDto(Long userId, String loginName, String userName, Long groupId, String groupName) {\n\t\tthis.userId = userId;\n\t\tthis.loginName = loginName;\n\t\tthis.userName = userName;\n\t\tthis.groupId = groupId;\n\t\tthis.groupName = groupName;\n\t}\n}\n"
  },
  {
    "path": "paascloud-common/paascloud-common-base/src/main/java/com/paascloud/base/dto/MessageQueryDto.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：MessageQueryDto.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\npackage com.paascloud.base.dto;\n\nimport com.fasterxml.jackson.annotation.JsonFormat;\nimport io.swagger.annotations.ApiModel;\nimport io.swagger.annotations.ApiModelProperty;\nimport lombok.Data;\nimport lombok.EqualsAndHashCode;\nimport org.springframework.format.annotation.DateTimeFormat;\n\nimport java.util.Date;\n\n\n/**\n * The class Tpc message query dto.\n *\n * @author paascloud.net @gmail.com\n */\n@EqualsAndHashCode(callSuper = true)\n@Data\n@ApiModel\npublic class MessageQueryDto extends BaseQuery {\n\n\tprivate static final long serialVersionUID = 3967075132487249652L;\n\t/**\n\t * messageKey\n\t */\n\t@ApiModelProperty(value = \"messageKey\")\n\tprivate String messageKey;\n\t/**\n\t * messageTopic\n\t */\n\t@ApiModelProperty(value = \"messageTopic\")\n\tprivate String messageTopic;\n\n\t/**\n\t * messageTag\n\t */\n\t@ApiModelProperty(value = \"messageTag\")\n\tprivate String messageTag;\n\t/**\n\t * 发送状态\n\t */\n\t@ApiModelProperty(value = \"发送状态\")\n\tprivate String messageStatus;\n\n\t/**\n\t * PID\n\t */\n\t@ApiModelProperty(value = \"PID\")\n\tprivate String producerGroup;\n\n\t/**\n\t * 消息类型\n\t */\n\t@ApiModelProperty(value = \"消息类型\")\n\tprivate String messageType;\n\n\n\t/**\n\t * 开始时间\n\t */\n\t@ApiModelProperty(value = \"开始时间\")\n\t@DateTimeFormat(pattern = \"yyyy-MM-dd HH:mm:ss\")\n\t@JsonFormat(pattern = \"yyyy-MM-dd HH:mm:ss\", timezone = \"GMT+8\")\n\tprivate Date startQueryTime;\n\n\t/**\n\t * 结束时间\n\t */\n\t@ApiModelProperty(value = \"结束时间\")\n\t@DateTimeFormat(pattern = \"yyyy-MM-dd HH:mm:ss\")\n\t@JsonFormat(pattern = \"yyyy-MM-dd HH:mm:ss\", timezone = \"GMT+8\")\n\tprivate Date endQueryTime;\n}\n"
  },
  {
    "path": "paascloud-common/paascloud-common-base/src/main/java/com/paascloud/base/dto/MqMessageDto.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：MqMessageDto.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\npackage com.paascloud.base.dto;\n\nimport lombok.AllArgsConstructor;\nimport lombok.Data;\n\nimport java.io.Serializable;\n\n/**\n * The class Tpc message dto.\n *\n * @author paascloud.net @gmail.com\n */\n@Data\n@AllArgsConstructor\npublic class MqMessageDto implements Serializable {\n\n\tprivate static final long serialVersionUID = -995670498005087805L;\n\t/**\n\t * 消息key\n\t */\n\tprivate String messageKey;\n\n\t/**\n\t * topic\n\t */\n\tprivate String messageTopic;\n}"
  },
  {
    "path": "paascloud-common/paascloud-common-base/src/main/java/com/paascloud/base/dto/MqMessageVo.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：MqMessageVo.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\npackage com.paascloud.base.dto;\n\nimport lombok.Data;\nimport lombok.EqualsAndHashCode;\n\n\n/**\n * The class Mq message vo.\n *\n * @author paascloud.net @gmail.com\n */\n@EqualsAndHashCode(callSuper = true)\n@Data\npublic class MqMessageVo extends BaseVo {\n\n\tprivate static final long serialVersionUID = 5440371083922622116L;\n\t/**\n\t * 消息key\n\t */\n\tprivate String messageKey;\n\n\t/**\n\t * topic\n\t */\n\tprivate String messageTopic;\n\n\t/**\n\t * tag\n\t */\n\tprivate String messageTag;\n\n\t/**\n\t * 消息内容\n\t */\n\tprivate String messageBody;\n\n\t/**\n\t * 消息类型: 10 - 生产者 ; 20 - 消费者\n\t */\n\tprivate Integer messageType;\n\n\t/**\n\t * 顺序类型, 0有序 1无序\n\t */\n\tprivate int orderType;\n\n\t/**\n\t * 消息状态\n\t */\n\tprivate Integer status;\n\n\t/**\n\t * 延时级别\n\t */\n\tprivate int delayLevel;\n}"
  },
  {
    "path": "paascloud-common/paascloud-common-base/src/main/java/com/paascloud/base/dto/ShardingContextDto.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：ShardingContextDto.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\npackage com.paascloud.base.dto;\n\nimport lombok.Data;\nimport lombok.NoArgsConstructor;\n\n/**\n * The class Sharding context dto.\n *\n * @author paascloud.net @gmail.com\n */\n@Data\n@NoArgsConstructor\npublic class ShardingContextDto {\n\t/**\n\t * The Sharding total count.\n\t */\n\tint shardingTotalCount;\n\t/**\n\t * The Sharding item.\n\t */\n\tint shardingItem;\n\n\tpublic ShardingContextDto(final int shardingTotalCount, final int shardingItem) {\n\t\tthis.shardingTotalCount = shardingTotalCount;\n\t\tthis.shardingItem = shardingItem;\n\t}\n}\n"
  },
  {
    "path": "paascloud-common/paascloud-common-base/src/main/java/com/paascloud/base/dto/UpdateStatusDto.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：UpdateStatusDto.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\npackage com.paascloud.base.dto;\n\nimport io.swagger.annotations.ApiModel;\nimport io.swagger.annotations.ApiModelProperty;\nimport lombok.Data;\n\nimport java.io.Serializable;\n\n/**\n * The class Modify status dto.\n *\n * @author paascloud.net@gmail.com\n */\n@Data\n@ApiModel(value = \"更改状态\")\npublic class UpdateStatusDto implements Serializable {\n\n\tprivate static final long serialVersionUID = 1494899235149813850L;\n\t/**\n\t * 角色ID\n\t */\n\t@ApiModelProperty(value = \"角色ID\")\n\tprivate Long id;\n\n\t/**\n\t * 状态\n\t */\n\t@ApiModelProperty(value = \"状态\")\n\tprivate Integer status;\n}\n"
  },
  {
    "path": "paascloud-common/paascloud-common-base/src/main/java/com/paascloud/base/dto/UserTokenDto.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：UserTokenDto.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\npackage com.paascloud.base.dto;\n\nimport com.fasterxml.jackson.annotation.JsonFormat;\nimport lombok.Data;\nimport lombok.EqualsAndHashCode;\nimport org.springframework.format.annotation.DateTimeFormat;\n\nimport java.util.Date;\n\n/**\n * The class Uac user token dto.\n *\n * @author paascloud.net @gmail.com\n */\n@EqualsAndHashCode(callSuper = true)\n@Data\npublic class UserTokenDto extends LoginAuthDto {\n\tprivate static final long serialVersionUID = 3136723742371575367L;\n\tprivate Long id;\n\n\t/**\n\t * 版本号\n\t */\n\tprivate Integer version;\n\t/**\n\t * 创建人\n\t */\n\tprivate String creator;\n\n\t/**\n\t * 创建人ID\n\t */\n\tprivate Long creatorId;\n\n\t/**\n\t * 创建时间\n\t */\n\t@DateTimeFormat(pattern = \"yyyy-MM-dd HH:mm:ss\")\n\t@JsonFormat(pattern = \"yyyy-MM-dd HH:mm:ss\", timezone = \"GMT+8\")\n\tprivate Date createdTime;\n\n\t/**\n\t * 最近操作人\n\t */\n\tprivate String lastOperator;\n\n\t/**\n\t * 最后操作人ID\n\t */\n\tprivate Long lastOperatorId;\n\n\t/**\n\t * 更新时间\n\t */\n\t@DateTimeFormat(pattern = \"yyyy-MM-dd HH:mm:ss\")\n\t@JsonFormat(pattern = \"yyyy-MM-dd HH:mm:ss\", timezone = \"GMT+8\")\n\tprivate Date updateTime;\n\t/**\n\t * 父ID\n\t */\n\tprivate Long pid;\n\n\t/**\n\t * 登陆人Ip地址\n\t */\n\tprivate String loginIp;\n\n\t/**\n\t * 登录地址\n\t */\n\tprivate String loginLocation;\n\n\t/**\n\t * 操作系统\n\t */\n\tprivate String os;\n\n\t/**\n\t * 浏览器类型\n\t */\n\tprivate String browser;\n\n\t/**\n\t * 访问token\n\t */\n\tprivate String accessToken;\n\n\t/**\n\t * 刷新token\n\t */\n\tprivate String refreshToken;\n\n\t/**\n\t * 访问token的生效时间(秒)\n\t */\n\tprivate Integer accessTokenValidity;\n\n\t/**\n\t * 刷新token的生效时间(秒)\n\t */\n\tprivate Integer refreshTokenValidity;\n\n\t/**\n\t * 0 在线 10已刷新 20 离线\n\t */\n\tprivate Integer status;\n}\n"
  },
  {
    "path": "paascloud-common/paascloud-common-base/src/main/java/com/paascloud/base/enums/ErrorCodeEnum.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：ErrorCodeEnum.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\npackage com.paascloud.base.enums;\n\n\n/**\n * The class Error code enum.\n *\n * @author paascloud.net @gmail.com\n */\npublic enum ErrorCodeEnum {\n\t/**\n\t * Gl 99990100 error code enum.\n\t */\n\tGL99990100(9999100, \"参数异常\"),\n\t/**\n\t * Gl 99990401 error code enum.\n\t */\n\tGL99990401(99990401, \"无访问权限\"),\n\t/**\n\t * Gl 000500 error code enum.\n\t */\n\tGL99990500(500, \"未知异常\"),\n\t/**\n\t * Gl 000403 error code enum.\n\t */\n\tGL99990403(9999403, \"无权访问\"),\n\t/**\n\t * Gl 000404 error code enum.\n\t */\n\tGL9999404(9999404, \"找不到指定资源\"),\n\t/**\n\t * Gl 99990001 error code enum.\n\t */\n\tGL99990001(99990001, \"注解使用错误\"),\n\t/**\n\t * Gl 99990002 error code enum.\n\t */\n\tGL99990002(99990002, \"微服务不在线,或者网络超时\"),\n\t/**\n\t * Uac 10010001 error code enum.\n\t */\n//\t 1001 用户中心\n\tUAC10010001(10010001, \"会话超时,请刷新页面重试\"),\n\t/**\n\t * Uac 10010002 error code enum.\n\t */\n\tUAC10010002(10010002, \"TOKEN解析失败\"),\n\t/**\n\t * Uac 10010003 error code enum.\n\t */\n\tUAC10010003(10010003, \"操作频率过快, 您的帐号已被冻结\"),\n\t/**\n\t * Uac 10011001 error code enum.\n\t */\n\tUAC10011001(10011001, \"用户Id不能为空\"),\n\t/**\n\t * Uac 10011002 error code enum.\n\t */\n\tUAC10011002(10011002, \"找不到用户,loginName=%s\"),\n\t/**\n\t * Uac 10011003 error code enum.\n\t */\n\tUAC10011003(10011003, \"找不到用户,userId=%s\"),\n\t/**\n\t * Uac 10011004 error code enum.\n\t */\n\tUAC10011004(10011004, \"找不到用户,email=%s\"),\n\t/**\n\t * Uac 10011006 error code enum.\n\t */\n\tUAC10011006(10012006, \"手机号不能为空\"),\n\t/**\n\t * Uac 10011007 error code enum.\n\t */\n\tUAC10011007(10011007, \"登录名不能为空\"),\n\t/**\n\t * Uac 10011008 error code enum.\n\t */\n\tUAC10011008(10011008, \"新密码不能为空\"),\n\t/**\n\t * Uac 10011009 error code enum.\n\t */\n\tUAC10011009(10011009, \"确认密码不能为空\"),\n\t/**\n\t * Uac 10011010 error code enum.\n\t */\n\tUAC10011010(10011010, \"两次密码不一致\"),\n\t/**\n\t * Uac 10011011 error code enum.\n\t */\n\tUAC10011011(10011011, \"用户不存在, userId=%s\"),\n\t/**\n\t * Uac 10011012 error code enum.\n\t */\n\tUAC10011012(10011012, \"登录名已存在\"),\n\t/**\n\t * Uac 10011013 error code enum.\n\t */\n\tUAC10011013(10011013, \"手机号已存在\"),\n\t/**\n\t * Uac 10011014 error code enum.\n\t */\n\tUAC10011014(10011014, \"密码不能为空\"),\n\t/**\n\t * Uac 10011016 error code enum.\n\t */\n\tUAC10011016(10011016, \"用户名或密码错误\"),\n\t/**\n\t * Uac 10011017 error code enum.\n\t */\n\tUAC10011017(10011017, \"验证类型错误\"),\n\t/**\n\t * Uac 10011018 error code enum.\n\t */\n\tUAC10011018(10011018, \"邮箱不能为空\"),\n\t/**\n\t * Uac 10011019 error code enum.\n\t */\n\tUAC10011019(10011019, \"邮箱已存在\"),\n\t/**\n\t * Uac 10011020 error code enum.\n\t */\n\tUAC10011020(10011020, \"短信模板不能为空\"),\n\t/**\n\t * Uac 10011021 error code enum.\n\t */\n\tUAC10011021(10011021, \"发送短信验证码对象转换为json字符串失败\"),\n\t/**\n\t * Uac 10011022 error code enum.\n\t */\n\tUAC10011022(10011022, \"发送短信验证码失败\"),\n\t/**\n\t * Uac 10011023 error code enum.\n\t */\n\tUAC10011023(10011023, \"越权操作\"),\n\t/**\n\t * Uac 10011024 error code enum.\n\t */\n\tUAC10011024(10011024, \"找不到绑定的用户, userId=%\"),\n\t/**\n\t * Uac 10011025 error code enum.\n\t */\n\tUAC10011025(10011025, \"用户已存在, loginName=%\"),\n\t/**\n\t * Uac 10011026 error code enum.\n\t */\n\tUAC10011026(10011026, \"更新用户失败, userId=%\"),\n\t/**\n\t * Uac 10011027 error code enum.\n\t */\n\tUAC10011027(10011027, \"找不到用户,mobile=%s\"),\n\t/**\n\t * Uac 10011028 error code enum.\n\t */\n\tUAC10011028(10011028, \"链接已失效\"),\n\t/**\n\t * Uac 10011029 error code enum.\n\t */\n\tUAC10011029(10011029, \"重置密码失败\"),\n\t/**\n\t * Uac 10011030 error code enum.\n\t */\n\tUAC10011030(10011030, \"激活失败, 链接已过期\"),\n\t/**\n\t * Uac 10011031 error code enum.\n\t */\n\tUAC10011031(10011031, \"验证码超时, 请重新发送验证码\"),\n\t/**\n\t * Uac 10011032 error code enum.\n\t */\n\tUAC10011032(10011032, \"邮箱不存在, loginName=%s,email=%s\"),\n\t/**\n\t * Uac 10011033 error code enum.\n\t */\n\tUAC10011033(10011033, \"清空该用户常用菜单失败\"),\n\t/**\n\t * Uac 10011034 error code enum.\n\t */\n\tUAC10011034(10011034, \"不允许操作admin用户\"),\n\t/**\n\t * Uac 10011035 error code enum.\n\t */\n\tUAC10011035(10011035, \"原始密码输入错误\"),\n\t/**\n\t * Uac 10011036 error code enum.\n\t */\n\tUAC10011036(10011036, \"新密码和原始密码不能相同\"),\n\t/**\n\t * Uac 10011037 error code enum.\n\t */\n\tUAC10011037(10011037, \"修改用户失败,userId=%s\"),\n\t/**\n\t * Uac 10011038 error code enum.\n\t */\n\tUAC10011038(10011038, \"激活用户失败,userId=%s\"),\n\t/**\n\t * Uac 10011039 error code enum.\n\t */\n\tUAC10011039(10011039, \"验证token失败\"),\n\t/**\n\t * Uac 10011040 error code enum.\n\t */\n\tUAC10011040(10011040, \"解析header失败\"),\n\t/**\n\t * Uac 10011041 error code enum.\n\t */\n\tUAC10011041(10011041, \"页面已过期,请重新登录\"),\n\t/**\n\t * Uac 10011042 error code enum.\n\t */\n\tUAC10011042(10011042, \"Cookie转码异常\"),\n\t/**\n\t * Uac 10012001 error code enum.\n\t */\n\tUAC10012001(10012001, \"角色ID不能为空\"),\n\t/**\n\t * Uac 10012002 error code enum.\n\t */\n\tUAC10012002(10012002, \"拥有的角色不允许禁用\"),\n\t/**\n\t * Uac 10012003 error code enum.\n\t */\n\tUAC10012003(10012003, \"系统角色不能删除\"),\n\t/**\n\t * Uac 10012004 error code enum.\n\t */\n\tUAC10012004(10012004, \"超级角色Id不能为空\"),\n\n\t/**\n\t * Uac 10012005 error code enum.\n\t */\n\tUAC10012005(10012005, \"找不到角色信息,roleId=%s\"),\n\t/**\n\t * Uac 10012006 error code enum.\n\t */\n\tUAC10012006(10012006, \"删除角色失败, roleId=%s\"),\n\t/**\n\t * Uac 10012007 error code enum.\n\t */\n\tUAC10012007(10012007, \"批量删除角色失败, roleId=%s\"),\n\t/**\n\t * Uac 10012008 error code enum.\n\t */\n\tUAC10012008(10012008, \"找不到绑定的角色, roleId=%s\"),\n\n\n\t/**\n\t * Uac 10013001 error code enum.\n\t */\n\tUAC10013001(10013001, \"父菜单不存在,menuId=%s\"),\n\t/**\n\t * Uac 10013002 error code enum.\n\t */\n\tUAC10013002(10013002, \"更新上级菜单失败,menuId=%s\"),\n\t/**\n\t * Uac 10013003 error code enum.\n\t */\n\tUAC10013003(10013003, \"菜单不存在,menuId=%s\"),\n\t/**\n\t * Uac 10013004 error code enum.\n\t */\n\tUAC10013004(10013004, \"启用菜单失败,menuId=%s\"),\n\t/**\n\t * Uac 10013005 error code enum.\n\t */\n\tUAC10013005(10013005, \"禁用菜单失败,menuId=%s\"),\n\t/**\n\t * Uac 10013006 error code enum.\n\t */\n\tUAC10013006(10013006, \"更新菜单状态失败,menuId=%s\"),\n\t/**\n\t * Uac 10013007 error code enum.\n\t */\n\tUAC10013007(10013007, \"根菜单不能禁用\"),\n\t/**\n\t * Uac 10013008 error code enum.\n\t */\n\tUAC10013008(10013008, \"删除菜单失败, menuId=%s\"),\n\t/**\n\t * Uac 10013009 error code enum.\n\t */\n\tUAC10013009(10013009, \"请先分配菜单\"),\n\t/**\n\t * Uac 10013010 error code enum.\n\t */\n\tUAC10013010(10013010, \"选择菜单不是根目录,menuId=%s\"),\n\n\n\t/**\n\t * Uac 10014001 error code enum.\n\t */\n\tUAC10014001(10014001, \"找不到权限信息, actionId=%s\"),\n\t/**\n\t * Uac 10014002 error code enum.\n\t */\n\tUAC10014002(10014002, \"删除失败, actionId=%s\"),\n\t/**\n\t * Uac 10014003 error code enum.\n\t */\n\tUAC10014003(10014003, \"保存权限信息失败\"),\n\t/**\n\t * Uac 10015001 error code enum.\n\t */\n\tUAC10015001(10015001, \"找不到组织信息,groupId=%s\"),\n\t/**\n\t * Uac 10015002 error code enum.\n\t */\n\tUAC10015002(10015002, \"组织状态不存在\"),\n\t/**\n\t * Uac 10015003 error code enum.\n\t */\n\tUAC10015003(10015003, \"操作越权, 启用子节点, 必须先启用父节点\"),\n\t/**\n\t * Uac 10015004 error code enum.\n\t */\n\tUAC10015004(10015004, \"找不到组织信息,groupId=%s\"),\n\t/**\n\t * Uac 10015006 error code enum.\n\t */\n\tUAC10015006(10015006, \"更新组织信息失败,groupId=%s\"),\n\t/**\n\t * Uac 10015007 error code enum.\n\t */\n\tUAC10015007(10015007, \"该组织下还存在子节点，不能将其删除, Pid=%s\"),\n\t/**\n\t * Uac 10015008 error code enum.\n\t */\n\tUAC10015008(10015008, \"该组织下绑定的用户，不能将其删除, groupId=%s\"),\n\t/**\n\t * Uac 10015009 error code enum.\n\t */\n\tUAC10015009(10015009, \"找不到上级组织, groupId=%s\"),\n\t/**\n\t * Mdc 10021001 error code enum.\n\t */\n// 1002 数据中心\n\tMDC10021001(10021001, \"获取地址信息失败\"),\n\t/**\n\t * Mdc 10021002 error code enum.\n\t */\n\tMDC10021002(10021002, \"找不到该地址信息\"),\n\t/**\n\t * Mdc 10021003 error code enum.\n\t */\n\tMDC10021003(10021003, \"获取商品信息失败\"),\n\t/**\n\t * Mdc 10021004 error code enum.\n\t */\n\tMDC10021004(10021004, \"找不到该商品信息,productId=%s\"),\n\t/**\n\t * Mdc 10021015 error code enum.\n\t */\n\tMDC10021015(10021015, \"商品不是在线售卖状态, productId=%s\"),\n\t/**\n\t * Mdc 10021016 error code enum.\n\t */\n\tMDC10021016(10021016, \"商品库存不足, productId=%s\"),\n\t/**\n\t * Mdc 10021017 error code enum.\n\t */\n\tMDC10021017(10021017, \"产品已下架或者删除, productId=%s\"),\n\t/**\n\t * Mdc 10021018 error code enum.\n\t */\n\tMDC10021018(10021018, \"找不到数据字典信息, dictId=%s\"),\n\t/**\n\t * Mdc 10021019 error code enum.\n\t */\n\tMDC10021019(10021019, \"更新字典状态失败, dictId=%s\"),\n\t/**\n\t * Mdc 10021020 error code enum.\n\t */\n\tMDC10021020(10021020, \"上级数据字典不存在, dictId=%s\"),\n\t/**\n\t * Mdc 10021021 error code enum.\n\t */\n\tMDC10021021(10021021, \"商品ID不能为空\"),\n\t/**\n\t * Mdc 10021024 error code enum.\n\t */\n\tMDC10021024(10021024, \"商品编码不能为空\"),\n\n\t/**\n\t * Mdc 10023001 error code enum.\n\t */\n\tMDC10023001(10023001, \"找不到商品分类信息, categoryId=%s\"),\n\n\t/**\n\t * Mdc 10023002 error code enum.\n\t */\n\tMDC10023002(10023002, \"上级商品分类不存在, categoryId=%s\"),\n\n\t/**\n\t * Mdc 10023003 error code enum.\n\t */\n\tMDC10023003(10023003, \"更新商品分类状态失败, categoryId=%s\"),\n\t/**\n\t * Mdc 10021022 error code enum.\n\t */\n\tMDC10021022(10021022, \"更新商品信息失败, productId=%s\"),\n\t/**\n\t * Mdc 10021023 error code enum.\n\t */\n\tMDC10021023(10021023, \"删除商品信息失败, productId=%s\"),\n\t/**\n\t * Omc 10031001 error code enum.\n\t */\n// 1003 订单中心\n\tOMC10031001(10031001, \"购物车为空, userId=%s\"),\n\t/**\n\t * Omc 10031002 error code enum.\n\t */\n\tOMC10031002(10031002, \"生成订单失败\"),\n\t/**\n\t * Omc 10031003 error code enum.\n\t */\n\tOMC10031003(10031003, \"该用户此订单不存在\"),\n\t/**\n\t * Omc 10031004 error code enum.\n\t */\n\tOMC10031004(10031004, \"已付款, 无法取消订单\"),\n\t/**\n\t * Omc 10031005 error code enum.\n\t */\n\tOMC10031005(10031005, \"找不到订单信息, orderNo=%s\"),\n\t/**\n\t * Omc 10031006 error code enum.\n\t */\n\tOMC10031006(10031006, \"清空购物车失败\"),\n\t/**\n\t * Omc 10031007 error code enum.\n\t */\n\tOMC10031007(10031007, \"不存在默认地址\"),\n\t/**\n\t * Omc 10031008 error code enum.\n\t */\n\tOMC10031008(10031008, \"更新默认地址失败, addressId=%s\"),\n\t/**\n\t * Omc 10031009 error code enum.\n\t */\n\tOMC10031009(10031009, \"批量插入订单明细失败\"),\n\t/**\n\t * Omc 10031010 error code enum.\n\t */\n\tOMC10031010(10031010, \"非快乐学习网的订单, 回调忽略\"),\n\t/**\n\t * Omc 10031011 error code enum.\n\t */\n\tOMC10031011(10031011, \"支付宝重复调用\"),\n\t/**\n\t * Omc 10031012 error code enum.\n\t */\n\tOMC10031012(10031012, \"上传失败\"),\n\t/**\n\t * Omc 10031013 error code enum.\n\t */\n\tOMC10031013(10031013, \"获取附件地址失败\"),\n\t/**\n\t * Omc 10031014 error code enum.\n\t */\n\tOMC10031014(10031014, \"更新购物车数据失败, cartId=%s\"),\n\t/**\n\t * Omc 10031016 error code enum.\n\t */\n\tOMC10031016(10031016, \"更新购物车数据失败, cartId=%s\"),\n\t/**\n\t * Opc 10040001 error code enum.\n\t */\n// 1004 对接中心\n\tOPC10040001(10040001, \"根据IP定位失败\"),\n\t/**\n\t * Opc 10040002 error code enum.\n\t */\n\tOPC10040002(10040002, \"上传文件失败\"),\n\t/**\n\t * Opc 10040003 error code enum.\n\t */\n\tOPC10040003(10040003, \"文件类型不符\"),\n\t/**\n\t * Opc 10040004 error code enum.\n\t */\n\tOPC10040004(10040004, \"发送短信失败\"),\n\t/**\n\t * Opc 10040005 error code enum.\n\t */\n\tOPC10040005(10040005, \"生成邮件消息体失败\"),\n\t/**\n\t * Opc 10040006 error code enum.\n\t */\n\tOPC10040006(10040006, \"获取模板信息失败\"),\n\t/**\n\t * Opc 10040007 error code enum.\n\t */\n\tOPC10040007(10040007, \"更新附件失败, id=%s\"),\n\t/**\n\t * Opc 10040008 error code enum.\n\t */\n\tOPC10040008(10040008, \"找不到该附件信息, id=%s\"),\n\t/**\n\t * Opc 10040009 error code enum.\n\t */\n\tOPC10040009(10040009, \"上传图片失败\"),\n\t/**\n\t * Tpc 10050001 error code enum.\n\t */\n\tOPC10040010(10040010, \"文件名不能为空\"),\n\t/**\n\t * Opc 10040011 error code enum.\n\t */\n\tOPC10040011(10040011, \"今日流量已用尽, 请明天再试\"),\n\t/**\n\t * Tpc 10050001 error code enum.\n\t */\n// 1005 任务中心\n\tTPC10050001(10050001, \"消息的消费Topic不能为空\"),\n\t/**\n\t * Tpc 10050002 error code enum.\n\t */\n\tTPC10050002(10050002, \"根据消息key查找的消息为空\"),\n\t/**\n\t * Tpc 10050003 error code enum.\n\t */\n\tTPC10050003(10050003, \"删除消息失败,messageKey=%s\"),\n\t/**\n\t * Tpc 10050004 error code enum.\n\t */\n\tTPC10050004(10050004, \"消息中心接口异常,message=%s, messageKey=%s\"),\n\t/**\n\t * Tpc 10050005 error code enum.\n\t */\n\tTPC10050005(10050005, \"目标接口参数不能为空\"),\n\t/**\n\t * Tpc 10050006 error code enum.\n\t */\n\tTPC10050006(10050006, \"根据任务Id查找的消息为空\"),\n\n\t/**\n\t * Tpc 10050007 error code enum.\n\t */\n\tTPC10050007(10050007, \"消息数据不能为空\"),\n\t/**\n\t * Tpc 10050008 error code enum.\n\t */\n\tTPC10050008(10050008, \"消息体不能为空,messageKey=%s\"),\n\t/**\n\t * Tpc 10050009 error code enum.\n\t */\n\tTPC10050009(10050009, \"消息KEY不能为空\"),\n\t/**\n\t * Tpc 100500010 error code enum.\n\t */\n\tTPC100500010(10050010, \"Topic=%s, 无消费者订阅\"),\n\t/**\n\t * Tpc 100500011 error code enum.\n\t */\n\tTPC100500011(10050011, \"Mq编码转换异常, MessageKey=%s\"),\n\t/**\n\t * Tpc 100500012 error code enum.\n\t */\n\tTPC100500012(10050012, \"发送MQ失败, MessageKey=%s\"),\n\t/**\n\t * Tpc 100500013 error code enum.\n\t */\n\tTPC100500013(10050013, \"延迟级别错误, Topic=%s, MessageKey=%s\"),\n\t/**\n\t * Tpc 100500014 error code enum.\n\t */\n\tTPC100500014(10050014, \"MQ重试三次,仍然发送失败, Topic=%s, MessageKey=%s\"),\n\t/**\n\t * Tpc 100500015 error code enum.\n\t */\n\tTPC100500015(10050015, \"消息PID不能为空, messageKey=%s\"),;\n\tprivate int code;\n\tprivate String msg;\n\n\t/**\n\t * Msg string.\n\t *\n\t * @return the string\n\t */\n\tpublic String msg() {\n\t\treturn msg;\n\t}\n\n\t/**\n\t * Code int.\n\t *\n\t * @return the int\n\t */\n\tpublic int code() {\n\t\treturn code;\n\t}\n\n\tErrorCodeEnum(int code, String msg) {\n\t\tthis.code = code;\n\t\tthis.msg = msg;\n\t}\n\n\t/**\n\t * Gets enum.\n\t *\n\t * @param code the code\n\t *\n\t * @return the enum\n\t */\n\tpublic static ErrorCodeEnum getEnum(int code) {\n\t\tfor (ErrorCodeEnum ele : ErrorCodeEnum.values()) {\n\t\t\tif (ele.code() == code) {\n\t\t\t\treturn ele;\n\t\t\t}\n\t\t}\n\t\treturn null;\n\t}\n}\n"
  },
  {
    "path": "paascloud-common/paascloud-common-base/src/main/java/com/paascloud/base/exception/BooleanParseException.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：BooleanParseException.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\npackage com.paascloud.base.exception;\n\n/**\n * The class Boolean parse exception.\n *\n * @author paascloud.net@gmail.com\n */\npublic class BooleanParseException extends RuntimeException {\n\n\t/**\n\t * Instantiates a new Boolean parse exception.\n\t */\n\tpublic BooleanParseException() {\n\t\tsuper();\n\t}\n\n\t/**\n\t * Instantiates a new Boolean parse exception.\n\t *\n\t * @param message the message\n\t */\n\tpublic BooleanParseException(String message) {\n\t\tsuper(message);\n\t}\n\n\t/**\n\t * Instantiates a new Boolean parse exception.\n\t *\n\t * @param message the message\n\t * @param cause   the cause\n\t */\n\tpublic BooleanParseException(String message, Throwable cause) {\n\t\tsuper(message, cause);\n\t}\n\n\t/**\n\t * Instantiates a new Boolean parse exception.\n\t *\n\t * @param cause the cause\n\t */\n\tpublic BooleanParseException(Throwable cause) {\n\t\tsuper(cause);\n\t}\n\n}\n"
  },
  {
    "path": "paascloud-common/paascloud-common-base/src/main/java/com/paascloud/base/exception/BusinessException.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：BusinessException.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\npackage com.paascloud.base.exception;\n\n\nimport com.paascloud.base.enums.ErrorCodeEnum;\nimport lombok.extern.slf4j.Slf4j;\n\n/**\n * 业务异常.\n *\n * @author paascloud.net @gmail.com\n */\n@Slf4j\npublic class BusinessException extends RuntimeException {\n\n\t/**\n\t * 异常码\n\t */\n\tprotected int code;\n\n\tprivate static final long serialVersionUID = 3160241586346324994L;\n\n\tpublic BusinessException() {\n\t}\n\n\tpublic BusinessException(Throwable cause) {\n\t\tsuper(cause);\n\t}\n\n\tpublic BusinessException(String message) {\n\t\tsuper(message);\n\t}\n\n\tpublic BusinessException(String message, Throwable cause) {\n\t\tsuper(message, cause);\n\t}\n\n\tpublic BusinessException(int code, String message) {\n\t\tsuper(message);\n\t\tthis.code = code;\n\t}\n\n\tpublic BusinessException(int code, String msgFormat, Object... args) {\n\t\tsuper(String.format(msgFormat, args));\n\t\tthis.code = code;\n\t}\n\n\tpublic BusinessException(ErrorCodeEnum codeEnum, Object... args) {\n\t\tsuper(String.format(codeEnum.msg(), args));\n\t\tthis.code = codeEnum.code();\n\t}\n\n\tpublic int getCode() {\n\t\treturn code;\n\t}\n\n\tpublic void setCode(int code) {\n\t\tthis.code = code;\n\t}\n}\n"
  },
  {
    "path": "paascloud-common/paascloud-common-base/src/main/java/com/paascloud/base/exception/ConfigException.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：ConfigException.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\npackage com.paascloud.base.exception;\n\n/**\n * The class Config exception.\n *\n * @author paascloud.net@gmail.com\n */\npublic class ConfigException extends RuntimeException {\n\n\tprivate static final long serialVersionUID = 6480772904575978373L;\n\n\t/**\n\t * Instantiates a new Config exception.\n\t *\n\t * @param message the message\n\t */\n\tpublic ConfigException(String message) {\n\t\tsuper(message);\n\t}\n\n\t/**\n\t * Instantiates a new Config exception.\n\t */\n\tpublic ConfigException() {\n\n\t}\n}\n"
  },
  {
    "path": "paascloud-common/paascloud-common-base/src/main/java/com/paascloud/base/exception/ImportException.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：ImportException.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\npackage com.paascloud.base.exception;\n\n\n/**\n * The class Import exception.\n *\n * @author paascloud.net@gmail.com\n */\npublic class ImportException extends RuntimeException {\n\n\tprivate static final long serialVersionUID = -4740091660440744697L;\n\n\t/**\n\t * Instantiates a new Import exception.\n\t *\n\t * @param message the message\n\t */\n\tpublic ImportException(String message) {\n\t\tsuper(message);\n\t}\n}\n"
  },
  {
    "path": "paascloud-common/paascloud-common-base/src/main/java/com/paascloud/base/exception/ReferenceModelNullException.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：ReferenceModelNullException.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\npackage com.paascloud.base.exception;\n\n/**\n * The class Reference model null exception.\n *\n * @author paascloud.net@gmail.com\n */\npublic class ReferenceModelNullException extends RuntimeException {\n\tprivate static final long serialVersionUID = -318154770875589045L;\n\n\t/**\n\t * Instantiates a new Reference model null exception.\n\t *\n\t * @param message the message\n\t */\n\tpublic ReferenceModelNullException(String message) {\n\t\tsuper(message);\n\t}\n}\n"
  },
  {
    "path": "paascloud-common/paascloud-common-base/src/main/resources/.gitkeep",
    "content": ""
  },
  {
    "path": "paascloud-common/paascloud-common-base/src/test/java/.gitkeep",
    "content": ""
  },
  {
    "path": "paascloud-common/paascloud-common-config/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\"\n         xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n         xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n    <parent>\n        <groupId>com.liuzm.paascloud.common</groupId>\n        <artifactId>paascloud-common</artifactId>\n        <version>1.0</version>\n    </parent>\n    <modelVersion>4.0.0</modelVersion>\n    <artifactId>paascloud-common-config</artifactId>\n    <version>1.0</version>\n    <dependencies>\n        <dependency>\n            <groupId>org.springframework.boot</groupId>\n            <artifactId>spring-boot-configuration-processor</artifactId>\n            <optional>true</optional>\n        </dependency>\n        <dependency>\n            <groupId>org.springframework.boot</groupId>\n            <artifactId>spring-boot</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>com.liuzm.paascloud.common</groupId>\n            <artifactId>paascloud-common-base</artifactId>\n        </dependency>\n    </dependencies>\n\n\n</project>"
  },
  {
    "path": "paascloud-common/paascloud-common-config/src/main/java/com/paascloud/config/PaascloudCoreConfig.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：PaascloudCoreConfig.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\npackage com.paascloud.config;\n\n\nimport com.paascloud.config.properties.PaascloudProperties;\nimport org.springframework.boot.context.properties.EnableConfigurationProperties;\nimport org.springframework.context.annotation.Configuration;\n\n/**\n * The class Aliyun core config.\n *\n * @author paascloud.net @gmail.com\n */\n@Configuration\n@EnableConfigurationProperties(PaascloudProperties.class)\npublic class PaascloudCoreConfig {\n}\n"
  },
  {
    "path": "paascloud-common/paascloud-common-config/src/main/java/com/paascloud/config/properties/AliyunProperties.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：AliyunProperties.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\npackage com.paascloud.config.properties;\n\nimport lombok.Data;\n\n/**\n * The class Aliyun properties.\n *\n * @author paascloud.net @gmail.com\n */\n@Data\npublic class AliyunProperties {\n\tprivate AliyunKeyProperties key = new AliyunKeyProperties();\n\tprivate RocketMqProperties rocketMq = new RocketMqProperties();\n\tprivate AliyunSmsProperties sms = new AliyunSmsProperties();\n\n\t@Data\n\tpublic class AliyunKeyProperties {\n\t\t/**\n\t\t * 秘钥id\n\t\t */\n\t\tprivate String accessKeyId;\n\n\t\t/**\n\t\t * 秘钥\n\t\t */\n\t\tprivate String accessKeySecret;\n\t}\n\n\t@Data\n\tpublic class RocketMqProperties {\n\t\tprivate String consumerGroup;\n\t\tprivate String producerGroup;\n\t\tprivate String namesrvAddr;\n\t\t/**\n\t\t * 生产者是否使用可靠消息, 默认不使用 @MqConsumerStore\n\t\t */\n\t\tprivate boolean reliableMessageProducer;\n\t\t/**\n\t\t * 消费者是否使用可靠消息, 默认不使用 @MqProducerStore\n\t\t */\n\t\tprivate boolean reliableMessageConsumer;\n\t}\n\n\t@Data\n\tpublic class AliyunSmsProperties {\n\n\t\t/**\n\t\t * 阿里云管理控制台中配置的短信签名（状态必须是验证通过）\n\t\t */\n\t\tprivate String signName;\n\n\t\t/**\n\t\t * 机房信息\n\t\t */\n\t\tprivate String regionId;\n\n\t\t/**\n\t\t * 端点\n\t\t */\n\t\tprivate String endpoint;\n\n\t\t/**\n\t\t * 端点名称\n\t\t */\n\t\tprivate String endpointName;\n\n\t\tprivate String product;\n\n\t\tprivate String domain;\n\t}\n}"
  },
  {
    "path": "paascloud-common/paascloud-common-config/src/main/java/com/paascloud/config/properties/AsyncTaskProperties.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：AsyncTaskProperties.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\npackage com.paascloud.config.properties;\n\nimport lombok.Data;\n\n/**\n * The class Async task properties.\n *\n * @author paascloud.net @gmail.com\n */\n@Data\npublic class AsyncTaskProperties {\n\n\tprivate int corePoolSize = 50;\n\n\tprivate int maxPoolSize = 100;\n\n\tprivate int queueCapacity = 10000;\n\n\tprivate int keepAliveSeconds = 3000;\n\n\tprivate String threadNamePrefix = \"paascloud-task-executor-\";\n}\n"
  },
  {
    "path": "paascloud-common/paascloud-common-config/src/main/java/com/paascloud/config/properties/GaodeProperties.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：GaodeProperties.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.config.properties;\n\nimport lombok.Data;\n\n\n/**\n * The class Gaode properties.\n *\n * @author paascloud.net @gmail.com\n */\n@Data\npublic class GaodeProperties {\n\tprivate String key = \"f8bdce6f882a98635bb0b7b897331327\";\n}\n"
  },
  {
    "path": "paascloud-common/paascloud-common-config/src/main/java/com/paascloud/config/properties/JobProperties.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：JobProperties.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.config.properties;\n\nimport lombok.Data;\n\n/**\n * The class Job core properties.\n *\n * @author paascloud.net @gmail.com\n */\n@Data\npublic class JobProperties {\n    private JobTask task = new JobTask();\n\n\n    @Data\n    public class JobTask {\n        private JobCoreProperties dingTalk = new JobCoreProperties();\n        private JobCoreProperties sendingMessage = new JobCoreProperties();\n        private JobCoreProperties waitingMessage = new JobCoreProperties();\n\n        @Data\n        public class JobCoreProperties {\n            /**\n             * 作业名称\n             */\n            private String jobName;\n            /**\n             * cron表达式，用于控制作业触发时间\n             */\n            private String cron;\n            /**\n             * 作业分片总数\n             */\n            private int shardingTotalCount;\n            /**\n             * 分片序列号和参数用等号分隔，多个键值对用逗号分隔,分片序列号从0开始，不可大于或等于作业分片总数如：0=a,1=b,2=c\n             */\n            private String shardingItemParameters;\n\n            /**\n             * 作业自定义参数，可通过传递该参数为作业调度的业务方法传参，用于实现带参数的作业例：每次获取的数据量、作业实例从数据库读取的主键等\n             */\n            private String jobParameter;\n            /**\n             * 是否开启任务执行失效转移，开启表示如果作业在一次任务执行中途宕机，允许将该次未完成的任务在另一作业节点上补偿执行\n             */\n            private boolean failover;\n            /**\n             * 是否开启错过任务重新执行\n             */\n            private boolean misfire = true;\n            /**\n             * 作业描述信息\n             */\n            private String description;\n\n            /**\n             * 配置jobProperties定义的枚举控制Elastic-Job的实现细节JOB_EXCEPTION_HANDLER用于扩展异常处理类EXECUTOR_SERVICE_HANDLER用于扩展作业处理线程池类\n             */\n            private Enum jobProperties;\n        }\n    }\n}\n"
  },
  {
    "path": "paascloud-common/paascloud-common-config/src/main/java/com/paascloud/config/properties/PaascloudProperties.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：PaascloudProperties.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.config.properties;\n\n\nimport com.paascloud.base.constant.GlobalConstant;\nimport lombok.Data;\nimport org.springframework.boot.context.properties.ConfigurationProperties;\n\n/**\n * The class Paascloud properties.\n *\n * @author paascloud.net @gmail.com\n */\n@Data\n@ConfigurationProperties(prefix = GlobalConstant.ROOT_PREFIX)\npublic class PaascloudProperties {\n\tprivate ReliableMessageProperties message = new ReliableMessageProperties();\n\tprivate AliyunProperties aliyun = new AliyunProperties();\n\tprivate AsyncTaskProperties task = new AsyncTaskProperties();\n\tprivate SwaggerProperties swagger = new SwaggerProperties();\n\tprivate QiniuProperties qiniu = new QiniuProperties();\n\tprivate GaodeProperties gaode = new GaodeProperties();\n\tprivate JobProperties job = new JobProperties();\n\tprivate ZookeeperProperties zk = new ZookeeperProperties();\n}\n"
  },
  {
    "path": "paascloud-common/paascloud-common-config/src/main/java/com/paascloud/config/properties/QiniuProperties.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：QiniuProperties.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.config.properties;\n\nimport lombok.Data;\n\n/**\n * The class Qiniu oss properties.\n *\n * @author paascloud.net@gmail.com\n */\n@Data\npublic class QiniuProperties {\n\tprivate QiniuKeyProperties key = new QiniuKeyProperties();\n\tprivate QiniuOssProperties oss = new QiniuOssProperties();\n\n\t@Data\n\tpublic class QiniuKeyProperties {\n\t\tprivate String accessKey;\n\t\tprivate String secretKey;\n\t}\n\n\t@Data\n\tpublic class QiniuOssProperties {\n\t\tprivate String privateHost;\n\t\tprivate String publicHost;\n\t\tprivate Long fileMaxSize;\n\t}\n}\n"
  },
  {
    "path": "paascloud-common/paascloud-common-config/src/main/java/com/paascloud/config/properties/ReliableMessageProperties.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：ReliableMessageProperties.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.config.properties;\n\n/**\n * The class Reliable message properties.\n *\n * @author paascloud.net @gmail.com\n */\npublic class ReliableMessageProperties {\n}\n"
  },
  {
    "path": "paascloud-common/paascloud-common-config/src/main/java/com/paascloud/config/properties/SwaggerProperties.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：SwaggerProperties.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.config.properties;\n\nimport lombok.Data;\n\n/**\n * The class Async task properties.\n *\n * @author paascloud.net @gmail.com\n */\n@Data\npublic class SwaggerProperties {\n\n\tprivate String title;\n\n\tprivate String description;\n\n\tprivate String version = \"1.0\";\n\n\tprivate String license = \"Apache License 2.0\";\n\n\tprivate String licenseUrl = \"http://www.apache.org/licenses/LICENSE-2.0\";\n\n\tprivate String contactName = \"无痕\";\n\n\tprivate String contactUrl = \"http://paascloud.net\";\n\n\tprivate String contactEmail = \"paascloud.net@gmail.com\";\n}\n"
  },
  {
    "path": "paascloud-common/paascloud-common-config/src/main/java/com/paascloud/config/properties/ZookeeperProperties.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：ZookeeperProperties.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.config.properties;\n\n\nimport lombok.Data;\n\n/**\n * The class Job zookeeper properties.\n *\n * @author paascloud.net @gmail.com\n */\n@Data\npublic class ZookeeperProperties {\n\t/**\n\t * 连接Zookeeper服务器的列表\n\t * 包括IP地址和端口号\n\t * 多个地址用逗号分隔\n\t * 如: host1:2181,host2:2181\n\t */\n\tprivate String zkAddressList;\n\n\t/**\n\t * Zookeeper的命名空间\n\t */\n\tprivate String namespace;\n\n\t/**\n\t * 等待重试的间隔时间的初始值\n\t * 单位：毫秒\n\t */\n\tprivate int baseSleepTimeMilliseconds = 1000;\n\n\t/**\n\t * 等待重试的间隔时间的最大值\n\t * 单位：毫秒\n\t */\n\tprivate int maxSleepTimeMilliseconds = 3000;\n\n\t/**\n\t * 最大重试次数\n\t */\n\tprivate int maxRetries = 3;\n\n\t/**\n\t * 连接超时时间\n\t * 单位：毫秒\n\t */\n\tprivate int connectionTimeoutMilliseconds = 15000;\n\n\t/**\n\t * 会话超时时间\n\t * 单位：毫秒\n\t */\n\tprivate int sessionTimeoutMilliseconds = 60000;\n\n\t/**\n\t * 连接Zookeeper的权限令牌\n\t * 缺省为不需要权限验\n\t */\n\tprivate String digest;\n}\n"
  },
  {
    "path": "paascloud-common/paascloud-common-core/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\"\n         xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n         xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n    <parent>\n        <groupId>com.liuzm.paascloud.common</groupId>\n        <artifactId>paascloud-common</artifactId>\n        <version>1.0</version>\n    </parent>\n    <modelVersion>4.0.0</modelVersion>\n    <artifactId>paascloud-common-core</artifactId>\n    <version>1.0</version>\n    <dependencies>\n        <dependency>\n            <groupId>org.springframework.cloud</groupId>\n            <artifactId>spring-cloud-starter-oauth2</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>com.liuzm.paascloud.common</groupId>\n            <artifactId>paascloud-common-base</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>com.liuzm.paascloud.common</groupId>\n            <artifactId>paascloud-common-util</artifactId>\n        </dependency>\n\n        <dependency>\n            <groupId>tk.mybatis</groupId>\n            <artifactId>mapper</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>com.google.guava</groupId>\n            <artifactId>guava</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.aspectj</groupId>\n            <artifactId>aspectjweaver</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>eu.bitwalker</groupId>\n            <artifactId>UserAgentUtils</artifactId>\n            <version>1.20</version>\n        </dependency>\n        <dependency>\n            <groupId>org.mybatis</groupId>\n            <artifactId>mybatis</artifactId>\n            <version>3.4.2</version>\n        </dependency>\n        <dependency>\n            <groupId>org.apache.rocketmq</groupId>\n            <artifactId>rocketmq-client</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.springframework.boot</groupId>\n            <artifactId>spring-boot-starter-data-redis</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.springframework.boot</groupId>\n            <artifactId>spring-boot-configuration-processor</artifactId>\n            <optional>true</optional>\n        </dependency>\n        <!-- https://github.com/FasterXML/jackson-modules-java8 -->\n        <dependency>\n            <groupId>com.fasterxml.jackson.module</groupId>\n            <artifactId>jackson-module-parameter-names</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>com.fasterxml.jackson.datatype</groupId>\n            <artifactId>jackson-datatype-jdk8</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>com.fasterxml.jackson.datatype</groupId>\n            <artifactId>jackson-datatype-jsr310</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>com.liuzm.paascloud.common</groupId>\n            <artifactId>paascloud-common-config</artifactId>\n            <version>1.0</version>\n        </dependency>\n        <dependency>\n            <groupId>io.jsonwebtoken</groupId>\n            <artifactId>jjwt</artifactId>\n        </dependency>\n      <dependency>\n        <groupId>com.arronlong.httpclientutil</groupId>\n        <artifactId>httpclientutil</artifactId>\n      </dependency>\n      <dependency>\n        <groupId>com.liuzm.paascloud.common</groupId>\n        <artifactId>paascloud-common-zk</artifactId>\n      </dependency>\n\n      <dependency>\n        <groupId>com.netflix.hystrix</groupId>\n        <artifactId>hystrix-core</artifactId>\n        <version>1.5.10</version>\n      </dependency>\n    </dependencies>\n\n</project>"
  },
  {
    "path": "paascloud-common/paascloud-common-core/src/main/java/com/paascloud/core/annotation/LogAnnotation.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：LogAnnotation.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.core.annotation;\n\nimport com.paascloud.core.enums.LogTypeEnum;\n\nimport java.lang.annotation.*;\n\n\n/**\n * 操作日志.\n *\n * @author paascloud.net@gmail.com\n */\n@Target({ElementType.PARAMETER, ElementType.METHOD})\n@Retention(RetentionPolicy.RUNTIME)\n@Documented\npublic @interface LogAnnotation {\n\t/**\n\t * 日志类型\n\t *\n\t * @return the log type enum\n\t */\n\tLogTypeEnum logType() default LogTypeEnum.OPERATION_LOG;\n\n\t/**\n\t * 是否保存请求的参数\n\t *\n\t * @return the boolean\n\t */\n\tboolean isSaveRequestData() default false;\n\n\t/**\n\t * 是否保存响应的结果\n\t *\n\t * @return the boolean\n\t */\n\tboolean isSaveResponseData() default false;\n}\n"
  },
  {
    "path": "paascloud-common/paascloud-common-core/src/main/java/com/paascloud/core/annotation/NotDisplaySql.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：NotDisplaySql.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.core.annotation;\n\nimport java.lang.annotation.*;\n\n/**\n * 配合 SqlLogInterceptor 对指定方法 禁止打印SQL到控制台\n *\n * @author paascloud.net @gmail.com\n */\n@Target({ElementType.METHOD})\n@Retention(RetentionPolicy.RUNTIME)\n@Inherited\n@Documented\npublic @interface NotDisplaySql {\n}\n"
  },
  {
    "path": "paascloud-common/paascloud-common-core/src/main/java/com/paascloud/core/annotation/OperationLogDto.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：OperationLogDto.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.core.annotation;\n\nimport lombok.Data;\n\nimport java.io.Serializable;\nimport java.util.Date;\n\n\n/**\n * The class Operation log dto.\n *\n * @author paascloud.net@gmail.com\n */\n@Data\npublic class OperationLogDto implements Serializable {\n\tprivate static final long serialVersionUID = -5606865665592482762L;\n\tprivate Long id;\n\n\t/**\n\t * 组织流水号\n\t */\n\tprivate Long groupId;\n\n\t/**\n\t * 组织名称\n\t */\n\tprivate String groupName;\n\n\t/**\n\t * 日志类型\n\t */\n\tprivate String logType;\n\n\t/**\n\t * 日志类型名称\n\t */\n\tprivate String logName;\n\n\t/**\n\t * 权限ID\n\t */\n\tprivate Long actionId;\n\n\t/**\n\t * 权限编码\n\t */\n\tprivate String actionCode;\n\n\t/**\n\t * 权限名称\n\t */\n\tprivate String actionName;\n\n\t/**\n\t * 操作系统\n\t */\n\tprivate String os;\n\n\t/**\n\t * 浏览器类型\n\t */\n\tprivate String browser;\n\n\t/**\n\t * IP地址\n\t */\n\tprivate String ip;\n\n\t/**\n\t * 操作位置\n\t */\n\tprivate String location;\n\n\t/**\n\t * 物理地址\n\t */\n\tprivate String mac;\n\n\t/**\n\t * 详细描述\n\t */\n\tprivate String description;\n\n\t/**\n\t * 请求参数\n\t */\n\tprivate String requestData;\n\n\t/**\n\t * 请求地址\n\t */\n\tprivate String requestUrl;\n\n\t/**\n\t * 响应结果\n\t */\n\tprivate String responseData;\n\n\t/**\n\t * 类名\n\t */\n\tprivate String className;\n\n\t/**\n\t * 方法名\n\t */\n\tprivate String methodName;\n\n\t/**\n\t * 开始时间\n\t */\n\tprivate Date startTime;\n\n\t/**\n\t * 结束时间\n\t */\n\tprivate Date endTime;\n\n\t/**\n\t * 耗时,秒\n\t */\n\tprivate Long excuteTime;\n\n\t/**\n\t * 创建人\n\t */\n\tprivate String creator;\n\n\t/**\n\t * 创建人ID\n\t */\n\tprivate Long creatorId;\n\n\t/**\n\t * 创建时间\n\t */\n\tprivate Date createdTime;\n\n\t/**\n\t * 最近操作人\n\t */\n\tprivate String lastOperator;\n\n\t/**\n\t * 最后操作人ID\n\t */\n\tprivate Long lastOperatorId;\n\n\t/**\n\t * 更新时间\n\t */\n\tprivate Date updateTime;\n\n}"
  },
  {
    "path": "paascloud-common/paascloud-common-core/src/main/java/com/paascloud/core/annotation/ValidateAnnotation.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：ValidateAnnotation.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.core.annotation;\n\nimport java.lang.annotation.*;\n\n/**\n * The interface Validate annotation.\n *\n * @author paascloud.net@gmail.com\n */\n@Target({ElementType.PARAMETER, ElementType.METHOD})\n@Retention(RetentionPolicy.RUNTIME)\n@Documented\npublic @interface ValidateAnnotation {\n\t/**\n\t * Is validate boolean.\n\t *\n\t * @return the boolean\n\t */\n\tboolean isValidate() default true;\n}"
  },
  {
    "path": "paascloud-common/paascloud-common-core/src/main/java/com/paascloud/core/aspect/BindingResultAop.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：BindingResultAop.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.core.aspect;\n\nimport com.paascloud.core.annotation.ValidateAnnotation;\nimport lombok.extern.slf4j.Slf4j;\nimport org.aspectj.lang.JoinPoint;\nimport org.aspectj.lang.annotation.AfterReturning;\nimport org.aspectj.lang.annotation.Aspect;\nimport org.aspectj.lang.annotation.Before;\nimport org.aspectj.lang.annotation.Pointcut;\nimport org.springframework.stereotype.Component;\nimport org.springframework.validation.BindingResult;\n\nimport java.lang.annotation.Annotation;\nimport java.lang.reflect.Method;\n\n/**\n * The class Binding result aop.\n *\n * @author paascloud.net@gmail.com\n */\n@Component\n@Aspect\n@Slf4j\npublic class BindingResultAop {\n\t/**\n\t * Validate annotation.\n\t */\n\t@Pointcut(\"@annotation(com.paascloud.core.annotation.ValidateAnnotation)\")\n\tpublic void validateAnnotation() {\n\t}\n\n\t/**\n\t * Do before.\n\t */\n\t@Before(\"validateAnnotation()\")\n\tpublic void doBefore() {\n\t}\n\n\t/**\n\t * Do after.\n\t *\n\t * @param joinPoint the join point\n\t */\n\t@AfterReturning(pointcut = \"validateAnnotation()\")\n\tpublic void doAfter(final JoinPoint joinPoint) {\n\t\tString methodName = joinPoint.getSignature().getName();\n\t\tObject target = joinPoint.getTarget();\n\t\t//得到拦截的方法\n\t\tMethod method = getMethodByClassAndName(target.getClass(), methodName);\n\t\tObject[] objects = joinPoint.getArgs();\n\t\t//方法的参数\n\t\tassert method != null;\n\t\tValidateAnnotation annotation = (ValidateAnnotation) getAnnotationByMethod(method, ValidateAnnotation.class);\n\t\tif (annotation != null) {\n\t\t\tBindingResult bindingResult = null;\n\t\t\tfor (Object arg : objects) {\n\t\t\t\tif (arg instanceof BindingResult) {\n\t\t\t\t\tbindingResult = (BindingResult) arg;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (bindingResult != null && bindingResult.hasErrors()) {\n\t\t\t\tString errorInfo = bindingResult.getFieldError().getDefaultMessage();\n\t\t\t\tthrow new IllegalArgumentException(errorInfo);\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * 根据目标方法和注解类型  得到该目标方法的指定注解\n\t */\n\tprivate Annotation getAnnotationByMethod(Method method, Class annoClass) {\n\t\tAnnotation[] all = method.getAnnotations();\n\t\tfor (Annotation annotation : all) {\n\t\t\tif (annotation.annotationType() == annoClass) {\n\t\t\t\treturn annotation;\n\t\t\t}\n\t\t}\n\t\treturn null;\n\t}\n\n\t/**\n\t * 根据类和方法名得到方法\n\t */\n\tprivate Method getMethodByClassAndName(Class c, String methodName) {\n\t\tMethod[] methods = c.getDeclaredMethods();\n\t\tfor (Method method : methods) {\n\t\t\tif (method.getName().equals(methodName)) {\n\t\t\t\treturn method;\n\t\t\t}\n\t\t}\n\t\treturn null;\n\t}\n}\n"
  },
  {
    "path": "paascloud-common/paascloud-common-core/src/main/java/com/paascloud/core/aspect/LogAspect.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：LogAspect.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.core.aspect;\n\n\nimport com.paascloud.JacksonUtil;\nimport com.paascloud.PubUtils;\nimport com.paascloud.base.dto.LoginAuthDto;\nimport com.paascloud.core.annotation.LogAnnotation;\nimport com.paascloud.core.annotation.OperationLogDto;\nimport com.paascloud.core.utils.RequestUtil;\nimport com.paascloud.wrapper.Wrapper;\nimport eu.bitwalker.useragentutils.UserAgent;\nimport lombok.extern.slf4j.Slf4j;\nimport org.aspectj.lang.JoinPoint;\nimport org.aspectj.lang.annotation.AfterReturning;\nimport org.aspectj.lang.annotation.Aspect;\nimport org.aspectj.lang.annotation.Before;\nimport org.aspectj.lang.annotation.Pointcut;\nimport org.springframework.core.task.TaskExecutor;\nimport org.springframework.stereotype.Component;\nimport org.springframework.web.client.RestTemplate;\n\nimport javax.annotation.Resource;\nimport javax.servlet.http.HttpServletRequest;\nimport java.lang.reflect.Method;\nimport java.util.Date;\n\n/**\n * The class Log aspect.\n *\n * @author paascloud.net@gmail.com\n */\n@Slf4j\n@Aspect\n@Component\npublic class LogAspect {\n\n\tprivate ThreadLocal<Date> threadLocal = new ThreadLocal<>();\n\n\t@Resource\n\tprivate RestTemplate restTemplate;\n\n\t@Resource\n\tprivate TaskExecutor taskExecutor;\n\n\tprivate static final int MAX_SIZE = 2000;\n\n\t/**\n\t * Log annotation.\n\t */\n\t@Pointcut(\"@annotation(com.paascloud.core.annotation.LogAnnotation)\")\n\tpublic void logAnnotation() {\n\t}\n\n\t/**\n\t * Do before.\n\t */\n\t@Before(\"logAnnotation()\")\n\tpublic void doBefore() {\n\t\tthis.threadLocal.set(new Date(System.currentTimeMillis()));\n\t}\n\n\t/**\n\t * Do after.\n\t *\n\t * @param joinPoint   the join point\n\t * @param returnValue the return value\n\t */\n\t@AfterReturning(pointcut = \"logAnnotation()\", returning = \"returnValue\")\n\tpublic void doAfter(final JoinPoint joinPoint, final Object returnValue) {\n\t\tif (returnValue instanceof Wrapper) {\n\t\t\tWrapper result = (Wrapper) returnValue;\n\n\t\t\tif (!PubUtils.isNull(result) && result.getCode() == Wrapper.SUCCESS_CODE) {\n\t\t\t\tthis.handleLog(joinPoint, result);\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tprivate void handleLog(final JoinPoint joinPoint, final Object result) {\n\t\tfinal Date startTime = this.threadLocal.get();\n\t\tfinal Date endTime = new Date(System.currentTimeMillis());\n\t\tHttpServletRequest request = RequestUtil.getRequest();\n\t\tfinal UserAgent userAgent = UserAgent.parseUserAgentString(request.getHeader(\"User-Agent\"));\n\t\tString requestURI = request.getRequestURI();\n\n\t\ttry {\n\t\t\tLogAnnotation relog = giveController(joinPoint);\n\t\t\tLoginAuthDto loginUser = RequestUtil.getLoginUser();\n\t\t\tif (relog == null) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t//获取客户端操作系统\n\t\t\tfinal String os = userAgent.getOperatingSystem().getName();\n\t\t\t//获取客户端浏览器\n\t\t\tfinal String browser = userAgent.getBrowser().getName();\n\t\t\tfinal String ipAddress = RequestUtil.getRemoteAddr(request);\n\n\t\t\tOperationLogDto operationLogDto = new OperationLogDto();\n\t\t\toperationLogDto.setClassName(joinPoint.getTarget().getClass().getName());\n\t\t\toperationLogDto.setMethodName(joinPoint.getSignature().getName());\n\t\t\toperationLogDto.setExcuteTime(endTime.getTime() - startTime.getTime());\n\t\t\toperationLogDto.setStartTime(startTime);\n\t\t\toperationLogDto.setEndTime(endTime);\n\t\t\toperationLogDto.setIp(ipAddress);\n\t\t\toperationLogDto.setOs(os);\n\t\t\toperationLogDto.setBrowser(browser);\n\t\t\toperationLogDto.setRequestUrl(requestURI);\n\n\t\t\toperationLogDto.setGroupId(loginUser.getGroupId());\n\t\t\toperationLogDto.setGroupName(loginUser.getGroupName());\n\t\t\toperationLogDto.setCreatedTime(new Date());\n\t\t\toperationLogDto.setCreator(loginUser.getUserName());\n\t\t\toperationLogDto.setCreatorId(loginUser.getUserId());\n\t\t\toperationLogDto.setLastOperator(loginUser.getUserName());\n\t\t\toperationLogDto.setLastOperatorId(loginUser.getUserId());\n\n\t\t\toperationLogDto.setLogType(relog.logType().getType());\n\t\t\toperationLogDto.setLogName(relog.logType().getName());\n\n\t\t\tgetControllerMethodDescription(relog, operationLogDto, result, joinPoint);\n\t\t\tthreadLocal.remove();\n\t\t\ttaskExecutor.execute(() -> this.restTemplate.postForObject(\"http://paascloud-provider-uac/auth/saveLog\", operationLogDto, Integer.class));\n\t\t} catch (Exception ex) {\n\t\t\tlog.error(\"获取注解类出现异常={}\", ex.getMessage(), ex);\n\t\t}\n\t}\n\n\n\tprivate void getControllerMethodDescription(LogAnnotation relog, OperationLogDto operationLog, Object result, JoinPoint joinPoint) {\n\n\n\t\tif (relog.isSaveRequestData()) {\n\t\t\tsetRequestData(operationLog, joinPoint);\n\t\t}\n\t\tif (relog.isSaveResponseData()) {\n\t\t\tsetResponseData(operationLog, result);\n\t\t}\n\t}\n\n\tprivate void setResponseData(OperationLogDto requestLog, Object result) {\n\t\ttry {\n\t\t\trequestLog.setResponseData(String.valueOf(result));\n\t\t} catch (Exception e) {\n\t\t\tlog.error(\"获取响应数据,出现错误={}\", e.getMessage(), e);\n\t\t}\n\t}\n\n\tprivate void setRequestData(OperationLogDto uacLog, JoinPoint joinPoint) {\n\n\t\ttry {\n\t\t\tObject[] args = joinPoint.getArgs();\n\t\t\tif (args.length == 0) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tObject[] parameter = new Object[args.length];\n\t\t\tint index = 0;\n\t\t\tfor (Object object : parameter) {\n\t\t\t\tif (object instanceof HttpServletRequest) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tparameter[index] = object;\n\t\t\t\tindex++;\n\t\t\t}\n\n\t\t\tString requestData = JacksonUtil.toJsonWithFormat(parameter);\n\n\t\t\tif (requestData.length() > MAX_SIZE) {\n\t\t\t\trequestData = requestData.substring(MAX_SIZE);\n\t\t\t}\n\n\t\t\tuacLog.setRequestData(requestData);\n\t\t} catch (Exception e) {\n\t\t\tlog.error(\"获取响应数据,出现错误={}\", e.getMessage(), e);\n\t\t}\n\t}\n\n\t/**\n\t * 是否存在注解, 如果存在就记录日志\n\t */\n\tprivate static LogAnnotation giveController(JoinPoint joinPoint) {\n\t\tMethod[] methods = joinPoint.getTarget().getClass().getDeclaredMethods();\n\t\tString methodName = joinPoint.getSignature().getName();\n\t\tif (null != methods && 0 < methods.length) {\n\t\t\tfor (Method met : methods) {\n\t\t\t\tLogAnnotation relog = met.getAnnotation(LogAnnotation.class);\n\t\t\t\tif (null != relog && methodName.equals(met.getName())) {\n\t\t\t\t\treturn relog;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn null;\n\t}\n\n}\n"
  },
  {
    "path": "paascloud-common/paascloud-common-core/src/main/java/com/paascloud/core/aspect/NotDisplaySqlAspect.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：NotDisplaySqlAspect.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.core.aspect;\n\nimport com.paascloud.ThreadLocalMap;\nimport org.aspectj.lang.annotation.After;\nimport org.aspectj.lang.annotation.Aspect;\nimport org.aspectj.lang.annotation.Before;\nimport org.aspectj.lang.annotation.Pointcut;\nimport org.springframework.stereotype.Component;\n\n/**\n * The class Not display sql aspect.\n *\n * @author paascloud.net @gmail.com\n */\n@Aspect\n@Component\npublic class NotDisplaySqlAspect {\n\t/**\n\t * The constant DISPLAY_SQL.\n\t */\n\tpublic static final String DISPLAY_SQL = \"DISPLAY_SQL\";\n\n\t@Pointcut(\"@annotation(com.paascloud.core.annotation.NotDisplaySql)\")\n\tprivate void myPointCut() {\n\t}\n\n\t/**\n\t * Before.\n\t */\n\t@Before(value = \"myPointCut()\")\n\tpublic void before() {\n\t\tThreadLocalMap.put(DISPLAY_SQL, Boolean.FALSE);\n\t}\n\n\t/**\n\t * After.\n\t */\n\t@After(value = \"myPointCut()\")\n\tpublic void after() {\n\t\tThreadLocalMap.remove(DISPLAY_SQL);\n\t}\n}\n"
  },
  {
    "path": "paascloud-common/paascloud-common-core/src/main/java/com/paascloud/core/config/AsyncTaskExecutorConfiguration.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：AsyncTaskExecutorConfiguration.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.core.config;\n\nimport com.paascloud.config.properties.PaascloudProperties;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\nimport org.springframework.aop.interceptor.AsyncUncaughtExceptionHandler;\nimport org.springframework.aop.interceptor.SimpleAsyncUncaughtExceptionHandler;\nimport org.springframework.context.annotation.Bean;\nimport org.springframework.context.annotation.Configuration;\nimport org.springframework.scheduling.annotation.AsyncConfigurer;\nimport org.springframework.scheduling.annotation.EnableAsync;\nimport org.springframework.scheduling.annotation.EnableScheduling;\nimport org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;\n\nimport javax.annotation.Resource;\nimport java.util.concurrent.Executor;\n\n/**\n * The class Async config.\n *\n * @author paascloud.net @gmail.com\n */\n@Configuration\n@EnableAsync\n@EnableScheduling\npublic class AsyncTaskExecutorConfiguration implements AsyncConfigurer {\n\tprivate final Logger log = LoggerFactory.getLogger(getClass());\n\t@Resource\n\tprivate PaascloudProperties paascloudProperties;\n\n\t@Override\n\t@Bean(name = \"taskExecutor\")\n\tpublic Executor getAsyncExecutor() {\n\t\tlog.debug(\"Creating Async Task Executor\");\n\t\tThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();\n\t\texecutor.setCorePoolSize(paascloudProperties.getTask().getCorePoolSize());\n\t\texecutor.setMaxPoolSize(paascloudProperties.getTask().getMaxPoolSize());\n\t\texecutor.setQueueCapacity(paascloudProperties.getTask().getQueueCapacity());\n\t\texecutor.setKeepAliveSeconds(paascloudProperties.getTask().getKeepAliveSeconds());\n\t\texecutor.setThreadNamePrefix(paascloudProperties.getTask().getThreadNamePrefix());\n\t\treturn new ExceptionHandlingAsyncTaskExecutor(executor);\n\t}\n\n\t@Override\n\tpublic AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() {\n\t\treturn new SimpleAsyncUncaughtExceptionHandler();\n\t}\n}\n"
  },
  {
    "path": "paascloud-common/paascloud-common-core/src/main/java/com/paascloud/core/config/CoreConfiguration.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：CoreConfiguration.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.core.config;\n\nimport com.paascloud.core.interceptor.SqlLogInterceptor;\nimport com.paascloud.core.interceptor.TokenInterceptor;\nimport org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;\nimport org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;\nimport org.springframework.cloud.client.loadbalancer.LoadBalanced;\nimport org.springframework.context.annotation.Bean;\nimport org.springframework.context.annotation.Configuration;\nimport org.springframework.web.client.RestTemplate;\nimport org.springframework.web.servlet.HandlerInterceptor;\n\n/**\n * 加载LWR规则.\n *\n * @author paascloud.net@gmail.com\n */\n@Configuration\npublic class CoreConfiguration {\n\t@LoadBalanced\n\t@Bean\n\tpublic RestTemplate restTemplate() {\n\t\treturn new RestTemplate();\n\t}\n\n\t@Bean\n\tpublic SqlLogInterceptor sqlLogInterceptor() {\n\t\treturn new SqlLogInterceptor();\n\t}\n\n\n\t@Bean\n\t@ConditionalOnMissingBean(HandlerInterceptor.class)\n\t@ConditionalOnProperty(prefix = \"paascloud.token.interceptor\", name = \"enable\", havingValue = \"true\")\n\tpublic TokenInterceptor tokenInterceptor() {\n\t\treturn new TokenInterceptor();\n\t}\n}\n"
  },
  {
    "path": "paascloud-common/paascloud-common-core/src/main/java/com/paascloud/core/config/ExceptionHandlingAsyncTaskExecutor.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：ExceptionHandlingAsyncTaskExecutor.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.core.config;\n\nimport lombok.extern.slf4j.Slf4j;\nimport org.springframework.beans.factory.DisposableBean;\nimport org.springframework.beans.factory.InitializingBean;\nimport org.springframework.core.task.AsyncTaskExecutor;\n\nimport java.util.concurrent.Callable;\nimport java.util.concurrent.Future;\n\n/**\n * The class Exception handling async task executor.\n *\n * @author paascloud.net @gmail.com\n */\n@Slf4j\npublic class ExceptionHandlingAsyncTaskExecutor implements AsyncTaskExecutor, InitializingBean, DisposableBean {\n\n\tprivate final AsyncTaskExecutor executor;\n\n\t/**\n\t * Instantiates a new Exception handling async task executor.\n\t *\n\t * @param executor the executor\n\t */\n\tExceptionHandlingAsyncTaskExecutor(AsyncTaskExecutor executor) {\n\t\tthis.executor = executor;\n\t}\n\n\t/**\n\t * Execute.\n\t *\n\t * @param task the task\n\t */\n\t@Override\n\tpublic void execute(Runnable task) {\n\t\texecutor.execute(createWrappedRunnable(task));\n\t}\n\n\t/**\n\t * Execute.\n\t *\n\t * @param task         the task\n\t * @param startTimeout the start timeout\n\t */\n\t@Override\n\tpublic void execute(Runnable task, long startTimeout) {\n\t\texecutor.execute(createWrappedRunnable(task), startTimeout);\n\t}\n\n\tprivate <T> Callable<T> createCallable(final Callable<T> task) {\n\t\treturn () -> {\n\t\t\ttry {\n\t\t\t\treturn task.call();\n\t\t\t} catch (Exception e) {\n\t\t\t\thandle(e);\n\t\t\t\tthrow e;\n\t\t\t}\n\t\t};\n\t}\n\n\tprivate Runnable createWrappedRunnable(final Runnable task) {\n\t\treturn () -> {\n\t\t\ttry {\n\t\t\t\ttask.run();\n\t\t\t} catch (Exception e) {\n\t\t\t\thandle(e);\n\t\t\t}\n\t\t};\n\t}\n\n\t/**\n\t * Handle.\n\t *\n\t * @param e the e\n\t */\n\tprivate void handle(Exception e) {\n\t\tlog.error(\"Caught async exception\", e);\n\t}\n\n\t/**\n\t * Submit future.\n\t *\n\t * @param task the task\n\t *\n\t * @return the future\n\t */\n\t@Override\n\tpublic Future<?> submit(Runnable task) {\n\t\treturn executor.submit(createWrappedRunnable(task));\n\t}\n\n\t/**\n\t * Submit future.\n\t *\n\t * @param <T>  the type parameter\n\t * @param task the task\n\t *\n\t * @return the future\n\t */\n\t@Override\n\tpublic <T> Future<T> submit(Callable<T> task) {\n\t\treturn executor.submit(createCallable(task));\n\t}\n\n\t/**\n\t * Destroy.\n\t *\n\t * @throws Exception the exception\n\t */\n\t@Override\n\tpublic void destroy() throws Exception {\n\t\tif (executor instanceof DisposableBean) {\n\t\t\tDisposableBean bean = (DisposableBean) executor;\n\t\t\tbean.destroy();\n\t\t}\n\t}\n\n\t/**\n\t * After properties set.\n\t *\n\t * @throws Exception the exception\n\t */\n\t@Override\n\tpublic void afterPropertiesSet() throws Exception {\n\t\tif (executor instanceof InitializingBean) {\n\t\t\tInitializingBean bean = (InitializingBean) executor;\n\t\t\tbean.afterPropertiesSet();\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "paascloud-common/paascloud-common-core/src/main/java/com/paascloud/core/config/PcObjectMapper.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：PcObjectMapper.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.core.config;\n\nimport com.fasterxml.jackson.databind.DeserializationFeature;\nimport com.fasterxml.jackson.databind.ObjectMapper;\nimport com.fasterxml.jackson.databind.module.SimpleModule;\nimport com.fasterxml.jackson.databind.ser.std.ToStringSerializer;\nimport com.fasterxml.jackson.datatype.jdk8.Jdk8Module;\nimport com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;\nimport com.fasterxml.jackson.module.paramnames.ParameterNamesModule;\nimport org.springframework.http.converter.HttpMessageConverter;\nimport org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;\n\nimport java.util.List;\n\n\n/**\n * The class Pc object mapper.\n *\n * @author paascloud.net @gmail.com\n */\npublic class PcObjectMapper {\n\tprivate PcObjectMapper() {\n\t}\n\n\tpublic static void buidMvcMessageConverter(List<HttpMessageConverter<?>> converters) {\n\t\tMappingJackson2HttpMessageConverter jackson2HttpMessageConverter = new MappingJackson2HttpMessageConverter();\n\t\tSimpleModule simpleModule = new SimpleModule();\n\t\tsimpleModule.addSerializer(Long.class, ToStringSerializer.instance);\n\t\tsimpleModule.addSerializer(Long.TYPE, ToStringSerializer.instance);\n\t\tObjectMapper objectMapper = new ObjectMapper()\n\t\t\t\t.registerModule(new ParameterNamesModule())\n\t\t\t\t.registerModule(new Jdk8Module())\n\t\t\t\t.registerModule(new JavaTimeModule())\n\t\t\t\t.registerModule(simpleModule);\n\t\tobjectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);\n\t\tjackson2HttpMessageConverter.setObjectMapper(objectMapper);\n\t\tconverters.add(jackson2HttpMessageConverter);\n\t}\n\n}\n"
  },
  {
    "path": "paascloud-common/paascloud-common-core/src/main/java/com/paascloud/core/config/RedisConfiguration.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：RedisConfiguration.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.core.config;\n\nimport com.fasterxml.jackson.annotation.JsonAutoDetect;\nimport com.fasterxml.jackson.annotation.PropertyAccessor;\nimport com.fasterxml.jackson.databind.ObjectMapper;\nimport org.springframework.cache.CacheManager;\nimport org.springframework.cache.annotation.EnableCaching;\nimport org.springframework.cache.interceptor.KeyGenerator;\nimport org.springframework.context.annotation.Bean;\nimport org.springframework.context.annotation.Configuration;\nimport org.springframework.data.redis.cache.RedisCacheManager;\nimport org.springframework.data.redis.connection.RedisConnectionFactory;\nimport org.springframework.data.redis.core.RedisTemplate;\nimport org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;\nimport org.springframework.data.redis.serializer.StringRedisSerializer;\n\n/**\n * The class Redis configuration.\n *\n * @author paascloud.net@gmail.com\n */\n@Configuration\n@EnableCaching\npublic class RedisConfiguration {\n\t/**\n\t * generator key generator.\n\t *\n\t * @return the key generator\n\t */\n\t@Bean\n\tpublic KeyGenerator keyGenerator() {\n\t\treturn (target, method, params) -> {\n\t\t\tStringBuilder sb = new StringBuilder();\n\t\t\tsb.append(target.getClass().getName());\n\t\t\tsb.append(method.getName());\n\t\t\tfor (Object obj : params) {\n\t\t\t\tsb.append(obj.toString());\n\t\t\t}\n\t\t\treturn sb.toString();\n\t\t};\n\n\t}\n\n\t/**\n\t * Cache manager cache manager.\n\t *\n\t * @param redisTemplate the redis template\n\t *\n\t * @return the cache manager\n\t */\n\t@Bean\n\tpublic CacheManager cacheManager(RedisTemplate redisTemplate) {\n\t\treturn new RedisCacheManager(redisTemplate);\n\t}\n\n\t@Bean\n\tpublic StringRedisSerializer stringRedisSerializer() {\n\t\treturn new StringRedisSerializer();\n\t}\n\n\t@Bean(\"redisTemplate\")\n\tpublic RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {\n\t\tRedisTemplate<String, Object> template = new RedisTemplate<>();\n\t\ttemplate.setConnectionFactory(factory);\n\t\tJackson2JsonRedisSerializer<Object> jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer<>(Object.class);\n\t\tObjectMapper om = new ObjectMapper();\n\t\tom.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);\n\t\tom.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);\n\t\tjackson2JsonRedisSerializer.setObjectMapper(om);\n\t\ttemplate.setValueSerializer(jackson2JsonRedisSerializer);\n\t\ttemplate.setKeySerializer(stringRedisSerializer());\n\t\ttemplate.afterPropertiesSet();\n\t\treturn template;\n\t}\n}\n"
  },
  {
    "path": "paascloud-common/paascloud-common-core/src/main/java/com/paascloud/core/config/SwaggerConfiguration.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：SwaggerConfiguration.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.core.config;\n\nimport com.paascloud.config.properties.PaascloudProperties;\nimport com.paascloud.config.properties.SwaggerProperties;\nimport io.swagger.annotations.ApiOperation;\nimport org.springframework.context.annotation.Bean;\nimport springfox.documentation.builders.ApiInfoBuilder;\nimport springfox.documentation.builders.PathSelectors;\nimport springfox.documentation.builders.RequestHandlerSelectors;\nimport springfox.documentation.service.ApiInfo;\nimport springfox.documentation.service.ApiKey;\nimport springfox.documentation.service.AuthorizationScope;\nimport springfox.documentation.service.Contact;\nimport springfox.documentation.service.SecurityReference;\nimport springfox.documentation.spi.DocumentationType;\nimport springfox.documentation.spi.service.contexts.SecurityContext;\nimport springfox.documentation.spring.web.plugins.Docket;\nimport springfox.documentation.swagger2.annotations.EnableSwagger2;\n\nimport javax.annotation.Resource;\nimport java.util.ArrayList;\nimport java.util.Collections;\nimport java.util.List;\n\n/**\n * The class Swagger configuration.\n *\n * @author paascloud.net@gmail.com\n */\n@EnableSwagger2\npublic class SwaggerConfiguration {\n\t@Resource\n\tprivate PaascloudProperties paascloudProperties;\n\n\t/**\n\t * Reservation api docket.\n\t *\n\t * @return the docket\n\t */\n\t@Bean\n\tpublic Docket createRestApi() {\n\t\t//每次都需手动输入header信息\n/*\t\tParameterBuilder pb = new ParameterBuilder();\n\t\tList<Parameter> pars = new ArrayList();\n\t\tpb.name(\"Authorization\").description(\"user access_token\")\n\t\t\t\t.modelRef(new ModelRef(\"string\")).parameterType(\"header\")\n\t\t\t\t.required(true).build(); //header中的ticket参数非必填，传空也可以\n\t\tpars.add(pb.build());    //根据每个方法名也知道当前方法在设置什么参数*/\n\t\treturn new Docket(DocumentationType.SWAGGER_2)\n\t\t\t\t.apiInfo(apiInfo())\n\t\t\t\t.select()\n\t\t\t\t.apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class))\n\t\t\t\t.paths(PathSelectors.any())\n\n\t\t\t\t.build()\n\t\t\t\t//配置鉴权信息\n\t\t\t\t.securitySchemes(securitySchemes())\n\t\t\t\t.securityContexts(securityContexts())\n//\t\t\t\t.globalOperationParameters(pars)\n\t\t\t\t.enable(true);\n\t}\n\n\tprivate ApiInfo apiInfo() {\n\t\tSwaggerProperties swagger = paascloudProperties.getSwagger();\n\t\treturn new ApiInfoBuilder()\n\t\t\t\t.title(swagger.getTitle())\n\t\t\t\t.description(swagger.getDescription())\n\t\t\t\t.version(swagger.getVersion())\n\t\t\t\t.license(swagger.getLicense())\n\t\t\t\t.licenseUrl(swagger.getLicenseUrl())\n\t\t\t\t.contact(new Contact(swagger.getContactName(), swagger.getContactUrl(), swagger.getContactEmail()))\n\t\t\t\t.build();\n\t}\n\n\tprivate List<ApiKey> securitySchemes() {\n\t\treturn new ArrayList(Collections.singleton(new ApiKey(\"Authorization\", \"Authorization\", \"header\")));\n\t}\n\n\tprivate List<SecurityContext> securityContexts() {\n\t\treturn new ArrayList(\n\t\t\t\tCollections.singleton(SecurityContext.builder()\n\t\t\t\t\t\t.securityReferences(defaultAuth())\n\t\t\t\t\t\t.forPaths(PathSelectors.regex(\"^(?!auth).*$\"))\n\t\t\t\t\t\t.build())\n\t\t);\n\t}\n\n\tprivate List<SecurityReference> defaultAuth() {\n\t\tAuthorizationScope authorizationScope = new AuthorizationScope(\"global\", \"accessEverything\");\n\t\tAuthorizationScope[] authorizationScopes = new AuthorizationScope[1];\n\t\tauthorizationScopes[0] = authorizationScope;\n\t\treturn new ArrayList(Collections.singleton(new SecurityReference(\"Authorization\", authorizationScopes)));\n\t}\n\n}"
  },
  {
    "path": "paascloud-common/paascloud-common-core/src/main/java/com/paascloud/core/config/ZookeeperInitRunner.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：ZookeeperInitRunner.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.core.config;\n\nimport com.paascloud.config.properties.PaascloudProperties;\nimport com.paascloud.core.registry.RegistryCenterFactory;\nimport lombok.extern.slf4j.Slf4j;\nimport org.springframework.beans.factory.annotation.Value;\nimport org.springframework.boot.CommandLineRunner;\nimport org.springframework.core.annotation.Order;\nimport org.springframework.stereotype.Component;\n\nimport javax.annotation.Resource;\nimport java.net.InetAddress;\n\n/**\n * The class Redis init runner.\n *\n * @author paascloud.net @gmail.com\n */\n@Component\n@Order\n@Slf4j\npublic class ZookeeperInitRunner implements CommandLineRunner {\n\t@Resource\n\tprivate PaascloudProperties paascloudProperties;\n\t@Value(\"${spring.application.name}\")\n\tprivate String applicationName;\n\n\t/**\n\t * Run.\n\t *\n\t * @param args the args\n\t *\n\t * @throws Exception the exception\n\t */\n\t@Override\n\tpublic void run(String... args) throws Exception {\n\t\tString hostAddress = InetAddress.getLocalHost().getHostAddress();\n\t\tlog.info(\"###ZookeeperInitRunner，init. HostAddress={}, applicationName={}\", hostAddress, applicationName);\n\t\tRegistryCenterFactory.startup(paascloudProperties, hostAddress, applicationName);\n\t\tlog.info(\"###ZookeeperInitRunner，finish<<<<<<<<<<<<<\");\n\t}\n\n}"
  },
  {
    "path": "paascloud-common/paascloud-common-core/src/main/java/com/paascloud/core/enums/LogTypeEnum.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：LogTypeEnum.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.core.enums;\n\nimport com.google.common.collect.Lists;\nimport com.google.common.collect.Maps;\n\nimport java.util.List;\nimport java.util.Map;\n\n\n/**\n * The enum Log type enum.\n *\n * @author paascloud.net@gmail.com\n */\npublic enum LogTypeEnum {\n\t/**\n\t * 操作日志\n\t */\n\tOPERATION_LOG(\"10\", \"操作日志\"),\n\t/**\n\t * 登录日志\n\t */\n\tLOGIN_LOG(\"20\", \"登录日志\"),\n\t/**\n\t * 异常日志\n\t */\n\tEXCEPTION_LOG(\"30\", \"异常日志\");\n\n\t/**\n\t * The Type.\n\t */\n\tString type;\n\t/**\n\t * The Name.\n\t */\n\tString name;\n\n\tLogTypeEnum(String type, String name) {\n\t\tthis.type = type;\n\t\tthis.name = name;\n\t}\n\n\t/**\n\t * Gets type.\n\t *\n\t * @return the type\n\t */\n\tpublic String getType() {\n\t\treturn type;\n\t}\n\n\t/**\n\t * Gets name.\n\t *\n\t * @return the name\n\t */\n\tpublic String getName() {\n\t\treturn name;\n\t}\n\n\t/**\n\t * Gets name.\n\t *\n\t * @param type the type\n\t *\n\t * @return the name\n\t */\n\tpublic static String getName(String type) {\n\t\tfor (LogTypeEnum ele : LogTypeEnum.values()) {\n\t\t\tif (type.equals(ele.getType())) {\n\t\t\t\treturn ele.getName();\n\t\t\t}\n\t\t}\n\t\treturn null;\n\t}\n\n\t/**\n\t * Gets enum.\n\t *\n\t * @param type the type\n\t *\n\t * @return the enum\n\t */\n\tpublic static LogTypeEnum getEnum(String type) {\n\t\tfor (LogTypeEnum ele : LogTypeEnum.values()) {\n\t\t\tif (type.equals(ele.getType())) {\n\t\t\t\treturn ele;\n\t\t\t}\n\t\t}\n\t\treturn LogTypeEnum.OPERATION_LOG;\n\t}\n\n\t/**\n\t * Gets list.\n\t *\n\t * @return the list\n\t */\n\tpublic static List<Map<String, Object>> getList() {\n\t\tList<Map<String, Object>> list = Lists.newArrayList();\n\t\tfor (LogTypeEnum ele : LogTypeEnum.values()) {\n\t\t\tMap<String, Object> map = Maps.newHashMap();\n\t\t\tmap.put(\"key\", ele.getType());\n\t\t\tmap.put(\"value\", ele.getName());\n\t\t\tlist.add(map);\n\t\t}\n\t\treturn list;\n\t}\n\n}\n"
  },
  {
    "path": "paascloud-common/paascloud-common-core/src/main/java/com/paascloud/core/interceptor/CoreHeaderInterceptor.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：CoreHeaderInterceptor.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.core.interceptor;\n\nimport com.netflix.hystrix.strategy.concurrency.HystrixRequestContext;\nimport com.netflix.hystrix.strategy.concurrency.HystrixRequestVariableDefault;\nimport lombok.extern.slf4j.Slf4j;\nimport org.springframework.util.StringUtils;\nimport org.springframework.web.servlet.ModelAndView;\nimport org.springframework.web.servlet.handler.HandlerInterceptorAdapter;\n\nimport javax.servlet.http.HttpServletRequest;\nimport javax.servlet.http.HttpServletResponse;\nimport java.util.Arrays;\nimport java.util.Collections;\nimport java.util.List;\n\n/**\n * The class Core header interceptor.\n *\n * @author paascloud.net@gmail.com\n */\n@Slf4j\npublic class CoreHeaderInterceptor extends HandlerInterceptorAdapter {\n\t/**\n\t * The constant HEADER_LABEL.\n\t */\n\tpublic static final String HEADER_LABEL = \"x-label\";\n\t/**\n\t * The constant HEADER_LABEL_SPLIT.\n\t */\n\tpublic static final String HEADER_LABEL_SPLIT = \",\";\n\n\t/**\n\t * The constant LABEL.\n\t */\n\tpublic static final HystrixRequestVariableDefault<List<String>> LABEL = new HystrixRequestVariableDefault<>();\n\n\tprivate static void initHystrixRequestContext(String labels) {\n\t\tlog.info(\"LABEL={}\", labels);\n\t\tif (!HystrixRequestContext.isCurrentThreadInitialized()) {\n\t\t\tHystrixRequestContext.initializeContext();\n\t\t}\n\n\t\tif (!StringUtils.isEmpty(labels)) {\n\t\t\tCoreHeaderInterceptor.LABEL.set(Arrays.asList(labels.split(CoreHeaderInterceptor.HEADER_LABEL_SPLIT)));\n\t\t} else {\n\t\t\tCoreHeaderInterceptor.LABEL.set(Collections.emptyList());\n\t\t}\n\t}\n\n\tprivate static void shutdownHystrixRequestContext() {\n\t\tif (HystrixRequestContext.isCurrentThreadInitialized()) {\n\t\t\tHystrixRequestContext.getContextForCurrentThread().shutdown();\n\t\t}\n\t}\n\n\t@Override\n\tpublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {\n\t\tCoreHeaderInterceptor.initHystrixRequestContext(request.getHeader(CoreHeaderInterceptor.HEADER_LABEL));\n\t\treturn true;\n\t}\n\n\t@Override\n\tpublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) {\n\t\tCoreHeaderInterceptor.shutdownHystrixRequestContext();\n\t}\n}\n"
  },
  {
    "path": "paascloud-common/paascloud-common-core/src/main/java/com/paascloud/core/interceptor/CoreHttpRequestInterceptor.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：CoreHttpRequestInterceptor.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.core.interceptor;\n\nimport lombok.extern.slf4j.Slf4j;\nimport org.springframework.http.HttpRequest;\nimport org.springframework.http.client.ClientHttpRequestExecution;\nimport org.springframework.http.client.ClientHttpRequestInterceptor;\nimport org.springframework.http.client.ClientHttpResponse;\nimport org.springframework.http.client.support.HttpRequestWrapper;\nimport org.springframework.util.StringUtils;\n\nimport java.io.IOException;\n\n/**\n * The class Core http request interceptor.\n *\n * @author paascloud.net@gmail.com\n */\n@Slf4j\npublic class CoreHttpRequestInterceptor implements ClientHttpRequestInterceptor {\n\t/**\n\t * Intercept client http response.\n\t *\n\t * @param request   the request\n\t * @param body      the body\n\t * @param execution the execution\n\t *\n\t * @return the client http response\n\t *\n\t * @throws IOException the io exception\n\t */\n\t@Override\n\tpublic ClientHttpResponse intercept(HttpRequest request, byte[] body,\n\t                                    ClientHttpRequestExecution execution) throws IOException {\n\t\tHttpRequestWrapper requestWrapper = new HttpRequestWrapper(request);\n\n\t\tString header = StringUtils.collectionToDelimitedString(\n\t\t\t\tCoreHeaderInterceptor.LABEL.get(),\n\t\t\t\tCoreHeaderInterceptor.HEADER_LABEL_SPLIT);\n\t\tlog.info(\"header={} \", header);\n\t\trequestWrapper.getHeaders().add(CoreHeaderInterceptor.HEADER_LABEL, header);\n\n\t\treturn execution.execute(requestWrapper, body);\n\t}\n}\n"
  },
  {
    "path": "paascloud-common/paascloud-common-core/src/main/java/com/paascloud/core/interceptor/SqlLogInterceptor.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：SqlLogInterceptor.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.core.interceptor;\n\nimport com.paascloud.ThreadLocalMap;\nimport com.paascloud.base.constant.GlobalConstant;\nimport com.paascloud.core.aspect.NotDisplaySqlAspect;\nimport lombok.extern.slf4j.Slf4j;\nimport org.apache.ibatis.executor.Executor;\nimport org.apache.ibatis.mapping.BoundSql;\nimport org.apache.ibatis.mapping.MappedStatement;\nimport org.apache.ibatis.mapping.ParameterMapping;\nimport org.apache.ibatis.plugin.*;\nimport org.apache.ibatis.reflection.MetaObject;\nimport org.apache.ibatis.session.Configuration;\nimport org.apache.ibatis.session.ResultHandler;\nimport org.apache.ibatis.session.RowBounds;\nimport org.apache.ibatis.type.TypeHandlerRegistry;\nimport org.springframework.beans.factory.annotation.Value;\nimport org.springframework.core.annotation.Order;\n\nimport java.text.DateFormat;\nimport java.util.*;\n\n/**\n * mybatis sql 拦截器\n * 1.配合注解NotDisplaySql ，可以禁止指定的方法的SQL 不打印控制台。\n * 2.SQL 执行时间超过 关注时间 noticeTime ,以error级别打印到控制台\n * 使用时需要把mybatis logger级别设置为 INFO级别\n *\n * @author paascloud.net @gmail.com\n */\n@Intercepts({\n\t\t@Signature(type = Executor.class, method = \"update\", args = {MappedStatement.class, Object.class}),\n\t\t@Signature(type = Executor.class, method = \"query\", args = {MappedStatement.class, Object.class, RowBounds.class, ResultHandler.class})})\n@Slf4j\n@Order(1)\npublic class SqlLogInterceptor implements Interceptor {\n\t@Value(\"${paascloud.enableSqlLogInterceptor}\")\n\tprivate boolean enableSqlLogInterceptor;\n\n\t/**\n\t * 关注时间 单位秒，默认值 5\n\t * 如果 执行SQL 超过时间 就会打印error 日志\n\t */\n\tprivate Double noticeTime = 5.0;\n\n\t/**\n\t * Intercept object.\n\t *\n\t * @param invocation the invocation\n\t *\n\t * @return the object\n\t *\n\t * @throws Throwable the throwable\n\t */\n\t@Override\n\tpublic Object intercept(Invocation invocation) throws Throwable {\n\t\tlong start = System.currentTimeMillis();\n\n\t\tMappedStatement mappedStatement = (MappedStatement) invocation.getArgs()[0];\n\t\tObject parameter = null;\n\t\tif (invocation.getArgs().length > 1) {\n\t\t\tparameter = invocation.getArgs()[1];\n\t\t}\n\t\tBoundSql boundSql = mappedStatement.getBoundSql(parameter);\n\t\tConfiguration configuration = mappedStatement.getConfiguration();\n\t\tString sql = boundSql.getSql().replaceAll(\"[\\\\s]+\", \" \");\n\t\tList<String> paramList = getParamList(configuration, boundSql);\n\t\tObject proceed = invocation.proceed();\n\t\tint result = 0;\n\t\tif (proceed instanceof ArrayList) {\n\t\t\tArrayList resultList = (ArrayList) proceed;\n\t\t\tresult = resultList.size();\n\t\t}\n\t\tif (proceed instanceof Integer) {\n\t\t\tresult = (Integer) proceed;\n\t\t}\n\t\tif (enableSqlLogInterceptor) {\n\t\t\tlong end = System.currentTimeMillis();\n\t\t\tlong time = end - start;\n\t\t\tBoolean flag = (Boolean) ThreadLocalMap.get(NotDisplaySqlAspect.DISPLAY_SQL);\n\t\t\tif (time >= noticeTime * GlobalConstant.Number.THOUSAND_INT) {\n\t\t\t\tlog.error(\"执行超过{}秒,sql={}\", noticeTime, sql);\n\t\t\t\tlog.error(\"result={}, time={}ms, params={}\", result, time, paramList);\n\t\t\t\treturn proceed;\n\t\t\t}\n\t\t\tif (flag == null || Objects.equals(flag, true)) {\n\t\t\t\tlog.info(\"sql={}\", sql);\n\t\t\t\tlog.info(\"result={},time={}ms, params={}\", result, time, paramList);\n\t\t\t}\n\t\t}\n\t\treturn proceed;\n\t}\n\n\t/**\n\t * Instantiates a new Sql log interceptor.\n\t */\n\tpublic SqlLogInterceptor() {\n\t\tlog.info(\"[打印SQL拦截器创建]noticeTime={}秒\", noticeTime);\n\t}\n\n\t/**\n\t * 设置执行sql\n\t *\n\t * @param noticeTime 关注时间 ，如果执行sql超过关注时间，打印error日志.\n\t */\n\tpublic SqlLogInterceptor(Double noticeTime) {\n\t\tthis.noticeTime = noticeTime;\n\t\tlog.info(\"[打印SQL拦截器创建]noticeTime={}秒\", noticeTime);\n\t}\n\n\t/**\n\t * Plugin object.\n\t *\n\t * @param target the target\n\t *\n\t * @return the object\n\t */\n\t@Override\n\tpublic Object plugin(Object target) {\n\t\treturn Plugin.wrap(target, this);\n\t}\n\n\t/**\n\t * Sets properties.\n\t *\n\t * @param properties the properties\n\t */\n\t@Override\n\tpublic void setProperties(Properties properties) {\n\n\t}\n\n\t/**\n\t * 获取sql参数集合。\n\t *\n\t * @param configuration the configuration\n\t * @param boundSql      the bound sql\n\t *\n\t * @return the param list\n\t */\n\tprivate List<String> getParamList(Configuration configuration, BoundSql boundSql) {\n\t\tObject parameterObject = boundSql.getParameterObject();\n\t\tList<ParameterMapping> parameterMappings = boundSql.getParameterMappings();\n\t\tList<String> params = new ArrayList<>();\n\t\tif (parameterMappings.size() > 0 && parameterObject != null) {\n\t\t\tTypeHandlerRegistry typeHandlerRegistry = configuration.getTypeHandlerRegistry();\n\t\t\tif (typeHandlerRegistry.hasTypeHandler(parameterObject.getClass())) {\n\t\t\t\tparams.add(getParameterValue(parameterObject));\n\t\t\t} else {\n\t\t\t\tMetaObject metaObject = configuration.newMetaObject(parameterObject);\n\t\t\t\tfor (ParameterMapping parameterMapping : parameterMappings) {\n\t\t\t\t\tString propertyName = parameterMapping.getProperty();\n\t\t\t\t\tif (metaObject.hasGetter(propertyName)) {\n\t\t\t\t\t\tObject obj = metaObject.getValue(propertyName);\n\t\t\t\t\t\tparams.add(getParameterValue(obj));\n\t\t\t\t\t} else if (boundSql.hasAdditionalParameter(propertyName)) {\n\t\t\t\t\t\tObject obj = boundSql.getAdditionalParameter(propertyName);\n\t\t\t\t\t\tparams.add(getParameterValue(obj));\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn params;\n\t}\n\n\tprivate String getParameterValue(Object obj) {\n\t\tString value;\n\t\tif (obj instanceof String) {\n\t\t\tvalue = \"'\" + obj.toString() + \"'\";\n\t\t} else if (obj instanceof Date) {\n\t\t\tDateFormat formatter = DateFormat.getDateTimeInstance(DateFormat.DEFAULT, DateFormat.DEFAULT, Locale.CHINA);\n\t\t\tvalue = \"'\" + formatter.format(obj) + \"'\";\n\t\t} else {\n\t\t\tif (obj != null) {\n\t\t\t\tvalue = obj.toString();\n\t\t\t} else {\n\t\t\t\tvalue = \"\";\n\t\t\t}\n\n\t\t}\n\t\treturn value;\n\t}\n}\n"
  },
  {
    "path": "paascloud-common/paascloud-common-core/src/main/java/com/paascloud/core/interceptor/TokenInterceptor.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：TokenInterceptor.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.core.interceptor;\n\nimport com.paascloud.RedisKeyUtil;\nimport com.paascloud.ThreadLocalMap;\nimport com.paascloud.annotation.NoNeedAccessAuthentication;\nimport com.paascloud.base.constant.GlobalConstant;\nimport com.paascloud.base.dto.LoginAuthDto;\nimport com.paascloud.base.dto.UserTokenDto;\nimport lombok.extern.slf4j.Slf4j;\nimport org.apache.commons.lang.StringUtils;\nimport org.springframework.beans.factory.annotation.Value;\nimport org.springframework.core.annotation.AnnotationUtils;\nimport org.springframework.data.redis.core.RedisTemplate;\nimport org.springframework.http.HttpHeaders;\nimport org.springframework.web.method.HandlerMethod;\nimport org.springframework.web.servlet.HandlerInterceptor;\nimport org.springframework.web.servlet.ModelAndView;\n\nimport javax.annotation.Resource;\nimport javax.servlet.http.HttpServletRequest;\nimport javax.servlet.http.HttpServletResponse;\nimport java.io.IOException;\nimport java.lang.reflect.Method;\n\n/**\n * The class Token interceptor.\n *\n * @author paascloud.net @gmail.com\n */\n@Slf4j\npublic class TokenInterceptor implements HandlerInterceptor {\n\n\t@Value(\"${paascloud.oauth2.jwtSigningKey}\")\n\tprivate String jwtSigningKey;\n\n\t@Resource\n\tprivate RedisTemplate<String, Object> redisTemplate;\n\n\tprivate static final String OPTIONS = \"OPTIONS\";\n\tprivate static final String AUTH_PATH1 = \"/auth\";\n\tprivate static final String AUTH_PATH2 = \"/oauth\";\n\tprivate static final String AUTH_PATH3 = \"/error\";\n\tprivate static final String AUTH_PATH4 = \"/api\";\n\n\t/**\n\t * After completion.\n\t *\n\t * @param request  the request\n\t * @param response the response\n\t * @param arg2     the arg 2\n\t * @param ex       the ex\n\t *\n\t * @throws Exception the exception\n\t */\n\t@Override\n\tpublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object arg2, Exception ex) throws Exception {\n\t\tif (ex != null) {\n\t\t\tlog.error(\"<== afterCompletion - 解析token失败. ex={}\", ex.getMessage(), ex);\n\t\t\tthis.handleException(response);\n\t\t}\n\t}\n\n\t/**\n\t * Post handle.\n\t *\n\t * @param request  the request\n\t * @param response the response\n\t * @param arg2     the arg 2\n\t * @param mv       the mv\n\t */\n\t@Override\n\tpublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object arg2, ModelAndView mv) {\n\t}\n\n\t/**\n\t * Pre handle boolean.\n\t *\n\t * @param request  the request\n\t * @param response the response\n\t * @param handler  the handler\n\t *\n\t * @return the boolean\n\t */\n\t@Override\n\tpublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {\n\t\tString uri = request.getRequestURI();\n\t\tlog.info(\"<== preHandle - 权限拦截器.  url={}\", uri);\n\t\tif (uri.contains(AUTH_PATH1) || uri.contains(AUTH_PATH2) || uri.contains(AUTH_PATH3) || uri.contains(AUTH_PATH4)) {\n\t\t\tlog.info(\"<== preHandle - 配置URL不走认证.  url={}\", uri);\n\t\t\treturn true;\n\t\t}\n\t\tlog.info(\"<== preHandle - 调试模式不走认证.  OPTIONS={}\", request.getMethod().toUpperCase());\n\n\t\tif (OPTIONS.equalsIgnoreCase(request.getMethod())) {\n\t\t\tlog.info(\"<== preHandle - 调试模式不走认证.  url={}\", uri);\n\t\t\treturn true;\n\t\t}\n\n\t\tif (isHaveAccess(handler)) {\n\t\t\tlog.info(\"<== preHandle - 不需要认证注解不走认证.  token={}\");\n\t\t\treturn true;\n\t\t}\n\n\t\tString token = StringUtils.substringAfter(request.getHeader(HttpHeaders.AUTHORIZATION), \"Bearer \");\n\t\tlog.info(\"<== preHandle - 权限拦截器.  token={}\", token);\n\t\tLoginAuthDto loginUser = (UserTokenDto) redisTemplate.opsForValue().get(RedisKeyUtil.getAccessTokenKey(token));\n\t\tif (loginUser == null) {\n\t\t\tlog.error(\"获取用户信息失败, 不允许操作\");\n\t\t\treturn false;\n\t\t}\n\t\tlog.info(\"<== preHandle - 权限拦截器.  loginUser={}\", loginUser);\n\t\tThreadLocalMap.put(GlobalConstant.Sys.TOKEN_AUTH_DTO, loginUser);\n\t\tlog.info(\"<== preHandle - 权限拦截器.  url={}, loginUser={}\", uri, loginUser);\n\t\treturn true;\n\t}\n\n\tprivate void handleException(HttpServletResponse res) throws IOException {\n\t\tres.resetBuffer();\n\t\tres.setHeader(\"Access-Control-Allow-Origin\", \"*\");\n\t\tres.setHeader(\"Access-Control-Allow-Credentials\", \"true\");\n\t\tres.setContentType(\"application/json\");\n\t\tres.setCharacterEncoding(\"UTF-8\");\n\t\tres.getWriter().write(\"{\\\"code\\\":100009 ,\\\"message\\\" :\\\"解析token失败\\\"}\");\n\t\tres.flushBuffer();\n\t}\n\n\tprivate boolean isHaveAccess(Object handler) {\n\t\tHandlerMethod handlerMethod = (HandlerMethod) handler;\n\n\t\tMethod method = handlerMethod.getMethod();\n\n\t\tNoNeedAccessAuthentication responseBody = AnnotationUtils.findAnnotation(method, NoNeedAccessAuthentication.class);\n\t\treturn responseBody != null;\n\t}\n\n}\n  "
  },
  {
    "path": "paascloud-common/paascloud-common-core/src/main/java/com/paascloud/core/mq/MqMessage.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：MqMessage.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.core.mq;\n\nimport com.google.common.base.Preconditions;\nimport com.paascloud.base.enums.ErrorCodeEnum;\nimport com.paascloud.base.exception.BusinessException;\nimport io.swagger.annotations.ApiModel;\nimport io.swagger.annotations.ApiModelProperty;\nimport lombok.Data;\nimport lombok.extern.slf4j.Slf4j;\nimport org.apache.rocketmq.client.producer.SendResult;\nimport org.apache.rocketmq.common.message.Message;\nimport org.apache.rocketmq.remoting.common.RemotingHelper;\nimport org.slf4j.Logger;\nimport org.springframework.util.StringUtils;\n\nimport java.io.Serializable;\nimport java.io.UnsupportedEncodingException;\n\n/**\n * The class Mq message.\n *\n * @author paascloud.net@gmail.com\n */\n@Slf4j\n@Data\n@ApiModel(\"消息队列\")\npublic class MqMessage implements Serializable {\n\tprivate static final long serialVersionUID = 9215900048842983997L;\n\t@ApiModelProperty(\"主题\")\n\tprivate String topic;\n\t@ApiModelProperty(\"标签\")\n\tprivate String tag;\n\t@ApiModelProperty(\"唯一键\")\n\tprivate String key;\n\t@ApiModelProperty(\"消息体\")\n\tprivate String body;\n\n\t/**\n\t * Check message message.\n\t *\n\t * @param mqMessage the mq message\n\t *\n\t * @return the message\n\t */\n\tpublic static Message checkMessage(MqMessage mqMessage) {\n\n\t\tString topic = mqMessage.getTopic();\n\t\tString key = mqMessage.getKey();\n\t\tString body = mqMessage.getBody();\n\t\tString tag = mqMessage.getTag();\n\t\tprintCheckMessageLog(topic, key, body, tag);\n\t\tcheckMessage(topic, key, body);\n\t\treturn buildMessage(body, topic, tag, key);\n\n\t}\n\n\tprivate static void printCheckMessageLog(final String topic, final String key, final String body, final String tag) {\n\t\tlog.info(\"checkMessage - 校验MQ body={}, topic={}, tag={}, key={}\", body, topic, tag, key);\n\t}\n\n\t/**\n\t * Check message message.\n\t *\n\t * @param body  the body\n\t * @param topic the topic\n\t * @param tag   the tag\n\t * @param key   the key\n\t *\n\t * @return the message\n\t */\n\tpublic static Message checkMessage(String body, String topic, String tag, String key) {\n\t\tprintCheckMessageLog(topic, key, body, tag);\n\t\tcheckMessage(topic, key, body);\n\t\treturn buildMessage(body, topic, tag, key);\n\n\t}\n\n\t/**\n\t * Check message message.\n\t *\n\t * @param message the message\n\t *\n\t * @return the message\n\t */\n\tpublic static Message checkMessage(Message message) {\n\n\t\tString body = new String(message.getBody());\n\t\tString topic = message.getTopic();\n\t\tString key = message.getKeys();\n\t\tString tag = message.getTags();\n\t\tprintCheckMessageLog(topic, key, body, tag);\n\t\tcheckMessage(topic, key, body);\n\t\treturn buildMessage(body, topic, tag, key);\n\n\t}\n\n\t/**\n\t * Instantiates a new Mq message.\n\t *\n\t * @param message the message\n\t */\n\tpublic MqMessage(Message message) {\n\t\tthis.body = new String(message.getBody());\n\t\tthis.topic = message.getTopic();\n\t\tthis.key = message.getKeys();\n\t\tthis.tag = message.getTags();\n\n\t}\n\n\tprivate static Message buildMessage(String body, String topic, String tag, String key) {\n\t\tMessage message = new Message();\n\t\ttry {\n\t\t\tmessage.setBody(body.getBytes(RemotingHelper.DEFAULT_CHARSET));\n\t\t} catch (UnsupportedEncodingException e) {\n\t\t\tlog.error(\"编码转换,出现异常={}\", e.getMessage(), e);\n\t\t\tthrow new BusinessException(ErrorCodeEnum.TPC100500011);\n\t\t}\n\t\tmessage.setKeys(key);\n\t\tmessage.setTopic(topic);\n\t\tmessage.setTags(tag);\n\t\treturn message;\n\t}\n\n\t/**\n\t * Instantiates a new Mq message.\n\t *\n\t * @param topic the topic\n\t * @param tag   the tag\n\t * @param key   the key\n\t * @param body  the body\n\t */\n\tpublic MqMessage(String topic, String tag, String key, String body) {\n\t\tthis.topic = topic;\n\t\tthis.tag = tag;\n\t\tthis.key = key;\n\t\tthis.body = body;\n\t}\n\n\t/**\n\t * Check message.\n\t *\n\t * @param topic the topic\n\t * @param key   the key\n\t * @param body  the body\n\t */\n\tpublic static void checkMessage(String topic, String key, String body) {\n\n\t\tPreconditions.checkArgument(!StringUtils.isEmpty(topic), \"发送消息失败, 消息主题不能为空\");\n\t\tPreconditions.checkArgument(!StringUtils.isEmpty(key), \"发送消息失败, 消息关键字不能为空\");\n\t\tPreconditions.checkArgument(!StringUtils.isEmpty(body), \"发送消息失败, 消息体不能为空\");\n\t}\n\n\t/**\n\t * Print producer result.\n\t *\n\t * @param sendResult the send result\n\t * @param logger     the logger\n\t */\n\tpublic static void printProducerResult(SendResult sendResult, Logger logger) {\n\t\tif (sendResult != null) {\n\t\t\tlogger.info(\"sendSimpleMessage - 发送MQ [OK]sendResult={}\", sendResult);\n\t\t} else {\n\t\t\tlogger.info(\"sendSimpleMessage - 发送MQ [FAIL]\");\n\t\t}\n\t}\n\n\t/**\n\t * Print producer exception.\n\t *\n\t * @param topic  the topic\n\t * @param tag    the tag\n\t * @param key    the key\n\t * @param logger the logger\n\t * @param e      the e\n\t */\n\tpublic static void printProducerException(String topic, String tag, String key, Logger logger, Exception e) {\n\t\tlogger.error(\"sendSimpleMessage - 发送MQ [FAIL] topic={}, tag={}, key={}\", topic, tag, key, e);\n\t}\n}\n"
  },
  {
    "path": "paascloud-common/paascloud-common-core/src/main/java/com/paascloud/core/mybatis/BaseEntity.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：BaseEntity.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.core.mybatis;\n\nimport com.fasterxml.jackson.annotation.JsonFormat;\nimport com.fasterxml.jackson.annotation.JsonIgnore;\nimport com.paascloud.base.dto.LoginAuthDto;\nimport lombok.Data;\nimport org.springframework.format.annotation.DateTimeFormat;\n\nimport javax.persistence.*;\nimport java.io.Serializable;\nimport java.util.Date;\n\n/**\n * The class Base entity.\n *\n * @author paascloud.net@gmail.com\n */\n@Data\npublic class BaseEntity implements Serializable {\n\tprivate static final long serialVersionUID = 2393269568666085258L;\n\t@Id\n\t@GeneratedValue(strategy = GenerationType.IDENTITY)\n\tprivate Long id;\n\n\t/**\n\t * 版本号\n\t */\n\tprivate Integer version;\n\t/**\n\t * 创建人\n\t */\n\tprivate String creator;\n\n\t/**\n\t * 创建人ID\n\t */\n\t@Column(name = \"creator_id\")\n\tprivate Long creatorId;\n\n\t/**\n\t * 创建时间\n\t */\n\t@Column(name = \"created_time\")\n\t@DateTimeFormat(pattern = \"yyyy-MM-dd HH:mm:ss\")\n\t@JsonFormat(pattern = \"yyyy-MM-dd HH:mm:ss\", timezone = \"GMT+8\")\n\tprivate Date createdTime;\n\n\t/**\n\t * 最近操作人\n\t */\n\t@Column(name = \"last_operator\")\n\tprivate String lastOperator;\n\n\t/**\n\t * 最后操作人ID\n\t */\n\t@Column(name = \"last_operator_id\")\n\tprivate Long lastOperatorId;\n\n\t/**\n\t * 更新时间\n\t */\n\t@Column(name = \"update_time\")\n\t@DateTimeFormat(pattern = \"yyyy-MM-dd HH:mm:ss\")\n\t@JsonFormat(pattern = \"yyyy-MM-dd HH:mm:ss\", timezone = \"GMT+8\")\n\tprivate Date updateTime;\n\n\t@Transient\n\tprivate Integer pageNum;\n\n\t@Transient\n\tprivate Integer pageSize;\n\n\t@Transient\n\tprivate String orderBy;\n\n\t/**\n\t * Is new boolean.\n\t *\n\t * @return the boolean\n\t */\n\t@Transient\n\t@JsonIgnore\n\tpublic boolean isNew() {\n\t\treturn this.id == null;\n\t}\n\n\t/**\n\t * Sets update info.\n\t *\n\t * @param user the user\n\t */\n\t@Transient\n\t@JsonIgnore\n\tpublic void setUpdateInfo(LoginAuthDto user) {\n\n\t\tif (isNew()) {\n\t\t\tthis.creatorId = (this.lastOperatorId = user.getUserId());\n\t\t\tthis.creator = user.getUserName();\n\t\t\tthis.createdTime = (this.updateTime = new Date());\n\t\t}\n\t\tthis.lastOperatorId = user.getUserId();\n\t\tthis.lastOperator = user.getUserName() == null ? user.getLoginName() : user.getUserName();\n\t\tthis.updateTime = new Date();\n\t}\n}\n"
  },
  {
    "path": "paascloud-common/paascloud-common-core/src/main/java/com/paascloud/core/mybatis/MyMapper.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：MyMapper.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.core.mybatis;\n\nimport tk.mybatis.mapper.common.Mapper;\nimport tk.mybatis.mapper.common.MySqlMapper;\n\n\n/**\n * The interface My mapper.\n *\n * @param <T> the type parameter @author paascloud.net@gmail.com\n */\npublic interface MyMapper<T> extends Mapper<T>, MySqlMapper<T> {\n}\n"
  },
  {
    "path": "paascloud-common/paascloud-common-core/src/main/java/com/paascloud/core/support/AbstractTreeService.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：AbstractTreeService.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.core.support;\n\nimport com.google.common.collect.Lists;\nimport com.paascloud.PublicUtil;\nimport com.paascloud.base.dto.BaseTree;\n\nimport java.io.Serializable;\nimport java.util.List;\nimport java.util.Objects;\n\n/**\n * The class Tree service.\n *\n * @param <T>  the type parameter\n * @param <ID> the type parameter\n *\n * @author paascloud.net @gmail.com\n */\npublic abstract class AbstractTreeService<T extends BaseTree<T, ID>, ID extends Serializable> implements ITree<T, ID> {\n\n\t/**\n\t * Gets child tree objects.\n\t *\n\t * @param list     the list\n\t * @param parentId the parent id\n\t *\n\t * @return the child tree objects\n\t */\n\t@Override\n\tpublic List<T> getChildTreeObjects(List<T> list, ID parentId) {\n\t\tList<T> returnList = Lists.newArrayList();\n\t\tfor (T res : list) {\n\t\t\tif (res.getPid() == null) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (Objects.equals(res.getPid(), parentId)) {\n\t\t\t\trecursionFn(list, res);\n\t\t\t\treturnList.add(res);\n\t\t\t}\n\t\t}\n\t\treturn returnList;\n\t}\n\n\t/**\n\t * 递归列表\n\t *\n\t * @param list the list\n\t * @param t    the t\n\t */\n\t@Override\n\tpublic void recursionFn(List<T> list, T t) {\n\t\tList<T> children = getChildList(list, t);\n\t\tif (PublicUtil.isNotEmpty(children)) {\n\t\t\tt.setChildren(children);\n\t\t\tt.setHasChild(true);\n\t\t}\n\t\tfor (T nextChild : children) {\n\t\t\t// 下一个对象，与所有的资源集进行判断\n\t\t\tif (hasChild(list, nextChild)) {\n\t\t\t\t// 有下一个子节点,递归\n\t\t\t\tfor (T node : children) {\n\t\t\t\t\t// 所有的对象--跟当前这个childList 的对象子节点\n\t\t\t\t\trecursionFn(list, node);\n\t\t\t\t}\n\t\t\t\tnextChild.setHasChild(true);\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * 获得指定节点下的所有子节点\n\t *\n\t * @param list the list\n\t * @param t    the t\n\t *\n\t * @return the child list\n\t */\n\t@Override\n\tpublic List<T> getChildList(List<T> list, T t) {\n\t\tList<T> childList = Lists.newArrayList();\n\t\tfor (T child : list) {\n\t\t\tif (PublicUtil.isEmpty(child.getPid())) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\t// 判断集合的父ID是否等于上一级的id\n\t\t\tif (Objects.equals(child.getPid(), t.getId())) {\n\t\t\t\tchildList.add(child);\n\t\t\t}\n\t\t}\n\t\treturn childList;\n\t}\n\n\t/**\n\t * 判断是否还有下一个子节点\n\t *\n\t * @param list the list\n\t * @param t    the t\n\t *\n\t * @return the boolean\n\t */\n\t@Override\n\tpublic boolean hasChild(List<T> list, T t) {\n\t\treturn !getChildList(list, t).isEmpty();\n\t}\n}"
  },
  {
    "path": "paascloud-common/paascloud-common-core/src/main/java/com/paascloud/core/support/BaseController.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：BaseController.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.core.support;\n\nimport com.paascloud.PublicUtil;\nimport com.paascloud.ThreadLocalMap;\nimport com.paascloud.base.constant.GlobalConstant;\nimport com.paascloud.base.dto.LoginAuthDto;\nimport com.paascloud.base.enums.ErrorCodeEnum;\nimport com.paascloud.base.exception.BusinessException;\nimport com.paascloud.core.generator.IncrementIdGenerator;\nimport com.paascloud.core.generator.UniqueIdGenerator;\nimport com.paascloud.wrapper.WrapMapper;\nimport com.paascloud.wrapper.Wrapper;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\n/**\n * The class Base controller.\n *\n * @author paascloud.net@gmail.com\n */\npublic class BaseController {\n\n\tprotected final Logger logger = LoggerFactory.getLogger(this.getClass());\n\n\t/**\n\t * Gets login auth dto.\n\t *\n\t * @return the login auth dto\n\t */\n\tprotected LoginAuthDto getLoginAuthDto() {\n\t\tLoginAuthDto loginAuthDto = (LoginAuthDto) ThreadLocalMap.get(GlobalConstant.Sys.TOKEN_AUTH_DTO);\n\t\tif (PublicUtil.isEmpty(loginAuthDto)) {\n\t\t\tthrow new BusinessException(ErrorCodeEnum.UAC10011041);\n\t\t}\n\t\treturn loginAuthDto;\n\t}\n\n\t/**\n\t * Handle result wrapper.\n\t *\n\t * @param <T>    the type parameter\n\t * @param result the result\n\t *\n\t * @return the wrapper\n\t */\n\tprotected <T> Wrapper<T> handleResult(T result) {\n\t\tboolean flag = isFlag(result);\n\n\t\tif (flag) {\n\t\t\treturn WrapMapper.wrap(Wrapper.SUCCESS_CODE, \"操作成功\", result);\n\t\t} else {\n\t\t\treturn WrapMapper.wrap(Wrapper.ERROR_CODE, \"操作失败\", result);\n\t\t}\n\t}\n\n\t/**\n\t * Handle result wrapper.\n\t *\n\t * @param <E>      the type parameter\n\t * @param result   the result\n\t * @param errorMsg the error msg\n\t *\n\t * @return the wrapper\n\t */\n\tprotected <E> Wrapper<E> handleResult(E result, String errorMsg) {\n\t\tboolean flag = isFlag(result);\n\n\t\tif (flag) {\n\t\t\treturn WrapMapper.wrap(Wrapper.SUCCESS_CODE, \"操作成功\", result);\n\t\t} else {\n\t\t\treturn WrapMapper.wrap(Wrapper.ERROR_CODE, errorMsg, result);\n\t\t}\n\t}\n\n\tprivate boolean isFlag(Object result) {\n\t\tboolean flag;\n\t\tif (result instanceof Integer) {\n\t\t\tflag = (Integer) result > 0;\n\t\t} else if (result instanceof Boolean) {\n\t\t\tflag = (Boolean) result;\n\t\t} else {\n\t\t\tflag = PublicUtil.isNotEmpty(result);\n\t\t}\n\t\treturn flag;\n\t}\n\n\tprotected long generateId() {\n\t\treturn UniqueIdGenerator.getInstance(IncrementIdGenerator.getServiceId()).nextId();\n\t}\n\n}\n  "
  },
  {
    "path": "paascloud-common/paascloud-common-core/src/main/java/com/paascloud/core/support/BaseService.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：BaseService.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.core.support;\n\nimport com.paascloud.base.exception.BusinessException;\nimport com.paascloud.core.generator.IncrementIdGenerator;\nimport com.paascloud.core.generator.UniqueIdGenerator;\nimport org.apache.ibatis.session.RowBounds;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport tk.mybatis.mapper.common.Mapper;\n\nimport java.util.List;\n\n/**\n * The class Base service.\n *\n * @param <T> the type parameter\n *\n * @author paascloud.net@gmail.com\n */\npublic abstract class BaseService<T> implements IService<T> {\n\n\t/**\n\t * The Logger.\n\t */\n\tprotected final Logger logger = LoggerFactory.getLogger(this.getClass());\n\n\t/**\n\t * The Mapper.\n\t */\n\t@Autowired\n\tprotected Mapper<T> mapper;\n\n\t/**\n\t * Gets mapper.\n\t *\n\t * @return the mapper\n\t */\n\tpublic Mapper<T> getMapper() {\n\t\treturn mapper;\n\t}\n\n\t/**\n\t * Select list.\n\t *\n\t * @param record the record\n\t *\n\t * @return the list\n\t */\n\t@Override\n\tpublic List<T> select(T record) {\n\t\treturn mapper.select(record);\n\t}\n\n\t/**\n\t * Select by key t.\n\t *\n\t * @param key the key\n\t *\n\t * @return the t\n\t */\n\t@Override\n\tpublic T selectByKey(Object key) {\n\t\treturn mapper.selectByPrimaryKey(key);\n\t}\n\n\t/**\n\t * Select all list.\n\t *\n\t * @return the list\n\t */\n\t@Override\n\tpublic List<T> selectAll() {\n\t\treturn mapper.selectAll();\n\t}\n\n\t/**\n\t * Select one t.\n\t *\n\t * @param record the record\n\t *\n\t * @return the t\n\t */\n\t@Override\n\tpublic T selectOne(T record) {\n\t\treturn mapper.selectOne(record);\n\t}\n\n\t/**\n\t * Select count int.\n\t *\n\t * @param record the record\n\t *\n\t * @return the int\n\t */\n\t@Override\n\tpublic int selectCount(T record) {\n\t\treturn mapper.selectCount(record);\n\t}\n\n\t/**\n\t * Select by example list.\n\t *\n\t * @param example the example\n\t *\n\t * @return the list\n\t */\n\t@Override\n\tpublic List<T> selectByExample(Object example) {\n\t\treturn mapper.selectByExample(example);\n\t}\n\n\t/**\n\t * Save int.\n\t *\n\t * @param record the record\n\t *\n\t * @return the int\n\t */\n\t@Override\n\tpublic int save(T record) {\n\t\treturn mapper.insertSelective(record);\n\t}\n\n\t/**\n\t * Batch save int.\n\t *\n\t * @param list the list\n\t *\n\t * @return the int\n\t */\n\t@Override\n\tpublic int batchSave(List<T> list) {\n\t\tint result = 0;\n\t\tfor (T record : list) {\n\t\t\tint count = mapper.insertSelective(record);\n\t\t\tresult += count;\n\t\t}\n\t\treturn result;\n\t}\n\n\t/**\n\t * Update int.\n\t *\n\t * @param entity the entity\n\t *\n\t * @return the int\n\t */\n\t@Override\n\tpublic int update(T entity) {\n\t\treturn mapper.updateByPrimaryKeySelective(entity);\n\t}\n\n\t/**\n\t * Delete int.\n\t *\n\t * @param record the record\n\t *\n\t * @return the int\n\t */\n\t@Override\n\tpublic int delete(T record) {\n\t\treturn mapper.delete(record);\n\t}\n\n\t/**\n\t * Delete by key int.\n\t *\n\t * @param key the key\n\t *\n\t * @return the int\n\t */\n\t@Override\n\tpublic int deleteByKey(Object key) {\n\t\treturn mapper.deleteByPrimaryKey(key);\n\t}\n\n\t/**\n\t * Batch delete int.\n\t *\n\t * @param list the list\n\t *\n\t * @return the int\n\t */\n\t@Override\n\tpublic int batchDelete(List<T> list) {\n\t\tint result = 0;\n\t\tfor (T record : list) {\n\t\t\tint count = mapper.delete(record);\n\t\t\tif (count < 1) {\n\t\t\t\tlogger.error(\"删除数据失败\");\n\t\t\t\tthrow new BusinessException(\"删除数据失败!\");\n\t\t\t}\n\t\t\tresult += count;\n\t\t}\n\t\treturn result;\n\t}\n\n\t/**\n\t * Select count by example int.\n\t *\n\t * @param example the example\n\t *\n\t * @return the int\n\t */\n\t@Override\n\tpublic int selectCountByExample(Object example) {\n\t\treturn mapper.selectCountByExample(example);\n\t}\n\n\t/**\n\t * Update by example int.\n\t *\n\t * @param record  the record\n\t * @param example the example\n\t *\n\t * @return the int\n\t */\n\t@Override\n\tpublic int updateByExample(T record, Object example) {\n\t\treturn mapper.updateByExampleSelective(record, example);\n\t}\n\n\t/**\n\t * Delete by example int.\n\t *\n\t * @param example the example\n\t *\n\t * @return the int\n\t */\n\t@Override\n\tpublic int deleteByExample(Object example) {\n\t\treturn mapper.deleteByPrimaryKey(example);\n\t}\n\n\t/**\n\t * Select by row bounds list.\n\t *\n\t * @param record    the record\n\t * @param rowBounds the row bounds\n\t *\n\t * @return the list\n\t */\n\t@Override\n\tpublic List<T> selectByRowBounds(T record, RowBounds rowBounds) {\n\t\treturn mapper.selectByRowBounds(record, rowBounds);\n\t}\n\n\t/**\n\t * Select by example and row bounds list.\n\t *\n\t * @param example   the example\n\t * @param rowBounds the row bounds\n\t *\n\t * @return the list\n\t */\n\t@Override\n\tpublic List<T> selectByExampleAndRowBounds(Object example, RowBounds rowBounds) {\n\t\treturn mapper.selectByExampleAndRowBounds(example, rowBounds);\n\t}\n\n\tprotected long generateId() {\n\t\treturn UniqueIdGenerator.getInstance(IncrementIdGenerator.getServiceId()).nextId();\n\t}\n}\n"
  },
  {
    "path": "paascloud-common/paascloud-common-core/src/main/java/com/paascloud/core/support/IService.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：IService.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.core.support;\n\nimport org.apache.ibatis.annotations.Param;\nimport org.apache.ibatis.session.RowBounds;\nimport org.springframework.transaction.annotation.Transactional;\n\nimport java.util.List;\n\n/**\n * 通用接口\n *\n * @param <T> the type parameter @author paascloud.net@gmail.com\n *\n * @author paascloud.net@gmail.com\n */\npublic interface IService<T> {\n\t/**\n\t * 根据实体中的属性值进行查询, 查询条件使用等号  @param record the record\n\t *\n\t * @param record the record\n\t *\n\t * @return the list\n\t */\n\tList<T> select(T record);\n\n\t/**\n\t * 根据主键字段进行查询, 方法参数必须包含完整的主键属性, 查询条件使用等号  @param key the key\n\t *\n\t * @param key the key\n\t *\n\t * @return the t\n\t */\n\tT selectByKey(Object key);\n\n\t/**\n\t * 查询全部结果, select(null)方法能达到同样的效果  @return the list\n\t *\n\t * @return the list\n\t */\n\tList<T> selectAll();\n\n\t/**\n\t * 根据实体中的属性进行查询, 只能有一个返回值, 有多个结果是抛出异常, 查询条件使用等号  @param record the record\n\t *\n\t * @param record the record\n\t *\n\t * @return the t\n\t */\n\tT selectOne(T record);\n\n\t/**\n\t * 根据实体中的属性查询总数, 查询条件使用等号  @param record the record\n\t *\n\t * @param record the record\n\t *\n\t * @return the int\n\t */\n\tint selectCount(T record);\n\n\t/**\n\t * 保存一个实体, null的属性不会保存, 会使用数据库默认值  @param record the record\n\t *\n\t * @param record the record\n\t *\n\t * @return the int\n\t */\n\tint save(T record);\n\n\t/**\n\t * 批量保存  @param list the list\n\t *\n\t * @param list the list\n\t *\n\t * @return the int\n\t */\n\t@Transactional(rollbackFor = Exception.class)\n\tint batchSave(List<T> list);\n\n\t/**\n\t * 根据主键更新属性不为null的值  @param entity the entity\n\t *\n\t * @param entity the entity\n\t *\n\t * @return the int\n\t */\n\tint update(T entity);\n\n\t/**\n\t * 根据实体属性作为条件进行删除, 查询条件使用等号  @param record the record\n\t *\n\t * @param record the record\n\t *\n\t * @return the int\n\t */\n\tint delete(T record);\n\n\t/**\n\t * 批量删除  @param list the list\n\t *\n\t * @param list the list\n\t *\n\t * @return the int\n\t */\n\t@Transactional(rollbackFor = Exception.class)\n\tint batchDelete(List<T> list);\n\n\t/**\n\t * 根据主键字段进行删除, 方法参数必须包含完整的主键属性  @param key the key\n\t *\n\t * @param key the key\n\t *\n\t * @return the int\n\t */\n\tint deleteByKey(Object key);\n\n\t/**\n\t * 这个查询支持通过Example类指定查询列, 通过selectProperties方法指定查询列  @param example the example\n\t *\n\t * @param example the example\n\t *\n\t * @return the list\n\t */\n\tList<T> selectByExample(Object example);\n\n\t/**\n\t * 根据Example条件进行查询总数  @param example the example\n\t *\n\t * @param example the example\n\t *\n\t * @return the int\n\t */\n\tint selectCountByExample(Object example);\n\n\t/**\n\t * 根据Example条件更新实体record包含的不是null的属性值  @param record the record\n\t *\n\t * @param record  the record\n\t * @param example the example\n\t *\n\t * @return the int\n\t */\n\tint updateByExample(@Param(\"record\") T record, @Param(\"example\") Object example);\n\n\t/**\n\t * 根据Example条件删除数据  @param example the example\n\t *\n\t * @param example the example\n\t *\n\t * @return the int\n\t */\n\tint deleteByExample(Object example);\n\n\t/**\n\t * 根据实体属性和RowBounds进行分页查询  @param record the record\n\t *\n\t * @param record    the record\n\t * @param rowBounds the row bounds\n\t *\n\t * @return the list\n\t */\n\tList<T> selectByRowBounds(T record, RowBounds rowBounds);\n\n\t/**\n\t * 根据example条件和RowBounds进行分页查询  @param example the example\n\t *\n\t * @param example   the example\n\t * @param rowBounds the row bounds\n\t *\n\t * @return the list\n\t */\n\tList<T> selectByExampleAndRowBounds(Object example, RowBounds rowBounds);\n\n}\n"
  },
  {
    "path": "paascloud-common/paascloud-common-core/src/main/java/com/paascloud/core/support/ITree.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：ITree.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.core.support;\n\nimport com.paascloud.base.dto.BaseTree;\n\nimport java.io.Serializable;\nimport java.util.List;\n\n/**\n * The interface Tree interface.\n *\n * @param <T>  the type parameter\n * @param <ID> the type parameter\n *\n * @author paascloud.net @gmail.com\n */\npublic interface ITree<T extends BaseTree<T, ID>, ID extends Serializable> {\n\t/**\n\t * 获得指定节点下所有归档\n\t *\n\t * @param list     the list\n\t * @param parentId the parent id\n\t *\n\t * @return the child tree objects\n\t */\n\tList<T> getChildTreeObjects(List<T> list, ID parentId);\n\n\t/**\n\t * 递归列表\n\t *\n\t * @param list the list\n\t * @param t    the t\n\t */\n\tvoid recursionFn(List<T> list, T t);\n\n\t/**\n\t * 获得指定节点下的所有子节点\n\t *\n\t * @param list the list\n\t * @param t    the t\n\t *\n\t * @return the child list\n\t */\n\tList<T> getChildList(List<T> list, T t);\n\n\t/**\n\t * 判断是否还有下一个子节点\n\t *\n\t * @param list the list\n\t * @param t    the t\n\t *\n\t * @return the boolean\n\t */\n\tboolean hasChild(List<T> list, T t);\n}"
  },
  {
    "path": "paascloud-common/paascloud-common-core/src/main/java/com/paascloud/core/support/SpringContextHolder.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：SpringContextHolder.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.core.support;\n\nimport org.springframework.beans.BeansException;\nimport org.springframework.beans.factory.support.DefaultListableBeanFactory;\nimport org.springframework.context.ApplicationContext;\nimport org.springframework.context.ApplicationContextAware;\nimport org.springframework.context.ConfigurableApplicationContext;\nimport org.springframework.stereotype.Component;\n\n/**\n * The class Spring context holder.\n *\n * @author paascloud.net @gmail.com\n */\n@Component\npublic class SpringContextHolder implements ApplicationContextAware {\n\n\tprivate static ApplicationContext applicationContext;\n\n\t/**\n\t * Sets application context.\n\t *\n\t * @param applicationContext the application context\n\t *\n\t * @throws BeansException the beans exception\n\t */\n\t@Override\n\tpublic void setApplicationContext(ApplicationContext applicationContext) {\n\t\tSpringContextHolder.applicationContext = applicationContext;\n\t}\n\n\t/**\n\t * Gets application context.\n\t *\n\t * @return the application context\n\t */\n\tpublic static ApplicationContext getApplicationContext() {\n\t\tassertApplicationContext();\n\t\treturn applicationContext;\n\t}\n\n\t/**\n\t * Gets bean.\n\t *\n\t * @param <T>      the type parameter\n\t * @param beanName the bean name\n\t *\n\t * @return the bean\n\t */\n\tpublic static <T> T getBean(String beanName) {\n\t\tassertApplicationContext();\n\t\treturn (T) applicationContext.getBean(beanName);\n\t}\n\n\t/**\n\t * Gets bean.\n\t *\n\t * @param <T>          the type parameter\n\t * @param requiredType the required type\n\t *\n\t * @return the bean\n\t */\n\tpublic static <T> T getBean(Class<T> requiredType) {\n\t\tassertApplicationContext();\n\t\treturn applicationContext.getBean(requiredType);\n\t}\n\n\tpublic static DefaultListableBeanFactory getDefaultListableBeanFactory() {\n\t\tassertApplicationContext();\n\t\treturn (DefaultListableBeanFactory) ((ConfigurableApplicationContext) applicationContext).getBeanFactory();\n\t}\n\n\tprivate static void assertApplicationContext() {\n\t\tif (SpringContextHolder.applicationContext == null) {\n\t\t\tthrow new IllegalArgumentException(\"applicationContext属性为null,请检查是否注入了SpringContextHolder!\");\n\t\t}\n\t}\n\n}\n"
  },
  {
    "path": "paascloud-common/paascloud-common-core/src/main/java/com/paascloud/core/support/TreeUtils.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：TreeUtils.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.core.support;\n\n\nimport com.paascloud.base.dto.BaseTree;\n\nimport java.io.Serializable;\n\n/**\n * The class Tree utils.\n *\n * @author paascloud.net @gmail.com\n */\npublic class TreeUtils<T extends BaseTree<T, ID>, ID extends Serializable> extends AbstractTreeService<T, ID> {\n\n}\n"
  },
  {
    "path": "paascloud-common/paascloud-common-core/src/main/java/com/paascloud/core/utils/CustomSystemUtil.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：CustomSystemUtil.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.core.utils;\n\nimport lombok.AccessLevel;\nimport lombok.NoArgsConstructor;\n\nimport java.net.Inet4Address;\nimport java.net.InetAddress;\nimport java.net.NetworkInterface;\nimport java.util.Enumeration;\n\n/**\n * 系统工具类，用于获取系统相关信息\n *\n * @author paascloud.net @gmail.com\n */\n@NoArgsConstructor(access = AccessLevel.PRIVATE)\npublic class CustomSystemUtil {\n\t/**\n\t * 内网IP\n\t */\n\tprivate static String INTRANET_IP = getIntranetIp();\n\n\t/**\n\t * 外网IP\n\t */\n\tprivate static String INTERNET_IP = getInternetIp();\n\n\t/**\n\t * 获得内网IP\n\t *\n\t * @return 内网IP\n\t */\n\tprivate static String getIntranetIp() {\n\t\ttry {\n\t\t\treturn InetAddress.getLocalHost().getHostAddress();\n\t\t} catch (Exception e) {\n\t\t\tthrow new RuntimeException(e);\n\t\t}\n\t}\n\n\t/**\n\t * 获得外网IP\n\t *\n\t * @return 外网IP\n\t */\n\tprivate static String getInternetIp() {\n\t\ttry {\n\t\t\tEnumeration<NetworkInterface> networks = NetworkInterface.getNetworkInterfaces();\n\t\t\tInetAddress ip;\n\t\t\tEnumeration<InetAddress> addrs;\n\t\t\twhile (networks.hasMoreElements()) {\n\t\t\t\taddrs = networks.nextElement().getInetAddresses();\n\t\t\t\twhile (addrs.hasMoreElements()) {\n\t\t\t\t\tip = addrs.nextElement();\n\t\t\t\t\tif (ip != null\n\t\t\t\t\t\t\t&& ip instanceof Inet4Address\n\t\t\t\t\t\t\t&& ip.isSiteLocalAddress()\n\t\t\t\t\t\t\t&& !ip.getHostAddress().equals(INTRANET_IP)) {\n\t\t\t\t\t\treturn ip.getHostAddress();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// 如果没有外网IP，就返回内网IP\n\t\t\treturn INTRANET_IP;\n\t\t} catch (Exception e) {\n\t\t\tthrow new RuntimeException(e);\n\t\t}\n\t}\n}"
  },
  {
    "path": "paascloud-common/paascloud-common-core/src/main/java/com/paascloud/core/utils/RequestUtil.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：RequestUtil.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.core.utils;\n\nimport com.paascloud.PublicUtil;\nimport com.paascloud.ThreadLocalMap;\nimport com.paascloud.base.constant.GlobalConstant;\nimport com.paascloud.base.dto.LoginAuthDto;\nimport com.paascloud.base.enums.ErrorCodeEnum;\nimport com.paascloud.base.exception.BusinessException;\nimport lombok.AccessLevel;\nimport lombok.NoArgsConstructor;\nimport lombok.extern.slf4j.Slf4j;\nimport org.apache.commons.lang.StringUtils;\nimport org.springframework.http.HttpHeaders;\nimport org.springframework.security.authentication.BadCredentialsException;\nimport org.springframework.security.crypto.codec.Base64;\nimport org.springframework.web.context.request.RequestContextHolder;\nimport org.springframework.web.context.request.ServletRequestAttributes;\n\nimport javax.servlet.http.HttpServletRequest;\nimport java.io.IOException;\nimport java.net.InetAddress;\nimport java.net.UnknownHostException;\n\n/**\n * The class Request util.\n *\n * @author paascloud.net@gmail.com\n */\n@Slf4j\n@NoArgsConstructor(access = AccessLevel.PRIVATE)\npublic class RequestUtil {\n\n\t/**\n\t * Gets request.\n\t *\n\t * @return the request\n\t */\n\tpublic static HttpServletRequest getRequest() {\n\t\treturn ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();\n\t}\n\n\t/**\n\t * 获得用户远程地址\n\t *\n\t * @param request the request\n\t *\n\t * @return the string\n\t */\n\tpublic static String getRemoteAddr(HttpServletRequest request) {\n\t\tString ipAddress = request.getHeader(GlobalConstant.X_REAL_IP);\n\t\tif (StringUtils.isEmpty(ipAddress) || GlobalConstant.UNKNOWN.equalsIgnoreCase(ipAddress)) {\n\t\t\tipAddress = request.getHeader(GlobalConstant.X_FORWARDED_FOR);\n\t\t}\n\t\tif (StringUtils.isEmpty(ipAddress) || GlobalConstant.UNKNOWN.equalsIgnoreCase(ipAddress)) {\n\t\t\tipAddress = request.getHeader(GlobalConstant.PROXY_CLIENT_IP);\n\t\t}\n\t\tif (StringUtils.isEmpty(ipAddress) || GlobalConstant.UNKNOWN.equalsIgnoreCase(ipAddress)) {\n\t\t\tipAddress = request.getHeader(GlobalConstant.WL_PROXY_CLIENT_IP);\n\t\t}\n\t\tif (StringUtils.isEmpty(ipAddress) || GlobalConstant.UNKNOWN.equalsIgnoreCase(ipAddress)) {\n\t\t\tipAddress = request.getHeader(GlobalConstant.HTTP_CLIENT_IP);\n\t\t}\n\t\tif (StringUtils.isEmpty(ipAddress) || GlobalConstant.UNKNOWN.equalsIgnoreCase(ipAddress)) {\n\t\t\tipAddress = request.getHeader(GlobalConstant.HTTP_X_FORWARDED_FOR);\n\t\t}\n\t\tif (StringUtils.isEmpty(ipAddress) || GlobalConstant.UNKNOWN.equalsIgnoreCase(ipAddress)) {\n\t\t\tipAddress = request.getRemoteAddr();\n\t\t}\n\t\tif (StringUtils.isEmpty(ipAddress) || GlobalConstant.UNKNOWN.equalsIgnoreCase(ipAddress)) {\n\t\t\tipAddress = request.getRemoteAddr();\n\t\t\tif (GlobalConstant.LOCALHOST_IP.equals(ipAddress) || GlobalConstant.LOCALHOST_IP_16.equals(ipAddress)) {\n\t\t\t\t//根据网卡取本机配置的IP\n\t\t\t\tInetAddress inet = null;\n\t\t\t\ttry {\n\t\t\t\t\tinet = InetAddress.getLocalHost();\n\t\t\t\t} catch (UnknownHostException e) {\n\t\t\t\t\tlog.error(\"获取IP地址, 出现异常={}\", e.getMessage(), e);\n\t\t\t\t}\n\t\t\t\tassert inet != null;\n\t\t\t\tipAddress = inet.getHostAddress();\n\t\t\t}\n\t\t\tlog.info(\"获取IP地址 ipAddress={}\", ipAddress);\n\t\t}\n\t\t// 对于通过多个代理的情况, 第一个IP为客户端真实IP,多个IP按照','分割 //\"***.***.***.***\".length() = 15\n\t\tif (ipAddress != null && ipAddress.length() > GlobalConstant.MAX_IP_LENGTH) {\n\t\t\tif (ipAddress.indexOf(GlobalConstant.Symbol.COMMA) > 0) {\n\t\t\t\tipAddress = ipAddress.substring(0, ipAddress.indexOf(GlobalConstant.Symbol.COMMA));\n\t\t\t}\n\t\t}\n\t\treturn ipAddress;\n\t}\n\n\t/**\n\t * Gets login user.\n\t *\n\t * @return the login user\n\t */\n\tpublic static LoginAuthDto getLoginUser() {\n\t\tLoginAuthDto loginAuthDto = (LoginAuthDto) ThreadLocalMap.get(GlobalConstant.Sys.TOKEN_AUTH_DTO);\n\t\tif (PublicUtil.isEmpty(loginAuthDto)) {\n\t\t\tthrow new BusinessException(ErrorCodeEnum.UAC10011039);\n\t\t}\n\t\treturn loginAuthDto;\n\n\t}\n\n\t/**\n\t * Gets auth header.\n\t *\n\t * @param request the request\n\t *\n\t * @return the auth header\n\t */\n\tpublic static String getAuthHeader(HttpServletRequest request) {\n\n\t\tString authHeader = request.getHeader(HttpHeaders.AUTHORIZATION);\n\t\tif (org.apache.commons.lang.StringUtils.isEmpty(authHeader)) {\n\t\t\tthrow new BusinessException(ErrorCodeEnum.UAC10011040);\n\t\t}\n\t\treturn authHeader;\n\t}\n\n\tpublic static String[] extractAndDecodeHeader(String header) throws IOException {\n\n\t\tbyte[] base64Token = header.substring(6).getBytes(\"UTF-8\");\n\t\tbyte[] decoded;\n\t\ttry {\n\t\t\tdecoded = Base64.decode(base64Token);\n\t\t} catch (IllegalArgumentException e) {\n\t\t\tthrow new BadCredentialsException(\"Failed to decode basic authentication token\");\n\t\t}\n\n\t\tString token = new String(decoded, \"UTF-8\");\n\n\t\tint delim = token.indexOf(GlobalConstant.Symbol.MH);\n\n\t\tif (delim == -1) {\n\t\t\tthrow new BadCredentialsException(\"Invalid basic authentication token\");\n\t\t}\n\t\treturn new String[]{token.substring(0, delim), token.substring(delim + 1)};\n\t}\n}\n"
  },
  {
    "path": "paascloud-common/paascloud-common-core/src/main/java/com/paascloud/core/utils/SessionRegistryCenterConfiguration.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：SessionRegistryCenterConfiguration.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.core.utils;\n\nimport com.paascloud.config.properties.ZookeeperProperties;\nimport lombok.AccessLevel;\nimport lombok.NoArgsConstructor;\n\n/**\n * 注册中心配置的会话声明周期.\n *\n * @author zhangliang\n */\n@NoArgsConstructor(access = AccessLevel.PRIVATE)\npublic final class SessionRegistryCenterConfiguration {\n\n\tprivate static ZookeeperProperties regCenterConfig;\n\n\t/**\n\t * 从当前会话范围获取注册中心配置.\n\t *\n\t * @return 事件追踪数据源配置\n\t */\n\tpublic static ZookeeperProperties getRegistryCenterConfiguration() {\n\t\treturn regCenterConfig;\n\t}\n\n\t/**\n\t * 设置注册中心配置至当前会话范围.\n\t *\n\t * @param regCenterConfig 注册中心配置\n\t */\n\tpublic static void setRegistryCenterConfiguration(final ZookeeperProperties regCenterConfig) {\n\t\tSessionRegistryCenterConfiguration.regCenterConfig = regCenterConfig;\n\t}\n}\n"
  },
  {
    "path": "paascloud-common/paascloud-common-core/src/main/java/com/paascloud/core/utils/TokenCache.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：TokenCache.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.core.utils;\n\nimport com.google.common.cache.CacheBuilder;\nimport com.google.common.cache.CacheLoader;\nimport com.google.common.cache.LoadingCache;\nimport lombok.AccessLevel;\nimport lombok.NoArgsConstructor;\nimport lombok.extern.slf4j.Slf4j;\n\nimport java.util.concurrent.TimeUnit;\n\n/**\n * The class Token cache.\n *\n * @author paascloud.net@gmail.com\n */\n@Slf4j\n@NoArgsConstructor(access = AccessLevel.PRIVATE)\npublic class TokenCache {\n\n\tpublic static final String NULL = \"null\";\n\n\t/**\n\t * LRU算法\n\t */\n\tprivate static LoadingCache<String, String> localCache = CacheBuilder.newBuilder().initialCapacity(1000).maximumSize(10000).expireAfterAccess(12, TimeUnit.HOURS)\n\t\t\t.build(new CacheLoader<String, String>() {\n\t\t\t\t//默认的数据加载实现,当调用get取值的时候,如果key没有对应的值,就调用这个方法进行加载.\n\t\t\t\t@Override\n\t\t\t\tpublic String load(String s) {\n\t\t\t\t\treturn \"null\";\n\t\t\t\t}\n\t\t\t});\n\n\t/**\n\t * Set key.\n\t *\n\t * @param key   the key\n\t * @param value the value\n\t */\n\tpublic static void setKey(String key, String value) {\n\t\tlocalCache.put(key, value);\n\t}\n\n\t/**\n\t * Get key string.\n\t *\n\t * @param key the key\n\t *\n\t * @return the string\n\t */\n\tpublic static String getKey(String key) {\n\t\tString value;\n\t\ttry {\n\t\t\tvalue = localCache.get(key);\n\t\t\tif (NULL.equals(value)) {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\treturn value;\n\t\t} catch (Exception e) {\n\t\t\tlog.error(\"localCache get error\", e);\n\t\t}\n\t\treturn null;\n\t}\n}\n"
  },
  {
    "path": "paascloud-common/paascloud-common-core/src/main/resources/META-INF/spring.factories",
    "content": "# Auto Configure\norg.springframework.boot.autoconfigure.EnableAutoConfiguration=\\\ncom.paascloud.core.config.CoreConfiguration"
  },
  {
    "path": "paascloud-common/paascloud-common-core/src/test/java/.gitkeep",
    "content": ""
  },
  {
    "path": "paascloud-common/paascloud-common-core/src/test/java/IdTest.java",
    "content": "import com.paascloud.core.generator.IncrementIdGenerator;\nimport com.paascloud.core.generator.UniqueIdGenerator;\nimport lombok.extern.slf4j.Slf4j;\n\nimport java.util.Collections;\nimport java.util.HashSet;\nimport java.util.concurrent.ExecutorService;\nimport java.util.concurrent.Executors;\nimport java.util.concurrent.TimeUnit;\n\n/**\n * The class Id test.\n * @author paascloud.net@gmail.com\n */\n@Slf4j\npublic class IdTest {\n\n\t/**\n\t * The entry point of application.\n\t *\n\t * @param args the input arguments\n\t *\n\t * @throws InterruptedException the interrupted exception\n\t */\n\tpublic static void main(String[] args) throws InterruptedException {\n\t\tUniqueIdGenerator instance = UniqueIdGenerator.getInstance(IncrementIdGenerator.getServiceId());\n\t\tExecutorService es = Executors.newFixedThreadPool(10);\n        final HashSet idSet = new HashSet();\n        Collections.synchronizedCollection(idSet);\n        long start = System.currentTimeMillis();\n\t\tlog.info(\" start generate id *\");\n        for (int i = 0; i < 10; i++)\n            es.execute(() -> {\n                for (long j = 0; j < 5000000; j++) {\n                    long id = instance.nextId();\n                    synchronized (idSet) {\n                        idSet.add(id);\n                    }\n                }\n            });\n        es.shutdown();\n        es.awaitTermination(10, TimeUnit.SECONDS);\n        long end = System.currentTimeMillis();\n        log.info(\" end generate id \");\n\t\tlog.info(\"* cost \" + (end - start) + \" ms!\");\n    }\n}\n"
  },
  {
    "path": "paascloud-common/paascloud-common-util/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\"\n         xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n         xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n    <parent>\n        <groupId>com.liuzm.paascloud.common</groupId>\n        <artifactId>paascloud-common</artifactId>\n        <version>1.0</version>\n    </parent>\n    <modelVersion>4.0.0</modelVersion>\n\n    <artifactId>paascloud-common-util</artifactId>\n    <dependencies>\n        <dependency>\n            <groupId>com.fasterxml.jackson.core</groupId>\n            <artifactId>jackson-annotations</artifactId>\n            <version>2.8.5</version>\n        </dependency>\n        <dependency>\n            <groupId>com.fasterxml.jackson.core</groupId>\n            <artifactId>jackson-databind</artifactId>\n            <version>2.8.7</version>\n        </dependency>\n        <dependency>\n            <groupId>org.apache.commons</groupId>\n            <artifactId>commons-lang3</artifactId>\n        </dependency>\n\n        <dependency>\n            <groupId>ch.qos.logback</groupId>\n            <artifactId>logback-classic</artifactId>\n        </dependency>\n\n        <dependency>\n            <groupId>commons-codec</groupId>\n            <artifactId>commons-codec</artifactId>\n        </dependency>\n\n        <dependency>\n            <groupId>org.codehaus.jackson</groupId>\n            <artifactId>jackson-smile</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.codehaus.jackson</groupId>\n            <artifactId>jackson-core-asl</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.codehaus.jackson</groupId>\n            <artifactId>jackson-mapper-asl</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>com.xiaoleilu</groupId>\n            <artifactId>hutool-all</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>commons-beanutils</groupId>\n            <artifactId>commons-beanutils</artifactId>\n            <version>1.9.3</version>\n        </dependency>\n      <dependency>\n        <groupId>com.google.guava</groupId>\n        <artifactId>guava</artifactId>\n      </dependency>\n    </dependencies>\n\n\n</project>"
  },
  {
    "path": "paascloud-common/paascloud-common-util/src/main/java/com/paascloud/BigDecimalUtil.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：BigDecimalUtil.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud;\n\nimport lombok.AccessLevel;\nimport lombok.NoArgsConstructor;\n\nimport java.math.BigDecimal;\n\n/**\n * The class Big decimal util.\n *\n * @author paascloud.net@gmail.com\n */\n@NoArgsConstructor(access = AccessLevel.PRIVATE)\npublic class BigDecimalUtil {\n\n\t/**\n\t * Add big decimal.\n\t *\n\t * @param v1 the v 1\n\t * @param v2 the v 2\n\t *\n\t * @return the big decimal\n\t */\n\tpublic static BigDecimal add(double v1, double v2) {\n\t\tBigDecimal b1 = new BigDecimal(Double.toString(v1));\n\t\tBigDecimal b2 = new BigDecimal(Double.toString(v2));\n\t\treturn b1.add(b2);\n\t}\n\n\t/**\n\t * Sub big decimal.\n\t *\n\t * @param v1 the v 1\n\t * @param v2 the v 2\n\t *\n\t * @return the big decimal\n\t */\n\tpublic static BigDecimal sub(double v1, double v2) {\n\t\tBigDecimal b1 = new BigDecimal(Double.toString(v1));\n\t\tBigDecimal b2 = new BigDecimal(Double.toString(v2));\n\t\treturn b1.subtract(b2);\n\t}\n\n\n\t/**\n\t * Mul big decimal.\n\t *\n\t * @param v1 the v 1\n\t * @param v2 the v 2\n\t *\n\t * @return the big decimal\n\t */\n\tpublic static BigDecimal mul(double v1, double v2) {\n\t\tBigDecimal b1 = new BigDecimal(Double.toString(v1));\n\t\tBigDecimal b2 = new BigDecimal(Double.toString(v2));\n\t\treturn b1.multiply(b2);\n\t}\n\n\t/**\n\t * Div big decimal.\n\t *\n\t * @param v1 the v 1\n\t * @param v2 the v 2\n\t *\n\t * @return the big decimal\n\t */\n\tpublic static BigDecimal div(double v1, double v2) {\n\t\tBigDecimal b1 = new BigDecimal(Double.toString(v1));\n\t\tBigDecimal b2 = new BigDecimal(Double.toString(v2));\n\t\treturn b1.divide(b2, 2, BigDecimal.ROUND_HALF_UP);\n\t}\n\n}\n"
  },
  {
    "path": "paascloud-common/paascloud-common-util/src/main/java/com/paascloud/Collections3.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：Collections3.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud;\n\nimport lombok.AccessLevel;\nimport lombok.NoArgsConstructor;\n\nimport java.util.ArrayList;\nimport java.util.Collection;\nimport java.util.List;\n\n/**\n * The class Collections 3.\n *\n * @author paascloud.net@gmail.com\n */\n@NoArgsConstructor(access = AccessLevel.PRIVATE)\npublic class Collections3 {\n\n\t/**\n\t * 返回a+b的新List.\n\t *\n\t * @param <T> the type parameter\n\t * @param a   the a\n\t * @param b   the b\n\t *\n\t * @return the list\n\t */\n\tpublic static <T> List<T> union(final Collection<T> a, final Collection<T> b) {\n\t\tList<T> result = new ArrayList<>(a);\n\t\tresult.addAll(b);\n\t\treturn result;\n\t}\n\n\t/**\n\t * 返回a-b的新List.\n\t *\n\t * @param <T> the type parameter\n\t * @param a   the a\n\t * @param b   the b\n\t *\n\t * @return the list\n\t */\n\tpublic static <T> List<T> subtract(final Collection<T> a, final Collection<T> b) {\n\t\tList<T> list = new ArrayList<>(a);\n\t\tfor (T element : b) {\n\t\t\tlist.remove(element);\n\t\t}\n\n\t\treturn list;\n\t}\n\n\t/**\n\t * 返回a与b的交集的新List.\n\t *\n\t * @param <T> the type parameter\n\t * @param a   the a\n\t * @param b   the b\n\t *\n\t * @return the list\n\t */\n\tpublic static <T> List<T> intersection(Collection<T> a, Collection<T> b) {\n\t\tList<T> list = new ArrayList<>();\n\n\t\tfor (T element : a) {\n\t\t\tif (b.contains(element)) {\n\t\t\t\tlist.add(element);\n\t\t\t}\n\t\t}\n\t\treturn list;\n\t}\n}\n"
  },
  {
    "path": "paascloud-common/paascloud-common-util/src/main/java/com/paascloud/DateUtil.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：DateUtil.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud;\n\n\nimport com.xiaoleilu.hutool.date.DateField;\nimport lombok.AccessLevel;\nimport lombok.NoArgsConstructor;\n\nimport java.util.Date;\n\n/**\n * The class Date util.\n *\n * @author paascloud.net @gmail.com\n */\n@NoArgsConstructor(access = AccessLevel.PRIVATE)\npublic class DateUtil {\n\n\t/**\n\t * 获取系统前时间.\n\t *\n\t * @param minute the minute\n\t *\n\t * @return the before time[yyyy-MM-dd HH:mm:ss]\n\t */\n\tpublic static String getBeforeTime(int minute) {\n\t\tDate newDate = com.xiaoleilu.hutool.date.DateUtil.offset(new Date(), DateField.MINUTE, -minute);\n\t\treturn com.xiaoleilu.hutool.date.DateUtil.formatDateTime(newDate);\n\t}\n}\n"
  },
  {
    "path": "paascloud-common/paascloud-common-util/src/main/java/com/paascloud/HttpAesUtil.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：HttpAesUtil.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud;\n\nimport com.paascloud.exception.HttpAesException;\nimport lombok.AccessLevel;\nimport lombok.NoArgsConstructor;\nimport lombok.extern.slf4j.Slf4j;\nimport sun.misc.BASE64Decoder;\nimport sun.misc.BASE64Encoder;\n\nimport javax.crypto.Cipher;\nimport javax.crypto.spec.IvParameterSpec;\nimport javax.crypto.spec.SecretKeySpec;\nimport java.security.MessageDigest;\n\n/**\n * The class Http aes util.\n *\n * @author paascloud.net@gmail.com\n */\n@Slf4j\n@NoArgsConstructor(access = AccessLevel.PRIVATE)\npublic class HttpAesUtil {\n\n\tprivate static final String CHAR_SET = \"UTF-8\";\n\n\t/**\n\t * 加密\n\t *\n\t * @param contentParam 需要加密的内容\n\t * @param keyParam     加密密码\n\t * @param md5Key       是否对key进行md5加密\n\t * @param ivParam      加密向量\n\t *\n\t * @return 加密后的字节数据 string\n\t */\n\tpublic static String encrypt(String contentParam, String keyParam, boolean md5Key, String ivParam) {\n\t\ttry {\n\t\t\tbyte[] content = contentParam.getBytes(CHAR_SET);\n\t\t\tbyte[] key = keyParam.getBytes(CHAR_SET);\n\t\t\tbyte[] iv = ivParam.getBytes(CHAR_SET);\n\n\t\t\tif (md5Key) {\n\t\t\t\tMessageDigest md = MessageDigest.getInstance(\"MD5\");\n\t\t\t\tkey = md.digest(key);\n\t\t\t}\n\t\t\tSecretKeySpec skeySpec = new SecretKeySpec(key, \"AES\");\n\t\t\t//\"算法/模式/补码方式\"\n\t\t\tCipher cipher = Cipher.getInstance(\"AES/CBC/ISO10126Padding\");\n\t\t\t//使用CBC模式, 需要一个向量iv, 可增加加密算法的强度\n\t\t\tIvParameterSpec ivps = new IvParameterSpec(iv);\n\t\t\tcipher.init(Cipher.ENCRYPT_MODE, skeySpec, ivps);\n\t\t\tbyte[] bytes = cipher.doFinal(content);\n\t\t\treturn new BASE64Encoder().encode(bytes);\n\t\t} catch (Exception ex) {\n\t\t\tlog.error(\"加密密码失败\", ex);\n\t\t\tthrow new HttpAesException(\"加密失败\");\n\t\t}\n\t}\n\n\t/**\n\t * 解密\n\t *\n\t * @param contentParam 需要加密的内容\n\t * @param keyParam     加密密码\n\t * @param md5Key       是否对key进行md5加密\n\t * @param ivParam      加密向量\n\t *\n\t * @return string\n\t */\n\tpublic static String decrypt(String contentParam, String keyParam, boolean md5Key, String ivParam) {\n\t\ttry {\n\t\t\tif (PubUtils.isNull(contentParam, keyParam, md5Key, ivParam)) {\n\t\t\t\treturn \"\";\n\t\t\t}\n\t\t\tbyte[] content = new BASE64Decoder().decodeBuffer(contentParam);\n\t\t\tbyte[] key = keyParam.getBytes(CHAR_SET);\n\t\t\tbyte[] iv = ivParam.getBytes(CHAR_SET);\n\n\t\t\tif (md5Key) {\n\t\t\t\tMessageDigest md = MessageDigest.getInstance(\"MD5\");\n\t\t\t\tkey = md.digest(key);\n\t\t\t}\n\t\t\tSecretKeySpec skeySpec = new SecretKeySpec(key, \"AES\");\n\t\t\t//\"算法/模式/补码方式\"\n\t\t\tCipher cipher = Cipher.getInstance(\"AES/CBC/ISO10126Padding\");\n\t\t\t//使用CBC模式, 需要一个向量iv, 可增加加密算法的强度\n\t\t\tIvParameterSpec ivps = new IvParameterSpec(iv);\n\t\t\tcipher.init(Cipher.DECRYPT_MODE, skeySpec, ivps);\n\t\t\tbyte[] bytes = cipher.doFinal(content);\n\t\t\treturn new String(bytes, CHAR_SET);\n\t\t} catch (Exception ex) {\n\t\t\tlog.error(\"解密密码失败\", ex);\n\t\t\tthrow new HttpAesException(\"解密失败\");\n\t\t}\n\t}\n}"
  },
  {
    "path": "paascloud-common/paascloud-common-util/src/main/java/com/paascloud/JacksonUtil.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：JacksonUtil.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud;\n\nimport com.google.common.base.Preconditions;\nimport lombok.AccessLevel;\nimport lombok.NoArgsConstructor;\nimport org.apache.commons.lang3.StringUtils;\nimport org.codehaus.jackson.map.DeserializationConfig.Feature;\nimport org.codehaus.jackson.map.ObjectMapper;\nimport org.codehaus.jackson.map.SerializationConfig;\nimport org.codehaus.jackson.type.JavaType;\nimport org.codehaus.jackson.type.TypeReference;\n\nimport java.io.IOException;\nimport java.text.SimpleDateFormat;\n\n/**\n * Jackson Json 工具类\n *\n * @author ligang @gmail.com\n */\n@NoArgsConstructor(access = AccessLevel.PRIVATE)\npublic class JacksonUtil {\n\n\tprivate static ObjectMapper defaultMapper;\n\tprivate static ObjectMapper formatedMapper;\n\n\tstatic {\n\t\t// 默认的ObjectMapper\n\t\tdefaultMapper = new ObjectMapper();\n\t\t// 设置输入时忽略在JSON字符串中存在但Java对象实际没有的属性\n\t\tdefaultMapper.configure(Feature.FAIL_ON_UNKNOWN_PROPERTIES, false);\n\n\t\tformatedMapper = new ObjectMapper();\n\t\t// 设置输入时忽略在JSON字符串中存在但Java对象实际没有的属性\n\t\tformatedMapper.configure(Feature.FAIL_ON_UNKNOWN_PROPERTIES, false);\n\t\t// 所有日期格式都统一为固定格式\n\t\tformatedMapper.setDateFormat(new SimpleDateFormat(\"yyyy-MM-dd HH:mm:ss\"));\n\t\tformatedMapper.configure(SerializationConfig.Feature.WRITE_DATES_AS_TIMESTAMPS, false);\n\t}\n\n\t/**\n\t * 将对象转化为json数据\n\t *\n\t * @param obj the obj\n\t *\n\t * @return string string\n\t *\n\t * @throws IOException the io exception\n\t */\n\tpublic static String toJson(Object obj) throws IOException {\n\t\tPreconditions.checkArgument(obj != null, \"this argument is required; it must not be null\");\n\t\treturn defaultMapper.writeValueAsString(obj);\n\t}\n\n\t/**\n\t * json数据转化为对象(Class)\n\t * User u = JacksonUtil.parseJson(jsonValue, User.class);\n\t * User[] arr = JacksonUtil.parseJson(jsonValue, User[].class);\n\t *\n\t * @param <T>       the type parameter\n\t * @param jsonValue the json value\n\t * @param valueType the value type\n\t *\n\t * @return t t\n\t *\n\t * @throws IOException the io exception\n\t */\n\tpublic static <T> T parseJson(String jsonValue, Class<T> valueType) throws IOException {\n\t\tPreconditions.checkArgument(StringUtils.isNotEmpty(jsonValue), \"this argument is required; it must not be null\");\n\t\treturn defaultMapper.readValue(jsonValue, valueType);\n\t}\n\n\t/**\n\t * json数据转化为对象(JavaType)\n\t *\n\t * @param <T>       the type parameter\n\t * @param jsonValue the json value\n\t * @param valueType the value type\n\t *\n\t * @return t t\n\t *\n\t * @throws IOException the io exception\n\t */\n\t@SuppressWarnings(\"unchecked\")\n\tpublic static <T> T parseJson(String jsonValue, JavaType valueType) throws IOException {\n\t\tPreconditions.checkArgument(StringUtils.isNotEmpty(jsonValue), \"this argument is required; it must not be null\");\n\t\treturn (T) defaultMapper.readValue(jsonValue, valueType);\n\t}\n\n\t/**\n\t * json数据转化为对象(TypeReference)\n\t *\n\t * @param <T>          the type parameter\n\t * @param jsonValue    the json value\n\t * @param valueTypeRef the value type ref\n\t *\n\t * @return t t\n\t *\n\t * @throws IOException the io exception\n\t */\n\tpublic static <T> T parseJson(String jsonValue, TypeReference<T> valueTypeRef) throws IOException {\n\t\tPreconditions.checkArgument(StringUtils.isNotEmpty(jsonValue), \"this argument is required; it must not be null\");\n\t\treturn (T) defaultMapper.readValue(jsonValue, valueTypeRef);\n\t}\n\n\t/**\n\t * 将对象转化为json数据(时间转换格式： \"yyyy-MM-dd HH:mm:ss\")\n\t *\n\t * @param obj the obj\n\t *\n\t * @return string string\n\t *\n\t * @throws IOException the io exception\n\t */\n\tpublic static String toJsonWithFormat(Object obj) throws IOException {\n\t\tPreconditions.checkArgument(obj != null, \"this argument is required; it must not be null\");\n\t\treturn formatedMapper.writeValueAsString(obj);\n\t}\n\n\t/**\n\t * json数据转化为对象(时间转换格式： \"yyyy-MM-dd HH:mm:ss\")\n\t * User u = JacksonUtil.parseJsonWithFormat(jsonValue, User.class);\n\t * User[] arr = JacksonUtil.parseJsonWithFormat(jsonValue, User[].class);\n\t *\n\t * @param <T>       the type parameter\n\t * @param jsonValue the json value\n\t * @param valueType the value type\n\t *\n\t * @return t t\n\t *\n\t * @throws IOException the io exception\n\t */\n\tpublic static <T> T parseJsonWithFormat(String jsonValue, Class<T> valueType) throws IOException {\n\t\tPreconditions.checkArgument(StringUtils.isNotEmpty(jsonValue), \"this argument is required; it must not be null\");\n\t\treturn formatedMapper.readValue(jsonValue, valueType);\n\t}\n\n\t/**\n\t * json数据转化为对象(JavaType)\n\t *\n\t * @param <T>       the type parameter\n\t * @param jsonValue the json value\n\t * @param valueType the value type\n\t *\n\t * @return t t\n\t *\n\t * @throws IOException the io exception\n\t */\n\tpublic static <T> T parseJsonWithFormat(String jsonValue, JavaType valueType) throws IOException {\n\t\tPreconditions.checkArgument(StringUtils.isNotEmpty(jsonValue), \"this argument is required; it must not be null\");\n\t\treturn (T) formatedMapper.readValue(jsonValue, valueType);\n\t}\n\n\t/**\n\t * json数据转化为对象(TypeReference)\n\t *\n\t * @param <T>          the type parameter\n\t * @param jsonValue    the json value\n\t * @param valueTypeRef the value type ref\n\t *\n\t * @return t t\n\t *\n\t * @throws IOException the io exception\n\t */\n\tpublic static <T> T parseJsonWithFormat(String jsonValue, TypeReference<T> valueTypeRef) throws IOException {\n\t\tPreconditions.checkArgument(StringUtils.isNotEmpty(jsonValue), \"jsonValue is not null\");\n\t\treturn (T) formatedMapper.readValue(jsonValue, valueTypeRef);\n\t}\n\n}\n"
  },
  {
    "path": "paascloud-common/paascloud-common-util/src/main/java/com/paascloud/PubUtils.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：PubUtils.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud;\n\nimport lombok.AccessLevel;\nimport lombok.NoArgsConstructor;\n\nimport java.util.Collection;\nimport java.util.UUID;\n\n/**\n * The class Pub utils.\n *\n * @author paascloud.net@gmail.com\n */\n@NoArgsConstructor(access = AccessLevel.PRIVATE)\npublic class PubUtils {\n\t/**\n\t * The constant STRING_NULL.\n\t */\n\tprivate final static String STRING_NULL = \"-\";\n\t/**\n\t * 匹配手机号码, 支持+86和86开头\n\t */\n\tprivate static final String REGX_MOBILENUM = \"^((\\\\+86)|(86))?(13|15|17|18)\\\\d{9}$\";\n\n\t/**\n\t * 匹配邮箱帐号\n\t */\n\tprivate static final String REGX_EMAIL = \"\\\\w+([-+.]\\\\w+)*@\\\\w+([-.]\\\\w+)*\\\\.\\\\w+([-.]\\\\w+)*\";\n\n\t/**\n\t * 匹配手机号码（先支持13, 15, 17, 18开头的手机号码）.\n\t *\n\t * @param inputStr the input str\n\t *\n\t * @return the boolean\n\t */\n\tpublic static Boolean isMobileNumber(String inputStr) {\n\t\treturn !PubUtils.isNull(inputStr) && inputStr.matches(REGX_MOBILENUM);\n\t}\n\n\t/**\n\t * 判断一个或多个对象是否为空\n\t *\n\t * @param values 可变参数, 要判断的一个或多个对象\n\t *\n\t * @return 只有要判断的一个对象都为空则返回true, 否则返回false boolean\n\t */\n\tpublic static boolean isNull(Object... values) {\n\t\tif (!PubUtils.isNotNullAndNotEmpty(values)) {\n\t\t\treturn true;\n\t\t}\n\t\tfor (Object value : values) {\n\t\t\tboolean flag;\n\t\t\tif (value instanceof Object[]) {\n\t\t\t\tflag = !isNotNullAndNotEmpty((Object[]) value);\n\t\t\t} else if (value instanceof Collection<?>) {\n\t\t\t\tflag = !isNotNullAndNotEmpty((Collection<?>) value);\n\t\t\t} else if (value instanceof String) {\n\t\t\t\tflag = isOEmptyOrNull(value);\n\t\t\t} else {\n\t\t\t\tflag = (null == value);\n\t\t\t}\n\t\t\tif (flag) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t\treturn false;\n\t}\n\n\t/**\n\t * Is o empty or null boolean.\n\t *\n\t * @param o the o\n\t *\n\t * @return boolean boolean\n\t */\n\tprivate static boolean isOEmptyOrNull(Object o) {\n\t\treturn o == null || isSEmptyOrNull(o.toString());\n\t}\n\n\t/**\n\t * Is s empty or null boolean.\n\t *\n\t * @param s the s\n\t *\n\t * @return boolean boolean\n\t */\n\tprivate static boolean isSEmptyOrNull(String s) {\n\t\treturn trimAndNullAsEmpty(s).length() <= 0;\n\t}\n\n\t/**\n\t * Trim and null as empty string.\n\t *\n\t * @param s the s\n\t *\n\t * @return java.lang.String string\n\t */\n\tprivate static String trimAndNullAsEmpty(String s) {\n\t\tif (s != null && !s.trim().equals(STRING_NULL)) {\n\t\t\treturn s.trim();\n\t\t} else {\n\t\t\treturn \"\";\n\t\t}\n\t\t// return s == null ? \"\" : s.trim();\n\t}\n\n\t/**\n\t * 判断对象数组是否为空并且数量大于0\n\t *\n\t * @param value the value\n\t *\n\t * @return boolean\n\t */\n\tprivate static Boolean isNotNullAndNotEmpty(Object[] value) {\n\t\tboolean bl = false;\n\t\tif (null != value && 0 < value.length) {\n\t\t\tbl = true;\n\t\t}\n\t\treturn bl;\n\t}\n\n\t/**\n\t * 判断对象集合（List,Set）是否为空并且数量大于0\n\t *\n\t * @param value the value\n\t *\n\t * @return boolean\n\t */\n\tprivate static Boolean isNotNullAndNotEmpty(Collection<?> value) {\n\t\tboolean bl = false;\n\t\tif (null != value && !value.isEmpty()) {\n\t\t\tbl = true;\n\t\t}\n\t\treturn bl;\n\t}\n\n\t/**\n\t * Is email boolean.\n\t *\n\t * @param str the str\n\t *\n\t * @return the boolean\n\t */\n\tpublic static boolean isEmail(String str) {\n\t\tboolean bl = true;\n\t\tif (isSEmptyOrNull(str) || !str.matches(REGX_EMAIL)) {\n\t\t\tbl = false;\n\t\t}\n\t\treturn bl;\n\t}\n\n\t/**\n\t * Uuid string.\n\t *\n\t * @return the string\n\t */\n\tpublic synchronized static String uuid() {\n\t\treturn UUID.randomUUID().toString().replace(\"-\", \"\");\n\t}\n}\n"
  },
  {
    "path": "paascloud-common/paascloud-common-util/src/main/java/com/paascloud/PublicUtil.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：PublicUtil.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud;\n\nimport lombok.AccessLevel;\nimport lombok.NoArgsConstructor;\n\nimport java.util.Collection;\nimport java.util.Map;\n\n/**\n * The class Public util.\n *\n * @author paascloud.net@gmail.com\n */\n@NoArgsConstructor(access = AccessLevel.PRIVATE)\npublic class PublicUtil {\n\n\t/**\n\t * 判断对象是否Empty(null或元素为0)\n\t * 实用于对如下对象做判断:String Collection及其子类 Map及其子类\n\t *\n\t * @param pObj 待检查对象\n\t *\n\t * @return boolean 返回的布尔值\n\t */\n\tpublic static boolean isEmpty(Object pObj) {\n\t\tif (pObj == null) {\n\t\t\treturn true;\n\t\t}\n\t\tif (pObj == \"\") {\n\t\t\treturn true;\n\t\t}\n\t\tif (pObj instanceof String) {\n\t\t\treturn ((String) pObj).length() == 0;\n\t\t} else if (pObj instanceof Collection) {\n\t\t\treturn ((Collection) pObj).isEmpty();\n\t\t} else if (pObj instanceof Map) {\n\t\t\treturn ((Map) pObj).size() == 0;\n\t\t}\n\t\treturn false;\n\t}\n\n\t/**\n\t * 判断对象是否为NotEmpty(!null或元素大于0)\n\t * 实用于对如下对象做判断:String Collection及其子类 Map及其子类\n\t *\n\t * @param pObj 待检查对象\n\t *\n\t * @return boolean 返回的布尔值\n\t */\n\tpublic static boolean isNotEmpty(Object pObj) {\n\t\tif (pObj == null) {\n\t\t\treturn false;\n\t\t}\n\t\tif (pObj == \"\") {\n\t\t\treturn false;\n\t\t}\n\t\tif (pObj instanceof String) {\n\t\t\treturn ((String) pObj).length() != 0;\n\t\t} else if (pObj instanceof Collection) {\n\t\t\treturn !((Collection) pObj).isEmpty();\n\t\t} else if (pObj instanceof Map) {\n\t\t\treturn ((Map) pObj).size() != 0;\n\t\t}\n\t\treturn true;\n\t}\n\n}\n"
  },
  {
    "path": "paascloud-common/paascloud-common-util/src/main/java/com/paascloud/RandomUtil.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：RandomUtil.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud;\n\nimport lombok.AccessLevel;\nimport lombok.NoArgsConstructor;\n\nimport java.util.Random;\n\n/**\n * The class Random util.\n *\n * @author paascloud.net@gmail.com\n */\n@NoArgsConstructor(access = AccessLevel.PRIVATE)\npublic class RandomUtil {\n\n\tprivate static final int MAX_LENGTH = 50;\n\n\t/**\n\t * 生成一个随机验证码 大小写字母+数字\n\t *\n\t * @param length the length\n\t *\n\t * @return 随机验证码 string\n\t */\n\tpublic static String createComplexCode(int length) {\n\n\t\tif (length > MAX_LENGTH) {\n\t\t\tlength = MAX_LENGTH;\n\t\t}\n\n\t\tRandom r = new Random();\n\n\t\tStringBuilder code = new StringBuilder();\n\n\t\twhile (true) {\n\t\t\tif (code.length() == length) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tint tmp = r.nextInt(127);\n\t\t\tif (tmp < 33 || tmp == 92 || tmp == 47 || tmp == 34) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tchar x = (char) (tmp);\n\t\t\tif (code.toString().indexOf(x) > 0) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tcode.append(x);\n\t\t}\n\n\t\treturn code.toString();\n\t}\n\n\t/**\n\t * Create number code string.\n\t *\n\t * @param length the length\n\t *\n\t * @return the string\n\t */\n\tpublic static String createNumberCode(int length) {\n\t\treturn randomString(\"0123456789\", length);\n\t}\n\n\tprivate static String randomString(String baseString, int length) {\n\t\tRandom random = new Random();\n\t\tStringBuilder sb = new StringBuilder();\n\t\tif (length < 1) {\n\t\t\tlength = 1;\n\t\t}\n\n\t\tint baseLength = baseString.length();\n\n\t\tfor (int i = 0; i < length; ++i) {\n\t\t\tint number = random.nextInt(baseLength);\n\t\t\tsb.append(baseString.charAt(number));\n\t\t}\n\n\t\treturn sb.toString();\n\t}\n}\n"
  },
  {
    "path": "paascloud-common/paascloud-common-util/src/main/java/com/paascloud/RecursionTreeUtil.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：RecursionTreeUtil.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud;\n\n\nimport lombok.AccessLevel;\nimport lombok.NoArgsConstructor;\n\nimport java.util.ArrayList;\nimport java.util.List;\nimport java.util.Objects;\n\n/**\n * The class Recursion tree util.\n *\n * @author paascloud.net@gmail.com\n */\n@NoArgsConstructor(access = AccessLevel.PRIVATE)\npublic class RecursionTreeUtil {\n\t/**\n\t * Gets child tree nodes.\n\t *\n\t * @param list     the list\n\t * @param parentId the parent id\n\t *\n\t * @return the child tree nodes\n\t */\n\tpublic static List<TreeNode> getChildTreeNodes(List<TreeNode> list, Long parentId) {\n\t\tList<TreeNode> returnList = new ArrayList<>();\n\n\t\tfor (TreeNode treeNode : list) {\n\t\t\tif (treeNode.getPid() == null) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (Objects.equals(treeNode.getPid(), parentId)) {\n\t\t\t\trecursionFn(list, treeNode);\n\t\t\t\treturnList.add(treeNode);\n\t\t\t}\n\t\t}\n\t\treturn returnList;\n\t}\n\n\t/**\n\t * 递归列表\n\t */\n\tprivate static void recursionFn(List<TreeNode> list, TreeNode node) {\n\t\tList<TreeNode> childList = getChildList(list, node);\n\t\tif (PublicUtil.isEmpty(childList)) {\n\t\t\treturn;\n\t\t}\n\t\tnode.setChildren(childList);\n\t\tfor (TreeNode tChild : childList) {\n\t\t\trecursionFn(list, tChild);\n\t\t}\n\t}\n\n\t/**\n\t * 得到子节点列表\n\t */\n\tprivate static List<TreeNode> getChildList(List<TreeNode> list, TreeNode t) {\n\t\tList<TreeNode> tList = new ArrayList<>();\n\n\t\tfor (TreeNode treeNode : list) {\n\t\t\tif (PublicUtil.isEmpty(treeNode.getPid())) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (Objects.equals(treeNode.getPid(), t.getId())) {\n\t\t\t\ttList.add(treeNode);\n\t\t\t}\n\t\t}\n\t\treturn tList;\n\t}\n}\n"
  },
  {
    "path": "paascloud-common/paascloud-common-util/src/main/java/com/paascloud/RedisKeyUtil.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：RedisKeyUtil.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud;\n\nimport com.google.common.base.Preconditions;\nimport lombok.AccessLevel;\nimport lombok.NoArgsConstructor;\nimport org.apache.commons.lang3.StringUtils;\n\n/**\n * The class Redis key util.\n *\n * @author paascloud.net@gmail.com\n */\n@NoArgsConstructor(access = AccessLevel.PRIVATE)\npublic class RedisKeyUtil {\n\n\t/**\n\t * The constant RESET_PWD_TOKEN_KEY.\n\t */\n\tprivate static final String RESET_PWD_TOKEN_KEY = \"paascloud:restPwd\";\n\tprivate static final String ACTIVE_USER = \"paascloud:activeUser\";\n\tprivate static final String SEND_SMS_COUNT = \"paascloud:sms:count\";\n\tprivate static final String SEND_EMAIL_CODE = \"paascloud:email:code\";\n\tprivate static final String ACCESS_TOKEN = \"paascloud:token:accessToken\";\n\tprivate static final String UPLOAD_FILE_SIZE = \"paascloud:file:upload_file_size\";\n\tprivate static final int REF_NO_MAX_LENGTH = 100;\n\n\t/**\n\t * Gets reset pwd token key.\n\t *\n\t * @param resetPwdKey the rest pwd key\n\t *\n\t * @return the reset pwd token key\n\t */\n\tpublic static String getResetPwdTokenKey(String resetPwdKey) {\n\t\tPreconditions.checkArgument(StringUtils.isNotEmpty(resetPwdKey), \"参数不能为空\");\n\t\treturn RESET_PWD_TOKEN_KEY + \":\" + resetPwdKey;\n\n\t}\n\n\tpublic static String getSendEmailCodeKey(String loginName, String email) {\n\t\tPreconditions.checkArgument(StringUtils.isNotEmpty(loginName), \"Email不能为空\");\n\t\tPreconditions.checkArgument(StringUtils.isNotEmpty(email), \"用户名不能为空\");\n\t\treturn SEND_EMAIL_CODE + \":\" + loginName + email;\n\n\t}\n\n\t/**\n\t * Gets active user key.\n\t *\n\t * @param activeToken the active token\n\t *\n\t * @return the active user key\n\t */\n\tpublic static String getActiveUserKey(String activeToken) {\n\t\tPreconditions.checkArgument(StringUtils.isNotEmpty(activeToken), \"参数不能为空\");\n\t\treturn ACTIVE_USER + \":\" + activeToken;\n\n\t}\n\n\t/**\n\t * Gets send sms count key.\n\t *\n\t * @param ipAddr the ip addr\n\t * @param type   mobile;ip;total\n\t *\n\t * @return the send sms count key\n\t */\n\tpublic static String getSendSmsCountKey(String ipAddr, String type) {\n\t\tPreconditions.checkArgument(StringUtils.isNotEmpty(ipAddr), \"请不要篡改IP地址\");\n\t\treturn SEND_SMS_COUNT + \":\" + type + \":\" + ipAddr;\n\n\t}\n\n\n\t/**\n\t * Gets send sms rate key.\n\t *\n\t * @param ipAddr the ip addr\n\t *\n\t * @return the send sms rate key\n\t */\n\tpublic static String getSendSmsRateKey(String ipAddr) {\n\t\tPreconditions.checkArgument(StringUtils.isNotEmpty(ipAddr), \"请不要篡改IP地址\");\n\t\treturn SEND_SMS_COUNT + \":\" + ipAddr;\n\n\t}\n\n\tpublic static String getAccessTokenKey(String token) {\n\t\tPreconditions.checkArgument(StringUtils.isNotEmpty(token), \"非法请求token参数不存在\");\n\t\treturn ACCESS_TOKEN + \":\" + token;\n\t}\n\n\tpublic static String createMqKey(String topic, String tag, String refNo, String body) {\n\t\tString temp = refNo;\n\t\tPreconditions.checkArgument(StringUtils.isNotEmpty(topic), \"topic is null\");\n\t\tPreconditions.checkArgument(StringUtils.isNotEmpty(tag), \"tag is null\");\n\t\tPreconditions.checkArgument(StringUtils.isNotEmpty(refNo), \"refNo is null\");\n\t\tPreconditions.checkArgument(StringUtils.isNotEmpty(body), \"body is null\");\n\n\t\tif (refNo.length() > REF_NO_MAX_LENGTH) {\n\t\t\ttemp = StringUtils.substring(refNo, 0, REF_NO_MAX_LENGTH) + \"...\";\n\t\t}\n\t\treturn topic + \"_\" + tag + \"_\" + temp + \"-\" + body.hashCode();\n\t}\n\n\tpublic static String getFileSizeKey() {\n\t\treturn UPLOAD_FILE_SIZE;\n\t}\n}\n"
  },
  {
    "path": "paascloud-common/paascloud-common-util/src/main/java/com/paascloud/ThreadLocalMap.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：ThreadLocalMap.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud;\n\nimport lombok.AccessLevel;\nimport lombok.NoArgsConstructor;\n\nimport java.util.HashMap;\nimport java.util.Map;\n\n\n/**\n * The class Thread local map.\n *\n * @author paascloud.net@gmail.com\n */\n@NoArgsConstructor(access = AccessLevel.PRIVATE)\npublic class ThreadLocalMap {\n\t/**\n\t * The constant threadContext.\n\t */\n\tprivate final static ThreadLocal<Map<String, Object>> THREAD_CONTEXT = new MapThreadLocal();\n\n\t/**\n\t * Put.\n\t *\n\t * @param key   the key\n\t * @param value the value\n\t */\n\tpublic static void put(String key, Object value) {\n\t\tgetContextMap().put(key, value);\n\t}\n\n\t/**\n\t * Remove object.\n\t *\n\t * @param key the key\n\t *\n\t * @return the object\n\t */\n\tpublic static Object remove(String key) {\n\t\treturn getContextMap().remove(key);\n\t}\n\n\t/**\n\t * Get object.\n\t *\n\t * @param key the key\n\t *\n\t * @return the object\n\t */\n\tpublic static Object get(String key) {\n\t\treturn getContextMap().get(key);\n\t}\n\n\tprivate static class MapThreadLocal extends ThreadLocal<Map<String, Object>> {\n\t\t/**\n\t\t * Initial value map.\n\t\t *\n\t\t * @return the map\n\t\t */\n\t\t@Override\n\t\tprotected Map<String, Object> initialValue() {\n\t\t\treturn new HashMap<String, Object>(8) {\n\n\t\t\t\tprivate static final long serialVersionUID = 3637958959138295593L;\n\n\t\t\t\t@Override\n\t\t\t\tpublic Object put(String key, Object value) {\n\t\t\t\t\treturn super.put(key, value);\n\t\t\t\t}\n\t\t\t};\n\t\t}\n\t}\n\n\t/**\n\t * 取得thread context Map的实例。\n\t *\n\t * @return thread context Map的实例\n\t */\n\tprivate static Map<String, Object> getContextMap() {\n\t\treturn THREAD_CONTEXT.get();\n\t}\n\n\t/**\n\t * 清理线程所有被hold住的对象。以便重用！\n\t */\n\tpublic static void remove() {\n\t\tgetContextMap().clear();\n\t}\n}"
  },
  {
    "path": "paascloud-common/paascloud-common-util/src/main/java/com/paascloud/TreeNode.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：TreeNode.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud;\n\nimport lombok.Data;\n\nimport java.util.List;\n\n/**\n * The class Tree node.\n *\n * @author paascloud.net@gmail.com\n */\n@Data\npublic class TreeNode {\n\t/**\n\t * 节点编码\n\t */\n\tprivate String nodeCode;\n\t/**\n\t * 节点名称\n\t */\n\tprivate String nodeName;\n\t/**\n\t * ID\n\t */\n\tprivate Long id;\n\t/**\n\t * 父ID\n\t */\n\tprivate Long pid;\n\t/**\n\t * 孩子节点信息\n\t */\n\tprivate List<TreeNode> children;\n\n}\n"
  },
  {
    "path": "paascloud-common/paascloud-common-util/src/main/java/com/paascloud/UrlUtil.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：UrlUtil.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud;\n\nimport lombok.extern.slf4j.Slf4j;\n\nimport java.io.UnsupportedEncodingException;\n\n/**\n * url转码、解码\n *\n * @author paascloud.net @gmail.com\n */\n@Slf4j\npublic class UrlUtil {\n\tprivate final static String ENCODE = \"GBK\";\n\n\t/**\n\t * URL 解码\n\t */\n\tpublic static String getURLDecoderString(String str) {\n\t\tString result = \"\";\n\t\tif (null == str) {\n\t\t\treturn \"\";\n\t\t}\n\t\ttry {\n\t\t\tresult = java.net.URLDecoder.decode(str, ENCODE);\n\t\t} catch (UnsupportedEncodingException e) {\n\t\t\tlog.error(\"URL解码失败 ex={}\", e.getMessage(), e);\n\t\t}\n\t\treturn result;\n\t}\n\n\t/**\n\t * URL 转码\n\t */\n\tpublic static String getURLEncoderString(String str) {\n\t\tString result = \"\";\n\t\tif (null == str) {\n\t\t\treturn \"\";\n\t\t}\n\t\ttry {\n\t\t\tresult = java.net.URLEncoder.encode(str, ENCODE);\n\t\t} catch (UnsupportedEncodingException e) {\n\t\t\tlog.error(\"URL转码失败 ex={}\", e.getMessage(), e);\n\t\t}\n\t\treturn result;\n\t}\n}"
  },
  {
    "path": "paascloud-common/paascloud-common-util/src/main/java/com/paascloud/ValidateUtil.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：ValidateUtil.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud;\n\n\nimport lombok.AccessLevel;\nimport lombok.NoArgsConstructor;\nimport org.apache.commons.lang3.StringUtils;\n\nimport java.util.regex.Matcher;\nimport java.util.regex.Pattern;\n\n/**\n * The class Validate util.\n *\n * @author paascloud.net @gmail.com\n */\n@NoArgsConstructor(access = AccessLevel.PRIVATE)\npublic class ValidateUtil {\n\t/**\n\t * 校验手机号码是否合法.\n\t *\n\t * @param mobile the mobile\n\t *\n\t * @return the boolean\n\t */\n\tpublic static boolean isMobileNumber(final String mobile) {\n\t\tif (StringUtils.isEmpty(mobile)) {\n\t\t\treturn false;\n\t\t}\n\t\tfinal String reg = \"^((\\\\+?86)|(\\\\(\\\\+86\\\\)))?(13[0-9][0-9]{8}|14[0-9]{9}|15[0-9][0-9]{8}|17[0-9][0-9]{8}|18[0-9][0-9]{8})$\";\n\t\tPattern pattern = Pattern.compile(reg);\n\t\tMatcher matcher = pattern.matcher(mobile);\n\t\treturn matcher.matches();\n\t}\n\n\n}\n"
  },
  {
    "path": "paascloud-common/paascloud-common-util/src/main/java/com/paascloud/annotation/NoNeedAccessAuthentication.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：NoNeedAccessAuthentication.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.annotation;\n\nimport java.lang.annotation.ElementType;\nimport java.lang.annotation.Retention;\nimport java.lang.annotation.RetentionPolicy;\nimport java.lang.annotation.Target;\n\n\n/**\n * The interface No need access authentication.\n *\n * @author paascloud.net @gmail.com\n */\n@Target(ElementType.METHOD)\n@Retention(RetentionPolicy.RUNTIME)\npublic @interface NoNeedAccessAuthentication {\n\n}\n"
  },
  {
    "path": "paascloud-common/paascloud-common-util/src/main/java/com/paascloud/exception/HttpAesException.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：HttpAesException.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.exception;\n\n\n/**\n * The class Http aes exception.\n *\n * @author paascloud.net @gmail.com\n */\npublic class HttpAesException extends IllegalArgumentException {\n\tprivate static final long serialVersionUID = -2489600753056921095L;\n\n\t/**\n\t * Instantiates a new Http aes exception.\n\t *\n\t * @param message the message\n\t */\n\tpublic HttpAesException(String message) {\n\t\tsuper(message);\n\t}\n\n\t/**\n\t * Instantiates a new Http aes exception.\n\t */\n\tpublic HttpAesException() {\n\n\t}\n}\n"
  },
  {
    "path": "paascloud-common/paascloud-common-util/src/main/java/com/paascloud/helper/LongJsonDeserializer.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：LongJsonDeserializer.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.helper;\n\nimport com.fasterxml.jackson.core.JsonParser;\nimport com.fasterxml.jackson.databind.DeserializationContext;\nimport com.fasterxml.jackson.databind.JsonDeserializer;\nimport lombok.extern.slf4j.Slf4j;\n\nimport java.io.IOException;\n\n/**\n * 将字符串转为Long\n *\n * @author paascloud.net@gmail.com\n */\n@Slf4j\npublic class LongJsonDeserializer extends JsonDeserializer<Long> {\n\n\t/**\n\t * Deserialize long.\n\t *\n\t * @param jsonParser             the json parser\n\t * @param deserializationContext the deserialization context\n\t *\n\t * @return the long\n\t */\n\t@Override\n\tpublic Long deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) {\n\t\tString value = null;\n\t\ttry {\n\t\t\tvalue = jsonParser.getText();\n\t\t} catch (IOException e) {\n\t\t\tlog.error(\"deserialize={}\", e.getMessage(), e);\n\t\t}\n\t\ttry {\n\t\t\treturn value == null ? null : Long.parseLong(value);\n\t\t} catch (NumberFormatException e) {\n\t\t\tlog.error(\"解析长整形错误\", e);\n\t\t\treturn null;\n\t\t}\n\t}\n}"
  },
  {
    "path": "paascloud-common/paascloud-common-util/src/main/java/com/paascloud/helper/LongJsonSerializer.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：LongJsonSerializer.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.helper;\n\n\nimport com.fasterxml.jackson.core.JsonGenerator;\nimport com.fasterxml.jackson.databind.JsonSerializer;\nimport com.fasterxml.jackson.databind.SerializerProvider;\n\nimport java.io.IOException;\n\n/**\n * Long 类型字段序列化时转为字符串，避免js丢失精度\n *\n * @author paascloud.net@gmail.com\n */\npublic class LongJsonSerializer extends JsonSerializer<Long> {\n\t/**\n\t * Serialize.\n\t *\n\t * @param value              the value\n\t * @param jsonGenerator      the json generator\n\t * @param serializerProvider the serializer provider\n\t *\n\t * @throws IOException the io exception\n\t */\n\t@Override\n\tpublic void serialize(Long value, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {\n\t\tString text = (value == null ? null : String.valueOf(value));\n\t\tif (text != null) {\n\t\t\tjsonGenerator.writeString(text);\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "paascloud-common/paascloud-common-util/src/main/java/com/paascloud/page/PageUtil.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：PageUtil.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.page;\n\nimport lombok.Data;\n\n\n/**\n * The class Page util.\n *\n * @author paascloud.net@gmail.com\n */\n@Data\npublic class PageUtil {\n\n\t/**\n\t * The cur page.当前页\n\t */\n\tprivate int currentPage = 1;\n\n\t/**\n\t * The next page.下一页\n\t */\n\tprivate int nextPage;\n\n\t/**\n\t * The pre page. 上一页\n\t */\n\tprivate int prePage;\n\n\t/**\n\t * The total row. 总条数\n\t */\n\tprivate int totalRow;\n\n\t/**\n\t * The page size.每页条数\n\t */\n\tprivate int pageSize = 10;\n\n\t/**\n\t * The total page.总页数\n\t */\n\tprivate int totalPage;\n\n\t/**\n\t * The start. 开始条数\n\t */\n\tprivate int start;\n\n\t/**\n\t * The buttons.\n\t */\n\tprivate int[] buttons;\n\n\t/**\n\t * 当前页条数\n\t */\n\tprivate int curPageSize;\n\n\t/**\n\t * Instantiates a new page util.\n\t */\n\tpublic PageUtil() {\n\n\t}\n\n\t/**\n\t * Instantiates a new page util.\n\t *\n\t * @param currentPage the current page\n\t */\n\tpublic PageUtil(int currentPage) {\n\t\tthis.currentPage = currentPage;\n\t}\n\n\t/**\n\t * Instantiates a new page util.\n\t *\n\t * @param currentPage the current page\n\t * @param pageSize    the page size\n\t */\n\tpublic PageUtil(int currentPage, int pageSize) {\n\t\tthis.currentPage = currentPage;\n\t\tthis.pageSize = pageSize;\n\t}\n\n}\n"
  },
  {
    "path": "paascloud-common/paascloud-common-util/src/main/java/com/paascloud/page/Query.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：Query.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.page;\n\nimport lombok.Data;\n\nimport java.io.Serializable;\n\n/**\n * The class Query.\n *\n * @author paascloud.net@gmail.com\n */\n@Data\npublic class Query implements Serializable {\n\tprivate static final long serialVersionUID = 8933019121780323520L;\n\t/**\n\t * 当前页\n\t */\n\tprivate int pageNum = 1;\n\t/**\n\t * 每页的数量\n\t */\n\tprivate int pageSize = 20;\n}\n"
  },
  {
    "path": "paascloud-common/paascloud-common-util/src/main/java/com/paascloud/wrapper/PageWrapMapper.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：PageWrapMapper.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.wrapper;\n\n\nimport com.paascloud.page.PageUtil;\n\n/**\n * The class Page wrap mapper.\n *\n * @author paascloud.net@gmail.com\n */\npublic class PageWrapMapper {\n\n\t/**\n\t * Instantiates a new page wrap mapper.\n\t */\n\tprivate PageWrapMapper() {\n\t}\n\n\tprivate static <E> PageWrapper<E> wrap(int code, String message, E o, PageUtil pageUtil) {\n\t\treturn new PageWrapper<E>(code, message, o, pageUtil);\n\t}\n\n\t/**\n\t * Wrap data with default code=200.\n\t *\n\t * @param <E>      the type parameter\n\t * @param o        the o\n\t * @param pageUtil the page util\n\t *\n\t * @return the page wrapper\n\t */\n\tpublic static <E> PageWrapper<E> wrap(E o, PageUtil pageUtil) {\n\t\treturn wrap(Wrapper.SUCCESS_CODE, Wrapper.SUCCESS_MESSAGE, o, pageUtil);\n\t}\n\n\t/**\n\t * Wrap.\n\t *\n\t * @param <E>     the type parameter\n\t * @param code    the code\n\t * @param message the message\n\t *\n\t * @return the page wrapper\n\t */\n\tpublic static <E> PageWrapper<E> wrap(int code, String message) {\n\t\treturn wrap(code, message, null, null);\n\t}\n\n\t/**\n\t * Wrap.\n\t *\n\t * @param <E>  the type parameter\n\t * @param code the code\n\t *\n\t * @return the page wrapper\n\t */\n\tpublic static <E> PageWrapper<E> wrap(int code) {\n\t\treturn wrap(code, null, null, null);\n\t}\n\n\t/**\n\t * Wrap.\n\t *\n\t * @param <E> the type parameter\n\t * @param e   the e\n\t *\n\t * @return the page wrapper\n\t */\n\tpublic static <E> PageWrapper<E> wrap(Exception e) {\n\t\treturn new PageWrapper<E>(Wrapper.ERROR_CODE, e.getMessage(), null, null);\n\t}\n\n\t/**\n\t * Un wrapper.\n\t *\n\t * @param <E>     the type parameter\n\t * @param wrapper the wrapper\n\t *\n\t * @return the e\n\t */\n\tpublic static <E> E unWrap(PageWrapper<E> wrapper) {\n\t\treturn wrapper.getResult();\n\t}\n\n\t/**\n\t * Wrap ERROR. code=100\n\t *\n\t * @param <E> the type parameter\n\t *\n\t * @return the page wrapper\n\t */\n\tpublic static <E> PageWrapper<E> illegalArgument() {\n\t\treturn wrap(Wrapper.ILLEGAL_ARGUMENT_CODE_, Wrapper.ILLEGAL_ARGUMENT_MESSAGE, null, null);\n\t}\n\n\t/**\n\t * Wrap ERROR. code=500\n\t *\n\t * @param <E> the type parameter\n\t *\n\t * @return the page wrapper\n\t */\n\tpublic static <E> PageWrapper<E> error() {\n\t\treturn wrap(Wrapper.ERROR_CODE, Wrapper.ERROR_MESSAGE, null, null);\n\t}\n\n\t/**\n\t * Wrap SUCCESS. code=200\n\t *\n\t * @param <E> the type parameter\n\t *\n\t * @return the page wrapper\n\t */\n\tpublic static <E> PageWrapper<E> ok() {\n\t\treturn new PageWrapper<E>();\n\t}\n}\n"
  },
  {
    "path": "paascloud-common/paascloud-common-util/src/main/java/com/paascloud/wrapper/PageWrapper.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：PageWrapper.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.wrapper;\n\n\nimport com.paascloud.page.PageUtil;\nimport lombok.Data;\nimport lombok.EqualsAndHashCode;\n\n/**\n * The class Page wrapper.\n *\n * @param <T> the type parameter @author paascloud.net@gmail.com\n */\n@Data\n@EqualsAndHashCode(callSuper = true)\npublic class PageWrapper<T> extends Wrapper<T> {\n\n\tprivate static final long serialVersionUID = 666985064788933395L;\n\n\tprivate PageUtil pageUtil;\n\n\n\t/**\n\t * Instantiates a new Page wrapper.\n\t */\n\tPageWrapper() {\n\t\tsuper();\n\t}\n\n\n\t/**\n\t * Instantiates a new Page wrapper.\n\t *\n\t * @param code    the code\n\t * @param message the message\n\t */\n\tpublic PageWrapper(int code, String message) {\n\t\tsuper(code, message);\n\t}\n\n\t/**\n\t * Instantiates a new pageWrapper default code=200\n\t *\n\t * @param result   the result\n\t * @param pageUtil the page util\n\t */\n\tpublic PageWrapper(T result, PageUtil pageUtil) {\n\t\tsuper();\n\t\tthis.setResult(result);\n\t\tthis.setPageUtil(pageUtil);\n\t}\n\n\t/**\n\t * Instantiates a new Page wrapper.\n\t *\n\t * @param code     the code\n\t * @param message  the message\n\t * @param result   the result\n\t * @param pageUtil the page util\n\t */\n\tPageWrapper(int code, String message, T result, PageUtil pageUtil) {\n\t\tsuper(code, message, result);\n\t\tthis.pageUtil = pageUtil;\n\t}\n\n\t/**\n\t * Sets the 分页数据 , 返回自身的引用.\n\t *\n\t * @param pageUtil the page util\n\t *\n\t * @return the page wrapper\n\t */\n\tpublic PageWrapper<T> pageUtil(PageUtil pageUtil) {\n\t\tthis.setPageUtil(pageUtil);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the 结果数据 , 返回自身的引用.\n\t *\n\t * @param result the result\n\t *\n\t * @return the page wrapper\n\t */\n\t@Override\n\tpublic PageWrapper<T> result(T result) {\n\t\tsuper.setResult(result);\n\t\treturn this;\n\t}\n}\n"
  },
  {
    "path": "paascloud-common/paascloud-common-util/src/main/java/com/paascloud/wrapper/WrapMapper.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：WrapMapper.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.wrapper;\n\nimport org.apache.commons.lang3.StringUtils;\n\n/**\n * The class Wrap mapper.\n *\n * @author paascloud.net@gmail.com\n */\npublic class WrapMapper {\n\n\t/**\n\t * Instantiates a new wrap mapper.\n\t */\n\tprivate WrapMapper() {\n\t}\n\n\t/**\n\t * Wrap.\n\t *\n\t * @param <E>     the element type\n\t * @param code    the code\n\t * @param message the message\n\t * @param o       the o\n\t *\n\t * @return the wrapper\n\t */\n\tpublic static <E> Wrapper<E> wrap(int code, String message, E o) {\n\t\treturn new Wrapper<>(code, message, o);\n\t}\n\n\t/**\n\t * Wrap.\n\t *\n\t * @param <E>     the element type\n\t * @param code    the code\n\t * @param message the message\n\t *\n\t * @return the wrapper\n\t */\n\tpublic static <E> Wrapper<E> wrap(int code, String message) {\n\t\treturn wrap(code, message, null);\n\t}\n\n\t/**\n\t * Wrap.\n\t *\n\t * @param <E>  the element type\n\t * @param code the code\n\t *\n\t * @return the wrapper\n\t */\n\tpublic static <E> Wrapper<E> wrap(int code) {\n\t\treturn wrap(code, null);\n\t}\n\n\t/**\n\t * Wrap.\n\t *\n\t * @param <E> the element type\n\t * @param e   the e\n\t *\n\t * @return the wrapper\n\t */\n\tpublic static <E> Wrapper<E> wrap(Exception e) {\n\t\treturn new Wrapper<>(Wrapper.ERROR_CODE, e.getMessage());\n\t}\n\n\t/**\n\t * Un wrapper.\n\t *\n\t * @param <E>     the element type\n\t * @param wrapper the wrapper\n\t *\n\t * @return the e\n\t */\n\tpublic static <E> E unWrap(Wrapper<E> wrapper) {\n\t\treturn wrapper.getResult();\n\t}\n\n\t/**\n\t * Wrap ERROR. code=100\n\t *\n\t * @param <E> the element type\n\t *\n\t * @return the wrapper\n\t */\n\tpublic static <E> Wrapper<E> illegalArgument() {\n\t\treturn wrap(Wrapper.ILLEGAL_ARGUMENT_CODE_, Wrapper.ILLEGAL_ARGUMENT_MESSAGE);\n\t}\n\n\t/**\n\t * Wrap ERROR. code=500\n\t *\n\t * @param <E> the element type\n\t *\n\t * @return the wrapper\n\t */\n\tpublic static <E> Wrapper<E> error() {\n\t\treturn wrap(Wrapper.ERROR_CODE, Wrapper.ERROR_MESSAGE);\n\t}\n\n\n\t/**\n\t * Error wrapper.\n\t *\n\t * @param <E>     the type parameter\n\t * @param message the message\n\t *\n\t * @return the wrapper\n\t */\n\tpublic static <E> Wrapper<E> error(String message) {\n\t\treturn wrap(Wrapper.ERROR_CODE, StringUtils.isBlank(message) ? Wrapper.ERROR_MESSAGE : message);\n\t}\n\n\t/**\n\t * Wrap SUCCESS. code=200\n\t *\n\t * @param <E> the element type\n\t *\n\t * @return the wrapper\n\t */\n\tpublic static <E> Wrapper<E> ok() {\n\t\treturn new Wrapper<>();\n\t}\n\n\t/**\n\t * Ok wrapper.\n\t *\n\t * @param <E> the type parameter\n\t * @param o   the o\n\t *\n\t * @return the wrapper\n\t */\n\tpublic static <E> Wrapper<E> ok(E o) {\n\t\treturn new Wrapper<>(Wrapper.SUCCESS_CODE, Wrapper.SUCCESS_MESSAGE, o);\n\t}\n}\n"
  },
  {
    "path": "paascloud-common/paascloud-common-util/src/main/java/com/paascloud/wrapper/Wrapper.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：Wrapper.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.wrapper;\n\nimport com.fasterxml.jackson.annotation.JsonIgnore;\nimport lombok.Data;\nimport org.codehaus.jackson.map.annotate.JsonSerialize;\n\nimport java.io.Serializable;\n\n\n/**\n * The class Wrapper.\n *\n * @param <T> the type parameter @author paascloud.net@gmail.com\n */\n@Data\n@JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL)\npublic class Wrapper<T> implements Serializable {\n\n\t/**\n\t * 序列化标识\n\t */\n\tprivate static final long serialVersionUID = 4893280118017319089L;\n\n\t/**\n\t * 成功码.\n\t */\n\tpublic static final int SUCCESS_CODE = 200;\n\n\t/**\n\t * 成功信息.\n\t */\n\tpublic static final String SUCCESS_MESSAGE = \"操作成功\";\n\n\t/**\n\t * 错误码.\n\t */\n\tpublic static final int ERROR_CODE = 500;\n\n\t/**\n\t * 错误信息.\n\t */\n\tpublic static final String ERROR_MESSAGE = \"内部异常\";\n\n\t/**\n\t * 错误码：参数非法\n\t */\n\tpublic static final int ILLEGAL_ARGUMENT_CODE_ = 100;\n\n\t/**\n\t * 错误信息：参数非法\n\t */\n\tpublic static final String ILLEGAL_ARGUMENT_MESSAGE = \"参数非法\";\n\n\t/**\n\t * 编号.\n\t */\n\tprivate int code;\n\n\t/**\n\t * 信息.\n\t */\n\tprivate String message;\n\n\t/**\n\t * 结果数据\n\t */\n\tprivate T result;\n\n\t/**\n\t * Instantiates a new wrapper. default code=200\n\t */\n\tWrapper() {\n\t\tthis(SUCCESS_CODE, SUCCESS_MESSAGE);\n\t}\n\n\t/**\n\t * Instantiates a new wrapper.\n\t *\n\t * @param code    the code\n\t * @param message the message\n\t */\n\tWrapper(int code, String message) {\n\t\tthis(code, message, null);\n\t}\n\n\t/**\n\t * Instantiates a new wrapper.\n\t *\n\t * @param code    the code\n\t * @param message the message\n\t * @param result  the result\n\t */\n\tWrapper(int code, String message, T result) {\n\t\tsuper();\n\t\tthis.code(code).message(message).result(result);\n\t}\n\n\t/**\n\t * Sets the 编号 , 返回自身的引用.\n\t *\n\t * @param code the new 编号\n\t *\n\t * @return the wrapper\n\t */\n\tprivate Wrapper<T> code(int code) {\n\t\tthis.setCode(code);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the 信息 , 返回自身的引用.\n\t *\n\t * @param message the new 信息\n\t *\n\t * @return the wrapper\n\t */\n\tprivate Wrapper<T> message(String message) {\n\t\tthis.setMessage(message);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the 结果数据 , 返回自身的引用.\n\t *\n\t * @param result the new 结果数据\n\t *\n\t * @return the wrapper\n\t */\n\tpublic Wrapper<T> result(T result) {\n\t\tthis.setResult(result);\n\t\treturn this;\n\t}\n\n\t/**\n\t * 判断是否成功： 依据 Wrapper.SUCCESS_CODE == this.code\n\t *\n\t * @return code =200,true;否则 false.\n\t */\n\t@JsonIgnore\n\tpublic boolean success() {\n\t\treturn Wrapper.SUCCESS_CODE == this.code;\n\t}\n\n\t/**\n\t * 判断是否成功： 依据 Wrapper.SUCCESS_CODE != this.code\n\t *\n\t * @return code !=200,true;否则 false.\n\t */\n\t@JsonIgnore\n\tpublic boolean error() {\n\t\treturn !success();\n\t}\n\n}\n"
  },
  {
    "path": "paascloud-common/paascloud-common-zk/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\"\n         xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n         xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n  <parent>\n    <groupId>com.liuzm.paascloud.common</groupId>\n    <artifactId>paascloud-common</artifactId>\n    <version>1.0</version>\n  </parent>\n  <modelVersion>4.0.0</modelVersion>\n  <artifactId>paascloud-common-zk</artifactId>\n  <version>1.0</version>\n  <dependencies>\n    <dependency>\n      <groupId>com.liuzm.paascloud.common</groupId>\n      <artifactId>paascloud-common-base</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>com.liuzm.paascloud.common</groupId>\n      <artifactId>paascloud-common-util</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.aspectj</groupId>\n      <artifactId>aspectjweaver</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.mybatis</groupId>\n      <artifactId>mybatis</artifactId>\n      <version>3.4.2</version>\n    </dependency>\n    <dependency>\n      <groupId>com.liuzm.paascloud.common</groupId>\n      <artifactId>paascloud-common-config</artifactId>\n      <version>1.0</version>\n    </dependency>\n    <dependency>\n      <groupId>org.apache.curator</groupId>\n      <artifactId>curator-framework</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.apache.curator</groupId>\n      <artifactId>curator-client</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.apache.curator</groupId>\n      <artifactId>curator-recipes</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>com.alibaba</groupId>\n      <artifactId>fastjson</artifactId>\n    </dependency>\n  </dependencies>\n\n\n</project>"
  },
  {
    "path": "paascloud-common/paascloud-common-zk/src/main/java/com/paascloud/core/generator/IdGenerator.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：IdGenerator.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.core.generator;\n\n/**\n * The interface Id generator.\n *\n * @author paascloud.net @gmail.com\n */\npublic interface IdGenerator {\n\n\t/**\n\t * 生成下一个ID\n\t *\n\t * @return the string\n\t */\n\tLong nextId();\n}\n"
  },
  {
    "path": "paascloud-common/paascloud-common-zk/src/main/java/com/paascloud/core/generator/IncrementIdGenerator.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：IncrementIdGenerator.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.core.generator;\n\nimport com.paascloud.base.constant.GlobalConstant;\nimport com.paascloud.core.registry.base.CoordinatorRegistryCenter;\nimport com.paascloud.core.registry.base.RegisterDto;\nimport org.apache.curator.retry.RetryNTimes;\n\n/**\n * FrameworkID 的保存器.\n *\n * @author gaohongtao\n */\npublic class IncrementIdGenerator implements IdGenerator {\n\n\tprivate static Long serviceId = null;\n\tprivate final RegisterDto registerDto;\n\n\t/**\n\t * Instantiates a new Increment id generator.\n\t *\n\t * @param registerDto the register dto\n\t */\n\tpublic IncrementIdGenerator(RegisterDto registerDto) {\n\t\tthis.registerDto = registerDto;\n\t}\n\n\t/**\n\t * Next id long.\n\t *\n\t * @return the long\n\t */\n\t@Override\n\tpublic Long nextId() {\n\t\tString app = this.registerDto.getApp();\n\t\tString host = this.registerDto.getHost();\n\t\tCoordinatorRegistryCenter regCenter = this.registerDto.getCoordinatorRegistryCenter();\n\t\tString path = GlobalConstant.ZK_REGISTRY_ID_ROOT_PATH + GlobalConstant.Symbol.SLASH + app + GlobalConstant.Symbol.SLASH + host;\n\t\tif (regCenter.isExisted(path)) {\n\t\t\t// 如果已经有该节点，表示已经为当前的host上部署的该app分配的编号（应对某个服务重启之后编号不变的问题），直接获取该id，而无需生成\n\t\t\treturn Long.valueOf(regCenter.getDirectly(GlobalConstant.ZK_REGISTRY_ID_ROOT_PATH + GlobalConstant.Symbol.SLASH + app + GlobalConstant.Symbol.SLASH + host));\n\t\t} else {\n\t\t\t// 节点不存在，那么需要生成id，利用zk节点的版本号每写一次就自增的机制来实现\n\t\t\tregCenter.increment(GlobalConstant.ZK_REGISTRY_SEQ, new RetryNTimes(2000, 3));\n\t\t\t// 生成id\n\t\t\tInteger id = regCenter.getAtomicValue(GlobalConstant.ZK_REGISTRY_SEQ, new RetryNTimes(2000, 3)).postValue();\n\t\t\t// 将数据写入节点\n\t\t\tregCenter.persist(path);\n\t\t\tregCenter.persist(path, String.valueOf(id));\n\t\t\treturn Long.valueOf(id);\n\t\t}\n\t}\n\n\t/**\n\t * Gets service id.\n\t *\n\t * @return the service id\n\t */\n\tpublic static Long getServiceId() {\n\t\treturn serviceId;\n\t}\n\n\t/**\n\t * Sets service id.\n\t *\n\t * @param serviceId the service id\n\t */\n\tpublic static void setServiceId(Long serviceId) {\n\t\tIncrementIdGenerator.serviceId = serviceId;\n\t}\n}\n"
  },
  {
    "path": "paascloud-common/paascloud-common-zk/src/main/java/com/paascloud/core/generator/UniqueIdGenerator.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：UniqueIdGenerator.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.core.generator;\n\n/**\n * 分布式唯一ID生成器\n *\n * @author paascloud.net@gmail.com\n */\npublic class UniqueIdGenerator implements IdGenerator {\n\n\t/**\n\t * 开始使用该算法的时间为: 2017-01-01 00:00:00\n\t */\n\tprivate static final long START_TIME = 1483200000000L;\n\n\t/**\n\t * worker id的bit数，最多支持8192个app和host的组合（即在N个服务器上每个服务器部署M个项目，总共部署N*M=8192）\n\t */\n\tprivate static final int APP_HOST_ID_BITS = 13;\n\t/**\n\t * 序列号，支持单节点最高1000*1024的并发\n\t */\n\tprivate final static int SEQUENCE_BITS = 10;\n\n\t/**\n\t * 最大的app host id，8091\n\t */\n\tprivate final static long MAX_APP_HOST_ID = ~(-1L << APP_HOST_ID_BITS);\n\n\t/**\n\t * 最大的序列号，1023\n\t */\n\tprivate final static long MAX_SEQUENCE = ~(-1L << SEQUENCE_BITS);\n\n\t/**\n\t * app host编号的移位\n\t */\n\tprivate final static long APP_HOST_ID_SHIFT = SEQUENCE_BITS;\n\n\t/**\n\t * 时间戳的移位\n\t */\n\tprivate final static long TIMESTAMP_LEFT_SHIFT = APP_HOST_ID_BITS + APP_HOST_ID_SHIFT;\n\n\t/**\n\t * 该项目的app host id，对应着为某台机器上的某个项目分配的serviceId（注意区分Span中的serviceId）\n\t */\n\tprivate long appHostId;\n\n\t/**\n\t * 上次生成ID的时间戳\n\t */\n\tprivate long lastTimestamp = -1L;\n\n\t/**\n\t * 当前毫秒生成的序列\n\t */\n\tprivate long sequence = 0L;\n\n\t/**\n\t * 单例\n\t */\n\tprivate static volatile UniqueIdGenerator idGen = null;\n\n\t/**\n\t * 实例化\n\t *\n\t * @param appHostId the app host id\n\t *\n\t * @return the instance\n\t */\n\tpublic static UniqueIdGenerator getInstance(long appHostId) {\n\t\tif (idGen == null) {\n\t\t\tsynchronized (UniqueIdGenerator.class) {\n\t\t\t\tif (idGen == null) {\n\t\t\t\t\tidGen = new UniqueIdGenerator(appHostId);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn idGen;\n\t}\n\n\tprivate UniqueIdGenerator(long appHostId) {\n\t\tif (appHostId > MAX_APP_HOST_ID) {\n\t\t\t// zk分配的serviceId过大(基本小规模的公司不会出现这样的问题)\n\t\t\tthrow new IllegalArgumentException(String.format(\"app host Id wrong: %d \", appHostId));\n\t\t}\n\t\tthis.appHostId = appHostId;\n\t}\n\n\t/**\n\t * 利用twitter的snowflake（做了些微修改）算法来实现\n\t *\n\t * @return the long\n\t */\n\t@Override\n\tpublic Long nextId() {\n\t\treturn this.genUniqueId();\n\t}\n\n\t/**\n\t * 生成唯一id的具体实现\n\t */\n\tprivate synchronized long genUniqueId() {\n\t\tlong current = System.currentTimeMillis();\n\n\t\tif (current < lastTimestamp) {\n\t\t\t// 如果当前时间小于上一次ID生成的时间戳，说明系统时钟回退过，出现问题返回-1\n\t\t\treturn -1;\n\t\t}\n\n\t\tif (current == lastTimestamp) {\n\t\t\t// 如果当前生成id的时间还是上次的时间，那么对sequence序列号进行+1\n\t\t\tsequence = (sequence + 1) & MAX_SEQUENCE;\n\n\t\t\tif (sequence == MAX_SEQUENCE) {\n\t\t\t\t// 当前毫秒生成的序列数已经大于最大值，那么阻塞到下一个毫秒再获取新的时间戳\n\t\t\t\tcurrent = this.nextMs(lastTimestamp);\n\t\t\t}\n\t\t} else {\n\t\t\t// 当前的时间戳已经是下一个毫秒\n\t\t\tsequence = 0L;\n\t\t}\n\n\t\t// 更新上次生成id的时间戳\n\t\tlastTimestamp = current;\n\n\t\t// 进行移位操作生成int64的唯一ID\n\t\treturn ((current - START_TIME) << TIMESTAMP_LEFT_SHIFT)\n\t\t\t\t| (this.appHostId << APP_HOST_ID_SHIFT)\n\t\t\t\t| sequence;\n\t}\n\n\t/**\n\t * 阻塞到下一个毫秒\n\t */\n\tprivate long nextMs(long timeStamp) {\n\t\tlong current = System.currentTimeMillis();\n\t\twhile (current <= timeStamp) {\n\t\t\tcurrent = System.currentTimeMillis();\n\t\t}\n\t\treturn current;\n\t}\n\n\t/**\n\t * Generate id long.\n\t *\n\t * @return the long\n\t */\n\tpublic static long generateId() {\n\t\treturn UniqueIdGenerator.getInstance(IncrementIdGenerator.getServiceId()).nextId();\n\t}\n}\n"
  },
  {
    "path": "paascloud-common/paascloud-common-zk/src/main/java/com/paascloud/core/registry/RegistryCenterFactory.java",
    "content": "package com.paascloud.core.registry;\n\nimport com.google.common.base.Charsets;\nimport com.google.common.hash.HashCode;\nimport com.google.common.hash.Hasher;\nimport com.google.common.hash.Hashing;\nimport com.paascloud.config.properties.AliyunProperties;\nimport com.paascloud.config.properties.PaascloudProperties;\nimport com.paascloud.config.properties.ZookeeperProperties;\nimport com.paascloud.core.generator.IncrementIdGenerator;\nimport com.paascloud.core.registry.base.CoordinatorRegistryCenter;\nimport com.paascloud.core.registry.base.RegisterDto;\nimport com.paascloud.core.registry.zookeeper.ZookeeperRegistryCenter;\nimport lombok.AccessLevel;\nimport lombok.NoArgsConstructor;\n\nimport java.util.concurrent.ConcurrentHashMap;\n\n/**\n * 注册中心工厂.\n *\n * @author zhangliang\n */\n@NoArgsConstructor(access = AccessLevel.PRIVATE)\npublic final class RegistryCenterFactory {\n\n\tprivate static final ConcurrentHashMap<HashCode, CoordinatorRegistryCenter> REG_CENTER_REGISTRY = new ConcurrentHashMap<>();\n\n\t/**\n\t * 创建注册中心.\n\t *\n\t * @param zookeeperProperties the zookeeper properties\n\t *\n\t * @return 注册中心对象 coordinator registry center\n\t */\n\tpublic static CoordinatorRegistryCenter createCoordinatorRegistryCenter(ZookeeperProperties zookeeperProperties) {\n\t\tHasher hasher = Hashing.md5().newHasher().putString(zookeeperProperties.getZkAddressList(), Charsets.UTF_8);\n\t\tHashCode hashCode = hasher.hash();\n\t\tCoordinatorRegistryCenter result = REG_CENTER_REGISTRY.get(hashCode);\n\t\tif (null != result) {\n\t\t\treturn result;\n\t\t}\n\t\tresult = new ZookeeperRegistryCenter(zookeeperProperties);\n\t\tresult.init();\n\t\tREG_CENTER_REGISTRY.put(hashCode, result);\n\t\treturn result;\n\t}\n\n\t/**\n\t * Startup.\n\t *\n\t * @param paascloudProperties the paascloud properties\n\t * @param host                the host\n\t * @param app                 the app\n\t */\n\tpublic static void startup(PaascloudProperties paascloudProperties, String host, String app) {\n\t\tCoordinatorRegistryCenter coordinatorRegistryCenter = createCoordinatorRegistryCenter(paascloudProperties.getZk());\n\t\tRegisterDto dto = new RegisterDto(app, host, coordinatorRegistryCenter);\n\t\tLong serviceId = new IncrementIdGenerator(dto).nextId();\n\t\tIncrementIdGenerator.setServiceId(serviceId);\n\t\tregisterMq(paascloudProperties, host, app);\n\t}\n\n\tprivate static void registerMq(PaascloudProperties paascloudProperties, String host, String app) {\n\t\tCoordinatorRegistryCenter coordinatorRegistryCenter = createCoordinatorRegistryCenter(paascloudProperties.getZk());\n\t\tAliyunProperties.RocketMqProperties rocketMq = paascloudProperties.getAliyun().getRocketMq();\n\t\tString consumerGroup = rocketMq.isReliableMessageConsumer() ? rocketMq.getConsumerGroup() : null;\n\t\tString namesrvAddr = rocketMq.getNamesrvAddr();\n\t\tString producerGroup = rocketMq.isReliableMessageProducer() ? rocketMq.getProducerGroup() : null;\n\t\tcoordinatorRegistryCenter.registerMq(app, host, producerGroup, consumerGroup, namesrvAddr);\n\t}\n}\n"
  },
  {
    "path": "paascloud-common/paascloud-common-zk/src/main/java/com/paascloud/core/registry/base/CoordinatorRegistryCenter.java",
    "content": "package com.paascloud.core.registry.base;\n\nimport java.util.List;\n\n/**\n * 用于协调分布式服务的注册中心.\n *\n * @author zhangliang\n */\npublic interface CoordinatorRegistryCenter extends RegistryCenter {\n\n\t/**\n\t * 直接从注册中心而非本地缓存获取数据.\n\t *\n\t * @param key 键\n\t *\n\t * @return 值 directly\n\t */\n\tString getDirectly(String key);\n\n\t/**\n\t * 获取子节点名称集合.\n\t *\n\t * @param key 键\n\t *\n\t * @return 子节点名称集合 children keys\n\t */\n\tList<String> getChildrenKeys(String key);\n\n\t/**\n\t * 获取子节点数量.\n\t *\n\t * @param key 键\n\t *\n\t * @return 子节点数量 num children\n\t */\n\tint getNumChildren(String key);\n\n\t/**\n\t * 持久化临时注册数据.\n\t *\n\t * @param key   键\n\t * @param value 值\n\t */\n\tvoid persistEphemeral(String key, String value);\n\n\t/**\n\t * 持久化顺序注册数据.\n\t *\n\t * @param key   键\n\t * @param value 值\n\t *\n\t * @return 包含10位顺序数字的znode名称 string\n\t */\n\tString persistSequential(String key, String value);\n\n\t/**\n\t * 持久化临时顺序注册数据.\n\t *\n\t * @param key 键\n\t */\n\tvoid persistEphemeralSequential(String key);\n\n\t/**\n\t * 添加本地缓存.\n\t *\n\t * @param cachePath 需加入缓存的路径\n\t */\n\tvoid addCacheData(String cachePath);\n\n\t/**\n\t * 释放本地缓存.\n\t *\n\t * @param cachePath 需释放缓存的路径\n\t */\n\tvoid evictCacheData(String cachePath);\n\n\t/**\n\t * 获取注册中心数据缓存对象.\n\t *\n\t * @param cachePath 缓存的节点路径\n\t *\n\t * @return 注册中心数据缓存对象 raw cache\n\t */\n\tObject getRawCache(String cachePath);\n\n\t/**\n\t * 向注册中心进行注册，生成该服务的编号并返回\n\t *\n\t * @param app           the app\n\t * @param host          the host\n\t * @param producerGroup the producer group\n\t * @param consumerGroup the consumer group\n\t * @param namesrvAddr   the namesrv addr\n\t */\n\tvoid registerMq(String app, String host, String producerGroup, String consumerGroup, String namesrvAddr);\n}\n"
  },
  {
    "path": "paascloud-common/paascloud-common-zk/src/main/java/com/paascloud/core/registry/base/RegisterDto.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：RegisterDto.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.core.registry.base;\n\nimport lombok.AllArgsConstructor;\nimport lombok.Data;\n\n/**\n * The class Register dto.\n *\n * @author paascloud.net @gmail.com\n */\n@Data\n@AllArgsConstructor\npublic class RegisterDto {\n\n\tprivate String app;\n\n\tprivate String host;\n\n\tprivate CoordinatorRegistryCenter coordinatorRegistryCenter;\n\n}\n"
  },
  {
    "path": "paascloud-common/paascloud-common-zk/src/main/java/com/paascloud/core/registry/base/RegistryCenter.java",
    "content": "package com.paascloud.core.registry.base;\n\nimport org.apache.curator.framework.recipes.atomic.AtomicValue;\nimport org.apache.curator.retry.RetryNTimes;\n\n/**\n * 注册中心.\n *\n * @author zhangliang\n */\npublic interface RegistryCenter {\n\n\t/**\n\t * 初始化注册中心.\n\t */\n\tvoid init();\n\n\t/**\n\t * 关闭注册中心.\n\t */\n\tvoid close();\n\n\t/**\n\t * 获取注册数据.\n\t *\n\t * @param key 键\n\t *\n\t * @return 值 string\n\t */\n\tString get(String key);\n\n\t/**\n\t * 获取数据是否存在.\n\t *\n\t * @param key 键\n\t *\n\t * @return 数据是否存在 boolean\n\t */\n\tboolean isExisted(String key);\n\n\t/**\n\t * 持久化注册数据.\n\t *\n\t * @param key   键\n\t * @param value 值\n\t */\n\tvoid persist(String key, String value);\n\n\t/**\n\t * 创建一个持久化节点，初始内容为空.\n\t *\n\t * @param key the key\n\t */\n\tvoid persist(String key);\n\n\t/**\n\t * 更新注册数据.\n\t *\n\t * @param key   键\n\t * @param value 值\n\t */\n\tvoid update(String key, String value);\n\n\t/**\n\t * 删除注册数据.\n\t *\n\t * @param key 键\n\t */\n\tvoid remove(String key);\n\n\t/**\n\t * 获取注册中心当前时间.\n\t *\n\t * @param key 用于获取时间的键\n\t *\n\t * @return 注册中心当前时间 registry center time\n\t */\n\tlong getRegistryCenterTime(String key);\n\n\t/**\n\t * 直接获取操作注册中心的原生客户端.\n\t * 如：Zookeeper或Redis等原生客户端.\n\t *\n\t * @return 注册中心的原生客户端 raw client\n\t */\n\tObject getRawClient();\n\n\t/**\n\t * Instantiates a new Increment.\n\t *\n\t * @param path        the path\n\t * @param retryNTimes the retry n times\n\t */\n\tvoid increment(String path, RetryNTimes retryNTimes);\n\n\t/**\n\t * Instantiates a new Get atomic value.\n\t *\n\t * @param path        the path\n\t * @param retryNTimes the retry n times\n\t *\n\t * @return the atomic value\n\t */\n\tAtomicValue<Integer> getAtomicValue(String path, RetryNTimes retryNTimes);\n}\n"
  },
  {
    "path": "paascloud-common/paascloud-common-zk/src/main/java/com/paascloud/core/registry/base/ReliableMessageRegisterDto.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：ReliableMessageRegisterDto.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.core.registry.base;\n\nimport com.google.common.base.Preconditions;\nimport lombok.Data;\nimport org.apache.commons.lang3.StringUtils;\n\n/**\n * The class Reliable message register dto.\n *\n * @author paascloud.net @gmail.com\n */\n@Data\npublic class ReliableMessageRegisterDto {\n\tprivate String consumerGroup;\n\tprivate String producerGroup;\n\tprivate String namesrvAddr;\n\n\t/**\n\t * Sets consumer group.\n\t *\n\t * @param consumerGroup the consumer group\n\t *\n\t * @return the consumer group\n\t */\n\tpublic ReliableMessageRegisterDto setConsumerGroup(final String consumerGroup) {\n\t\tPreconditions.checkArgument(StringUtils.isNotEmpty(consumerGroup), \"init zk cid is null\");\n\t\tthis.consumerGroup = consumerGroup;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets producer group.\n\t *\n\t * @param producerGroup the producer group\n\t *\n\t * @return the producer group\n\t */\n\tpublic ReliableMessageRegisterDto setProducerGroup(final String producerGroup) {\n\t\tPreconditions.checkArgument(StringUtils.isNotEmpty(producerGroup), \"init zk pid is null\");\n\t\tthis.producerGroup = producerGroup;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets namesrv addr.\n\t *\n\t * @param namesrvAddr the namesrv addr\n\t *\n\t * @return the namesrv addr\n\t */\n\tpublic ReliableMessageRegisterDto setNamesrvAddr(final String namesrvAddr) {\n\t\tPreconditions.checkArgument(StringUtils.isNotEmpty(namesrvAddr), \"init ZK namesrvAddr is null\");\n\t\tthis.namesrvAddr = namesrvAddr;\n\t\treturn this;\n\t}\n}\n"
  },
  {
    "path": "paascloud-common/paascloud-common-zk/src/main/java/com/paascloud/core/registry/exception/RegException.java",
    "content": "package com.paascloud.core.registry.exception;\n\n/**\n * 注册中心异常.\n *\n * @author zhangliang\n */\npublic final class RegException extends RuntimeException {\n\n\tprivate static final long serialVersionUID = -6417179023552012152L;\n\n\t/**\n\t * Instantiates a new Reg exception.\n\t *\n\t * @param errorMessage the error message\n\t * @param args         the args\n\t */\n\tpublic RegException(final String errorMessage, final Object... args) {\n\t\tsuper(String.format(errorMessage, args));\n\t}\n\n\t/**\n\t * Instantiates a new Reg exception.\n\t *\n\t * @param cause the cause\n\t */\n\tpublic RegException(final Exception cause) {\n\t\tsuper(cause);\n\t}\n}\n"
  },
  {
    "path": "paascloud-common/paascloud-common-zk/src/main/java/com/paascloud/core/registry/exception/RegExceptionHandler.java",
    "content": "package com.paascloud.core.registry.exception;\n\nimport lombok.AccessLevel;\nimport lombok.NoArgsConstructor;\nimport lombok.extern.slf4j.Slf4j;\nimport org.apache.zookeeper.KeeperException.NoNodeException;\nimport org.apache.zookeeper.KeeperException.NodeExistsException;\n\n/**\n * 注册中心异常处理类.\n *\n * @author zhangliang\n */\n@Slf4j\n@NoArgsConstructor(access = AccessLevel.PRIVATE)\npublic final class RegExceptionHandler {\n\n\t/**\n\t * 处理异常.\n\t * <p>\n\t * <p>处理掉中断和连接失效异常并继续抛注册中心.</p>\n\t *\n\t * @param cause 待处理异常.\n\t */\n\tpublic static void handleException(final Exception cause) {\n\t\tif (null == cause) {\n\t\t\treturn;\n\t\t}\n\t\tboolean flag = isIgnoredException(cause) || null != cause.getCause() && isIgnoredException(cause.getCause());\n\t\tif (flag) {\n\t\t\tlog.debug(\"Elastic job: ignored exception for: {}\", cause.getMessage());\n\t\t} else if (cause instanceof InterruptedException) {\n\t\t\tThread.currentThread().interrupt();\n\t\t} else {\n\t\t\tthrow new RegException(cause);\n\t\t}\n\t}\n\n\tprivate static boolean isIgnoredException(final Throwable cause) {\n\t\treturn cause instanceof NoNodeException || cause instanceof NodeExistsException;\n\t}\n}\n"
  },
  {
    "path": "paascloud-common/paascloud-common-zk/src/main/java/com/paascloud/core/registry/zookeeper/ZookeeperRegistryCenter.java",
    "content": "package com.paascloud.core.registry.zookeeper;\n\nimport com.alibaba.fastjson.JSON;\nimport com.google.common.base.Charsets;\nimport com.google.common.base.Preconditions;\nimport com.google.common.base.Strings;\nimport com.paascloud.base.constant.GlobalConstant;\nimport com.paascloud.config.properties.ZookeeperProperties;\nimport com.paascloud.core.registry.base.CoordinatorRegistryCenter;\nimport com.paascloud.core.registry.base.ReliableMessageRegisterDto;\nimport com.paascloud.core.registry.exception.RegExceptionHandler;\nimport com.xiaoleilu.hutool.date.DateUtil;\nimport lombok.AccessLevel;\nimport lombok.Getter;\nimport lombok.extern.slf4j.Slf4j;\nimport org.apache.commons.lang3.StringUtils;\nimport org.apache.curator.framework.CuratorFramework;\nimport org.apache.curator.framework.CuratorFrameworkFactory;\nimport org.apache.curator.framework.api.ACLProvider;\nimport org.apache.curator.framework.recipes.atomic.AtomicValue;\nimport org.apache.curator.framework.recipes.atomic.DistributedAtomicInteger;\nimport org.apache.curator.framework.recipes.cache.ChildData;\nimport org.apache.curator.framework.recipes.cache.TreeCache;\nimport org.apache.curator.retry.ExponentialBackoffRetry;\nimport org.apache.curator.retry.RetryNTimes;\nimport org.apache.curator.utils.CloseableUtils;\nimport org.apache.zookeeper.CreateMode;\nimport org.apache.zookeeper.KeeperException;\nimport org.apache.zookeeper.ZooDefs;\nimport org.apache.zookeeper.data.ACL;\nimport org.apache.zookeeper.data.Stat;\n\nimport java.util.*;\nimport java.util.Map.Entry;\nimport java.util.concurrent.TimeUnit;\n\n\n/**\n * 基于Zookeeper的注册中心.\n *\n * @author zhangliang\n */\n@Slf4j\npublic final class ZookeeperRegistryCenter implements CoordinatorRegistryCenter {\n\t@Getter(AccessLevel.PROTECTED)\n\tprivate ZookeeperProperties zkConfig;\n\n\tprivate final Map<String, TreeCache> caches = new HashMap<>();\n\n\t@Getter\n\tprivate CuratorFramework client;\n\t@Getter\n\tprivate DistributedAtomicInteger distributedAtomicInteger;\n\n\t/**\n\t * Instantiates a new Zookeeper registry center.\n\t *\n\t * @param zkConfig the zk config\n\t */\n\tpublic ZookeeperRegistryCenter(final ZookeeperProperties zkConfig) {\n\t\tthis.zkConfig = zkConfig;\n\t}\n\n\t/**\n\t * Init.\n\t */\n\t@Override\n\tpublic void init() {\n\t\tlog.debug(\"Elastic job: zookeeper registry center init, server lists is: {}.\", zkConfig.getZkAddressList());\n\t\tCuratorFrameworkFactory.Builder builder = CuratorFrameworkFactory.builder()\n\t\t\t\t.connectString(zkConfig.getZkAddressList())\n\t\t\t\t.retryPolicy(new ExponentialBackoffRetry(zkConfig.getBaseSleepTimeMilliseconds(), zkConfig.getMaxRetries(), zkConfig.getMaxSleepTimeMilliseconds()));\n\t\tif (0 != zkConfig.getSessionTimeoutMilliseconds()) {\n\t\t\tbuilder.sessionTimeoutMs(zkConfig.getSessionTimeoutMilliseconds());\n\t\t}\n\t\tif (0 != zkConfig.getConnectionTimeoutMilliseconds()) {\n\t\t\tbuilder.connectionTimeoutMs(zkConfig.getConnectionTimeoutMilliseconds());\n\t\t}\n\t\tif (!Strings.isNullOrEmpty(zkConfig.getDigest())) {\n\t\t\tbuilder.authorization(\"digest\", zkConfig.getDigest().getBytes(Charsets.UTF_8))\n\t\t\t\t\t.aclProvider(new ACLProvider() {\n\n\t\t\t\t\t\t@Override\n\t\t\t\t\t\tpublic List<ACL> getDefaultAcl() {\n\t\t\t\t\t\t\treturn ZooDefs.Ids.CREATOR_ALL_ACL;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t@Override\n\t\t\t\t\t\tpublic List<ACL> getAclForPath(final String path) {\n\t\t\t\t\t\t\treturn ZooDefs.Ids.CREATOR_ALL_ACL;\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t}\n\t\tclient = builder.build();\n\t\tclient.start();\n\t\ttry {\n\t\t\tif (!client.blockUntilConnected(zkConfig.getMaxSleepTimeMilliseconds() * zkConfig.getMaxRetries(), TimeUnit.MILLISECONDS)) {\n\t\t\t\tclient.close();\n\t\t\t\tthrow new KeeperException.OperationTimeoutException();\n\t\t\t}\n\n\t\t\t//CHECKSTYLE:OFF\n\t\t} catch (final Exception ex) {\n\t\t\t//CHECKSTYLE:ON\n\t\t\tRegExceptionHandler.handleException(ex);\n\t\t}\n\t}\n\n\t/**\n\t * Close.\n\t */\n\t@Override\n\tpublic void close() {\n\t\tfor (Entry<String, TreeCache> each : caches.entrySet()) {\n\t\t\teach.getValue().close();\n\t\t}\n\t\twaitForCacheClose();\n\t\tCloseableUtils.closeQuietly(client);\n\t}\n\n\t/**\n\t * 等待500ms, cache先关闭再关闭client, 否则会抛异常\n\t * 因为异步处理, 可能会导致client先关闭而cache还未关闭结束.\n\t * 等待Curator新版本解决这个bug.\n\t * BUG地址：https://issues.apache.org/jira/browse/CURATOR-157\n\t */\n\tprivate void waitForCacheClose() {\n\t\ttry {\n\t\t\tThread.sleep(500L);\n\t\t} catch (final InterruptedException ex) {\n\t\t\tThread.currentThread().interrupt();\n\t\t}\n\t}\n\n\t/**\n\t * Get string.\n\t *\n\t * @param key the key\n\t *\n\t * @return the string\n\t */\n\t@Override\n\tpublic String get(final String key) {\n\t\tTreeCache cache = findTreeCache(key);\n\t\tif (null == cache) {\n\t\t\treturn getDirectly(key);\n\t\t}\n\t\tChildData resultInCache = cache.getCurrentData(key);\n\t\tif (null != resultInCache) {\n\t\t\treturn null == resultInCache.getData() ? null : new String(resultInCache.getData(), Charsets.UTF_8);\n\t\t}\n\t\treturn getDirectly(key);\n\t}\n\n\tprivate TreeCache findTreeCache(final String key) {\n\t\tfor (Entry<String, TreeCache> entry : caches.entrySet()) {\n\t\t\tif (key.startsWith(entry.getKey())) {\n\t\t\t\treturn entry.getValue();\n\t\t\t}\n\t\t}\n\t\treturn null;\n\t}\n\n\t/**\n\t * Gets directly.\n\t *\n\t * @param key the key\n\t *\n\t * @return the directly\n\t */\n\t@Override\n\tpublic String getDirectly(final String key) {\n\t\ttry {\n\t\t\treturn new String(client.getData().forPath(key), Charsets.UTF_8);\n\t\t\t//CHECKSTYLE:OFF\n\t\t} catch (final Exception ex) {\n\t\t\t//CHECKSTYLE:ON\n\t\t\tRegExceptionHandler.handleException(ex);\n\t\t\treturn null;\n\t\t}\n\t}\n\n\t/**\n\t * Gets children keys.\n\t *\n\t * @param key the key\n\t *\n\t * @return the children keys\n\t */\n\t@Override\n\tpublic List<String> getChildrenKeys(final String key) {\n\t\ttry {\n\t\t\tList<String> result = client.getChildren().forPath(key);\n\t\t\tresult.sort(Comparator.reverseOrder());\n\t\t\treturn result;\n\t\t\t//CHECKSTYLE:OFF\n\t\t} catch (final Exception ex) {\n\t\t\t//CHECKSTYLE:ON\n\t\t\tRegExceptionHandler.handleException(ex);\n\t\t\treturn Collections.emptyList();\n\t\t}\n\t}\n\n\t/**\n\t * Gets num children.\n\t *\n\t * @param key the key\n\t *\n\t * @return the num children\n\t */\n\t@Override\n\tpublic int getNumChildren(final String key) {\n\t\tStat stat = null;\n\t\ttry {\n\t\t\tstat = client.checkExists().forPath(key);\n\t\t} catch (final Exception ex) {\n\t\t\tRegExceptionHandler.handleException(ex);\n\t\t}\n\t\treturn stat == null ? 0 : stat.getNumChildren();\n\t}\n\n\t/**\n\t * Is existed boolean.\n\t *\n\t * @param key the key\n\t *\n\t * @return the boolean\n\t */\n\t@Override\n\tpublic boolean isExisted(final String key) {\n\t\ttry {\n\t\t\treturn null != client.checkExists().forPath(key);\n\t\t\t//CHECKSTYLE:OFF\n\t\t} catch (final Exception ex) {\n\t\t\t//CHECKSTYLE:ON\n\t\t\tRegExceptionHandler.handleException(ex);\n\t\t\treturn false;\n\t\t}\n\t}\n\n\t/**\n\t * Persist.\n\t *\n\t * @param key   the key\n\t * @param value the value\n\t */\n\t@Override\n\tpublic void persist(final String key, final String value) {\n\t\ttry {\n\t\t\tif (!isExisted(key)) {\n\t\t\t\tif (null == value) {\n\t\t\t\t\tclient.create().creatingParentsIfNeeded().withMode(CreateMode.PERSISTENT).forPath(key);\n\t\t\t\t} else {\n\t\t\t\t\tclient.create().creatingParentsIfNeeded().withMode(CreateMode.PERSISTENT).forPath(key, value.getBytes(Charsets.UTF_8));\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif (null != value) {\n\t\t\t\t\tupdate(key, value);\n\t\t\t\t}\n\t\t\t}\n\t\t\t//CHECKSTYLE:OFF\n\t\t} catch (final Exception ex) {\n\t\t\t//CHECKSTYLE:ON\n\t\t\tRegExceptionHandler.handleException(ex);\n\t\t}\n\t}\n\n\t/**\n\t * Persist.\n\t *\n\t * @param key the key\n\t */\n\t@Override\n\tpublic void persist(String key) {\n\t\tthis.persist(key, null);\n\t}\n\n\t/**\n\t * Update.\n\t *\n\t * @param key   the key\n\t * @param value the value\n\t */\n\t@Override\n\tpublic void update(final String key, final String value) {\n\t\ttry {\n\t\t\tclient.inTransaction().check().forPath(key).and().setData().forPath(key, value.getBytes(Charsets.UTF_8)).and().commit();\n\t\t\t//CHECKSTYLE:OFF\n\t\t} catch (final Exception ex) {\n\t\t\t//CHECKSTYLE:ON\n\t\t\tRegExceptionHandler.handleException(ex);\n\t\t}\n\t}\n\n\t/**\n\t * Persist ephemeral.\n\t *\n\t * @param key   the key\n\t * @param value the value\n\t */\n\t@Override\n\tpublic void persistEphemeral(final String key, final String value) {\n\t\ttry {\n\t\t\tif (isExisted(key)) {\n\t\t\t\tclient.delete().deletingChildrenIfNeeded().forPath(key);\n\t\t\t}\n\t\t\tclient.create().creatingParentsIfNeeded().withMode(CreateMode.EPHEMERAL).forPath(key, value.getBytes(Charsets.UTF_8));\n\t\t\t//CHECKSTYLE:OFF\n\t\t} catch (final Exception ex) {\n\t\t\t//CHECKSTYLE:ON\n\t\t\tRegExceptionHandler.handleException(ex);\n\t\t}\n\t}\n\n\t/**\n\t * Persist sequential string.\n\t *\n\t * @param key   the key\n\t * @param value the value\n\t *\n\t * @return the string\n\t */\n\t@Override\n\tpublic String persistSequential(final String key, final String value) {\n\t\ttry {\n\t\t\treturn client.create().creatingParentsIfNeeded().withMode(CreateMode.PERSISTENT_SEQUENTIAL).forPath(key, value.getBytes(Charsets.UTF_8));\n\t\t\t//CHECKSTYLE:OFF\n\t\t} catch (final Exception ex) {\n\t\t\t//CHECKSTYLE:ON\n\t\t\tRegExceptionHandler.handleException(ex);\n\t\t}\n\t\treturn null;\n\t}\n\n\t/**\n\t * Persist ephemeral sequential.\n\t *\n\t * @param key the key\n\t */\n\t@Override\n\tpublic void persistEphemeralSequential(final String key) {\n\t\ttry {\n\t\t\tclient.create().creatingParentsIfNeeded().withMode(CreateMode.EPHEMERAL_SEQUENTIAL).forPath(key);\n\t\t\t//CHECKSTYLE:OFF\n\t\t} catch (final Exception ex) {\n\t\t\t//CHECKSTYLE:ON\n\t\t\tRegExceptionHandler.handleException(ex);\n\t\t}\n\t}\n\n\t/**\n\t * Remove.\n\t *\n\t * @param key the key\n\t */\n\t@Override\n\tpublic void remove(final String key) {\n\t\ttry {\n\t\t\tclient.delete().deletingChildrenIfNeeded().forPath(key);\n\t\t\t//CHECKSTYLE:OFF\n\t\t} catch (final Exception ex) {\n\t\t\t//CHECKSTYLE:ON\n\t\t\tRegExceptionHandler.handleException(ex);\n\t\t}\n\t}\n\n\t/**\n\t * Gets registry center time.\n\t *\n\t * @param key the key\n\t *\n\t * @return the registry center time\n\t */\n\t@Override\n\tpublic long getRegistryCenterTime(final String key) {\n\t\tlong result = 0L;\n\t\ttry {\n\t\t\tpersist(key, \"\");\n\t\t\tresult = client.checkExists().forPath(key).getMtime();\n\t\t\t//CHECKSTYLE:OFF\n\t\t} catch (final Exception ex) {\n\t\t\t//CHECKSTYLE:ON\n\t\t\tRegExceptionHandler.handleException(ex);\n\t\t}\n\t\tPreconditions.checkState(0L != result, \"Cannot get registry center time.\");\n\t\treturn result;\n\t}\n\n\t/**\n\t * Gets raw client.\n\t *\n\t * @return the raw client\n\t */\n\t@Override\n\tpublic Object getRawClient() {\n\t\treturn client;\n\t}\n\n\t/**\n\t * Increment.\n\t *\n\t * @param path        the path\n\t * @param retryNTimes the retry n times\n\t */\n\t@Override\n\tpublic void increment(String path, RetryNTimes retryNTimes) {\n\t\ttry {\n\t\t\tdistributedAtomicInteger = new DistributedAtomicInteger(client, path, retryNTimes);\n\t\t\tdistributedAtomicInteger.increment();\n\t\t} catch (Exception e) {\n\t\t\tlog.error(\"increment={}\", e.getMessage(), e);\n\t\t}\n\t}\n\n\t/**\n\t * Gets atomic value.\n\t *\n\t * @param path        the path\n\t * @param retryNTimes the retry n times\n\t *\n\t * @return the atomic value\n\t */\n\t@Override\n\tpublic AtomicValue<Integer> getAtomicValue(String path, RetryNTimes retryNTimes) {\n\t\ttry {\n\t\t\tdistributedAtomicInteger = new DistributedAtomicInteger(client, path, retryNTimes);\n\t\t\treturn distributedAtomicInteger.get();\n\t\t} catch (Exception e) {\n\t\t\tlog.error(\"getAtomicValue={}\", e.getMessage(), e);\n\t\t}\n\t\treturn null;\n\t}\n\n\t/**\n\t * Add cache data.\n\t *\n\t * @param cachePath the cache path\n\t */\n\t@Override\n\tpublic void addCacheData(final String cachePath) {\n\t\tTreeCache cache = new TreeCache(client, cachePath);\n\t\ttry {\n\t\t\tcache.start();\n\t\t\t//CHECKSTYLE:OFF\n\t\t} catch (final Exception ex) {\n\t\t\t//CHECKSTYLE:ON\n\t\t\tRegExceptionHandler.handleException(ex);\n\t\t}\n\t\tcaches.put(cachePath + \"/\", cache);\n\t}\n\n\t/**\n\t * Evict cache data.\n\t *\n\t * @param cachePath the cache path\n\t */\n\t@Override\n\tpublic void evictCacheData(final String cachePath) {\n\t\tTreeCache cache = caches.remove(cachePath + \"/\");\n\t\tif (null != cache) {\n\t\t\tcache.close();\n\t\t}\n\t}\n\n\t/**\n\t * Gets raw cache.\n\t *\n\t * @param cachePath the cache path\n\t *\n\t * @return the raw cache\n\t */\n\t@Override\n\tpublic Object getRawCache(final String cachePath) {\n\t\treturn caches.get(cachePath + \"/\");\n\t}\n\n\t/**\n\t * Register mq.\n\t *\n\t * @param app           the app\n\t * @param host          the host\n\t * @param producerGroup the producer group\n\t * @param consumerGroup the consumer group\n\t * @param namesrvAddr   the namesrv addr\n\t */\n\t@Override\n\tpublic void registerMq(final String app, final String host, final String producerGroup, final String consumerGroup, String namesrvAddr) {\n\t\t// 注册生产者\n\t\tfinal String producerRootPath = GlobalConstant.ZK_REGISTRY_PRODUCER_ROOT_PATH + GlobalConstant.Symbol.SLASH + app;\n\t\tfinal String consumerRootPath = GlobalConstant.ZK_REGISTRY_CONSUMER_ROOT_PATH + GlobalConstant.Symbol.SLASH + app;\n\t\tReliableMessageRegisterDto dto;\n\t\tif (StringUtils.isNotEmpty(producerGroup)) {\n\t\t\tdto = new ReliableMessageRegisterDto().setProducerGroup(producerGroup).setNamesrvAddr(namesrvAddr);\n\t\t\tString producerJson = JSON.toJSONString(dto);\n\t\t\tthis.persist(producerRootPath, producerJson);\n\t\t\tthis.persistEphemeral(producerRootPath + GlobalConstant.Symbol.SLASH + host, DateUtil.now());\n\t\t}\n\t\t// 注册消费者\n\t\tif (StringUtils.isNotEmpty(consumerGroup)) {\n\t\t\tdto = new ReliableMessageRegisterDto().setConsumerGroup(consumerGroup).setNamesrvAddr(namesrvAddr);\n\t\t\tString producerJson = JSON.toJSONString(dto);\n\t\t\tthis.persist(consumerRootPath, producerJson);\n\t\t\tthis.persistEphemeral(consumerRootPath + GlobalConstant.Symbol.SLASH + host, DateUtil.now());\n\t\t}\n\n\t}\n\n}\n"
  },
  {
    "path": "paascloud-common/paascloud-common-zk/src/test/java/.gitkeep",
    "content": ""
  },
  {
    "path": "paascloud-common/paascloud-security-app/pom.xml",
    "content": "<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n\txsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n\t<modelVersion>4.0.0</modelVersion>\n\t<artifactId>paascloud-security-app</artifactId>\n    <parent>\n        <groupId>com.liuzm.paascloud.common</groupId>\n        <artifactId>paascloud-common</artifactId>\n        <version>1.0</version>\n    </parent>\n\t\n\t<dependencies>\n\t\t<dependency>\n\t\t\t<groupId>com.liuzm.paascloud.common</groupId>\n\t\t\t<artifactId>paascloud-security-core</artifactId>\n\t\t\t<version>${paascloud.security.version}</version>\n\t\t</dependency>\n\t</dependencies>\n</project>"
  },
  {
    "path": "paascloud-common/paascloud-security-app/src/main/java/com/paascloud/security/app/AppSecretException.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：AppSecretException.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.security.app;\n\n/**\n * The class App secret exception.\n *\n * @author paascloud.net @gmail.com\n */\npublic class AppSecretException extends RuntimeException {\n\n\tprivate static final long serialVersionUID = -1629364510827838114L;\n\n\t/**\n\t * Instantiates a new App secret exception.\n\t *\n\t * @param msg the msg\n\t */\n\tpublic AppSecretException(String msg) {\n\t\tsuper(msg);\n\t}\n\n}\n"
  },
  {
    "path": "paascloud-common/paascloud-security-app/src/main/java/com/paascloud/security/app/AppSecurityController.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：AppSecurityController.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.security.app;\n\nimport com.paascloud.security.app.social.AppSingUpUtils;\nimport com.paascloud.security.core.properties.SecurityConstants;\nimport com.paascloud.security.core.social.BaseSocialController;\nimport com.paascloud.security.core.social.support.SocialUserInfo;\nimport org.springframework.http.HttpStatus;\nimport org.springframework.social.connect.Connection;\nimport org.springframework.social.connect.web.ProviderSignInUtils;\nimport org.springframework.web.bind.annotation.GetMapping;\nimport org.springframework.web.bind.annotation.ResponseStatus;\nimport org.springframework.web.bind.annotation.RestController;\nimport org.springframework.web.context.request.ServletWebRequest;\n\nimport javax.annotation.Resource;\nimport javax.servlet.http.HttpServletRequest;\n\n/**\n * The class App security controller.\n *\n * @author paascloud.net@gmail.comg\n */\n@RestController\npublic class AppSecurityController extends BaseSocialController {\n\n\t@Resource\n\tprivate ProviderSignInUtils providerSignInUtils;\n\n\t@Resource\n\tprivate AppSingUpUtils appSingUpUtils;\n\n\t/**\n\t * 需要注册时跳到这里，返回401和用户信息给前端\n\t *\n\t * @param request the request\n\t *\n\t * @return social user info\n\t */\n\t@GetMapping(SecurityConstants.DEFAULT_SOCIAL_USER_INFO_URL)\n\t@ResponseStatus(HttpStatus.UNAUTHORIZED)\n\tpublic SocialUserInfo getSocialUserInfo(HttpServletRequest request) {\n\t\tConnection<?> connection = providerSignInUtils.getConnectionFromSession(new ServletWebRequest(request));\n\t\tappSingUpUtils.saveConnectionData(new ServletWebRequest(request), connection.createData());\n\t\treturn buildSocialUserInfo(connection);\n\t}\n\n}\n"
  },
  {
    "path": "paascloud-common/paascloud-security-app/src/main/java/com/paascloud/security/app/authentication/openid/OpenIdAuthenticationFilter.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：OpenIdAuthenticationFilter.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.security.app.authentication.openid;\n\nimport com.paascloud.security.core.properties.SecurityConstants;\nimport org.springframework.security.authentication.AuthenticationServiceException;\nimport org.springframework.security.core.Authentication;\nimport org.springframework.security.core.AuthenticationException;\nimport org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter;\nimport org.springframework.security.web.util.matcher.AntPathRequestMatcher;\nimport org.springframework.util.Assert;\n\nimport javax.servlet.http.HttpServletRequest;\nimport javax.servlet.http.HttpServletResponse;\n\n/**\n * The class Open id authentication filter.\n *\n * @author paascloud.net@gmail.com\n */\npublic class OpenIdAuthenticationFilter extends AbstractAuthenticationProcessingFilter {\n\t// ~ Static fields/initializers\n\t// =====================================================================================\n\n\tprivate String openIdParameter = SecurityConstants.DEFAULT_PARAMETER_NAME_OPENID;\n\tprivate String providerIdParameter = SecurityConstants.DEFAULT_PARAMETER_NAME_PROVIDERID;\n\tprivate boolean postOnly = true;\n\tprivate static final String POST = \"POST\";\n\n\t// ~ Constructors\n\t// ===================================================================================================\n\n\t/**\n\t * Instantiates a new Open id authentication filter.\n\t */\n\tOpenIdAuthenticationFilter() {\n\t\tsuper(new AntPathRequestMatcher(SecurityConstants.DEFAULT_SIGN_IN_PROCESSING_URL_OPENID, \"POST\"));\n\t}\n\n\t// ~ Methods\n\t// ========================================================================================================\n\n\t/**\n\t * Attempt authentication authentication.\n\t *\n\t * @param request  the request\n\t * @param response the response\n\t *\n\t * @return the authentication\n\t *\n\t * @throws AuthenticationException the authentication exception\n\t */\n\t@Override\n\tpublic Authentication attemptAuthentication(HttpServletRequest request, HttpServletResponse response)\n\t\t\tthrows AuthenticationException {\n\t\tif (postOnly && !POST.equals(request.getMethod())) {\n\t\t\tthrow new AuthenticationServiceException(\"Authentication method not supported: \" + request.getMethod());\n\t\t}\n\n\t\tString openid = obtainOpenId(request);\n\t\tString providerId = obtainProviderId(request);\n\n\t\tif (openid == null) {\n\t\t\topenid = \"\";\n\t\t}\n\t\tif (providerId == null) {\n\t\t\tproviderId = \"\";\n\t\t}\n\n\t\topenid = openid.trim();\n\t\tproviderId = providerId.trim();\n\n\t\tOpenIdAuthenticationToken authRequest = new OpenIdAuthenticationToken(openid, providerId);\n\n\t\t// Allow subclasses to set the \"details\" property\n\t\tsetDetails(request, authRequest);\n\n\t\treturn this.getAuthenticationManager().authenticate(authRequest);\n\t}\n\n\n\t/**\n\t * 获取openId\n\t *\n\t * @param request the request\n\t *\n\t * @return the string\n\t */\n\tprotected String obtainOpenId(HttpServletRequest request) {\n\t\treturn request.getParameter(openIdParameter);\n\t}\n\n\t/**\n\t * 获取提供商id\n\t *\n\t * @param request the request\n\t *\n\t * @return the string\n\t */\n\tprotected String obtainProviderId(HttpServletRequest request) {\n\t\treturn request.getParameter(providerIdParameter);\n\t}\n\n\t/**\n\t * Provided so that subclasses may configure what is put into the\n\t * authentication request's details property.\n\t *\n\t * @param request     that an authentication request is being created for\n\t * @param authRequest the authentication request object that should have its details            set\n\t */\n\tprotected void setDetails(HttpServletRequest request, OpenIdAuthenticationToken authRequest) {\n\t\tauthRequest.setDetails(authenticationDetailsSource.buildDetails(request));\n\t}\n\n\t/**\n\t * Sets the parameter name which will be used to obtain the username from\n\t * the login request.\n\t *\n\t * @param openIdParameter the open id parameter\n\t */\n\tpublic void setOpenIdParameter(String openIdParameter) {\n\t\tAssert.hasText(openIdParameter, \"Username parameter must not be empty or null\");\n\t\tthis.openIdParameter = openIdParameter;\n\t}\n\n\n\t/**\n\t * Defines whether only HTTP POST requests will be allowed by this filter.\n\t * If set to true, and an authentication request is received which is not a\n\t * POST request, an exception will be raised immediately and authentication\n\t * will not be attempted. The <tt>unsuccessfulAuthentication()</tt> method\n\t * will be called as if handling a failed authentication.\n\t * <p>\n\t * Defaults to <tt>true</tt> but may be overridden by subclasses.\n\t *\n\t * @param postOnly the post only\n\t */\n\tpublic void setPostOnly(boolean postOnly) {\n\t\tthis.postOnly = postOnly;\n\t}\n\n\t/**\n\t * Gets open id parameter.\n\t *\n\t * @return the open id parameter\n\t */\n\tpublic final String getOpenIdParameter() {\n\t\treturn openIdParameter;\n\t}\n\n\t/**\n\t * Gets provider id parameter.\n\t *\n\t * @return the provider id parameter\n\t */\n\tpublic String getProviderIdParameter() {\n\t\treturn providerIdParameter;\n\t}\n\n\t/**\n\t * Sets provider id parameter.\n\t *\n\t * @param providerIdParameter the provider id parameter\n\t */\n\tpublic void setProviderIdParameter(String providerIdParameter) {\n\t\tthis.providerIdParameter = providerIdParameter;\n\t}\n\n}\n"
  },
  {
    "path": "paascloud-common/paascloud-security-app/src/main/java/com/paascloud/security/app/authentication/openid/OpenIdAuthenticationProvider.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：OpenIdAuthenticationProvider.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.security.app.authentication.openid;\n\nimport org.apache.commons.collections.CollectionUtils;\nimport org.springframework.security.authentication.AuthenticationProvider;\nimport org.springframework.security.authentication.InternalAuthenticationServiceException;\nimport org.springframework.security.core.Authentication;\nimport org.springframework.security.core.AuthenticationException;\nimport org.springframework.security.core.userdetails.UserDetails;\nimport org.springframework.social.connect.UsersConnectionRepository;\nimport org.springframework.social.security.SocialUserDetailsService;\n\nimport java.util.HashSet;\nimport java.util.Set;\n\n/**\n * The class Open id authentication provider.\n *\n * @author paascloud.net@gmail.com\n */\npublic class OpenIdAuthenticationProvider implements AuthenticationProvider {\n\n\tprivate SocialUserDetailsService userDetailsService;\n\n\tprivate UsersConnectionRepository usersConnectionRepository;\n\n\t/**\n\t * Authenticate authentication.\n\t *\n\t * @param authentication the authentication\n\t *\n\t * @return the authentication\n\t *\n\t * @throws AuthenticationException the authentication exception\n\t */\n\t@Override\n\tpublic Authentication authenticate(Authentication authentication) throws AuthenticationException {\n\n\t\tOpenIdAuthenticationToken authenticationToken = (OpenIdAuthenticationToken) authentication;\n\n\t\tSet<String> providerUserIds = new HashSet<>();\n\t\tproviderUserIds.add((String) authenticationToken.getPrincipal());\n\t\tSet<String> userIds = usersConnectionRepository.findUserIdsConnectedTo(authenticationToken.getProviderId(), providerUserIds);\n\n\t\tif (CollectionUtils.isEmpty(userIds) || userIds.size() != 1) {\n\t\t\tthrow new InternalAuthenticationServiceException(\"无法获取用户信息\");\n\t\t}\n\n\t\tString userId = userIds.iterator().next();\n\n\t\tUserDetails user = userDetailsService.loadUserByUserId(userId);\n\n\t\tif (user == null) {\n\t\t\tthrow new InternalAuthenticationServiceException(\"无法获取用户信息\");\n\t\t}\n\n\t\tOpenIdAuthenticationToken authenticationResult = new OpenIdAuthenticationToken(user, user.getAuthorities());\n\n\t\tauthenticationResult.setDetails(authenticationToken.getDetails());\n\n\t\treturn authenticationResult;\n\t}\n\n\t/**\n\t * Supports boolean.\n\t *\n\t * @param authentication the authentication\n\t *\n\t * @return the boolean\n\t */\n\t@Override\n\tpublic boolean supports(Class<?> authentication) {\n\t\treturn OpenIdAuthenticationToken.class.isAssignableFrom(authentication);\n\t}\n\n\t/**\n\t * Gets user details service.\n\t *\n\t * @return the user details service\n\t */\n\tpublic SocialUserDetailsService getUserDetailsService() {\n\t\treturn userDetailsService;\n\t}\n\n\t/**\n\t * Sets user details service.\n\t *\n\t * @param userDetailsService the user details service\n\t */\n\tpublic void setUserDetailsService(SocialUserDetailsService userDetailsService) {\n\t\tthis.userDetailsService = userDetailsService;\n\t}\n\n\t/**\n\t * Gets users connection repository.\n\t *\n\t * @return the users connection repository\n\t */\n\tpublic UsersConnectionRepository getUsersConnectionRepository() {\n\t\treturn usersConnectionRepository;\n\t}\n\n\t/**\n\t * Sets users connection repository.\n\t *\n\t * @param usersConnectionRepository the users connection repository\n\t */\n\tpublic void setUsersConnectionRepository(UsersConnectionRepository usersConnectionRepository) {\n\t\tthis.usersConnectionRepository = usersConnectionRepository;\n\t}\n\n}\n"
  },
  {
    "path": "paascloud-common/paascloud-security-app/src/main/java/com/paascloud/security/app/authentication/openid/OpenIdAuthenticationSecurityConfig.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：OpenIdAuthenticationSecurityConfig.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.security.app.authentication.openid;\n\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.security.authentication.AuthenticationManager;\nimport org.springframework.security.config.annotation.SecurityConfigurerAdapter;\nimport org.springframework.security.config.annotation.web.builders.HttpSecurity;\nimport org.springframework.security.web.DefaultSecurityFilterChain;\nimport org.springframework.security.web.authentication.AuthenticationFailureHandler;\nimport org.springframework.security.web.authentication.AuthenticationSuccessHandler;\nimport org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter;\nimport org.springframework.social.connect.UsersConnectionRepository;\nimport org.springframework.social.security.SocialUserDetailsService;\nimport org.springframework.stereotype.Component;\n\n\n/**\n * The class Open id authentication security config.\n *\n * @author paascloud.net@gmail.com\n */\n@Component\npublic class OpenIdAuthenticationSecurityConfig extends SecurityConfigurerAdapter<DefaultSecurityFilterChain, HttpSecurity> {\n\n\tprivate final AuthenticationSuccessHandler pcAuthenticationSuccessHandler;\n\n\tprivate final AuthenticationFailureHandler pcAuthenticationFailureHandler;\n\n\tprivate final SocialUserDetailsService userDetailsService;\n\n\tprivate final UsersConnectionRepository usersConnectionRepository;\n\n\t@Autowired\n\tpublic OpenIdAuthenticationSecurityConfig(AuthenticationSuccessHandler pcAuthenticationSuccessHandler, AuthenticationFailureHandler pcAuthenticationFailureHandler, SocialUserDetailsService userDetailsService, UsersConnectionRepository usersConnectionRepository) {\n\t\tthis.pcAuthenticationSuccessHandler = pcAuthenticationSuccessHandler;\n\t\tthis.pcAuthenticationFailureHandler = pcAuthenticationFailureHandler;\n\t\tthis.userDetailsService = userDetailsService;\n\t\tthis.usersConnectionRepository = usersConnectionRepository;\n\t}\n\n\t/**\n\t * Configure.\n\t *\n\t * @param http the http\n\t */\n\t@Override\n\tpublic void configure(HttpSecurity http) {\n\n\t\tOpenIdAuthenticationFilter openIdAuthenticationFilter = new OpenIdAuthenticationFilter();\n\t\topenIdAuthenticationFilter.setAuthenticationManager(http.getSharedObject(AuthenticationManager.class));\n\t\topenIdAuthenticationFilter.setAuthenticationSuccessHandler(pcAuthenticationSuccessHandler);\n\t\topenIdAuthenticationFilter.setAuthenticationFailureHandler(pcAuthenticationFailureHandler);\n\n\t\tOpenIdAuthenticationProvider openIdAuthenticationProvider = new OpenIdAuthenticationProvider();\n\t\topenIdAuthenticationProvider.setUserDetailsService(userDetailsService);\n\t\topenIdAuthenticationProvider.setUsersConnectionRepository(usersConnectionRepository);\n\n\t\thttp.authenticationProvider(openIdAuthenticationProvider)\n\t\t\t\t.addFilterAfter(openIdAuthenticationFilter, UsernamePasswordAuthenticationFilter.class);\n\n\t}\n\n}\n"
  },
  {
    "path": "paascloud-common/paascloud-security-app/src/main/java/com/paascloud/security/app/authentication/openid/OpenIdAuthenticationToken.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：OpenIdAuthenticationToken.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.security.app.authentication.openid;\n\nimport org.springframework.security.authentication.AbstractAuthenticationToken;\nimport org.springframework.security.core.GrantedAuthority;\nimport org.springframework.security.core.SpringSecurityCoreVersion;\n\nimport java.util.Collection;\n\n\n/**\n * The class Open id authentication token.\n *\n * @author paascloud.net@gmail.com\n */\npublic class OpenIdAuthenticationToken extends AbstractAuthenticationToken {\n\n\tprivate static final long serialVersionUID = SpringSecurityCoreVersion.SERIAL_VERSION_UID;\n\n\t// ~ Instance fields\n\t// ================================================================================================\n\n\tprivate final Object principal;\n\tprivate String providerId;\n\n\t// ~ Constructors\n\t// ===================================================================================================\n\n\t/**\n\t * This constructor can be safely used by any code that wishes to create a\n\t * <code>UsernamePasswordAuthenticationToken</code>, as the {@link #isAuthenticated()}\n\t * will return <code>false</code>.\n\t *\n\t * @param openId     the open id\n\t * @param providerId the provider id\n\t */\n\tpublic OpenIdAuthenticationToken(String openId, String providerId) {\n\t\tsuper(null);\n\t\tthis.principal = openId;\n\t\tthis.providerId = providerId;\n\t\tsetAuthenticated(false);\n\t}\n\n\t/**\n\t * This constructor should only be used by <code>AuthenticationManager</code> or\n\t * <code>AuthenticationProvider</code> implementations that are satisfied with\n\t * producing a trusted (i.e. {@link #isAuthenticated()} = <code>true</code>)\n\t * authentication token.\n\t *\n\t * @param principal   the principal\n\t * @param authorities the authorities\n\t */\n\tpublic OpenIdAuthenticationToken(Object principal, Collection<? extends GrantedAuthority> authorities) {\n\t\tsuper(authorities);\n\t\tthis.principal = principal;\n\t\t// must use super, as we override\n\t\tsuper.setAuthenticated(true);\n\t}\n\n\t// ~ Methods\n\t// ========================================================================================================\n\n\t/**\n\t * Gets credentials.\n\t *\n\t * @return the credentials\n\t */\n\t@Override\n\tpublic Object getCredentials() {\n\t\treturn null;\n\t}\n\n\t/**\n\t * Gets principal.\n\t *\n\t * @return the principal\n\t */\n\t@Override\n\tpublic Object getPrincipal() {\n\t\treturn this.principal;\n\t}\n\n\t/**\n\t * Gets provider id.\n\t *\n\t * @return the provider id\n\t */\n\tpublic String getProviderId() {\n\t\treturn providerId;\n\t}\n\n\t/**\n\t * Sets authenticated.\n\t *\n\t * @param isAuthenticated the is authenticated\n\t *\n\t * @throws IllegalArgumentException the illegal argument exception\n\t */\n\t@Override\n\tpublic void setAuthenticated(boolean isAuthenticated) throws IllegalArgumentException {\n\t\tif (isAuthenticated) {\n\t\t\tthrow new IllegalArgumentException(\n\t\t\t\t\t\"Cannot set this token to trusted - use constructor which takes a GrantedAuthority list instead\");\n\t\t}\n\n\t\tsuper.setAuthenticated(false);\n\t}\n\n\t/**\n\t * Erase credentials.\n\t */\n\t@Override\n\tpublic void eraseCredentials() {\n\t\tsuper.eraseCredentials();\n\t}\n}\n"
  },
  {
    "path": "paascloud-common/paascloud-security-app/src/main/java/com/paascloud/security/app/social/AppSingUpUtils.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：AppSingUpUtils.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.security.app.social;\n\nimport com.paascloud.security.app.AppSecretException;\nimport org.apache.commons.lang.StringUtils;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.data.redis.core.RedisTemplate;\nimport org.springframework.social.connect.Connection;\nimport org.springframework.social.connect.ConnectionData;\nimport org.springframework.social.connect.ConnectionFactoryLocator;\nimport org.springframework.social.connect.UsersConnectionRepository;\nimport org.springframework.stereotype.Component;\nimport org.springframework.web.context.request.WebRequest;\n\nimport java.util.concurrent.TimeUnit;\n\n/**\n * app环境下替换providerSignInUtils，避免由于没有session导致读不到社交用户信息的问题\n *\n * @author paascloud.net @gmail.com\n */\n@Component\npublic class AppSingUpUtils {\n\n\tprivate final RedisTemplate<String, Object> redisTemplate;\n\n\tprivate final UsersConnectionRepository usersConnectionRepository;\n\n\tprivate final ConnectionFactoryLocator connectionFactoryLocator;\n\n\t/**\n\t * Instantiates a new App sing up utils.\n\t *\n\t * @param redisTemplate             the redis template\n\t * @param usersConnectionRepository the users connection repository\n\t * @param connectionFactoryLocator  the connection factory locator\n\t */\n\t@Autowired\n\tpublic AppSingUpUtils(RedisTemplate<String, Object> redisTemplate, UsersConnectionRepository usersConnectionRepository, ConnectionFactoryLocator connectionFactoryLocator) {\n\t\tthis.redisTemplate = redisTemplate;\n\t\tthis.usersConnectionRepository = usersConnectionRepository;\n\t\tthis.connectionFactoryLocator = connectionFactoryLocator;\n\t}\n\n\t/**\n\t * 缓存社交网站用户信息到redis\n\t *\n\t * @param request        the request\n\t * @param connectionData the connection data\n\t */\n\tpublic void saveConnectionData(WebRequest request, ConnectionData connectionData) {\n\t\tredisTemplate.opsForValue().set(getKey(request), connectionData, 10, TimeUnit.MINUTES);\n\t}\n\n\t/**\n\t * 将缓存的社交网站用户信息与系统注册用户信息绑定\n\t *\n\t * @param request the request\n\t * @param userId  the user id\n\t */\n\tpublic void doPostSignUp(WebRequest request, String userId) {\n\t\tString key = getKey(request);\n\t\tif (!redisTemplate.hasKey(key)) {\n\t\t\tthrow new AppSecretException(\"无法找到缓存的用户社交账号信息\");\n\t\t}\n\t\tConnectionData connectionData = (ConnectionData) redisTemplate.opsForValue().get(key);\n\t\tConnection<?> connection = connectionFactoryLocator.getConnectionFactory(connectionData.getProviderId())\n\t\t\t\t.createConnection(connectionData);\n\t\tusersConnectionRepository.createConnectionRepository(userId).addConnection(connection);\n\n\t\tredisTemplate.delete(key);\n\t}\n\n\t/**\n\t * 获取redis key\n\t */\n\tprivate String getKey(WebRequest request) {\n\t\tString deviceId = request.getHeader(\"deviceId\");\n\t\tif (StringUtils.isBlank(deviceId)) {\n\t\t\tthrow new AppSecretException(\"设备id参数不能为空\");\n\t\t}\n\t\treturn \"pc:security:social.connect.\" + deviceId;\n\t}\n\n}\n"
  },
  {
    "path": "paascloud-common/paascloud-security-app/src/main/java/com/paascloud/security/app/social/AppSocialAuthenticationFilterPostProcessor.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：AppSocialAuthenticationFilterPostProcessor.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.security.app.social;\n\n\nimport com.paascloud.security.core.social.support.SocialAuthenticationFilterPostProcessor;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.security.web.authentication.AuthenticationSuccessHandler;\nimport org.springframework.social.security.SocialAuthenticationFilter;\nimport org.springframework.stereotype.Component;\n\n/**\n * The type App social authentication filter post processor.\n * @author paascloud\n */\n@Component\npublic class AppSocialAuthenticationFilterPostProcessor implements SocialAuthenticationFilterPostProcessor{\n\n\tprivate final AuthenticationSuccessHandler pcAuthenticationSuccessHandler;\n\n\t@Autowired\n\tpublic AppSocialAuthenticationFilterPostProcessor(AuthenticationSuccessHandler pcAuthenticationSuccessHandler) {\n\t\tthis.pcAuthenticationSuccessHandler = pcAuthenticationSuccessHandler;\n\t}\n\n\t@Override\n\tpublic void process(final SocialAuthenticationFilter socialAuthenticationFilter) {\n\t\tsocialAuthenticationFilter.setAuthenticationSuccessHandler(pcAuthenticationSuccessHandler);\n\t}\n}\n"
  },
  {
    "path": "paascloud-common/paascloud-security-app/src/main/java/com/paascloud/security/app/social/SpringSocialConfigurerPostProcessor.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：SpringSocialConfigurerPostProcessor.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.security.app.social;\n\nimport org.apache.commons.lang.StringUtils;\nimport org.springframework.beans.BeansException;\nimport org.springframework.beans.factory.config.BeanPostProcessor;\nimport org.springframework.stereotype.Component;\n\nimport com.paascloud.security.core.properties.SecurityConstants;\nimport com.paascloud.security.core.social.support.PcSpringSocialConfigurer;\n\n\n/**\n * The class Spring social configurer post processor.\n *\n * @author paascloud.net@gmail.com\n */\n@Component\npublic class SpringSocialConfigurerPostProcessor implements BeanPostProcessor {\n\n\t/**\n\t * Post process before initialization object.\n\t *\n\t * @param bean     the bean\n\t * @param beanName the bean name\n\t *\n\t * @return the object\n\t *\n\t * @throws BeansException the beans exception\n\t */\n\t@Override\n\tpublic Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {\n\t\treturn bean;\n\t}\n\n\t/**\n\t * Post process after initialization object.\n\t *\n\t * @param bean     the bean\n\t * @param beanName the bean name\n\t *\n\t * @return the object\n\t *\n\t * @throws BeansException the beans exception\n\t */\n\t@Override\n\tpublic Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {\n\t\tString pcSocialSecurityConfig = \"pcSocialSecurityConfig\";\n\t\tif (StringUtils.equals(beanName, pcSocialSecurityConfig)) {\n\t\t\tPcSpringSocialConfigurer config = (PcSpringSocialConfigurer) bean;\n\t\t\tconfig.signupUrl(SecurityConstants.DEFAULT_SOCIAL_USER_INFO_URL);\n\t\t\treturn config;\n\t\t}\n\t\treturn bean;\n\t}\n\n}\n"
  },
  {
    "path": "paascloud-common/paascloud-security-app/src/main/java/com/paascloud/security/server/PcAccessDeniedHandler.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：PcAccessDeniedHandler.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.security.server;\n\nimport com.fasterxml.jackson.core.JsonProcessingException;\nimport com.fasterxml.jackson.databind.ObjectMapper;\nimport lombok.extern.slf4j.Slf4j;\nimport org.springframework.context.annotation.Configuration;\nimport org.springframework.http.HttpStatus;\nimport org.springframework.security.access.AccessDeniedException;\nimport org.springframework.security.web.access.AccessDeniedHandler;\n\nimport javax.annotation.Resource;\nimport javax.servlet.http.HttpServletRequest;\nimport javax.servlet.http.HttpServletResponse;\nimport java.io.IOException;\nimport java.util.HashMap;\nimport java.util.Map;\n\n/**\n * The class Pc access denied handler.\n *\n * @author paascloud.net @gmail.com\n */\n@Slf4j\n@Configuration\npublic class PcAccessDeniedHandler implements AccessDeniedHandler {\n\t@Resource\n\tprivate ObjectMapper objectMapper;\n\n\t/**\n\t * Handle.\n\t *\n\t * @param request  the request\n\t * @param response the response\n\t * @param e        the e\n\t *\n\t * @throws JsonProcessingException the json processing exception\n\t */\n\t@Override\n\tpublic void handle(HttpServletRequest request, HttpServletResponse response, AccessDeniedException e) throws IOException {\n\t\tlog.info(\"处理权限异常. e={}\", e);\n\t\tMap<String, Object> result = new HashMap<>(3);\n\t\tresult.put(\"code\", 99990401);\n\t\tresult.put(\"message\", \"无访问权限\");\n\t\tString json = objectMapper.writeValueAsString(result);\n\t\tresponse.setStatus(HttpStatus.UNAUTHORIZED.value());\n\t\tresponse.setContentType(\"application/json;charset=UTF-8\");\n\t\tresponse.getWriter().write(json);\n\t}\n}"
  },
  {
    "path": "paascloud-common/paascloud-security-app/src/main/java/com/paascloud/security/server/PcResourceServerConfig.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：PcResourceServerConfig.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.security.server;\n\nimport com.paascloud.security.app.authentication.openid.OpenIdAuthenticationSecurityConfig;\nimport com.paascloud.security.core.authentication.FormAuthenticationConfig;\nimport com.paascloud.security.core.authentication.mobile.SmsCodeAuthenticationSecurityConfig;\nimport com.paascloud.security.core.authorize.AuthorizeConfigManager;\nimport com.paascloud.security.core.validate.code.ValidateCodeSecurityConfig;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.context.annotation.Bean;\nimport org.springframework.context.annotation.Configuration;\nimport org.springframework.security.config.annotation.web.builders.HttpSecurity;\nimport org.springframework.security.oauth2.config.annotation.web.configuration.EnableResourceServer;\nimport org.springframework.security.oauth2.config.annotation.web.configuration.ResourceServerConfigurerAdapter;\nimport org.springframework.security.oauth2.config.annotation.web.configurers.ResourceServerSecurityConfigurer;\nimport org.springframework.security.oauth2.provider.expression.OAuth2WebSecurityExpressionHandler;\nimport org.springframework.security.web.access.AccessDeniedHandler;\nimport org.springframework.security.web.authentication.AuthenticationFailureHandler;\nimport org.springframework.security.web.authentication.AuthenticationSuccessHandler;\nimport org.springframework.security.web.authentication.rememberme.JdbcTokenRepositoryImpl;\nimport org.springframework.security.web.authentication.rememberme.PersistentTokenRepository;\nimport org.springframework.social.security.SpringSocialConfigurer;\n\nimport javax.annotation.Resource;\nimport javax.sql.DataSource;\n\n/**\n * 资源服务器配置\n *\n * @author paascloud.net @gmail.com\n */\n@Configuration\n@EnableResourceServer\npublic class PcResourceServerConfig extends ResourceServerConfigurerAdapter {\n\n\t@Autowired\n\tprivate OAuth2WebSecurityExpressionHandler pcSecurityExpressionHandler;\n\n\t@Autowired\n\tprivate AccessDeniedHandler pcAccessDeniedHandler;\n\n\t@Autowired\n\tprotected AuthenticationSuccessHandler pcAuthenticationSuccessHandler;\n\n\t@Autowired\n\tprotected AuthenticationFailureHandler pcAuthenticationFailureHandler;\n\n\t@Autowired\n\tprivate SmsCodeAuthenticationSecurityConfig smsCodeAuthenticationSecurityConfig;\n\n\t@Autowired\n\tprivate ValidateCodeSecurityConfig validateCodeSecurityConfig;\n\n\t@Autowired\n\tprivate SpringSocialConfigurer pcSocialSecurityConfig;\n\n\t@Autowired\n\tprivate AuthorizeConfigManager authorizeConfigManager;\n\n\t@Autowired\n\tprivate FormAuthenticationConfig formAuthenticationConfig;\n\n\t@Autowired\n\tprivate OpenIdAuthenticationSecurityConfig openIdAuthenticationSecurityConfig;\n\n\t@Resource\n\tprivate DataSource dataSource;\n\n\t/**\n\t * 记住我功能的token存取器配置\n\t *\n\t * @return the persistent token repository\n\t */\n\t@Bean\n\tpublic PersistentTokenRepository persistentTokenRepository() {\n\t\tJdbcTokenRepositoryImpl tokenRepository = new JdbcTokenRepositoryImpl();\n\t\ttokenRepository.setDataSource(dataSource);\n//\t\ttokenRepository.setCreateTableOnStartup(true); // 第一次启动创建\n\t\treturn tokenRepository;\n\t}\n\n\t/**\n\t * Configure.\n\t *\n\t * @param http the http\n\t *\n\t * @throws Exception the exception\n\t */\n\t@Override\n\tpublic void configure(HttpSecurity http) throws Exception {\n\t\tformAuthenticationConfig.configure(http);\n\t\thttp.headers().frameOptions().disable();\n\t\thttp.apply(validateCodeSecurityConfig)\n\t\t\t\t.and()\n\t\t\t\t.apply(smsCodeAuthenticationSecurityConfig)\n\t\t\t\t.and()\n\t\t\t\t.apply(pcSocialSecurityConfig)\n\t\t\t\t.and()\n\t\t\t\t.apply(openIdAuthenticationSecurityConfig)\n\t\t\t\t.and()\n\t\t\t\t.headers().frameOptions().disable()\n\t\t\t\t.and()\n\t\t\t\t.exceptionHandling().accessDeniedHandler(pcAccessDeniedHandler)\n\t\t\t\t.and()\n\t\t\t\t.csrf().disable();\n\n\t\tauthorizeConfigManager.config(http.authorizeRequests());\n\t}\n\n\t@Override\n\tpublic void configure(ResourceServerSecurityConfigurer resources) {\n\t\tresources.expressionHandler(pcSecurityExpressionHandler);\n\t}\n}"
  },
  {
    "path": "paascloud-common/paascloud-security-app/src/main/java/com/paascloud/security/server/PcWebResponseExceptionTranslator.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：PcWebResponseExceptionTranslator.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.security.server;\n\nimport org.springframework.http.ResponseEntity;\nimport org.springframework.security.oauth2.common.exceptions.OAuth2Exception;\nimport org.springframework.security.oauth2.provider.error.WebResponseExceptionTranslator;\n\n/**\n * The class Pc web response exception translator.\n *\n * @author paascloud.net @gmail.com\n */\npublic class PcWebResponseExceptionTranslator implements WebResponseExceptionTranslator {\n\t/**\n\t * Translate response entity.\n\t *\n\t * @param e the e\n\t *\n\t * @return the response entity\n\t *\n\t * @throws Exception the exception\n\t */\n\t@Override\n\tpublic ResponseEntity<OAuth2Exception> translate(Exception e) throws Exception {\n\t\treturn null;\n\t}\n}\n"
  },
  {
    "path": "paascloud-common/paascloud-security-app/src/main/java/com/paascloud/security/server/TokenJwtEnhancer.java",
    "content": " /*\n  * Copyright (c) 2018. paascloud.net All Rights Reserved.\n  * 项目名称：paascloud快速搭建企业级分布式微服务平台\n  * 类名称：TokenJwtEnhancer.java\n  * 创建人：刘兆明\n  * 联系方式：paascloud.net@gmail.com\n  * 开源地址: https://github.com/paascloud\n  * 博客地址: http://blog.paascloud.net\n  * 项目官网: http://paascloud.net\n  */\n\n package com.paascloud.security.server;\n\nimport org.springframework.security.core.Authentication;\nimport org.springframework.security.core.userdetails.UserDetails;\nimport org.springframework.security.oauth2.common.DefaultOAuth2AccessToken;\nimport org.springframework.security.oauth2.common.OAuth2AccessToken;\nimport org.springframework.security.oauth2.provider.OAuth2Authentication;\nimport org.springframework.security.oauth2.provider.token.TokenEnhancer;\n\nimport java.util.HashMap;\nimport java.util.Map;\n\n\n/**\n * The class Token jwt enhancer.\n *\n * @author paascloud.net @gmail.com\n */\npublic class TokenJwtEnhancer implements TokenEnhancer {\n\n\t/**\n\t * Enhance o auth 2 access token.\n\t *\n\t * @param accessToken          the access token\n\t * @param oAuth2Authentication the o auth 2 authentication\n\t *\n\t * @return the o auth 2 access token\n\t */\n\t@Override\n\tpublic OAuth2AccessToken enhance(OAuth2AccessToken accessToken, OAuth2Authentication oAuth2Authentication) {\n\t\tMap<String, Object> info = new HashMap<>(8);\n\t\tinfo.put(\"timestamp\", System.currentTimeMillis());\n\t\tAuthentication authentication = oAuth2Authentication.getUserAuthentication();\n\t\tif (authentication != null && authentication.getPrincipal() instanceof UserDetails) {\n\t\t\tObject principal = authentication.getPrincipal();\n\t\t\tinfo.put(\"loginName\", ((UserDetails) principal).getUsername());\n\t\t}\n\n\t\t((DefaultOAuth2AccessToken) accessToken).setAdditionalInformation(info);\n\n\t\treturn accessToken;\n\t}\n\n}\n"
  },
  {
    "path": "paascloud-common/paascloud-security-app/src/main/java/com/paascloud/security/server/TokenStoreConfig.java",
    "content": " /*\n  * Copyright (c) 2018. paascloud.net All Rights Reserved.\n  * 项目名称：paascloud快速搭建企业级分布式微服务平台\n  * 类名称：TokenStoreConfig.java\n  * 创建人：刘兆明\n  * 联系方式：paascloud.net@gmail.com\n  * 开源地址: https://github.com/paascloud\n  * 博客地址: http://blog.paascloud.net\n  * 项目官网: http://paascloud.net\n  */\n\n package com.paascloud.security.server;\n\n import org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.boot.autoconfigure.condition.ConditionalOnBean;\nimport org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;\nimport org.springframework.context.annotation.Bean;\nimport org.springframework.context.annotation.Configuration;\nimport org.springframework.data.redis.connection.RedisConnectionFactory;\nimport org.springframework.security.oauth2.provider.token.TokenEnhancer;\nimport org.springframework.security.oauth2.provider.token.TokenStore;\nimport org.springframework.security.oauth2.provider.token.store.JwtAccessTokenConverter;\nimport org.springframework.security.oauth2.provider.token.store.JwtTokenStore;\nimport org.springframework.security.oauth2.provider.token.store.redis.RedisTokenStore;\n\nimport com.paascloud.security.core.properties.SecurityProperties;\n\n\n/**\n * The class Token store config.\n *\n * @author paascloud.net @gmail.com\n */\n@Configuration\npublic class TokenStoreConfig {\n\n\t/**\n\t * 使用redis存储token的配置，只有在paascloud.security.oauth2.tokenStore配置为redis时生效\n\t */\n\t@Configuration\n\t@ConditionalOnProperty(prefix = \"paascloud.security.oauth2\", name = \"tokenStore\", havingValue = \"redis\")\n\tpublic static class RedisConfig {\n\n\t\t@Autowired\n\t\tprivate RedisConnectionFactory redisConnectionFactory;\n\n\t\t/**\n\t\t * Redis token store token store.\n\t\t *\n\t\t * @return token store\n\t\t */\n\t\t@Bean\n\t\tpublic TokenStore redisTokenStore() {\n\t\t\treturn new RedisTokenStore(redisConnectionFactory);\n\t\t}\n\n\t}\n\n\t/**\n\t * 使用jwt时的配置，默认生效\n\t *\n\t * @author paascloud.net @gmail.com\n\t */\n\t@Configuration\n\t@ConditionalOnProperty(prefix = \"paascloud.security.oauth2\", name = \"tokenStore\", havingValue = \"jwt\", matchIfMissing = true)\n\tpublic static class JwtConfig {\n\n\t\t@Autowired\n\t\tprivate SecurityProperties securityProperties;\n\n\t\t/**\n\t\t * Jwt token store token store.\n\t\t *\n\t\t * @return the token store\n\t\t */\n\t\t@Bean\n\t\tpublic TokenStore jwtTokenStore() {\n\t\t\treturn new JwtTokenStore(jwtAccessTokenConverter());\n\t\t}\n\n\t\t/**\n\t\t * Jwt access token converter jwt access token converter.\n\t\t *\n\t\t * @return the jwt access token converter\n\t\t */\n\t\t@Bean\n\t\tpublic JwtAccessTokenConverter jwtAccessTokenConverter() {\n\t\t\tJwtAccessTokenConverter converter = new JwtAccessTokenConverter();\n\t\t\tconverter.setSigningKey(securityProperties.getOauth2().getJwtSigningKey());\n\t\t\treturn converter;\n\t\t}\n\n\t\t/**\n\t\t * Jwt token enhancer token enhancer.\n\t\t *\n\t\t * @return the token enhancer\n\t\t */\n\t\t@Bean\n\t\t@ConditionalOnBean(TokenEnhancer.class)\n\t\tpublic TokenEnhancer jwtTokenEnhancer() {\n\t\t\treturn new TokenJwtEnhancer();\n\t\t}\n\n\t}\n\n\n}\n"
  },
  {
    "path": "paascloud-common/paascloud-security-core/pom.xml",
    "content": "<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n\txsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n\t<modelVersion>4.0.0</modelVersion>\n\t<artifactId>paascloud-security-core</artifactId>\n    <parent>\n        <groupId>com.liuzm.paascloud.common</groupId>\n        <artifactId>paascloud-common</artifactId>\n        <version>1.0</version>\n    </parent>\n\n\t<dependencies>\n\t\t<dependency>\n\t\t\t<groupId>org.springframework.cloud</groupId>\n\t\t\t<artifactId>spring-cloud-starter-oauth2</artifactId>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t<artifactId>spring-boot-starter-data-redis</artifactId>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t<artifactId>spring-boot-starter-jdbc</artifactId>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>mysql</groupId>\n\t\t\t<artifactId>mysql-connector-java</artifactId>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.springframework.social</groupId>\n\t\t\t<artifactId>spring-social-config</artifactId>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.springframework.social</groupId>\n\t\t\t<artifactId>spring-social-core</artifactId>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.springframework.social</groupId>\n\t\t\t<artifactId>spring-social-security</artifactId>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.springframework.social</groupId>\n\t\t\t<artifactId>spring-social-web</artifactId>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>commons-lang</groupId>\n\t\t\t<artifactId>commons-lang</artifactId>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>commons-collections</groupId>\n\t\t\t<artifactId>commons-collections</artifactId>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>commons-beanutils</groupId>\n\t\t\t<artifactId>commons-beanutils</artifactId>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t<artifactId>spring-boot-configuration-processor</artifactId>\n\t\t</dependency>\n        <dependency>\n            <groupId>com.github.penggle</groupId>\n            <artifactId>kaptcha</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>com.fasterxml.jackson.core</groupId>\n            <artifactId>jackson-annotations</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>com.fasterxml.jackson.core</groupId>\n            <artifactId>jackson-databind</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>com.fasterxml.jackson.core</groupId>\n            <artifactId>jackson-core</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>com.fasterxml.jackson.datatype</groupId>\n            <artifactId>jackson-datatype-jsr310</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>com.liuzm.paascloud.common</groupId>\n            <artifactId>paascloud-common-util</artifactId>\n        </dependency>\n\t</dependencies>\n</project>"
  },
  {
    "path": "paascloud-common/paascloud-security-core/src/main/java/com/paascloud/security/core/SecurityCoreConfig.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：SecurityCoreConfig.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.security.core;\n\nimport com.paascloud.security.core.properties.SecurityProperties;\nimport org.springframework.boot.context.properties.EnableConfigurationProperties;\nimport org.springframework.context.annotation.Configuration;\n\n\n/**\n * The class Security core config.\n *\n * @author paascloud.net@gmail.com\n */\n@Configuration\n@EnableConfigurationProperties(SecurityProperties.class)\npublic class SecurityCoreConfig {\n\n}\n"
  },
  {
    "path": "paascloud-common/paascloud-security-core/src/main/java/com/paascloud/security/core/SecurityResult.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：SecurityResult.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.security.core;\n\nimport lombok.Data;\nimport lombok.NoArgsConstructor;\nimport org.apache.commons.lang3.StringUtils;\n\n/**\n * The class Security result.\n *\n * @author paascloud.net @gmail.com\n */\n@Data\n@NoArgsConstructor\npublic class SecurityResult {\n\n\t/**\n\t * 成功码.\n\t */\n\tpublic static final int SUCCESS_CODE = 200;\n\n\t/**\n\t * 成功信息.\n\t */\n\tpublic static final String SUCCESS_MESSAGE = \"操作成功\";\n\n\t/**\n\t * 错误码.\n\t */\n\tpublic static final int ERROR_CODE = 500;\n\n\t/**\n\t * 错误信息.\n\t */\n\tpublic static final String ERROR_MESSAGE = \"内部异常\";\n\n\t/**\n\t * 状态码\n\t */\n    private Integer code;\n\n\t/**\n\t * 提示信息\n\t */\n\tprivate String message;\n\n\t/**\n\t * 结果\n\t */\n    private Object result;\n\n\tpublic static SecurityResult ok(Object data) {\n        return new SecurityResult(data);\n    }\n\n\tpublic static SecurityResult ok() {\n        return new SecurityResult(null);\n    }\n\n\tpublic static SecurityResult error(String message) {\n\t\treturn error(message, null);\n\t}\n\n\tpublic static SecurityResult error(String message, Object data) {\n\t\treturn new SecurityResult(ERROR_CODE, StringUtils.isEmpty(message) ? ERROR_MESSAGE : message, data);\n\t}\n\n\tpublic SecurityResult(Integer code, String message, Object result) {\n        this.code = code;\n        this.message = message;\n        this.result = result;\n    }\n\n\tprivate SecurityResult(Object result) {\n        this.code = SUCCESS_CODE;\n        this.message = SUCCESS_MESSAGE;\n        this.result = result;\n    }\n}"
  },
  {
    "path": "paascloud-common/paascloud-security-core/src/main/java/com/paascloud/security/core/SecurityUser.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：SecurityUser.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.security.core;\n\nimport org.apache.commons.lang3.StringUtils;\nimport org.springframework.security.core.GrantedAuthority;\nimport org.springframework.security.core.userdetails.UserDetails;\n\nimport java.util.Collection;\n\n/**\n * The class Security user.\n *\n * @author paascloud.net @gmail.com\n */\npublic class SecurityUser implements UserDetails {\n\tprivate static final long serialVersionUID = 4872628781561412463L;\n\n\tprivate static final String ENABLE = \"ENABLE\";\n\n\tprivate Collection<GrantedAuthority> authorities;\n\n\tprivate Long userId;\n\n\tprivate String nickName;\n\n\tprivate String loginName;\n\n\tprivate String loginPwd;\n\n\tprivate String status;\n\n\tprivate Long groupId;\n\n\tprivate String groupName;\n\n\tpublic SecurityUser(Long userId, String loginName, String loginPwd, String nickName, Long groupId, String groupName) {\n\t\tthis.setUserId(userId);\n\t\tthis.setLoginName(loginName);\n\t\tthis.setLoginPwd(loginPwd);\n\t\tthis.setNickName(nickName);\n\t\tthis.setGroupId(groupId);\n\t\tthis.setGroupName(groupName);\n\t}\n\n\tpublic SecurityUser(Long userId, String loginName, String loginPwd, String nickName, Long groupId, String groupName, String status, Collection<GrantedAuthority> grantedAuthorities) {\n\t\tthis.setUserId(userId);\n\t\tthis.setLoginName(loginName);\n\t\tthis.setLoginPwd(loginPwd);\n\t\tthis.setNickName(nickName);\n\t\tthis.setGroupId(groupId);\n\t\tthis.setGroupName(groupName);\n\t\tthis.setStatus(status);\n\t\tthis.authorities = grantedAuthorities;\n\t}\n\n\t@Override\n\tpublic Collection<? extends GrantedAuthority> getAuthorities() {\n\t\treturn this.authorities;\n\t}\n\n\t@Override\n\tpublic String getPassword() {\n\t\treturn this.getLoginPwd();\n\t}\n\n\t@Override\n\tpublic String getUsername() {\n\t\treturn this.getLoginName();\n\t}\n\n\t@Override\n\tpublic boolean isAccountNonExpired() {\n\t\treturn true;\n\t}\n\n\t@Override\n\tpublic boolean isAccountNonLocked() {\n\t\treturn true;\n\t}\n\n\t@Override\n\tpublic boolean isCredentialsNonExpired() {\n\t\treturn true;\n\t}\n\n\t@Override\n\tpublic boolean isEnabled() {\n\t\treturn StringUtils.equals(this.status, ENABLE);\n\t}\n\n\tpublic Long getUserId() {\n\t\treturn userId;\n\t}\n\n\tpublic void setUserId(Long userId) {\n\t\tthis.userId = userId;\n\t}\n\n\tpublic String getNickName() {\n\t\treturn nickName;\n\t}\n\n\tpublic void setNickName(String nickName) {\n\t\tthis.nickName = nickName;\n\t}\n\n\tpublic String getLoginName() {\n\t\treturn loginName;\n\t}\n\n\tpublic void setLoginName(String loginName) {\n\t\tthis.loginName = loginName;\n\t}\n\n\tpublic String getStatus() {\n\t\treturn status;\n\t}\n\n\tpublic void setStatus(String status) {\n\t\tthis.status = status;\n\t}\n\n\tpublic String getLoginPwd() {\n\t\treturn loginPwd;\n\t}\n\n\tpublic void setLoginPwd(String loginPwd) {\n\t\tthis.loginPwd = loginPwd;\n\t}\n\n\tpublic Long getGroupId() {\n\t\treturn groupId;\n\t}\n\n\tpublic void setGroupId(Long groupId) {\n\t\tthis.groupId = groupId;\n\t}\n\n\tpublic String getGroupName() {\n\t\treturn groupName;\n\t}\n\n\tpublic void setGroupName(String groupName) {\n\t\tthis.groupName = groupName;\n\t}\n}\n"
  },
  {
    "path": "paascloud-common/paascloud-security-core/src/main/java/com/paascloud/security/core/authentication/AuthenticationBeanConfig.java",
    "content": "package com.paascloud.security.core.authentication;\n\nimport org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;\nimport org.springframework.context.annotation.Bean;\nimport org.springframework.context.annotation.Configuration;\nimport org.springframework.security.core.userdetails.UserDetailsService;\nimport org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;\nimport org.springframework.security.crypto.password.PasswordEncoder;\nimport org.springframework.social.security.SocialUserDetailsService;\n\n/**\n * 认证相关的扩展点配置。配置在这里的bean，业务系统都可以通过声明同类型或同名的bean来覆盖安全\n * 模块默认的配置。\n *\n * @author paascloud.net @gmail.com\n */\n@Configuration\npublic class AuthenticationBeanConfig {\n\n\t/**\n\t * 默认密码处理器\n\t *\n\t * @return 密码加密器\n\t */\n\t@Bean\n\t@ConditionalOnMissingBean(PasswordEncoder.class)\n\tpublic PasswordEncoder passwordEncoder() {\n\t\treturn new BCryptPasswordEncoder();\n\t}\n\n\t/**\n\t * 默认认证器\n\t *\n\t * @return user details service\n\t */\n\t@Bean\n\t@ConditionalOnMissingBean(UserDetailsService.class)\n\tpublic UserDetailsService userDetailsService() {\n\t\treturn new DefaultUserDetailsServiceImpl();\n\t}\n\n\t/**\n\t * 默认认证器\n\t *\n\t * @return social user details service\n\t */\n\t@Bean\n\t@ConditionalOnMissingBean(SocialUserDetailsService.class)\n\tpublic SocialUserDetailsService socialUserDetailsService() {\n\t\treturn new DefaultSocialUserDetailsServiceImpl();\n\t}\n\n}\n"
  },
  {
    "path": "paascloud-common/paascloud-security-core/src/main/java/com/paascloud/security/core/authentication/DefaultSocialUserDetailsServiceImpl.java",
    "content": "package com.paascloud.security.core.authentication;\n\nimport lombok.extern.slf4j.Slf4j;\nimport org.springframework.security.core.userdetails.UsernameNotFoundException;\nimport org.springframework.social.security.SocialUserDetails;\nimport org.springframework.social.security.SocialUserDetailsService;\n\n/**\n * 默认的SocialUserDetailsService实现\n * 不做任何处理，只在控制台打印一句日志，然后抛出异常，提醒业务系统自己配置SocialUserDetailsService。\n *\n * @author paascloud.net @gmail.com\n */\n@Slf4j\npublic class DefaultSocialUserDetailsServiceImpl implements SocialUserDetailsService {\n\n\t/**\n\t * Load user by user id social user details.\n\t *\n\t * @param userId the user id\n\t *\n\t * @return the social user details\n\t *\n\t * @throws UsernameNotFoundException the username not found exception\n\t */\n\t@Override\n\tpublic SocialUserDetails loadUserByUserId(String userId) throws UsernameNotFoundException {\n\t\tlog.warn(\"请配置 SocialUserDetailsService 接口的实现.\");\n\t\tthrow new UsernameNotFoundException(userId);\n\t}\n\n}\n"
  },
  {
    "path": "paascloud-common/paascloud-security-core/src/main/java/com/paascloud/security/core/authentication/DefaultUserDetailsServiceImpl.java",
    "content": "package com.paascloud.security.core.authentication;\n\nimport lombok.extern.slf4j.Slf4j;\nimport org.springframework.security.core.userdetails.UserDetails;\nimport org.springframework.security.core.userdetails.UserDetailsService;\nimport org.springframework.security.core.userdetails.UsernameNotFoundException;\n\n/**\n * 默认的 UserDetailsService 实现\n * 不做任何处理，只在控制台打印一句日志，然后抛出异常，提醒业务系统自己配置 UserDetailsService。\n *\n * @author paascloud.net @gmail.com\n */\n@Slf4j\npublic class DefaultUserDetailsServiceImpl implements UserDetailsService {\n\n\t/**\n\t * Load user by username user details.\n\t *\n\t * @param username the username\n\t *\n\t * @return the user details\n\t *\n\t * @throws UsernameNotFoundException the username not found exception\n\t */\n\t@Override\n\tpublic UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {\n\t\tlog.warn(\"请配置 UserDetailsService 接口的实现.\");\n\t\tthrow new UsernameNotFoundException(username);\n\t}\n\n}\n"
  },
  {
    "path": "paascloud-common/paascloud-security-core/src/main/java/com/paascloud/security/core/authentication/FormAuthenticationConfig.java",
    "content": "package com.paascloud.security.core.authentication;\n\nimport com.paascloud.security.core.properties.SecurityConstants;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.security.config.annotation.web.builders.HttpSecurity;\nimport org.springframework.security.web.authentication.AuthenticationFailureHandler;\nimport org.springframework.security.web.authentication.AuthenticationSuccessHandler;\nimport org.springframework.stereotype.Component;\n\n/**\n * 表单登录配置\n *\n * @author paascloud.net @gmail.com\n */\n@Component\npublic class FormAuthenticationConfig {\n\n\t/**\n\t * The Pc authentication success handler.\n\t */\n\tprotected final AuthenticationSuccessHandler pcAuthenticationSuccessHandler;\n\n\t/**\n\t * The Pc authentication failure handler.\n\t */\n\tprotected final AuthenticationFailureHandler pcAuthenticationFailureHandler;\n\n\t/**\n\t * Instantiates a new Form authentication config.\n\t *\n\t * @param pcAuthenticationSuccessHandler the pc authentication success handler\n\t * @param pcAuthenticationFailureHandler the pc authentication failure handler\n\t */\n\t@Autowired\n\tpublic FormAuthenticationConfig(AuthenticationSuccessHandler pcAuthenticationSuccessHandler, AuthenticationFailureHandler pcAuthenticationFailureHandler) {\n\t\tthis.pcAuthenticationSuccessHandler = pcAuthenticationSuccessHandler;\n\t\tthis.pcAuthenticationFailureHandler = pcAuthenticationFailureHandler;\n\t}\n\n\t/**\n\t * Configure.\n\t *\n\t * @param http the http\n\t *\n\t * @throws Exception the exception\n\t */\n\tpublic void configure(HttpSecurity http) throws Exception {\n\t\thttp.formLogin()\n\t\t\t\t.loginPage(SecurityConstants.DEFAULT_UNAUTHENTICATION_URL)\n\t\t\t\t.loginProcessingUrl(SecurityConstants.DEFAULT_SIGN_IN_PROCESSING_URL_FORM)\n\t\t\t\t.successHandler(pcAuthenticationSuccessHandler)\n\t\t\t\t.failureHandler(pcAuthenticationFailureHandler);\n\t}\n\n}\n"
  },
  {
    "path": "paascloud-common/paascloud-security-core/src/main/java/com/paascloud/security/core/authentication/mobile/SmsCodeAuthenticationFilter.java",
    "content": "package com.paascloud.security.core.authentication.mobile;\n\nimport com.paascloud.security.core.properties.SecurityConstants;\nimport org.springframework.security.authentication.AuthenticationServiceException;\nimport org.springframework.security.core.Authentication;\nimport org.springframework.security.core.AuthenticationException;\nimport org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter;\nimport org.springframework.security.web.util.matcher.AntPathRequestMatcher;\nimport org.springframework.util.Assert;\n\nimport javax.servlet.http.HttpServletRequest;\nimport javax.servlet.http.HttpServletResponse;\n\n/**\n * 短信登录过滤器\n *\n * @author paascloud.net @gmail.com\n */\npublic class SmsCodeAuthenticationFilter extends AbstractAuthenticationProcessingFilter {\n\tprivate static final String POST = \"POST\";\n\t// ~ Static fields/initializers\n\t// =====================================================================================\n\n\tprivate String mobileParameter = SecurityConstants.DEFAULT_PARAMETER_NAME_MOBILE;\n\tprivate boolean postOnly = true;\n\n\t// ~ Constructors\n\t// ===================================================================================================\n\n\t/**\n\t * Instantiates a new Sms code authentication filter.\n\t */\n\tpublic SmsCodeAuthenticationFilter() {\n\t\tsuper(new AntPathRequestMatcher(SecurityConstants.DEFAULT_SIGN_IN_PROCESSING_URL_MOBILE, \"POST\"));\n\t}\n\n\t// ~ Methods\n\t// ========================================================================================================\n\n\t/**\n\t * Attempt authentication authentication.\n\t *\n\t * @param request  the request\n\t * @param response the response\n\t *\n\t * @return the authentication\n\t *\n\t * @throws AuthenticationException the authentication exception\n\t */\n\t@Override\n\tpublic Authentication attemptAuthentication(HttpServletRequest request, HttpServletResponse response)\n\t\t\tthrows AuthenticationException {\n\t\tif (postOnly && !POST.equals(request.getMethod())) {\n\t\t\tthrow new AuthenticationServiceException(\"Authentication method not supported: \" + request.getMethod());\n\t\t}\n\n\t\tString mobile = obtainMobile(request);\n\n\t\tif (mobile == null) {\n\t\t\tmobile = \"\";\n\t\t}\n\n\t\tmobile = mobile.trim();\n\n\t\tSmsCodeAuthenticationToken authRequest = new SmsCodeAuthenticationToken(mobile);\n\n\t\t// Allow subclasses to set the \"details\" property\n\t\tsetDetails(request, authRequest);\n\n\t\treturn this.getAuthenticationManager().authenticate(authRequest);\n\t}\n\n\n\t/**\n\t * 获取手机号\n\t *\n\t * @param request the request\n\t *\n\t * @return the string\n\t */\n\tprotected String obtainMobile(HttpServletRequest request) {\n\t\treturn request.getParameter(mobileParameter);\n\t}\n\n\t/**\n\t * Provided so that subclasses may configure what is put into the\n\t * authentication request's details property.\n\t *\n\t * @param request     that an authentication request is being created for\n\t * @param authRequest the authentication request object that should have its details            set\n\t */\n\tprotected void setDetails(HttpServletRequest request, SmsCodeAuthenticationToken authRequest) {\n\t\tauthRequest.setDetails(authenticationDetailsSource.buildDetails(request));\n\t}\n\n\t/**\n\t * Sets the parameter name which will be used to obtain the username from\n\t * the login request.\n\t *\n\t * @param usernameParameter the parameter name. Defaults to \"username\".\n\t */\n\tpublic void setMobileParameter(String usernameParameter) {\n\t\tAssert.hasText(usernameParameter, \"Username parameter must not be empty or null\");\n\t\tthis.mobileParameter = usernameParameter;\n\t}\n\n\n\t/**\n\t * Defines whether only HTTP POST requests will be allowed by this filter.\n\t * If set to true, and an authentication request is received which is not a\n\t * POST request, an exception will be raised immediately and authentication\n\t * will not be attempted. The <tt>unsuccessfulAuthentication()</tt> method\n\t * will be called as if handling a failed authentication.\n\t * <p>\n\t * Defaults to <tt>true</tt> but may be overridden by subclasses.\n\t *\n\t * @param postOnly the post only\n\t */\n\tpublic void setPostOnly(boolean postOnly) {\n\t\tthis.postOnly = postOnly;\n\t}\n\n\t/**\n\t * Gets mobile parameter.\n\t *\n\t * @return the mobile parameter\n\t */\n\tpublic final String getMobileParameter() {\n\t\treturn mobileParameter;\n\t}\n\n}\n"
  },
  {
    "path": "paascloud-common/paascloud-security-core/src/main/java/com/paascloud/security/core/authentication/mobile/SmsCodeAuthenticationProvider.java",
    "content": "package com.paascloud.security.core.authentication.mobile;\n\nimport org.springframework.security.authentication.AuthenticationProvider;\nimport org.springframework.security.authentication.InternalAuthenticationServiceException;\nimport org.springframework.security.core.Authentication;\nimport org.springframework.security.core.AuthenticationException;\nimport org.springframework.security.core.userdetails.UserDetails;\nimport org.springframework.security.core.userdetails.UserDetailsService;\n\n/**\n * 短信登录验证逻辑\n * <p>\n * 由于短信验证码的验证在过滤器里已完成，这里直接读取用户信息即可。\n *\n * @author paascloud.net @gmail.com\n */\npublic class SmsCodeAuthenticationProvider implements AuthenticationProvider {\n\n\tprivate UserDetailsService userDetailsService;\n\n\t/**\n\t * Authenticate authentication.\n\t *\n\t * @param authentication the authentication\n\t *\n\t * @return the authentication\n\t *\n\t * @throws AuthenticationException the authentication exception\n\t */\n\t@Override\n\tpublic Authentication authenticate(Authentication authentication) throws AuthenticationException {\n\n\t\tSmsCodeAuthenticationToken authenticationToken = (SmsCodeAuthenticationToken) authentication;\n\n\t\tUserDetails user = userDetailsService.loadUserByUsername((String) authenticationToken.getPrincipal());\n\n\t\tif (user == null) {\n\t\t\tthrow new InternalAuthenticationServiceException(\"无法获取用户信息\");\n\t\t}\n\n\t\tSmsCodeAuthenticationToken authenticationResult = new SmsCodeAuthenticationToken(user, user.getAuthorities());\n\n\t\tauthenticationResult.setDetails(authenticationToken.getDetails());\n\n\t\treturn authenticationResult;\n\t}\n\n\t/**\n\t * Supports boolean.\n\t *\n\t * @param authentication the authentication\n\t *\n\t * @return the boolean\n\t */\n\t@Override\n\tpublic boolean supports(Class<?> authentication) {\n\t\treturn SmsCodeAuthenticationToken.class.isAssignableFrom(authentication);\n\t}\n\n\t/**\n\t * Gets user details service.\n\t *\n\t * @return the user details service\n\t */\n\tpublic UserDetailsService getUserDetailsService() {\n\t\treturn userDetailsService;\n\t}\n\n\t/**\n\t * Sets user details service.\n\t *\n\t * @param userDetailsService the user details service\n\t */\n\tpublic void setUserDetailsService(UserDetailsService userDetailsService) {\n\t\tthis.userDetailsService = userDetailsService;\n\t}\n\n}\n"
  },
  {
    "path": "paascloud-common/paascloud-security-core/src/main/java/com/paascloud/security/core/authentication/mobile/SmsCodeAuthenticationSecurityConfig.java",
    "content": "package com.paascloud.security.core.authentication.mobile;\n\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.security.authentication.AuthenticationManager;\nimport org.springframework.security.config.annotation.SecurityConfigurerAdapter;\nimport org.springframework.security.config.annotation.web.builders.HttpSecurity;\nimport org.springframework.security.core.userdetails.UserDetailsService;\nimport org.springframework.security.web.DefaultSecurityFilterChain;\nimport org.springframework.security.web.authentication.AuthenticationFailureHandler;\nimport org.springframework.security.web.authentication.AuthenticationSuccessHandler;\nimport org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter;\nimport org.springframework.security.web.authentication.rememberme.PersistentTokenBasedRememberMeServices;\nimport org.springframework.security.web.authentication.rememberme.PersistentTokenRepository;\nimport org.springframework.stereotype.Component;\n\nimport java.util.UUID;\n\n/**\n * 短信登录配置\n *\n * @author paascloud.net @gmail.com\n */\n@Component\npublic class SmsCodeAuthenticationSecurityConfig extends SecurityConfigurerAdapter<DefaultSecurityFilterChain, HttpSecurity> {\n\t@Autowired\n\tprivate AuthenticationSuccessHandler pcAuthenticationSuccessHandler;\n\t@Autowired\n\tprivate AuthenticationFailureHandler pcAuthenticationFailureHandler;\n\t@Autowired\n\tprivate UserDetailsService userDetailsService;\n\t@Autowired\n\tprivate PersistentTokenRepository persistentTokenRepository;\n\n\t/**\n\t * Configure.\n\t *\n\t * @param http the http\n\t */\n\t@Override\n\tpublic void configure(HttpSecurity http) {\n\n\t\tSmsCodeAuthenticationFilter smsCodeAuthenticationFilter = new SmsCodeAuthenticationFilter();\n\t\tsmsCodeAuthenticationFilter.setAuthenticationManager(http.getSharedObject(AuthenticationManager.class));\n\t\tsmsCodeAuthenticationFilter.setAuthenticationSuccessHandler(pcAuthenticationSuccessHandler);\n\t\tsmsCodeAuthenticationFilter.setAuthenticationFailureHandler(pcAuthenticationFailureHandler);\n\t\tString key = UUID.randomUUID().toString();\n\t\tsmsCodeAuthenticationFilter.setRememberMeServices(new PersistentTokenBasedRememberMeServices(key, userDetailsService, persistentTokenRepository));\n\n\t\tSmsCodeAuthenticationProvider smsCodeAuthenticationProvider = new SmsCodeAuthenticationProvider();\n\t\tsmsCodeAuthenticationProvider.setUserDetailsService(userDetailsService);\n\n\t\thttp.authenticationProvider(smsCodeAuthenticationProvider)\n\t\t\t\t.addFilterAfter(smsCodeAuthenticationFilter, UsernamePasswordAuthenticationFilter.class);\n\n//\t\t\n\n\t}\n\n}\n"
  },
  {
    "path": "paascloud-common/paascloud-security-core/src/main/java/com/paascloud/security/core/authentication/mobile/SmsCodeAuthenticationToken.java",
    "content": "package com.paascloud.security.core.authentication.mobile;\n\nimport org.springframework.security.authentication.AbstractAuthenticationToken;\nimport org.springframework.security.core.GrantedAuthority;\nimport org.springframework.security.core.SpringSecurityCoreVersion;\n\nimport java.util.Collection;\n\n/**\n * 短信登录验证信息封装类\n *\n * @author paascloud.net @gmail.com\n */\npublic class SmsCodeAuthenticationToken extends AbstractAuthenticationToken {\n\n\tprivate static final long serialVersionUID = SpringSecurityCoreVersion.SERIAL_VERSION_UID;\n\tprivate final Object principal;\n\n\tSmsCodeAuthenticationToken(String mobile) {\n\t\tsuper(null);\n\t\tthis.principal = mobile;\n\t\tsetAuthenticated(false);\n\t}\n\n\tSmsCodeAuthenticationToken(Object principal, Collection<? extends GrantedAuthority> authorities) {\n\t\tsuper(authorities);\n\t\tthis.principal = principal;\n\t\tsuper.setAuthenticated(true);\n\t}\n\n\t@Override\n\tpublic Object getCredentials() {\n\t\treturn null;\n\t}\n\n\t@Override\n\tpublic Object getPrincipal() {\n\t\treturn this.principal;\n\t}\n\n\t@Override\n\tpublic void setAuthenticated(boolean isAuthenticated) {\n\t\tif (isAuthenticated) {\n\t\t\tthrow new IllegalArgumentException(\"Cannot set this token to trusted - use constructor which takes a GrantedAuthority list instead\");\n\t\t}\n\n\t\tsuper.setAuthenticated(false);\n\t}\n}\n"
  },
  {
    "path": "paascloud-common/paascloud-security-core/src/main/java/com/paascloud/security/core/authorize/AuthorizeConfigManager.java",
    "content": "package com.paascloud.security.core.authorize;\n\nimport org.springframework.security.config.annotation.web.builders.HttpSecurity;\nimport org.springframework.security.config.annotation.web.configurers.ExpressionUrlAuthorizationConfigurer;\n\n/**\n * 授权信息管理器\n * 用于收集系统中所有 AuthorizeConfigProvider 并加载其配置\n *\n * @author paascloud.net @gmail.com\n */\npublic interface AuthorizeConfigManager {\n\n\t/**\n\t * Config.\n\t *\n\t * @param config the config\n\t */\n\tvoid config(ExpressionUrlAuthorizationConfigurer<HttpSecurity>.ExpressionInterceptUrlRegistry config);\n\n}\n"
  },
  {
    "path": "paascloud-common/paascloud-security-core/src/main/java/com/paascloud/security/core/authorize/AuthorizeConfigProvider.java",
    "content": "package com.paascloud.security.core.authorize;\n\nimport org.springframework.security.config.annotation.web.builders.HttpSecurity;\nimport org.springframework.security.config.annotation.web.configurers.ExpressionUrlAuthorizationConfigurer;\n\n/**\n * 授权配置提供器，各个模块和业务系统可以通过实现此接口向系统添加授权配置。\n *\n * @author paascloud.net @gmail.com\n */\npublic interface AuthorizeConfigProvider {\n\n\t/**\n\t * Config boolean.\n\t *\n\t * @param config the config\n\t *\n\t * @return 返回的boolean表示配置中是否有针对anyRequest的配置 。在整个授权配置中， 应该有且仅有一个针对anyRequest的配置，如果所有的实现都没有针对anyRequest的配置， 系统会自动增加一个anyRequest().authenticated()的配置。如果有多个针对anyRequest 的配置，则会抛出异常。\n\t */\n\tboolean config(ExpressionUrlAuthorizationConfigurer<HttpSecurity>.ExpressionInterceptUrlRegistry config);\n\n}\n"
  },
  {
    "path": "paascloud-common/paascloud-security-core/src/main/java/com/paascloud/security/core/authorize/PcAuthorizeConfigManager.java",
    "content": "package com.paascloud.security.core.authorize;\n\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.security.config.annotation.web.builders.HttpSecurity;\nimport org.springframework.security.config.annotation.web.configurers.ExpressionUrlAuthorizationConfigurer;\nimport org.springframework.stereotype.Component;\n\nimport java.util.List;\n\n/**\n * 默认的授权配置管理器\n *\n * @author paascloud.net @gmail.com\n */\n@Component\npublic class PcAuthorizeConfigManager implements AuthorizeConfigManager {\n\n\tprivate final List<AuthorizeConfigProvider> authorizeConfigProviders;\n\n\t/**\n\t * Instantiates a new Pc authorize config manager.\n\t *\n\t * @param authorizeConfigProviders the authorize config providers\n\t */\n\t@Autowired\n\tpublic PcAuthorizeConfigManager(List<AuthorizeConfigProvider> authorizeConfigProviders) {\n\t\tthis.authorizeConfigProviders = authorizeConfigProviders;\n\t}\n\n\t/**\n\t * Config.\n\t *\n\t * @param config the config\n\t */\n\t@Override\n\tpublic void config(ExpressionUrlAuthorizationConfigurer<HttpSecurity>.ExpressionInterceptUrlRegistry config) {\n\t\tboolean existAnyRequestConfig = false;\n\t\tString existAnyRequestConfigName = null;\n\n\t\tfor (AuthorizeConfigProvider authorizeConfigProvider : authorizeConfigProviders) {\n\t\t\tboolean currentIsAnyRequestConfig = authorizeConfigProvider.config(config);\n\t\t\tif (existAnyRequestConfig && currentIsAnyRequestConfig) {\n\t\t\t\tthrow new RuntimeException(\"重复的anyRequest配置:\" + existAnyRequestConfigName + \",\"\n\t\t\t\t\t\t+ authorizeConfigProvider.getClass().getSimpleName());\n\t\t\t} else if (currentIsAnyRequestConfig) {\n\t\t\t\texistAnyRequestConfig = true;\n\t\t\t\texistAnyRequestConfigName = authorizeConfigProvider.getClass().getSimpleName();\n\t\t\t}\n\t\t}\n\n\t\tif (!existAnyRequestConfig) {\n\t\t\tconfig.anyRequest().authenticated();\n\t\t}\n\t}\n\n}\n"
  },
  {
    "path": "paascloud-common/paascloud-security-core/src/main/java/com/paascloud/security/core/authorize/PcAuthorizeConfigProvider.java",
    "content": "package com.paascloud.security.core.authorize;\n\nimport com.paascloud.security.core.properties.SecurityConstants;\nimport org.springframework.core.annotation.Order;\nimport org.springframework.security.config.annotation.web.builders.HttpSecurity;\nimport org.springframework.security.config.annotation.web.configurers.ExpressionUrlAuthorizationConfigurer;\nimport org.springframework.stereotype.Component;\n\n/**\n * 核心模块的授权配置提供器，安全模块涉及的url的授权配置在这里。\n *\n * @author paascloud.net @gmail.com\n */\n@Component\n@Order(Integer.MIN_VALUE)\npublic class PcAuthorizeConfigProvider implements AuthorizeConfigProvider {\n\n\t/**\n\t * Config boolean.\n\t *\n\t * @param config the config\n\t *\n\t * @return the boolean\n\t */\n\t@Override\n\tpublic boolean config(ExpressionUrlAuthorizationConfigurer<HttpSecurity>.ExpressionInterceptUrlRegistry config) {\n\t\tconfig.antMatchers(SecurityConstants.DEFAULT_UNAUTHENTICATION_URL,\n\t\t\t\tSecurityConstants.DEFAULT_SIGN_IN_PROCESSING_URL_MOBILE,\n\t\t\t\tSecurityConstants.DEFAULT_SIGN_IN_PROCESSING_URL_OPENID,\n\t\t\t\tSecurityConstants.DEFAULT_SOCIAL_USER_INFO_URL,\n\t\t\t\tSecurityConstants.DEFAULT_VALIDATE_CODE_URL_PREFIX + \"/*\", \"/pay/alipayCallback\",\n\t\t\t\t\"/druid/**\", \"/auth/**\", \"/swagger-ui.html\", \"/swagger-resources/**\", \"/v2/api-docs\").permitAll();\n\t\treturn false;\n\t}\n\n}\n"
  },
  {
    "path": "paascloud-common/paascloud-security-core/src/main/java/com/paascloud/security/core/properties/BrowserProperties.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：BrowserProperties.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.security.core.properties;\n\nimport lombok.Data;\n\n/**\n * 浏览器环境配置项\n *\n * @author paascloud.net @gmail.com\n */\n@Data\npublic class BrowserProperties {\n\n\t/**\n\t * session管理配置项\n\t */\n\tprivate SessionProperties session = new SessionProperties();\n\t/**\n\t * '记住我'功能的有效时间，默认1小时\n\t */\n\tprivate int rememberMeSeconds = 3600;\n\t/**\n\t * 社交登录，如果需要用户注册，跳转的页面\n\t */\n\tprivate String signUpUrl = \"/pc-signUp.html\";\n\t/**\n\t * 登录响应的方式，默认是json\n\t */\n\tprivate LoginResponseType signInResponseType = LoginResponseType.JSON;\n\t/**\n\t * 登录成功后跳转的地址，如果设置了此属性，则登录成功后总是会跳到这个地址上。\n\t * 只在signInResponseType为REDIRECT时生效\n\t */\n\tprivate String singInSuccessUrl;\n\n}\n"
  },
  {
    "path": "paascloud-common/paascloud-security-core/src/main/java/com/paascloud/security/core/properties/EmailCodeProperties.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：EmailCodeProperties.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.security.core.properties;\n\nimport lombok.Data;\n\n/**\n * The class Email code properties.\n *\n * @author paascloud.net @gmail.com\n */\n@Data\npublic class EmailCodeProperties {\n\n\t/**\n\t * 过期时间\n\t */\n\tprivate int expireIn = 60 * 60 * 24;\n\t/**\n\t * 要拦截的url，多个url用逗号隔开，ant pattern\n\t */\n\tprivate String url;\n\n}\n"
  },
  {
    "path": "paascloud-common/paascloud-security-core/src/main/java/com/paascloud/security/core/properties/ImageCodeProperties.java",
    "content": "package com.paascloud.security.core.properties;\n\nimport lombok.Data;\nimport lombok.EqualsAndHashCode;\n\n/**\n * 图片验证码配置项\n *\n * @author paascloud.net @gmail.com\n */\n@EqualsAndHashCode(callSuper = true)\n@Data\npublic class ImageCodeProperties extends SmsCodeProperties {\n\n\t/**\n\t * Instantiates a new Image code properties.\n\t */\n\tImageCodeProperties() {\n\t\tsuper.setLength(4);\n\t}\n\n}\n"
  },
  {
    "path": "paascloud-common/paascloud-security-core/src/main/java/com/paascloud/security/core/properties/LoginResponseType.java",
    "content": "package com.paascloud.security.core.properties;\n\n/**\n * 认证成功后的响应方式\n *\n * @author paascloud.net @gmail.com\n */\npublic enum LoginResponseType {\n\n\t/**\n\t * 跳转\n\t */\n\tREDIRECT,\n\t/**\n\t * 返回json\n\t */\n\tJSON\n\n}\n"
  },
  {
    "path": "paascloud-common/paascloud-security-core/src/main/java/com/paascloud/security/core/properties/OAuth2ClientProperties.java",
    "content": "package com.paascloud.security.core.properties;\n\nimport lombok.Data;\n\n/**\n * 认证服务器注册的第三方应用配置项\n *\n * @author paascloud.net @gmail.com\n */\n@Data\npublic class OAuth2ClientProperties {\n\n\t/**\n\t * 第三方应用appId\n\t */\n\tprivate String clientId;\n\t/**\n\t * 第三方应用appSecret\n\t */\n\tprivate String clientSecret;\n\t/**\n\t * 针对此应用发出的token的有效时间\n\t */\n\tprivate int accessTokenValidateSeconds = 7200;\n\n\tprivate int refreshTokenValiditySeconds = 2592000;\n\n\tprivate String scope;\n\n}\n"
  },
  {
    "path": "paascloud-common/paascloud-security-core/src/main/java/com/paascloud/security/core/properties/OAuth2Properties.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：OAuth2Properties.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.security.core.properties;\n\nimport lombok.Data;\n\n/**\n * The class O auth 2 properties.\n *\n * @author paascloud.net @gmail.com\n */\n@Data\npublic class OAuth2Properties {\n\n\t/**\n\t * 使用jwt时为token签名的秘钥\n\t */\n\tprivate String jwtSigningKey = \"paascloud\";\n\t/**\n\t * 客户端配置\n\t */\n\tprivate OAuth2ClientProperties[] clients = {};\n\n}\n"
  },
  {
    "path": "paascloud-common/paascloud-security-core/src/main/java/com/paascloud/security/core/properties/QQProperties.java",
    "content": "package com.paascloud.security.core.properties;\n\nimport lombok.Data;\nimport lombok.EqualsAndHashCode;\nimport org.springframework.boot.autoconfigure.social.SocialProperties;\n\n/**\n * QQ登录配置项\n *\n * @author paascloud.net @gmail.com\n */\n@EqualsAndHashCode(callSuper = true)\n@Data\npublic class QQProperties extends SocialProperties {\n\n\t/**\n\t * 第三方id，用来决定发起第三方登录的url，默认是 qq。\n\t */\n\tprivate String providerId = \"qq\";\n\n}\n"
  },
  {
    "path": "paascloud-common/paascloud-security-core/src/main/java/com/paascloud/security/core/properties/SecurityConstants.java",
    "content": "package com.paascloud.security.core.properties;\n\n/**\n * The interface Security constants.\n *\n * @author paascloud.net@gmail.com\n */\npublic interface SecurityConstants {\n\n\n\t/**\n\t * 默认的处理验证码的url前缀\n\t */\n\tString DEFAULT_VALIDATE_CODE_URL_PREFIX = \"/auth/code\";\n\n\t/**\n\t * 当请求需要身份认证时，默认跳转的url\n\t */\n\tString DEFAULT_UNAUTHENTICATION_URL = \"/auth/require\";\n\t/**\n\t * 默认的用户名密码登录请求处理url\n\t */\n\tString DEFAULT_SIGN_IN_PROCESSING_URL_FORM = \"/auth/form\";\n\t/**\n\t * 默认的手机验证码登录请求处理url\n\t */\n\tString DEFAULT_SIGN_IN_PROCESSING_URL_MOBILE = \"/auth/mobile\";\n\t/**\n\t * 默认的OPENID登录请求处理url\n\t */\n\tString DEFAULT_SIGN_IN_PROCESSING_URL_OPENID = \"/auth/openid\";\n\t/**\n\t * 验证图片验证码时，http请求中默认的携带图片验证码信息的参数的名称\n\t */\n\tString DEFAULT_PARAMETER_NAME_CODE_IMAGE = \"imageCode\";\n\t/**\n\t * 验证短信验证码时，http请求中默认的携带短信验证码信息的参数的名称\n\t */\n\tString DEFAULT_PARAMETER_NAME_CODE_SMS = \"smsCode\";\n\t/**\n\t * 验证邮箱验证码时，http请求中默认的携带短信验证码信息的参数的名称\n\t */\n\tString DEFAULT_PARAMETER_NAME_CODE_EMAIL = \"emailCode\";\n\t/**\n\t * 发送短信验证码 或 验证短信验证码时，传递手机号的参数的名称\n\t */\n\tString DEFAULT_PARAMETER_NAME_MOBILE = \"mobile\";\n\n\t/**\n\t * 发送邮箱验证码 或 验证邮箱验证码时，传递邮箱的参数的名称\n\t */\n\tString DEFAULT_PARAMETER_NAME_EMAIL = \"email\";\n\n\t/**\n\t * openid参数名\n\t */\n\tString DEFAULT_PARAMETER_NAME_OPENID = \"openId\";\n\t/**\n\t * providerId参数名\n\t */\n\tString DEFAULT_PARAMETER_NAME_PROVIDERID = \"providerId\";\n\t/**\n\t * 获取第三方用户信息的url\n\t */\n\tString DEFAULT_SOCIAL_USER_INFO_URL = \"/social/user\";\n}\n"
  },
  {
    "path": "paascloud-common/paascloud-security-core/src/main/java/com/paascloud/security/core/properties/SecurityProperties.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：SecurityProperties.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.security.core.properties;\n\nimport org.springframework.boot.context.properties.ConfigurationProperties;\n\n\n/**\n * The class Security properties.\n *\n * @author paascloud.net@gmail.com\n */\n@ConfigurationProperties(prefix = \"paascloud.security\")\npublic class SecurityProperties {\n\n\t/**\n\t * 浏览器环境配置\n\t */\n\tprivate BrowserProperties browser = new BrowserProperties();\n\t/**\n\t * 验证码配置\n\t */\n\tprivate ValidateCodeProperties code = new ValidateCodeProperties();\n\t/**\n\t * 社交登录配置\n\t */\n\tprivate SocialProperties social = new SocialProperties();\n\t/**\n\t * OAuth2认证服务器配置\n\t */\n\tprivate OAuth2Properties oauth2 = new OAuth2Properties();\n\n\t/**\n\t * Gets browser.\n\t *\n\t * @return the browser\n\t */\n\tpublic BrowserProperties getBrowser() {\n\t\treturn browser;\n\t}\n\n\t/**\n\t * Sets browser.\n\t *\n\t * @param browser the browser\n\t */\n\tpublic void setBrowser(BrowserProperties browser) {\n\t\tthis.browser = browser;\n\t}\n\n\t/**\n\t * Gets code.\n\t *\n\t * @return the code\n\t */\n\tpublic ValidateCodeProperties getCode() {\n\t\treturn code;\n\t}\n\n\t/**\n\t * Sets code.\n\t *\n\t * @param code the code\n\t */\n\tpublic void setCode(ValidateCodeProperties code) {\n\t\tthis.code = code;\n\t}\n\n\t/**\n\t * Gets social.\n\t *\n\t * @return the social\n\t */\n\tpublic SocialProperties getSocial() {\n\t\treturn social;\n\t}\n\n\t/**\n\t * Sets social.\n\t *\n\t * @param social the social\n\t */\n\tpublic void setSocial(SocialProperties social) {\n\t\tthis.social = social;\n\t}\n\n\t/**\n\t * Gets oauth 2.\n\t *\n\t * @return the oauth 2\n\t */\n\tpublic OAuth2Properties getOauth2() {\n\t\treturn oauth2;\n\t}\n\n\t/**\n\t * Sets oauth 2.\n\t *\n\t * @param oauth2 the oauth 2\n\t */\n\tpublic void setOauth2(OAuth2Properties oauth2) {\n\t\tthis.oauth2 = oauth2;\n\t}\n\n}\n\n"
  },
  {
    "path": "paascloud-common/paascloud-security-core/src/main/java/com/paascloud/security/core/properties/SessionProperties.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：SessionProperties.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.security.core.properties;\n\nimport lombok.Data;\n\n/**\n * session管理相关配置项\n *\n * @author paascloud.net @gmail.com\n */\n@Data\npublic class SessionProperties {\n\n\t/**\n\t * 同一个用户在系统中的最大session数，默认1\n\t */\n\tprivate int maximumSessions = 1;\n\t/**\n\t * 达到最大session时是否阻止新的登录请求，默认为false，不阻止，新的登录会将老的登录失效掉\n\t */\n\tprivate boolean maxSessionsPreventsLogin;\n}\n"
  },
  {
    "path": "paascloud-common/paascloud-security-core/src/main/java/com/paascloud/security/core/properties/SmsCodeProperties.java",
    "content": "package com.paascloud.security.core.properties;\n\nimport lombok.Data;\n\n/**\n * The class Sms code properties.\n *\n * @author paascloud.net @gmail.com\n */\n@Data\npublic class SmsCodeProperties {\n\n\t/**\n\t * 验证码长度\n\t */\n\tprivate int length = 6;\n\t/**\n\t * 过期时间\n\t */\n\tprivate int expireIn = 60;\n\t/**\n\t * 要拦截的url，多个url用逗号隔开，ant pattern\n\t */\n\tprivate String url;\n\t/**\n\t * 每天每个手机号最大送送短信数量\n\t */\n\tprivate int mobileMaxSendCount;\n\t/**\n\t * 每天每个IP最大送送短信数量\n\t */\n\tprivate int ipMaxSendCount;\n\t/**\n\t * 每天最大送送短信数量\n\t */\n\tprivate int totalMaxSendCount;\n\n\n}\n"
  },
  {
    "path": "paascloud-common/paascloud-security-core/src/main/java/com/paascloud/security/core/properties/SocialProperties.java",
    "content": "package com.paascloud.security.core.properties;\n\nimport lombok.Data;\n\n/**\n * 社交登录配置项\n *\n * @author paascloud.net @gmail.com\n */\n@Data\npublic class SocialProperties {\n\n\t/**\n\t * 社交登录功能拦截的url\n\t */\n\tprivate String filterProcessesUrl = \"/auth\";\n\n\tprivate QQProperties qq = new QQProperties();\n\n\tprivate WeixinProperties weixin = new WeixinProperties();\n\n}\n"
  },
  {
    "path": "paascloud-common/paascloud-security-core/src/main/java/com/paascloud/security/core/properties/ValidateCodeProperties.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：ValidateCodeProperties.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.security.core.properties;\n\nimport lombok.Data;\n\n/**\n * 验证码配置\n *\n * @author paascloud.net @gmail.com\n */\n@Data\npublic class ValidateCodeProperties {\n\n\t/**\n\t * 图片验证码配置\n\t */\n\tprivate ImageCodeProperties image = new ImageCodeProperties();\n\t/**\n\t * 短信验证码配置\n\t */\n\tprivate SmsCodeProperties sms = new SmsCodeProperties();\n\t/**\n\t * 邮箱验证码配置\n\t */\n\tprivate EmailCodeProperties email = new EmailCodeProperties();\n\n}\n"
  },
  {
    "path": "paascloud-common/paascloud-security-core/src/main/java/com/paascloud/security/core/properties/WeixinProperties.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：WeixinProperties.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.security.core.properties;\n\nimport lombok.Data;\nimport lombok.EqualsAndHashCode;\nimport org.springframework.boot.autoconfigure.social.SocialProperties;\n\n/**\n * 微信登录配置项\n *\n * @author paascloud.net @gmail.com\n */\n@EqualsAndHashCode(callSuper = true)\n@Data\npublic class WeixinProperties extends SocialProperties {\n\n\t/**\n\t * 第三方id，用来决定发起第三方登录的url，默认是 weixin。\n\t */\n\tprivate String providerId = \"weixin\";\n}\n"
  },
  {
    "path": "paascloud-common/paascloud-security-core/src/main/java/com/paascloud/security/core/social/BaseSocialController.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：BaseSocialController.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.security.core.social;\n\nimport org.springframework.social.connect.Connection;\n\nimport com.paascloud.security.core.social.support.SocialUserInfo;\n\n\n/**\n * The class Social controller.\n *\n * @author paascloud.net@gmail.com\n */\npublic abstract class BaseSocialController {\n\n\t/**\n\t * 根据Connection信息构建SocialUserInfo\n\t *\n\t * @param connection the connection\n\t *\n\t * @return social user info\n\t */\n\tprotected SocialUserInfo buildSocialUserInfo(Connection<?> connection) {\n\t\tSocialUserInfo userInfo = new SocialUserInfo();\n\t\tuserInfo.setProviderId(connection.getKey().getProviderId());\n\t\tuserInfo.setProviderUserId(connection.getKey().getProviderUserId());\n\t\tuserInfo.setNickname(connection.getDisplayName());\n\t\tuserInfo.setHeadimg(connection.getImageUrl());\n\t\treturn userInfo;\n\t}\n\n}\n"
  },
  {
    "path": "paascloud-common/paascloud-security-core/src/main/java/com/paascloud/security/core/social/SocialConfig.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：SocialConfig.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.security.core.social;\n\nimport javax.sql.DataSource;\n\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.context.annotation.Bean;\nimport org.springframework.context.annotation.Configuration;\nimport org.springframework.security.crypto.encrypt.Encryptors;\nimport org.springframework.social.config.annotation.EnableSocial;\nimport org.springframework.social.config.annotation.SocialConfigurerAdapter;\nimport org.springframework.social.connect.ConnectionFactoryLocator;\nimport org.springframework.social.connect.ConnectionSignUp;\nimport org.springframework.social.connect.UsersConnectionRepository;\nimport org.springframework.social.connect.jdbc.JdbcUsersConnectionRepository;\nimport org.springframework.social.connect.web.ProviderSignInUtils;\nimport org.springframework.social.security.SpringSocialConfigurer;\n\nimport com.paascloud.security.core.properties.SecurityProperties;\nimport com.paascloud.security.core.social.support.PcSpringSocialConfigurer;\nimport com.paascloud.security.core.social.support.SocialAuthenticationFilterPostProcessor;\n\n/**\n * 社交登录配置主类\n *\n * @author paascloud.net @gmail.com\n */\n@Configuration\n@EnableSocial\npublic class SocialConfig extends SocialConfigurerAdapter {\n\n\t@Autowired\n\tprivate DataSource dataSource;\n\n\t@Autowired\n\tprivate SecurityProperties securityProperties;\n\n\t@Autowired(required = false)\n\tprivate ConnectionSignUp connectionSignUp;\n\n\t@Autowired(required = false)\n\tprivate SocialAuthenticationFilterPostProcessor socialAuthenticationFilterPostProcessor;\n\n\t/**\n\t * Gets users connection repository.\n\t *\n\t * @param connectionFactoryLocator the connection factory locator\n\t *\n\t * @return the users connection repository\n\t */\n\t@Override\n\tpublic UsersConnectionRepository getUsersConnectionRepository(ConnectionFactoryLocator connectionFactoryLocator) {\n\t\tJdbcUsersConnectionRepository repository = new JdbcUsersConnectionRepository(dataSource, connectionFactoryLocator, Encryptors.noOpText());\n\t\trepository.setTablePrefix(\"pc_uac_\");\n\t\tif (connectionSignUp != null) {\n\t\t\trepository.setConnectionSignUp(connectionSignUp);\n\t\t}\n\t\treturn repository;\n\t}\n\n\t/**\n\t * 社交登录配置类，供浏览器或app模块引入设计登录配置用。\n\t *\n\t * @return spring social configurer\n\t */\n\t@Bean\n\tpublic SpringSocialConfigurer pcSocialSecurityConfig() {\n\t\tString filterProcessesUrl = securityProperties.getSocial().getFilterProcessesUrl();\n\t\tPcSpringSocialConfigurer configurer = new PcSpringSocialConfigurer(filterProcessesUrl);\n\t\tconfigurer.signupUrl(securityProperties.getBrowser().getSignUpUrl());\n\t\tconfigurer.setSocialAuthenticationFilterPostProcessor(socialAuthenticationFilterPostProcessor);\n\t\treturn configurer;\n\t}\n\n\t/**\n\t * 用来处理注册流程的工具类\n\t *\n\t * @param connectionFactoryLocator the connection factory locator\n\t *\n\t * @return provider sign in utils\n\t */\n\t@Bean\n\tpublic ProviderSignInUtils providerSignInUtils(ConnectionFactoryLocator connectionFactoryLocator) {\n\t\treturn new ProviderSignInUtils(connectionFactoryLocator,\n\t\t\t\tgetUsersConnectionRepository(connectionFactoryLocator)) {\n\t\t};\n\t}\n}\n"
  },
  {
    "path": "paascloud-common/paascloud-security-core/src/main/java/com/paascloud/security/core/social/qq/api/QQ.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：QQ.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.security.core.social.qq.api;\n\n\n/**\n * The interface Qq.\n *\n * @author paascloud.net@gmail.com\n */\npublic interface QQ {\n\n\t/**\n\t * Gets user info.\n\t *\n\t * @return the user info\n\t */\n\tQQUserInfo getUserInfo();\n\n}\n"
  },
  {
    "path": "paascloud-common/paascloud-security-core/src/main/java/com/paascloud/security/core/social/qq/api/QQImpl.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：QQImpl.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.security.core.social.qq.api;\n\nimport lombok.extern.slf4j.Slf4j;\nimport org.apache.commons.lang.StringUtils;\nimport org.springframework.social.oauth2.AbstractOAuth2ApiBinding;\nimport org.springframework.social.oauth2.TokenStrategy;\n\nimport com.fasterxml.jackson.databind.ObjectMapper;\n\n\n/**\n * The class Qq.\n *\n * @author paascloud.net @gmail.com\n */\n@Slf4j\npublic class QQImpl extends AbstractOAuth2ApiBinding implements QQ {\n\n\tprivate static final String URL_GET_OPENID = \"https://graph.qq.com/oauth2.0/me?access_token=%s\";\n\n\tprivate static final String URL_GET_USERINFO = \"https://graph.qq.com/user/get_user_info?oauth_consumer_key=%s&openid=%s\";\n\n\tprivate String appId;\n\n\tprivate String openId;\n\n\tprivate ObjectMapper objectMapper = new ObjectMapper();\n\n\t/**\n\t * Instantiates a new Qq.\n\t *\n\t * @param accessToken the access token\n\t * @param appId       the app id\n\t */\n\tpublic QQImpl(String accessToken, String appId) {\n\t\tsuper(accessToken, TokenStrategy.ACCESS_TOKEN_PARAMETER);\n\n\t\tthis.appId = appId;\n\n\t\tString url = String.format(URL_GET_OPENID, accessToken);\n\t\tString result = getRestTemplate().getForObject(url, String.class);\n\n\t\tlog.info(\"result={}\", result);\n\n\t\tthis.openId = StringUtils.substringBetween(result, \"\\\"openid\\\":\\\"\", \"\\\"}\");\n\t}\n\n\t/**\n\t * Gets user info.\n\t *\n\t * @return the user info\n\t */\n\t@Override\n\tpublic QQUserInfo getUserInfo() {\n\n\t\tString url = String.format(URL_GET_USERINFO, appId, openId);\n\t\tString result = getRestTemplate().getForObject(url, String.class);\n\n\t\tlog.info(\"result={}\", result);\n\n\t\tQQUserInfo userInfo;\n\t\ttry {\n\t\t\tuserInfo = objectMapper.readValue(result, QQUserInfo.class);\n\t\t\tuserInfo.setOpenId(openId);\n\t\t\treturn userInfo;\n\t\t} catch (Exception e) {\n\t\t\tthrow new RuntimeException(\"获取用户信息失败\", e);\n\t\t}\n\t}\n\n}\n"
  },
  {
    "path": "paascloud-common/paascloud-security-core/src/main/java/com/paascloud/security/core/social/qq/api/QQUserInfo.java",
    "content": "\n/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：QQUserInfo.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.security.core.social.qq.api;\n\n\nimport com.fasterxml.jackson.annotation.JsonProperty;\nimport lombok.Data;\n\nimport java.io.Serializable;\n\n/**\n * The class Qq user info.\n *\n * @author paascloud.net@gmail.com\n */\n@Data\npublic class QQUserInfo implements Serializable {\n\n\tprivate static final long serialVersionUID = -7584208099330390359L;\n\t/**\n\t * 返回码\n\t */\n\tprivate String ret;\n\t/**\n\t * 如果ret<0，会有相应的错误信息提示，返回数据全部用UTF-8编码。\n\t */\n\tprivate String msg;\n\n\tprivate String openId;\n\t/**\n\t * 不知道什么东西，文档上没写，但是实际api返回里有。\n\t */\n\t@JsonProperty(\"is_lost\")\n\tprivate String isLost;\n\t/**\n\t * 省(直辖市)\n\t */\n\tprivate String province;\n\t/**\n\t * 市(直辖市区)\n\t */\n\tprivate String city;\n\t/**\n\t * 出生年月\n\t */\n\tprivate String year;\n\t/**\n\t * 用户在QQ空间的昵称。\n\t */\n\tprivate String nickname;\n\t/**\n\t * 大小为30×30像素的QQ空间头像URL。\n\t */\n\t@JsonProperty(\"figureurl\")\n\tprivate String figureUrl;\n\t/**\n\t * 大小为50×50像素的QQ空间头像URL。\n\t */\n\t@JsonProperty(\"figureurl_1\")\n\tprivate String figureUrl1;\n\t/**\n\t * 大小为100×100像素的QQ空间头像URL。\n\t */\n\t@JsonProperty(\"figureurl_2\")\n\tprivate String figureUrl2;\n\t/**\n\t * 大小为40×40像素的QQ头像URL。\n\t */\n\t@JsonProperty(\"figureurl_qq_1\")\n\tprivate String figureUrlQq1;\n\t/**\n\t * 大小为100×100像素的QQ头像URL。需要注意，不是所有的用户都拥有QQ的100×100的头像，但40×40像素则是一定会有。\n\t */\n\t@JsonProperty(\"figureurl_qq_2\")\n\tprivate String figureUrlQq2;\n\t/**\n\t * 性别。 如果获取不到则默认返回”男”\n\t */\n\tprivate String gender;\n\t/**\n\t * 标识用户是否为黄钻用户（0：不是；1：是）。\n\t */\n\t@JsonProperty(\"is_yellow_vip\")\n\tprivate String isYellowVip;\n\t/**\n\t * 标识用户是否为黄钻用户（0：不是；1：是）\n\t */\n\tprivate String vip;\n\t/**\n\t * 黄钻等级\n\t */\n\t@JsonProperty(\"yellow_vip_level\")\n\tprivate String yellowVipLevel;\n\t/**\n\t * 黄钻等级\n\t */\n\tprivate String level;\n\t/**\n\t * 标识是否为年费黄钻用户（0：不是； 1：是）\n\t */\n\t@JsonProperty(\"is_yellow_year_vip\")\n\tprivate String isYellowYearVip;\n}\n"
  },
  {
    "path": "paascloud-common/paascloud-security-core/src/main/java/com/paascloud/security/core/social/qq/config/QQAutoConfig.java",
    "content": "\n/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：QQAutoConfig.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.security.core.social.qq.config;\n\nimport com.paascloud.security.core.properties.QQProperties;\nimport com.paascloud.security.core.social.qq.connet.QQConnectionFactory;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;\nimport org.springframework.boot.autoconfigure.social.SocialAutoConfigurerAdapter;\nimport org.springframework.context.annotation.Configuration;\nimport org.springframework.social.connect.ConnectionFactory;\n\nimport com.paascloud.security.core.properties.SecurityProperties;\n\n\n/**\n * The class Qq auto config.\n *\n * @author paascloud.net@gmail.com\n */\n@Configuration\n@ConditionalOnProperty(prefix = \"paascloud.security.social.qq\", name = \"app-id\")\npublic class QQAutoConfig extends SocialAutoConfigurerAdapter {\n\n\tprivate final SecurityProperties securityProperties;\n\n\t@Autowired\n\tpublic QQAutoConfig(SecurityProperties securityProperties) {\n\t\tthis.securityProperties = securityProperties;\n\t}\n\n\t/**\n\t * Create connection factory connection factory.\n\t *\n\t * @return the connection factory\n\t */\n\t@Override\n\tprotected ConnectionFactory<?> createConnectionFactory() {\n\t\tQQProperties qqConfig = securityProperties.getSocial().getQq();\n\t\treturn new QQConnectionFactory(qqConfig.getProviderId(), qqConfig.getAppId(), qqConfig.getAppSecret());\n\t}\n\n}\n"
  },
  {
    "path": "paascloud-common/paascloud-security-core/src/main/java/com/paascloud/security/core/social/qq/connet/QQAdapter.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：QQAdapter.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.security.core.social.qq.connet;\n\nimport com.paascloud.security.core.social.qq.api.QQ;\nimport com.paascloud.security.core.social.qq.api.QQUserInfo;\nimport org.springframework.social.connect.ApiAdapter;\nimport org.springframework.social.connect.ConnectionValues;\nimport org.springframework.social.connect.UserProfile;\n\n/**\n * The class Qq adapter.\n *\n * @author paascloud.net@gmail.com\n */\npublic class QQAdapter implements ApiAdapter<QQ> {\n\n\t/**\n\t * Test boolean.\n\t *\n\t * @param api the api\n\t *\n\t * @return the boolean\n\t */\n\t@Override\n\tpublic boolean test(QQ api) {\n\t\treturn true;\n\t}\n\n\t/**\n\t * Sets connection values.\n\t *\n\t * @param api    the api\n\t * @param values the values\n\t */\n\t@Override\n\tpublic void setConnectionValues(QQ api, ConnectionValues values) {\n\t\tQQUserInfo userInfo = api.getUserInfo();\n\n\t\tvalues.setDisplayName(userInfo.getNickname());\n\t\tvalues.setImageUrl(userInfo.getFigureUrlQq1());\n\t\tvalues.setProfileUrl(null);\n\t\tvalues.setProviderUserId(userInfo.getOpenId());\n\t}\n\n\t/**\n\t * Fetch user profile user profile.\n\t *\n\t * @param api the api\n\t *\n\t * @return the user profile\n\t */\n\t@Override\n\tpublic UserProfile fetchUserProfile(QQ api) {\n\t\treturn null;\n\t}\n\n\t/**\n\t * Update status.\n\t *\n\t * @param api     the api\n\t * @param message the message\n\t */\n\t@Override\n\tpublic void updateStatus(QQ api, String message) {\n\t\t//do noting\n\t}\n\n}\n"
  },
  {
    "path": "paascloud-common/paascloud-security-core/src/main/java/com/paascloud/security/core/social/qq/connet/QQConnectionFactory.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：QQConnectionFactory.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.security.core.social.qq.connet;\n\nimport org.springframework.social.connect.support.OAuth2ConnectionFactory;\nimport com.paascloud.security.core.social.qq.api.QQ;\n\n/**\n * The class Qq connection factory.\n *\n * @author paascloud.net@gmail.com\n */\npublic class QQConnectionFactory extends OAuth2ConnectionFactory<QQ> {\n\n\t/**\n\t * Instantiates a new Qq connection factory.\n\t *\n\t * @param providerId the provider id\n\t * @param appId      the app id\n\t * @param appSecret  the app secret\n\t */\n\tpublic QQConnectionFactory(String providerId, String appId, String appSecret) {\n\t\tsuper(providerId, new QQServiceProvider(appId, appSecret), new QQAdapter());\n\t}\n\n}\n"
  },
  {
    "path": "paascloud-common/paascloud-security-core/src/main/java/com/paascloud/security/core/social/qq/connet/QQOAuth2Template.java",
    "content": "\n/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：QQOAuth2Template.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.security.core.social.qq.connet;\n\nimport lombok.extern.slf4j.Slf4j;\nimport org.apache.commons.lang.StringUtils;\nimport org.springframework.http.converter.StringHttpMessageConverter;\nimport org.springframework.social.oauth2.AccessGrant;\nimport org.springframework.social.oauth2.OAuth2Template;\nimport org.springframework.util.MultiValueMap;\nimport org.springframework.web.client.RestTemplate;\n\nimport java.nio.charset.Charset;\n\n/**\n * The class Qqo auth 2 template.\n *\n * @author paascloud.net@gmail.com\n */\n@Slf4j\npublic class QQOAuth2Template extends OAuth2Template {\n\n\t/**\n\t * Instantiates a new Qqo auth 2 template.\n\t *\n\t * @param clientId       the client id\n\t * @param clientSecret   the client secret\n\t * @param authorizeUrl   the authorize url\n\t * @param accessTokenUrl the access token url\n\t */\n\tQQOAuth2Template(String clientId, String clientSecret, String authorizeUrl, String accessTokenUrl) {\n\t\tsuper(clientId, clientSecret, authorizeUrl, accessTokenUrl);\n\t\tsetUseParametersForClientAuthentication(true);\n\t}\n\n\t/**\n\t * Post for access grant access grant.\n\t *\n\t * @param accessTokenUrl the access token url\n\t * @param parameters     the parameters\n\t *\n\t * @return the access grant\n\t */\n\t@Override\n\tprotected AccessGrant postForAccessGrant(String accessTokenUrl, MultiValueMap<String, String> parameters) {\n\t\tString responseStr = getRestTemplate().postForObject(accessTokenUrl, parameters, String.class);\n\n\t\tlog.info(\"获取accessToke的响应={}\", responseStr);\n\n\t\tString[] items = StringUtils.splitByWholeSeparatorPreserveAllTokens(responseStr, \"&\");\n\n\t\tString accessToken = StringUtils.substringAfterLast(items[0], \"=\");\n\t\tLong expiresIn = new Long(StringUtils.substringAfterLast(items[1], \"=\"));\n\t\tString refreshToken = StringUtils.substringAfterLast(items[2], \"=\");\n\n\t\treturn new AccessGrant(accessToken, null, refreshToken, expiresIn);\n\t}\n\n\t/**\n\t * Create rest template rest template.\n\t *\n\t * @return the rest template\n\t */\n\t@Override\n\tprotected RestTemplate createRestTemplate() {\n\t\tRestTemplate restTemplate = super.createRestTemplate();\n\t\trestTemplate.getMessageConverters().add(new StringHttpMessageConverter(Charset.forName(\"UTF-8\")));\n\t\treturn restTemplate;\n\t}\n\n}\n"
  },
  {
    "path": "paascloud-common/paascloud-security-core/src/main/java/com/paascloud/security/core/social/qq/connet/QQServiceProvider.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：QQServiceProvider.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.security.core.social.qq.connet;\n\nimport org.springframework.social.oauth2.AbstractOAuth2ServiceProvider;\n\nimport com.paascloud.security.core.social.qq.api.QQ;\nimport com.paascloud.security.core.social.qq.api.QQImpl;\n\n\n/**\n * The class Qq service provider.\n *\n * @author paascloud.net@gmail.com\n */\npublic class QQServiceProvider extends AbstractOAuth2ServiceProvider<QQ> {\n\n\tprivate String appId;\n\n\tprivate static final String URL_AUTHORIZE = \"https://graph.qq.com/oauth2.0/authorize\";\n\n\tprivate static final String URL_ACCESS_TOKEN = \"https://graph.qq.com/oauth2.0/token\";\n\n\t/**\n\t * Instantiates a new Qq service provider.\n\t *\n\t * @param appId     the app id\n\t * @param appSecret the app secret\n\t */\n\tQQServiceProvider(String appId, String appSecret) {\n\t\tsuper(new QQOAuth2Template(appId, appSecret, URL_AUTHORIZE, URL_ACCESS_TOKEN));\n\t\tthis.appId = appId;\n\t}\n\n\t/**\n\t * Gets api.\n\t *\n\t * @param accessToken the access token\n\t *\n\t * @return the api\n\t */\n\t@Override\n\tpublic QQ getApi(String accessToken) {\n\t\treturn new QQImpl(accessToken, appId);\n\t}\n\n}\n"
  },
  {
    "path": "paascloud-common/paascloud-security-core/src/main/java/com/paascloud/security/core/social/support/PcSpringSocialConfigurer.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：PcSpringSocialConfigurer.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.security.core.social.support;\n\nimport org.springframework.social.security.SocialAuthenticationFilter;\nimport org.springframework.social.security.SpringSocialConfigurer;\n\n/**\n * 继承默认的社交登录配置，加入自定义的后处理逻辑\n *\n * @author paascloud.net @gmail.com\n */\npublic class PcSpringSocialConfigurer extends SpringSocialConfigurer {\n\n\tprivate String filterProcessesUrl;\n\n\tprivate SocialAuthenticationFilterPostProcessor socialAuthenticationFilterPostProcessor;\n\n\t/**\n\t * Instantiates a new Pc spring social configurer.\n\t *\n\t * @param filterProcessesUrl the filter processes url\n\t */\n\tpublic PcSpringSocialConfigurer(String filterProcessesUrl) {\n\t\tthis.filterProcessesUrl = filterProcessesUrl;\n\t}\n\n\t/**\n\t * Post process t.\n\t *\n\t * @param <T>    the type parameter\n\t * @param object the object\n\t *\n\t * @return the t\n\t */\n\t@SuppressWarnings(\"unchecked\")\n\t@Override\n\tprotected <T> T postProcess(T object) {\n\t\tSocialAuthenticationFilter filter = (SocialAuthenticationFilter) super.postProcess(object);\n\t\tfilter.setFilterProcessesUrl(filterProcessesUrl);\n\t\tif (socialAuthenticationFilterPostProcessor != null) {\n\t\t\tsocialAuthenticationFilterPostProcessor.process(filter);\n\t\t}\n\t\treturn (T) filter;\n\t}\n\n\t/**\n\t * Gets filter processes url.\n\t *\n\t * @return the filter processes url\n\t */\n\tpublic String getFilterProcessesUrl() {\n\t\treturn filterProcessesUrl;\n\t}\n\n\t/**\n\t * Sets filter processes url.\n\t *\n\t * @param filterProcessesUrl the filter processes url\n\t */\n\tpublic void setFilterProcessesUrl(String filterProcessesUrl) {\n\t\tthis.filterProcessesUrl = filterProcessesUrl;\n\t}\n\n\t/**\n\t * Gets social authentication filter post processor.\n\t *\n\t * @return the social authentication filter post processor\n\t */\n\tpublic SocialAuthenticationFilterPostProcessor getSocialAuthenticationFilterPostProcessor() {\n\t\treturn socialAuthenticationFilterPostProcessor;\n\t}\n\n\t/**\n\t * Sets social authentication filter post processor.\n\t *\n\t * @param socialAuthenticationFilterPostProcessor the social authentication filter post processor\n\t */\n\tpublic void setSocialAuthenticationFilterPostProcessor(SocialAuthenticationFilterPostProcessor socialAuthenticationFilterPostProcessor) {\n\t\tthis.socialAuthenticationFilterPostProcessor = socialAuthenticationFilterPostProcessor;\n\t}\n\n}\n"
  },
  {
    "path": "paascloud-common/paascloud-security-core/src/main/java/com/paascloud/security/core/social/support/SocialAuthenticationFilterPostProcessor.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：SocialAuthenticationFilterPostProcessor.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.security.core.social.support;\n\nimport org.springframework.social.security.SocialAuthenticationFilter;\n\n/**\n * SocialAuthenticationFilter后处理器，用于在不同环境下个性化社交登录的配置\n *\n * @author paascloud.net @gmail.com\n */\npublic interface SocialAuthenticationFilterPostProcessor {\n\n\t/**\n\t * Process.\n\t *\n\t * @param socialAuthenticationFilter the social authentication filter\n\t */\n\tvoid process(SocialAuthenticationFilter socialAuthenticationFilter);\n\n}\n"
  },
  {
    "path": "paascloud-common/paascloud-security-core/src/main/java/com/paascloud/security/core/social/support/SocialUserInfo.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：SocialUserInfo.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.security.core.social.support;\n\nimport lombok.Data;\n\n/**\n * The class Social user info.\n *\n * @author paascloud.net@gmail.com\n */\n@Data\npublic class SocialUserInfo {\n\n\tprivate String providerId;\n\n\tprivate String providerUserId;\n\n\tprivate String nickname;\n\n\tprivate String headimg;\n\n}\n"
  },
  {
    "path": "paascloud-common/paascloud-security-core/src/main/java/com/paascloud/security/core/social/view/PcConnectView.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：PcConnectView.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.security.core.social.view;\n\nimport org.springframework.web.servlet.view.AbstractView;\n\nimport javax.servlet.http.HttpServletRequest;\nimport javax.servlet.http.HttpServletResponse;\nimport java.util.Map;\n\n/**\n * 绑定结果视图\n *\n * @author paascloud.net @gmail.com\n */\npublic class PcConnectView extends AbstractView {\n\n\tprivate static final String CONNECTIONS = \"connections\";\n\n\t/**\n\t * Render merged output model.\n\t *\n\t * @param model    the model\n\t * @param request  the request\n\t * @param response the response\n\t *\n\t * @throws Exception the exception\n\t */\n\t@Override\n\tprotected void renderMergedOutputModel(Map<String, Object> model, HttpServletRequest request,\n\t                                       HttpServletResponse response) throws Exception {\n\n\t\tresponse.setContentType(\"text/html;charset=UTF-8\");\n\t\tif (model.get(CONNECTIONS) == null) {\n\t\t\tresponse.getWriter().write(\"<h3>解绑成功</h3>\");\n\t\t} else {\n\t\t\tresponse.getWriter().write(\"<h3>绑定成功</h3>\");\n\t\t}\n\n\t}\n\n}\n"
  },
  {
    "path": "paascloud-common/paascloud-security-core/src/main/java/com/paascloud/security/core/social/view/PcConnectionStatusView.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：PcConnectionStatusView.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.security.core.social.view;\n\nimport com.fasterxml.jackson.databind.ObjectMapper;\nimport org.apache.commons.collections.CollectionUtils;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.social.connect.Connection;\nimport org.springframework.stereotype.Component;\nimport org.springframework.web.servlet.view.AbstractView;\n\nimport javax.servlet.http.HttpServletRequest;\nimport javax.servlet.http.HttpServletResponse;\nimport java.util.HashMap;\nimport java.util.List;\nimport java.util.Map;\n\n/**\n * 社交账号绑定状态视图\n *\n * @author paascloud.net @gmail.com\n */\n@Component(\"connect/status\")\npublic class PcConnectionStatusView extends AbstractView {\n\n\t@Autowired\n\tprivate ObjectMapper objectMapper;\n\n\t/**\n\t * Render merged output model.\n\t *\n\t * @param model    the model\n\t * @param request  the request\n\t * @param response the response\n\t *\n\t * @throws Exception the exception\n\t */\n\t@SuppressWarnings(\"unchecked\")\n\t@Override\n\tprotected void renderMergedOutputModel(Map<String, Object> model, HttpServletRequest request,\n\t                                       HttpServletResponse response) throws Exception {\n\n\t\tMap<String, List<Connection<?>>> connections = (Map<String, List<Connection<?>>>) model.get(\"connectionMap\");\n\n\t\tMap<String, Boolean> result = new HashMap<>(8);\n\t\tfor (String key : connections.keySet()) {\n\t\t\tresult.put(key, CollectionUtils.isNotEmpty(connections.get(key)));\n\t\t}\n\n\t\tresponse.setContentType(\"application/json;charset=UTF-8\");\n\t\tresponse.getWriter().write(objectMapper.writeValueAsString(result));\n\t}\n\n}\n"
  },
  {
    "path": "paascloud-common/paascloud-security-core/src/main/java/com/paascloud/security/core/social/weixin/api/Weixin.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：Weixin.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.security.core.social.weixin.api;\n\n/**\n * 微信API调用接口\n *\n * @author paascloud.net @gmail.com\n */\npublic interface Weixin {\n\n\t/**\n\t * Gets user info.\n\t *\n\t * @param openId the open id\n\t *\n\t * @return the user info\n\t */\n\tWeixinUserInfo getUserInfo(String openId);\n\n}\n"
  },
  {
    "path": "paascloud-common/paascloud-security-core/src/main/java/com/paascloud/security/core/social/weixin/api/WeixinImpl.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：WeixinImpl.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.security.core.social.weixin.api;\n\nimport com.fasterxml.jackson.databind.ObjectMapper;\nimport lombok.extern.slf4j.Slf4j;\nimport org.apache.commons.lang.StringUtils;\nimport org.springframework.http.converter.HttpMessageConverter;\nimport org.springframework.http.converter.StringHttpMessageConverter;\nimport org.springframework.social.oauth2.AbstractOAuth2ApiBinding;\nimport org.springframework.social.oauth2.TokenStrategy;\n\nimport java.nio.charset.Charset;\nimport java.util.List;\n\n/**\n * Weixin API调用模板， scope为Request的Spring bean, 根据当前用户的accessToken创建。\n *\n * @author paascloud.net @gmail.com\n */\n@Slf4j\npublic class WeixinImpl extends AbstractOAuth2ApiBinding implements Weixin {\n\n\tprivate ObjectMapper objectMapper = new ObjectMapper();\n\tprivate static final String ERR_CODE = \"errcode\";\n\t/**\n\t * 获取用户信息的url\n\t */\n\tprivate static final String URL_GET_USER_INFO = \"https://api.weixin.qq.com/sns/userinfo?openid=\";\n\n\t/**\n\t * Instantiates a new Weixin.\n\t *\n\t * @param accessToken the access token\n\t */\n\tpublic WeixinImpl(String accessToken) {\n\t\tsuper(accessToken, TokenStrategy.ACCESS_TOKEN_PARAMETER);\n\t}\n\n\t/**\n\t * 默认注册的StringHttpMessageConverter字符集为ISO-8859-1，而微信返回的是UTF-8的，所以覆盖了原来的方法。\n\t *\n\t * @return the message converters\n\t */\n\t@Override\n\tprotected List<HttpMessageConverter<?>> getMessageConverters() {\n\t\tList<HttpMessageConverter<?>> messageConverters = super.getMessageConverters();\n\t\tmessageConverters.remove(0);\n\t\tmessageConverters.add(new StringHttpMessageConverter(Charset.forName(\"UTF-8\")));\n\t\treturn messageConverters;\n\t}\n\n\t/**\n\t * 获取微信用户信息。\n\t *\n\t * @param openId the open id\n\t *\n\t * @return the user info\n\t */\n\t@Override\n\tpublic WeixinUserInfo getUserInfo(String openId) {\n\t\tString url = URL_GET_USER_INFO + openId;\n\t\tString response = getRestTemplate().getForObject(url, String.class);\n\t\tif (StringUtils.contains(response, ERR_CODE)) {\n\t\t\treturn null;\n\t\t}\n\t\tWeixinUserInfo profile = null;\n\t\ttry {\n\t\t\tprofile = objectMapper.readValue(response, WeixinUserInfo.class);\n\t\t} catch (Exception e) {\n\t\t\tlog.error(\"getUserInfo={}\", e.getMessage(), e);\n\t\t}\n\t\treturn profile;\n\t}\n\n}\n"
  },
  {
    "path": "paascloud-common/paascloud-security-core/src/main/java/com/paascloud/security/core/social/weixin/api/WeixinUserInfo.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：WeixinUserInfo.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.security.core.social.weixin.api;\n\nimport lombok.Data;\n\n/**\n * 微信用户信息\n *\n * @author paascloud.net @gmail.com\n */\n@Data\npublic class WeixinUserInfo {\n\n\t/**\n\t * 普通用户的标识，对当前开发者帐号唯一\n\t */\n\tprivate String openid;\n\t/**\n\t * 普通用户昵称\n\t */\n\tprivate String nickname;\n\t/**\n\t * 语言\n\t */\n\tprivate String language;\n\t/**\n\t * 普通用户性别，1为男性，2为女性\n\t */\n\tprivate String sex;\n\t/**\n\t * 普通用户个人资料填写的省份\n\t */\n\tprivate String province;\n\t/**\n\t * 普通用户个人资料填写的城市\n\t */\n\tprivate String city;\n\t/**\n\t * 国家，如中国为CN\n\t */\n\tprivate String country;\n\t/**\n\t * 用户头像，最后一个数值代表正方形头像大小（有0、46、64、96、132数值可选，0代表640*640正方形头像），用户没有头像时该项为空\n\t */\n\tprivate String headimgurl;\n\t/**\n\t * 用户特权信息，json数组，如微信沃卡用户为（chinaunicom）\n\t */\n\tprivate String[] privilege;\n\t/**\n\t * 用户统一标识。针对一个微信开放平台帐号下的应用，同一用户的unionid是唯一的。\n\t */\n\tprivate String unionid;\n\n}\n"
  },
  {
    "path": "paascloud-common/paascloud-security-core/src/main/java/com/paascloud/security/core/social/weixin/config/WeixinAutoConfiguration.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：WeixinAutoConfiguration.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.security.core.social.weixin.config;\n\nimport com.paascloud.security.core.social.weixin.connect.WeixinConnectionFactory;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;\nimport org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;\nimport org.springframework.boot.autoconfigure.social.SocialAutoConfigurerAdapter;\nimport org.springframework.context.annotation.Bean;\nimport org.springframework.context.annotation.Configuration;\nimport org.springframework.social.connect.ConnectionFactory;\nimport org.springframework.web.servlet.View;\n\nimport com.paascloud.security.core.properties.SecurityProperties;\nimport com.paascloud.security.core.properties.WeixinProperties;\nimport com.paascloud.security.core.social.view.PcConnectView;\n\n/**\n * 微信登录配置\n *\n * @author paascloud.net @gmail.com\n */\n@Configuration\n@ConditionalOnProperty(prefix = \"paascloud.security.social.weixin\", name = \"app-id\")\npublic class WeixinAutoConfiguration extends SocialAutoConfigurerAdapter {\n\n\t@Autowired\n\tprivate SecurityProperties securityProperties;\n\n\t/**\n\t * Create connection factory connection factory.\n\t *\n\t * @return the connection factory\n\t */\n\t@Override\n\tprotected ConnectionFactory<?> createConnectionFactory() {\n\t\tWeixinProperties weixinConfig = securityProperties.getSocial().getWeixin();\n\t\treturn new WeixinConnectionFactory(weixinConfig.getProviderId(), weixinConfig.getAppId(),\n\t\t\t\tweixinConfig.getAppSecret());\n\t}\n\n\t/**\n\t * Weixin connected view view.\n\t *\n\t * @return the view\n\t */\n\t@Bean({\"connect/weixinConnect\", \"connect/weixinConnected\"})\n\t@ConditionalOnMissingBean(name = \"weixinConnectedView\")\n\tpublic View weixinConnectedView() {\n\t\treturn new PcConnectView();\n\t}\n\n}\n"
  },
  {
    "path": "paascloud-common/paascloud-security-core/src/main/java/com/paascloud/security/core/social/weixin/connect/WeixinAccessGrant.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：WeixinAccessGrant.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.security.core.social.weixin.connect;\n\nimport org.springframework.social.oauth2.AccessGrant;\n\n/**\n * 微信的access_token信息。与标准OAuth2协议不同，微信在获取access_token时会同时返回openId,并没有单独的通过accessToke换取openId的服务\n * <p>\n * 所以在这里继承了标准AccessGrant，添加了openId字段，作为对微信access_token信息的封装。\n *\n * @author paascloud.net @gmail.com\n */\npublic class WeixinAccessGrant extends AccessGrant {\n\n\n\tprivate static final long serialVersionUID = -7243374526633186782L;\n\n\tprivate String openId;\n\n\t/**\n\t * Instantiates a new Weixin access grant.\n\t */\n\tpublic WeixinAccessGrant() {\n\t\tsuper(\"\");\n\t}\n\n\t/**\n\t * Instantiates a new Weixin access grant.\n\t *\n\t * @param accessToken  the access token\n\t * @param scope        the scope\n\t * @param refreshToken the refresh token\n\t * @param expiresIn    the expires in\n\t */\n\tpublic WeixinAccessGrant(String accessToken, String scope, String refreshToken, Long expiresIn) {\n\t\tsuper(accessToken, scope, refreshToken, expiresIn);\n\t}\n\n\t/**\n\t * Gets open id.\n\t *\n\t * @return the openId\n\t */\n\tpublic String getOpenId() {\n\t\treturn openId;\n\t}\n\n\t/**\n\t * Sets open id.\n\t *\n\t * @param openId the openId to set\n\t */\n\tpublic void setOpenId(String openId) {\n\t\tthis.openId = openId;\n\t}\n\n}\n"
  },
  {
    "path": "paascloud-common/paascloud-security-core/src/main/java/com/paascloud/security/core/social/weixin/connect/WeixinAdapter.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：WeixinAdapter.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.security.core.social.weixin.connect;\n\nimport com.paascloud.security.core.social.weixin.api.WeixinUserInfo;\nimport org.springframework.social.connect.ApiAdapter;\nimport org.springframework.social.connect.ConnectionValues;\nimport org.springframework.social.connect.UserProfile;\n\nimport com.paascloud.security.core.social.weixin.api.Weixin;\n\n/**\n * 微信 api适配器，将微信 api的数据模型转为spring social的标准模型。\n *\n * @author paascloud.net @gmail.com\n */\npublic class WeixinAdapter implements ApiAdapter<Weixin> {\n\n\tprivate String openId;\n\n\t/**\n\t * Instantiates a new Weixin adapter.\n\t */\n\tWeixinAdapter() {\n\t}\n\n\t/**\n\t * Instantiates a new Weixin adapter.\n\t *\n\t * @param openId the open id\n\t */\n\tWeixinAdapter(String openId) {\n\t\tthis.openId = openId;\n\t}\n\n\t/**\n\t * Test boolean.\n\t *\n\t * @param api the api\n\t *\n\t * @return boolean boolean\n\t */\n\t@Override\n\tpublic boolean test(Weixin api) {\n\t\treturn true;\n\t}\n\n\t/**\n\t * Sets connection values.\n\t *\n\t * @param api    the api\n\t * @param values the values\n\t */\n\t@Override\n\tpublic void setConnectionValues(Weixin api, ConnectionValues values) {\n\t\tWeixinUserInfo profile = api.getUserInfo(openId);\n\t\tvalues.setProviderUserId(profile.getOpenid());\n\t\tvalues.setDisplayName(profile.getNickname());\n\t\tvalues.setImageUrl(profile.getHeadimgurl());\n\t}\n\n\t/**\n\t * Fetch user profile user profile.\n\t *\n\t * @param api the api\n\t *\n\t * @return user profile\n\t */\n\t@Override\n\tpublic UserProfile fetchUserProfile(Weixin api) {\n\t\treturn null;\n\t}\n\n\t/**\n\t * Update status.\n\t *\n\t * @param api     the api\n\t * @param message the message\n\t */\n\t@Override\n\tpublic void updateStatus(Weixin api, String message) {\n\t\t//do nothing\n\t}\n\n}\n"
  },
  {
    "path": "paascloud-common/paascloud-security-core/src/main/java/com/paascloud/security/core/social/weixin/connect/WeixinConnectionFactory.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：WeixinConnectionFactory.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.security.core.social.weixin.connect;\n\nimport org.springframework.social.connect.ApiAdapter;\nimport org.springframework.social.connect.Connection;\nimport org.springframework.social.connect.ConnectionData;\nimport org.springframework.social.connect.support.OAuth2Connection;\nimport org.springframework.social.connect.support.OAuth2ConnectionFactory;\nimport org.springframework.social.oauth2.AccessGrant;\nimport org.springframework.social.oauth2.OAuth2ServiceProvider;\n\nimport com.paascloud.security.core.social.weixin.api.Weixin;\n\n/**\n * 微信连接工厂\n *\n * @author paascloud.net @gmail.com\n */\npublic class WeixinConnectionFactory extends OAuth2ConnectionFactory<Weixin> {\n\n\t/**\n\t * Instantiates a new Weixin connection factory.\n\t *\n\t * @param providerId the provider id\n\t * @param appId      the app id\n\t * @param appSecret  the app secret\n\t */\n\tpublic WeixinConnectionFactory(String providerId, String appId, String appSecret) {\n\t\tsuper(providerId, new WeixinServiceProvider(appId, appSecret), new WeixinAdapter());\n\t}\n\n\t/**\n\t * 由于微信的openId是和accessToken一起返回的，所以在这里直接根据accessToken设置providerUserId即可，不用像QQ那样通过QQAdapter来获取\n\t *\n\t * @param accessGrant the access grant\n\t *\n\t * @return the string\n\t */\n\t@Override\n\tprotected String extractProviderUserId(AccessGrant accessGrant) {\n\t\tif (accessGrant instanceof WeixinAccessGrant) {\n\t\t\treturn ((WeixinAccessGrant) accessGrant).getOpenId();\n\t\t}\n\t\treturn null;\n\t}\n\n\t/**\n\t * Create connection connection.\n\t *\n\t * @param accessGrant the access grant\n\t *\n\t * @return the connection\n\t */\n\t@Override\n\tpublic Connection<Weixin> createConnection(AccessGrant accessGrant) {\n\t\treturn new OAuth2Connection<>(getProviderId(), extractProviderUserId(accessGrant), accessGrant.getAccessToken(),\n\t\t\t\taccessGrant.getRefreshToken(), accessGrant.getExpireTime(), getOAuth2ServiceProvider(), getApiAdapter(extractProviderUserId(accessGrant)));\n\t}\n\n\t/**\n\t * Create connection connection.\n\t *\n\t * @param data the data\n\t *\n\t * @return the connection\n\t */\n\t@Override\n\tpublic Connection<Weixin> createConnection(ConnectionData data) {\n\t\treturn new OAuth2Connection<>(data, getOAuth2ServiceProvider(), getApiAdapter(data.getProviderUserId()));\n\t}\n\n\tprivate ApiAdapter<Weixin> getApiAdapter(String providerUserId) {\n\t\treturn new WeixinAdapter(providerUserId);\n\t}\n\n\tprivate OAuth2ServiceProvider<Weixin> getOAuth2ServiceProvider() {\n\t\treturn (OAuth2ServiceProvider<Weixin>) getServiceProvider();\n\t}\n\n\n}\n"
  },
  {
    "path": "paascloud-common/paascloud-security-core/src/main/java/com/paascloud/security/core/social/weixin/connect/WeixinOAuth2Template.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：WeixinOAuth2Template.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.security.core.social.weixin.connect;\n\nimport com.fasterxml.jackson.databind.ObjectMapper;\nimport lombok.extern.slf4j.Slf4j;\nimport org.apache.commons.collections.MapUtils;\nimport org.apache.commons.lang.StringUtils;\nimport org.springframework.http.converter.StringHttpMessageConverter;\nimport org.springframework.social.oauth2.AccessGrant;\nimport org.springframework.social.oauth2.OAuth2Parameters;\nimport org.springframework.social.oauth2.OAuth2Template;\nimport org.springframework.util.MultiValueMap;\nimport org.springframework.web.client.RestTemplate;\n\nimport java.nio.charset.Charset;\nimport java.util.Map;\n\n/**\n * 完成微信的OAuth2认证流程的模板类。国内厂商实现的OAuth2每个都不同, spring默认提供的OAuth2Template适应不了，只能针对每个厂商自己微调。\n *\n * @author paascloud.net @gmail.com\n */\n@Slf4j\npublic class WeixinOAuth2Template extends OAuth2Template {\n\n\tprivate String clientId;\n\n\tprivate String clientSecret;\n\n\tprivate String accessTokenUrl;\n\n\tprivate static final String REFRESH_TOKEN_URL = \"https://api.weixin.qq.com/sns/oauth2/refresh_token\";\n\tprivate static final String ERR_CODE = \"errcode\";\n\tprivate static final String ERR_MSG = \"errmsg\";\n\n\t/**\n\t * Instantiates a new Weixin o auth 2 template.\n\t *\n\t * @param clientId       the client id\n\t * @param clientSecret   the client secret\n\t * @param authorizeUrl   the authorize url\n\t * @param accessTokenUrl the access token url\n\t */\n\tWeixinOAuth2Template(String clientId, String clientSecret, String authorizeUrl, String accessTokenUrl) {\n\t\tsuper(clientId, clientSecret, authorizeUrl, accessTokenUrl);\n\t\tsetUseParametersForClientAuthentication(true);\n\t\tthis.clientId = clientId;\n\t\tthis.clientSecret = clientSecret;\n\t\tthis.accessTokenUrl = accessTokenUrl;\n\t}\n\n\t/**\n\t * Exchange for access access grant.\n\t *\n\t * @param authorizationCode the authorization code\n\t * @param redirectUri       the redirect uri\n\t * @param parameters        the parameters\n\t *\n\t * @return the access grant\n\t */\n\t@Override\n\tpublic AccessGrant exchangeForAccess(String authorizationCode, String redirectUri,\n\t                                     MultiValueMap<String, String> parameters) {\n\n\t\tStringBuilder accessTokenRequestUrl = new StringBuilder(accessTokenUrl);\n\n\t\taccessTokenRequestUrl.append(\"?appid=\").append(clientId);\n\t\taccessTokenRequestUrl.append(\"&secret=\").append(clientSecret);\n\t\taccessTokenRequestUrl.append(\"&code=\").append(authorizationCode);\n\t\taccessTokenRequestUrl.append(\"&grant_type=authorization_code\");\n\t\taccessTokenRequestUrl.append(\"&redirect_uri=\").append(redirectUri);\n\n\t\treturn getAccessToken(accessTokenRequestUrl);\n\t}\n\n\t/**\n\t * Refresh access access grant.\n\t *\n\t * @param refreshToken         the refresh token\n\t * @param additionalParameters the additional parameters\n\t *\n\t * @return the access grant\n\t */\n\t@Override\n\tpublic AccessGrant refreshAccess(String refreshToken, MultiValueMap<String, String> additionalParameters) {\n\n\t\tStringBuilder refreshTokenUrl = new StringBuilder(REFRESH_TOKEN_URL);\n\n\t\trefreshTokenUrl.append(\"?appid=\").append(clientId);\n\t\trefreshTokenUrl.append(\"&grant_type=refresh_token\");\n\t\trefreshTokenUrl.append(\"&refresh_token=\").append(refreshToken);\n\n\t\treturn getAccessToken(refreshTokenUrl);\n\t}\n\n\t@SuppressWarnings(\"unchecked\")\n\tprivate AccessGrant getAccessToken(StringBuilder accessTokenRequestUrl) {\n\n\t\tlog.info(\"获取access_token, 请求URL: \" + accessTokenRequestUrl.toString());\n\n\t\tString response = getRestTemplate().getForObject(accessTokenRequestUrl.toString(), String.class);\n\n\t\tlog.info(\"获取access_token, 响应内容: \" + response);\n\n\t\tMap<String, Object> result = null;\n\t\ttry {\n\t\t\tresult = new ObjectMapper().readValue(response, Map.class);\n\t\t} catch (Exception e) {\n\t\t\tlog.error(\"getAccessToken={}\", e.getMessage(), e);\n\t\t}\n\n\t\t//返回错误码时直接返回空\n\t\tif (StringUtils.isNotBlank(MapUtils.getString(result, ERR_CODE))) {\n\t\t\tString errCode = MapUtils.getString(result, ERR_CODE);\n\t\t\tString errMsg = MapUtils.getString(result, ERR_MSG);\n\t\t\tthrow new RuntimeException(\"获取access token失败, errCode:\" + errCode + \", errMsg:\" + errMsg);\n\t\t}\n\n\t\tWeixinAccessGrant accessToken = new WeixinAccessGrant(\n\t\t\t\tMapUtils.getString(result, \"access_token\"),\n\t\t\t\tMapUtils.getString(result, \"scope\"),\n\t\t\t\tMapUtils.getString(result, \"refresh_token\"),\n\t\t\t\tMapUtils.getLong(result, \"expires_in\"));\n\n\t\taccessToken.setOpenId(MapUtils.getString(result, \"openid\"));\n\n\t\treturn accessToken;\n\t}\n\n\t/**\n\t * 构建获取授权码的请求。也就是引导用户跳转到微信的地址。\n\t *\n\t * @param parameters the parameters\n\t *\n\t * @return the string\n\t */\n\t@Override\n\tpublic String buildAuthenticateUrl(OAuth2Parameters parameters) {\n\t\tString url = super.buildAuthenticateUrl(parameters);\n\t\turl = url + \"&appid=\" + clientId + \"&scope=snsapi_login\";\n\t\treturn url;\n\t}\n\n\t/**\n\t * Build authorize url string.\n\t *\n\t * @param parameters the parameters\n\t *\n\t * @return the string\n\t */\n\t@Override\n\tpublic String buildAuthorizeUrl(OAuth2Parameters parameters) {\n\t\treturn buildAuthenticateUrl(parameters);\n\t}\n\n\t/**\n\t * 微信返回的contentType是html/text，添加相应的HttpMessageConverter来处理。\n\t *\n\t * @return the rest template\n\t */\n\t@Override\n\tprotected RestTemplate createRestTemplate() {\n\t\tRestTemplate restTemplate = super.createRestTemplate();\n\t\trestTemplate.getMessageConverters().add(new StringHttpMessageConverter(Charset.forName(\"UTF-8\")));\n\t\treturn restTemplate;\n\t}\n\n}\n"
  },
  {
    "path": "paascloud-common/paascloud-security-core/src/main/java/com/paascloud/security/core/social/weixin/connect/WeixinServiceProvider.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：WeixinServiceProvider.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.security.core.social.weixin.connect;\n\nimport org.springframework.social.oauth2.AbstractOAuth2ServiceProvider;\n\nimport com.paascloud.security.core.social.weixin.api.Weixin;\nimport com.paascloud.security.core.social.weixin.api.WeixinImpl;\n\n/**\n * 微信的OAuth2流程处理器的提供器，供spring social的connect体系调用\n *\n * @author paascloud.net @gmail.com\n */\npublic class WeixinServiceProvider extends AbstractOAuth2ServiceProvider<Weixin> {\n\n\t/**\n\t * 微信获取授权码的url\n\t */\n\tprivate static final String URL_AUTHORIZE = \"https://open.weixin.qq.com/connect/qrconnect\";\n\t/**\n\t * 微信获取accessToken的url\n\t */\n\tprivate static final String URL_ACCESS_TOKEN = \"https://api.weixin.qq.com/sns/oauth2/access_token\";\n\n\t/**\n\t * Instantiates a new Weixin service provider.\n\t *\n\t * @param appId     the app id\n\t * @param appSecret the app secret\n\t */\n\tWeixinServiceProvider(String appId, String appSecret) {\n\t\tsuper(new WeixinOAuth2Template(appId, appSecret, URL_AUTHORIZE, URL_ACCESS_TOKEN));\n\t}\n\n\t/**\n\t * Gets api.\n\t *\n\t * @param accessToken the access token\n\t *\n\t * @return the api\n\t */\n\t@Override\n\tpublic Weixin getApi(String accessToken) {\n\t\treturn new WeixinImpl(accessToken);\n\t}\n\n}\n"
  },
  {
    "path": "paascloud-common/paascloud-security-core/src/main/java/com/paascloud/security/core/validate/code/CookieUtil.java",
    "content": "package com.paascloud.security.core.validate.code;\n\nimport lombok.AccessLevel;\nimport lombok.NoArgsConstructor;\nimport org.apache.commons.lang.StringUtils;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\nimport javax.servlet.http.Cookie;\nimport javax.servlet.http.HttpServletRequest;\nimport javax.servlet.http.HttpServletResponse;\nimport java.io.UnsupportedEncodingException;\nimport java.net.URLEncoder;\n\n\n/**\n * The class Cookie util.\n *\n * @author paascloud.net@gmail.com\n */\n@NoArgsConstructor(access = AccessLevel.PRIVATE)\npublic class CookieUtil {\n\n\tprivate static Logger logger = LoggerFactory.getLogger(CookieUtil.class);\n\t/**\n\t * 设置cookie域，默认为：paascloud.net]\n\t */\n\tprivate final static String COOKIE_DOMAIN = \"paascloud.net\";\n\t/**\n\t * 设置默认路径：/，这个路径即该工程下都可以访问该cookie 如果不设置路径，那么只有设置该cookie路径及其子路径可以访问\n\t */\n\tprivate final static String COOKIE_PATH = \"/\";\n\t/**\n\t * 设置cookie有效期，根据需要自定义[本系统设置为7天]\n\t */\n\tprivate final static int COOKIE_MAX_AGE = 60 * 60 * 24 * 7;\n\n\n\t/**\n\t * Sets cookie.\n\t *\n\t * @param name     the name\n\t * @param value    the value\n\t * @param maxAge   the max age\n\t * @param response the response\n\t */\n\tpublic static void setCookie(String name, String value, Integer maxAge, HttpServletResponse response) {\n\t\tlogger.info(\"setCookie - 设置cookie. name={}, value={}. maxAge={}\", name, value, maxAge);\n\t\tCookie cookie;\n\t\ttry {\n\t\t\tcookie = new Cookie(name, URLEncoder.encode(value, \"UTF-8\"));\n\t\t} catch (UnsupportedEncodingException e) {\n\t\t\tthrow new IllegalArgumentException(\"Cookie转码异常\");\n\t\t}\n\t\tcookie.setDomain(COOKIE_DOMAIN);\n\t\tcookie.setPath(COOKIE_PATH);\n\t\tcookie.setMaxAge(maxAge == null ? COOKIE_MAX_AGE : maxAge);\n\t\tresponse.addCookie(cookie);\n\t\tlogger.info(\"setCookie - 设置cookie. [OK]\");\n\t}\n\n\t/**\n\t * 根据Cookie的key得到Cookie的值.\n\t *\n\t * @param request the request\n\t * @param name    the name\n\t *\n\t * @return the cookie value\n\t */\n\tpublic static String getCookieValue(HttpServletRequest request, String name) {\n\t\tCookie cookie = getCookie(request, name);\n\t\tif (cookie != null) {\n\t\t\treturn cookie.getValue();\n\t\t} else {\n\t\t\treturn null;\n\t\t}\n\t}\n\n\t/**\n\t * 根据Cookie的名称得到Cookie对象.\n\t *\n\t * @param request the request\n\t * @param name    the name\n\t *\n\t * @return the cookie\n\t */\n\tpublic static Cookie getCookie(HttpServletRequest request, String name) {\n\t\tlogger.info(\"获取指定名称的cookie. name={}\", name);\n\t\tCookie[] cookies = request.getCookies();\n\t\tif (cookies == null || StringUtils.isBlank(name)) {\n\t\t\treturn null;\n\t\t}\n\t\tCookie cookie = null;\n\t\tfor (Cookie cooky : cookies) {\n\t\t\tif (!cooky.getName().equals(name) || StringUtils.isBlank(cooky.getDomain())) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tcookie = cooky;\n\t\t\tif (request.getServerName().contains(cookie.getDomain())) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\treturn cookie;\n\t}\n\n\n\t/**\n\t * 删除指定名称的Cookie.\n\t *\n\t * @param name     the name\n\t * @param response the response\n\t */\n\tpublic static void removeCookie(String name, HttpServletResponse response) {\n\t\tlogger.info(\"removeCookie - 删除指定名称的Cookie. key={}\", name);\n\t\tCookie cookie = new Cookie(name, null);\n\t\tcookie.setDomain(COOKIE_DOMAIN);\n\t\tcookie.setPath(COOKIE_PATH);\n\t\tcookie.setMaxAge(0);\n\t\tresponse.addCookie(cookie);\n\t\tlogger.info(\"removeCookie - 删除指定名称的Cookie. [OK]\");\n\t}\n}\n"
  },
  {
    "path": "paascloud-common/paascloud-security-core/src/main/java/com/paascloud/security/core/validate/code/ValidateCode.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：ValidateCode.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.security.core.validate.code;\n\nimport com.fasterxml.jackson.annotation.JsonIgnore;\nimport com.fasterxml.jackson.databind.annotation.JsonDeserialize;\nimport com.fasterxml.jackson.databind.annotation.JsonSerialize;\nimport com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer;\nimport com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer;\n\nimport java.io.Serializable;\nimport java.time.LocalDateTime;\n\n\n/**\n * 验证码信息封装类\n *\n * @author paascloud.net @gmail.com\n */\npublic class ValidateCode implements Serializable {\n\n\n\tprivate static final long serialVersionUID = 1588203828504660915L;\n\n\tprivate String code;\n\n\tprivate String type;\n\n\t@JsonDeserialize(using = LocalDateTimeDeserializer.class)\n\t@JsonSerialize(using = LocalDateTimeSerializer.class)\n\tprivate LocalDateTime expireTime;\n\n\t/**\n\t * Instantiates a new Validate code.\n\t */\n\tpublic ValidateCode() {\n\t}\n\n\t/**\n\t * Instantiates a new Validate code.\n\t *\n\t * @param code     the code\n\t * @param expireIn the expire in\n\t */\n\tpublic ValidateCode(String code, int expireIn) {\n\t\tthis.code = code;\n\t\tthis.expireTime = LocalDateTime.now().plusSeconds(expireIn);\n\t}\n\n\t/**\n\t * Instantiates a new Validate code.\n\t *\n\t * @param code       the code\n\t * @param expireTime the expire time\n\t */\n\tpublic ValidateCode(String code, LocalDateTime expireTime) {\n\t\tthis.code = code;\n\t\tthis.expireTime = expireTime;\n\t}\n\n\t/**\n\t * Is expired boolean.\n\t *\n\t * @return the boolean\n\t */\n\t@JsonIgnore\n\tpublic boolean isExpired() {\n\t\treturn LocalDateTime.now().isAfter(expireTime);\n\t}\n\n\t/**\n\t * Gets code.\n\t *\n\t * @return the code\n\t */\n\tpublic String getCode() {\n\t\treturn code;\n\t}\n\n\t/**\n\t * Sets code.\n\t *\n\t * @param code the code\n\t */\n\tpublic void setCode(String code) {\n\t\tthis.code = code;\n\t}\n\n\t/**\n\t * Gets expire time.\n\t *\n\t * @return the expire time\n\t */\n\tpublic LocalDateTime getExpireTime() {\n\t\treturn expireTime;\n\t}\n\n\t/**\n\t * Sets expire time.\n\t *\n\t * @param expireTime the expire time\n\t */\n\tpublic void setExpireTime(LocalDateTime expireTime) {\n\t\tthis.expireTime = expireTime;\n\t}\n\n\t/**\n\t * Gets type.\n\t *\n\t * @return the type\n\t */\n\tpublic String getType() {\n\t\treturn type;\n\t}\n\n\t/**\n\t * Sets type.\n\t *\n\t * @param type the type\n\t */\n\tpublic void setType(String type) {\n\t\tthis.type = type;\n\t}\n\n\t/**\n\t * To string string.\n\t *\n\t * @return the string\n\t */\n\t@Override\n\tpublic String toString() {\n\t\tfinal StringBuilder sb = new StringBuilder(\"ValidateCode{\");\n\t\tsb.append(\"code='\").append(code).append('\\'');\n\t\tsb.append(\", type='\").append(type).append('\\'');\n\t\tsb.append(\", expireTime=\").append(expireTime);\n\t\tsb.append('}');\n\t\treturn sb.toString();\n\t}\n}\n"
  },
  {
    "path": "paascloud-common/paascloud-security-core/src/main/java/com/paascloud/security/core/validate/code/ValidateCodeBeanConfig.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：ValidateCodeBeanConfig.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.security.core.validate.code;\n\nimport com.google.code.kaptcha.Producer;\nimport com.paascloud.security.core.properties.SecurityProperties;\nimport com.paascloud.security.core.validate.code.email.DefaultEmailCodeSender;\nimport com.paascloud.security.core.validate.code.email.EmailCodeSender;\nimport com.paascloud.security.core.validate.code.sms.DefaultSmsCodeSender;\nimport com.paascloud.security.core.validate.code.sms.SmsCodeSender;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;\nimport org.springframework.context.annotation.Bean;\nimport org.springframework.context.annotation.Configuration;\n\nimport com.paascloud.security.core.validate.code.image.ImageCodeGenerator;\n\n/**\n * 验证码相关的扩展点配置。配置在这里的bean，业务系统都可以通过声明同类型或同名的bean来覆盖安全\n * 模块默认的配置。\n *\n * @author paascloud.net @gmail.com\n */\n@Configuration\npublic class ValidateCodeBeanConfig {\n\n\t@Autowired\n\tprivate SecurityProperties securityProperties;\n\t@Autowired\n\tprivate Producer captchaProducer;\n\n\t/**\n\t * 图片验证码图片生成器\n\t *\n\t * @return validate code generator\n\t */\n\t@Bean\n\t@ConditionalOnMissingBean(name = \"imageValidateCodeGenerator\")\n\tpublic ValidateCodeGenerator imageValidateCodeGenerator() {\n\t\tImageCodeGenerator codeGenerator = new ImageCodeGenerator();\n\t\tcodeGenerator.setSecurityProperties(securityProperties);\n\t\tcodeGenerator.setCaptchaProducer(captchaProducer);\n\t\treturn codeGenerator;\n\t}\n\n\t/**\n\t * 短信验证码发送器\n\t *\n\t * @return sms code sender\n\t */\n\t@Bean\n\t@ConditionalOnMissingBean(SmsCodeSender.class)\n\tpublic SmsCodeSender smsCodeSender() {\n\t\treturn new DefaultSmsCodeSender();\n\t}\n\n\t/**\n\t * 邮箱验证码发送器\n\t *\n\t * @return sms code sender\n\t */\n\t@Bean\n\t@ConditionalOnMissingBean(EmailCodeSender.class)\n\tpublic EmailCodeSender emailCodeSender() {\n\t\treturn new DefaultEmailCodeSender();\n\t}\n\n}\n"
  },
  {
    "path": "paascloud-common/paascloud-security-core/src/main/java/com/paascloud/security/core/validate/code/ValidateCodeController.java",
    "content": "package com.paascloud.security.core.validate.code;\n\nimport com.paascloud.security.core.SecurityResult;\nimport com.paascloud.security.core.properties.SecurityConstants;\nimport lombok.extern.slf4j.Slf4j;\nimport org.springframework.web.bind.annotation.GetMapping;\nimport org.springframework.web.bind.annotation.PathVariable;\nimport org.springframework.web.bind.annotation.PostMapping;\nimport org.springframework.web.bind.annotation.RestController;\nimport org.springframework.web.context.request.ServletWebRequest;\n\nimport javax.annotation.Resource;\nimport javax.servlet.http.HttpServletRequest;\nimport javax.servlet.http.HttpServletResponse;\n\n/**\n * 生成校验码的请求处理器\n *\n * @author paascloud.net @gmail.com\n */\n@Slf4j\n@RestController\npublic class ValidateCodeController {\n\n\t@Resource\n\tprivate ValidateCodeProcessorHolder validateCodeProcessorHolder;\n\n\t/**\n\t * 创建验证码，根据验证码类型不同，调用不同的 {@link ValidateCodeProcessor}接口实现\n\t *\n\t * @param request  the request\n\t * @param response the response\n\t * @param type     the type\n\t *\n\t * @throws Exception the exception\n\t */\n\t@PostMapping(SecurityConstants.DEFAULT_VALIDATE_CODE_URL_PREFIX + \"/{type}\")\n\tpublic void createCode(HttpServletRequest request, HttpServletResponse response, @PathVariable String type) throws Exception {\n\t\tvalidateCodeProcessorHolder.findValidateCodeProcessor(type).create(new ServletWebRequest(request, response));\n\t}\n\n\t/**\n\t * Check code object.\n\t *\n\t * @param request  the request\n\t * @param response the response\n\t * @param type     the type\n\t *\n\t * @return the object\n\t */\n\t@GetMapping(SecurityConstants.DEFAULT_VALIDATE_CODE_URL_PREFIX + \"/{type}\")\n\tpublic Object checkCode(HttpServletRequest request, HttpServletResponse response, @PathVariable String type) {\n\t\tSecurityResult result = new SecurityResult(SecurityResult.SUCCESS_CODE, \"校验成功\", true);\n\t\ttry {\n\t\t\tvalidateCodeProcessorHolder.findValidateCodeProcessor(type).check(new ServletWebRequest(request, response));\n\t\t} catch (ValidateCodeException e) {\n\t\t\tresult = SecurityResult.error(e.getMessage(), false);\n\t\t} catch (Exception e) {\n\t\t\tlog.error(\"getAccessToken={}\", e.getMessage(), e);\n\t\t\tresult = SecurityResult.error(\"验证码错误\", false);\n\t\t}\n\t\treturn result;\n\t}\n}\n"
  },
  {
    "path": "paascloud-common/paascloud-security-core/src/main/java/com/paascloud/security/core/validate/code/ValidateCodeException.java",
    "content": "package com.paascloud.security.core.validate.code;\n\nimport org.springframework.security.core.AuthenticationException;\n\n\n/**\n * The class Validate code exception.\n *\n * @author paascloud.net@gmail.com\n */\npublic class ValidateCodeException extends AuthenticationException {\n\n\n\tprivate static final long serialVersionUID = -7285211528095468156L;\n\n\t/**\n\t * Instantiates a new Validate code exception.\n\t *\n\t * @param msg the msg\n\t */\n\tpublic ValidateCodeException(String msg) {\n\t\tsuper(msg);\n\t}\n\n}\n"
  },
  {
    "path": "paascloud-common/paascloud-security-core/src/main/java/com/paascloud/security/core/validate/code/ValidateCodeFilter.java",
    "content": "package com.paascloud.security.core.validate.code;\n\nimport com.paascloud.security.core.properties.SecurityConstants;\nimport com.paascloud.security.core.properties.SecurityProperties;\nimport org.apache.commons.lang.StringUtils;\nimport org.springframework.beans.factory.InitializingBean;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.security.web.authentication.AuthenticationFailureHandler;\nimport org.springframework.stereotype.Component;\nimport org.springframework.util.AntPathMatcher;\nimport org.springframework.web.context.request.ServletWebRequest;\nimport org.springframework.web.filter.OncePerRequestFilter;\n\nimport javax.annotation.Resource;\nimport javax.servlet.FilterChain;\nimport javax.servlet.ServletException;\nimport javax.servlet.http.HttpServletRequest;\nimport javax.servlet.http.HttpServletResponse;\nimport java.io.IOException;\nimport java.util.HashMap;\nimport java.util.Map;\nimport java.util.Set;\n\n/**\n * 校验验证码的过滤器\n *\n * @author paascloud.net @gmail.com\n */\n@Component(\"validateCodeFilter\")\npublic class ValidateCodeFilter extends OncePerRequestFilter implements InitializingBean {\n\n\t/**\n\t * 验证码校验失败处理器\n\t */\n\t@Resource\n\tprivate AuthenticationFailureHandler authenticationFailureHandler;\n\t/**\n\t * 系统配置信息\n\t */\n\t@Autowired\n\tprivate SecurityProperties securityProperties;\n\t/**\n\t * 系统中的校验码处理器\n\t */\n\t@Resource\n\tprivate ValidateCodeProcessorHolder validateCodeProcessorHolder;\n\t/**\n\t * 存放所有需要校验验证码的url\n\t */\n\tprivate Map<String, ValidateCodeType> urlMap = new HashMap<>();\n\t/**\n\t * 验证请求url与配置的url是否匹配的工具类\n\t */\n\tprivate AntPathMatcher pathMatcher = new AntPathMatcher();\n\n\tprivate static final String GET = \"get\";\n\n\t/**\n\t * 初始化要拦截的url配置信息\n\t *\n\t * @throws ServletException the servlet exception\n\t */\n\t@Override\n\tpublic void afterPropertiesSet() throws ServletException {\n\t\tsuper.afterPropertiesSet();\n\n\t\turlMap.put(SecurityConstants.DEFAULT_SIGN_IN_PROCESSING_URL_FORM, ValidateCodeType.IMAGE);\n\t\taddUrlToMap(securityProperties.getCode().getImage().getUrl(), ValidateCodeType.IMAGE);\n\n\t\turlMap.put(SecurityConstants.DEFAULT_SIGN_IN_PROCESSING_URL_MOBILE, ValidateCodeType.SMS);\n\t\taddUrlToMap(securityProperties.getCode().getSms().getUrl(), ValidateCodeType.SMS);\n\t\taddUrlToMap(securityProperties.getCode().getEmail().getUrl(), ValidateCodeType.EMAIL);\n\t}\n\n\t/**\n\t * 讲系统中配置的需要校验验证码的URL根据校验的类型放入map\n\t *\n\t * @param urlString the url string\n\t * @param type      the type\n\t */\n\tprivate void addUrlToMap(String urlString, ValidateCodeType type) {\n\t\tif (StringUtils.isNotBlank(urlString)) {\n\t\t\tString[] urls = StringUtils.splitByWholeSeparatorPreserveAllTokens(urlString, \",\");\n\t\t\tfor (String url : urls) {\n\t\t\t\turlMap.put(url, type);\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Do filter internal.\n\t *\n\t * @param request  the request\n\t * @param response the response\n\t * @param chain    the chain\n\t *\n\t * @throws ServletException the servlet exception\n\t * @throws IOException      the io exception\n\t */\n\t@Override\n\tprotected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain)\n\t\t\tthrows ServletException, IOException {\n\n\t\tValidateCodeType type = getValidateCodeType(request);\n\t\tif (type != null) {\n\t\t\tlogger.info(\"校验请求(\" + request.getRequestURI() + \")中的验证码,验证码类型\" + type);\n\t\t\ttry {\n\t\t\t\tvalidateCodeProcessorHolder.findValidateCodeProcessor(type).validate(new ServletWebRequest(request, response));\n\t\t\t\tlogger.info(\"验证码校验通过\");\n\t\t\t} catch (ValidateCodeException exception) {\n\t\t\t\tauthenticationFailureHandler.onAuthenticationFailure(request, response, exception);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\tchain.doFilter(request, response);\n\n\t}\n\n\t/**\n\t * 获取校验码的类型，如果当前请求不需要校验，则返回null\n\t */\n\tprivate ValidateCodeType getValidateCodeType(HttpServletRequest request) {\n\t\tValidateCodeType result = null;\n\t\tif (!StringUtils.equalsIgnoreCase(request.getMethod(), GET)) {\n\t\t\tSet<String> urls = urlMap.keySet();\n\t\t\tfor (String url : urls) {\n\t\t\t\tif (pathMatcher.match(url, request.getRequestURI())) {\n\t\t\t\t\tresult = urlMap.get(url);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn result;\n\t}\n\n}\n"
  },
  {
    "path": "paascloud-common/paascloud-security-core/src/main/java/com/paascloud/security/core/validate/code/ValidateCodeGenerator.java",
    "content": "package com.paascloud.security.core.validate.code;\n\nimport org.springframework.web.context.request.ServletWebRequest;\n\n/**\n * 校验码生成器\n *\n * @author paascloud.net @gmail.com\n */\npublic interface ValidateCodeGenerator {\n\n\t/**\n\t * 生成校验码\n\t *\n\t * @param request the request\n\t *\n\t * @return validate code\n\t */\n\tValidateCode generate(ServletWebRequest request);\n\n}\n"
  },
  {
    "path": "paascloud-common/paascloud-security-core/src/main/java/com/paascloud/security/core/validate/code/ValidateCodeProcessor.java",
    "content": "package com.paascloud.security.core.validate.code;\n\nimport org.springframework.web.context.request.ServletWebRequest;\n\n/**\n * 校验码处理器，封装不同校验码的处理逻辑\n *\n * @author paascloud.net @gmail.com\n */\npublic interface ValidateCodeProcessor {\n\n\t/**\n\t * 创建校验码\n\t *\n\t * @param request the request\n\t *\n\t * @throws Exception the exception\n\t */\n\tvoid create(ServletWebRequest request) throws Exception;\n\n\t/**\n\t * 校验验证码(验证后删除)\n\t *\n\t * @param servletWebRequest the servlet web request\n\t */\n\tvoid validate(ServletWebRequest servletWebRequest);\n\n\t/**\n\t * 校验验证码(验证后不删除)\n\t *\n\t * @param servletWebRequest the servlet web request\n\t */\n\tvoid check(ServletWebRequest servletWebRequest);\n\n}\n"
  },
  {
    "path": "paascloud-common/paascloud-security-core/src/main/java/com/paascloud/security/core/validate/code/ValidateCodeProcessorHolder.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：ValidateCodeProcessorHolder.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.security.core.validate.code;\n\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.stereotype.Component;\n\nimport java.util.Map;\n\n/**\n * 校验码处理器管理器\n *\n * @author paascloud.net @gmail.com\n */\n@Component\npublic class ValidateCodeProcessorHolder {\n\n\tprivate final Map<String, ValidateCodeProcessor> validateCodeProcessors;\n\n\t/**\n\t * Instantiates a new Validate code processor holder.\n\t *\n\t * @param validateCodeProcessors the validate code processors\n\t */\n\t@Autowired\n\tpublic ValidateCodeProcessorHolder(Map<String, ValidateCodeProcessor> validateCodeProcessors) {\n\t\tthis.validateCodeProcessors = validateCodeProcessors;\n\t}\n\n\t/**\n\t * Find validate code processor validate code processor.\n\t *\n\t * @param type the type\n\t *\n\t * @return validate code processor\n\t */\n\tValidateCodeProcessor findValidateCodeProcessor(ValidateCodeType type) {\n\t\treturn findValidateCodeProcessor(type.toString().toLowerCase());\n\t}\n\n\t/**\n\t * Find validate code processor validate code processor.\n\t *\n\t * @param type the type\n\t *\n\t * @return validate code processor\n\t */\n\tValidateCodeProcessor findValidateCodeProcessor(String type) {\n\t\tString name = type.toLowerCase() + ValidateCodeProcessor.class.getSimpleName();\n\t\tValidateCodeProcessor processor = validateCodeProcessors.get(name);\n\t\tif (processor == null) {\n\t\t\tthrow new ValidateCodeException(\"验证码处理器\" + name + \"不存在\");\n\t\t}\n\t\treturn processor;\n\t}\n\n}\n"
  },
  {
    "path": "paascloud-common/paascloud-security-core/src/main/java/com/paascloud/security/core/validate/code/ValidateCodeRepository.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：ValidateCodeRepository.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.security.core.validate.code;\n\nimport org.springframework.web.context.request.ServletWebRequest;\n\n/**\n * 校验码存取器\n *\n * @author paascloud.net @gmail.com\n */\npublic interface ValidateCodeRepository {\n\n\t/**\n\t * 保存验证码\n\t *\n\t * @param request          the request\n\t * @param code             the code\n\t * @param validateCodeType the validate code type\n\t */\n\tvoid save(ServletWebRequest request, ValidateCode code, ValidateCodeType validateCodeType);\n\n\t/**\n\t * 获取验证码\n\t *\n\t * @param request          the request\n\t * @param validateCodeType the validate code type\n\t *\n\t * @return validate code\n\t */\n\tValidateCode get(ServletWebRequest request, ValidateCodeType validateCodeType);\n\n\t/**\n\t * 移除验证码\n\t *\n\t * @param request  the request\n\t * @param codeType the code type\n\t */\n\tvoid remove(ServletWebRequest request, ValidateCodeType codeType);\n\n}\n"
  },
  {
    "path": "paascloud-common/paascloud-security-core/src/main/java/com/paascloud/security/core/validate/code/ValidateCodeSecurityConfig.java",
    "content": "package com.paascloud.security.core.validate.code;\n\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.security.config.annotation.SecurityConfigurerAdapter;\nimport org.springframework.security.config.annotation.web.builders.HttpSecurity;\nimport org.springframework.security.web.DefaultSecurityFilterChain;\nimport org.springframework.security.web.authentication.preauth.AbstractPreAuthenticatedProcessingFilter;\nimport org.springframework.stereotype.Component;\n\nimport javax.servlet.Filter;\n\n/**\n * 校验码相关安全配置\n *\n * @author paascloud.net@gmail.com\n */\n@Component(\"validateCodeSecurityConfig\")\npublic class ValidateCodeSecurityConfig extends SecurityConfigurerAdapter<DefaultSecurityFilterChain, HttpSecurity> {\n\t@Autowired\n\tprivate Filter validateCodeFilter;\n\n\t/**\n\t * Configure.\n\t *\n\t * @param http the http\n\t */\n\t@Override\n\tpublic void configure(HttpSecurity http) {\n\t\thttp.addFilterBefore(validateCodeFilter, AbstractPreAuthenticatedProcessingFilter.class);\n\t}\n\n}\n"
  },
  {
    "path": "paascloud-common/paascloud-security-core/src/main/java/com/paascloud/security/core/validate/code/ValidateCodeType.java",
    "content": "package com.paascloud.security.core.validate.code;\n\nimport com.paascloud.security.core.properties.SecurityConstants;\n\n/**\n * 校验码类型\n *\n * @author paascloud.net @gmail.com\n */\npublic enum ValidateCodeType {\n\n\t/**\n\t * 短信验证码\n\t */\n\tSMS {\n\t\t@Override\n\t\tpublic String getParamNameOnValidate() {\n\t\t\treturn SecurityConstants.DEFAULT_PARAMETER_NAME_CODE_SMS;\n\t\t}\n\t},\n\t/**\n\t * 图片验证码\n\t */\n\tIMAGE {\n\t\t@Override\n\t\tpublic String getParamNameOnValidate() {\n\t\t\treturn SecurityConstants.DEFAULT_PARAMETER_NAME_CODE_IMAGE;\n\t\t}\n\t},\n\t/**\n\t * 邮箱验证码\n\t */\n\tEMAIL {\n\t\t@Override\n\t\tpublic String getParamNameOnValidate() {\n\t\t\treturn SecurityConstants.DEFAULT_PARAMETER_NAME_CODE_EMAIL;\n\t\t}\n\t};\n\n\t/**\n\t * 校验时从请求中获取的参数的名字\n\t *\n\t * @return param name on validate\n\t */\n\tpublic abstract String getParamNameOnValidate();\n\n}\n"
  },
  {
    "path": "paascloud-common/paascloud-security-core/src/main/java/com/paascloud/security/core/validate/code/email/DefaultEmailCodeSender.java",
    "content": "\n/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：DefaultEmailCodeSender.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.security.core.validate.code.email;\n\nimport lombok.extern.slf4j.Slf4j;\n\n/**\n * 默认的短信验证码发送器\n *\n * @author paascloud.net @gmail.com\n */\n@Slf4j\npublic class DefaultEmailCodeSender implements EmailCodeSender {\n\t/**\n\t * Send.\n\t *\n\t * @param email the mobile\n\t * @param code  the code\n\t */\n\t@Override\n\tpublic void send(String email, String code) {\n\t\tlog.warn(\"请配置真实的邮件验证码发送器(SmsCodeSender)\");\n\t\tlog.info(\"向邮件\" + email + \"发送短信验证码\" + code);\n\t}\n\n}\n"
  },
  {
    "path": "paascloud-common/paascloud-security-core/src/main/java/com/paascloud/security/core/validate/code/email/EmailCodeGenerator.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：EmailCodeGenerator.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.security.core.validate.code.email;\n\nimport com.paascloud.security.core.properties.SecurityProperties;\nimport com.paascloud.security.core.validate.code.ValidateCode;\nimport com.paascloud.security.core.validate.code.ValidateCodeGenerator;\nimport lombok.extern.slf4j.Slf4j;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.stereotype.Component;\nimport org.springframework.web.context.request.ServletWebRequest;\n\nimport javax.servlet.http.HttpServletRequest;\nimport java.util.Arrays;\nimport java.util.Map;\n\n/**\n * 短信验证码生成器\n *\n * @author paascloud.net @gmail.com\n */\n@Slf4j\n@Component(\"emailValidateCodeGenerator\")\npublic class EmailCodeGenerator implements ValidateCodeGenerator {\n\n\t@Autowired\n\tprivate SecurityProperties securityProperties;\n\n\t/**\n\t * Generate validate code.\n\t *\n\t * @param request the request\n\t *\n\t * @return the validate code\n\t */\n\t@Override\n\tpublic ValidateCode generate(ServletWebRequest request) {\n\t\tHttpServletRequest httpServletRequest = (HttpServletRequest) request;\n\t\tMap<String, String[]> parameterMap = httpServletRequest.getParameterMap();\n\t\tString[] emails = parameterMap.get(\"email\");\n\t\tlog.info(Arrays.toString(emails));\n\t\tString code = Arrays.toString(emails);\n\t\treturn new ValidateCode(code, securityProperties.getCode().getEmail().getExpireIn());\n\t}\n}\n"
  },
  {
    "path": "paascloud-common/paascloud-security-core/src/main/java/com/paascloud/security/core/validate/code/email/EmailCodeProcessor.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：EmailCodeProcessor.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.security.core.validate.code.email;\n\nimport com.paascloud.security.core.properties.SecurityConstants;\nimport com.paascloud.security.core.validate.code.ValidateCode;\nimport com.paascloud.security.core.validate.code.ValidateCodeGenerator;\nimport com.paascloud.security.core.validate.code.ValidateCodeRepository;\nimport com.paascloud.security.core.validate.code.impl.AbstractValidateCodeProcessor;\nimport org.springframework.stereotype.Component;\nimport org.springframework.web.bind.ServletRequestUtils;\nimport org.springframework.web.context.request.ServletWebRequest;\n\nimport javax.annotation.Resource;\nimport java.util.Map;\n\n/**\n * 短信验证码处理器\n *\n * @author paascloud.net @gmail.com\n */\n@Component(\"emailValidateCodeProcessor\")\npublic class EmailCodeProcessor extends AbstractValidateCodeProcessor<ValidateCode> {\n\n\t/**\n\t * 短信验证码发送器\n\t */\n\t@Resource\n\tprivate EmailCodeSender emailCodeSender;\n\n\t/**\n\t * Instantiates a new Abstract validate code processor.\n\t *\n\t * @param validateCodeGenerators the validate code generators\n\t * @param validateCodeRepository the validate code repository\n\t */\n\tpublic EmailCodeProcessor(Map<String, ValidateCodeGenerator> validateCodeGenerators, ValidateCodeRepository validateCodeRepository) {\n\t\tsuper(validateCodeGenerators, validateCodeRepository);\n\t}\n\n\t/**\n\t * Send.\n\t *\n\t * @param request      the request\n\t * @param validateCode the validate code\n\t *\n\t * @throws Exception the exception\n\t */\n\t@Override\n\tprotected void send(ServletWebRequest request, ValidateCode validateCode) throws Exception {\n\t\tString paramName = SecurityConstants.DEFAULT_PARAMETER_NAME_EMAIL;\n\t\tString email = ServletRequestUtils.getRequiredStringParameter(request.getRequest(), paramName);\n\t\temailCodeSender.send(email, validateCode.getCode());\n\t}\n}\n"
  },
  {
    "path": "paascloud-common/paascloud-security-core/src/main/java/com/paascloud/security/core/validate/code/email/EmailCodeSender.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：EmailCodeSender.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.security.core.validate.code.email;\n\n/**\n * The interface Sms code sender.\n *\n * @author paascloud.net@gmail.com\n */\npublic interface EmailCodeSender {\n\n\t/**\n\t * Send.\n\t *\n\t * @param email the email\n\t * @param code  the code\n\t */\n\tvoid send(String email, String code);\n\n}\n"
  },
  {
    "path": "paascloud-common/paascloud-security-core/src/main/java/com/paascloud/security/core/validate/code/image/ImageCode.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：ImageCode.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.security.core.validate.code.image;\n\nimport com.paascloud.security.core.validate.code.ValidateCode;\n\nimport java.awt.image.BufferedImage;\nimport java.time.LocalDateTime;\n\n\n/**\n * 图片验证码\n *\n * @author paascloud.net @gmail.com\n */\npublic class ImageCode extends ValidateCode {\n\n\n\tprivate static final long serialVersionUID = -6020470039852318468L;\n\n\tprivate BufferedImage image;\n\n\t/**\n\t * Instantiates a new Image code.\n\t *\n\t * @param image    the image\n\t * @param code     the code\n\t * @param expireIn the expire in\n\t */\n\tImageCode(BufferedImage image, String code, int expireIn) {\n\t\tsuper(code, expireIn);\n\t\tthis.image = image;\n\t}\n\n\t/**\n\t * Instantiates a new Image code.\n\t *\n\t * @param image      the image\n\t * @param code       the code\n\t * @param expireTime the expire time\n\t */\n\tpublic ImageCode(BufferedImage image, String code, LocalDateTime expireTime) {\n\t\tsuper(code, expireTime);\n\t\tthis.image = image;\n\t}\n\n\t/**\n\t * Gets image.\n\t *\n\t * @return the image\n\t */\n\tpublic BufferedImage getImage() {\n\t\treturn image;\n\t}\n\n\t/**\n\t * Sets image.\n\t *\n\t * @param image the image\n\t */\n\tpublic void setImage(BufferedImage image) {\n\t\tthis.image = image;\n\t}\n\n}\n"
  },
  {
    "path": "paascloud-common/paascloud-security-core/src/main/java/com/paascloud/security/core/validate/code/image/ImageCodeGenerator.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：ImageCodeGenerator.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.security.core.validate.code.image;\n\nimport com.google.code.kaptcha.Producer;\nimport com.paascloud.security.core.properties.SecurityProperties;\nimport com.paascloud.security.core.validate.code.ValidateCodeGenerator;\nimport org.springframework.web.context.request.ServletWebRequest;\n\nimport java.awt.image.BufferedImage;\n\n/**\n * 默认的图片验证码生成器\n *\n * @author paascloud.net @gmail.com\n */\npublic class ImageCodeGenerator implements ValidateCodeGenerator {\n\n\tprivate SecurityProperties securityProperties;\n\tprivate Producer captchaProducer;\n\n\t/**\n\t * 生成图片验证码.\n\t *\n\t * @param request the request\n\t *\n\t * @return the image code\n\t */\n\t@Override\n\tpublic ImageCode generate(ServletWebRequest request) {\n\t\tString kaptchaCode = captchaProducer.createText();\n\t\tBufferedImage image = captchaProducer.createImage(kaptchaCode);\n\t\treturn new ImageCode(image, kaptchaCode, securityProperties.getCode().getImage().getExpireIn());\n\t}\n\n\t/**\n\t * Sets security properties.\n\t *\n\t * @param securityProperties the security properties\n\t */\n\tpublic void setSecurityProperties(SecurityProperties securityProperties) {\n\t\tthis.securityProperties = securityProperties;\n\t}\n\n\t/**\n\t * Sets captcha producer.\n\t *\n\t * @param captchaProducer the captcha producer\n\t */\n\tpublic void setCaptchaProducer(Producer captchaProducer) {\n\t\tthis.captchaProducer = captchaProducer;\n\t}\n\n\n}\n"
  },
  {
    "path": "paascloud-common/paascloud-security-core/src/main/java/com/paascloud/security/core/validate/code/image/ImageCodeProcessor.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：ImageCodeProcessor.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.security.core.validate.code.image;\n\nimport com.fasterxml.jackson.databind.ObjectMapper;\nimport com.paascloud.security.core.SecurityResult;\nimport com.paascloud.security.core.validate.code.ValidateCodeGenerator;\nimport com.paascloud.security.core.validate.code.ValidateCodeRepository;\nimport com.paascloud.security.core.validate.code.impl.AbstractValidateCodeProcessor;\nimport org.springframework.stereotype.Component;\nimport org.springframework.web.context.request.ServletWebRequest;\n\nimport javax.annotation.Resource;\nimport javax.imageio.ImageIO;\nimport javax.servlet.http.HttpServletResponse;\nimport java.io.ByteArrayOutputStream;\nimport java.util.Map;\n\n/**\n * 图片验证码处理器\n *\n * @author paascloud.net @gmail.com\n */\n@Component(\"imageValidateCodeProcessor\")\npublic class ImageCodeProcessor extends AbstractValidateCodeProcessor<ImageCode> {\n\n\t@Resource\n\tprivate ObjectMapper objectMapper;\n\n\t/**\n\t * Instantiates a new Abstract validate code processor.\n\t *\n\t * @param validateCodeGenerators the validate code generators\n\t * @param validateCodeRepository the validate code repository\n\t */\n\tpublic ImageCodeProcessor(Map<String, ValidateCodeGenerator> validateCodeGenerators, ValidateCodeRepository validateCodeRepository) {\n\t\tsuper(validateCodeGenerators, validateCodeRepository);\n\t}\n\n\t/**\n\t * 发送图形验证码，将其写到响应中\n\t *\n\t * @param request   the request\n\t * @param imageCode the image code\n\t *\n\t * @throws Exception the exception\n\t */\n\t@Override\n\tprotected void send(ServletWebRequest request, ImageCode imageCode) throws Exception {\n\t\tByteArrayOutputStream bos = new ByteArrayOutputStream();\n\t\tImageIO.write(imageCode.getImage(), \"JPEG\", bos);\n\n\t\tSecurityResult result = SecurityResult.ok(bos.toByteArray());\n\n\t\tString json = objectMapper.writeValueAsString(result);\n\t\tHttpServletResponse response = request.getResponse();\n\t\tresponse.setCharacterEncoding(\"UTF-8\");\n\t\tresponse.getWriter().write(json);\n\t}\n}\n"
  },
  {
    "path": "paascloud-common/paascloud-security-core/src/main/java/com/paascloud/security/core/validate/code/impl/AbstractValidateCodeProcessor.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：AbstractValidateCodeProcessor.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.security.core.validate.code.impl;\n\nimport com.paascloud.security.core.validate.code.*;\nimport org.apache.commons.lang.StringUtils;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.web.bind.ServletRequestBindingException;\nimport org.springframework.web.bind.ServletRequestUtils;\nimport org.springframework.web.context.request.ServletWebRequest;\n\nimport java.util.Map;\n\n/**\n * 抽象的图片验证码处理器\n *\n * @param <C> the type parameter @author paascloud.net@gmail.com\n *\n * @author paascloud.net @gmail.com\n */\npublic abstract class AbstractValidateCodeProcessor<C extends ValidateCode> implements ValidateCodeProcessor {\n\n\t/**\n\t * 收集系统中所有的 {@link ValidateCodeGenerator} 接口的实现。\n\t */\n\tprivate final Map<String, ValidateCodeGenerator> validateCodeGenerators;\n\n\tprivate final ValidateCodeRepository validateCodeRepository;\n\n\t/**\n\t * Instantiates a new Abstract validate code processor.\n\t *\n\t * @param validateCodeGenerators the validate code generators\n\t * @param validateCodeRepository the validate code repository\n\t */\n\t@Autowired\n\tpublic AbstractValidateCodeProcessor(Map<String, ValidateCodeGenerator> validateCodeGenerators, ValidateCodeRepository validateCodeRepository) {\n\t\tthis.validateCodeGenerators = validateCodeGenerators;\n\t\tthis.validateCodeRepository = validateCodeRepository;\n\t}\n\n\n\t/**\n\t * Create.\n\t *\n\t * @param request the request\n\t *\n\t * @throws Exception the exception\n\t */\n\t@Override\n\tpublic void create(ServletWebRequest request) throws Exception {\n\t\tC validateCode = generate(request);\n\t\tsave(request, validateCode);\n\t\tsend(request, validateCode);\n\t}\n\n\t/**\n\t * 生成校验码\n\t */\n\t@SuppressWarnings(\"unchecked\")\n\tprivate C generate(ServletWebRequest request) {\n\t\tString type = getValidateCodeType().toString().toLowerCase();\n\t\tString generatorName = type + ValidateCodeGenerator.class.getSimpleName();\n\t\tValidateCodeGenerator validateCodeGenerator = validateCodeGenerators.get(generatorName);\n\t\tif (validateCodeGenerator == null) {\n\t\t\tthrow new ValidateCodeException(\"验证码生成器\" + generatorName + \"不存在\");\n\t\t}\n\t\treturn (C) validateCodeGenerator.generate(request);\n\t}\n\n\t/**\n\t * 保存校验码\n\t */\n\tprivate void save(ServletWebRequest request, C validateCode) {\n\t\tValidateCode code = new ValidateCode(validateCode.getCode(), validateCode.getExpireTime());\n\t\tvalidateCodeRepository.save(request, code, getValidateCodeType());\n\t}\n\n\t/**\n\t * 发送校验码，由子类实现\n\t *\n\t * @param request      the request\n\t * @param validateCode the validate code\n\t *\n\t * @throws Exception the exception\n\t */\n\tprotected abstract void send(ServletWebRequest request, C validateCode) throws Exception;\n\n\t/**\n\t * 根据请求的url获取校验码的类型\n\t */\n\tprivate ValidateCodeType getValidateCodeType() {\n\t\tString type = StringUtils.substringBefore(getClass().getSimpleName(), \"CodeProcessor\");\n\t\treturn ValidateCodeType.valueOf(type.toUpperCase());\n\t}\n\n\t/**\n\t * Validate.\n\t *\n\t * @param request the request\n\t */\n\t@SuppressWarnings(\"unchecked\")\n\t@Override\n\tpublic void validate(ServletWebRequest request) {\n\n\t\tValidateCodeType codeType = getValidateCodeType();\n\t\tthis.check(request);\n\t\tvalidateCodeRepository.remove(request, codeType);\n\n\t}\n\n\t/**\n\t * Check.\n\t *\n\t * @param request the request\n\t */\n\t@SuppressWarnings(\"unchecked\")\n\t@Override\n\tpublic void check(ServletWebRequest request) {\n\t\tValidateCodeType codeType = getValidateCodeType();\n\n\t\tC codeInSession = (C) validateCodeRepository.get(request, codeType);\n\n\t\tString codeInRequest;\n\t\ttry {\n\t\t\tcodeInRequest = ServletRequestUtils.getStringParameter(request.getRequest(), codeType.getParamNameOnValidate());\n\t\t} catch (ServletRequestBindingException e) {\n\t\t\tthrow new ValidateCodeException(\"获取验证码的值失败\");\n\t\t}\n\n\t\tif (StringUtils.isBlank(codeInRequest)) {\n\t\t\tthrow new ValidateCodeException(codeType + \"验证码的值不能为空\");\n\t\t}\n\n\t\tif (codeInSession == null || codeInSession.isExpired()) {\n\t\t\tvalidateCodeRepository.remove(request, codeType);\n\t\t\tthrow new ValidateCodeException(codeType + \"验证码已过期\");\n\t\t}\n\n\t\tif (!StringUtils.equals(codeInSession.getCode(), codeInRequest)) {\n\t\t\tthrow new ValidateCodeException(codeType + \"验证码不匹配\");\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "paascloud-common/paascloud-security-core/src/main/java/com/paascloud/security/core/validate/code/impl/RedisValidateCodeRepository.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：RedisValidateCodeRepository.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.security.core.validate.code.impl;\n\nimport com.paascloud.security.core.validate.code.ValidateCode;\nimport com.paascloud.security.core.validate.code.ValidateCodeException;\nimport com.paascloud.security.core.validate.code.ValidateCodeRepository;\nimport com.paascloud.security.core.validate.code.ValidateCodeType;\nimport org.apache.commons.lang.StringUtils;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.data.redis.core.RedisTemplate;\nimport org.springframework.stereotype.Component;\nimport org.springframework.web.context.request.ServletWebRequest;\n\nimport java.util.concurrent.TimeUnit;\n\n/**\n * 基于redis的验证码存取器，避免由于没有session导致无法存取验证码的问题\n *\n * @author paascloud.net @gmail.com\n */\n@Component\npublic class RedisValidateCodeRepository implements ValidateCodeRepository {\n\n\tprivate final RedisTemplate<String, Object> redisTemplate;\n\n\t/**\n\t * Instantiates a new Redis validate code repository.\n\t *\n\t * @param redisTemplate the redis template\n\t */\n\t@Autowired\n\tpublic RedisValidateCodeRepository(RedisTemplate<String, Object> redisTemplate) {\n\t\tthis.redisTemplate = redisTemplate;\n\t}\n\n\t/**\n\t * Save.\n\t *\n\t * @param request the request\n\t * @param code    the code\n\t * @param type    the type\n\t */\n\t@Override\n\tpublic void save(ServletWebRequest request, ValidateCode code, ValidateCodeType type) {\n\t\tString key = buildKey(request, type);\n\t\tredisTemplate.opsForValue().set(key, code, 3, TimeUnit.MINUTES);\n\t}\n\n\t/**\n\t * Get validate code.\n\t *\n\t * @param request the request\n\t * @param type    the type\n\t *\n\t * @return the validate code\n\t */\n\t@Override\n\tpublic ValidateCode get(ServletWebRequest request, ValidateCodeType type) {\n\t\tObject value = redisTemplate.opsForValue().get(buildKey(request, type));\n\t\tif (value == null) {\n\t\t\treturn null;\n\t\t}\n\t\treturn (ValidateCode) value;\n\t}\n\n\t/**\n\t * Remove.\n\t *\n\t * @param request the request\n\t * @param type    the type\n\t */\n\t@Override\n\tpublic void remove(ServletWebRequest request, ValidateCodeType type) {\n\t\tredisTemplate.delete(buildKey(request, type));\n\t}\n\n\tprivate String buildKey(ServletWebRequest request, ValidateCodeType type) {\n\t\tString deviceId = request.getHeader(\"deviceId\");\n\t\tif (StringUtils.isBlank(deviceId)) {\n\t\t\tthrow new ValidateCodeException(\"请在请求头中携带deviceId参数\");\n\t\t}\n\t\treturn \"code:\" + type.toString().toLowerCase() + \":\" + deviceId;\n\t}\n\n}\n"
  },
  {
    "path": "paascloud-common/paascloud-security-core/src/main/java/com/paascloud/security/core/validate/code/sms/DefaultSmsCodeSender.java",
    "content": "\npackage com.paascloud.security.core.validate.code.sms;\n\nimport lombok.extern.slf4j.Slf4j;\n\n/**\n * 默认的短信验证码发送器\n *\n * @author paascloud.net @gmail.com\n */\n@Slf4j\npublic class DefaultSmsCodeSender implements SmsCodeSender {\n\n\t/**\n\t * Send.\n\t *\n\t * @param mobile the mobile\n\t * @param code   the code\n\t * @param ip     the ip\n\t */\n\t@Override\n\tpublic void send(String mobile, String code, String ip) {\n\t\tlog.warn(\"请配置真实的短信验证码发送器(SmsCodeSender)\");\n\t\tlog.info(\"向手机\" + mobile + \"发送短信验证码\" + code + \"ip:\" + ip);\n\t}\n\n}\n"
  },
  {
    "path": "paascloud-common/paascloud-security-core/src/main/java/com/paascloud/security/core/validate/code/sms/SmsCodeGenerator.java",
    "content": "package com.paascloud.security.core.validate.code.sms;\n\nimport com.paascloud.security.core.properties.SecurityProperties;\nimport com.paascloud.security.core.validate.code.ValidateCode;\nimport com.paascloud.security.core.validate.code.ValidateCodeGenerator;\nimport org.apache.commons.lang.RandomStringUtils;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.stereotype.Component;\nimport org.springframework.web.context.request.ServletWebRequest;\n\n/**\n * 短信验证码生成器\n *\n * @author paascloud.net @gmail.com\n */\n@Component(\"smsValidateCodeGenerator\")\npublic class SmsCodeGenerator implements ValidateCodeGenerator {\n\n\t@Autowired\n\tprivate SecurityProperties securityProperties;\n\n\t/**\n\t * Generate validate code.\n\t *\n\t * @param request the request\n\t *\n\t * @return the validate code\n\t */\n\t@Override\n\tpublic ValidateCode generate(ServletWebRequest request) {\n\t\tString code = RandomStringUtils.randomNumeric(securityProperties.getCode().getSms().getLength());\n\t\treturn new ValidateCode(code, securityProperties.getCode().getSms().getExpireIn());\n\t}\n}\n"
  },
  {
    "path": "paascloud-common/paascloud-security-core/src/main/java/com/paascloud/security/core/validate/code/sms/SmsCodeProcessor.java",
    "content": "package com.paascloud.security.core.validate.code.sms;\n\nimport com.fasterxml.jackson.databind.ObjectMapper;\nimport com.paascloud.RedisKeyUtil;\nimport com.paascloud.security.core.SecurityResult;\nimport com.paascloud.security.core.properties.SecurityConstants;\nimport com.paascloud.security.core.properties.SecurityProperties;\nimport com.paascloud.security.core.properties.SmsCodeProperties;\nimport com.paascloud.security.core.validate.code.ValidateCode;\nimport com.paascloud.security.core.validate.code.ValidateCodeException;\nimport com.paascloud.security.core.validate.code.ValidateCodeGenerator;\nimport com.paascloud.security.core.validate.code.ValidateCodeRepository;\nimport com.paascloud.security.core.validate.code.impl.AbstractValidateCodeProcessor;\nimport lombok.extern.slf4j.Slf4j;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.data.redis.core.RedisTemplate;\nimport org.springframework.stereotype.Component;\nimport org.springframework.web.bind.ServletRequestUtils;\nimport org.springframework.web.context.request.ServletWebRequest;\n\nimport javax.annotation.Resource;\nimport javax.servlet.http.HttpServletRequest;\nimport javax.servlet.http.HttpServletResponse;\nimport java.net.InetAddress;\nimport java.net.UnknownHostException;\nimport java.util.Map;\nimport java.util.concurrent.TimeUnit;\n\n/**\n * 短信验证码处理器\n *\n * @author paascloud.net @gmail.com\n */\n@Component(\"smsValidateCodeProcessor\")\n@Slf4j\npublic class SmsCodeProcessor extends AbstractValidateCodeProcessor<ValidateCode> {\n\n\tprivate static final String X_FORWARDED_FOR = \"x-forwarded-for\";\n\tprivate static final String PROXY_CLIENT_IP = \"Proxy-Client-IP\";\n\tprivate static final String WL_PROXY_CLIENT_IP = \"WL-Proxy-Client-IP\";\n\n\tprivate static final String LOCALHOST_IP = \"127.0.0.1\";\n\tprivate static final String LOCALHOST_IP_16 = \"0:0:0:0:0:0:0:1\";\n\tprivate static final String UNKNOWN = \"unknown\";\n\tprivate static final String COMMA = \",\";\n\tprivate static final int MAX_IP_LENGTH = 15;\n\n\t@Resource\n\tprivate SmsCodeSender smsCodeSender;\n\t@Resource\n\tprivate RedisTemplate<String, Object> redisTemplate;\n\t@Autowired\n\tprivate SecurityProperties securityProperties;\n\t@Resource\n\tprivate ObjectMapper objectMapper;\n\n\t/**\n\t * Instantiates a new Abstract validate code processor.\n\t *\n\t * @param validateCodeGenerators the validate code generators\n\t * @param validateCodeRepository the validate code repository\n\t */\n\tpublic SmsCodeProcessor(Map<String, ValidateCodeGenerator> validateCodeGenerators, ValidateCodeRepository validateCodeRepository) {\n\t\tsuper(validateCodeGenerators, validateCodeRepository);\n\t}\n\n\t/**\n\t * Send.\n\t *\n\t * @param request      the request\n\t * @param validateCode the validate code\n\t *\n\t * @throws Exception the exception\n\t */\n\t@Override\n\tprotected void send(ServletWebRequest request, ValidateCode validateCode) throws Exception {\n\t\tString paramName = SecurityConstants.DEFAULT_PARAMETER_NAME_MOBILE;\n\t\tString mobile = ServletRequestUtils.getRequiredStringParameter(request.getRequest(), paramName);\n\t\tString ipAddr = this.getRemoteAddr(request.getRequest());\n\t\tSecurityResult result = new SecurityResult(SecurityResult.SUCCESS_CODE, \"校验成功\", true);\n\t\t// 统一处理短信流量\n\t\ttry {\n\t\t\tthis.checkSendSmsCount(mobile, ipAddr);\n\t\t\tsmsCodeSender.send(mobile, validateCode.getCode(), ipAddr);\n\t\t} catch (ValidateCodeException e) {\n\t\t\tlog.error(\"校验短信数量, e={}\", e.getMessage(), e);\n\t\t\tresult = SecurityResult.error(e.getMessage(), false);\n\t\t} catch (Exception e) {\n\t\t\tlog.error(\"校验短信数量, e={}\", e.getMessage(), e);\n\t\t\tresult = SecurityResult.error(\"内部异常\", false);\n\t\t}\n\t\tString json = objectMapper.writeValueAsString(result);\n\t\tHttpServletResponse response = request.getResponse();\n\t\tresponse.setCharacterEncoding(\"UTF-8\");\n\t\tresponse.getWriter().write(json);\n\t}\n\n\tprivate void checkSendSmsCount(String mobile, String ipAddr) {\n\t\tString mobileSmsCountKey = RedisKeyUtil.getSendSmsCountKey(mobile, \"mobile\");\n\t\tString ipSmsCountKey = RedisKeyUtil.getSendSmsCountKey(ipAddr, \"ip\");\n\t\tString totalSmsCountKey = RedisKeyUtil.getSendSmsCountKey(\"total\", \"total\");\n\t\tString sendSmsRateKey = RedisKeyUtil.getSendSmsRateKey(ipAddr);\n\t\tSmsCodeProperties sms = securityProperties.getCode().getSms();\n\n\t\tInteger sendSmsRateCount = (Integer) redisTemplate.opsForValue().get(sendSmsRateKey);\n\t\tif (sendSmsRateCount != null) {\n\t\t\tlog.error(\"操作频率过快 ipAddr={}, mobile={}\", ipAddr, mobile);\n\t\t\tthrow new ValidateCodeException(\"操作频率过快\");\n\t\t} else {\n\t\t\tredisTemplate.opsForValue().set(sendSmsRateKey, 1, 1, TimeUnit.MINUTES);\n\t\t}\n\n\t\tInteger mobileSmsCount = (Integer) redisTemplate.opsForValue().get(mobileSmsCountKey);\n\t\tif (mobileSmsCount != null && mobileSmsCount > sms.getMobileMaxSendCount()) {\n\t\t\tlog.error(\"Mobile当天短信发送数上限 ipAddr={}, mobile={}\", ipAddr, mobile);\n\t\t\tthrow new ValidateCodeException(\"Mobile当天短信发送数上限\");\n\t\t} else {\n\t\t\tredisTemplate.opsForValue().set(mobileSmsCountKey, mobileSmsCount == null ? 1 : mobileSmsCount + 1, 1, TimeUnit.DAYS);\n\t\t}\n\t\tInteger ipSmsCount = (Integer) redisTemplate.opsForValue().get(ipSmsCountKey);\n\t\tif (ipSmsCount != null && ipSmsCount > sms.getIpMaxSendCount()) {\n\t\t\tlog.error(\"IP当天短信发送数上限 ipAddr={}, mobile={}\", ipAddr, mobile);\n\t\t\tthrow new ValidateCodeException(\"IP当天短信发送数上限\");\n\t\t} else {\n\t\t\tredisTemplate.opsForValue().set(ipSmsCountKey, ipSmsCount == null ? 1 : ipSmsCount + 1, 1, TimeUnit.DAYS);\n\t\t}\n\t\tInteger totalSmsCount = (Integer) redisTemplate.opsForValue().get(totalSmsCountKey);\n\t\tif (totalSmsCount != null && totalSmsCount > sms.getTotalMaxSendCount()) {\n\t\t\tlog.error(\"当天短信发送数上限 ipAddr={}, mobile={}\", ipAddr, mobile);\n\t\t\tthrow new ValidateCodeException(\"当天短信发送数上限\");\n\t\t} else {\n\t\t\tredisTemplate.opsForValue().set(totalSmsCountKey, totalSmsCount == null ? 1 : totalSmsCount + 1, 1, TimeUnit.DAYS);\n\t\t}\n\t}\n\n\tprivate String getRemoteAddr(HttpServletRequest request) {\n\t\tString ipAddress = request.getHeader(X_FORWARDED_FOR);\n\t\tif (ipAddress == null || ipAddress.length() == 0 || UNKNOWN.equalsIgnoreCase(ipAddress)) {\n\t\t\tipAddress = request.getHeader(PROXY_CLIENT_IP);\n\t\t}\n\t\tif (ipAddress == null || ipAddress.length() == 0 || UNKNOWN.equalsIgnoreCase(ipAddress)) {\n\t\t\tipAddress = request.getHeader(WL_PROXY_CLIENT_IP);\n\t\t}\n\t\tif (ipAddress == null || ipAddress.length() == 0 || UNKNOWN.equalsIgnoreCase(ipAddress)) {\n\t\t\tipAddress = request.getRemoteAddr();\n\t\t\tif (LOCALHOST_IP.equals(ipAddress) || LOCALHOST_IP_16.equals(ipAddress)) {\n\t\t\t\t//根据网卡取本机配置的IP\n\t\t\t\tInetAddress inet = null;\n\t\t\t\ttry {\n\t\t\t\t\tinet = InetAddress.getLocalHost();\n\t\t\t\t} catch (UnknownHostException e) {\n\t\t\t\t\tlog.error(\"获取IP地址, 出现异常={}\", e.getMessage(), e);\n\t\t\t\t}\n\t\t\t\tassert inet != null;\n\t\t\t\tipAddress = inet.getHostAddress();\n\t\t\t}\n\t\t}\n\t\t// 对于通过多个代理的情况, 第一个IP为客户端真实IP,多个IP按照','分割 //\"***.***.***.***\".length() = 15\n\t\tif (ipAddress != null && ipAddress.length() > MAX_IP_LENGTH && ipAddress.indexOf(COMMA) > 0) {\n\t\t\tipAddress = ipAddress.substring(0, ipAddress.indexOf(COMMA));\n\t\t}\n\t\treturn ipAddress;\n\t}\n}\n"
  },
  {
    "path": "paascloud-common/paascloud-security-core/src/main/java/com/paascloud/security/core/validate/code/sms/SmsCodeSender.java",
    "content": "package com.paascloud.security.core.validate.code.sms;\n\n/**\n * The interface Sms code sender.\n *\n * @author paascloud.net@gmail.com\n */\npublic interface SmsCodeSender {\n\n\t/**\n\t * Send.\n\t *\n\t * @param mobile the mobile\n\t * @param code   the code\n\t * @param ip     the ip\n\t */\n\tvoid send(String mobile, String code, String ip);\n\n}\n"
  },
  {
    "path": "paascloud-common/paascloud-security-feign/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\"\n         xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n         xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n  <parent>\n    <artifactId>paascloud-common</artifactId>\n    <groupId>com.liuzm.paascloud.common</groupId>\n    <version>1.0</version>\n  </parent>\n  <modelVersion>4.0.0</modelVersion>\n\n  <artifactId>paascloud-security-feign</artifactId>\n  <dependencies>\n    <dependency>\n      <groupId>org.springframework.cloud</groupId>\n      <artifactId>spring-cloud-starter-feign</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.springframework.cloud</groupId>\n      <artifactId>spring-cloud-starter-oauth2</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>com.liuzm.paascloud.common</groupId>\n      <artifactId>paascloud-common-base</artifactId>\n    </dependency>\n  </dependencies>\n</project>"
  },
  {
    "path": "paascloud-common/paascloud-security-feign/src/main/java/com/paascloud/security/feign/OAuth2FeignAutoConfiguration.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：OAuth2FeignAutoConfiguration.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.security.feign;\n\nimport feign.Logger;\nimport feign.RequestInterceptor;\nimport feign.codec.ErrorDecoder;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.beans.factory.annotation.Qualifier;\nimport org.springframework.boot.context.properties.EnableConfigurationProperties;\nimport org.springframework.context.annotation.Bean;\nimport org.springframework.context.annotation.Configuration;\nimport org.springframework.http.client.Netty4ClientHttpRequestFactory;\nimport org.springframework.security.oauth2.client.DefaultOAuth2ClientContext;\nimport org.springframework.security.oauth2.client.OAuth2RestTemplate;\nimport org.springframework.security.oauth2.client.token.grant.client.ClientCredentialsResourceDetails;\nimport org.springframework.security.oauth2.common.AuthenticationScheme;\n\n/**\n * The class O auth 2 feign auto configuration.\n *\n * @author paascloud.net @gmail.com\n */\n@Configuration\n@EnableConfigurationProperties(Oauth2ClientProperties.class)\npublic class OAuth2FeignAutoConfiguration {\n\n\tprivate final Oauth2ClientProperties oauth2ClientProperties;\n\n\t/**\n\t * Instantiates a new O auth 2 feign auto configuration.\n\t *\n\t * @param oauth2ClientProperties the oauth 2 client properties\n\t */\n\t@Autowired\n\tpublic OAuth2FeignAutoConfiguration(Oauth2ClientProperties oauth2ClientProperties) {\n\t\tthis.oauth2ClientProperties = oauth2ClientProperties;\n\t}\n\n\t/**\n\t * Resource details client credentials resource details.\n\t *\n\t * @return the client credentials resource details\n\t */\n\t@Bean(\"paascloudClientCredentialsResourceDetails\")\n\tpublic ClientCredentialsResourceDetails resourceDetails() {\n\t\tClientCredentialsResourceDetails details = new ClientCredentialsResourceDetails();\n\t\tdetails.setId(oauth2ClientProperties.getId());\n\t\tdetails.setAccessTokenUri(oauth2ClientProperties.getAccessTokenUrl());\n\t\tdetails.setClientId(oauth2ClientProperties.getClientId());\n\t\tdetails.setClientSecret(oauth2ClientProperties.getClientSecret());\n\t\tdetails.setAuthenticationScheme(AuthenticationScheme.valueOf(oauth2ClientProperties.getClientAuthenticationScheme()));\n\t\treturn details;\n\t}\n\n\t/**\n\t * O auth 2 rest template o auth 2 rest template.\n\t *\n\t * @return the o auth 2 rest template\n\t */\n\t@Bean(\"paascloudOAuth2RestTemplate\")\n\tpublic OAuth2RestTemplate oAuth2RestTemplate() {\n\t\tfinal OAuth2RestTemplate oAuth2RestTemplate = new OAuth2RestTemplate(resourceDetails(), new DefaultOAuth2ClientContext());\n\t\toAuth2RestTemplate.setRequestFactory(new Netty4ClientHttpRequestFactory());\n\t\treturn oAuth2RestTemplate;\n\n\t}\n\n\t/**\n\t * Oauth 2 feign request interceptor request interceptor.\n\t *\n\t * @param oAuth2RestTemplate the o auth 2 rest template\n\t *\n\t * @return the request interceptor\n\t */\n\t@Bean\n\tpublic RequestInterceptor oauth2FeignRequestInterceptor(@Qualifier(\"paascloudOAuth2RestTemplate\") OAuth2RestTemplate oAuth2RestTemplate) {\n\t\treturn new OAuth2FeignRequestInterceptor(oAuth2RestTemplate);\n\t}\n\n\t/**\n\t * Feign logger level logger . level.\n\t *\n\t * @return the logger . level\n\t */\n\t@Bean\n\tLogger.Level feignLoggerLevel() {\n\t\treturn Logger.Level.FULL;\n\t}\n\n\t/*\n\t * To disable Hystrix support on a per-client basis create a vanilla Feign.Builder with the \"prototype\" scope, e.g.:\n\t */\n//\t@Bean\n//\t@Scope(\"prototype\")\n//\tpublic Feign.Builder feignBuilder() {\n//\t\treturn Feign.builder();\n//\t}\n\n\t@Bean\n\tpublic ErrorDecoder errorDecoder() {\n\t\treturn new Oauth2FeignErrorInterceptor();\n\t}\n}"
  },
  {
    "path": "paascloud-common/paascloud-security-feign/src/main/java/com/paascloud/security/feign/OAuth2FeignRequestInterceptor.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：OAuth2FeignRequestInterceptor.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.security.feign;\n\nimport feign.RequestInterceptor;\nimport feign.RequestTemplate;\nimport lombok.extern.slf4j.Slf4j;\nimport org.springframework.http.HttpHeaders;\nimport org.springframework.security.oauth2.client.OAuth2RestTemplate;\nimport org.springframework.util.Assert;\n\n/**\n * The class O auth 2 feign request interceptor.\n *\n * @author paascloud.net @gmail.com\n */\n@Slf4j\npublic class OAuth2FeignRequestInterceptor implements RequestInterceptor {\n\tprivate static final String BEARER_TOKEN_TYPE = \"bearer\";\n\n\tprivate final OAuth2RestTemplate oAuth2RestTemplate;\n\n\t/**\n\t * Instantiates a new O auth 2 feign request interceptor.\n\t *\n\t * @param oAuth2RestTemplate the o auth 2 rest template\n\t */\n\tOAuth2FeignRequestInterceptor(OAuth2RestTemplate oAuth2RestTemplate) {\n\t\tAssert.notNull(oAuth2RestTemplate, \"Context can not be null\");\n\t\tthis.oAuth2RestTemplate = oAuth2RestTemplate;\n\t}\n\n\t/**\n\t * Apply.\n\t *\n\t * @param template the template\n\t */\n\t@Override\n\tpublic void apply(RequestTemplate template) {\n\t\tlog.debug(\"Constructing Header {} for Token {}\", HttpHeaders.AUTHORIZATION, BEARER_TOKEN_TYPE);\n\t\ttemplate.header(HttpHeaders.AUTHORIZATION, String.format(\"%s %s\", BEARER_TOKEN_TYPE, oAuth2RestTemplate.getAccessToken().toString()));\n\t}\n}\n"
  },
  {
    "path": "paascloud-common/paascloud-security-feign/src/main/java/com/paascloud/security/feign/Oauth2ClientProperties.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：Oauth2ClientProperties.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.security.feign;\n\nimport lombok.Data;\nimport org.springframework.boot.context.properties.ConfigurationProperties;\n\n/**\n * The class Oauth 2 client properties.\n *\n * @author paascloud.net @gmail.com\n */\n@Data\n@ConfigurationProperties(prefix = \"paascloud.oauth2.client\")\npublic class Oauth2ClientProperties {\n\tprivate String id;\n\tprivate String accessTokenUrl;\n\tprivate String clientId;\n\tprivate String clientSecret;\n\tprivate String clientAuthenticationScheme;\n}\n\n"
  },
  {
    "path": "paascloud-common/paascloud-security-feign/src/main/java/com/paascloud/security/feign/Oauth2FeignErrorInterceptor.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：Oauth2FeignErrorInterceptor.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.security.feign;\n\nimport com.fasterxml.jackson.databind.ObjectMapper;\nimport com.netflix.hystrix.exception.HystrixBadRequestException;\nimport com.paascloud.base.enums.ErrorCodeEnum;\nimport com.paascloud.base.exception.BusinessException;\nimport feign.Response;\nimport feign.codec.ErrorDecoder;\nimport lombok.extern.slf4j.Slf4j;\nimport org.springframework.http.HttpStatus;\n\nimport java.io.IOException;\nimport java.util.HashMap;\n\n\n/**\n * The class Feign error interceptor.\n *\n * @author paascloud.net @gmail.com\n */\n@Slf4j\npublic class Oauth2FeignErrorInterceptor implements ErrorDecoder {\n\tprivate final ErrorDecoder defaultErrorDecoder = new Default();\n\n\t/**\n\t * Decode exception.\n\t *\n\t * @param methodKey the method key\n\t * @param response  the response\n\t *\n\t * @return the exception\n\t */\n\t@Override\n\tpublic Exception decode(final String methodKey, final Response response) {\n\t\tif (response.status() >= HttpStatus.BAD_REQUEST.value() && response.status() < HttpStatus.INTERNAL_SERVER_ERROR.value()) {\n\t\t\treturn new HystrixBadRequestException(\"request exception wrapper\");\n\t\t}\n\n\t\tObjectMapper mapper = new ObjectMapper();\n\t\ttry {\n\t\t\tHashMap map = mapper.readValue(response.body().asInputStream(), HashMap.class);\n\t\t\tInteger code = (Integer) map.get(\"code\");\n\t\t\tString message = (String) map.get(\"message\");\n\t\t\tif (code != null) {\n\t\t\t\tErrorCodeEnum anEnum = ErrorCodeEnum.getEnum(code);\n\t\t\t\tif (anEnum != null) {\n\t\t\t\t\tif (anEnum == ErrorCodeEnum.GL99990100) {\n\t\t\t\t\t\tthrow new IllegalArgumentException(message);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthrow new BusinessException(anEnum);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tthrow new BusinessException(ErrorCodeEnum.GL99990500, message);\n\t\t\t\t}\n\t\t\t}\n\t\t} catch (IOException e) {\n\t\t\tlog.info(\"Failed to process response body\");\n\t\t}\n\t\treturn defaultErrorDecoder.decode(methodKey, response);\n\t}\n}\n"
  },
  {
    "path": "paascloud-common/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\"\n         xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n         xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n    <parent>\n        <groupId>com.liuzm.paascloud</groupId>\n        <artifactId>paascloud-master</artifactId>\n        <version>1.0</version>\n    </parent>\n    <modelVersion>4.0.0</modelVersion>\n\n    <groupId>com.liuzm.paascloud.common</groupId>\n    <artifactId>paascloud-common</artifactId>\n    <packaging>pom</packaging>\n    <modules>\n        <module>paascloud-common-base</module>\n        <module>paascloud-common-util</module>\n        <module>paascloud-common-config</module>\n        <module>paascloud-common-core</module>\n        <module>paascloud-security-app</module>\n        <module>paascloud-security-core</module>\n        <module>paascloud-security-feign</module>\n        <module>paascloud-common-zk</module>\n    </modules>\n\n    <properties>\n        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>\n    </properties>\n\n    <dependencies>\n        <dependency>\n            <groupId>org.projectlombok</groupId>\n            <artifactId>lombok</artifactId>\n        </dependency>\n    </dependencies>\n\n</project>"
  },
  {
    "path": "paascloud-discovery/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n         xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n  <modelVersion>4.0.0</modelVersion>\n\n  <groupId>com.liuzm.paascloud.discovery</groupId>\n  <artifactId>paascloud-discovery</artifactId>\n  <packaging>jar</packaging>\n\n  <name>paascloud-discovery</name>\n  <description>配置中心</description>\n\n  <parent>\n    <groupId>org.springframework.boot</groupId>\n    <artifactId>spring-boot-starter-parent</artifactId>\n    <version>1.5.13.RELEASE</version>\n  </parent>\n\n  <properties>\n    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>\n    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>\n    <java.version>1.8</java.version>\n  </properties>\n\n  <dependencyManagement>\n    <dependencies>\n      <dependency>\n        <groupId>org.springframework.cloud</groupId>\n        <artifactId>spring-cloud-dependencies</artifactId>\n        <version>Edgware.SR3</version>\n        <type>pom</type>\n        <scope>import</scope>\n      </dependency>\n    </dependencies>\n  </dependencyManagement>\n\n  <dependencies>\n    <dependency>\n      <groupId>org.springframework.cloud</groupId>\n      <artifactId>spring-cloud-starter-config</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.springframework.cloud</groupId>\n      <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.springframework.cloud</groupId>\n      <artifactId>spring-cloud-config-server</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.springframework.cloud</groupId>\n      <artifactId>spring-cloud-security</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>de.codecentric</groupId>\n      <artifactId>spring-boot-admin-starter-client</artifactId>\n      <version>1.5.7</version>\n    </dependency>\n    <dependency>\n      <groupId>org.springframework.cloud</groupId>\n      <artifactId>spring-cloud-starter-bus-amqp</artifactId>\n    </dependency>\n  </dependencies>\n\n  <build>\n    <finalName>${artifactId}</finalName>\n    <plugins>\n      <plugin>\n        <groupId>org.springframework.boot</groupId>\n        <artifactId>spring-boot-maven-plugin</artifactId>\n        <executions>\n          <execution>\n            <goals>\n              <goal>build-info</goal>\n            </goals>\n          </execution>\n        </executions>\n      </plugin>\n      <!-- 添加docker-maven插件 -->\n      <plugin>\n        <groupId>com.spotify</groupId>\n        <artifactId>docker-maven-plugin</artifactId>\n        <version>0.4.13</version>\n        <configuration>\n          <imageName>${project.artifactId}:${project.version}</imageName>\n          <baseImage>java</baseImage>\n          <entryPoint>[\"java\", \"-jar\", \"/${project.build.finalName}.jar\"]</entryPoint>\n          <resources>\n            <resource>\n              <targetPath>/</targetPath>\n              <directory>${project.build.directory}</directory>\n              <include>${project.build.finalName}.jar</include>\n            </resource>\n          </resources>\n        </configuration>\n      </plugin>\n    </plugins>\n  </build>\n\n  <profiles>\n    <profile>\n      <id>dev</id>\n      <properties>\n        <profileActive>dev</profileActive>\n      </properties>\n      <activation>\n        <activeByDefault>true</activeByDefault>\n      </activation>\n    </profile>\n    <profile>\n      <id>pro</id>\n      <properties>\n        <profileActive>pro</profileActive>\n      </properties>\n    </profile>\n  </profiles>\n\n\n</project>\n"
  },
  {
    "path": "paascloud-discovery/src/main/java/com/paascloud/discovery/PaasCloudDiscoveryApplication.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：PaasCloudDiscoveryApplication.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.discovery;\n\nimport org.springframework.boot.SpringApplication;\nimport org.springframework.boot.autoconfigure.SpringBootApplication;\nimport org.springframework.cloud.client.discovery.EnableDiscoveryClient;\nimport org.springframework.cloud.config.server.EnableConfigServer;\n\n/**\n * The class Paas cloud discovery application.\n *\n * @author paascloud.net@gmail.com\n */\n@SpringBootApplication\n@EnableConfigServer\n@EnableDiscoveryClient\npublic class PaasCloudDiscoveryApplication {\n\n\t/**\n\t * The entry point of application.\n\t *\n\t * @param args the input arguments\n\t */\n\tpublic static void main(String[] args) {\n\t\tSpringApplication.run(PaasCloudDiscoveryApplication.class, args);\n\t}\n}\n"
  },
  {
    "path": "paascloud-discovery/src/main/resources/application.yml",
    "content": "server:\n  port: 8080\n\nspring:\n  profiles:\n    active: dev\n  application:\n    name: @pom.artifactId@\n  rabbitmq:\n    host: paascloud-mq-rabbit\n    port: 5672\n    username: guest\n    password: guest\n  boot:\n    admin:\n      username: admin\n      password: admin\n\nsecurity:\n  user:\n    name: admin\n    password: admin\n\ninfo:\n  软件著作权: paascloud快速搭建企业级分布式微服务平台\n  著作登记号: 2018SR320076\n  关于我们: http://paascloud.net"
  },
  {
    "path": "paascloud-discovery/src/main/resources/banner.txt",
    "content": "${AnsiColor.BRIGHT_CYAN}\n                                  .__                   .___                  __\n___________  _____    ______ ____ |  |   ____  __ __  __| _/     ____   _____/  |_\n\\____ \\__  \\ \\__  \\  /  ___// ___\\|  |  /  _ \\|  |  \\/ __ |     /    \\_/ __ \\   __\\\n|  |_> > __ \\_/ __ \\_\\___ \\\\  \\___|  |_(  <_> )  |  / /_/ |    |   |  \\  ___/|  |\n|   __(____  (____  /____  >\\___  >____/\\____/|____/\\____ | /\\ |___|  /\\___  >__|\n|__|       \\/     \\/     \\/     \\/ Powered by liuzhaoming\\/ \\/      \\/     \\/"
  },
  {
    "path": "paascloud-discovery/src/main/resources/bootstrap.yml",
    "content": "spring:\n  cloud:\n    config:\n      server:\n        git:\n          uri: https://github.com/paascloud/paascloud-config-repo.git\n          username:\n          password:\n          search-paths: /*\n          default-label: ${spring.profiles.active}\n          basedir: /data/config/paascloud-config-repo\n    inetutils:\n      ignoredInterfaces:\n        - docker0\n        - veth.*\n      preferredNetworks:\n        - 192.168\n\nencrypt:\n  key-store:\n    location: classpath:/server.jks\n    password: paascloud-storepass\n    alias: paascloud-key-store\n    secret: paascloud-keypass\n\neureka:\n  client:\n    serviceUrl:\n      defaultZone: http://root:root@paascloud-eureka:8761/eureka/\n  instance:\n    instance-id: ${spring.application.name}:${spring.cloud.client.ipAddress}:${server.port}"
  },
  {
    "path": "paascloud-discovery/src/main/resources/logback-spring.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<configuration>\n\n  <!-- 此xml在spring-boot-1.5.3.RELEASE.jar里 -->\n  <include resource=\"org/springframework/boot/logging/logback/defaults.xml\" />\n  <include resource=\"org/springframework/boot/logging/logback/console-appender.xml\" />\n  <!-- 开启后可以通过jmx动态控制日志级别(springboot Admin的功能) -->\n  <!--<jmxConfigurator/>-->\n\n  <springProperty scope=\"context\" name=\"springAppName\" source=\"spring.application.name\"/>\n  <property name=\"LOG_PATH\" value=\"/data/logs/paascloud/${springAppName}\"/>\n  <property name=\"LOG_FILE\" value=\"${springAppName}\"/>\n\n  <appender name=\"FILE\" class=\"ch.qos.logback.core.rolling.RollingFileAppender\">\n    <File>${LOG_PATH}/${LOG_FILE}</File>\n    <encoder>\n      <pattern>%date [%level] [%thread] %logger{60} [%file : %line] %msg%n</pattern>\n    </encoder>\n    <rollingPolicy class=\"ch.qos.logback.core.rolling.TimeBasedRollingPolicy\">\n      <!-- 添加.gz 历史日志会启用压缩 大大缩小日志文件所占空间 -->\n      <fileNamePattern>${LOG_PATH}daily/${LOG_FILE}.%d{yyyy-MM-dd}.gz</fileNamePattern>\n      <maxHistory>30</maxHistory><!--  保留30天日志 -->\n    </rollingPolicy>\n  </appender>\n\n\n  <root level=\"INFO\">\n    <appender-ref ref=\"CONSOLE\"/>\n    <appender-ref ref=\"FILE\"/>\n  </root>\n</configuration>"
  },
  {
    "path": "paascloud-eureka/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n         xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n    <modelVersion>4.0.0</modelVersion>\n\n    <groupId>com.liuzm.paascloud.eureka</groupId>\n    <artifactId>paascloud-eureka</artifactId>\n    <packaging>jar</packaging>\n\n    <name>paascloud-eureka</name>\n    <description>Demo project for Spring Boot</description>\n\n    <parent>\n        <groupId>com.liuzm.paascloud</groupId>\n        <artifactId>paascloud-master</artifactId>\n        <version>1.0</version>\n    </parent>\n\n    <properties>\n        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>\n        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>\n        <java.version>1.8</java.version>\n    </properties>\n\n    <dependencies>\n        <dependency>\n            <groupId>org.springframework.cloud</groupId>\n            <artifactId>spring-cloud-starter-eureka-server</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.springframework.boot</groupId>\n            <artifactId>spring-boot-starter-security</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>net.logstash.logback</groupId>\n            <artifactId>logstash-logback-encoder</artifactId>\n        </dependency>\n    </dependencies>\n    <build>\n        <finalName>${artifactId}</finalName>\n        <plugins>\n            <plugin>\n                <groupId>org.springframework.boot</groupId>\n                <artifactId>spring-boot-maven-plugin</artifactId>\n            </plugin>\n            <!-- 添加docker-maven插件 -->\n            <plugin>\n                <groupId>com.spotify</groupId>\n                <artifactId>docker-maven-plugin</artifactId>\n                <version>0.4.13</version>\n                <configuration>\n                    <imageName>${project.artifactId}:${project.version}</imageName>\n                    <baseImage>java</baseImage>\n                    <entryPoint>[\"java\", \"-jar\", \"/${project.build.finalName}.jar\"]</entryPoint>\n                    <resources>\n                        <resource>\n                            <targetPath>/</targetPath>\n                            <directory>${project.build.directory}</directory>\n                            <include>${project.build.finalName}.jar</include>\n                        </resource>\n                    </resources>\n                </configuration>\n            </plugin>\n        </plugins>\n    </build>\n\n\n</project>\n"
  },
  {
    "path": "paascloud-eureka/src/main/java/com/paascloud/discovery/eureka/PaasCloudEurekaApplication.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：PaasCloudEurekaApplication.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.discovery.eureka;\n\nimport org.springframework.boot.SpringApplication;\nimport org.springframework.boot.autoconfigure.SpringBootApplication;\nimport org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;\n\n/**\n * The class Paas cloud eureka application.\n *\n * @author paascloud.net@gmail.com\n */\n@EnableEurekaServer\n@SpringBootApplication\npublic class PaasCloudEurekaApplication {\n\n\t/**\n\t * The entry point of application.\n\t *\n\t * @param args the input arguments\n\t */\n\tpublic static void main(String[] args) {\n\t\tSpringApplication.run(PaasCloudEurekaApplication.class, args);\n\t}\n}\n"
  },
  {
    "path": "paascloud-eureka/src/main/resources/application.yml",
    "content": "server:\n  port: 8761\n\nspring:\n  profiles:\n    active: dev\n  application:\n    name: @pom.artifactId@\n\nsecurity:\n  basic:\n    enabled: true\n  user:\n    name: root\n    password: root"
  },
  {
    "path": "paascloud-eureka/src/main/resources/banner.txt",
    "content": "${AnsiColor.BRIGHT_CYAN}\n                                  .__                   .___                  __\n___________  _____    ______ ____ |  |   ____  __ __  __| _/     ____   _____/  |_\n\\____ \\__  \\ \\__  \\  /  ___// ___\\|  |  /  _ \\|  |  \\/ __ |     /    \\_/ __ \\   __\\\n|  |_> > __ \\_/ __ \\_\\___ \\\\  \\___|  |_(  <_> )  |  / /_/ |    |   |  \\  ___/|  |\n|   __(____  (____  /____  >\\___  >____/\\____/|____/\\____ | /\\ |___|  /\\___  >__|\n|__|       \\/     \\/     \\/     \\/ Powered by liuzhaoming\\/ \\/      \\/     \\/"
  },
  {
    "path": "paascloud-eureka/src/main/resources/bootstrap.yml",
    "content": "spring:\n  cloud:\n    inetutils:\n      ignoredInterfaces:\n        - docker0\n        - veth.*\n        - VM.*\n      preferredNetworks:\n        - 192.168\n\neureka:\n  server:\n    enable-self-preservation: false\n  instance:\n    hostname: localhost\n  client:\n    registerWithEureka: false\n    fetchRegistry: false\n    serviceUrl:\n      defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka"
  },
  {
    "path": "paascloud-eureka/src/main/resources/logback-spring.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<configuration>\n\n  <!-- 此xml在spring-boot-1.5.3.RELEASE.jar里 -->\n  <include resource=\"org/springframework/boot/logging/logback/defaults.xml\" />\n  <include resource=\"org/springframework/boot/logging/logback/console-appender.xml\" />\n  <!-- 开启后可以通过jmx动态控制日志级别(springboot Admin的功能) -->\n  <!--<jmxConfigurator/>-->\n\n  <springProperty scope=\"context\" name=\"springAppName\" source=\"spring.application.name\"/>\n  <property name=\"LOG_PATH\" value=\"/data/logs/paascloud/${springAppName}\"/>\n  <property name=\"LOG_FILE\" value=\"${springAppName}\"/>\n\n  <appender name=\"FILE\" class=\"ch.qos.logback.core.rolling.RollingFileAppender\">\n    <File>${LOG_PATH}/${LOG_FILE}</File>\n    <encoder>\n      <pattern>%date [%level] [%thread] %logger{60} [%file : %line] %msg%n</pattern>\n    </encoder>\n    <rollingPolicy class=\"ch.qos.logback.core.rolling.TimeBasedRollingPolicy\">\n      <!-- 添加.gz 历史日志会启用压缩 大大缩小日志文件所占空间 -->\n      <fileNamePattern>${LOG_PATH}daily/${LOG_FILE}.%d{yyyy-MM-dd}.gz</fileNamePattern>\n      <maxHistory>30</maxHistory><!--  保留30天日志 -->\n    </rollingPolicy>\n  </appender>\n\n\n  <root level=\"INFO\">\n    <appender-ref ref=\"CONSOLE\"/>\n    <appender-ref ref=\"FILE\"/>\n  </root>\n</configuration>"
  },
  {
    "path": "paascloud-gateway/.gitignore",
    "content": "target/\n!.mvn/wrapper/maven-wrapper.jar\n\n### STS ###\n.apt_generated\n.classpath\n.factorypath\n.project\n.settings\n.springBeans\n\n### IntelliJ IDEA ###\n.idea\n*.iws\n*.iml\n*.ipr\n\n### NetBeans ###\nnbproject/private/\nbuild/\nnbbuild/\ndist/\nnbdist/\n.nb-gradle/"
  },
  {
    "path": "paascloud-gateway/README.md",
    "content": "filterOrder:filter执行顺序, 通过数字指定 \nshouldFilter:filter是否需要执行 true执行 false 不执行 \nrun : filter具体逻辑 \nfilterType :filter类型,分为以下几种\n\npre:请求执行之前filter \nroute: 处理请求, 进行路由 \npost: 请求处理完成后执行的filter \nerror:出现错误时执行的filter"
  },
  {
    "path": "paascloud-gateway/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n         xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n    <modelVersion>4.0.0</modelVersion>\n\n    <groupId>com.liuzm.paascloud.gateway</groupId>\n    <artifactId>paascloud-gateway</artifactId>\n    <packaging>jar</packaging>\n\n    <name>paascloud-gateway</name>\n    <description>Demo project for Spring Boot</description>\n\n    <parent>\n        <groupId>com.liuzm.paascloud</groupId>\n        <artifactId>paascloud-master</artifactId>\n        <version>1.0</version>\n    </parent>\n\n    <properties>\n        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>\n        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>\n        <java.version>1.8</java.version>\n    </properties>\n\n    <dependencies>\n        <dependency>\n            <groupId>org.springframework.cloud</groupId>\n            <artifactId>spring-cloud-starter-config</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.springframework.boot</groupId>\n            <artifactId>spring-boot-starter-actuator</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.springframework.cloud</groupId>\n            <artifactId>spring-cloud-starter-zuul</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>com.liuzm.paascloud.common</groupId>\n            <artifactId>paascloud-common-util</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>com.liuzm.paascloud.common</groupId>\n            <artifactId>paascloud-common-core</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>de.codecentric</groupId>\n            <artifactId>spring-boot-admin-starter-client</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.springframework.cloud</groupId>\n            <artifactId>spring-cloud-starter-security</artifactId>\n        </dependency>\n\n        <dependency>\n            <groupId>org.springframework.cloud</groupId>\n            <artifactId>spring-cloud-starter-oauth2</artifactId>\n        </dependency>\n\n        <dependency>\n            <groupId>org.springframework.security</groupId>\n            <artifactId>spring-security-jwt</artifactId>\n        </dependency>\n        <!-- swagger2聚合网关 -->\n        <dependency>\n            <groupId>com.didispace</groupId>\n            <artifactId>swagger-butler-core</artifactId>\n            <version>1.1.0</version>\n        </dependency>\n        <dependency>\n            <groupId>org.springframework.cloud</groupId>\n            <artifactId>spring-cloud-starter-zipkin</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.springframework.amqp</groupId>\n            <artifactId>spring-rabbit</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>net.logstash.logback</groupId>\n            <artifactId>logstash-logback-encoder</artifactId>\n        </dependency>\n    </dependencies>\n\n    <build>\n        <finalName>${artifactId}</finalName>\n        <plugins>\n            <plugin>\n                <groupId>org.springframework.boot</groupId>\n                <artifactId>spring-boot-maven-plugin</artifactId>\n                <executions>\n                    <execution>\n                        <goals>\n                            <goal>build-info</goal>\n                        </goals>\n                    </execution>\n                </executions>\n            </plugin>\n            <!-- 添加docker-maven插件 -->\n            <plugin>\n                <groupId>com.spotify</groupId>\n                <artifactId>docker-maven-plugin</artifactId>\n                <version>0.4.13</version>\n                <configuration>\n                    <imageName>${project.artifactId}:${project.version}</imageName>\n                    <baseImage>java</baseImage>\n                    <entryPoint>[\"java\", \"-jar\", \"/${project.build.finalName}.jar\"]</entryPoint>\n                    <resources>\n                        <resource>\n                            <targetPath>/</targetPath>\n                            <directory>${project.build.directory}</directory>\n                            <include>${project.build.finalName}.jar</include>\n                        </resource>\n                    </resources>\n                </configuration>\n            </plugin>\n        </plugins>\n    </build>\n\n\n</project>\n"
  },
  {
    "path": "paascloud-gateway/src/main/java/com/paascloud/gateway/PaasCloudGatewayApplication.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：PaasCloudGatewayApplication.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.gateway;\n\nimport com.didispace.swagger.butler.EnableSwaggerButler;\nimport org.springframework.boot.SpringApplication;\nimport org.springframework.boot.autoconfigure.SpringBootApplication;\nimport org.springframework.boot.autoconfigure.security.oauth2.client.EnableOAuth2Sso;\nimport org.springframework.cloud.client.discovery.EnableDiscoveryClient;\nimport org.springframework.cloud.netflix.hystrix.EnableHystrix;\nimport org.springframework.cloud.netflix.zuul.EnableZuulProxy;\nimport org.springframework.context.annotation.Bean;\nimport org.springframework.web.cors.CorsConfiguration;\nimport org.springframework.web.cors.UrlBasedCorsConfigurationSource;\nimport org.springframework.web.filter.CorsFilter;\n\n/**\n * The class Paas cloud gateway application.\n *\n * @author paascloud.net@gmail.com\n */\n@SpringBootApplication\n@EnableDiscoveryClient\n@EnableZuulProxy\n@EnableOAuth2Sso\n@EnableHystrix\n@EnableSwaggerButler\npublic class PaasCloudGatewayApplication {\n\n\tpublic static void main(String[] args) {\n\t\tSpringApplication.run(PaasCloudGatewayApplication.class, args);\n\t}\n\n\t@Bean\n\tpublic CorsFilter corsFilter() {\n\t\tfinal UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();\n\t\tfinal CorsConfiguration config = new CorsConfiguration();\n\t\t// 允许cookies跨域\n\t\tconfig.setAllowCredentials(true);\n\t\t// #允许向该服务器提交请求的URI，*表示全部允许，在SpringMVC中，如果设成*，会自动转成当前请求头中的Origin\n\t\tconfig.addAllowedOrigin(\"*\");\n\t\t// #允许访问的头信息,*表示全部\n\t\tconfig.addAllowedHeader(\"*\");\n\t\t// 预检请求的缓存时间（秒），即在这个时间段里，对于相同的跨域请求不会再预检了\n\t\tconfig.setMaxAge(18000L);\n\t\t// 允许提交请求的方法，*表示全部允许\n\t\tconfig.addAllowedMethod(\"OPTIONS\");\n\t\tconfig.addAllowedMethod(\"HEAD\");\n\t\t// 允许Get的请求方法\n\t\tconfig.addAllowedMethod(\"GET\");\n\t\tconfig.addAllowedMethod(\"PUT\");\n\t\tconfig.addAllowedMethod(\"POST\");\n\t\tconfig.addAllowedMethod(\"DELETE\");\n\t\tconfig.addAllowedMethod(\"PATCH\");\n\t\tsource.registerCorsConfiguration(\"/**\", config);\n\t\treturn new CorsFilter(source);\n\t}\n}\n"
  },
  {
    "path": "paascloud-gateway/src/main/java/com/paascloud/gateway/config/SecurityConfig.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：SecurityConfig.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.gateway.config;\n\nimport org.springframework.boot.autoconfigure.security.oauth2.client.EnableOAuth2Sso;\nimport org.springframework.context.annotation.Configuration;\nimport org.springframework.security.config.annotation.web.builders.HttpSecurity;\nimport org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;\n\n/**\n * The class Security config.\n *\n * @author paascloud.net @gmail.com\n */\n@Configuration\n@EnableOAuth2Sso\npublic class SecurityConfig extends WebSecurityConfigurerAdapter {\n\n\t/**\n\t * Configure.\n\t *\n\t * @param http the http\n\t *\n\t * @throws Exception the exception\n\t */\n\t@Override\n\tprotected void configure(HttpSecurity http) throws Exception {\n\n\t\thttp.csrf().disable();\n\n\n\t}\n\n\n}\n"
  },
  {
    "path": "paascloud-gateway/src/main/java/com/paascloud/gateway/fallback/UacFallbackProvider.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：UacFallbackProvider.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.gateway.fallback;\n\nimport com.netflix.hystrix.exception.HystrixTimeoutException;\nimport lombok.extern.slf4j.Slf4j;\nimport org.springframework.cloud.netflix.zuul.filters.route.FallbackProvider;\nimport org.springframework.http.HttpHeaders;\nimport org.springframework.http.HttpStatus;\nimport org.springframework.http.MediaType;\nimport org.springframework.http.client.ClientHttpResponse;\nimport org.springframework.stereotype.Component;\n\nimport java.io.ByteArrayInputStream;\nimport java.io.InputStream;\n\n/**\n * The class Uac fallback provider.\n *\n * @author paascloud.net@gmail.com\n */\n@Component\n@Slf4j\npublic class UacFallbackProvider implements FallbackProvider {\n\n\n\t@Override\n\tpublic String getRoute() {\n\t\treturn \"*\";\n\t}\n\n\t@Override\n\tpublic ClientHttpResponse fallbackResponse(final Throwable cause) {\n\t\tif (cause instanceof HystrixTimeoutException) {\n\t\t\treturn response(HttpStatus.GATEWAY_TIMEOUT);\n\t\t} else {\n\t\t\treturn fallbackResponse();\n\t\t}\n\t}\n\n\t@Override\n\tpublic ClientHttpResponse fallbackResponse() {\n\t\treturn response(HttpStatus.INTERNAL_SERVER_ERROR);\n\t}\n\n\tprivate ClientHttpResponse response(final HttpStatus status) {\n\t\treturn new ClientHttpResponse() {\n\t\t\t@Override\n\t\t\tpublic HttpStatus getStatusCode() {\n\t\t\t\treturn status;\n\t\t\t}\n\n\t\t\t@Override\n\t\t\tpublic int getRawStatusCode() {\n\t\t\t\treturn status.value();\n\t\t\t}\n\n\t\t\t@Override\n\t\t\tpublic String getStatusText() {\n\t\t\t\treturn status.getReasonPhrase();\n\t\t\t}\n\n\t\t\t@Override\n\t\t\tpublic void close() {\n\t\t\t\tlog.info(\"close\");\n\t\t\t}\n\n\t\t\t@Override\n\t\t\tpublic InputStream getBody() {\n\t\t\t\tString message = \"{\\n\" +\n\t\t\t\t\t\t\"\\\"code\\\": 200,\\n\" +\n\t\t\t\t\t\t\"\\\"message\\\": \\\"微服务故障, 请稍后再试\\\"\\n\" +\n\t\t\t\t\t\t\"}\";\n\t\t\t\treturn new ByteArrayInputStream(message.getBytes());\n\t\t\t}\n\n\t\t\t@Override\n\t\t\tpublic HttpHeaders getHeaders() {\n\t\t\t\tHttpHeaders headers = new HttpHeaders();\n\t\t\t\theaders.setContentType(MediaType.APPLICATION_JSON);\n\t\t\t\treturn headers;\n\t\t\t}\n\t\t};\n\t}\n}\n"
  },
  {
    "path": "paascloud-gateway/src/main/java/com/paascloud/gateway/filter/AuthHeaderFilter.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：AuthHeaderFilter.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.gateway.filter;\n\nimport com.netflix.zuul.ZuulFilter;\nimport com.netflix.zuul.context.RequestContext;\nimport com.netflix.zuul.exception.ZuulException;\nimport com.paascloud.PublicUtil;\nimport com.paascloud.base.enums.ErrorCodeEnum;\nimport com.paascloud.base.exception.BusinessException;\nimport com.paascloud.core.interceptor.CoreHeaderInterceptor;\nimport com.paascloud.core.utils.RequestUtil;\nimport lombok.extern.slf4j.Slf4j;\nimport org.springframework.http.HttpHeaders;\nimport org.springframework.stereotype.Component;\n\nimport javax.servlet.http.HttpServletRequest;\n\n/**\n * The class Auth header filter.\n *\n * @author paascloud.net @gmail.com\n */\n@Slf4j\n@Component\npublic class AuthHeaderFilter extends ZuulFilter {\n\n\tprivate static final String BEARER_TOKEN_TYPE = \"bearer \";\n\tprivate static final String OPTIONS = \"OPTIONS\";\n\tprivate static final String AUTH_PATH = \"/auth\";\n\tprivate static final String LOGOUT_URI = \"/oauth/token\";\n\tprivate static final String ALIPAY_CALL_URI = \"/pay/alipayCallback\";\n\n\n\t/**\n\t * Filter type string.\n\t *\n\t * @return the string\n\t */\n\t@Override\n\tpublic String filterType() {\n\t\treturn \"pre\";\n\t}\n\n\t/**\n\t * Filter order int.\n\t *\n\t * @return the int\n\t */\n\t@Override\n\tpublic int filterOrder() {\n\t\treturn 0;\n\t}\n\n\t/**\n\t * Should filter boolean.\n\t *\n\t * @return the boolean\n\t */\n\t@Override\n\tpublic boolean shouldFilter() {\n\t\treturn true;\n\t}\n\n\t/**\n\t * Run object.\n\t *\n\t * @return the object\n\t */\n\t@Override\n\tpublic Object run() {\n\t\tlog.info(\"AuthHeaderFilter - 开始鉴权...\");\n\t\tRequestContext requestContext = RequestContext.getCurrentContext();\n\t\ttry {\n\t\t\tdoSomething(requestContext);\n\t\t} catch (Exception e) {\n\t\t\tlog.error(\"AuthHeaderFilter - [FAIL] EXCEPTION={}\", e.getMessage(), e);\n\t\t\tthrow new BusinessException(ErrorCodeEnum.UAC10011041);\n\t\t}\n\t\treturn null;\n\t}\n\n\tprivate void doSomething(RequestContext requestContext) throws ZuulException {\n\t\tHttpServletRequest request = requestContext.getRequest();\n\t\tString requestURI = request.getRequestURI();\n\n\t\tif (OPTIONS.equalsIgnoreCase(request.getMethod()) || !requestURI.contains(AUTH_PATH) || !requestURI.contains(LOGOUT_URI) || !requestURI.contains(ALIPAY_CALL_URI)) {\n\t\t\treturn;\n\t\t}\n\t\tString authHeader = RequestUtil.getAuthHeader(request);\n\n\t\tif (PublicUtil.isEmpty(authHeader)) {\n\t\t\tthrow new ZuulException(\"刷新页面重试\", 403, \"check token fail\");\n\t\t}\n\n\t\tif (authHeader.startsWith(BEARER_TOKEN_TYPE)) {\n\t\t\trequestContext.addZuulRequestHeader(HttpHeaders.AUTHORIZATION, authHeader);\n\n\t\t\tlog.info(\"authHeader={} \", authHeader);\n\t\t\t// 传递给后续微服务\n\t\t\trequestContext.addZuulRequestHeader(CoreHeaderInterceptor.HEADER_LABEL, authHeader);\n\t\t}\n\t}\n\n}\n"
  },
  {
    "path": "paascloud-gateway/src/main/java/com/paascloud/gateway/filter/RenewFilter.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：RenewFilter.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.gateway.filter;\n\nimport com.netflix.zuul.ZuulFilter;\nimport com.netflix.zuul.context.RequestContext;\nimport com.paascloud.base.enums.ErrorCodeEnum;\nimport com.paascloud.base.exception.BusinessException;\nimport lombok.extern.slf4j.Slf4j;\nimport org.apache.commons.lang.StringUtils;\nimport org.springframework.http.HttpHeaders;\nimport org.springframework.security.oauth2.common.OAuth2AccessToken;\nimport org.springframework.security.oauth2.provider.token.store.JwtTokenStore;\nimport org.springframework.stereotype.Component;\n\nimport javax.annotation.Resource;\nimport javax.servlet.http.HttpServletRequest;\nimport javax.servlet.http.HttpServletResponse;\n\n/**\n * The class Renew filter.\n *\n * @author paascloud.net @gmail.com\n */\n@Component\n@Slf4j\npublic class RenewFilter extends ZuulFilter {\n\n\t@Resource\n\tprivate JwtTokenStore jwtTokenStore;\n\tprivate static final int EXPIRES_IN = 60 * 20;\n\n\t/**\n\t * Filter type string.\n\t *\n\t * @return the string\n\t */\n\t@Override\n\tpublic String filterType() {\n\t\treturn \"post\";\n\t}\n\n\t/**\n\t * Filter order int.\n\t *\n\t * @return the int\n\t */\n\t@Override\n\tpublic int filterOrder() {\n\t\treturn 10;\n\t}\n\n\t/**\n\t * Should filter boolean.\n\t *\n\t * @return the boolean\n\t */\n\t@Override\n\tpublic boolean shouldFilter() {\n\t\treturn true;\n\t}\n\n\t/**\n\t * Run object.\n\t *\n\t * @return the object\n\t */\n\t@Override\n\tpublic Object run() {\n\t\tlog.info(\"RenewFilter - token续租...\");\n\t\tRequestContext requestContext = RequestContext.getCurrentContext();\n\t\ttry {\n\t\t\tdoSomething(requestContext);\n\t\t} catch (Exception e) {\n\t\t\tlog.error(\"RenewFilter - token续租. [FAIL] EXCEPTION={}\", e.getMessage(), e);\n\t\t\tthrow new BusinessException(ErrorCodeEnum.UAC10011041);\n\t\t}\n\t\treturn null;\n\t}\n\n\tprivate void doSomething(RequestContext requestContext) {\n\t\tHttpServletRequest request = requestContext.getRequest();\n\t\tString token = StringUtils.substringAfter(request.getHeader(HttpHeaders.AUTHORIZATION), \"bearer \");\n\t\tif (StringUtils.isEmpty(token)) {\n\t\t\treturn;\n\t\t}\n\t\tOAuth2AccessToken oAuth2AccessToken = jwtTokenStore.readAccessToken(token);\n\t\tint expiresIn = oAuth2AccessToken.getExpiresIn();\n\n\t\tif (expiresIn < EXPIRES_IN) {\n\t\t\tHttpServletResponse servletResponse = requestContext.getResponse();\n\t\t\tservletResponse.addHeader(\"Renew-Header\", \"true\");\n\t\t}\n\t}\n\n}"
  },
  {
    "path": "paascloud-gateway/src/main/resources/application.yml",
    "content": "server:\n  port: 7979\n\nspring:\n  profiles:\n    active: dev\n  application:\n    name: @pom.artifactId@\n\nswagger:\n  title: @pom.artifactId@\n  description: @pom.description@"
  },
  {
    "path": "paascloud-gateway/src/main/resources/banner.txt",
    "content": "${AnsiColor.BRIGHT_CYAN}\n                                  .__                   .___                  __\n___________  _____    ______ ____ |  |   ____  __ __  __| _/     ____   _____/  |_\n\\____ \\__  \\ \\__  \\  /  ___// ___\\|  |  /  _ \\|  |  \\/ __ |     /    \\_/ __ \\   __\\\n|  |_> > __ \\_/ __ \\_\\___ \\\\  \\___|  |_(  <_> )  |  / /_/ |    |   |  \\  ___/|  |\n|   __(____  (____  /____  >\\___  >____/\\____/|____/\\____ | /\\ |___|  /\\___  >__|\n|__|       \\/     \\/     \\/     \\/ Powered by liuzhaoming\\/ \\/      \\/     \\/"
  },
  {
    "path": "paascloud-gateway/src/main/resources/bootstrap.yml",
    "content": "spring:\n  cloud:\n    config:\n      fail-fast: true\n      discovery:\n        service-id: paascloud-discovery\n        enabled: true\n      label: ${spring.profiles.active}\n      profile: ${spring.profiles.active}\n      username: admin\n      password: admin\n\neureka:\n  client:\n    serviceUrl:\n      defaultZone: http://root:root@paascloud-eureka:8761/eureka/\n  instance:\n    instance-id: ${spring.application.name}:${spring.cloud.client.ipAddress}:${server.port}"
  },
  {
    "path": "paascloud-gateway/src/main/resources/logback-spring.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<configuration>\n    <include resource=\"org/springframework/boot/logging/logback/defaults.xml\"/>\n    ​\n    <springProperty scope=\"context\" name=\"springAppName\" source=\"spring.application.name\"/>\n    <!-- Example for logging into the build folder of your project -->\n    <property name=\"LOG_FILE\" value=\"/data/logs/paascloud/${springAppName}/${springAppName}\"/>\n    ​\n    <property name=\"CONSOLE_LOG_PATTERN\" value=\"%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr([${springAppName:-},%X{X-B3-TraceId:-},%X{X-B3-SpanId:-},%X{X-B3-ParentSpanId:-},%X{X-Span-Export:-}]){yellow} %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}\"/>\n\n    <!-- Appender to log to console -->\n    <appender name=\"console\" class=\"ch.qos.logback.core.ConsoleAppender\">\n        <filter class=\"ch.qos.logback.classic.filter.ThresholdFilter\">\n            <!-- Minimum logging level to be presented in the console logs -->\n            <level>DEBUG</level>\n        </filter>\n        <encoder>\n            <pattern>${CONSOLE_LOG_PATTERN}</pattern>\n            <charset>utf8</charset>\n        </encoder>\n    </appender>\n\n    <!-- Appender to log to file -->\n    <appender name=\"flatfile\" class=\"ch.qos.logback.core.rolling.RollingFileAppender\">\n        <file>${LOG_FILE}</file>\n        <rollingPolicy class=\"ch.qos.logback.core.rolling.TimeBasedRollingPolicy\">\n            <fileNamePattern>${LOG_FILE}.%d{yyyy-MM-dd}.gz</fileNamePattern>\n            <maxHistory>7</maxHistory>\n        </rollingPolicy>\n        <encoder>\n            <pattern>${CONSOLE_LOG_PATTERN}</pattern>\n            <charset>utf8</charset>\n        </encoder>\n    </appender>\n    ​\n    <!-- Appender to log to file in a JSON format -->\n    <appender name=\"logstash\" class=\"ch.qos.logback.core.rolling.RollingFileAppender\">\n        <file>${LOG_FILE}.json</file>\n        <rollingPolicy class=\"ch.qos.logback.core.rolling.TimeBasedRollingPolicy\">\n            <fileNamePattern>${LOG_FILE}.json.%d{yyyy-MM-dd}.gz</fileNamePattern>\n            <maxHistory>7</maxHistory>\n        </rollingPolicy>\n        <encoder class=\"net.logstash.logback.encoder.LoggingEventCompositeJsonEncoder\">\n            <providers>\n                <timestamp>\n                    <timeZone>UTC</timeZone>\n                </timestamp>\n                <pattern>\n                    <pattern>\n                        {\n                        \"severity\": \"%level\",\n                        \"service\": \"${springAppName:-}\",\n                        \"trace\": \"%X{X-B3-TraceId:-}\",\n                        \"span\": \"%X{X-B3-SpanId:-}\",\n                        \"parent\": \"%X{X-B3-ParentSpanId:-}\",\n                        \"exportable\": \"%X{X-Span-Export:-}\",\n                        \"pid\": \"${PID:-}\",\n                        \"thread\": \"%thread\",\n                        \"class\": \"%logger{40}\",\n                        \"rest\": \"%message\"\n                        }\n                    </pattern>\n                </pattern>\n            </providers>\n        </encoder>\n    </appender>\n    ​\n  <root level=\"INFO\">\n    <appender-ref ref=\"console\"/>\n        <appender-ref ref=\"logstash\"/>\n        <appender-ref ref=\"flatfile\"/>\n    </root>\n</configuration>"
  },
  {
    "path": "paascloud-generator/.gitignore",
    "content": "paas-cloud-eureka/target/\n!.mvn/wrapper/maven-wrapper.jar\n\n### STS ###\n.apt_generated\n.classpath\n.factorypath\n.project\n.settings\n.springBeans\n\n### IntelliJ IDEA ###\n.idea\n*.iws\n*.iml\n*.ipr\n\n### NetBeans ###\nnbproject/private/\nbuild/\nnbbuild/\ndist/\nnbdist/\n.nb-gradle/"
  },
  {
    "path": "paascloud-generator/README.md",
    "content": "#SSM集成的基础项目, 项目使用Maven管理\n\n#MyBatis3.3.0\n\n#Spring[MVC]4.1.2.RELEASE\n\n项目使用Spring4.1.2.RELEASE + SpringMVC4.1.2.RELEASE + Mybatis3.3.0\n\n项目集成了Mybatis分页插件和通用Mapper插件\n\n项目使用的mysql数据库, 根据需要可以切换为其他数据库\n\n##Spring Boot集成MyBatis的基础项目\n\n###https://github.com/abel533/MyBatis-Spring-Boot\n\n##MyBatis工具\n\n###http://www.mybatis.tk\n\n##推荐使用Mybatis通用Mapper3\n\n###https://github.com/abel533/Mapper\n\n##推荐使用Mybatis分页插件PageHelper\n\n###https://github.com/pagehelper/Mybatis-PageHelper\n\n##作者信息\n\n- 作者博客：http://blog.csdn.net/isea533\n\n- 作者邮箱：abel533@gmail.com\n\n- Mybatis工具群： 211286137 (Mybatis相关工具插件等等)\n\nmybatis-generator:generate\n"
  },
  {
    "path": "paascloud-generator/paascloud-generator-mdc/pom.xml",
    "content": "<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n         xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n    <parent>\n        <groupId>com.liuzm.paascloud</groupId>\n        <artifactId>paascloud-generator</artifactId>\n        <version>1.0</version>\n    </parent>\n    <modelVersion>4.0.0</modelVersion>\n\n    <artifactId>paascloud-generator-mdc</artifactId>\n    <packaging>jar</packaging>\n\n    <name>paascloud-generator-mdc</name>\n    <url>http://maven.apache.org</url>\n\n    <properties>\n        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>\n        <spring.version>4.1.6.RELEASE</spring.version>\n        <!-- MyBatis Generator -->\n        <!-- Java接口和实体类 -->\n        <targetJavaProject>${basedir}/src/main/java</targetJavaProject>\n        <targetMapperPackage>com.paascloud.provider.mapper</targetMapperPackage>\n        <targetModelPackage>com.paascloud.provider.model.domain</targetModelPackage>\n        <!-- XML生成路径 -->\n        <targetResourcesProject>${basedir}/src/main/resources</targetResourcesProject>\n        <targetXMLPackage>mapper</targetXMLPackage>\n    </properties>\n\n</project>\n"
  },
  {
    "path": "paascloud-generator/paascloud-generator-mdc/src/main/java/com/paascloud/provider/main/PaginationPlugin.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：PaginationPlugin.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.main;\n\nimport org.mybatis.generator.api.PluginAdapter;\nimport org.mybatis.generator.api.ShellRunner;\n\nimport java.util.List;\n\n/**\n * The class Pagination plugin.\n *\n * @author paascloud.net@gmail.com\n */\npublic class PaginationPlugin extends PluginAdapter {\n\n\t/**\n\t * Validate boolean.\n\t *\n\t * @param warnings the warnings\n\t *\n\t * @return the boolean\n\t */\n\t@Override\n\tpublic boolean validate(List<String> warnings) {\n\t\treturn true;\n\t}\n\n\tprivate static void generate() {\n\t\tString config = PaginationPlugin.class.getClassLoader().getResource(\"generator/generatorConfig-B.xml\").getFile();\n\t\tString[] arg = {\"-configfile\", config, \"-overwrite\"};\n\t\tShellRunner.main(arg);\n\t}\n\n\t/**\n\t * The entry point of application.\n\t *\n\t * @param args the input arguments\n\t */\n\tpublic static void main(String[] args) {\n\t\tgenerate();\n\t}\n}"
  },
  {
    "path": "paascloud-generator/paascloud-generator-mdc/src/main/resources/config.properties",
    "content": "# \\u6570\\u636E\\u5E93\\u914D\\u7F6E\njdbc.driverClass = com.mysql.jdbc.Driver\njdbc.url=jdbc:mysql://paascloud-db-mysql:3306/paascloud_mdc?useUnicode=true&characterEncoding=UTF-8\njdbc.user=root\njdbc.password=123456\n\n#c3p0\njdbc.maxPoolSize=50\njdbc.minPoolSize=10\njdbc.maxStatements=100\njdbc.testConnection=true\n\n# \\u901A\\u7528Mapper\\u914D\\u7F6E\nmapper.plugin = tk.mybatis.mapper.generator.MapperPlugin\nmapper.Mapper = tk.mybatis.mapper.common.Mapper"
  },
  {
    "path": "paascloud-generator/paascloud-generator-mdc/src/main/resources/generator/generatorConfig-A.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE generatorConfiguration\n        PUBLIC \"-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN\"\n        \"http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd\">\n\n<generatorConfiguration>\n  <properties resource=\"config.properties\"/>\n\n  <context id=\"Mysql\" targetRuntime=\"MyBatis3Simple\"\n           defaultModelType=\"flat\">\n    <property name=\"beginningDelimiter\" value=\"`\"/>\n    <property name=\"endingDelimiter\" value=\"`\"/>\n\n    <plugin type=\"${mapper.plugin}\">\n      <property name=\"mappers\" value=\"${mapper.Mapper}\"/>\n    </plugin>\n\n    <jdbcConnection driverClass=\"${jdbc.driverClass}\"\n                    connectionURL=\"${jdbc.url}\" userId=\"${jdbc.user}\" password=\"${jdbc.password}\">\n    </jdbcConnection>\n\n    <javaModelGenerator targetPackage=\"${targetModelPackage}\"\n                        targetProject=\"${targetJavaProject}\"/>\n\n    <sqlMapGenerator targetPackage=\"${targetXMLPackage}\"\n                     targetProject=\"${targetResourcesProject}\"/>\n\n    <javaClientGenerator targetPackage=\"${targetMapperPackage}\"\n                         targetProject=\"${targetJavaProject}\" type=\"XMLMAPPER\"/>\n\n    <!-- 设置要生成代码的表 -->\n\n    <!--\n    <table tableName=\"pc_mdc_address\" domainObjectName=\"MdcAddress\">\n        <generatedKey column=\"id\" sqlStatement=\"Mysql\" identity=\"true\"/>\n    </table>\n\n    <table tableName=\"pc_mdc_product\" domainObjectName=\"MdcProduct\">\n        <generatedKey column=\"id\" sqlStatement=\"Mysql\" identity=\"true\"/>\n    </table>\n\n    <table tableName=\"pc_mdc_product_category\" domainObjectName=\"MdcProductCategory\">\n        <generatedKey column=\"id\" sqlStatement=\"Mysql\" identity=\"true\"/>\n    </table>\n\n    <table tableName=\"pc_mdc_dict\" domainObjectName=\"MdcDict\">\n        <generatedKey column=\"id\" sqlStatement=\"Mysql\" identity=\"true\"/>\n    </table>\n\n    <table tableName=\"pc_mdc_mq_consumer\" domainObjectName=\"MdcMqConsumer\">\n        <generatedKey column=\"id\" sqlStatement=\"Mysql\" identity=\"true\"/>\n    </table>\n\n    <table tableName=\"pc_mdc_mq_consumer_tag\" domainObjectName=\"MdcMqConsumerTag\">\n        <generatedKey column=\"id\" sqlStatement=\"Mysql\" identity=\"true\"/>\n    </table>\n\n    <table tableName=\"pc_mdc_mq_producer\" domainObjectName=\"MdcMqProducer\">\n        <generatedKey column=\"id\" sqlStatement=\"Mysql\" identity=\"true\"/>\n    </table>\n\n    <table tableName=\"pc_mdc_mq_tag\" domainObjectName=\"MdcMqTag\">\n        <generatedKey column=\"id\" sqlStatement=\"Mysql\" identity=\"true\"/>\n    </table>\n    <table tableName=\"pc_mdc_mq_topic\" domainObjectName=\"MdcMqTopic\">\n        <generatedKey column=\"id\" sqlStatement=\"Mysql\" identity=\"true\"/>\n    </table>\n    <table tableName=\"pc_mdc_exception_log\" domainObjectName=\"MdcExceptionLog\">\n      <generatedKey column=\"id\" sqlStatement=\"Mysql\" identity=\"true\"/>\n    </table>\n    -->\n    <table tableName=\"pc_mdc_product_category\" domainObjectName=\"MdcProductCategory\">\n      <generatedKey column=\"id\" sqlStatement=\"Mysql\" identity=\"true\"/>\n    </table>\n    <table tableName=\"pc_mdc_product\" domainObjectName=\"MdcProduct\">\n      <generatedKey column=\"id\" sqlStatement=\"Mysql\" identity=\"true\"/>\n    </table>\n  </context>\n</generatorConfiguration>"
  },
  {
    "path": "paascloud-generator/paascloud-generator-mdc/src/main/resources/generator/generatorConfig-B.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n    <!DOCTYPE generatorConfiguration\n      PUBLIC \"-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN\"\n      \"http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd\">\n    <generatorConfiguration>\n    <properties resource=\"config.properties\"/>\n    <!-- 数据库驱动 -->\n        <context id=\"DB2Tables\"  targetRuntime=\"MyBatis3\">\n            <commentGenerator>\n                <property name=\"suppressDate\" value=\"true\"/>\n                <!-- 是否去除自动生成的注释 true：是 ： false:否 -->\n                <property name=\"suppressAllComments\" value=\"false\"/>\n            </commentGenerator>\n            <!-- 数据库链接URL, 用户名、密码 -->\n            <jdbcConnection driverClass=\"${jdbc.driverClass}\" connectionURL=\"${jdbc.url}\" userId=\"${jdbc.user}\" password=\"${jdbc.password}\">\n            </jdbcConnection>\n            <javaTypeResolver>\n                <property name=\"forceBigDecimals\" value=\"false\"/>\n            </javaTypeResolver>\n            <!-- 生成模型的包名和位置 -->\n            <javaModelGenerator targetPackage=\"com.paascloud.provider.model.domain\" targetProject=\"D:\\git\\liuzm-git\\paascloud-git\\paascloud-master\\paascloud-generator\\paascloud-generator-mdc\\src\\main\\java\">\n                <property name=\"enableSubPackages\" value=\"true\"/>\n                <property name=\"trimStrings\" value=\"true\"/>\n            </javaModelGenerator>\n            <!-- 生成映射文件的包名和位置 -->\n            <sqlMapGenerator targetPackage=\"mapper\" targetProject=\"D:\\git\\liuzm-git\\paascloud-git\\paascloud-master\\paascloud-generator\\paascloud-generator-mdc\\src\\main\\resources\">\n                <property name=\"enableSubPackages\" value=\"true\"/>\n            </sqlMapGenerator>\n            <!-- 生成DAO的包名和位置 -->\n            <javaClientGenerator type=\"XMLMAPPER\" targetPackage=\"com.paascloud.provider.mapper\" targetProject=\"D:\\git\\liuzm-git\\paascloud-git\\paascloud-master\\paascloud-generator\\paascloud-generator-mdc\\src\\main\\java\">\n                <property name=\"enableSubPackages\" value=\"true\"/>\n            </javaClientGenerator>\n            <!-- 要生成哪些表 -->\n             <!--<table tableName=\"pc_mdc_address\" domainObjectName=\"MdcAddress\"  enableCountByExample=\"false\" enableUpdateByExample=\"false\" enableDeleteByExample=\"false\" enableSelectByExample=\"false\" selectByExampleQueryId=\"false\"></table>-->\n            <!--<table tableName=\"pc_mdc_product\" domainObjectName=\"MdcProduct\"  enableCountByExample=\"false\" enableUpdateByExample=\"false\" enableDeleteByExample=\"false\" enableSelectByExample=\"false\" selectByExampleQueryId=\"false\"></table>\n            <table tableName=\"pc_mdc_product_category\" domainObjectName=\"MdcProductCategory\"  enableCountByExample=\"false\" enableUpdateByExample=\"false\" enableDeleteByExample=\"false\" enableSelectByExample=\"false\" selectByExampleQueryId=\"false\"></table>\n            <table tableName=\"pc_mdc_dict\" domainObjectName=\"MdcDict\"  enableCountByExample=\"false\" enableUpdateByExample=\"false\" enableDeleteByExample=\"false\" enableSelectByExample=\"false\" selectByExampleQueryId=\"false\"></table>\n            <table tableName=\"pc_mdc_mq_consumer\" domainObjectName=\"MdcMqConsumer\"  enableCountByExample=\"false\" enableUpdateByExample=\"false\" enableDeleteByExample=\"false\" enableSelectByExample=\"false\" selectByExampleQueryId=\"false\"></table>\n            <table tableName=\"pc_mdc_mq_consumer_tag\" domainObjectName=\"MdcMqConsumerTag\"  enableCountByExample=\"false\" enableUpdateByExample=\"false\" enableDeleteByExample=\"false\" enableSelectByExample=\"false\" selectByExampleQueryId=\"false\"></table>\n            <table tableName=\"pc_mdc_mq_producer\" domainObjectName=\"MdcMqProducer\"  enableCountByExample=\"false\" enableUpdateByExample=\"false\" enableDeleteByExample=\"false\" enableSelectByExample=\"false\" selectByExampleQueryId=\"false\"></table>\n            <table tableName=\"pc_mdc_mq_tag\" domainObjectName=\"MdcMqTag\"  enableCountByExample=\"false\" enableUpdateByExample=\"false\" enableDeleteByExample=\"false\" enableSelectByExample=\"false\" selectByExampleQueryId=\"false\"></table>\n            <table tableName=\"pc_mdc_mq_topic\" domainObjectName=\"MdcMqTopic\"  enableCountByExample=\"false\" enableUpdateByExample=\"false\" enableDeleteByExample=\"false\" enableSelectByExample=\"false\" selectByExampleQueryId=\"false\"></table>\n\n            <table tableName=\"pc_mdc_product_category\" domainObjectName=\"MdcProductCategory\"  enableCountByExample=\"false\" enableUpdateByExample=\"false\" enableDeleteByExample=\"false\" enableSelectByExample=\"false\" selectByExampleQueryId=\"false\"></table>\n            <table tableName=\"pc_mdc_product\" domainObjectName=\"MdcProduct\"  enableCountByExample=\"false\" enableUpdateByExample=\"false\" enableDeleteByExample=\"false\" enableSelectByExample=\"false\" selectByExampleQueryId=\"false\"></table>\n            -->\n          <table tableName=\"pc_mdc_exception_log\" domainObjectName=\"MdcExceptionLog\"  enableCountByExample=\"false\" enableUpdateByExample=\"false\" enableDeleteByExample=\"false\" enableSelectByExample=\"false\" selectByExampleQueryId=\"false\"></table>\n        </context>\n    </generatorConfiguration>"
  },
  {
    "path": "paascloud-generator/paascloud-generator-omc/pom.xml",
    "content": "<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n         xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n    <parent>\n        <groupId>com.liuzm.paascloud</groupId>\n        <artifactId>paascloud-generator</artifactId>\n        <version>1.0</version>\n    </parent>\n    <modelVersion>4.0.0</modelVersion>\n\n    <artifactId>paascloud-generator-omc</artifactId>\n    <packaging>jar</packaging>\n\n    <name>paascloud-generator-omc</name>\n    <url>http://maven.apache.org</url>\n\n    <properties>\n        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>\n        <spring.version>4.1.6.RELEASE</spring.version>\n        <!-- MyBatis Generator -->\n        <!-- Java接口和实体类 -->\n        <targetJavaProject>${basedir}/src/main/java</targetJavaProject>\n        <targetMapperPackage>com.paascloud.provider.mapper</targetMapperPackage>\n        <targetModelPackage>com.paascloud.provider.model.domain</targetModelPackage>\n        <!-- XML生成路径 -->\n        <targetResourcesProject>${basedir}/src/main/resources</targetResourcesProject>\n        <targetXMLPackage>mapper</targetXMLPackage>\n    </properties>\n\n</project>\n"
  },
  {
    "path": "paascloud-generator/paascloud-generator-omc/src/main/java/com/paascloud/provider/main/PaginationPlugin.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：PaginationPlugin.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.main;\n\nimport org.mybatis.generator.api.PluginAdapter;\nimport org.mybatis.generator.api.ShellRunner;\n\nimport java.util.List;\n\n/**\n * The class Pagination plugin.\n *\n * @author paascloud.net@gmail.com\n */\npublic class PaginationPlugin extends PluginAdapter {\n\n\t/**\n\t * Validate boolean.\n\t *\n\t * @param warnings the warnings\n\t *\n\t * @return the boolean\n\t */\n\t@Override\n\tpublic boolean validate(List<String> warnings) {\n\t\treturn true;\n\t}\n\n\tprivate static void generate() {\n\t\tSystem.out.println(\"开始生成表结构...\");\n\t\tString config = PaginationPlugin.class.getClassLoader().getResource(\"generator/generatorConfig-B.xml\").getFile();\n\t\tString[] arg = {\"-configfile\", config, \"-overwrite\"};\n\t\tShellRunner.main(arg);\n\t\tSystem.out.println(\"生成表结构成功...\");\n\t}\n\n\t/**\n\t * The entry point of application.\n\t *\n\t * @param args the input arguments\n\t */\n\tpublic static void main(String[] args) {\n\t\tgenerate();\n\t}\n}"
  },
  {
    "path": "paascloud-generator/paascloud-generator-omc/src/main/resources/config.properties",
    "content": "# \\u6570\\u636E\\u5E93\\u914D\\u7F6E\njdbc.driverClass = com.mysql.jdbc.Driver\njdbc.url=jdbc:mysql://paascloud-db-mysql:3306/paascloud_omc?useUnicode=true&characterEncoding=UTF-8\njdbc.user=root\njdbc.password=123456\n\n#c3p0\njdbc.maxPoolSize=50\njdbc.minPoolSize=10\njdbc.maxStatements=100\njdbc.testConnection=true\n\n# \\u901A\\u7528Mapper\\u914D\\u7F6E\nmapper.plugin = tk.mybatis.mapper.generator.MapperPlugin\nmapper.Mapper = tk.mybatis.mapper.common.Mapper"
  },
  {
    "path": "paascloud-generator/paascloud-generator-omc/src/main/resources/generator/generatorConfig-A.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE generatorConfiguration\n        PUBLIC \"-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN\"\n        \"http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd\">\n\n<generatorConfiguration>\n    <properties resource=\"config.properties\"/>\n\n    <context id=\"Mysql\" targetRuntime=\"MyBatis3Simple\"\n             defaultModelType=\"flat\">\n        <property name=\"beginningDelimiter\" value=\"`\"/>\n        <property name=\"endingDelimiter\" value=\"`\"/>\n\n        <plugin type=\"${mapper.plugin}\">\n            <property name=\"mappers\" value=\"${mapper.Mapper}\"/>\n        </plugin>\n\n        <jdbcConnection driverClass=\"${jdbc.driverClass}\"\n                        connectionURL=\"${jdbc.url}\" userId=\"${jdbc.user}\" password=\"${jdbc.password}\">\n        </jdbcConnection>\n\n        <javaModelGenerator targetPackage=\"${targetModelPackage}\"\n                            targetProject=\"${targetJavaProject}\"/>\n\n        <sqlMapGenerator targetPackage=\"${targetXMLPackage}\"\n                         targetProject=\"${targetResourcesProject}\"/>\n\n        <javaClientGenerator targetPackage=\"${targetMapperPackage}\"\n                             targetProject=\"${targetJavaProject}\" type=\"XMLMAPPER\"/>\n\n        <!-- 设置要生成代码的表 -->\n        <!--<table tableName=\"tbl_rmc_warehouse_area\" domainObjectName=\"RmcWarehouseArea\">-->\n            <!--<generatedKey column=\"id\" sqlStatement=\"Mysql\" identity=\"true\"/>-->\n        <!--</table>-->\n        <!--<table tableName=\"tbl_rmc_device_detail\" domainObjectName=\"RmcDeviceDetail\">-->\n            <!--<generatedKey column=\"id\" sqlStatement=\"Mysql\" identity=\"true\"/>-->\n        <!--</table>-->\n\n\n        <!--<table tableName=\"pc_omc_shipping\" domainObjectName=\"OmcShipping\">-->\n            <!--<generatedKey column=\"id\" sqlStatement=\"Mysql\" identity=\"true\"/>-->\n        <!--</table>-->\n\n        <table tableName=\"pc_omc_order_detail\" domainObjectName=\"OmcOrderDetail\">\n            <generatedKey column=\"id\" sqlStatement=\"Mysql\" identity=\"true\"/>\n        </table>\n\n        <table tableName=\"pc_omc_order\" domainObjectName=\"OmcOrder\">\n            <generatedKey column=\"id\" sqlStatement=\"Mysql\" identity=\"true\"/>\n        </table>\n        <!--\n\n        <table tableName=\"pc_omc_cart\" domainObjectName=\"OmcCart\">\n            <generatedKey column=\"id\" sqlStatement=\"Mysql\" identity=\"true\"/>\n        </table>-->\n\n        </context>\n    </generatorConfiguration>"
  },
  {
    "path": "paascloud-generator/paascloud-generator-omc/src/main/resources/generator/generatorConfig-B.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n    <!DOCTYPE generatorConfiguration\n      PUBLIC \"-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN\"\n      \"http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd\">\n    <generatorConfiguration>\n    <properties resource=\"config.properties\"/>\n    <!-- 数据库驱动 -->\n        <context id=\"DB2Tables\"  targetRuntime=\"MyBatis3\">\n            <commentGenerator>\n                <property name=\"suppressDate\" value=\"true\"/>\n                <!-- 是否去除自动生成的注释 true：是 ： false:否 -->\n                <property name=\"suppressAllComments\" value=\"false\"/>\n            </commentGenerator>\n            <!-- 数据库链接URL, 用户名、密码 -->\n            <jdbcConnection driverClass=\"${jdbc.driverClass}\" connectionURL=\"${jdbc.url}\" userId=\"${jdbc.user}\" password=\"${jdbc.password}\">\n            </jdbcConnection>\n            <javaTypeResolver>\n                <property name=\"forceBigDecimals\" value=\"false\"/>\n            </javaTypeResolver>\n            <!-- 生成模型的包名和位置 -->\n            <javaModelGenerator targetPackage=\"com.paascloud.provider.model.domain\" targetProject=\"D:\\git\\liuzm-git\\paascloud-git\\paascloud-master\\paascloud-generator\\paascloud-generator-omc\\src\\main\\java\">\n                <property name=\"enableSubPackages\" value=\"true\"/>\n                <property name=\"trimStrings\" value=\"true\"/>\n            </javaModelGenerator>\n            <!-- 生成映射文件的包名和位置 -->\n            <sqlMapGenerator targetPackage=\"mapper\" targetProject=\"D:\\git\\liuzm-git\\paascloud-git\\paascloud-master\\paascloud-generator\\paascloud-generator-omc\\src\\main\\resources\">\n                <property name=\"enableSubPackages\" value=\"true\"/>\n            </sqlMapGenerator>\n            <!-- 生成DAO的包名和位置 -->\n            <javaClientGenerator type=\"XMLMAPPER\" targetPackage=\"com.paascloud.provider.mapper\" targetProject=\"D:\\git\\liuzm-git\\paascloud-git\\paascloud-master\\paascloud-generator\\paascloud-generator-omc\\src\\main\\java\">\n                <property name=\"enableSubPackages\" value=\"true\"/>\n            </javaClientGenerator>\n            <!-- 要生成哪些表 -->\n            <!--<table tableName=\"pc_omc_shipping\" domainObjectName=\"OmcShipping\"  enableCountByExample=\"false\" enableUpdateByExample=\"false\" enableDeleteByExample=\"false\" enableSelectByExample=\"false\" selectByExampleQueryId=\"false\"></table>-->\n            <table tableName=\"pc_omc_order_detail\" domainObjectName=\"OmcOrderDetail\"  enableCountByExample=\"false\" enableUpdateByExample=\"false\" enableDeleteByExample=\"false\" enableSelectByExample=\"false\" selectByExampleQueryId=\"false\"></table>\n            <table tableName=\"pc_omc_order\" domainObjectName=\"OmcOrder\"  enableCountByExample=\"false\" enableUpdateByExample=\"false\" enableDeleteByExample=\"false\" enableSelectByExample=\"false\" selectByExampleQueryId=\"false\"></table>\n\n        </context>\n    </generatorConfiguration>"
  },
  {
    "path": "paascloud-generator/paascloud-generator-opc/pom.xml",
    "content": "<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n         xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n    <parent>\n        <groupId>com.liuzm.paascloud</groupId>\n        <artifactId>paascloud-generator</artifactId>\n        <version>1.0</version>\n    </parent>\n    <modelVersion>4.0.0</modelVersion>\n\n    <artifactId>paascloud-generator-opc</artifactId>\n    <packaging>jar</packaging>\n\n    <name>paascloud-generator-opc</name>\n    <url>http://maven.apache.org</url>\n\n    <properties>\n        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>\n        <spring.version>4.1.6.RELEASE</spring.version>\n        <!-- MyBatis Generator -->\n        <!-- Java接口和实体类 -->\n        <targetJavaProject>${basedir}/src/main/java</targetJavaProject>\n        <targetMapperPackage>com.paascloud.provider.mapper</targetMapperPackage>\n        <targetModelPackage>com.paascloud.provider.model.domain</targetModelPackage>\n        <!-- XML生成路径 -->\n        <targetResourcesProject>${basedir}/src/main/resources</targetResourcesProject>\n        <targetXMLPackage>mapper</targetXMLPackage>\n    </properties>\n\n</project>\n"
  },
  {
    "path": "paascloud-generator/paascloud-generator-opc/src/main/java/com/paascloud/provider/main/PaginationPlugin.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：PaginationPlugin.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.main;\n\nimport org.mybatis.generator.api.PluginAdapter;\nimport org.mybatis.generator.api.ShellRunner;\n\nimport java.util.List;\n\n/**\n * The class Pagination plugin.\n *\n * @author paascloud.net@gmail.com\n */\npublic class PaginationPlugin extends PluginAdapter {\n\n\t/**\n\t * Validate boolean.\n\t *\n\t * @param warnings the warnings\n\t *\n\t * @return the boolean\n\t */\n\t@Override\n\tpublic boolean validate(List<String> warnings) {\n\t\treturn true;\n\t}\n\n\tprivate static void generate() {\n\t\tString config = PaginationPlugin.class.getClassLoader().getResource(\"generator/generatorConfig-B.xml\").getFile();\n\t\tString[] arg = {\"-configfile\", config, \"-overwrite\"};\n\t\tShellRunner.main(arg);\n\t}\n\n\t/**\n\t * The entry point of application.\n\t *\n\t * @param args the input arguments\n\t */\n\tpublic static void main(String[] args) {\n\t\tgenerate();\n\t}\n}"
  },
  {
    "path": "paascloud-generator/paascloud-generator-opc/src/main/resources/config.properties",
    "content": "# \\u6570\\u636E\\u5E93\\u914D\\u7F6E\njdbc.driverClass = com.mysql.jdbc.Driver\njdbc.url=jdbc:mysql://paascloud-db-mysql:3306/paascloud_opc?useUnicode=true&characterEncoding=UTF-8\njdbc.user=root\njdbc.password=123456\n\n#c3p0\njdbc.maxPoolSize=50\njdbc.minPoolSize=10\njdbc.maxStatements=100\njdbc.testConnection=true\n\n# \\u901A\\u7528Mapper\\u914D\\u7F6E\nmapper.plugin = tk.mybatis.mapper.generator.MapperPlugin\nmapper.Mapper = tk.mybatis.mapper.common.Mapper"
  },
  {
    "path": "paascloud-generator/paascloud-generator-opc/src/main/resources/generator/generatorConfig-A.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE generatorConfiguration\n        PUBLIC \"-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN\"\n        \"http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd\">\n\n<generatorConfiguration>\n    <properties resource=\"config.properties\"/>\n\n    <context id=\"Mysql\" targetRuntime=\"MyBatis3Simple\"\n             defaultModelType=\"flat\">\n        <property name=\"beginningDelimiter\" value=\"`\"/>\n        <property name=\"endingDelimiter\" value=\"`\"/>\n\n        <plugin type=\"${mapper.plugin}\">\n            <property name=\"mappers\" value=\"${mapper.Mapper}\"/>\n        </plugin>\n\n        <jdbcConnection driverClass=\"${jdbc.driverClass}\"\n                        connectionURL=\"${jdbc.url}\" userId=\"${jdbc.user}\" password=\"${jdbc.password}\">\n        </jdbcConnection>\n\n        <javaModelGenerator targetPackage=\"${targetModelPackage}\"\n                            targetProject=\"${targetJavaProject}\"/>\n\n        <sqlMapGenerator targetPackage=\"${targetXMLPackage}\"\n                         targetProject=\"${targetResourcesProject}\"/>\n\n        <javaClientGenerator targetPackage=\"${targetMapperPackage}\"\n                             targetProject=\"${targetJavaProject}\" type=\"XMLMAPPER\"/>\n\n        <!-- 设置要生成代码的表 -->\n        <!--<table tableName=\"tbl_rmc_warehouse_area\" domainObjectName=\"RmcWarehouseArea\">-->\n            <!--<generatedKey column=\"id\" sqlStatement=\"Mysql\" identity=\"true\"/>-->\n        <!--</table>-->\n        <!--<table tableName=\"tbl_rmc_device_detail\" domainObjectName=\"RmcDeviceDetail\">-->\n            <!--<generatedKey column=\"id\" sqlStatement=\"Mysql\" identity=\"true\"/>-->\n        <!--</table>-->\n\n\n        <table tableName=\"pc_opt_attachment\" domainObjectName=\"OptAttachment\">\n            <generatedKey column=\"id\" sqlStatement=\"Mysql\" identity=\"true\"/>\n        </table>\n\n        </context>\n    </generatorConfiguration>"
  },
  {
    "path": "paascloud-generator/paascloud-generator-opc/src/main/resources/generator/generatorConfig-B.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n    <!DOCTYPE generatorConfiguration\n      PUBLIC \"-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN\"\n      \"http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd\">\n    <generatorConfiguration>\n    <properties resource=\"config.properties\"/>\n    <!-- 数据库驱动 -->\n        <context id=\"DB2Tables\"  targetRuntime=\"MyBatis3\">\n            <commentGenerator>\n                <property name=\"suppressDate\" value=\"true\"/>\n                <!-- 是否去除自动生成的注释 true：是 ： false:否 -->\n                <property name=\"suppressAllComments\" value=\"false\"/>\n            </commentGenerator>\n            <!-- 数据库链接URL, 用户名、密码 -->\n            <jdbcConnection driverClass=\"${jdbc.driverClass}\" connectionURL=\"${jdbc.url}\" userId=\"${jdbc.user}\" password=\"${jdbc.password}\">\n            </jdbcConnection>\n            <javaTypeResolver>\n                <property name=\"forceBigDecimals\" value=\"false\"/>\n            </javaTypeResolver>\n            <!-- 生成模型的包名和位置 -->\n            <javaModelGenerator targetPackage=\"com.paascloud.provider.model.domain\" targetProject=\"D:\\git\\liuzm-git\\paascloud-git\\paascloud-master\\paascloud-generator\\paascloud-generator-opt\\src\\main\\java\">\n                <property name=\"enableSubPackages\" value=\"true\"/>\n                <property name=\"trimStrings\" value=\"true\"/>\n            </javaModelGenerator>\n            <!-- 生成映射文件的包名和位置 -->\n            <sqlMapGenerator targetPackage=\"mapper\" targetProject=\"D:\\git\\liuzm-git\\paascloud-git\\paascloud-master\\paascloud-generator\\paascloud-generator-opt\\src\\main\\resources\">\n                <property name=\"enableSubPackages\" value=\"true\"/>\n            </sqlMapGenerator>\n            <!-- 生成DAO的包名和位置 -->\n            <javaClientGenerator type=\"XMLMAPPER\" targetPackage=\"com.paascloud.provider.mapper\" targetProject=\"D:\\git\\liuzm-git\\paascloud-git\\paascloud-master\\paascloud-generator\\paascloud-generator-opt\\src\\main\\java\">\n                <property name=\"enableSubPackages\" value=\"true\"/>\n            </javaClientGenerator>\n            <!-- 要生成哪些表 -->\n            <!--\n            <table tableName=\"pc_opt_action\" domainObjectName=\"optAction\"  enableCountByExample=\"false\" enableUpdateByExample=\"false\" enableDeleteByExample=\"false\" enableSelectByExample=\"false\" selectByExampleQueryId=\"false\"></table>\n            <table tableName=\"pc_opt_group\" domainObjectName=\"optGroup\"  enableCountByExample=\"false\" enableUpdateByExample=\"false\" enableDeleteByExample=\"false\" enableSelectByExample=\"false\" selectByExampleQueryId=\"false\"></table>\n            <table tableName=\"pc_opt_log\" domainObjectName=\"optLog\"  enableCountByExample=\"false\" enableUpdateByExample=\"false\" enableDeleteByExample=\"false\" enableSelectByExample=\"false\" selectByExampleQueryId=\"false\"></table>\n            <table tableName=\"pc_opt_role\" domainObjectName=\"optRole\"  enableCountByExample=\"false\" enableUpdateByExample=\"false\" enableDeleteByExample=\"false\" enableSelectByExample=\"false\" selectByExampleQueryId=\"false\"></table>\n            -->\n            <table tableName=\"pc_opc_sms_setting\" domainObjectName=\"OpcSmsSetting\"  enableCountByExample=\"false\" enableUpdateByExample=\"false\" enableDeleteByExample=\"false\" enableSelectByExample=\"false\" selectByExampleQueryId=\"false\"></table>\n        </context>\n    </generatorConfiguration>"
  },
  {
    "path": "paascloud-generator/paascloud-generator-tpc/pom.xml",
    "content": "<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n         xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n    <parent>\n        <groupId>com.liuzm.paascloud</groupId>\n        <artifactId>paascloud-generator</artifactId>\n        <version>1.0</version>\n    </parent>\n    <modelVersion>4.0.0</modelVersion>\n\n    <artifactId>paascloud-generator-tpc</artifactId>\n    <packaging>jar</packaging>\n\n    <name>paascloud-generator-tpc</name>\n    <url>http://maven.apache.org</url>\n\n    <properties>\n        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>\n        <spring.version>4.1.6.RELEASE</spring.version>\n        <!-- MyBatis Generator -->\n        <!-- Java接口和实体类 -->\n        <targetJavaProject>${basedir}/src/main/java</targetJavaProject>\n        <targetMapperPackage>com.paascloud.provider.mapper</targetMapperPackage>\n        <targetModelPackage>com.paascloud.provider.model.domain</targetModelPackage>\n        <!-- XML生成路径 -->\n        <targetResourcesProject>${basedir}/src/main/resources</targetResourcesProject>\n        <targetXMLPackage>mapper</targetXMLPackage>\n    </properties>\n\n</project>\n"
  },
  {
    "path": "paascloud-generator/paascloud-generator-tpc/src/main/java/com/paascloud/provider/main/PaginationPlugin.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：PaginationPlugin.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.main;\n\nimport org.mybatis.generator.api.PluginAdapter;\nimport org.mybatis.generator.api.ShellRunner;\n\nimport java.util.List;\n\n/**\n * The class Pagination plugin.\n *\n * @author paascloud.net@gmail.com\n */\npublic class PaginationPlugin extends PluginAdapter {\n\n\t/**\n\t * Validate boolean.\n\t *\n\t * @param warnings the warnings\n\t *\n\t * @return the boolean\n\t */\n\t@Override\n\tpublic boolean validate(List<String> warnings) {\n\t\treturn true;\n\t}\n\n\tprivate static void generate() {\n\t\tString config = PaginationPlugin.class.getClassLoader().getResource(\"generator/generatorConfig-B.xml\").getFile();\n\t\tString[] arg = {\"-configfile\", config, \"-overwrite\"};\n\t\tShellRunner.main(arg);\n\t}\n\n\t/**\n\t * The entry point of application.\n\t *\n\t * @param args the input arguments\n\t */\n\tpublic static void main(String[] args) {\n\t\tgenerate();\n\t}\n}"
  },
  {
    "path": "paascloud-generator/paascloud-generator-tpc/src/main/resources/config.properties",
    "content": "# \\u6570\\u636E\\u5E93\\u914D\\u7F6E\njdbc.driverClass = com.mysql.jdbc.Driver\njdbc.url=jdbc:mysql://paascloud-db-mysql:3306/paascloud_tpc?useUnicode=true&characterEncoding=UTF-8\njdbc.user=root\njdbc.password=123456\n\n#c3p0\njdbc.maxPoolSize=50\njdbc.minPoolSize=10\njdbc.maxStatements=100\njdbc.testConnection=true\n\n# \\u901A\\u7528Mapper\\u914D\\u7F6E\nmapper.plugin = tk.mybatis.mapper.generator.MapperPlugin\nmapper.Mapper = tk.mybatis.mapper.common.Mapper"
  },
  {
    "path": "paascloud-generator/paascloud-generator-tpc/src/main/resources/generator/generatorConfig-A.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE generatorConfiguration\n        PUBLIC \"-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN\"\n        \"http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd\">\n\n<generatorConfiguration>\n    <properties resource=\"config.properties\"/>\n\n    <context id=\"Mysql\" targetRuntime=\"MyBatis3Simple\"\n             defaultModelType=\"flat\">\n        <property name=\"beginningDelimiter\" value=\"`\"/>\n        <property name=\"endingDelimiter\" value=\"`\"/>\n\n        <plugin type=\"${mapper.plugin}\">\n            <property name=\"mappers\" value=\"${mapper.Mapper}\"/>\n        </plugin>\n\n        <jdbcConnection driverClass=\"${jdbc.driverClass}\"\n                        connectionURL=\"${jdbc.url}\" userId=\"${jdbc.user}\" password=\"${jdbc.password}\">\n        </jdbcConnection>\n\n        <javaModelGenerator targetPackage=\"${targetModelPackage}\"\n                            targetProject=\"${targetJavaProject}\"/>\n\n        <sqlMapGenerator targetPackage=\"${targetXMLPackage}\"\n                         targetProject=\"${targetResourcesProject}\"/>\n\n        <javaClientGenerator targetPackage=\"${targetMapperPackage}\"\n                             targetProject=\"${targetJavaProject}\" type=\"XMLMAPPER\"/>\n\n        <!-- 设置要生成代码的表 -->\n        <table tableName=\"pc_tpc_mq_message\" domainObjectName=\"TpcMqMessage\">\n            <generatedKey column=\"id\" sqlStatement=\"Mysql\" identity=\"true\"/>\n        </table>\n\n      <!--<table tableName=\"pc_tpc_job_task\" domainObjectName=\"TpcJobTask\">-->\n        <!--<generatedKey column=\"id\" sqlStatement=\"Mysql\" identity=\"true\"/>-->\n      <!--</table>-->\n\n      <!--<table tableName=\"pc_tpc_mq_confirm\" domainObjectName=\"TpcMqConfirm\">-->\n        <!--<generatedKey column=\"id\" sqlStatement=\"Mysql\" identity=\"true\"/>-->\n      <!--</table>-->\n\n        </context>\n    </generatorConfiguration>"
  },
  {
    "path": "paascloud-generator/paascloud-generator-tpc/src/main/resources/generator/generatorConfig-B.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n    <!DOCTYPE generatorConfiguration\n      PUBLIC \"-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN\"\n      \"http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd\">\n    <generatorConfiguration>\n    <properties resource=\"config.properties\"/>\n    <!-- 数据库驱动 -->\n        <context id=\"DB2Tables\"  targetRuntime=\"MyBatis3\">\n            <commentGenerator>\n                <property name=\"suppressDate\" value=\"true\"/>\n                <!-- 是否去除自动生成的注释 true：是 ： false:否 -->\n                <property name=\"suppressAllComments\" value=\"false\"/>\n            </commentGenerator>\n            <!-- 数据库链接URL, 用户名、密码 -->\n            <jdbcConnection driverClass=\"${jdbc.driverClass}\" connectionURL=\"${jdbc.url}\" userId=\"${jdbc.user}\" password=\"${jdbc.password}\">\n            </jdbcConnection>\n            <javaTypeResolver>\n                <property name=\"forceBigDecimals\" value=\"false\"/>\n            </javaTypeResolver>\n            <!-- 生成模型的包名和位置 -->\n            <javaModelGenerator targetPackage=\"com.paascloud.provider.model.domain\" targetProject=\"D:\\git\\liuzm-git\\paascloud-git\\paascloud-master\\paascloud-generator\\paascloud-generator-tpc\\src\\main\\java\">\n                <property name=\"enableSubPackages\" value=\"true\"/>\n                <property name=\"trimStrings\" value=\"true\"/>\n            </javaModelGenerator>\n            <!-- 生成映射文件的包名和位置 -->\n            <sqlMapGenerator targetPackage=\"mapper\" targetProject=\"D:\\git\\liuzm-git\\paascloud-git\\paascloud-master\\paascloud-generator\\paascloud-generator-tpc\\src\\main\\resources\">\n                <property name=\"enableSubPackages\" value=\"true\"/>\n            </sqlMapGenerator>\n            <!-- 生成DAO的包名和位置 -->\n            <javaClientGenerator type=\"XMLMAPPER\" targetPackage=\"com.paascloud.provider.mapper\" targetProject=\"D:\\git\\liuzm-git\\paascloud-git\\paascloud-master\\paascloud-generator\\paascloud-generator-tpc\\src\\main\\java\">\n                <property name=\"enableSubPackages\" value=\"true\"/>\n            </javaClientGenerator>\n            <!-- 要生成哪些表 -->\n            <!--<table tableName=\"pc_tpc_job_task\" domainObjectName=\"TpcJobTask\"  enableCountByExample=\"false\" enableUpdateByExample=\"false\" enableDeleteByExample=\"false\" enableSelectByExample=\"false\" selectByExampleQueryId=\"false\"></table>-->\n            <!--<table tableName=\"pc_tpc_mq_confirm\" domainObjectName=\"TpcMqConfirm\"  enableCountByExample=\"false\" enableUpdateByExample=\"false\" enableDeleteByExample=\"false\" enableSelectByExample=\"false\" selectByExampleQueryId=\"false\"></table>-->\n            <table tableName=\"pc_tpc_mq_message\" domainObjectName=\"TpcMqMessage\"  enableCountByExample=\"false\" enableUpdateByExample=\"false\" enableDeleteByExample=\"false\" enableSelectByExample=\"false\" selectByExampleQueryId=\"false\"></table>\n        </context>\n    </generatorConfiguration>"
  },
  {
    "path": "paascloud-generator/paascloud-generator-uac/pom.xml",
    "content": "<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n         xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n    <parent>\n        <groupId>com.liuzm.paascloud</groupId>\n        <artifactId>paascloud-generator</artifactId>\n        <version>1.0</version>\n    </parent>\n    <modelVersion>4.0.0</modelVersion>\n\n    <artifactId>paascloud-generator-uac</artifactId>\n    <packaging>jar</packaging>\n\n    <name>paascloud-generator-uac</name>\n    <url>http://maven.apache.org</url>\n\n    <properties>\n        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>\n        <spring.version>4.1.6.RELEASE</spring.version>\n        <!-- MyBatis Generator -->\n        <!-- Java接口和实体类 -->\n        <targetJavaProject>${basedir}/src/main/java</targetJavaProject>\n        <targetMapperPackage>com.paascloud.provider.mapper</targetMapperPackage>\n        <targetModelPackage>com.paascloud.provider.model.domain</targetModelPackage>\n        <!-- XML生成路径 -->\n        <targetResourcesProject>${basedir}/src/main/resources</targetResourcesProject>\n        <targetXMLPackage>mapper</targetXMLPackage>\n    </properties>\n\n</project>\n"
  },
  {
    "path": "paascloud-generator/paascloud-generator-uac/src/main/java/com/paascloud/provider/main/PaginationPlugin.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：PaginationPlugin.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.main;\n\nimport org.mybatis.generator.api.PluginAdapter;\nimport org.mybatis.generator.api.ShellRunner;\n\nimport java.util.List;\n\n/**\n * The class Pagination plugin.\n *\n * @author paascloud.net@gmail.com\n */\npublic class PaginationPlugin extends PluginAdapter {\n\n\t/**\n\t * Validate boolean.\n\t *\n\t * @param warnings the warnings\n\t *\n\t * @return the boolean\n\t */\n\t@Override\n\tpublic boolean validate(List<String> warnings) {\n\t\treturn true;\n\t}\n\n\tprivate static void generate() {\n\t\tString config = PaginationPlugin.class.getClassLoader().getResource(\"generator/generatorConfig-B.xml\").getFile();\n\t\tString[] arg = {\"-configfile\", config, \"-overwrite\"};\n\t\tShellRunner.main(arg);\n\t}\n\n\t/**\n\t * The entry point of application.\n\t *\n\t * @param args the input arguments\n\t */\n\tpublic static void main(String[] args) {\n\t\tgenerate();\n\t}\n}"
  },
  {
    "path": "paascloud-generator/paascloud-generator-uac/src/main/resources/config.properties",
    "content": "# \\u6570\\u636E\\u5E93\\u914D\\u7F6E\njdbc.driverClass = com.mysql.jdbc.Driver\njdbc.url=jdbc:mysql://paascloud-db-mysql:3306/paascloud_uac?useUnicode=true&characterEncoding=UTF-8\njdbc.user=root\njdbc.password=123456\n\n#c3p0\njdbc.maxPoolSize=50\njdbc.minPoolSize=10\njdbc.maxStatements=100\njdbc.testConnection=true\n\n# \\u901A\\u7528Mapper\\u914D\\u7F6E\nmapper.plugin = tk.mybatis.mapper.generator.MapperPlugin\nmapper.Mapper = tk.mybatis.mapper.common.Mapper"
  },
  {
    "path": "paascloud-generator/paascloud-generator-uac/src/main/resources/generator/generatorConfig-A.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE generatorConfiguration\n        PUBLIC \"-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN\"\n        \"http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd\">\n\n<generatorConfiguration>\n    <properties resource=\"config.properties\"/>\n\n    <context id=\"Mysql\" targetRuntime=\"MyBatis3Simple\"\n             defaultModelType=\"flat\">\n        <property name=\"beginningDelimiter\" value=\"`\"/>\n        <property name=\"endingDelimiter\" value=\"`\"/>\n\n        <plugin type=\"${mapper.plugin}\">\n            <property name=\"mappers\" value=\"${mapper.Mapper}\"/>\n        </plugin>\n\n        <jdbcConnection driverClass=\"${jdbc.driverClass}\"\n                        connectionURL=\"${jdbc.url}\" userId=\"${jdbc.user}\" password=\"${jdbc.password}\">\n        </jdbcConnection>\n\n        <javaModelGenerator targetPackage=\"${targetModelPackage}\"\n                            targetProject=\"${targetJavaProject}\"/>\n\n        <sqlMapGenerator targetPackage=\"${targetXMLPackage}\"\n                         targetProject=\"${targetResourcesProject}\"/>\n\n        <javaClientGenerator targetPackage=\"${targetMapperPackage}\"\n                             targetProject=\"${targetJavaProject}\" type=\"XMLMAPPER\"/>\n\n        <!-- 设置要生成代码的表 -->\n        <!--<table tableName=\"tbl_rmc_warehouse_area\" domainObjectName=\"RmcWarehouseArea\">-->\n            <!--<generatedKey column=\"id\" sqlStatement=\"Mysql\" identity=\"true\"/>-->\n        <!--</table>-->\n        <!--<table tableName=\"tbl_rmc_device_detail\" domainObjectName=\"RmcDeviceDetail\">-->\n            <!--<generatedKey column=\"id\" sqlStatement=\"Mysql\" identity=\"true\"/>-->\n        <!--</table>-->\n\n\n        <table tableName=\"pc_uac_user_token\" domainObjectName=\"UacUserToken\">\n            <generatedKey column=\"id\" sqlStatement=\"Mysql\" identity=\"true\"/>\n        </table>\n\n      <table tableName=\"pc_mq_message_data\" domainObjectName=\"MqMessageData\">\n        <generatedKey column=\"id\" sqlStatement=\"Mysql\" identity=\"true\"/>\n      </table>\n\n        </context>\n    </generatorConfiguration>"
  },
  {
    "path": "paascloud-generator/paascloud-generator-uac/src/main/resources/generator/generatorConfig-B.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n    <!DOCTYPE generatorConfiguration\n      PUBLIC \"-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN\"\n      \"http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd\">\n    <generatorConfiguration>\n    <properties resource=\"config.properties\"/>\n    <!-- 数据库驱动 -->\n        <context id=\"DB2Tables\"  targetRuntime=\"MyBatis3\">\n            <commentGenerator>\n                <property name=\"suppressDate\" value=\"true\"/>\n                <!-- 是否去除自动生成的注释 true：是 ： false:否 -->\n                <property name=\"suppressAllComments\" value=\"false\"/>\n            </commentGenerator>\n            <!-- 数据库链接URL, 用户名、密码 -->\n            <jdbcConnection driverClass=\"${jdbc.driverClass}\" connectionURL=\"${jdbc.url}\" userId=\"${jdbc.user}\" password=\"${jdbc.password}\">\n            </jdbcConnection>\n            <javaTypeResolver>\n                <property name=\"forceBigDecimals\" value=\"false\"/>\n            </javaTypeResolver>\n            <!-- 生成模型的包名和位置 -->\n            <javaModelGenerator targetPackage=\"com.paascloud.provider.model.domain\" targetProject=\"D:\\git\\liuzm-git\\paascloud-git\\paascloud-master\\paascloud-generator\\paascloud-generator-uac\\src\\main\\java\">\n                <property name=\"enableSubPackages\" value=\"true\"/>\n                <property name=\"trimStrings\" value=\"true\"/>\n            </javaModelGenerator>\n            <!-- 生成映射文件的包名和位置 -->\n            <sqlMapGenerator targetPackage=\"mapper\" targetProject=\"D:\\git\\liuzm-git\\paascloud-git\\paascloud-master\\paascloud-generator\\paascloud-generator-uac\\src\\main\\resources\">\n                <property name=\"enableSubPackages\" value=\"true\"/>\n            </sqlMapGenerator>\n            <!-- 生成DAO的包名和位置 -->\n            <javaClientGenerator type=\"XMLMAPPER\" targetPackage=\"com.paascloud.provider.mapper\" targetProject=\"D:\\git\\liuzm-git\\paascloud-git\\paascloud-master\\paascloud-generator\\paascloud-generator-uac\\src\\main\\java\">\n                <property name=\"enableSubPackages\" value=\"true\"/>\n            </javaClientGenerator>\n            <!-- 要生成哪些表 -->\n            <!--\n            <table tableName=\"pc_uac_action\" domainObjectName=\"UacAction\"  enableCountByExample=\"false\" enableUpdateByExample=\"false\" enableDeleteByExample=\"false\" enableSelectByExample=\"false\" selectByExampleQueryId=\"false\"></table>\n            <table tableName=\"pc_uac_group\" domainObjectName=\"UacGroup\"  enableCountByExample=\"false\" enableUpdateByExample=\"false\" enableDeleteByExample=\"false\" enableSelectByExample=\"false\" selectByExampleQueryId=\"false\"></table>\n            <table tableName=\"pc_uac_log\" domainObjectName=\"UacLog\"  enableCountByExample=\"false\" enableUpdateByExample=\"false\" enableDeleteByExample=\"false\" enableSelectByExample=\"false\" selectByExampleQueryId=\"false\"></table>\n            <table tableName=\"pc_uac_role\" domainObjectName=\"UacRole\"  enableCountByExample=\"false\" enableUpdateByExample=\"false\" enableDeleteByExample=\"false\" enableSelectByExample=\"false\" selectByExampleQueryId=\"false\"></table>\n            -->\n            <!--<table tableName=\"pc_uac_user_token\" domainObjectName=\"UacUserToken\"  enableCountByExample=\"false\" enableUpdateByExample=\"false\" enableDeleteByExample=\"false\" enableSelectByExample=\"false\" selectByExampleQueryId=\"false\"></table>-->\n            <table tableName=\"pc_mq_message_data\" domainObjectName=\"MqMessageData\"  enableCountByExample=\"false\" enableUpdateByExample=\"false\" enableDeleteByExample=\"false\" enableSelectByExample=\"false\" selectByExampleQueryId=\"false\"></table>\n        </context>\n    </generatorConfiguration>"
  },
  {
    "path": "paascloud-generator/pom.xml",
    "content": "<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n         xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n    <parent>\n        <groupId>com.liuzm.paascloud</groupId>\n        <artifactId>paascloud-master</artifactId>\n        <version>1.0</version>\n    </parent>\n\n    <modelVersion>4.0.0</modelVersion>\n\n    <artifactId>paascloud-generator</artifactId>\n    <version>1.0</version>\n    <modules>\n        <module>paascloud-generator-uac</module>\n        <module>paascloud-generator-mdc</module>\n        <module>paascloud-generator-omc</module>\n        <module>paascloud-generator-opc</module>\n\t\t    <module>paascloud-generator-tpc</module>\n    </modules>\n    <packaging>pom</packaging>\n\n    <name>paascloud-generator</name>\n    <url>http://maven.apache.org</url>\n\n    <properties>\n        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>\n        <spring.version>4.1.6.RELEASE</spring.version>\n        <!-- MyBatis Generator -->\n        <!-- Java接口和实体类 -->\n        <targetJavaProject>${basedir}/src/main/java</targetJavaProject>\n        <targetMapperPackage>com.paascloud.uac.mapper</targetMapperPackage>\n        <targetModelPackage>com.paascloud.uac.domain</targetModelPackage>\n        <!-- XML生成路径 -->\n        <targetResourcesProject>${basedir}/src/main/resources</targetResourcesProject>\n        <targetXMLPackage>mapper</targetXMLPackage>\n    </properties>\n\n    <dependencies>\n        <dependency>\n            <groupId>commons-fileupload</groupId>\n            <artifactId>commons-fileupload</artifactId>\n            <version>1.3.1</version>\n        </dependency>\n        <dependency>\n            <groupId>mysql</groupId>\n            <artifactId>mysql-connector-java</artifactId>\n            <version>5.1.39</version>\n        </dependency>\n        <dependency>\n            <groupId>commons-dbcp</groupId>\n            <artifactId>commons-dbcp</artifactId>\n            <version>1.4</version>\n        </dependency>\n        <dependency>\n            <groupId>org.mybatis</groupId>\n            <artifactId>mybatis</artifactId>\n            <version>3.2.8</version>\n        </dependency>\n        <dependency>\n            <groupId>org.mybatis</groupId>\n            <artifactId>mybatis-spring</artifactId>\n            <version>1.2.2</version>\n        </dependency>\n        <dependency>\n            <groupId>com.alibaba</groupId>\n            <artifactId>druid</artifactId>\n            <version>1.0.18</version>\n        </dependency>\n        <dependency>\n            <groupId>com.github.pagehelper</groupId>\n            <artifactId>pagehelper</artifactId>\n            <version>4.1.6</version>\n        </dependency>\n\n        <dependency>\n            <groupId>tk.mybatis</groupId>\n            <artifactId>mapper</artifactId>\n            <version>3.3.9</version>\n        </dependency>\n        <dependency>\n            <groupId>com.liuzm.mybatis</groupId>\n            <artifactId>mybatis-generator</artifactId>\n            <version>1.0</version>\n        </dependency>\n    </dependencies>\n\n    <build>\n        <plugins>\n            <plugin>\n                <groupId>org.mybatis.generator</groupId>\n                <artifactId>mybatis-generator-maven-plugin</artifactId>\n                <version>1.3.2</version>\n                <configuration>\n                    <configurationFile>${basedir}/src/main/resources/generator/generatorConfig-A.xml</configurationFile>\n                    <overwrite>true</overwrite>\n                    <verbose>true</verbose>\n                </configuration>\n                <dependencies>\n                    <dependency>\n                        <groupId>mysql</groupId>\n                        <artifactId>mysql-connector-java</artifactId>\n                        <version>5.1.39</version>\n                    </dependency>\n                    <dependency>\n                        <groupId>tk.mybatis</groupId>\n                        <artifactId>mapper</artifactId>\n                        <version>3.3.9</version>\n                    </dependency>\n                </dependencies>\n            </plugin>\n        </plugins>\n    </build>\n</project>\n"
  },
  {
    "path": "paascloud-monitor/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n         xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n  <modelVersion>4.0.0</modelVersion>\n\n  <groupId>com.liuzm.paascloud.monitor</groupId>\n  <artifactId>paascloud-monitor</artifactId>\n  <packaging>jar</packaging>\n  <version>1.0</version>\n\n  <name>paascloud-monitor</name>\n  <description>Demo project for Spring Boot</description>\n  <parent>\n    <groupId>com.liuzm.paascloud</groupId>\n    <artifactId>paascloud-master</artifactId>\n    <version>1.0</version>\n  </parent>\n\n  <properties>\n    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>\n    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>\n    <java.version>1.8</java.version>\n  </properties>\n\n  <dependencies>\n    <dependency>\n      <groupId>org.springframework.cloud</groupId>\n      <artifactId>spring-cloud-starter-config</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.springframework.cloud</groupId>\n      <artifactId>spring-cloud-starter-hystrix</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.springframework.cloud</groupId>\n      <artifactId>spring-cloud-starter-hystrix-dashboard</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>de.codecentric</groupId>\n      <artifactId>spring-boot-admin-server</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>de.codecentric</groupId>\n      <artifactId>spring-boot-admin-server-ui</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.springframework.boot</groupId>\n      <artifactId>spring-boot-starter-mail</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.springframework.boot</groupId>\n      <artifactId>spring-boot-starter-actuator</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>de.codecentric</groupId>\n      <artifactId>spring-boot-admin-server-ui-hystrix</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>de.codecentric</groupId>\n      <artifactId>spring-boot-admin-server-ui-turbine</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.jolokia</groupId>\n      <artifactId>jolokia-core</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>com.hazelcast</groupId>\n      <artifactId>hazelcast</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.springframework.boot</groupId>\n      <artifactId>spring-boot-starter-security</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>de.codecentric</groupId>\n      <artifactId>spring-boot-admin-server-ui-login</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>de.codecentric</groupId>\n      <artifactId>spring-boot-admin-starter-client</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.springframework.cloud</groupId>\n      <artifactId>spring-cloud-netflix-turbine</artifactId>\n    </dependency>\n    <!-- <dependency>\n         <groupId>org.springframework.cloud</groupId>\n         <artifactId>spring-cloud-starter-turbine-amqp</artifactId>\n     </dependency>\n   <dependency>\n     <groupId>org.springframework.cloud</groupId>\n     <artifactId>spring-cloud-starter-stream-rabbit</artifactId>\n   </dependency>\n   <dependency>\n     <groupId>org.springframework.cloud</groupId>\n     <artifactId>spring-cloud-netflix-turbine-stream</artifactId>\n   </dependency>-->\n  </dependencies>\n\n  <build>\n    <finalName>${project.artifactId}</finalName>\n    <plugins>\n      <plugin>\n        <groupId>org.springframework.boot</groupId>\n        <artifactId>spring-boot-maven-plugin</artifactId>\n        <executions>\n          <execution>\n            <goals>\n              <goal>repackage</goal>\n              <goal>build-info</goal>\n            </goals>\n          </execution>\n        </executions>\n      </plugin>\n      <!-- 添加docker-maven插件 -->\n      <plugin>\n        <groupId>com.spotify</groupId>\n        <artifactId>docker-maven-plugin</artifactId>\n        <version>0.4.13</version>\n        <configuration>\n          <imageName>${project.artifactId}:${project.version}</imageName>\n          <baseImage>java</baseImage>\n          <entryPoint>[\"java\", \"-jar\", \"/${project.build.finalName}.jar\"]</entryPoint>\n          <resources>\n            <resource>\n              <targetPath>/</targetPath>\n              <directory>${project.build.directory}</directory>\n              <include>${project.build.finalName}.jar</include>\n            </resource>\n          </resources>\n        </configuration>\n      </plugin>\n    </plugins>\n  </build>\n\n  <profiles>\n    <profile>\n      <id>dev</id>\n      <properties>\n        <profileActive>dev</profileActive>\n      </properties>\n      <activation>\n        <activeByDefault>true</activeByDefault>\n      </activation>\n    </profile>\n    <profile>\n      <id>pro</id>\n      <properties>\n        <profileActive>pro</profileActive>\n      </properties>\n    </profile>\n  </profiles>\n\n\n</project>\n"
  },
  {
    "path": "paascloud-monitor/src/main/java/com/paascloud/discovery/PaasCloudMonitorApplication.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：PaginationPlugin.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.discovery;\n\nimport com.hazelcast.config.Config;\nimport com.hazelcast.config.EvictionPolicy;\nimport com.hazelcast.config.ListConfig;\nimport com.hazelcast.config.MapConfig;\nimport de.codecentric.boot.admin.config.EnableAdminServer;\nimport org.springframework.boot.SpringApplication;\nimport org.springframework.boot.autoconfigure.SpringBootApplication;\nimport org.springframework.cloud.client.circuitbreaker.EnableCircuitBreaker;\nimport org.springframework.cloud.client.discovery.EnableDiscoveryClient;\nimport org.springframework.cloud.netflix.hystrix.dashboard.EnableHystrixDashboard;\nimport org.springframework.cloud.netflix.turbine.EnableTurbine;\nimport org.springframework.context.annotation.Bean;\n\n/**\n * The class Paas cloud monitor application.\n *\n * @author paascloud.net@gmail.com\n */\n@SpringBootApplication\n@EnableDiscoveryClient\n@EnableTurbine\n@EnableHystrixDashboard\n@EnableCircuitBreaker\n@EnableAdminServer\npublic class PaasCloudMonitorApplication {\n\n\t/**\n\t * Hazelcast config config.\n\t *\n\t * @return the config\n\t */\n\t@Bean\n\tpublic Config hazelcastConfig() {\n\t\treturn new Config().setProperty(\"hazelcast.jmx\", \"true\")\n\t\t\t\t.addMapConfig(new MapConfig(\"spring-boot-admin-application-store\").setBackupCount(1)\n\t\t\t\t\t\t.setEvictionPolicy(EvictionPolicy.NONE))\n\t\t\t\t.addListConfig(new ListConfig(\"spring-boot-admin-event-store\").setBackupCount(1)\n\t\t\t\t\t\t.setMaxSize(1000));\n\t}\n\n\t/**\n\t * The entry point of application.\n\t *\n\t * @param args the input arguments\n\t */\n\tpublic static void main(String[] args) {\n\t\tSpringApplication.run(PaasCloudMonitorApplication.class, args);\n\t}\n}\n"
  },
  {
    "path": "paascloud-monitor/src/main/java/com/paascloud/discovery/SecurityConfig.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：PaginationPlugin.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.discovery;\n\nimport org.springframework.context.annotation.Configuration;\nimport org.springframework.security.config.annotation.web.builders.HttpSecurity;\nimport org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;\n\n/**\n * The class Security config.\n *\n * @author paascloud.net @gmail.com\n */\n@Configuration\npublic class SecurityConfig extends WebSecurityConfigurerAdapter {\n\t/**\n\t * Configure.\n\t *\n\t * @param http the http\n\t *\n\t * @throws Exception the exception\n\t */\n\t@Override\n\tprotected void configure(HttpSecurity http) throws Exception {\n\t\thttp.headers().frameOptions().disable()\n\t\t\t\t.and()\n\t\t\t\t.formLogin()\n\t\t\t\t.loginPage(\"/login.html\")\n\t\t\t\t.loginProcessingUrl(\"/login\")\n\t\t\t\t.and()\n\t\t\t\t.logout().logoutUrl(\"/logout\")\n\t\t\t\t.and()\n\t\t\t\t.csrf().disable()\n\t\t\t\t.authorizeRequests()\n\t\t\t\t.antMatchers(\"/api/**\", \"/applications/**\", \"/api/applications/**\", \"/login.html\", \"/**/*.css\", \"/img/**\", \"/third-party/**\")\n\t\t\t\t.permitAll()\n\t\t\t\t.anyRequest().authenticated();\n\t}\n}"
  },
  {
    "path": "paascloud-monitor/src/main/resources/application.yml",
    "content": "server:\n  port: 8010\n\nspring:\n  profiles:\n    active: dev\n  application:\n    name: @pom.artifactId@"
  },
  {
    "path": "paascloud-monitor/src/main/resources/banner.txt",
    "content": "${AnsiColor.BRIGHT_CYAN}\n                                  .__                   .___                  __\n___________  _____    ______ ____ |  |   ____  __ __  __| _/     ____   _____/  |_\n\\____ \\__  \\ \\__  \\  /  ___// ___\\|  |  /  _ \\|  |  \\/ __ |     /    \\_/ __ \\   __\\\n|  |_> > __ \\_/ __ \\_\\___ \\\\  \\___|  |_(  <_> )  |  / /_/ |    |   |  \\  ___/|  |\n|   __(____  (____  /____  >\\___  >____/\\____/|____/\\____ | /\\ |___|  /\\___  >__|\n|__|       \\/     \\/     \\/     \\/ Powered by liuzhaoming\\/ \\/      \\/     \\/"
  },
  {
    "path": "paascloud-monitor/src/main/resources/bootstrap.yml",
    "content": "spring:\n  cloud:\n    config:\n      fail-fast: true\n      discovery:\n        service-id: paascloud-discovery\n        enabled: true\n      label: ${spring.profiles.active}\n      profile: ${spring.profiles.active}\n      username: admin\n      password: admin\n\neureka:\n  client:\n    serviceUrl:\n      defaultZone: http://root:root@paascloud-eureka:8761/eureka/\n  instance:\n    instance-id: ${spring.application.name}:${spring.cloud.client.ipAddress}:${server.port}\n#management:\n#  context-path: /"
  },
  {
    "path": "paascloud-monitor/src/main/resources/logback-spring.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<configuration>\n\n  <!-- 此xml在spring-boot-1.5.3.RELEASE.jar里 -->\n  <include resource=\"org/springframework/boot/logging/logback/defaults.xml\" />\n  <include resource=\"org/springframework/boot/logging/logback/console-appender.xml\" />\n  <!-- 开启后可以通过jmx动态控制日志级别(springboot Admin的功能) -->\n  <!--<jmxConfigurator/>-->\n\n  <appender name=\"FILE\" class=\"ch.qos.logback.core.rolling.RollingFileAppender\">\n    <File>${LOG_PATH}${LOG_FILE}</File>\n    <encoder>\n      <pattern>%date [%level] [%thread] %logger{60} [%file : %line] %msg%n</pattern>\n    </encoder>\n    <rollingPolicy class=\"ch.qos.logback.core.rolling.TimeBasedRollingPolicy\">\n      <!-- 添加.gz 历史日志会启用压缩 大大缩小日志文件所占空间 -->\n      <fileNamePattern>${LOG_PATH}daily/${LOG_FILE}.%d{yyyy-MM-dd}.gz</fileNamePattern>\n      <maxHistory>30</maxHistory><!--  保留30天日志 -->\n    </rollingPolicy>\n  </appender>\n\n  <!--<logger name=\"org.springframework\" level=\"error\"/>-->\n  <!--<logger name=\"jdbc.connection\" level=\"OFF\"/>-->\n  <!--<logger name=\"org.apache\" level=\"error\"/>-->\n  <!--<logger name=\"com.alibaba\" level=\"error\"/>-->\n  <!--<logger name=\"org.apache.kafka.clients.producer.ProducerConfig\" level=\"warn\"/>-->\n\n  <root level=\"INFO\">\n    <appender-ref ref=\"CONSOLE\"/>\n    <appender-ref ref=\"FILE\"/>\n  </root>\n</configuration>"
  },
  {
    "path": "paascloud-provider/paascloud-provider-mdc/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n         xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n  <modelVersion>4.0.0</modelVersion>\n\n  <parent>\n    <groupId>com.liuzm.paascloud.provider</groupId>\n    <artifactId>paascloud-provider</artifactId>\n    <version>1.0</version>\n  </parent>\n\n  <artifactId>paascloud-provider-mdc</artifactId>\n  <packaging>jar</packaging>\n\n  <name>paascloud-provider-mdc</name>\n  <description>数据中心 - Master data center</description>\n\n  <properties>\n    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>\n    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>\n    <java.version>1.8</java.version>\n  </properties>\n\n  <dependencies>\n    <dependency>\n      <groupId>org.apache.rocketmq</groupId>\n      <artifactId>rocketmq-client</artifactId>\n      <version>4.1.0-incubating</version>\n    </dependency>\n    <dependency>\n      <groupId>com.liuzm.paascloud.provider.api</groupId>\n      <artifactId>paascloud-provider-mdc-api</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>mysql</groupId>\n      <artifactId>mysql-connector-java</artifactId>\n      <scope>runtime</scope>\n    </dependency>\n    <dependency>\n      <groupId>joda-time</groupId>\n      <artifactId>joda-time</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.mybatis.spring.boot</groupId>\n      <artifactId>mybatis-spring-boot-starter</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>tk.mybatis</groupId>\n      <artifactId>mapper-spring-boot-starter</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>com.github.pagehelper</groupId>\n      <artifactId>pagehelper-spring-boot-starter</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.springframework.boot</groupId>\n      <artifactId>spring-boot-starter-jdbc</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>com.alibaba</groupId>\n      <artifactId>druid-spring-boot-starter</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>de.codecentric</groupId>\n      <artifactId>spring-boot-admin-starter-client</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>com.liuzm.paascloud.provider.api</groupId>\n      <artifactId>paascloud-provider-sdk-api</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>com.liuzm.paascloud.provider.api</groupId>\n      <artifactId>paascloud-provider-opc-api</artifactId>\n    </dependency>\n  </dependencies>\n</project>\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-mdc/src/main/java/com/paascloud/PaasCloudMdcApplication.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：PaasCloudMdcApplication.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud;\n\nimport liquibase.integration.spring.SpringLiquibase;\nimport org.springframework.boot.SpringApplication;\nimport org.springframework.boot.autoconfigure.SpringBootApplication;\nimport org.springframework.cache.annotation.EnableCaching;\nimport org.springframework.cloud.client.discovery.EnableDiscoveryClient;\nimport org.springframework.cloud.netflix.feign.EnableFeignClients;\nimport org.springframework.cloud.netflix.hystrix.EnableHystrix;\nimport org.springframework.context.annotation.Bean;\nimport org.springframework.transaction.annotation.EnableTransactionManagement;\n\nimport javax.sql.DataSource;\n\n/**\n * The class Paas cloud mdc application.\n *\n * @author paascloud.net@gmail.com\n */\n@EnableCaching\n@EnableHystrix\n@EnableFeignClients\n@EnableDiscoveryClient\n@SpringBootApplication\n@EnableTransactionManagement\npublic class PaasCloudMdcApplication {\n\n\t/**\n\t * The entry point of application.\n\t *\n\t * @param args the input arguments\n\t */\n\tpublic static void main(String[] args) {\n\t\tSpringApplication.run(PaasCloudMdcApplication.class, args);\n\t}\n\n\t@Bean\n\tpublic SpringLiquibase springLiquibase(DataSource dataSource) {\n\n\t\tSpringLiquibase springLiquibase = new SpringLiquibase();\n\n\t\tspringLiquibase.setDataSource(dataSource);\n\t\tspringLiquibase.setChangeLog(\"classpath:/liquibase/index.xml\");\n\n\t\treturn springLiquibase;\n\t}\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-mdc/src/main/java/com/paascloud/provider/config/MdcWebMvcConfig.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：MdcWebMvcConfig.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.config;\n\nimport com.paascloud.core.config.PcObjectMapper;\nimport com.paascloud.core.config.SwaggerConfiguration;\nimport com.paascloud.core.interceptor.TokenInterceptor;\nimport org.springframework.context.annotation.Configuration;\nimport org.springframework.context.annotation.Import;\nimport org.springframework.http.converter.HttpMessageConverter;\nimport org.springframework.web.servlet.config.annotation.EnableWebMvc;\nimport org.springframework.web.servlet.config.annotation.InterceptorRegistry;\nimport org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;\nimport org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;\n\nimport javax.annotation.Resource;\nimport java.util.List;\n\n\n/**\n * The class Mdc web mvc config.\n *\n * @author paascloud.net @gmail.com\n */\n@Configuration\n@EnableWebMvc\n@Import(SwaggerConfiguration.class)\npublic class MdcWebMvcConfig extends WebMvcConfigurerAdapter {\n\n\t@Resource\n\tprivate TokenInterceptor vueViewInterceptor;\n\n\t@Override\n\tpublic void addResourceHandlers(ResourceHandlerRegistry registry) {\n\t\tregistry.addResourceHandler(\"/**\")\n\t\t\t\t.addResourceLocations(\"classpath:/META-INF/resources/\", \"classpath:/resources/\", \"classpath:/static/\");\n\t}\n\n\t/**\n\t * Add interceptors.\n\t *\n\t * @param registry the registry\n\t */\n\t@Override\n\tpublic void addInterceptors(InterceptorRegistry registry) {\n\t\tsuper.addInterceptors(registry);\n\t\tregistry.addInterceptor(vueViewInterceptor)\n\t\t\t\t.addPathPatterns(\"/**\")\n\t\t\t\t.excludePathPatterns(\"/swagger-resources/**\", \"*.js\", \"/**/*.js\", \"*.css\", \"/**/*.css\", \"*.html\", \"/**/*.html\");\n\t}\n\n\t@Override\n\tpublic void configureMessageConverters(List<HttpMessageConverter<?>> converters) {\n\t\tPcObjectMapper.buidMvcMessageConverter(converters);\n\t}\n\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-mdc/src/main/java/com/paascloud/provider/config/ResourceServerConfig.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：ResourceServerConfig.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.config;\n\nimport org.springframework.context.annotation.Configuration;\nimport org.springframework.security.config.annotation.web.builders.HttpSecurity;\nimport org.springframework.security.oauth2.config.annotation.web.configuration.EnableResourceServer;\nimport org.springframework.security.oauth2.config.annotation.web.configuration.ResourceServerConfigurerAdapter;\n\nimport javax.servlet.http.HttpServletResponse;\n\n/**\n * The class Resource server config.\n *\n * @author paascloud.net @gmail.com\n */\n@Configuration\n@EnableResourceServer\npublic class ResourceServerConfig extends ResourceServerConfigurerAdapter {\n\t@Override\n\tpublic void configure(HttpSecurity http) throws Exception {\n\t\thttp\n\t\t\t\t.headers().frameOptions().disable()\n\t\t\t\t.and()\n\t\t\t\t.csrf().disable()\n\t\t\t\t.exceptionHandling()\n\t\t\t\t.authenticationEntryPoint((request, response, authException) -> response.sendError(HttpServletResponse.SC_UNAUTHORIZED))\n\t\t\t\t.and()\n\t\t\t\t.authorizeRequests().antMatchers(\"/druid/**\", \"/pay/alipayCallback\", \"/swagger-ui.html\", \"/swagger-resources/**\", \"/v2/api-docs\", \"/api/applications\").permitAll()\n\t\t\t\t.anyRequest().authenticated();\n\t}\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-mdc/src/main/java/com/paascloud/provider/manager/MdcProductManager.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：MdcProductManager.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.manager;\n\nimport com.paascloud.base.enums.ErrorCodeEnum;\nimport com.paascloud.provider.annotation.MqProducerStore;\nimport com.paascloud.provider.exceptions.MdcBizException;\nimport com.paascloud.provider.mapper.MdcProductMapper;\nimport com.paascloud.provider.model.domain.MdcProduct;\nimport com.paascloud.provider.model.domain.MqMessageData;\nimport lombok.extern.slf4j.Slf4j;\nimport org.springframework.stereotype.Component;\nimport org.springframework.transaction.annotation.Transactional;\n\nimport javax.annotation.Resource;\n\n/**\n * The class User manager.\n *\n * @author paascloud.net @gmail.com\n */\n@Slf4j\n@Component\n@Transactional(rollbackFor = Exception.class)\npublic class MdcProductManager {\n\t@Resource\n\tprivate MdcProductMapper mdcProductMapper;\n\n\t/**\n\t * Save product.\n\t *\n\t * @param mqMessageData the mq message data\n\t * @param product       the product\n\t * @param addFlag       the add flag\n\t */\n\t@MqProducerStore\n\tpublic void saveProduct(final MqMessageData mqMessageData, final MdcProduct product, boolean addFlag) {\n\t\tlog.info(\"保存商品信息. mqMessageData={}, product={}\", mqMessageData, product);\n\t\tif (addFlag) {\n\t\t\tmdcProductMapper.insertSelective(product);\n\t\t} else {\n\t\t\tint result = mdcProductMapper.updateByPrimaryKeySelective(product);\n\t\t\tif (result < 1) {\n\t\t\t\tthrow new MdcBizException(ErrorCodeEnum.MDC10021022, product.getId());\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Delete product.\n\t *\n\t * @param mqMessageData the mq message data\n\t * @param productId     the product id\n\t */\n\t@MqProducerStore\n\tpublic void deleteProduct(final MqMessageData mqMessageData, final Long productId) {\n\t\tlog.info(\"删除商品信息. mqMessageData={}, productId={}\", mqMessageData, productId);\n\t\tint result = mdcProductMapper.deleteByPrimaryKey(productId);\n\t\tif (result < 1) {\n\t\t\tthrow new MdcBizException(ErrorCodeEnum.MDC10021023, productId);\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-mdc/src/main/java/com/paascloud/provider/mapper/MdcAddressMapper.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：MdcAddressMapper.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.mapper;\n\nimport com.paascloud.core.mybatis.MyMapper;\nimport com.paascloud.provider.model.domain.MdcAddress;\nimport org.apache.ibatis.annotations.Mapper;\nimport org.springframework.stereotype.Component;\n\nimport java.util.List;\n\n/**\n * The interface Mdc address mapper.\n *\n * @author paascloud.net@gmail.com\n */\n@Mapper\n@Component\npublic interface MdcAddressMapper extends MyMapper<MdcAddress> {\n\t/**\n\t * Select mdc address list.\n\t *\n\t * @param address the address\n\t *\n\t * @return the list\n\t */\n\tList<MdcAddress> selectMdcAddress(MdcAddress address);\n\n\t/**\n\t * Select address by pid list.\n\t *\n\t * @param pid the pid\n\t *\n\t * @return the list\n\t */\n\tList<MdcAddress> selectAddressByPid(Long pid);\n\n}"
  },
  {
    "path": "paascloud-provider/paascloud-provider-mdc/src/main/java/com/paascloud/provider/mapper/MdcDictMapper.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：MdcDictMapper.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.mapper;\n\nimport com.paascloud.core.mybatis.MyMapper;\nimport com.paascloud.provider.model.domain.MdcDict;\nimport com.paascloud.provider.model.vo.MdcDictVo;\nimport org.apache.ibatis.annotations.Mapper;\nimport org.springframework.stereotype.Component;\n\nimport java.util.List;\n\n/**\n * The interface Mdc dict mapper.\n *\n * @author paascloud.net @gmail.com\n */\n@Mapper\n@Component\npublic interface MdcDictMapper extends MyMapper<MdcDict> {\n\t/**\n\t * List dict vo list.\n\t *\n\t * @return the list\n\t */\n\tList<MdcDictVo> listDictVo();\n}"
  },
  {
    "path": "paascloud-provider/paascloud-provider-mdc/src/main/java/com/paascloud/provider/mapper/MdcExceptionLogMapper.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：MdcExceptionLogMapper.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.mapper;\n\nimport com.paascloud.core.mybatis.MyMapper;\nimport com.paascloud.provider.model.domain.MdcExceptionLog;\nimport com.paascloud.provider.model.dto.MdcExceptionQueryDto;\nimport org.apache.ibatis.annotations.Mapper;\nimport org.springframework.stereotype.Component;\n\nimport java.util.List;\n\n/**\n * The interface Mdc exception log mapper.\n *\n * @author paascloud.net @gmail.com\n */\n@Mapper\n@Component\npublic interface MdcExceptionLogMapper extends MyMapper<MdcExceptionLog> {\n\t/**\n\t * Query exception list with page list.\n\t *\n\t * @param mdcExceptionQueryDto the mdc exception query dto\n\t *\n\t * @return the list\n\t */\n\tList<MdcExceptionLog> queryExceptionListWithPage(MdcExceptionQueryDto mdcExceptionQueryDto);\n}"
  },
  {
    "path": "paascloud-provider/paascloud-provider-mdc/src/main/java/com/paascloud/provider/mapper/MdcProductCategoryMapper.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：MdcProductCategoryMapper.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.mapper;\n\nimport com.paascloud.core.mybatis.MyMapper;\nimport com.paascloud.provider.model.domain.MdcProductCategory;\nimport com.paascloud.provider.model.dto.ProductCategoryDto;\nimport com.paascloud.provider.model.vo.MdcCategoryVo;\nimport org.apache.ibatis.annotations.Mapper;\nimport org.springframework.stereotype.Component;\n\nimport java.util.List;\n\n/**\n * The interface Mdc product category mapper.\n *\n * @author paascloud.net @gmail.com\n */\n@Mapper\n@Component\npublic interface MdcProductCategoryMapper extends MyMapper<MdcProductCategory> {\n\t/**\n\t * Select category dto list list.\n\t *\n\t * @param categoryPid the category pid\n\t *\n\t * @return the list\n\t */\n\tList<ProductCategoryDto> selectCategoryDtoList(Long categoryPid);\n\n\t/**\n\t * List category vo list.\n\t *\n\t * @return the list\n\t */\n\tList<MdcCategoryVo> listCategoryVo();\n}"
  },
  {
    "path": "paascloud-provider/paascloud-provider-mdc/src/main/java/com/paascloud/provider/mapper/MdcProductMapper.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：MdcProductMapper.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.mapper;\n\nimport com.paascloud.core.mybatis.MyMapper;\nimport com.paascloud.provider.model.domain.MdcProduct;\nimport com.paascloud.provider.model.dto.ProductDto;\nimport com.paascloud.provider.model.vo.ProductVo;\nimport org.apache.ibatis.annotations.Mapper;\nimport org.apache.ibatis.annotations.Param;\nimport org.springframework.stereotype.Component;\n\nimport java.util.List;\n\n/**\n * The interface Mdc product mapper.\n *\n * @author paascloud.net @gmail.com\n */\n@Mapper\n@Component\npublic interface MdcProductMapper extends MyMapper<MdcProduct> {\n\t/**\n\t * Select by name and category ids list.\n\t *\n\t * @param productName    the product name\n\t * @param categoryIdList the category id list\n\t * @param orderBy        the order by\n\t *\n\t * @return the list\n\t */\n\tList<MdcProduct> selectByNameAndCategoryIds(@Param(\"productName\") String productName,\n\t                                            @Param(\"categoryIdList\") List<Long> categoryIdList,\n\t                                            @Param(\"orderBy\") String orderBy);\n\n\t/**\n\t * Update product stock by id int.\n\t *\n\t * @param productDto the product dto\n\t *\n\t * @return the int\n\t */\n\tint updateProductStockById(ProductDto productDto);\n\n\t/**\n\t * Query product list with page list.\n\t *\n\t * @param mdcProduct the mdc product\n\t *\n\t * @return the list\n\t */\n\tList<ProductVo> queryProductListWithPage(MdcProduct mdcProduct);\n}"
  },
  {
    "path": "paascloud-provider/paascloud-provider-mdc/src/main/java/com/paascloud/provider/model/constant/MallConstant.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：MallConstant.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.model.constant;\n\n/**\n * The class Mall constant.\n *\n * @author paascloud.net@gmail.com\n */\npublic class MallConstant {\n\t/**\n\t * The enum Product status enum.\n\t *\n\t * @author paascloud.net@gmail.com\n\t */\n\tpublic enum ProductStatusEnum {\n\t\t/**\n\t\t * On sale product status enum.\n\t\t */\n\t\tON_SALE(1, \"在线\");\n\t\tprivate String value;\n\t\tprivate int code;\n\n\t\tProductStatusEnum(int code, String value) {\n\t\t\tthis.code = code;\n\t\t\tthis.value = value;\n\t\t}\n\n\t\t/**\n\t\t * Gets value.\n\t\t *\n\t\t * @return the value\n\t\t */\n\t\tpublic String getValue() {\n\t\t\treturn value;\n\t\t}\n\n\t\t/**\n\t\t * Gets code.\n\t\t *\n\t\t * @return the code\n\t\t */\n\t\tpublic int getCode() {\n\t\t\treturn code;\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-mdc/src/main/java/com/paascloud/provider/model/domain/MdcAddress.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：MdcAddress.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.model.domain;\n\nimport com.paascloud.core.mybatis.BaseEntity;\nimport lombok.Data;\nimport lombok.EqualsAndHashCode;\n\nimport javax.persistence.*;\n\n/**\n * The class Mdc address.\n *\n * @author paascloud.net @gmail.com\n */\n@EqualsAndHashCode(callSuper = true)\n@Data\n@Table(name = \"pc_mdc_address\")\npublic class MdcAddress extends BaseEntity {\n\tprivate static final long serialVersionUID = -499010884211394846L;\n\n\t/**\n\t * 地址名称\n\t */\n\tprivate String name;\n\n\t/**\n\t * 父ID\n\t */\n\tprivate Long pid;\n\n\t/**\n\t * 城市编码\n\t */\n\t@Column(name = \"city_code\")\n\tprivate String cityCode;\n\n\t/**\n\t * 级别（省市区县）\n\t */\n\tprivate Integer level;\n\n\t/**\n\t * 区域编码\n\t */\n\t@Column(name = \"ad_code\")\n\tprivate String adCode;\n\n\t/**\n\t * 行政区边界坐标点\n\t */\n\tprivate String polyline;\n\n\t/**\n\t * 城市中心点\n\t */\n\tprivate String center;\n}"
  },
  {
    "path": "paascloud-provider/paascloud-provider-mdc/src/main/java/com/paascloud/provider/model/domain/MdcDict.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：MdcDict.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.model.domain;\n\nimport com.paascloud.core.mybatis.BaseEntity;\nimport lombok.Data;\nimport lombok.EqualsAndHashCode;\nimport org.apache.ibatis.type.Alias;\n\nimport javax.persistence.Column;\nimport javax.persistence.Table;\n\n/**\n * 数据字典.\n *\n * @author paascloud.net @gmail.com\n */\n@EqualsAndHashCode(callSuper = true)\n@Data\n@Table(name = \"pc_mdc_dict\")\n@Alias(value = \"mdcDict\")\npublic class MdcDict extends BaseEntity {\n\n\tprivate static final long serialVersionUID = -4257346287088805156L;\n\t/**\n\t * 字典类型 -0 常量 - 1 文件夹\n\t */\n\tprivate Integer type;\n\n\t/**\n\t * 枚举编码\n\t */\n\t@Column(name = \"dict_key\")\n\tprivate String dictKey;\n\n\t/**\n\t * 枚举扩展字段\n\t */\n\t@Column(name = \"extend_key\")\n\tprivate String extendKey;\n\n\t/**\n\t * 枚举值\n\t */\n\t@Column(name = \"dict_value\")\n\tprivate String dictValue;\n\n\t/**\n\t * 字典编码\n\t */\n\t@Column(name = \"dict_code\")\n\tprivate String dictCode;\n\n\t/**\n\t * 字典名称\n\t */\n\t@Column(name = \"dict_name\")\n\tprivate String dictName;\n\n\t/**\n\t * 父ID\n\t */\n\tprivate Long pid;\n\n\t/**\n\t * 序号\n\t */\n\tprivate Integer number;\n\n\t/**\n\t * 状态\n\t */\n\tprivate Integer status;\n\n\t/**\n\t * 备注\n\t */\n\tprivate String remark;\n}"
  },
  {
    "path": "paascloud-provider/paascloud-provider-mdc/src/main/java/com/paascloud/provider/model/domain/MdcExceptionLog.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：MdcExceptionLog.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.model.domain;\n\nimport com.fasterxml.jackson.annotation.JsonFormat;\nimport lombok.Data;\nimport lombok.NoArgsConstructor;\nimport org.apache.ibatis.type.Alias;\nimport org.springframework.format.annotation.DateTimeFormat;\n\nimport javax.persistence.*;\nimport java.util.Date;\n\n/**\n * The class Mdc exception log.\n *\n * @author paascloud.net @gmail.com\n */\n@Alias(\"mdcExceptionLog\")\n@Table(name = \"pc_mdc_exception_log\")\n@Data\n@NoArgsConstructor\npublic class MdcExceptionLog {\n\t@Id\n\t@GeneratedValue(strategy = GenerationType.IDENTITY)\n\tprivate Long id;\n\n\t/**\n\t * 系统应用名\n\t */\n\t@Column(name = \"application_name\")\n\tprivate String applicationName;\n\n\t/**\n\t * 异常类型\n\t */\n\t@Column(name = \"exception_simple_name\")\n\tprivate String exceptionSimpleName;\n\n\t/**\n\t * 异常信息(通过exception.getMessage()获取到的内容)\n\t */\n\t@Column(name = \"exception_message\")\n\tprivate String exceptionMessage;\n\n\t/**\n\t * 异常原因(通过exception.getCause()获取到的内容)\n\t */\n\t@Column(name = \"exception_cause\")\n\tprivate String exceptionCause;\n\n\t/**\n\t * 异常堆栈信息\n\t */\n\t@Column(name = \"exception_stack\")\n\tprivate String exceptionStack;\n\n\t/**\n\t * 操作者姓名\n\t */\n\tprivate String creator;\n\n\t/**\n\t * 操作者id\n\t */\n\t@Column(name = \"creator_id\")\n\tprivate String creatorId;\n\n\t/**\n\t * 创建时间\n\t */\n\t@Column(name = \"create_time\")\n\t@DateTimeFormat(pattern = \"yyyy-MM-dd HH:mm:ss\")\n\t@JsonFormat(pattern = \"yyyy-MM-dd HH:mm:ss\", timezone = \"GMT+8\")\n\tprivate Date createTime;\n}"
  },
  {
    "path": "paascloud-provider/paascloud-provider-mdc/src/main/java/com/paascloud/provider/model/domain/MdcProduct.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：MdcProduct.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.model.domain;\n\nimport com.paascloud.core.mybatis.BaseEntity;\nimport lombok.Data;\nimport lombok.EqualsAndHashCode;\nimport org.apache.ibatis.type.Alias;\n\nimport javax.persistence.Column;\nimport javax.persistence.Table;\nimport java.math.BigDecimal;\n\n/**\n * The class Mdc product.\n *\n * @author paascloud.net@gmail.com\n */\n@EqualsAndHashCode(callSuper = true)\n@Data\n@Table(name = \"pc_mdc_product\")\n@Alias(value = \"mdcProduct\")\npublic class MdcProduct extends BaseEntity {\n\n\tprivate static final long serialVersionUID = 2051481072581512778L;\n\t/**\n\t * 商品名称\n\t */\n\tprivate String name;\n\n\t/**\n\t * 商品编码\n\t */\n\t@Column(name = \"product_code\")\n\tprivate String productCode;\n\n\t@Column(name = \"category_id\")\n\tprivate Long categoryId;\n\n\t/**\n\t * 商品副标题\n\t */\n\tprivate String subtitle;\n\n\t/**\n\t * 产品主图,url相对地址\n\t */\n\t@Column(name = \"main_image\")\n\tprivate String mainImage;\n\n\t/**\n\t * 价格,单位-元保留两位小数\n\t */\n\tprivate BigDecimal price;\n\n\t/**\n\t * 库存数量\n\t */\n\tprivate Integer stock;\n\n\t/**\n\t * 商品状态.1-在售 2-下架 3-删除\n\t */\n\tprivate Integer status;\n\n\t/**\n\t * 图片地址,json格式,扩展用\n\t */\n\t@Column(name = \"sub_images\")\n\tprivate String subImages;\n\n\t/**\n\t * 商品详情\n\t */\n\tprivate String detail;\n}"
  },
  {
    "path": "paascloud-provider/paascloud-provider-mdc/src/main/java/com/paascloud/provider/model/domain/MdcProductCategory.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：MdcProductCategory.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.model.domain;\n\nimport com.paascloud.core.mybatis.BaseEntity;\nimport com.paascloud.provider.model.enums.MdcCategoryStatusEnum;\nimport lombok.Data;\nimport lombok.EqualsAndHashCode;\nimport org.apache.ibatis.type.Alias;\n\nimport javax.persistence.Column;\nimport javax.persistence.Table;\n\n/**\n * The class Mdc product category.\n *\n * @author paascloud.net@gmail.com\n */\n@EqualsAndHashCode(callSuper = true)\n@Data\n@Table(name = \"pc_mdc_product_category\")\n@Alias(value = \"mdcProductCategory\")\npublic class MdcProductCategory extends BaseEntity {\n\n\tprivate static final long serialVersionUID = 6966836239624795099L;\n\n\t/**\n\t * 分类编码\n\t */\n\t@Column(name = \"category_code\")\n\tprivate String categoryCode;\n\n\t/**\n\t * 首图的流水号\n\t */\n\t@Column(name = \"img_id\")\n\tprivate Long imgId;\n\n\t/**\n\t * 父类别id当id=0时说明是根节点,一级类别\n\t */\n\tprivate Long pid;\n\n\t/**\n\t * 类别名称\n\t */\n\tprivate String name;\n\n\t/**\n\t * 类别状态1-启用,2-禁用\n\t * {@link MdcCategoryStatusEnum}\n\t */\n\tprivate Integer status;\n\n\t/**\n\t * 排序编号,同类展示顺序,数值相等则自然排序\n\t */\n\t@Column(name = \"sort_order\")\n\tprivate Integer sortOrder;\n\n}"
  },
  {
    "path": "paascloud-provider/paascloud-provider-mdc/src/main/java/com/paascloud/provider/model/dto/MdcCategoryCheckNameDto.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：MdcCategoryCheckNameDto.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.model.dto;\n\nimport io.swagger.annotations.ApiModel;\nimport io.swagger.annotations.ApiModelProperty;\nimport lombok.Data;\nimport org.hibernate.validator.constraints.NotBlank;\n\nimport java.io.Serializable;\n\n\n/**\n * The class Mdc category check name dto.\n *\n * @author paascloud.net @gmail.com\n */\n@Data\n@ApiModel\npublic class MdcCategoryCheckNameDto implements Serializable {\n\tprivate static final long serialVersionUID = 8687848883145768024L;\n\t/**\n\t * 菜单的id\n\t */\n\t@ApiModelProperty(value = \"分类id\")\n\tprivate Long categoryId;\n\t/**\n\t * 菜单的url\n\t */\n\t@ApiModelProperty(value = \"分类名称\")\n\t@NotBlank(message = \"分类名称不能为空\")\n\tprivate String categoryName;\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-mdc/src/main/java/com/paascloud/provider/model/dto/MdcDictCheckCodeDto.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：MdcDictCheckCodeDto.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.model.dto;\n\nimport io.swagger.annotations.ApiModel;\nimport io.swagger.annotations.ApiModelProperty;\nimport lombok.Data;\nimport org.hibernate.validator.constraints.NotBlank;\n\nimport java.io.Serializable;\n\n\n/**\n * The class Uac menu check code dto.\n *\n * @author paascloud.net@gmail.com\n */\n@Data\n@ApiModel\npublic class MdcDictCheckCodeDto implements Serializable {\n\tprivate static final long serialVersionUID = 8687848883145768024L;\n\t/**\n\t * 菜单的id\n\t */\n\t@ApiModelProperty(value = \"数据字典id\")\n\tprivate Long dictId;\n\t/**\n\t * 菜单的url\n\t */\n\t@ApiModelProperty(value = \"数据字典编码\")\n\t@NotBlank(message = \"数据字典编码不能为空\")\n\tprivate String dictCode;\n\n\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-mdc/src/main/java/com/paascloud/provider/model/dto/MdcDictCheckNameDto.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：MdcDictCheckNameDto.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.model.dto;\n\nimport io.swagger.annotations.ApiModel;\nimport io.swagger.annotations.ApiModelProperty;\nimport lombok.Data;\nimport org.hibernate.validator.constraints.NotBlank;\n\nimport java.io.Serializable;\n\n\n/**\n * The class Uac menu check code dto.\n *\n * @author paascloud.net@gmail.com\n */\n@Data\n@ApiModel\npublic class MdcDictCheckNameDto implements Serializable {\n\tprivate static final long serialVersionUID = 8687848883145768024L;\n\t/**\n\t * 菜单的id\n\t */\n\t@ApiModelProperty(value = \"数据字典id\")\n\tprivate Long dictId;\n\t/**\n\t * 菜单的url\n\t */\n\t@ApiModelProperty(value = \"数据字典名称\")\n\t@NotBlank(message = \"数据字典名称不能为空\")\n\tprivate String dictName;\n\n\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-mdc/src/main/java/com/paascloud/provider/model/dto/MdcEditCategoryDto.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：MdcEditCategoryDto.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.model.dto;\n\n\nimport lombok.Data;\n\nimport java.io.Serializable;\n\n/**\n * The class Mdc edit category dto.\n *\n * @author paascloud.net @gmail.com\n */\n@Data\npublic class MdcEditCategoryDto implements Serializable {\n\tprivate static final long serialVersionUID = 8578699727403591194L;\n\t/**\n\t * 首图的流水号\n\t */\n\tprivate Long imgId;\n\t/**\n\t * ID\n\t */\n\tprivate Long id;\n\n\t/**\n\t * 父类别id当id=0时说明是根节点,一级类别\n\t */\n\tprivate Long pid;\n\n\t/**\n\t * 类别名称\n\t */\n\tprivate String name;\n\n\t/**\n\t * 类别状态1-正常,2-已废弃\n\t */\n\tprivate Integer status;\n\n\t/**\n\t * 排序编号,同类展示顺序,数值相等则自然排序\n\t */\n\tprivate Integer sortOrder;\n\n\t/**\n\t * 分类编码\n\t */\n\tprivate String categoryCode;\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-mdc/src/main/java/com/paascloud/provider/model/dto/MdcEditDictDto.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：MdcEditDictDto.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.model.dto;\n\n\nimport io.swagger.annotations.ApiModel;\nimport lombok.Data;\n\nimport java.io.Serializable;\n\n/**\n * The class Mdc edit dict dto.\n *\n * @author paascloud.net @gmail.com\n */\n@Data\n@ApiModel\npublic class MdcEditDictDto implements Serializable {\n\tprivate static final long serialVersionUID = 3530155770606863044L;\n\t/**\n\t * 字典类型 -0 常量 - 1 文件夹\n\t */\n\tprivate Integer type;\n\n\t/**\n\t * 枚举编码\n\t */\n\tprivate String dictKey;\n\n\t/**\n\t * 枚举扩展字段\n\t */\n\tprivate String extendKey;\n\n\t/**\n\t * 枚举值\n\t */\n\tprivate String dictValue;\n\n\t/**\n\t * 字典编码\n\t */\n\tprivate String dictCode;\n\n\t/**\n\t * 字典名称\n\t */\n\tprivate String dictName;\n\n\t/**\n\t * ID\n\t */\n\tprivate Long id;\n\n\t/**\n\t * 父ID\n\t */\n\tprivate Long pid;\n\n\t/**\n\t * 序号\n\t */\n\tprivate Integer number;\n\n\t/**\n\t * 状态\n\t */\n\tprivate Integer status;\n\n\t/**\n\t * 备注\n\t */\n\tprivate String remark;\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-mdc/src/main/java/com/paascloud/provider/model/dto/MdcEditProductDto.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：MdcEditProductDto.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.model.dto;\n\n\nimport lombok.Data;\nimport org.hibernate.validator.constraints.NotBlank;\n\nimport java.io.Serializable;\nimport java.math.BigDecimal;\nimport java.util.List;\n\n/**\n * The class Mdc edit category dto.\n *\n * @author paascloud.net @gmail.com\n */\n@Data\npublic class MdcEditProductDto implements Serializable {\n\tprivate static final long serialVersionUID = 8578699727403591194L;\n\t/**\n\t * 商品ID\n\t */\n\tprivate Long id;\n\n\t/**\n\t * 商品名称\n\t */\n\t@NotBlank(message = \"商品名称不能为空\")\n\tprivate String name;\n\n\t/**\n\t * 商品编码\n\t */\n\t@NotBlank(message = \"商品编码不能为空\")\n\tprivate String productCode;\n\n\t/**\n\t * 品类Id集合\n\t */\n\t@NotBlank(message = \"品类不能为空\")\n\tprivate List<Long> categoryIdList;\n\n\t/**\n\t * 商品副标题\n\t */\n\t@NotBlank(message = \"品类不能为空\")\n\tprivate String subtitle;\n\n\t/**\n\t * 产品主图,url相对地址\n\t */\n\tprivate String mainImage;\n\n\t/**\n\t * 价格,单位-元保留两位小数\n\t */\n\t@NotBlank(message = \"品类价格不能为空\")\n\tprivate BigDecimal price;\n\n\t/**\n\t * 库存数量\n\t */\n\t@NotBlank(message = \"品类库存不能为空\")\n\tprivate Integer stock;\n\n\t/**\n\t * 商品状态.1-在售 2-下架 3-删除\n\t */\n\t@NotBlank(message = \"品类状态不能为空\")\n\tprivate Integer status;\n\n\t/**\n\t * 商品图片流水号集合\n\t */\n\tprivate List<Long> attachmentIdList;\n\n\t/**\n\t * 商品详情\n\t */\n\tprivate String detail;\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-mdc/src/main/java/com/paascloud/provider/model/dto/MdcExceptionQueryDto.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：MdcExceptionQueryDto.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.model.dto;\n\nimport com.fasterxml.jackson.annotation.JsonFormat;\nimport com.paascloud.base.dto.BaseQuery;\nimport io.swagger.annotations.ApiModel;\nimport io.swagger.annotations.ApiModelProperty;\nimport lombok.Data;\nimport lombok.EqualsAndHashCode;\nimport org.springframework.format.annotation.DateTimeFormat;\n\nimport java.util.Date;\n\n\n/**\n * The class Mdc exception query dto.\n *\n * @author paascloud.net @gmail.com\n */\n@EqualsAndHashCode(callSuper = true)\n@Data\n@ApiModel\npublic class MdcExceptionQueryDto extends BaseQuery {\n\n\tprivate static final long serialVersionUID = 3967075132487249652L;\n\t/**\n\t * 操作用户名称\n\t */\n\t@ApiModelProperty(value = \"操作用户名称\")\n\tprivate String creator;\n\t/**\n\t * 异常原因\n\t */\n\t@ApiModelProperty(value = \"异常原因\")\n\tprivate String exceptionCause;\n\n\t/**\n\t * 异常栈信息\n\t */\n\t@ApiModelProperty(value = \"异常栈信息\")\n\tprivate String exceptionStack;\n\n\t/**\n\t * 开始时间\n\t */\n\t@ApiModelProperty(value = \"开始时间\")\n\t@DateTimeFormat(pattern = \"yyyy-MM-dd HH:mm:ss\")\n\t@JsonFormat(pattern = \"yyyy-MM-dd HH:mm:ss\", timezone = \"GMT+8\")\n\tprivate Date startQueryTime;\n\n\t/**\n\t * 结束时间\n\t */\n\t@ApiModelProperty(value = \"结束时间\")\n\t@DateTimeFormat(pattern = \"yyyy-MM-dd HH:mm:ss\")\n\t@JsonFormat(pattern = \"yyyy-MM-dd HH:mm:ss\", timezone = \"GMT+8\")\n\tprivate Date endQueryTime;\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-mdc/src/main/java/com/paascloud/provider/model/enums/AddressTypeEnum.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：AddressTypeEnum.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.model.enums;\n\n/**\n * 地址类型枚举类\n *\n * @author paascloud.net @gmail.com\n */\npublic enum AddressTypeEnum {\n\n\t/**\n\t * Province address type enum.\n\t */\n\tPROVINCE(\"province\"),\n\t/**\n\t * City address type enum.\n\t */\n\tCITY(\"city\"),\n\t/**\n\t * District address type enum.\n\t */\n\tDISTRICT(\"district\"),\n\t/**\n\t * Street address type enum.\n\t */\n\tSTREET(\"street\");\n\n\tprivate String type;\n\n\tAddressTypeEnum(String type) {\n\t\tthis.type = type;\n\t}\n\n\t/**\n\t * Gets type.\n\t *\n\t * @return the type\n\t */\n\tpublic String getType() {\n\t\treturn type;\n\t}\n\n\t/**\n\t * Gets enum.\n\t *\n\t * @param type the type\n\t *\n\t * @return the enum\n\t */\n\tpublic static AddressTypeEnum getEnum(String type) {\n\t\tfor (AddressTypeEnum ele : AddressTypeEnum.values()) {\n\t\t\tif (ele.getType().equals(type)) {\n\t\t\t\treturn ele;\n\t\t\t}\n\t\t}\n\t\treturn null;\n\t}\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-mdc/src/main/java/com/paascloud/provider/model/enums/MdcCategoryStatusEnum.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：MdcCategoryStatusEnum.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.model.enums;\n\n\n/**\n * The enum Mdc category status enum.\n *\n * @author paascloud.net @gmail.com\n */\npublic enum MdcCategoryStatusEnum {\n\t/**\n\t * 启用\n\t */\n\tENABLE(1, \"启用\"),\n\t/**\n\t * 禁用\n\t */\n\tDISABLE(2, \"禁用\");\n\n\t/**\n\t * The Type.\n\t */\n\tint type;\n\t/**\n\t * The Name.\n\t */\n\tString name;\n\n\tMdcCategoryStatusEnum(int type, String name) {\n\t\tthis.type = type;\n\t\tthis.name = name;\n\t}\n\n\t/**\n\t * Gets type.\n\t *\n\t * @return the type\n\t */\n\tpublic int getType() {\n\t\treturn type;\n\t}\n\n\t/**\n\t * Gets name.\n\t *\n\t * @return the name\n\t */\n\tpublic String getName() {\n\t\treturn name;\n\t}\n\n\n\t/**\n\t * Gets name.\n\t *\n\t * @param type the type\n\t *\n\t * @return the name\n\t */\n\tpublic static String getName(int type) {\n\t\tfor (MdcCategoryStatusEnum ele : MdcCategoryStatusEnum.values()) {\n\t\t\tif (type == ele.getType()) {\n\t\t\t\treturn ele.getName();\n\t\t\t}\n\t\t}\n\t\treturn null;\n\t}\n\n\t/**\n\t * Gets enum.\n\t *\n\t * @param type the type\n\t *\n\t * @return the enum\n\t */\n\tpublic static MdcCategoryStatusEnum getEnum(int type) {\n\t\tfor (MdcCategoryStatusEnum ele : MdcCategoryStatusEnum.values()) {\n\t\t\tif (type == ele.getType()) {\n\t\t\t\treturn ele;\n\t\t\t}\n\t\t}\n\t\treturn MdcCategoryStatusEnum.ENABLE;\n\t}\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-mdc/src/main/java/com/paascloud/provider/model/enums/MdcDictStatusEnum.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：MdcDictStatusEnum.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.model.enums;\n\n\n/**\n * The enum Uac menu status enum.\n *\n * @author paascloud.net @gmail.com\n */\npublic enum MdcDictStatusEnum {\n\t/**\n\t * 启用\n\t */\n\tENABLE(10, \"启用\"),\n\t/**\n\t * 禁用\n\t */\n\tDISABLE(20, \"禁用\");\n\n\t/**\n\t * The Type.\n\t */\n\tint type;\n\t/**\n\t * The Name.\n\t */\n\tString name;\n\n\tMdcDictStatusEnum(int type, String name) {\n\t\tthis.type = type;\n\t\tthis.name = name;\n\t}\n\n\t/**\n\t * Gets type.\n\t *\n\t * @return the type\n\t */\n\tpublic int getType() {\n\t\treturn type;\n\t}\n\n\t/**\n\t * Gets name.\n\t *\n\t * @return the name\n\t */\n\tpublic String getName() {\n\t\treturn name;\n\t}\n\n\n\t/**\n\t * Gets name.\n\t *\n\t * @param type the type\n\t *\n\t * @return the name\n\t */\n\tpublic static String getName(int type) {\n\t\tfor (MdcDictStatusEnum ele : MdcDictStatusEnum.values()) {\n\t\t\tif (type == ele.getType()) {\n\t\t\t\treturn ele.getName();\n\t\t\t}\n\t\t}\n\t\treturn null;\n\t}\n\n\t/**\n\t * Gets enum.\n\t *\n\t * @param type the type\n\t *\n\t * @return the enum\n\t */\n\tpublic static MdcDictStatusEnum getEnum(int type) {\n\t\tfor (MdcDictStatusEnum ele : MdcDictStatusEnum.values()) {\n\t\t\tif (type == ele.getType()) {\n\t\t\t\treturn ele;\n\t\t\t}\n\t\t}\n\t\treturn MdcDictStatusEnum.ENABLE;\n\t}\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-mdc/src/main/java/com/paascloud/provider/model/vo/MdcCategoryVo.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：MdcCategoryVo.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.model.vo;\n\nimport com.paascloud.base.dto.BaseTree;\nimport lombok.Data;\nimport lombok.EqualsAndHashCode;\n\n/**\n * The class Mdc dict vo.\n *\n * @author paascloud.net @gmail.com\n */\n@EqualsAndHashCode(callSuper = true)\n@Data\npublic class MdcCategoryVo extends BaseTree {\n\tprivate static final long serialVersionUID = 5310269803239754048L;\n\t/**\n\t * 父分类名称\n\t */\n\tprivate String parentCategoryName;\n\t/**\n\t * 字典类型 -0 常量 - 1 文件夹\n\t */\n\tprivate Integer type;\n\n\t/**\n\t * 字典名称\n\t */\n\tprivate String name;\n\n\t/**\n\t * 序号\n\t */\n\tprivate Integer number;\n\n\t/**\n\t * 状态\n\t */\n\tprivate Integer status;\n\t/**\n\t * 排序编号,同类展示顺序,数值相等则自然排序\n\t */\n\tprivate Integer sortOrder;\n\t/**\n\t * 分类编码\n\t */\n\tprivate String categoryCode;\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-mdc/src/main/java/com/paascloud/provider/model/vo/MdcDictVo.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：MdcDictVo.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.model.vo;\n\nimport com.paascloud.base.dto.BaseTree;\nimport lombok.Data;\nimport lombok.EqualsAndHashCode;\n\n/**\n * The class Mdc dict vo.\n *\n * @author paascloud.net @gmail.com\n */\n@EqualsAndHashCode(callSuper = true)\n@Data\npublic class MdcDictVo extends BaseTree {\n\tprivate static final long serialVersionUID = -6759243808584390573L;\n\t/**\n\t * 父数据字典名称\n\t */\n\tprivate String parentDictName;\n\t/**\n\t * 字典类型 -0 常量 - 1 文件夹\n\t */\n\tprivate Integer type;\n\n\t/**\n\t * 枚举编码\n\t */\n\tprivate String dictKey;\n\n\t/**\n\t * 枚举扩展字段\n\t */\n\tprivate String extendKey;\n\n\t/**\n\t * 枚举值\n\t */\n\tprivate String dictValue;\n\n\t/**\n\t * 字典编码\n\t */\n\tprivate String dictCode;\n\n\t/**\n\t * 字典名称\n\t */\n\tprivate String dictName;\n\n\t/**\n\t * 序号\n\t */\n\tprivate Integer number;\n\n\t/**\n\t * 状态\n\t */\n\tprivate Integer status;\n\n\t/**\n\t * 备注\n\t */\n\tprivate String remark;\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-mdc/src/main/java/com/paascloud/provider/model/vo/ProductVo.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：ProductVo.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.model.vo;\n\nimport com.paascloud.base.dto.BaseVo;\nimport com.paascloud.provider.model.dto.oss.ElementImgUrlDto;\nimport lombok.Data;\nimport lombok.EqualsAndHashCode;\n\nimport javax.persistence.Column;\nimport java.math.BigDecimal;\nimport java.util.List;\n\n/**\n * The class Product vo.\n *\n * @author paascloud.net @gmail.com\n */\n@EqualsAndHashCode(callSuper = true)\n@Data\npublic class ProductVo extends BaseVo {\n\tprivate static final long serialVersionUID = 5719854343599455196L;\n\n\t/**\n\t * 商品名称\n\t */\n\tprivate String name;\n\n\t/**\n\t * 商品编码\n\t */\n\tprivate String productCode;\n\n\t/**\n\t * 商品副标题\n\t */\n\tprivate String subtitle;\n\n\t/**\n\t * 产品主图,url相对地址\n\t */\n\t@Column(name = \"main_image\")\n\tprivate String mainImage;\n\n\t/**\n\t * 价格,单位-元保留两位小数\n\t */\n\tprivate BigDecimal price;\n\n\t/**\n\t * 库存数量\n\t */\n\tprivate Integer stock;\n\n\t/**\n\t * 商品状态.1-在售 2-下架 3-删除\n\t */\n\tprivate Integer status;\n\n\t/**\n\t * 图片地址,json格式,扩展用\n\t */\n\t@Column(name = \"sub_images\")\n\tprivate String subImages;\n\n\t/**\n\t * 商品详情\n\t */\n\tprivate String detail;\n\n\t/**\n\t * 分类ID\n\t */\n\tprivate List<Long> categoryIdList;\n\n\t/**\n\t * 图片集合\n\t */\n\tprivate List<ElementImgUrlDto> imgUrlList;\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-mdc/src/main/java/com/paascloud/provider/service/MdcAddressService.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：MdcAddressService.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.service;\n\n\nimport com.paascloud.TreeNode;\nimport com.paascloud.core.support.IService;\nimport com.paascloud.provider.model.domain.MdcAddress;\n\nimport java.util.List;\n\n/**\n * The interface Mdc address service.\n *\n * @author paascloud.net@gmail.com\n */\npublic interface MdcAddressService extends IService<MdcAddress> {\n\t/**\n\t * 根据PID查询地址信息\n\t *\n\t * @param pid the pid\n\t *\n\t * @return the list\n\t */\n\tList<MdcAddress> listByPid(Long pid);\n\n\t/**\n\t * Gets by id.\n\t *\n\t * @param id the id\n\t *\n\t * @return the by id\n\t */\n\tMdcAddress getById(Long id);\n\n\t/**\n\t * Gets 4 city.\n\t *\n\t * @return the 4 city\n\t */\n\tList<TreeNode> get4City();\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-mdc/src/main/java/com/paascloud/provider/service/MdcDictService.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：MdcDictService.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.service;\n\nimport com.paascloud.base.dto.LoginAuthDto;\nimport com.paascloud.base.dto.UpdateStatusDto;\nimport com.paascloud.core.support.IService;\nimport com.paascloud.provider.model.domain.MdcDict;\nimport com.paascloud.provider.model.vo.MdcDictVo;\n\nimport java.util.List;\n\n/**\n * The interface Mdc dict service.\n *\n * @author paascloud.net @gmail.com\n */\npublic interface MdcDictService extends IService<MdcDict> {\n\n\t/**\n\t * 获取字典树.\n\t *\n\t * @return the dict tree list\n\t */\n\tList<MdcDictVo> getDictTreeList();\n\n\t/**\n\t * 根据ID获取字典信息.\n\t *\n\t * @param dictId the dict id\n\t *\n\t * @return the mdc dict vo by id\n\t */\n\tMdcDictVo getMdcDictVoById(Long dictId);\n\n\t/**\n\t * 根据id修改字典信息.\n\t *\n\t * @param updateStatusDto the update status dto\n\t * @param loginAuthDto    the login auth dto\n\t *\n\t * @return the int\n\t */\n\tvoid updateMdcDictStatusById(UpdateStatusDto updateStatusDto, LoginAuthDto loginAuthDto);\n\n\t/**\n\t * 编辑字典.\n\t *\n\t * @param mdcDict      the mdc dict\n\t * @param loginAuthDto the login auth dto\n\t */\n\tvoid saveMdcDict(MdcDict mdcDict, LoginAuthDto loginAuthDto);\n\n\t/**\n\t * Check dict has child dict boolean.\n\t *\n\t * @param dictId the dict id\n\t *\n\t * @return the boolean\n\t */\n\tboolean checkDictHasChildDict(Long dictId);\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-mdc/src/main/java/com/paascloud/provider/service/MdcExceptionLogService.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：MdcExceptionLogService.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.service;\n\n\nimport com.github.pagehelper.PageInfo;\nimport com.paascloud.core.support.IService;\nimport com.paascloud.provider.model.domain.MdcExceptionLog;\nimport com.paascloud.provider.model.dto.GlobalExceptionLogDto;\nimport com.paascloud.provider.model.dto.MdcExceptionQueryDto;\n\n/**\n * The interface Mdc exception log service.\n *\n * @author paascloud.net @gmail.com\n */\npublic interface MdcExceptionLogService extends IService<MdcExceptionLog> {\n\t/**\n\t * 保存日志并发送钉钉消息.\n\t *\n\t * @param exceptionLogDto the exception log dto\n\t */\n\tvoid saveAndSendExceptionLog(GlobalExceptionLogDto exceptionLogDto);\n\n\t/**\n\t * Query exception list with page page info.\n\t *\n\t * @param mdcExceptionQueryDto the mdc exception query dto\n\t *\n\t * @return the page info\n\t */\n\tPageInfo queryExceptionListWithPage(MdcExceptionQueryDto mdcExceptionQueryDto);\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-mdc/src/main/java/com/paascloud/provider/service/MdcProductCategoryService.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：MdcProductCategoryService.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.service;\n\nimport com.paascloud.base.dto.LoginAuthDto;\nimport com.paascloud.base.dto.UpdateStatusDto;\nimport com.paascloud.core.support.IService;\nimport com.paascloud.provider.model.domain.MdcProductCategory;\nimport com.paascloud.provider.model.dto.ProductCategoryDto;\nimport com.paascloud.provider.model.vo.MdcCategoryVo;\n\nimport java.util.List;\n\n/**\n * The interface Mdc product category service.\n *\n * @author paascloud.net @gmail.com\n */\npublic interface MdcProductCategoryService extends IService<MdcProductCategory> {\n\n\t/**\n\t * Gets category dto list.\n\t *\n\t * @param categoryId the category id\n\t *\n\t * @return the category dto list\n\t */\n\tList<ProductCategoryDto> getCategoryDtoList(Long categoryId);\n\n\t/**\n\t * Gets product category list by pid.\n\t *\n\t * @param pid the pid\n\t *\n\t * @return the product category list by pid\n\t */\n\tList<MdcProductCategory> getProductCategoryListByPid(Long pid);\n\n\t/**\n\t * 递归查询本节点的id及孩子节点的id.\n\t *\n\t * @param categoryId the category id\n\t *\n\t * @return the list\n\t */\n\tList<Long> selectCategoryAndChildrenById(Long categoryId);\n\n\t/**\n\t * Gets by category id.\n\t *\n\t * @param categoryId the category id\n\t *\n\t * @return the by category id\n\t */\n\tMdcProductCategory getByCategoryId(Long categoryId);\n\n\t/**\n\t * 获取商品分类树.\n\t *\n\t * @return the category tree list\n\t */\n\tList<MdcCategoryVo> getCategoryTreeList();\n\n\t/**\n\t * 根据ID获取商品分类信息.\n\t *\n\t * @param id the id\n\t *\n\t * @return the mdc category vo by id\n\t */\n\tMdcCategoryVo getMdcCategoryVoById(Long id);\n\n\t/**\n\t * 更新商品分类信息.\n\t *\n\t * @param updateStatusDto the update status dto\n\t * @param loginAuthDto    the login auth dto\n\t */\n\tvoid updateMdcCategoryStatusById(UpdateStatusDto updateStatusDto, LoginAuthDto loginAuthDto);\n\n\t/**\n\t * 保存商品分类信息.\n\t *\n\t * @param mdcCategory  the mdc category\n\t * @param loginAuthDto the login auth dto\n\t */\n\tvoid saveMdcCategory(MdcProductCategory mdcCategory, LoginAuthDto loginAuthDto);\n\n\t/**\n\t * Check category has child category boolean.\n\t *\n\t * @param id the id\n\t *\n\t * @return the boolean\n\t */\n\tboolean checkCategoryHasChildCategory(Long id);\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-mdc/src/main/java/com/paascloud/provider/service/MdcProductService.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：MdcProductService.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.service;\n\nimport com.paascloud.base.dto.LoginAuthDto;\nimport com.paascloud.core.support.IService;\nimport com.paascloud.provider.model.domain.MdcProduct;\nimport com.paascloud.provider.model.dto.MdcEditProductDto;\nimport com.paascloud.provider.model.dto.ProductDto;\nimport com.paascloud.provider.model.vo.ProductDetailVo;\nimport com.paascloud.provider.model.vo.ProductVo;\n\nimport java.util.List;\n\n/**\n * The interface Mdc product service.\n *\n * @author paascloud.net @gmail.com\n */\npublic interface MdcProductService extends IService<MdcProduct> {\n\n\t/**\n\t * Select by name and category ids list.\n\t *\n\t * @param productName    the product name\n\t * @param categoryIdList the category id list\n\t * @param orderBy        the order by\n\t *\n\t * @return the list\n\t */\n\tList<MdcProduct> selectByNameAndCategoryIds(String productName, List<Long> categoryIdList, String orderBy);\n\n\t/**\n\t * 根据商品ID查询商品详细信息.\n\t *\n\t * @param productId the product id\n\t *\n\t * @return the product detail\n\t */\n\tProductDetailVo getProductDetail(Long productId);\n\n\t/**\n\t * 更新商品库存.\n\t *\n\t * @param productDto the product dto\n\t *\n\t * @return the int\n\t */\n\tint updateProductStockById(ProductDto productDto);\n\n\t/**\n\t * 查询商品集合.\n\t *\n\t * @param mdcProduct the mdc product\n\t *\n\t * @return the list\n\t */\n\tList<ProductVo> queryProductListWithPage(MdcProduct mdcProduct);\n\n\t/**\n\t * 新增商品信息.\n\t *\n\t * @param mdcEditProductDto the mdc edit product dto\n\t * @param loginAuthDto      the login auth dto\n\t */\n\tvoid saveProduct(MdcEditProductDto mdcEditProductDto, LoginAuthDto loginAuthDto);\n\n\t/**\n\t * 删除商品信息.\n\t *\n\t * @param id the id\n\t */\n\tvoid deleteProductById(Long id);\n\n\t/**\n\t * Gets product vo.\n\t *\n\t * @param id the id\n\t *\n\t * @return the product vo\n\t */\n\tProductVo getProductVo(Long id);\n\n\t/**\n\t * Gets main image.\n\t *\n\t * @param productId the product id\n\t *\n\t * @return the main image\n\t */\n\tString getMainImage(Long productId);\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-mdc/src/main/java/com/paascloud/provider/service/OpcRpcService.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：OpcRpcService.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.service;\n\n\nimport com.paascloud.provider.model.dto.oss.ElementImgUrlDto;\nimport com.paascloud.provider.model.dto.oss.OptBatchGetUrlRequest;\nimport com.paascloud.provider.model.dto.oss.OptGetUrlRequest;\nimport com.paascloud.provider.model.dto.robot.ChatRobotMsgDto;\nimport com.paascloud.wrapper.Wrapper;\nimport org.springframework.stereotype.Component;\n\nimport javax.annotation.Resource;\nimport java.util.List;\n\n/**\n * The class Opc rpc service.\n *\n * @author paascloud.net @gmail.com\n */\n@Component\npublic class OpcRpcService {\n\n\t@Resource\n\tprivate DingtalkFeignApi dingtalkFeignApi;\n\t@Resource\n\tprivate OpcOssFeignApi opcOssFeignApi;\n\n\tpublic boolean sendChatRobotMsg(ChatRobotMsgDto chatRobotMsgDto) {\n\t\tWrapper<Boolean> result = dingtalkFeignApi.sendChatRobotMsg(chatRobotMsgDto);\n\t\treturn result.getResult();\n\t}\n\n\tpublic List<ElementImgUrlDto> listFileUrl(OptBatchGetUrlRequest urlRequest) {\n\t\tWrapper<List<ElementImgUrlDto>> result = opcOssFeignApi.listFileUrl(urlRequest);\n\t\treturn result.getResult();\n\t}\n\n\tpublic String getFileUrl(final OptGetUrlRequest request) {\n\t\tWrapper<String> result = opcOssFeignApi.getFileUrl(request);\n\t\treturn result.getResult();\n\t}\n}"
  },
  {
    "path": "paascloud-provider/paascloud-provider-mdc/src/main/java/com/paascloud/provider/service/impl/MdcAddressServiceImpl.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：MdcAddressServiceImpl.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.service.impl;\n\nimport com.google.common.collect.Lists;\nimport com.paascloud.RecursionTreeUtil;\nimport com.paascloud.TreeNode;\nimport com.paascloud.provider.mapper.MdcAddressMapper;\nimport com.paascloud.provider.model.domain.MdcAddress;\nimport com.paascloud.core.support.BaseService;\nimport com.paascloud.provider.service.MdcAddressService;\nimport org.springframework.cache.annotation.Cacheable;\nimport org.springframework.stereotype.Service;\n\nimport javax.annotation.Resource;\nimport java.util.List;\n\n/**\n * The class Mdc address service.\n *\n * @author paascloud.net@gmail.com\n */\n@Service\npublic class MdcAddressServiceImpl extends BaseService<MdcAddress> implements MdcAddressService {\n\t@Resource\n\tprivate MdcAddressMapper mdcAddressMapper;\n\n\t/**\n\t * Find by pid list.\n\t *\n\t * @param pid the pid\n\t *\n\t * @return the list\n\t */\n\t@Override\n\tpublic List<MdcAddress> listByPid(Long pid) {\n\t\treturn mdcAddressMapper.selectAddressByPid(pid);\n\t}\n\n\t@Override\n\t@Cacheable(cacheNames = \"mdc-cache\", key = \"#id\")\n\tpublic MdcAddress getById(Long id) {\n\t\treturn mdcAddressMapper.selectByPrimaryKey(id);\n\t}\n\n\t@Override\n\t@Cacheable(cacheNames = \"mdc-cache\", keyGenerator = \"keyGenerator\")\n\tpublic List<TreeNode> get4City() {\n\t\tList<MdcAddress> mdcAddresses = mdcAddressMapper.selectAll();\n\t\tList<TreeNode> treeNodeList = buildGroupTree(mdcAddresses);\n\t\tlogger.info(\"treeNodeList={}\", treeNodeList);\n\t\treturn treeNodeList;\n\t}\n\n\tprivate List<TreeNode> buildGroupTree(List<MdcAddress> mdcAddressesList) {\n\t\tList<TreeNode> list = Lists.newArrayList();\n\t\tTreeNode node;\n\t\tfor (MdcAddress group : mdcAddressesList) {\n\t\t\tnode = new TreeNode();\n\t\t\tnode.setId(group.getId());\n\t\t\tnode.setPid(group.getPid());\n\t\t\tnode.setNodeCode(group.getAdCode());\n\t\t\tnode.setNodeName(group.getName());\n\t\t\tlist.add(node);\n\t\t}\n\n\t\treturn RecursionTreeUtil.getChildTreeNodes(list, 368100107951677440L);\n\t}\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-mdc/src/main/java/com/paascloud/provider/service/impl/MdcDictServiceImpl.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：MdcDictServiceImpl.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.service.impl;\n\nimport com.google.common.collect.Lists;\nimport com.paascloud.PublicUtil;\nimport com.paascloud.base.dto.LoginAuthDto;\nimport com.paascloud.base.dto.UpdateStatusDto;\nimport com.paascloud.base.enums.ErrorCodeEnum;\nimport com.paascloud.core.support.BaseService;\nimport com.paascloud.core.support.TreeUtils;\nimport com.paascloud.provider.exceptions.MdcBizException;\nimport com.paascloud.provider.mapper.MdcDictMapper;\nimport com.paascloud.provider.model.domain.MdcDict;\nimport com.paascloud.provider.model.enums.MdcDictStatusEnum;\nimport com.paascloud.provider.model.vo.MdcDictVo;\nimport com.paascloud.provider.service.MdcDictService;\nimport org.modelmapper.ModelMapper;\nimport org.springframework.stereotype.Service;\nimport org.springframework.transaction.annotation.Transactional;\n\nimport javax.annotation.Resource;\nimport java.util.List;\n\n/**\n * The class Mdc dict service.\n *\n * @author paascloud.net @gmail.com\n */\n@Service\n@Transactional(rollbackFor = Exception.class)\npublic class MdcDictServiceImpl extends BaseService<MdcDict> implements MdcDictService {\n\t@Resource\n\tprivate MdcDictMapper mdcDictMapper;\n\n\t@Override\n\t@Transactional(readOnly = true, rollbackFor = Exception.class)\n\tpublic List<MdcDictVo> getDictTreeList() {\n\t\tList<MdcDictVo> list = mdcDictMapper.listDictVo();\n\t\treturn new TreeUtils().getChildTreeObjects(list, 0L);\n\t}\n\n\t@Override\n\t@Transactional(readOnly = true, rollbackFor = Exception.class)\n\tpublic MdcDictVo getMdcDictVoById(Long dictId) {\n\t\tMdcDict dict = mdcDictMapper.selectByPrimaryKey(dictId);\n\n\t\tif (dict == null) {\n\t\t\tlogger.error(\"找不到数据字典信息id={}\", dictId);\n\t\t\tthrow new MdcBizException(ErrorCodeEnum.MDC10021018, dictId);\n\t\t}\n\n\t\t// 获取父级菜单信息\n\t\tMdcDict parentDict = mdcDictMapper.selectByPrimaryKey(dict.getPid());\n\n\t\tModelMapper modelMapper = new ModelMapper();\n\t\tMdcDictVo dictVo = modelMapper.map(dict, MdcDictVo.class);\n\n\t\tif (parentDict != null) {\n\t\t\tdictVo.setParentDictName(parentDict.getDictName());\n\t\t}\n\n\t\treturn dictVo;\n\t}\n\n\t@Override\n\tpublic void updateMdcDictStatusById(UpdateStatusDto updateStatusDto, LoginAuthDto loginAuthDto) {\n\t\tLong id = updateStatusDto.getId();\n\t\tInteger status = updateStatusDto.getStatus();\n\t\t// 要处理的菜单集合\n\t\tList<MdcDict> mdcDictList = Lists.newArrayList();\n\n\t\tint result;\n\t\tif (status.equals(MdcDictStatusEnum.DISABLE.getType())) {\n\t\t\t// 获取菜单以及子菜单\n\t\t\tmdcDictList = this.getAllDictFolder(id, MdcDictStatusEnum.ENABLE.getType());\n\t\t} else {\n\t\t\t// 获取菜单、其子菜单以及父菜单\n\t\t\tMdcDict uacMenu = new MdcDict();\n\t\t\tuacMenu.setPid(id);\n\t\t\tresult = this.selectCount(uacMenu);\n\t\t\t// 此菜单含有子菜单\n\t\t\tif (result > 0) {\n\t\t\t\tmdcDictList = this.getAllDictFolder(id, MdcDictStatusEnum.DISABLE.getType());\n\t\t\t}\n\t\t\tList<MdcDict> dictListTemp = this.getAllParentDictFolderByMenuId(id);\n\t\t\tfor (MdcDict dict : dictListTemp) {\n\t\t\t\tif (!mdcDictList.contains(dict)) {\n\t\t\t\t\tmdcDictList.add(dict);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tthis.updateDictStatus(mdcDictList, loginAuthDto, status);\n\t}\n\n\tprivate void updateDictStatus(List<MdcDict> mdcDictList, LoginAuthDto loginAuthDto, int status) {\n\t\tMdcDict update = new MdcDict();\n\t\tfor (MdcDict dict : mdcDictList) {\n\t\t\tupdate.setId(dict.getId());\n\t\t\tupdate.setVersion(dict.getVersion() + 1);\n\t\t\tupdate.setStatus(status);\n\t\t\tupdate.setUpdateInfo(loginAuthDto);\n\t\t\tint result = mapper.updateByPrimaryKeySelective(update);\n\t\t\tif (result < 1) {\n\t\t\t\tthrow new MdcBizException(ErrorCodeEnum.MDC10021019, dict.getId());\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate List<MdcDict> getAllDictFolder(Long id, int dictStatus) {\n\t\tMdcDict mdcDict = new MdcDict();\n\t\tmdcDict.setId(id);\n\t\tmdcDict = mapper.selectOne(mdcDict);\n\t\tList<MdcDict> mdcDictList = Lists.newArrayList();\n\t\tmdcDictList = buildNode(mdcDictList, mdcDict, dictStatus);\n\t\treturn mdcDictList;\n\t}\n\n\tprivate List<MdcDict> getAllParentDictFolderByMenuId(Long dictId) {\n\t\tMdcDict mdcDictQuery = new MdcDict();\n\t\tmdcDictQuery.setId(dictId);\n\t\tmdcDictQuery = mapper.selectOne(mdcDictQuery);\n\t\tList<MdcDict> mdcDictList = Lists.newArrayList();\n\t\tmdcDictList = buildParentNote(mdcDictList, mdcDictQuery);\n\t\treturn mdcDictList;\n\t}\n\n\t/**\n\t * 递归获取菜单的子节点\n\t */\n\tprivate List<MdcDict> buildNode(List<MdcDict> mdcDictList, MdcDict uacMenu, int dictStatus) {\n\t\tList<MdcDict> uacMenuQueryList = mapper.select(uacMenu);\n\t\tMdcDict uacMenuQuery;\n\t\tfor (MdcDict dict : uacMenuQueryList) {\n\t\t\tif (dictStatus == dict.getStatus()) {\n\t\t\t\tmdcDictList.add(dict);\n\t\t\t}\n\t\t\tuacMenuQuery = new MdcDict();\n\t\t\tuacMenuQuery.setPid(dict.getId());\n\t\t\tbuildNode(mdcDictList, uacMenuQuery, dictStatus);\n\t\t}\n\t\treturn mdcDictList;\n\t}\n\n\t/**\n\t * 递归获取菜单的父菜单\n\t */\n\tprivate List<MdcDict> buildParentNote(List<MdcDict> mdcDictList, MdcDict mdcDict) {\n\t\tList<MdcDict> mdcDictQueryList = mapper.select(mdcDict);\n\t\tMdcDict uacMenuQuery;\n\t\tfor (MdcDict dict : mdcDictQueryList) {\n\t\t\tif (MdcDictStatusEnum.DISABLE.getType() == dict.getStatus()) {\n\t\t\t\tmdcDictList.add(dict);\n\t\t\t}\n\t\t\tuacMenuQuery = new MdcDict();\n\t\t\tuacMenuQuery.setId(dict.getPid());\n\t\t\tbuildParentNote(mdcDictList, uacMenuQuery);\n\t\t}\n\t\treturn mdcDictList;\n\t}\n\n\t@Override\n\tpublic void saveMdcDict(MdcDict mdcDict, LoginAuthDto loginAuthDto) {\n\t\tLong pid = mdcDict.getPid();\n\t\tmdcDict.setUpdateInfo(loginAuthDto);\n\t\tMdcDict parentMenu = mapper.selectByPrimaryKey(pid);\n\t\tif (PublicUtil.isEmpty(parentMenu)) {\n\t\t\tthrow new MdcBizException(ErrorCodeEnum.MDC10021020, pid);\n\t\t}\n\t\tif (mdcDict.isNew()) {\n\t\t\tMdcDict updateMenu = new MdcDict();\n\t\t\tupdateMenu.setId(pid);\n\t\t\tLong dictId = super.generateId();\n\t\t\tmdcDict.setId(dictId);\n\t\t\tmapper.insertSelective(mdcDict);\n\t\t} else {\n\t\t\tmapper.updateByPrimaryKeySelective(mdcDict);\n\t\t}\n\n\t}\n\n\t@Override\n\t@Transactional(readOnly = true, rollbackFor = Exception.class)\n\tpublic boolean checkDictHasChildDict(Long dictId) {\n\t\tlogger.info(\"检查数据字典id={}是否存在生效节点\", dictId);\n\t\tMdcDict uacMenu = new MdcDict();\n\t\tuacMenu.setStatus(MdcDictStatusEnum.ENABLE.getType());\n\t\tuacMenu.setPid(dictId);\n\n\t\treturn mapper.selectCount(uacMenu) > 0;\n\t}\n\n}"
  },
  {
    "path": "paascloud-provider/paascloud-provider-mdc/src/main/java/com/paascloud/provider/service/impl/MdcExceptionLogServiceImpl.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：MdcExceptionLogServiceImpl.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.service.impl;\n\n\nimport com.github.pagehelper.PageHelper;\nimport com.github.pagehelper.PageInfo;\nimport com.paascloud.base.constant.GlobalConstant;\nimport com.paascloud.core.support.BaseService;\nimport com.paascloud.provider.mapper.MdcExceptionLogMapper;\nimport com.paascloud.provider.model.domain.MdcExceptionLog;\nimport com.paascloud.provider.model.dto.GlobalExceptionLogDto;\nimport com.paascloud.provider.model.dto.MdcExceptionQueryDto;\nimport com.paascloud.provider.model.dto.robot.ChatRobotMsgDto;\nimport com.paascloud.provider.model.factory.ChatRobotMsgFactory;\nimport com.paascloud.provider.service.MdcExceptionLogService;\nimport com.paascloud.provider.service.OpcRpcService;\nimport org.modelmapper.ModelMapper;\nimport org.springframework.beans.factory.annotation.Value;\nimport org.springframework.core.task.TaskExecutor;\nimport org.springframework.stereotype.Service;\n\nimport javax.annotation.Resource;\nimport java.util.Calendar;\nimport java.util.Date;\nimport java.util.List;\n\n/**\n * The class Mdc exception log service.\n *\n * @author paascloud.net @gmail.com\n */\n@Service\npublic class MdcExceptionLogServiceImpl extends BaseService<MdcExceptionLog> implements MdcExceptionLogService {\n\t@Resource\n\tprivate MdcExceptionLogMapper mdcExceptionLogMapper;\n\t@Resource\n\tprivate TaskExecutor taskExecutor;\n\t@Resource\n\tprivate OpcRpcService opcRpcService;\n\t@Value(\"${paascloud.dingTalk.webhookToken.sendException}\")\n\tprivate String webhookToken;\n\n\t@Override\n\tpublic void saveAndSendExceptionLog(final GlobalExceptionLogDto exceptionLogDto) {\n\t\tMdcExceptionLog exceptionLog = new ModelMapper().map(exceptionLogDto, MdcExceptionLog.class);\n\n\t\texceptionLog.setId(generateId());\n\t\texceptionLog.setCreateTime(new Date());\n\t\tmdcExceptionLogMapper.insertSelective(exceptionLog);\n\n\t\ttaskExecutor.execute(() -> {\n\t\t\tif (judgeIsSend(exceptionLogDto.getProfile())) {\n\t\t\t\tString text = exceptionLog.getApplicationName() + \"出现异常. 环境：\" + exceptionLogDto.getProfile() + \"，操作人：\" + exceptionLogDto.getCreator() + \".异常类型：\" + exceptionLogDto.getExceptionSimpleName();\n\t\t\t\tChatRobotMsgDto chatRobotMsgDto = ChatRobotMsgFactory.createChatRobotTextMsg(webhookToken, text, false, null);\n\t\t\t\topcRpcService.sendChatRobotMsg(chatRobotMsgDto);\n\t\t\t}\n\t\t});\n\n\t}\n\n\t@Override\n\tpublic PageInfo queryExceptionListWithPage(final MdcExceptionQueryDto mdcExceptionQueryDto) {\n\t\tPageHelper.startPage(mdcExceptionQueryDto.getPageNum(), mdcExceptionQueryDto.getPageSize());\n\t\tList<MdcExceptionLog> actionList = mdcExceptionLogMapper.queryExceptionListWithPage(mdcExceptionQueryDto);\n\t\treturn new PageInfo<>(actionList);\n\t}\n\n\tprivate boolean judgeIsSend(String profile) {\n\t\tCalendar calendar = Calendar.getInstance();\n\t\tint time = calendar.get(Calendar.HOUR_OF_DAY);\n\t\treturn GlobalConstant.PRO_PROFILE.equals(profile) || time >= 10 && time <= 18;\n\t}\n}"
  },
  {
    "path": "paascloud-provider/paascloud-provider-mdc/src/main/java/com/paascloud/provider/service/impl/MdcProductCategoryServiceImpl.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：MdcProductCategoryServiceImpl.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.service.impl;\n\nimport com.google.common.base.Preconditions;\nimport com.google.common.collect.Lists;\nimport com.google.common.collect.Sets;\nimport com.paascloud.PublicUtil;\nimport com.paascloud.base.dto.LoginAuthDto;\nimport com.paascloud.base.dto.UpdateStatusDto;\nimport com.paascloud.base.enums.ErrorCodeEnum;\nimport com.paascloud.core.support.BaseService;\nimport com.paascloud.core.support.TreeUtils;\nimport com.paascloud.provider.exceptions.MdcBizException;\nimport com.paascloud.provider.mapper.MdcProductCategoryMapper;\nimport com.paascloud.provider.model.domain.MdcProductCategory;\nimport com.paascloud.provider.model.dto.ProductCategoryDto;\nimport com.paascloud.provider.model.enums.MdcCategoryStatusEnum;\nimport com.paascloud.provider.model.vo.MdcCategoryVo;\nimport com.paascloud.provider.service.MdcProductCategoryService;\nimport org.modelmapper.ModelMapper;\nimport org.springframework.stereotype.Service;\nimport org.springframework.transaction.annotation.Transactional;\n\nimport javax.annotation.Resource;\nimport java.util.List;\nimport java.util.Set;\n\n/**\n * The class Mdc product category service.\n *\n * @author paascloud.net@gmail.com\n */\n@Service\n@Transactional(rollbackFor = Exception.class)\npublic class MdcProductCategoryServiceImpl extends BaseService<MdcProductCategory> implements MdcProductCategoryService {\n\t@Resource\n\tprivate MdcProductCategoryMapper mdcProductCategoryMapper;\n\n\t@Override\n\tpublic List<ProductCategoryDto> getCategoryDtoList(Long categoryId) {\n\t\treturn mdcProductCategoryMapper.selectCategoryDtoList(categoryId);\n\t}\n\n\t@Override\n\tpublic List<Long> selectCategoryAndChildrenById(Long categoryId) {\n\t\tSet<MdcProductCategory> categorySet = Sets.newHashSet();\n\t\tfindChildCategory(categorySet, categoryId);\n\n\n\t\tList<Long> categoryIdList = Lists.newArrayList();\n\t\tif (categoryId != null) {\n\t\t\tfor (MdcProductCategory categoryItem : categorySet) {\n\t\t\t\tcategoryIdList.add(categoryItem.getId());\n\t\t\t}\n\t\t}\n\t\treturn categoryIdList;\n\t}\n\n\t@Override\n\tpublic MdcProductCategory getByCategoryId(Long categoryId) {\n\t\tPreconditions.checkArgument(categoryId != null, \"分类ID不能为空\");\n\n\t\tMdcProductCategory query = new MdcProductCategory();\n\t\tquery.setId(categoryId);\n\t\treturn mdcProductCategoryMapper.selectOne(query);\n\t}\n\n\t@Override\n\tpublic List<MdcCategoryVo> getCategoryTreeList() {\n\t\tList<MdcCategoryVo> list = mdcProductCategoryMapper.listCategoryVo();\n\t\treturn new TreeUtils().getChildTreeObjects(list, 0L);\n\t}\n\n\t@Override\n\tpublic MdcCategoryVo getMdcCategoryVoById(final Long categoryId) {\n\t\tMdcProductCategory category = mdcProductCategoryMapper.selectByPrimaryKey(categoryId);\n\n\t\tif (category == null) {\n\t\t\tlogger.error(\"找不到数据字典信息id={}\", categoryId);\n\t\t\tthrow new MdcBizException(ErrorCodeEnum.MDC10023001, categoryId);\n\t\t}\n\n\t\t// 获取父级菜单信息\n\t\tMdcProductCategory parentCategory = mdcProductCategoryMapper.selectByPrimaryKey(category.getPid());\n\n\t\tModelMapper modelMapper = new ModelMapper();\n\t\tMdcCategoryVo categoryVo = modelMapper.map(category, MdcCategoryVo.class);\n\t\tcategoryVo.setId(category.getId());\n\t\tcategoryVo.setPid(category.getPid());\n\t\tif (parentCategory != null) {\n\t\t\tcategoryVo.setParentCategoryName(parentCategory.getName());\n\t\t}\n\n\t\treturn categoryVo;\n\t}\n\n\t@Override\n\tpublic void updateMdcCategoryStatusById(final UpdateStatusDto updateStatusDto, final LoginAuthDto loginAuthDto) {\n\t\tLong id = updateStatusDto.getId();\n\t\tInteger status = updateStatusDto.getStatus();\n\t\t// 要处理的菜单集合\n\t\tList<MdcProductCategory> mdcCategoryList = Lists.newArrayList();\n\n\t\tint result;\n\t\tif (status.equals(MdcCategoryStatusEnum.DISABLE.getType())) {\n\t\t\t// 获取菜单以及子菜单\n\t\t\tmdcCategoryList = this.getAllCategoryFolder(id, MdcCategoryStatusEnum.ENABLE.getType());\n\t\t} else {\n\t\t\t// 获取菜单、其子菜单以及父菜单\n\t\t\tMdcProductCategory uacMenu = new MdcProductCategory();\n\t\t\tuacMenu.setPid(id);\n\t\t\tresult = this.selectCount(uacMenu);\n\t\t\t// 此菜单含有子菜单\n\t\t\tif (result > 0) {\n\t\t\t\tmdcCategoryList = this.getAllCategoryFolder(id, MdcCategoryStatusEnum.DISABLE.getType());\n\t\t\t}\n\t\t\tList<MdcProductCategory> categoryListTemp = this.getAllParentCategoryFolderByMenuId(id);\n\t\t\tfor (MdcProductCategory category : categoryListTemp) {\n\t\t\t\tif (!mdcCategoryList.contains(category)) {\n\t\t\t\t\tmdcCategoryList.add(category);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tthis.updateCategoryStatus(mdcCategoryList, loginAuthDto, status);\n\t}\n\n\t@Override\n\tpublic void saveMdcCategory(final MdcProductCategory mdcCategory, final LoginAuthDto loginAuthDto) {\n\t\tLong pid = mdcCategory.getPid();\n\t\tmdcCategory.setUpdateInfo(loginAuthDto);\n\t\tMdcProductCategory parentMenu = mapper.selectByPrimaryKey(pid);\n\t\tif (PublicUtil.isEmpty(parentMenu)) {\n\t\t\tthrow new MdcBizException(ErrorCodeEnum.MDC10023002, pid);\n\t\t}\n\t\tif (mdcCategory.isNew()) {\n\t\t\tMdcProductCategory updateMenu = new MdcProductCategory();\n\t\t\tupdateMenu.setId(pid);\n\t\t\tLong categoryId = super.generateId();\n\t\t\tmdcCategory.setId(categoryId);\n\t\t\tmapper.insertSelective(mdcCategory);\n\t\t} else {\n\t\t\tmapper.updateByPrimaryKeySelective(mdcCategory);\n\t\t}\n\t}\n\n\t@Override\n\tpublic boolean checkCategoryHasChildCategory(final Long categoryId) {\n\t\tlogger.info(\"检查数据字典id={}是否存在生效节点\", categoryId);\n\t\tMdcProductCategory uacMenu = new MdcProductCategory();\n\t\tuacMenu.setStatus(MdcCategoryStatusEnum.ENABLE.getType());\n\t\tuacMenu.setPid(categoryId);\n\n\t\treturn mapper.selectCount(uacMenu) > 0;\n\t}\n\n\t/**\n\t * 递归算法,算出子节点\n\t */\n\tprivate Set<MdcProductCategory> findChildCategory(Set<MdcProductCategory> categorySet, Long categoryId) {\n\t\tMdcProductCategory category = mdcProductCategoryMapper.selectByPrimaryKey(categoryId);\n\t\tif (category != null) {\n\t\t\tcategorySet.add(category);\n\t\t}\n\t\t//查找子节点,递归算法一定要有一个退出的条件\n\t\tList<MdcProductCategory> categoryList = this.getProductCategoryListByPid(categoryId);\n\t\tfor (MdcProductCategory categoryItem : categoryList) {\n\t\t\tfindChildCategory(categorySet, categoryItem.getId());\n\t\t}\n\t\treturn categorySet;\n\t}\n\n\t@Override\n\tpublic List<MdcProductCategory> getProductCategoryListByPid(Long pid) {\n\t\tPreconditions.checkArgument(pid != null, \"pid is null\");\n\t\tMdcProductCategory query = new MdcProductCategory();\n\t\tquery.setPid(pid);\n\n\t\treturn mdcProductCategoryMapper.select(query);\n\t}\n\n\tprivate void updateCategoryStatus(List<MdcProductCategory> mdcCategoryList, LoginAuthDto loginAuthDto, int status) {\n\t\tMdcProductCategory update = new MdcProductCategory();\n\t\tfor (MdcProductCategory category : mdcCategoryList) {\n\t\t\tupdate.setId(category.getId());\n\t\t\tupdate.setVersion(category.getVersion() + 1);\n\t\t\tupdate.setStatus(status);\n\t\t\tupdate.setUpdateInfo(loginAuthDto);\n\t\t\tint result = mapper.updateByPrimaryKeySelective(update);\n\t\t\tif (result < 1) {\n\t\t\t\tthrow new MdcBizException(ErrorCodeEnum.MDC10023003, category.getId());\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate List<MdcProductCategory> getAllCategoryFolder(Long id, int categoryStatus) {\n\t\tMdcProductCategory mdcCategory = new MdcProductCategory();\n\t\tmdcCategory.setId(id);\n\t\tmdcCategory = mapper.selectOne(mdcCategory);\n\t\tList<MdcProductCategory> mdcCategoryList = Lists.newArrayList();\n\t\tmdcCategoryList = buildNode(mdcCategoryList, mdcCategory, categoryStatus);\n\t\treturn mdcCategoryList;\n\t}\n\n\tprivate List<MdcProductCategory> getAllParentCategoryFolderByMenuId(Long categoryId) {\n\t\tMdcProductCategory mdcCategoryQuery = new MdcProductCategory();\n\t\tmdcCategoryQuery.setId(categoryId);\n\t\tmdcCategoryQuery = mapper.selectOne(mdcCategoryQuery);\n\t\tList<MdcProductCategory> mdcCategoryList = Lists.newArrayList();\n\t\tmdcCategoryList = buildParentNote(mdcCategoryList, mdcCategoryQuery);\n\t\treturn mdcCategoryList;\n\t}\n\n\t/**\n\t * 递归获取菜单的子节点\n\t */\n\tprivate List<MdcProductCategory> buildNode(List<MdcProductCategory> mdcCategoryList, MdcProductCategory uacMenu, int categoryStatus) {\n\t\tList<MdcProductCategory> uacMenuQueryList = mapper.select(uacMenu);\n\t\tMdcProductCategory uacMenuQuery;\n\t\tfor (MdcProductCategory category : uacMenuQueryList) {\n\t\t\tif (categoryStatus == category.getStatus()) {\n\t\t\t\tmdcCategoryList.add(category);\n\t\t\t}\n\t\t\tuacMenuQuery = new MdcProductCategory();\n\t\t\tuacMenuQuery.setPid(category.getId());\n\t\t\tbuildNode(mdcCategoryList, uacMenuQuery, categoryStatus);\n\t\t}\n\t\treturn mdcCategoryList;\n\t}\n\n\t/**\n\t * 递归获取菜单的父菜单\n\t */\n\tprivate List<MdcProductCategory> buildParentNote(List<MdcProductCategory> mdcCategoryList, MdcProductCategory mdcCategory) {\n\t\tList<MdcProductCategory> mdcCategoryQueryList = mapper.select(mdcCategory);\n\t\tMdcProductCategory uacMenuQuery;\n\t\tfor (MdcProductCategory category : mdcCategoryQueryList) {\n\t\t\tif (MdcCategoryStatusEnum.DISABLE.getType() == category.getStatus()) {\n\t\t\t\tmdcCategoryList.add(category);\n\t\t\t}\n\t\t\tuacMenuQuery = new MdcProductCategory();\n\t\t\tuacMenuQuery.setId(category.getPid());\n\t\t\tbuildParentNote(mdcCategoryList, uacMenuQuery);\n\t\t}\n\t\treturn mdcCategoryList;\n\t}\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-mdc/src/main/java/com/paascloud/provider/service/impl/MdcProductServiceImpl.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：MdcProductServiceImpl.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.service.impl;\n\nimport com.alibaba.fastjson.JSON;\nimport com.google.common.base.Joiner;\nimport com.google.common.base.Preconditions;\nimport com.google.common.base.Splitter;\nimport com.google.common.collect.Lists;\nimport com.paascloud.PubUtils;\nimport com.paascloud.PublicUtil;\nimport com.paascloud.RedisKeyUtil;\nimport com.paascloud.base.constant.AliyunMqTopicConstants;\nimport com.paascloud.base.constant.GlobalConstant;\nimport com.paascloud.base.dto.LoginAuthDto;\nimport com.paascloud.base.enums.ErrorCodeEnum;\nimport com.paascloud.core.support.BaseService;\nimport com.paascloud.provider.exceptions.MdcBizException;\nimport com.paascloud.provider.manager.MdcProductManager;\nimport com.paascloud.provider.mapper.MdcProductMapper;\nimport com.paascloud.provider.model.constant.MallConstant;\nimport com.paascloud.provider.model.domain.MdcProduct;\nimport com.paascloud.provider.model.domain.MdcProductCategory;\nimport com.paascloud.provider.model.domain.MqMessageData;\nimport com.paascloud.provider.model.dto.MdcEditProductDto;\nimport com.paascloud.provider.model.dto.ProductDto;\nimport com.paascloud.provider.model.dto.UpdateAttachmentDto;\nimport com.paascloud.provider.model.dto.oss.ElementImgUrlDto;\nimport com.paascloud.provider.model.dto.oss.OptBatchGetUrlRequest;\nimport com.paascloud.provider.model.dto.oss.OptGetUrlRequest;\nimport com.paascloud.provider.model.vo.ProductDetailVo;\nimport com.paascloud.provider.model.vo.ProductVo;\nimport com.paascloud.provider.service.MdcProductCategoryService;\nimport com.paascloud.provider.service.MdcProductService;\nimport com.paascloud.provider.service.OpcRpcService;\nimport org.apache.commons.lang3.StringUtils;\nimport org.modelmapper.ModelMapper;\nimport org.springframework.beans.BeanUtils;\nimport org.springframework.stereotype.Service;\nimport org.springframework.transaction.annotation.Transactional;\n\nimport javax.annotation.Resource;\nimport java.util.Collections;\nimport java.util.List;\n\n/**\n * The class Mdc product service.\n *\n * @author paascloud.net@gmail.com\n */\n@Service\n@Transactional(rollbackFor = Exception.class)\npublic class MdcProductServiceImpl extends BaseService<MdcProduct> implements MdcProductService {\n\n\t@Resource\n\tprivate MdcProductMapper mdcProductMapper;\n\t@Resource\n\tprivate MdcProductCategoryService mdcProductCategoryService;\n\t@Resource\n\tprivate MdcProductManager mdcProductManager;\n\t@Resource\n\tprivate OpcRpcService opcRpcService;\n\n\t@Override\n\tpublic List<MdcProduct> selectByNameAndCategoryIds(String productName, List<Long> categoryIdList, String orderBy) {\n\t\treturn mdcProductMapper.selectByNameAndCategoryIds(productName, categoryIdList, orderBy);\n\t}\n\n\t@Override\n\tpublic ProductDetailVo getProductDetail(Long productId) {\n\t\tlogger.info(\"获取商品明细信息, productId={}\", productId);\n\t\tPreconditions.checkArgument(productId != null, ErrorCodeEnum.MDC10021021.msg());\n\n\t\tMdcProduct product = mdcProductMapper.selectByPrimaryKey(productId);\n\t\tif (product == null) {\n\t\t\tthrow new MdcBizException(ErrorCodeEnum.MDC10021017, productId);\n\t\t}\n\t\tif (product.getStatus() != MallConstant.ProductStatusEnum.ON_SALE.getCode()) {\n\t\t\tthrow new MdcBizException(ErrorCodeEnum.MDC10021017, productId);\n\t\t}\n\n\t\treturn assembleProductDetailVo(product);\n\t}\n\n\t@Override\n\tpublic int updateProductStockById(ProductDto productDto) {\n\t\tPreconditions.checkArgument(!PubUtils.isNull(productDto, productDto.getId()), ErrorCodeEnum.MDC10021021.msg());\n\t\treturn mdcProductMapper.updateProductStockById(productDto);\n\t}\n\n\t@Override\n\tpublic List<ProductVo> queryProductListWithPage(final MdcProduct mdcProduct) {\n\t\treturn mdcProductMapper.queryProductListWithPage(mdcProduct);\n\t}\n\n\t@Override\n\tpublic void saveProduct(final MdcEditProductDto mdcEditProductDto, final LoginAuthDto loginAuthDto) {\n\t\tString productCode = mdcEditProductDto.getProductCode();\n\t\tMdcProduct product = new MdcProduct();\n\t\tBeanUtils.copyProperties(mdcEditProductDto, product);\n\t\tList<Long> categoryIdList = mdcEditProductDto.getCategoryIdList();\n\t\tLong categoryId = categoryIdList.get(categoryIdList.size() - 1);\n\t\tproduct.setCategoryId(categoryId);\n\t\tList<Long> attachmentIdList = mdcEditProductDto.getAttachmentIdList();\n\t\tproduct.setUpdateInfo(loginAuthDto);\n\t\tif (PublicUtil.isNotEmpty(attachmentIdList)) {\n\t\t\tproduct.setMainImage(String.valueOf(attachmentIdList.get(0)));\n\t\t\tproduct.setSubImages(Joiner.on(GlobalConstant.Symbol.COMMA).join(attachmentIdList));\n\t\t}\n\t\tMqMessageData mqMessageData;\n\t\tif (product.isNew()) {\n\t\t\tproductCode = String.valueOf(generateId());\n\t\t} else {\n\t\t\tPreconditions.checkArgument(StringUtils.isNotEmpty(productCode), ErrorCodeEnum.MDC10021024.msg());\n\t\t}\n\t\tproduct.setProductCode(productCode);\n\t\tUpdateAttachmentDto updateAttachmentDto = new UpdateAttachmentDto(productCode, attachmentIdList, loginAuthDto);\n\n\t\tString body = JSON.toJSONString(updateAttachmentDto);\n\t\tString topic = AliyunMqTopicConstants.MqTagEnum.UPDATE_ATTACHMENT.getTopic();\n\t\tString tag = AliyunMqTopicConstants.MqTagEnum.UPDATE_ATTACHMENT.getTag();\n\t\tString key = RedisKeyUtil.createMqKey(topic, tag, product.getProductCode(), body);\n\n\t\tif (product.isNew() && PublicUtil.isNotEmpty(attachmentIdList)) {\n\t\t\tproduct.setId(generateId());\n\t\t\tmqMessageData = new MqMessageData(body, topic, tag, key);\n\t\t\tmdcProductManager.saveProduct(mqMessageData, product, true);\n\t\t} else if (product.isNew() && PublicUtil.isEmpty(attachmentIdList)) {\n\t\t\tproduct.setId(generateId());\n\t\t\tmdcProductMapper.insertSelective(product);\n\t\t} else {\n\t\t\tmqMessageData = new MqMessageData(body, topic, tag, key);\n\t\t\tmdcProductManager.saveProduct(mqMessageData, product, false);\n\t\t}\n\t}\n\n\t@Override\n\tpublic void deleteProductById(final Long id) {\n\t\tMdcProduct product = mdcProductMapper.selectByPrimaryKey(id);\n\t\tif (product != null) {\n\t\t\tString body = product.getProductCode();\n\t\t\tString topic = AliyunMqTopicConstants.MqTagEnum.DELETE_ATTACHMENT.getTopic();\n\t\t\tString tag = AliyunMqTopicConstants.MqTagEnum.DELETE_ATTACHMENT.getTag();\n\t\t\tString key = RedisKeyUtil.createMqKey(topic, tag, product.getProductCode(), body);\n\t\t\tMqMessageData mqMessageData = new MqMessageData(body, topic, tag, key);\n\t\t\tmdcProductManager.deleteProduct(mqMessageData, id);\n\t\t}\n\t}\n\n\t@Override\n\tpublic ProductVo getProductVo(final Long id) {\n\t\tMdcProduct mdcProduct = mdcProductMapper.selectByPrimaryKey(id);\n\t\tProductVo productVo = new ModelMapper().map(mdcProduct, ProductVo.class);\n\t\tList<Long> categoryIdList = Lists.newArrayList();\n\t\tbuildCategoryIdList(categoryIdList, mdcProduct.getCategoryId());\n\t\t// 获取分类节点集合\n\t\tCollections.reverse(categoryIdList);\n\t\tproductVo.setCategoryIdList(categoryIdList);\n\t\t// 获取图片集合\n\t\tfinal OptBatchGetUrlRequest request = new OptBatchGetUrlRequest(mdcProduct.getProductCode());\n\t\trequest.setEncrypt(true);\n\t\tList<ElementImgUrlDto> imgUrlList = opcRpcService.listFileUrl(request);\n\t\tproductVo.setImgUrlList(imgUrlList);\n\t\treturn productVo;\n\t}\n\n\t@Override\n\tpublic String getMainImage(final Long productId) {\n\t\tMdcProduct product = mdcProductMapper.selectByPrimaryKey(productId);\n\t\tString url = null;\n\n\t\tif (product != null) {\n\t\t\tfinal OptGetUrlRequest request = new OptGetUrlRequest();\n\t\t\trequest.setEncrypt(true);\n\t\t\trequest.setAttachmentId(Long.valueOf(product.getMainImage()));\n\t\t\trequest.setExpires(3600 * 12 * 7L);\n\t\t\turl = opcRpcService.getFileUrl(request);\n\t\t}\n\t\treturn url;\n\t}\n\n\tprivate List<Long> buildCategoryIdList(List<Long> categoryIdList, Long categoryId) {\n\t\tMdcProductCategory category = mdcProductCategoryService.getByCategoryId(categoryId);\n\t\tif (category != null) {\n\t\t\tcategoryIdList.add(categoryId);\n\t\t\tbuildCategoryIdList(categoryIdList, category.getPid());\n\t\t}\n\t\treturn categoryIdList;\n\t}\n\n\tprivate ProductDetailVo assembleProductDetailVo(MdcProduct product) {\n\t\tProductDetailVo productDetailVo = new ProductDetailVo();\n\t\tString mainImage = product.getMainImage();\n\t\tString subImages = product.getSubImages();\n\t\tif (StringUtils.isNotEmpty(mainImage)) {\n\t\t\t// 图片查询\n\t\t\tOptGetUrlRequest request = new OptGetUrlRequest();\n\t\t\trequest.setAttachmentId(Long.valueOf(mainImage));\n\t\t\trequest.setEncrypt(true);\n\t\t\tString url = opcRpcService.getFileUrl(request);\n\t\t\tproductDetailVo.setMainImage(url);\n\t\t}\n\t\tif (StringUtils.isNotEmpty(subImages)) {\n\t\t\tList<String> urlList = Lists.newArrayList();\n\t\t\tList<String> subImageList = Splitter.on(GlobalConstant.Symbol.COMMA).trimResults().splitToList(subImages);\n\t\t\tfor (final String subImage : subImageList) {\n\t\t\t\tOptGetUrlRequest request = new OptGetUrlRequest();\n\t\t\t\trequest.setAttachmentId(Long.valueOf(subImage));\n\t\t\t\trequest.setEncrypt(true);\n\t\t\t\tString url = opcRpcService.getFileUrl(request);\n\t\t\t\turlList.add(url);\n\t\t\t}\n\t\t\tproductDetailVo.setSubImages(Joiner.on(GlobalConstant.Symbol.COMMA).join(urlList));\n\t\t}\n\n\t\tproductDetailVo.setId(product.getId());\n\t\tproductDetailVo.setSubtitle(product.getSubtitle());\n\t\tproductDetailVo.setPrice(product.getPrice());\n\n\t\tproductDetailVo.setDetail(product.getDetail());\n\t\tproductDetailVo.setName(product.getName());\n\t\tproductDetailVo.setStatus(product.getStatus());\n\t\tproductDetailVo.setStock(product.getStock());\n\n\t\tproductDetailVo.setImageHost(\"\");\n\n\t\tMdcProductCategory category = mdcProductCategoryService.getByCategoryId(product.getId());\n\t\tif (category == null) {\n\t\t\t//默认根节点\n\t\t\tproductDetailVo.setPid(0L);\n\t\t} else {\n\t\t\tproductDetailVo.setPid(category.getPid());\n\t\t}\n\n\t\treturn productDetailVo;\n\t}\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-mdc/src/main/java/com/paascloud/provider/web/GlobalExceptionHandler.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：GlobalExceptionHandler.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.web;\n\n\nimport com.paascloud.base.enums.ErrorCodeEnum;\nimport com.paascloud.base.exception.BusinessException;\nimport com.paascloud.provider.model.dto.GlobalExceptionLogDto;\nimport com.paascloud.provider.service.MdcExceptionLogFeignApi;\nimport com.paascloud.wrapper.WrapMapper;\nimport com.paascloud.wrapper.Wrapper;\nimport lombok.extern.slf4j.Slf4j;\nimport org.springframework.beans.factory.annotation.Value;\nimport org.springframework.core.task.TaskExecutor;\nimport org.springframework.http.HttpStatus;\nimport org.springframework.web.bind.annotation.ExceptionHandler;\nimport org.springframework.web.bind.annotation.ResponseBody;\nimport org.springframework.web.bind.annotation.ResponseStatus;\nimport org.springframework.web.bind.annotation.RestControllerAdvice;\n\nimport javax.annotation.Resource;\n\n/**\n * 全局的的异常拦截器\n *\n * @author paascloud.net @gmail.com\n */\n@Slf4j\n@RestControllerAdvice\npublic class GlobalExceptionHandler {\n\t@Resource\n\tprivate TaskExecutor taskExecutor;\n\t@Value(\"${spring.profiles.active}\")\n\tString profile;\n\t@Value(\"${spring.application.name}\")\n\tString applicationName;\n\t@Resource\n\tprivate MdcExceptionLogFeignApi mdcExceptionLogFeignApi;\n\n\t/**\n\t * 参数非法异常.\n\t *\n\t * @param e the e\n\t *\n\t * @return the wrapper\n\t */\n\t@ExceptionHandler(IllegalArgumentException.class)\n\t@ResponseStatus(HttpStatus.OK)\n\t@ResponseBody\n\tpublic Wrapper illegalArgumentException(IllegalArgumentException e) {\n\t\tlog.error(\"参数非法异常={}\", e.getMessage(), e);\n\t\treturn WrapMapper.wrap(ErrorCodeEnum.GL99990100.code(), e.getMessage());\n\t}\n\n\t/**\n\t * 业务异常.\n\t *\n\t * @param e the e\n\t *\n\t * @return the wrapper\n\t */\n\t@ExceptionHandler(BusinessException.class)\n\t@ResponseStatus(HttpStatus.OK)\n\t@ResponseBody\n\tpublic Wrapper businessException(BusinessException e) {\n\t\tlog.error(\"业务异常={}\", e.getMessage(), e);\n\t\treturn WrapMapper.wrap(e.getCode() == 0 ? Wrapper.ERROR_CODE : e.getCode(), e.getMessage());\n\t}\n\n\n\t/**\n\t * 全局异常.\n\t *\n\t * @param e the e\n\t *\n\t * @return the wrapper\n\t */\n\t@ExceptionHandler(Exception.class)\n\t@ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)\n\t@ResponseBody\n\tpublic Wrapper exception(Exception e) {\n\t\tlog.info(\"保存全局异常信息 ex={}\", e.getMessage(), e);\n\t\ttaskExecutor.execute(() -> {\n\t\t\tGlobalExceptionLogDto globalExceptionLogDto = new GlobalExceptionLogDto().getGlobalExceptionLogDto(e, profile, applicationName);\n\t\t\tmdcExceptionLogFeignApi.saveAndSendExceptionLog(globalExceptionLogDto);\n\t\t});\n\t\treturn WrapMapper.error();\n\t}\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-mdc/src/main/java/com/paascloud/provider/web/frontend/MdcAddressRest.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：MdcAddressRest.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.web.frontend;\n\n\nimport com.paascloud.TreeNode;\nimport com.paascloud.provider.service.MdcAddressService;\nimport com.paascloud.core.support.BaseController;\nimport com.paascloud.wrapper.WrapMapper;\nimport com.paascloud.wrapper.Wrapper;\nimport io.swagger.annotations.Api;\nimport io.swagger.annotations.ApiOperation;\nimport org.springframework.http.MediaType;\nimport org.springframework.web.bind.annotation.PostMapping;\nimport org.springframework.web.bind.annotation.RequestMapping;\nimport org.springframework.web.bind.annotation.RestController;\n\nimport javax.annotation.Resource;\nimport java.util.List;\n\n/**\n * The class Mdc address rest.\n *\n * @author paascloud.net@gmail.com\n */\n@RestController\n@RequestMapping(value = \"/address\", produces = MediaType.APPLICATION_JSON_UTF8_VALUE)\n@Api(value = \"WEB - MdcAddressRest\", produces = MediaType.APPLICATION_JSON_UTF8_VALUE)\npublic class MdcAddressRest extends BaseController {\n\n\t@Resource\n\tprivate MdcAddressService mdcAddressService;\n\n\n\t/**\n\t * Gets 4 city.\n\t *\n\t * @return the 4 city\n\t */\n\t@PostMapping(value = \"/get4City\")\n\t@ApiOperation(httpMethod = \"POST\", value = \"查看四级地址\")\n\tpublic Wrapper<List<TreeNode>> get4City() {\n\t\tlogger.info(\"get4City - 获取四级地址\");\n\t\tList<TreeNode> treeNodeList = mdcAddressService.get4City();\n\t\treturn WrapMapper.ok(treeNodeList);\n\t}\n\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-mdc/src/main/java/com/paascloud/provider/web/frontend/MdcDictMainController.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：MdcDictMainController.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.web.frontend;\n\nimport com.paascloud.base.dto.LoginAuthDto;\nimport com.paascloud.base.dto.UpdateStatusDto;\nimport com.paascloud.core.support.BaseController;\nimport com.paascloud.provider.model.domain.MdcDict;\nimport com.paascloud.provider.model.dto.MdcEditDictDto;\nimport com.paascloud.provider.model.vo.MdcDictVo;\nimport com.paascloud.provider.service.MdcDictService;\nimport com.paascloud.wrapper.WrapMapper;\nimport com.paascloud.wrapper.Wrapper;\nimport io.swagger.annotations.Api;\nimport io.swagger.annotations.ApiOperation;\nimport io.swagger.annotations.ApiParam;\nimport org.springframework.beans.BeanUtils;\nimport org.springframework.http.MediaType;\nimport org.springframework.web.bind.annotation.*;\n\nimport javax.annotation.Resource;\nimport java.util.List;\n\n/**\n * The class Mdc dict main controller.\n *\n * @author paascloud.net@gmail.com\n */\n@RestController\n@RequestMapping(value = \"/dict\", produces = MediaType.APPLICATION_JSON_UTF8_VALUE)\n@Api(value = \"WEB - MdcDictMainController\", produces = MediaType.APPLICATION_JSON_UTF8_VALUE)\npublic class MdcDictMainController extends BaseController {\n\n\t@Resource\n\tprivate MdcDictService mdcDictService;\n\n\t/**\n\t * 获取字典列表数据\n\t *\n\t * @return the wrapper\n\t */\n\t@PostMapping(value = \"/getTree\")\n\t@ApiOperation(httpMethod = \"POST\", value = \"获取字典树\")\n\tpublic Wrapper<List<MdcDictVo>> queryDictTreeList() {\n\t\tList<MdcDictVo> dictVoList = mdcDictService.getDictTreeList();\n\t\treturn WrapMapper.ok(dictVoList);\n\t}\n\n\t/**\n\t * 根据ID获取字典信息.\n\t *\n\t * @param id the id\n\t *\n\t * @return the wrapper\n\t */\n\t@PostMapping(value = \"/queryById/{id}\")\n\t@ApiOperation(httpMethod = \"POST\", value = \"根据ID获取字典信息\")\n\tpublic Wrapper<MdcDictVo> queryDictVoById(@ApiParam(name = \"id\", value = \"字典id\") @PathVariable Long id) {\n\t\tlogger.info(\"根据Id查询字典信息, dictId={}\", id);\n\t\tMdcDictVo mdcDictVo = mdcDictService.getMdcDictVoById(id);\n\t\treturn WrapMapper.ok(mdcDictVo);\n\t}\n\n\n\t/**\n\t * 根据id修改字典的禁用状态\n\t *\n\t * @return the wrapper\n\t */\n\t@PostMapping(value = \"/modifyStatus\")\n\t@ApiOperation(httpMethod = \"POST\", value = \"根据id修改字典的禁用状态\")\n\tpublic Wrapper updateMdcDictStatusById(@ApiParam(name = \"mdcDictStatusDto\", value = \"修改字典状态Dto\") @RequestBody UpdateStatusDto updateStatusDto) {\n\t\tlogger.info(\"根据id修改字典的禁用状态 updateStatusDto={}\", updateStatusDto);\n\t\tLoginAuthDto loginAuthDto = getLoginAuthDto();\n\t\tmdcDictService.updateMdcDictStatusById(updateStatusDto, loginAuthDto);\n\t\treturn WrapMapper.ok();\n\t}\n\n\t@PostMapping(value = \"/save\")\n\t@ApiOperation(httpMethod = \"POST\", value = \"编辑字典\")\n\tpublic Wrapper saveDict(@ApiParam(name = \"saveDict\", value = \"编辑字典\") @RequestBody MdcEditDictDto mdcDictAddDto) {\n\t\tMdcDict mdcDict = new MdcDict();\n\t\tLoginAuthDto loginAuthDto = getLoginAuthDto();\n\t\tBeanUtils.copyProperties(mdcDictAddDto, mdcDict);\n\t\tmdcDictService.saveMdcDict(mdcDict, loginAuthDto);\n\t\treturn WrapMapper.ok();\n\t}\n\n\t/**\n\t * 根据id删除字典\n\t *\n\t * @param id the id\n\t *\n\t * @return the wrapper\n\t */\n\t@PostMapping(value = \"/deleteById/{id}\")\n\t@ApiOperation(httpMethod = \"POST\", value = \"根据id删除字典\")\n\tpublic Wrapper<Integer> deleteMdcDictById(@ApiParam(name = \"id\", value = \"字典id\") @PathVariable Long id) {\n\t\tlogger.info(\" 根据id删除字典 id={}\", id);\n\t\t// 判断此字典是否有子节点\n\t\tboolean hasChild = mdcDictService.checkDictHasChildDict(id);\n\t\tif (hasChild) {\n\t\t\treturn WrapMapper.wrap(Wrapper.ERROR_CODE, \"此字典含有子字典, 请先删除子字典\");\n\t\t}\n\n\t\tint result = mdcDictService.deleteByKey(id);\n\t\treturn super.handleResult(result);\n\t}\n}"
  },
  {
    "path": "paascloud-provider/paascloud-provider-mdc/src/main/java/com/paascloud/provider/web/frontend/MdcExceptionMainController.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：MdcExceptionMainController.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.web.frontend;\n\nimport com.github.pagehelper.PageInfo;\nimport com.paascloud.core.support.BaseController;\nimport com.paascloud.provider.model.dto.MdcExceptionQueryDto;\nimport com.paascloud.provider.service.MdcExceptionLogService;\nimport com.paascloud.wrapper.WrapMapper;\nimport com.paascloud.wrapper.Wrapper;\nimport io.swagger.annotations.Api;\nimport io.swagger.annotations.ApiOperation;\nimport io.swagger.annotations.ApiParam;\nimport org.springframework.http.MediaType;\nimport org.springframework.web.bind.annotation.PostMapping;\nimport org.springframework.web.bind.annotation.RequestBody;\nimport org.springframework.web.bind.annotation.RequestMapping;\nimport org.springframework.web.bind.annotation.RestController;\n\nimport javax.annotation.Resource;\n\n/**\n * 异常管理.\n *\n * @author paascloud.net @gmail.com\n */\n@RestController\n@RequestMapping(value = \"/exception\", produces = MediaType.APPLICATION_JSON_UTF8_VALUE)\n@Api(value = \"Web - MdcExceptionMainController\", produces = MediaType.APPLICATION_JSON_UTF8_VALUE)\npublic class MdcExceptionMainController extends BaseController {\n\t@Resource\n\tprivate MdcExceptionLogService mdcExceptionLogService;\n\n\t/**\n\t * 异常日志列表.\n\t *\n\t * @param mdcExceptionQueryDto the mdc exception query dto\n\t *\n\t * @return the wrapper\n\t */\n\t@PostMapping(value = \"/queryListWithPage\")\n\t@ApiOperation(httpMethod = \"POST\", value = \"查询日志列表\")\n\tpublic Wrapper queryLogListWithPage(@ApiParam(name = \"mdcExceptionQueryDto\", value = \"异常查询条件\") @RequestBody MdcExceptionQueryDto mdcExceptionQueryDto) {\n\t\tlogger.info(\"查询日志处理列表 mdcExceptionQueryDto={}\", mdcExceptionQueryDto);\n\t\tPageInfo pageInfo = mdcExceptionLogService.queryExceptionListWithPage(mdcExceptionQueryDto);\n\t\treturn WrapMapper.ok(pageInfo);\n\t}\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-mdc/src/main/java/com/paascloud/provider/web/frontend/MdcProductCategoryMainController.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：MdcProductCategoryMainController.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.web.frontend;\n\nimport com.paascloud.base.dto.LoginAuthDto;\nimport com.paascloud.base.dto.UpdateStatusDto;\nimport com.paascloud.core.annotation.LogAnnotation;\nimport com.paascloud.core.support.BaseController;\nimport com.paascloud.provider.model.domain.MdcProductCategory;\nimport com.paascloud.provider.model.dto.MdcEditCategoryDto;\nimport com.paascloud.provider.model.vo.MdcCategoryVo;\nimport com.paascloud.provider.service.MdcProductCategoryService;\nimport com.paascloud.wrapper.WrapMapper;\nimport com.paascloud.wrapper.Wrapper;\nimport io.swagger.annotations.Api;\nimport io.swagger.annotations.ApiOperation;\nimport io.swagger.annotations.ApiParam;\nimport org.springframework.beans.BeanUtils;\nimport org.springframework.http.MediaType;\nimport org.springframework.web.bind.annotation.*;\n\nimport javax.annotation.Resource;\nimport java.util.List;\n\n/**\n * The class Mdc category main controller.\n *\n * @author paascloud.net@gmail.com\n */\n@RestController\n@RequestMapping(value = \"/category\", produces = MediaType.APPLICATION_JSON_UTF8_VALUE)\n@Api(value = \"WEB - MdcProductCategoryMainController\", produces = MediaType.APPLICATION_JSON_UTF8_VALUE)\npublic class MdcProductCategoryMainController extends BaseController {\n\n\t@Resource\n\tprivate MdcProductCategoryService mdcProductCategoryService;\n\n\t/**\n\t * 获取商品分类列表数据\n\t *\n\t * @return the wrapper\n\t */\n\t@PostMapping(value = \"/getTree\")\n\t@ApiOperation(httpMethod = \"POST\", value = \"获取商品分类树\")\n\tpublic Wrapper<List<MdcCategoryVo>> queryCategoryTreeList() {\n\t\tList<MdcCategoryVo> categoryVoList = mdcProductCategoryService.getCategoryTreeList();\n\t\treturn WrapMapper.ok(categoryVoList);\n\t}\n\n\t/**\n\t * 根据ID获取商品分类信息.\n\t *\n\t * @param id the id\n\t *\n\t * @return the wrapper\n\t */\n\t@PostMapping(value = \"/queryById/{id}\")\n\t@ApiOperation(httpMethod = \"POST\", value = \"根据ID获取商品分类信息\")\n\tpublic Wrapper<MdcCategoryVo> queryCategoryVoById(@ApiParam(name = \"id\", value = \"商品分类id\") @PathVariable Long id) {\n\t\tlogger.info(\"根据Id查询商品分类信息, categoryId={}\", id);\n\t\tMdcCategoryVo mdcCategoryVo = mdcProductCategoryService.getMdcCategoryVoById(id);\n\t\treturn WrapMapper.ok(mdcCategoryVo);\n\t}\n\n\n\t/**\n\t * 根据id修改商品分类的禁用状态\n\t *\n\t * @return the wrapper\n\t */\n\t@PostMapping(value = \"/modifyStatus\")\n\t@ApiOperation(httpMethod = \"POST\", value = \"根据id修改商品分类的禁用状态\")\n\t@LogAnnotation\n\tpublic Wrapper updateMdcCategoryStatusById(@ApiParam(name = \"mdcCategoryStatusDto\", value = \"修改商品分类状态Dto\") @RequestBody UpdateStatusDto updateStatusDto) {\n\t\tlogger.info(\"根据id修改商品分类的禁用状态 updateStatusDto={}\", updateStatusDto);\n\t\tLoginAuthDto loginAuthDto = getLoginAuthDto();\n\t\tmdcProductCategoryService.updateMdcCategoryStatusById(updateStatusDto, loginAuthDto);\n\t\treturn WrapMapper.ok();\n\t}\n\n\t@PostMapping(value = \"/save\")\n\t@ApiOperation(httpMethod = \"POST\", value = \"编辑商品分类\")\n\t@LogAnnotation\n\tpublic Wrapper saveCategory(@ApiParam(name = \"saveCategory\", value = \"编辑商品分类\") @RequestBody MdcEditCategoryDto mdcCategoryAddDto) {\n\t\tMdcProductCategory mdcCategory = new MdcProductCategory();\n\t\tLoginAuthDto loginAuthDto = getLoginAuthDto();\n\t\tBeanUtils.copyProperties(mdcCategoryAddDto, mdcCategory);\n\t\tmdcProductCategoryService.saveMdcCategory(mdcCategory, loginAuthDto);\n\t\treturn WrapMapper.ok();\n\t}\n\n\t/**\n\t * 根据id删除商品分类\n\t *\n\t * @param id the id\n\t *\n\t * @return the wrapper\n\t */\n\t@PostMapping(value = \"/deleteById/{id}\")\n\t@ApiOperation(httpMethod = \"POST\", value = \"根据id删除商品分类\")\n\t@LogAnnotation\n\tpublic Wrapper<Integer> deleteMdcCategoryById(@ApiParam(name = \"id\", value = \"商品分类id\") @PathVariable Long id) {\n\t\tlogger.info(\" 根据id删除商品分类 id={}\", id);\n\t\t// 判断此商品分类是否有子节点\n\t\tboolean hasChild = mdcProductCategoryService.checkCategoryHasChildCategory(id);\n\t\tif (hasChild) {\n\t\t\treturn WrapMapper.wrap(Wrapper.ERROR_CODE, \"此商品分类含有子商品分类, 请先删除子商品分类\");\n\t\t}\n\n\t\tint result = mdcProductCategoryService.deleteByKey(id);\n\t\treturn super.handleResult(result);\n\t}\n}"
  },
  {
    "path": "paascloud-provider/paascloud-provider-mdc/src/main/java/com/paascloud/provider/web/frontend/MdcProductMainController.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：MdcProductMainController.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.web.frontend;\n\nimport com.github.pagehelper.PageHelper;\nimport com.github.pagehelper.PageInfo;\nimport com.paascloud.core.annotation.LogAnnotation;\nimport com.paascloud.core.support.BaseController;\nimport com.paascloud.provider.model.domain.MdcProduct;\nimport com.paascloud.provider.model.dto.MdcEditProductDto;\nimport com.paascloud.provider.model.vo.ProductVo;\nimport com.paascloud.provider.service.MdcProductService;\nimport com.paascloud.wrapper.WrapMapper;\nimport com.paascloud.wrapper.Wrapper;\nimport io.swagger.annotations.Api;\nimport io.swagger.annotations.ApiOperation;\nimport io.swagger.annotations.ApiParam;\nimport org.springframework.http.MediaType;\nimport org.springframework.web.bind.annotation.*;\n\nimport javax.annotation.Resource;\nimport java.util.List;\n\n/**\n * The class Mdc dict main controller.\n *\n * @author paascloud.net @gmail.com\n */\n@RestController\n@RequestMapping(value = \"/product\", produces = MediaType.APPLICATION_JSON_UTF8_VALUE)\n@Api(value = \"WEB - MdcProductMainController\", produces = MediaType.APPLICATION_JSON_UTF8_VALUE)\npublic class MdcProductMainController extends BaseController {\n\n\t@Resource\n\tprivate MdcProductService mdcProductService;\n\n\t/**\n\t * 分页查询商品列表.\n\t *\n\t * @param mdcProduct the mdc product\n\t *\n\t * @return the wrapper\n\t */\n\t@PostMapping(value = \"/queryProductListWithPage\")\n\t@ApiOperation(httpMethod = \"POST\", value = \"分页查询商品列表\")\n\tpublic Wrapper<PageInfo<ProductVo>> queryProductListWithPage(@ApiParam(name = \"mdcProduct\", value = \"商品信息\") @RequestBody MdcProduct mdcProduct) {\n\n\t\tlogger.info(\"分页查询商品列表, mdcProduct={}\", mdcProduct);\n\t\tPageHelper.startPage(mdcProduct.getPageNum(), mdcProduct.getPageSize());\n\t\tmdcProduct.setOrderBy(\"update_time desc\");\n\t\tList<ProductVo> roleVoList = mdcProductService.queryProductListWithPage(mdcProduct);\n\t\treturn WrapMapper.ok(new PageInfo<>(roleVoList));\n\t}\n\n\t/**\n\t * 商品详情.\n\t */\n\t@PostMapping(value = \"/getById/{id}\")\n\t@ApiOperation(httpMethod = \"POST\", value = \"分页查询商品列表\")\n\tpublic Wrapper<ProductVo> getById(@PathVariable Long id) {\n\t\tlogger.info(\"查询商品详情, id={}\", id);\n\t\tProductVo productVo = mdcProductService.getProductVo(id);\n\t\treturn WrapMapper.ok(productVo);\n\t}\n\n\t@PostMapping(value = \"/save\")\n\t@ApiOperation(httpMethod = \"POST\", value = \"编辑商品\")\n\t@LogAnnotation\n\tpublic Wrapper saveCategory(@RequestBody MdcEditProductDto mdcCategoryAddDto) {\n\t\tlogger.info(\"编辑商品. mdcCategoryAddDto={}\", mdcCategoryAddDto);\n\t\tmdcProductService.saveProduct(mdcCategoryAddDto, getLoginAuthDto());\n\t\treturn WrapMapper.ok();\n\t}\n\n\t@PostMapping(value = \"/deleteProductById/{id}\")\n\t@ApiOperation(httpMethod = \"POST\", value = \"删除商品信息\")\n\t@LogAnnotation\n\tpublic Wrapper<ProductVo> deleteProductById(@PathVariable Long id) {\n\t\tlogger.info(\"删除商品信息, id={}\", id);\n\t\tmdcProductService.deleteProductById(id);\n\t\treturn WrapMapper.ok();\n\t}\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-mdc/src/main/java/com/paascloud/provider/web/frontend/UacDictCommonController.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：UacDictCommonController.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.web.frontend;\n\n\nimport com.paascloud.core.support.BaseController;\nimport com.paascloud.provider.model.domain.MdcDict;\nimport com.paascloud.provider.model.dto.MdcDictCheckCodeDto;\nimport com.paascloud.provider.model.dto.MdcDictCheckNameDto;\nimport com.paascloud.provider.service.MdcDictService;\nimport com.paascloud.wrapper.WrapMapper;\nimport com.paascloud.wrapper.Wrapper;\nimport io.swagger.annotations.Api;\nimport io.swagger.annotations.ApiOperation;\nimport io.swagger.annotations.ApiParam;\nimport org.springframework.http.MediaType;\nimport org.springframework.web.bind.annotation.PostMapping;\nimport org.springframework.web.bind.annotation.RequestBody;\nimport org.springframework.web.bind.annotation.RequestMapping;\nimport org.springframework.web.bind.annotation.RestController;\nimport tk.mybatis.mapper.entity.Example;\n\nimport javax.annotation.Resource;\n\n/**\n * The class Uac dict common controller.\n *\n * @author paascloud.net @gmail.com\n */\n@RestController\n@RequestMapping(value = \"/dict\", produces = MediaType.APPLICATION_JSON_UTF8_VALUE)\n@Api(value = \"WEB - UacDictCommonController\", produces = MediaType.APPLICATION_JSON_UTF8_VALUE)\npublic class UacDictCommonController extends BaseController {\n\n\n\t@Resource\n\tprivate MdcDictService mdcDictService;\n\n\t/**\n\t * 检测菜单编码是否已存在\n\t *\n\t * @param mdcDictCheckCodeDto the mdc dict check code dto\n\t *\n\t * @return the wrapper\n\t */\n\t@PostMapping(value = \"/checkDictCode\")\n\t@ApiOperation(httpMethod = \"POST\", value = \"检测数据字典编码是否已存在\")\n\tpublic Wrapper<Boolean> checkDictCode(@ApiParam(name = \"uacMenuCheckCodeDto\", value = \"id与url\") @RequestBody MdcDictCheckCodeDto mdcDictCheckCodeDto) {\n\t\tlogger.info(\"检测数据字典编码是否已存在 mdcDictCheckCodeDto={}\", mdcDictCheckCodeDto);\n\n\t\tLong id = mdcDictCheckCodeDto.getDictId();\n\t\tString dictCode = mdcDictCheckCodeDto.getDictCode();\n\n\t\tExample example = new Example(MdcDict.class);\n\t\tExample.Criteria criteria = example.createCriteria();\n\n\t\tif (id != null) {\n\t\t\tcriteria.andNotEqualTo(\"id\", id);\n\t\t}\n\t\tcriteria.andEqualTo(\"dictCode\", dictCode);\n\n\t\tint result = mdcDictService.selectCountByExample(example);\n\t\treturn WrapMapper.ok(result < 1);\n\t}\n\n\t/**\n\t * 检测数据字典名称是否已存在.\n\t *\n\t * @param mdcDictCheckNameDto the mdc dict check name dto\n\t *\n\t * @return the wrapper\n\t */\n\t@PostMapping(value = \"/checkDictName\")\n\t@ApiOperation(httpMethod = \"POST\", value = \"检测数据字典名称是否已存在\")\n\tpublic Wrapper<Boolean> checkDictName(@ApiParam(name = \"uacMenuCheckCodeDto\", value = \"id与url\") @RequestBody MdcDictCheckNameDto mdcDictCheckNameDto) {\n\t\tlogger.info(\"检测数据字典名称是否已存在 mdcDictCheckNameDto={}\", mdcDictCheckNameDto);\n\n\t\tLong id = mdcDictCheckNameDto.getDictId();\n\t\tString dictName = mdcDictCheckNameDto.getDictName();\n\n\t\tExample example = new Example(MdcDict.class);\n\t\tExample.Criteria criteria = example.createCriteria();\n\n\t\tif (id != null) {\n\t\t\tcriteria.andNotEqualTo(\"id\", id);\n\t\t}\n\t\tcriteria.andEqualTo(\"dictName\", dictName);\n\n\t\tint result = mdcDictService.selectCountByExample(example);\n\t\treturn WrapMapper.ok(result < 1);\n\t}\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-mdc/src/main/java/com/paascloud/provider/web/frontend/UacProductCategoryCommonController.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：UacProductCategoryCommonController.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.web.frontend;\n\n\nimport com.paascloud.core.support.BaseController;\nimport com.paascloud.provider.model.domain.MdcProductCategory;\nimport com.paascloud.provider.model.dto.MdcCategoryCheckNameDto;\nimport com.paascloud.provider.service.MdcProductCategoryService;\nimport com.paascloud.wrapper.WrapMapper;\nimport com.paascloud.wrapper.Wrapper;\nimport io.swagger.annotations.Api;\nimport io.swagger.annotations.ApiOperation;\nimport org.springframework.http.MediaType;\nimport org.springframework.web.bind.annotation.PostMapping;\nimport org.springframework.web.bind.annotation.RequestBody;\nimport org.springframework.web.bind.annotation.RequestMapping;\nimport org.springframework.web.bind.annotation.RestController;\nimport tk.mybatis.mapper.entity.Example;\n\nimport javax.annotation.Resource;\n\n/**\n * The class Uac dict common controller.\n *\n * @author paascloud.net @gmail.com\n */\n@RestController\n@RequestMapping(value = \"/dict\", produces = MediaType.APPLICATION_JSON_UTF8_VALUE)\n@Api(value = \"WEB - UacDictCommonController\", produces = MediaType.APPLICATION_JSON_UTF8_VALUE)\npublic class UacProductCategoryCommonController extends BaseController {\n\n\t@Resource\n\tprivate MdcProductCategoryService mdcProductCategoryService;\n\n\t/**\n\t * 检测数据分类名称是否已存在.\n\t *\n\t * @param categoryCheckNameDto the category check name dto\n\t *\n\t * @return the wrapper\n\t */\n\t@PostMapping(value = \"/checkCategoryName\")\n\t@ApiOperation(httpMethod = \"POST\", value = \"检测数据分类名称是否已存在\")\n\tpublic Wrapper<Boolean> checkCategoryName(@RequestBody MdcCategoryCheckNameDto categoryCheckNameDto) {\n\t\tlogger.info(\"检测数据分类名称是否已存在 categoryCheckNameDto={}\", categoryCheckNameDto);\n\n\t\tLong id = categoryCheckNameDto.getCategoryId();\n\t\tString categoryName = categoryCheckNameDto.getCategoryName();\n\n\t\tExample example = new Example(MdcProductCategory.class);\n\t\tExample.Criteria criteria = example.createCriteria();\n\n\t\tif (id != null) {\n\t\t\tcriteria.andNotEqualTo(\"id\", id);\n\t\t}\n\t\tcriteria.andEqualTo(\"name\", categoryName);\n\n\t\tint result = mdcProductCategoryService.selectCountByExample(example);\n\t\treturn WrapMapper.ok(result < 1);\n\t}\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-mdc/src/main/java/com/paascloud/provider/web/rpc/MdcAddressQueryFeignClient.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：MdcAddressQueryFeignClient.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.web.rpc;\n\nimport com.paascloud.PublicUtil;\nimport com.paascloud.core.support.BaseController;\nimport com.paascloud.provider.model.domain.MdcAddress;\nimport com.paascloud.provider.model.dto.AddressDTO;\nimport com.paascloud.provider.service.MdcAddressQueryFeignApi;\nimport com.paascloud.provider.service.MdcAddressService;\nimport com.paascloud.wrapper.WrapMapper;\nimport com.paascloud.wrapper.Wrapper;\nimport io.swagger.annotations.Api;\nimport io.swagger.annotations.ApiOperation;\nimport org.springframework.beans.BeanUtils;\nimport org.springframework.cloud.context.config.annotation.RefreshScope;\nimport org.springframework.http.MediaType;\nimport org.springframework.web.bind.annotation.PathVariable;\nimport org.springframework.web.bind.annotation.RestController;\n\nimport javax.annotation.Resource;\n\n/**\n * The class Mdc product query feign client.\n *\n * @author paascloud.net @gmail.com\n */\n@RefreshScope\n@RestController\n@Api(value = \"API - MdcAddressQueryFeignClient\", produces = MediaType.APPLICATION_JSON_UTF8_VALUE)\npublic class MdcAddressQueryFeignClient extends BaseController implements MdcAddressQueryFeignApi {\n\n\t@Resource\n\tprivate MdcAddressService mdcAddressService;\n\n\t/**\n\t * 根据ID获取地址信息.\n\t *\n\t * @param addressId the address id\n\t *\n\t * @return the by id\n\t */\n\t@Override\n\t@ApiOperation(httpMethod = \"POST\", value = \"根据ID获取地址信息\")\n\tpublic Wrapper<AddressDTO> getById(@PathVariable(\"addressId\") Long addressId) {\n\t\tlogger.info(\"根据ID获取地址信息 addressId={}\", addressId);\n\t\tAddressDTO addressDTO = null;\n\t\tMdcAddress mdcAddress = mdcAddressService.selectByKey(addressId);\n\t\tif (PublicUtil.isNotEmpty(mdcAddress)) {\n\t\t\taddressDTO = new AddressDTO();\n\t\t\tBeanUtils.copyProperties(mdcAddress, addressDTO);\n\t\t}\n\t\treturn WrapMapper.ok(addressDTO);\n\t}\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-mdc/src/main/java/com/paascloud/provider/web/rpc/MdcExceptionLogFeignClient.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：MdcExceptionLogFeignClient.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.web.rpc;\n\nimport com.paascloud.core.support.BaseController;\nimport com.paascloud.provider.model.dto.GlobalExceptionLogDto;\nimport com.paascloud.provider.service.MdcExceptionLogFeignApi;\nimport com.paascloud.provider.service.MdcExceptionLogService;\nimport com.paascloud.wrapper.WrapMapper;\nimport com.paascloud.wrapper.Wrapper;\nimport io.swagger.annotations.Api;\nimport io.swagger.annotations.ApiOperation;\nimport lombok.extern.slf4j.Slf4j;\nimport org.springframework.cloud.context.config.annotation.RefreshScope;\nimport org.springframework.http.MediaType;\nimport org.springframework.web.bind.annotation.RequestBody;\nimport org.springframework.web.bind.annotation.RestController;\n\nimport javax.annotation.Resource;\n\n/**\n * The class Mdc product feign client.\n *\n * @author paascloud.net@gmail.com\n */\n@Slf4j\n@RefreshScope\n@RestController\n@Api(value = \"API - MdcExceptionLogFeignClient\", produces = MediaType.APPLICATION_JSON_UTF8_VALUE)\npublic class MdcExceptionLogFeignClient extends BaseController implements MdcExceptionLogFeignApi {\n\t@Resource\n\tprivate MdcExceptionLogService mdcExceptionLogService;\n\n\t@Override\n\t@ApiOperation(httpMethod = \"POST\", value = \"保存日志并发送钉钉消息\")\n\tpublic Wrapper saveAndSendExceptionLog(@RequestBody GlobalExceptionLogDto exceptionLogDto) {\n\t\ttry {\n\t\t\tmdcExceptionLogService.saveAndSendExceptionLog(exceptionLogDto);\n\t\t} catch (Exception e) {\n\t\t\tlog.error(\"saveAndSendExceptionLog={}\", e.getMessage(), e);\n\t\t}\n\t\treturn WrapMapper.ok();\n\t}\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-mdc/src/main/java/com/paascloud/provider/web/rpc/MdcMqMessageFeignClient.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：MdcMqMessageFeignClient.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.web.rpc;\n\n\nimport com.github.pagehelper.PageInfo;\nimport com.paascloud.base.dto.MessageQueryDto;\nimport com.paascloud.base.dto.MqMessageVo;\nimport com.paascloud.core.support.BaseController;\nimport com.paascloud.provider.service.MdcMqMessageFeignApi;\nimport com.paascloud.provider.service.MqMessageService;\nimport com.paascloud.wrapper.WrapMapper;\nimport com.paascloud.wrapper.Wrapper;\nimport io.swagger.annotations.Api;\nimport io.swagger.annotations.ApiOperation;\nimport org.springframework.http.MediaType;\nimport org.springframework.web.bind.annotation.RequestBody;\nimport org.springframework.web.bind.annotation.RequestParam;\nimport org.springframework.web.bind.annotation.RestController;\n\nimport javax.annotation.Resource;\nimport java.util.List;\n\n/**\n * Mq 消息.\n *\n * @author paascloud.net @gmail.com\n */\n@RestController\n@Api(value = \"API - MdcMqMessageFeignClient\", produces = MediaType.APPLICATION_JSON_UTF8_VALUE)\npublic class MdcMqMessageFeignClient extends BaseController implements MdcMqMessageFeignApi {\n\t@Resource\n\tprivate MqMessageService mqMessageService;\n\n\t@Override\n\t@ApiOperation(httpMethod = \"POST\", value = \"查询含有的messageKey\")\n\tpublic Wrapper<List<String>> queryMessageKeyList(@RequestParam(\"messageKeyList\") List<String> messageKeyList) {\n\t\tlogger.info(\"查询消息KEY. messageKeyList={}\", messageKeyList);\n\t\treturn WrapMapper.ok(mqMessageService.queryMessageKeyList(messageKeyList));\n\t}\n\n\t@Override\n\tpublic Wrapper<PageInfo<MqMessageVo>> queryMessageListWithPage(@RequestBody MessageQueryDto messageQueryDto) {\n\t\treturn mqMessageService.queryMessageListWithPage(messageQueryDto);\n\t}\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-mdc/src/main/java/com/paascloud/provider/web/rpc/MdcProductCategoryFeignClient.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：MdcProductCategoryFeignClient.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.web.rpc;\n\nimport com.paascloud.provider.service.MdcProductCategoryFeignApi;\nimport com.paascloud.core.support.BaseController;\nimport io.swagger.annotations.Api;\nimport org.springframework.cloud.context.config.annotation.RefreshScope;\nimport org.springframework.http.MediaType;\nimport org.springframework.web.bind.annotation.RestController;\n\n/**\n * The class Mdc product category feign client.\n *\n * @author paascloud.net@gmail.com\n */\n@RefreshScope\n@RestController\n@Api(value = \"API - MdcProductCategoryFeignClient\", produces = MediaType.APPLICATION_JSON_UTF8_VALUE)\npublic class MdcProductCategoryFeignClient extends BaseController implements MdcProductCategoryFeignApi {\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-mdc/src/main/java/com/paascloud/provider/web/rpc/MdcProductCategoryQueryFeignClient.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：MdcProductCategoryQueryFeignClient.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.web.rpc;\n\nimport com.github.pagehelper.PageHelper;\nimport com.github.pagehelper.PageInfo;\nimport com.google.common.collect.Lists;\nimport com.paascloud.PublicUtil;\nimport com.paascloud.core.support.BaseService;\nimport com.paascloud.provider.model.domain.MdcProduct;\nimport com.paascloud.provider.model.domain.MdcProductCategory;\nimport com.paascloud.provider.model.dto.ProductCategoryDto;\nimport com.paascloud.provider.model.dto.ProductDto;\nimport com.paascloud.provider.model.dto.ProductReqDto;\nimport com.paascloud.provider.service.MdcProductCategoryQueryFeignApi;\nimport com.paascloud.provider.service.MdcProductCategoryService;\nimport com.paascloud.provider.service.MdcProductService;\nimport com.paascloud.wrapper.WrapMapper;\nimport com.paascloud.wrapper.Wrapper;\nimport io.swagger.annotations.Api;\nimport io.swagger.annotations.ApiOperation;\nimport org.apache.commons.lang3.StringUtils;\nimport org.springframework.cloud.context.config.annotation.RefreshScope;\nimport org.springframework.http.MediaType;\nimport org.springframework.web.bind.annotation.PathVariable;\nimport org.springframework.web.bind.annotation.RequestBody;\nimport org.springframework.web.bind.annotation.RestController;\n\nimport javax.annotation.Resource;\nimport java.util.List;\n\n/**\n * The class Mdc product category query feign client.\n *\n * @author paascloud.net @gmail.com\n */\n@RefreshScope\n@RestController\n@Api(value = \"API - MdcProductCategoryQueryFeignClient\", produces = MediaType.APPLICATION_JSON_UTF8_VALUE)\npublic class MdcProductCategoryQueryFeignClient extends BaseService<MdcProductCategory> implements MdcProductCategoryQueryFeignApi {\n\n\t@Resource\n\tprivate MdcProductCategoryService mdcProductCategoryService;\n\t@Resource\n\tprivate MdcProductService mdcProductService;\n\n\t/**\n\t * 获取商品品类信息.\n\t *\n\t * @param pid the pid\n\t *\n\t * @return the product category data\n\t */\n\t@Override\n\t@ApiOperation(httpMethod = \"POST\", value = \"获取商品品类信息\")\n\tpublic Wrapper<List<ProductCategoryDto>> getProductCategoryData(@PathVariable(\"pid\") Long pid) {\n\t\tlogger.info(\"获取商品品类信息. pid={}\", pid);\n\t\tList<ProductCategoryDto> list;\n\t\tif (0L == pid) {\n\t\t\t// 查询所有一级分类\n\n\t\t\tlist = mdcProductCategoryService.getCategoryDtoList(pid);\n\t\t\tfor (ProductCategoryDto productCategoryDto : list) {\n\t\t\t\tLong categoryPid = productCategoryDto.getCategoryId();\n\t\t\t\tif (PublicUtil.isEmpty(categoryPid)) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tList<ProductCategoryDto> product2CategoryDtoList = mdcProductCategoryService.getCategoryDtoList(categoryPid);\n\t\t\t\tif (product2CategoryDtoList.size() > 5) {\n\t\t\t\t\tproduct2CategoryDtoList = product2CategoryDtoList.subList(0, 4);\n\t\t\t\t}\n\t\t\t\tproductCategoryDto.setCategoryList(product2CategoryDtoList);\n\t\t\t}\n\n\t\t} else {\n\t\t\t// 根据分类ID 查询分类下的所有二级分类\n\t\t\tlist = mdcProductCategoryService.getCategoryDtoList(pid);\n\t\t}\n\n\t\treturn WrapMapper.ok(list);\n\t}\n\n\t/**\n\t * 获取商品列表信息.\n\t *\n\t * @param productReqDto the product req dto\n\t *\n\t * @return the product list\n\t */\n\t@Override\n\t@ApiOperation(httpMethod = \"POST\", value = \"获取商品列表信息\")\n\tpublic Wrapper<PageInfo> getProductList(@RequestBody ProductReqDto productReqDto) {\n\t\tlogger.info(\"获取商品列表信息. productReqDto={}\", productReqDto);\n\t\tLong categoryId = productReqDto.getCategoryId();\n\t\tString keyword = productReqDto.getKeyword();\n\t\tInteger pageNum = productReqDto.getPageNum();\n\t\tInteger pageSize = productReqDto.getPageSize();\n\t\tString orderBy = productReqDto.getOrderBy();\n\t\tif (StringUtils.isBlank(keyword) && null == categoryId) {\n\t\t\treturn WrapMapper.ok(new PageInfo());\n\t\t}\n\t\tList<Long> categoryIdList = Lists.newArrayList();\n\n\t\tif (categoryId != null) {\n\t\t\tMdcProductCategory category = mdcProductCategoryService.selectByKey(categoryId);\n\t\t\tif (category == null && StringUtils.isBlank(keyword)) {\n\t\t\t\t// 没有该分类,并且还没有关键字,这个时候返回一个空的结果集,不报错\n\t\t\t\tPageHelper.startPage(pageNum, pageSize);\n\t\t\t\treturn WrapMapper.wrap(Wrapper.SUCCESS_CODE, Wrapper.SUCCESS_MESSAGE, new PageInfo());\n\t\t\t}\n\t\t\tcategoryIdList = mdcProductCategoryService.selectCategoryAndChildrenById(categoryId);\n\t\t}\n\n\t\tPageHelper.startPage(pageNum, pageSize);\n\t\t//排序处理\n\t\tList<MdcProduct> productList = mdcProductService.selectByNameAndCategoryIds(StringUtils.isBlank(keyword) ? null : keyword, PublicUtil.isEmpty(categoryIdList) ? null : categoryIdList, orderBy);\n\n\t\tList<ProductDto> productListVoList = Lists.newArrayList();\n\t\tfor (MdcProduct product : productList) {\n\t\t\tProductDto productListVo = assembleProductListVo(product);\n\t\t\tString url = mdcProductService.getMainImage(product.getId());\n\t\t\tproductListVo.setMainImage(url);\n\t\t\tproductListVoList.add(productListVo);\n\t\t}\n\n\n\t\treturn PublicUtil.isNotEmpty(productListVoList) ? WrapMapper.ok(new PageInfo<>(productListVoList)) : WrapMapper.ok();\n\t}\n\n\tprivate ProductDto assembleProductListVo(MdcProduct product) {\n\t\tProductDto productListVo = new ProductDto();\n\t\tproductListVo.setId(product.getId());\n\t\tproductListVo.setName(product.getName());\n\t\tproductListVo.setCategoryId(product.getId());\n\t\tproductListVo.setImageHost(\"\");\n\t\tproductListVo.setMainImage(product.getMainImage());\n\t\tproductListVo.setPrice(product.getPrice());\n\t\tproductListVo.setSubtitle(product.getSubtitle());\n\t\tproductListVo.setStatus(product.getStatus());\n\t\treturn productListVo;\n\t}\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-mdc/src/main/java/com/paascloud/provider/web/rpc/MdcProductFeignClient.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：MdcProductFeignClient.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.web.rpc;\n\nimport com.google.common.base.Preconditions;\nimport com.paascloud.PubUtils;\nimport com.paascloud.base.enums.ErrorCodeEnum;\nimport com.paascloud.core.support.BaseController;\nimport com.paascloud.provider.model.dto.ProductDto;\nimport com.paascloud.provider.service.MdcProductFeignApi;\nimport com.paascloud.provider.service.MdcProductService;\nimport com.paascloud.wrapper.WrapMapper;\nimport com.paascloud.wrapper.Wrapper;\nimport io.swagger.annotations.Api;\nimport io.swagger.annotations.ApiOperation;\nimport org.springframework.cloud.context.config.annotation.RefreshScope;\nimport org.springframework.http.MediaType;\nimport org.springframework.web.bind.annotation.RequestBody;\nimport org.springframework.web.bind.annotation.RequestParam;\nimport org.springframework.web.bind.annotation.RestController;\n\nimport javax.annotation.Resource;\n\n/**\n * The class Mdc product feign client.\n *\n * @author paascloud.net@gmail.com\n */\n@RefreshScope\n@RestController\n@Api(value = \"API - UacUserQueryFeignClient\", produces = MediaType.APPLICATION_JSON_UTF8_VALUE)\npublic class MdcProductFeignClient extends BaseController implements MdcProductFeignApi {\n\t@Resource\n\tprivate MdcProductService mdcProductService;\n\n\t@Override\n\t@ApiOperation(httpMethod = \"POST\", value = \"更新商品库存\")\n\tpublic Wrapper<Integer> updateProductStockById(@RequestBody ProductDto productDto) {\n\t\tlogger.info(\"更新商品库存. productDto={}\", productDto);\n\t\tPreconditions.checkArgument(!PubUtils.isNull(productDto, productDto.getId()), ErrorCodeEnum.MDC10021021.msg());\n\t\tint result = mdcProductService.updateProductStockById(productDto);\n\t\treturn WrapMapper.ok(result);\n\t}\n\n\t@Override\n\tpublic Wrapper<String> getMainImage(@RequestParam(\"productId\") Long productId) {\n\t\tString mainImage = mdcProductService.getMainImage(productId);\n\t\treturn WrapMapper.ok(mainImage);\n\t}\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-mdc/src/main/java/com/paascloud/provider/web/rpc/MdcProductQueryFeignClient.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：MdcProductQueryFeignClient.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.web.rpc;\n\nimport com.paascloud.PublicUtil;\nimport com.paascloud.core.support.BaseController;\nimport com.paascloud.provider.model.domain.MdcProduct;\nimport com.paascloud.provider.model.dto.ProductDto;\nimport com.paascloud.provider.model.vo.ProductDetailVo;\nimport com.paascloud.provider.service.MdcProductQueryFeignApi;\nimport com.paascloud.provider.service.MdcProductService;\nimport com.paascloud.wrapper.WrapMapper;\nimport com.paascloud.wrapper.Wrapper;\nimport io.swagger.annotations.Api;\nimport io.swagger.annotations.ApiOperation;\nimport org.springframework.beans.BeanUtils;\nimport org.springframework.cloud.context.config.annotation.RefreshScope;\nimport org.springframework.http.MediaType;\nimport org.springframework.web.bind.annotation.PathVariable;\nimport org.springframework.web.bind.annotation.RestController;\n\nimport javax.annotation.Resource;\n\n/**\n * The class Mdc product query feign client.\n *\n * @author paascloud.net@gmail.com\n */\n@RefreshScope\n@RestController\n@Api(value = \"API - MdcProductQueryFeignClient\", produces = MediaType.APPLICATION_JSON_UTF8_VALUE)\npublic class MdcProductQueryFeignClient extends BaseController implements MdcProductQueryFeignApi {\n\n\t@Resource\n\tprivate MdcProductService mdcProductService;\n\n\t@Override\n\t@ApiOperation(httpMethod = \"POST\", value = \"根据商品ID查询商品详细信息\")\n\tpublic Wrapper<ProductDetailVo> getProductDetail(@PathVariable(\"productId\") Long productId) {\n\t\tlogger.info(\"根据商品ID查询商品详细信息. productId={}\", productId);\n\t\tProductDetailVo productDto = mdcProductService.getProductDetail(productId);\n\t\treturn WrapMapper.wrap(Wrapper.SUCCESS_CODE, Wrapper.SUCCESS_MESSAGE, productDto);\n\t}\n\n\t@Override\n\t@ApiOperation(httpMethod = \"POST\", value = \"根据商品ID查询商品信息\")\n\tpublic Wrapper<ProductDto> selectById(@PathVariable(\"productId\") Long productId) {\n\t\tlogger.info(\"根据商品ID查询商品信息. productId={}\", productId);\n\t\tProductDto productDto = null;\n\t\tMdcProduct mdcProduct = mdcProductService.selectByKey(productId);\n\t\tif (PublicUtil.isNotEmpty(mdcProduct)) {\n\t\t\tproductDto = new ProductDto();\n\t\t\tBeanUtils.copyProperties(mdcProduct, productDto);\n\t\t}\n\t\treturn WrapMapper.ok(productDto);\n\t}\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-mdc/src/main/resources/META-INF/spring-devtools.properties",
    "content": "restart.include.mapper=/mapper-[\\\\w-\\\\.]+jar\nrestart.include.pagehelper=/pagehelper-[\\\\w-\\\\.]+jar"
  },
  {
    "path": "paascloud-provider/paascloud-provider-mdc/src/main/resources/ValidationMessages.properties",
    "content": ""
  },
  {
    "path": "paascloud-provider/paascloud-provider-mdc/src/main/resources/application.yml",
    "content": "server:\n  port: 8030\n\nspring:\n  profiles:\n    active: dev\n  application:\n    name: @pom.artifactId@\n  datasource:\n    username: root\n    password: 123456"
  },
  {
    "path": "paascloud-provider/paascloud-provider-mdc/src/main/resources/banner.txt",
    "content": "${AnsiColor.BRIGHT_CYAN}\n                                  .__                   .___                  __\n___________  _____    ______ ____ |  |   ____  __ __  __| _/     ____   _____/  |_\n\\____ \\__  \\ \\__  \\  /  ___// ___\\|  |  /  _ \\|  |  \\/ __ |     /    \\_/ __ \\   __\\\n|  |_> > __ \\_/ __ \\_\\___ \\\\  \\___|  |_(  <_> )  |  / /_/ |    |   |  \\  ___/|  |\n|   __(____  (____  /____  >\\___  >____/\\____/|____/\\____ | /\\ |___|  /\\___  >__|\n|__|       \\/     \\/     \\/     \\/ Powered by liuzhaoming\\/ \\/      \\/     \\/"
  },
  {
    "path": "paascloud-provider/paascloud-provider-mdc/src/main/resources/bootstrap.yml",
    "content": "spring:\n  cloud:\n    config:\n      fail-fast: true\n      discovery:\n        service-id: paascloud-discovery\n        enabled: true\n      label: ${spring.profiles.active}\n      profile: ${spring.profiles.active}\n      username: admin\n      password: admin\n\neureka:\n  client:\n    serviceUrl:\n      defaultZone: http://root:root@paascloud-eureka:8761/eureka/\n  instance:\n    instance-id: ${spring.application.name}:${spring.cloud.client.ipAddress}:${server.port}"
  },
  {
    "path": "paascloud-provider/paascloud-provider-mdc/src/main/resources/conf/liquibase.properties",
    "content": "spring.datasource.driver-class-name= com.mysql.jdbc.Driver\nspring.datasource.url=jdbc:mysql://paascloud-db-mysql:3306/paascloud_mdc?characterEncoding=utf8&useSSL=false\nspring.datasource.username= root\nspring.datasource.password= 123456"
  },
  {
    "path": "paascloud-provider/paascloud-provider-mdc/src/main/resources/liquibase/index.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<databaseChangeLog\n        xmlns=\"http://www.liquibase.org/xml/ns/dbchangelog\"\n        xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n        xsi:schemaLocation=\"http://www.liquibase.org/xml/ns/dbchangelog\n         http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.1.xsd\">\n</databaseChangeLog>"
  },
  {
    "path": "paascloud-provider/paascloud-provider-mdc/src/main/resources/logback-spring.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<configuration>\n    <include resource=\"org/springframework/boot/logging/logback/defaults.xml\"/>\n    ​\n    <springProperty scope=\"context\" name=\"springAppName\" source=\"spring.application.name\"/>\n    <!-- Example for logging into the build folder of your project -->\n    <property name=\"LOG_FILE\" value=\"/data/logs/paascloud/${springAppName}/${springAppName}\"/>\n    ​\n    <property name=\"CONSOLE_LOG_PATTERN\" value=\"%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr([${springAppName:-},%X{X-B3-TraceId:-},%X{X-B3-SpanId:-},%X{X-B3-ParentSpanId:-},%X{X-Span-Export:-}]){yellow} %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}\"/>\n\n    <!-- Appender to log to console -->\n    <appender name=\"console\" class=\"ch.qos.logback.core.ConsoleAppender\">\n        <filter class=\"ch.qos.logback.classic.filter.ThresholdFilter\">\n            <!-- Minimum logging level to be presented in the console logs -->\n            <level>DEBUG</level>\n        </filter>\n        <encoder>\n            <pattern>${CONSOLE_LOG_PATTERN}</pattern>\n            <charset>utf8</charset>\n        </encoder>\n    </appender>\n\n    <!-- Appender to log to file -->\n    <appender name=\"flatfile\" class=\"ch.qos.logback.core.rolling.RollingFileAppender\">\n        <file>${LOG_FILE}</file>\n        <rollingPolicy class=\"ch.qos.logback.core.rolling.TimeBasedRollingPolicy\">\n            <fileNamePattern>${LOG_FILE}.%d{yyyy-MM-dd}.gz</fileNamePattern>\n            <maxHistory>7</maxHistory>\n        </rollingPolicy>\n        <encoder>\n            <pattern>${CONSOLE_LOG_PATTERN}</pattern>\n            <charset>utf8</charset>\n        </encoder>\n    </appender>\n    ​\n    <!-- Appender to log to file in a JSON format -->\n    <appender name=\"logstash\" class=\"ch.qos.logback.core.rolling.RollingFileAppender\">\n        <file>${LOG_FILE}.json</file>\n        <rollingPolicy class=\"ch.qos.logback.core.rolling.TimeBasedRollingPolicy\">\n            <fileNamePattern>${LOG_FILE}.json.%d{yyyy-MM-dd}.gz</fileNamePattern>\n            <maxHistory>7</maxHistory>\n        </rollingPolicy>\n        <encoder class=\"net.logstash.logback.encoder.LoggingEventCompositeJsonEncoder\">\n            <providers>\n                <timestamp>\n                    <timeZone>UTC</timeZone>\n                </timestamp>\n                <pattern>\n                    <pattern>\n                        {\n                        \"severity\": \"%level\",\n                        \"service\": \"${springAppName:-}\",\n                        \"trace\": \"%X{X-B3-TraceId:-}\",\n                        \"span\": \"%X{X-B3-SpanId:-}\",\n                        \"parent\": \"%X{X-B3-ParentSpanId:-}\",\n                        \"exportable\": \"%X{X-Span-Export:-}\",\n                        \"pid\": \"${PID:-}\",\n                        \"thread\": \"%thread\",\n                        \"class\": \"%logger{40}\",\n                        \"rest\": \"%message\"\n                        }\n                    </pattern>\n                </pattern>\n            </providers>\n        </encoder>\n    </appender>\n\n    <appender name=\"MyBatisStatistics\" class=\"ch.qos.logback.core.rolling.RollingFileAppender\">\n        <rollingPolicy class=\"ch.qos.logback.core.rolling.TimeBasedRollingPolicy\">\n            <fileNamePattern>${LOG_FILE}.sql.%d{yyyy-MM-dd}.gz</fileNamePattern>\n            <maxHistory>10</maxHistory>\n        </rollingPolicy>\n        <encoder>\n            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36}-%msg%n</pattern>\n        </encoder>\n    </appender>\n\n    <logger name=\"com.paascloud.provider.mapper\" level=\"DEBUG\">\n        <appender-ref ref=\"MyBatisStatistics\" />\n    </logger>\n    ​\n  <root level=\"INFO\">\n    <appender-ref ref=\"console\"/>\n        <appender-ref ref=\"logstash\"/>\n        <appender-ref ref=\"flatfile\"/>\n    </root>\n</configuration>"
  },
  {
    "path": "paascloud-provider/paascloud-provider-mdc/src/main/resources/mapper/MdcAddressMapper.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n<!DOCTYPE mapper PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\" \"http://mybatis.org/dtd/mybatis-3-mapper.dtd\" >\n<mapper namespace=\"com.paascloud.provider.mapper.MdcAddressMapper\">\n    <resultMap id=\"BaseResultMap\" type=\"com.paascloud.provider.model.domain.MdcAddress\" >\n        <id column=\"id\" property=\"id\" jdbcType=\"BIGINT\" />\n        <result column=\"name\" property=\"name\" jdbcType=\"VARCHAR\" />\n        <result column=\"pid\" property=\"pid\" jdbcType=\"BIGINT\" />\n        <result column=\"city_code\" property=\"cityCode\" jdbcType=\"VARCHAR\" />\n        <result column=\"level\" property=\"level\" jdbcType=\"INTEGER\" />\n        <result column=\"ad_code\" property=\"adCode\" jdbcType=\"VARCHAR\" />\n        <result column=\"polyline\" property=\"polyline\" jdbcType=\"VARCHAR\" />\n        <result column=\"center\" property=\"center\" jdbcType=\"VARCHAR\" />\n    </resultMap>\n    <sql id=\"Base_Column_List\">\n        id, pid, city_code, ad_code, name, level, polyline, center\n    </sql>\n    <sql id=\"Base_Where_Condition\">\n        <where>\n            <if test=\"id != null\" >\n                AND id = #{id,jdbcType=BIGINT}\n            </if>\n            <if test=\"pid != null\" >\n                AND pid = #{pid,jdbcType=BIGINT}\n            </if>\n            <if test=\"cityCode != null and cityCode != ''\" >\n                AND city_code = #{cityCode,jdbcType=VARCHAR}\n            </if>\n            <if test=\"adCode != null and adCode != ''\" >\n                AND ad_code = #{adCode,jdbcType=VARCHAR}\n            </if>\n            <if test=\"name != null and name != ''\" >\n                AND name = #{name,jdbcType=VARCHAR}\n            </if>\n            <if test=\"level != null\" >\n                AND level = #{level,jdbcType=BIT}\n            </if>\n            <if test=\"polyline != null and polyline != ''\" >\n                AND polyline = #{polyline,jdbcType=VARCHAR}\n            </if>\n            <if test=\"center != null and center != ''\" >\n                AND center = #{center,jdbcType=VARCHAR}\n            </if>\n        </where>\n    </sql>\n    <select id=\"selectMdcAddress\" resultMap=\"BaseResultMap\" parameterType=\"com.paascloud.provider.model.domain.MdcAddress\">\n        SELECT\n        <include refid=\"Base_Column_List\"/>\n        FROM pc_mdc_address\n        <include refid=\"Base_Where_Condition\"/>\n    </select>\n    <select id=\"selectAddressByPid\" resultType=\"com.paascloud.provider.model.domain.MdcAddress\">\n        SELECT\n          <include refid=\"Base_Column_List\"/>\n        FROM\n          pc_mdc_address\n        WHERE\n          parent_id = #{parentId}\n    </select>\n</mapper>"
  },
  {
    "path": "paascloud-provider/paascloud-provider-mdc/src/main/resources/mapper/MdcDictMapper.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n<!DOCTYPE mapper PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\" \"http://mybatis.org/dtd/mybatis-3-mapper.dtd\" >\n<mapper namespace=\"com.paascloud.provider.mapper.MdcDictMapper\">\n  <resultMap id=\"BaseResultMap\" type=\"com.paascloud.provider.model.domain.MdcDict\">\n    <id column=\"id\" property=\"id\" jdbcType=\"BIGINT\"/>\n    <result column=\"type\" property=\"type\" jdbcType=\"INTEGER\"/>\n    <result column=\"dict_key\" property=\"dictKey\" jdbcType=\"VARCHAR\"/>\n    <result column=\"extend_key\" property=\"extendKey\" jdbcType=\"VARCHAR\"/>\n    <result column=\"dict_value\" property=\"dictValue\" jdbcType=\"VARCHAR\"/>\n    <result column=\"dict_code\" property=\"dictCode\" jdbcType=\"VARCHAR\"/>\n    <result column=\"dict_name\" property=\"dictName\" jdbcType=\"VARCHAR\"/>\n    <result column=\"pid\" property=\"pid\" jdbcType=\"BIGINT\"/>\n    <result column=\"number\" property=\"number\" jdbcType=\"INTEGER\"/>\n    <result column=\"status\" property=\"status\" jdbcType=\"INTEGER\"/>\n    <result column=\"remark\" property=\"remark\" jdbcType=\"VARCHAR\"/>\n    <result column=\"creator\" property=\"creator\" jdbcType=\"VARCHAR\"/>\n    <result column=\"creator_id\" property=\"creatorId\" jdbcType=\"VARCHAR\"/>\n    <result column=\"created_time\" property=\"createdTime\" jdbcType=\"TIMESTAMP\"/>\n    <result column=\"last_operator\" property=\"lastOperator\" jdbcType=\"VARCHAR\"/>\n    <result column=\"last_operator_id\" property=\"lastOperatorId\" jdbcType=\"VARCHAR\"/>\n    <result column=\"update_time\" property=\"updateTime\" jdbcType=\"TIMESTAMP\"/>\n  </resultMap>\n  <sql id=\"Base_Column_List\">\n    ${alias}.id,\n    ${alias}.version,\n    ${alias}.type,\n    ${alias}.dict_key,\n    ${alias}.extend_key,\n    ${alias}.dict_value,\n    ${alias}.dict_code,\n    ${alias}.dict_name,\n    ${alias}.pid,\n    ${alias}.number,\n    ${alias}.status,\n    ${alias}.remark,\n    ${alias}.creator,\n    ${alias}.creator_id,\n    ${alias}.created_time,\n    ${alias}.last_operator,\n    ${alias}.last_operator_id,\n    ${alias}.update_time\n  </sql>\n  <select id=\"listDictVo\" resultType=\"com.paascloud.provider.model.vo.MdcDictVo\">\n    SELECT\n    <include refid=\"Base_Column_List\">\n      <property name=\"alias\" value=\"dict\"/>\n    </include>\n    from\n    pc_mdc_dict dict\n  </select>\n</mapper>"
  },
  {
    "path": "paascloud-provider/paascloud-provider-mdc/src/main/resources/mapper/MdcExceptionLogMapper.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n<!DOCTYPE mapper PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\" \"http://mybatis.org/dtd/mybatis-3-mapper.dtd\" >\n<mapper namespace=\"com.paascloud.provider.mapper.MdcExceptionLogMapper\" >\n  <resultMap id=\"BaseResultMap\" type=\"com.paascloud.provider.model.domain.MdcExceptionLog\" >\n    <id column=\"id\" property=\"id\" jdbcType=\"BIGINT\" />\n    <result column=\"application_name\" property=\"applicationName\" jdbcType=\"VARCHAR\" />\n    <result column=\"exception_simple_name\" property=\"exceptionSimpleName\" jdbcType=\"VARCHAR\" />\n    <result column=\"exception_message\" property=\"exceptionMessage\" jdbcType=\"VARCHAR\" />\n    <result column=\"exception_cause\" property=\"exceptionCause\" jdbcType=\"VARCHAR\" />\n    <result column=\"creator\" property=\"creator\" jdbcType=\"VARCHAR\" />\n    <result column=\"creator_id\" property=\"creatorId\" jdbcType=\"BIGINT\" />\n    <result column=\"create_time\" property=\"createTime\" jdbcType=\"TIMESTAMP\" />\n  </resultMap>\n  <resultMap id=\"ResultMapWithBLOBs\" type=\"com.paascloud.provider.model.domain.MdcExceptionLog\" extends=\"BaseResultMap\" >\n    <result column=\"exception_stack\" property=\"exceptionStack\" jdbcType=\"LONGVARCHAR\" />\n  </resultMap>\n  <sql id=\"Base_Column_List\" >\n    id, application_name, exception_simple_name, exception_message, exception_cause,\n    creator, creator_id, create_time\n  </sql>\n  <sql id=\"Blob_Column_List\" >\n    exception_stack\n  </sql>\n  <select id=\"queryExceptionListWithPage\" resultMap=\"ResultMapWithBLOBs\">\n    SELECT\n    <include refid=\"Base_Column_List\" />\n    ,\n    <include refid=\"Blob_Column_List\" />\n    FROM\n    pc_mdc_exception_log log\n    WHERE 1 = 1\n    <if test=\"exceptionCause != null and exceptionCause != ''\">\n      AND exception_cause LIKE concat(#{exceptionCause}, '%')\n    </if>\n    <if test=\"exceptionStack != null and exceptionStack != ''\">\n      AND exception_stack LIKE concat(#{exceptionStack}, '%')\n    </if>\n    <if test=\"creator != null and creator != ''\">\n      AND creator LIKE concat(#{creator}, '%')\n    </if>\n    <if test=\"startQueryTime != null and endQueryTime != null\">\n      AND create_time BETWEEN #{startQueryTime} AND #{endQueryTime}\n    </if>\n    ORDER BY log.create_time desc\n  </select>\n</mapper>"
  },
  {
    "path": "paascloud-provider/paascloud-provider-mdc/src/main/resources/mapper/MdcProductCategoryMapper.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n<!DOCTYPE mapper PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\" \"http://mybatis.org/dtd/mybatis-3-mapper.dtd\" >\n<mapper namespace=\"com.paascloud.provider.mapper.MdcProductCategoryMapper\">\n  <resultMap id=\"BaseResultMap\" type=\"mdcProductCategory\">\n    <id column=\"id\" property=\"id\" jdbcType=\"BIGINT\"/>\n    <result column=\"version\" property=\"version\" jdbcType=\"INTEGER\"/>\n    <result column=\"img_id\" property=\"imgId\" jdbcType=\"BIGINT\"/>\n    <result column=\"pid\" property=\"pid\" jdbcType=\"BIGINT\"/>\n    <result column=\"name\" property=\"name\" jdbcType=\"VARCHAR\"/>\n    <result column=\"category_code\" property=\"categoryCode\" jdbcType=\"VARCHAR\"/>\n    <result column=\"status\" property=\"status\" jdbcType=\"INTEGER\"/>\n    <result column=\"sort_order\" property=\"sortOrder\" jdbcType=\"INTEGER\"/>\n    <result column=\"creator\" property=\"creator\" jdbcType=\"VARCHAR\"/>\n    <result column=\"creator_id\" property=\"creatorId\" jdbcType=\"BIGINT\"/>\n    <result column=\"created_time\" property=\"createdTime\" jdbcType=\"TIMESTAMP\"/>\n    <result column=\"last_operator\" property=\"lastOperator\" jdbcType=\"VARCHAR\"/>\n    <result column=\"last_operator_id\" property=\"lastOperatorId\" jdbcType=\"BIGINT\"/>\n    <result column=\"update_time\" property=\"updateTime\" jdbcType=\"TIMESTAMP\"/>\n  </resultMap>\n  <resultMap id=\"BaseVoResultMap\" type=\"com.paascloud.provider.model.vo.MdcCategoryVo\" extends=\"BaseResultMap\">\n  </resultMap>\n  <sql id=\"Base_Column_List\">\n    ${alias}.id,\n    ${alias}.version,\n    ${alias}.category_code,\n    ${alias}.img_id,\n    ${alias}.pid,\n    ${alias}.name,\n    ${alias}.status,\n    ${alias}.sort_order,\n    ${alias}.creator,\n    ${alias}.creator_id,\n    ${alias}.created_time,\n    ${alias}.last_operator,\n    ${alias}.last_operator_id,\n    ${alias}.update_time\n  </sql>\n  <select id=\"selectCategoryDtoList\" resultType=\"com.paascloud.provider.model.dto.ProductCategoryDto\">\n    SELECT\n      id   AS categoryId,\n      name AS categoryName\n    FROM pc_mdc_product_category\n    WHERE pid = #{id,jdbcType=INTEGER}\n  </select>\n  <select id=\"listCategoryVo\" resultType=\"com.paascloud.provider.model.vo.MdcCategoryVo\">\n    SELECT\n    <include refid=\"Base_Column_List\">\n      <property name=\"alias\" value=\"category\"/>\n    </include>\n    from\n    pc_mdc_product_category category\n  </select>\n</mapper>"
  },
  {
    "path": "paascloud-provider/paascloud-provider-mdc/src/main/resources/mapper/MdcProductMapper.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n<!DOCTYPE mapper PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\" \"http://mybatis.org/dtd/mybatis-3-mapper.dtd\" >\n<mapper namespace=\"com.paascloud.provider.mapper.MdcProductMapper\">\n  <resultMap id=\"BaseResultMap\" type=\"mdcProduct\">\n    <id column=\"id\" property=\"id\" jdbcType=\"BIGINT\"/>\n    <result column=\"version\" property=\"version\" jdbcType=\"INTEGER\"/>\n    <result column=\"name\" property=\"name\" jdbcType=\"VARCHAR\"/>\n    <result column=\"subtitle\" property=\"subtitle\" jdbcType=\"VARCHAR\"/>\n    <result column=\"category_id\" property=\"categoryId\" jdbcType=\"BIGINT\"/>\n    <result column=\"main_image\" property=\"mainImage\" jdbcType=\"VARCHAR\"/>\n    <result column=\"price\" property=\"price\" jdbcType=\"DECIMAL\"/>\n    <result column=\"stock\" property=\"stock\" jdbcType=\"INTEGER\"/>\n    <result column=\"status\" property=\"status\" jdbcType=\"INTEGER\"/>\n    <result column=\"creator\" property=\"creator\" jdbcType=\"VARCHAR\"/>\n    <result column=\"creator_id\" property=\"creatorId\" jdbcType=\"BIGINT\"/>\n    <result column=\"created_time\" property=\"createdTime\" jdbcType=\"TIMESTAMP\"/>\n    <result column=\"last_operator\" property=\"lastOperator\" jdbcType=\"VARCHAR\"/>\n    <result column=\"last_operator_id\" property=\"lastOperatorId\" jdbcType=\"BIGINT\"/>\n    <result column=\"update_time\" property=\"updateTime\" jdbcType=\"TIMESTAMP\"/>\n    <result column=\"sub_images\" property=\"subImages\" jdbcType=\"LONGVARCHAR\"/>\n    <result column=\"detail\" property=\"detail\" jdbcType=\"LONGVARCHAR\"/>\n    <result column=\"product_code\" property=\"productCode\" jdbcType=\"VARCHAR\"/>\n  </resultMap>\n  <sql id =\"Base_OrderBy_Condition\">\n    <if test=\"orderBy != null and orderBy !=''\">\n      ORDER BY ${orderBy}\n    </if>\n  </sql>\n  <sql id=\"Base_Column_List\">\n    id,\n    version,\n    product_code,\n    category_id,\n    name,\n    subtitle,\n    main_image,\n    price,\n    stock,\n    status,\n    creator,\n    creator_id,\n    created_time,\n    last_operator,\n    last_operator_id,\n    update_time\n  </sql>\n  <update id=\"updateProductStockById\" parameterType=\"com.paascloud.provider.model.dto.ProductDto\">\n    UPDATE\n      pc_mdc_product\n    SET stock = stock + #{changeStock}\n    WHERE id = #{id}\n  </update>\n  <select id=\"selectByNameAndCategoryIds\" resultType=\"com.paascloud.provider.model.domain.MdcProduct\">\n    SELECT\n    <include refid=\"Base_Column_List\" />\n    from pc_mdc_product\n    where status = 1\n    <if test=\"productName != null and productName !=''\">\n      and name like concat('%', #{productName}, '%')\n    </if>\n    <if test=\"categoryIdList != null\">\n      and category_id in\n      <foreach item=\"item\" index=\"index\" open=\"(\" separator=\",\" close=\")\" collection=\"categoryIdList\">\n        #{item}\n      </foreach>\n    </if>\n    <if test=\"orderBy != null and orderBy != ''\">\n      order by ${orderBy}\n    </if>\n  </select>\n  <select id=\"queryProductListWithPage\" resultType=\"com.paascloud.provider.model.vo.ProductVo\">\n    SELECT\n    <include refid=\"Base_Column_List\" />\n    from pc_mdc_product\n    where 1 = 1\n    <if test=\"name != null and name !=''\">\n      and name like concat('%', #{name}, '%')\n    </if>\n    <if test=\"status != null\">\n      and status = #{status}\n    </if>\n    <include refid=\"Base_OrderBy_Condition\"></include>\n  </select>\n</mapper>"
  },
  {
    "path": "paascloud-provider/paascloud-provider-mdc/src/test/java/com/paascloud/provider/PaasCloudMdcApplicationTests.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：PaasCloudMdcApplicationTests.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider;\n\nimport org.junit.runner.RunWith;\nimport org.springframework.boot.test.context.SpringBootTest;\nimport org.springframework.test.context.junit4.SpringRunner;\n\n@RunWith(SpringRunner.class)\n@SpringBootTest\npublic class PaasCloudMdcApplicationTests {\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-omc/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n\txsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n\t<modelVersion>4.0.0</modelVersion>\n\n\t<artifactId>paascloud-provider-omc</artifactId>\n\t<packaging>jar</packaging>\n    <version>1.0</version>\n\n\t<name>paascloud-provider-omc</name>\n\t<description>订单管理中心 - Order management center</description>\n\n\t<parent>\n\t\t<groupId>com.liuzm.paascloud.provider</groupId>\n\t\t<artifactId>paascloud-provider</artifactId>\n\t\t<version>1.0</version>\n\t</parent>\n\n\t<properties>\n\t\t<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>\n\t\t<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>\n\t\t<java.version>1.8</java.version>\n\t</properties>\n\n    <dependencies>\n        <dependency>\n            <groupId>mysql</groupId>\n            <artifactId>mysql-connector-java</artifactId>\n            <scope>runtime</scope>\n        </dependency>\n        <dependency>\n            <groupId>joda-time</groupId>\n            <artifactId>joda-time</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.mybatis.spring.boot</groupId>\n            <artifactId>mybatis-spring-boot-starter</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>tk.mybatis</groupId>\n            <artifactId>mapper-spring-boot-starter</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>com.github.pagehelper</groupId>\n            <artifactId>pagehelper-spring-boot-starter</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>com.alibaba</groupId>\n            <artifactId>druid-spring-boot-starter</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.springframework.cloud</groupId>\n            <artifactId>spring-cloud-starter-feign</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>com.fasterxml.jackson.core</groupId>\n            <artifactId>jackson-databind</artifactId>\n        </dependency>\n\n        <dependency>\n            <groupId>com.liuzm.paascloud.provider.api</groupId>\n            <artifactId>paascloud-provider-omc-api</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>com.liuzm.paascloud.provider.api</groupId>\n            <artifactId>paascloud-provider-mdc-api</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>de.codecentric</groupId>\n            <artifactId>spring-boot-admin-starter-client</artifactId>\n        </dependency>\n        <!-- alipay start-->\n        <dependency>\n            <groupId>com.alipay</groupId>\n            <artifactId>alipay-sdk-java</artifactId>\n            <version>20170725114550</version>\n        </dependency>\n        <dependency>\n            <groupId>com.alipay</groupId>\n            <artifactId>alipay-trade-sdk</artifactId>\n            <version>20161215</version>\n        </dependency>\n        <dependency>\n            <groupId>commons-configuration</groupId>\n            <artifactId>commons-configuration</artifactId>\n            <version>1.10</version>\n        </dependency>\n        <dependency>\n            <groupId>commons-lang</groupId>\n            <artifactId>commons-lang</artifactId>\n            <version>2.6</version>\n        </dependency>\n        <dependency>\n            <groupId>commons-logging</groupId>\n            <artifactId>commons-logging</artifactId>\n            <version>1.1.1</version>\n        </dependency>\n        <dependency>\n            <groupId>com.google.zxing</groupId>\n            <artifactId>core</artifactId>\n            <version>2.1</version>\n        </dependency>\n        <dependency>\n            <groupId>com.google.code.gson</groupId>\n            <artifactId>gson</artifactId>\n            <version>2.3.1</version>\n        </dependency>\n        <dependency>\n            <groupId>org.hamcrest</groupId>\n            <artifactId>hamcrest-core</artifactId>\n            <version>1.3</version>\n        </dependency>\n        <!-- alipay end-->\n        <dependency>\n            <groupId>com.liuzm.paascloud.provider.api</groupId>\n            <artifactId>paascloud-provider-opc-api</artifactId>\n        </dependency>\n    </dependencies>\n</project>\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-omc/src/main/java/com/paascloud/PaasCloudOmcApplication.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：PaasCloudOmcApplication.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud;\n\nimport liquibase.integration.spring.SpringLiquibase;\nimport org.springframework.boot.SpringApplication;\nimport org.springframework.boot.autoconfigure.SpringBootApplication;\nimport org.springframework.cache.annotation.EnableCaching;\nimport org.springframework.cloud.client.discovery.EnableDiscoveryClient;\nimport org.springframework.cloud.netflix.feign.EnableFeignClients;\nimport org.springframework.cloud.netflix.hystrix.EnableHystrix;\nimport org.springframework.context.annotation.Bean;\nimport org.springframework.transaction.annotation.EnableTransactionManagement;\n\nimport javax.sql.DataSource;\n\n/**\n * The class Paas cloud omc application.\n *\n * @author paascloud.net@gmail.com\n */\n@EnableCaching\n@EnableHystrix\n@EnableFeignClients\n@EnableDiscoveryClient\n@SpringBootApplication\n@EnableTransactionManagement\npublic class PaasCloudOmcApplication {\n\n\t/**\n\t * The entry point of application.\n\t *\n\t * @param args the input arguments\n\t */\n\tpublic static void main(String[] args) {\n\t\tSpringApplication.run(PaasCloudOmcApplication.class, args);\n\t}\n\n\t@Bean\n\tpublic SpringLiquibase springLiquibase(DataSource dataSource) {\n\n\t\tSpringLiquibase springLiquibase = new SpringLiquibase();\n\n\t\tspringLiquibase.setDataSource(dataSource);\n\t\tspringLiquibase.setChangeLog(\"classpath:/liquibase/index.xml\");\n\n\t\treturn springLiquibase;\n\t}\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-omc/src/main/java/com/paascloud/provider/config/OmcWebMvcConfig.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：OmcWebMvcConfig.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.config;\n\nimport com.paascloud.core.config.PcObjectMapper;\nimport com.paascloud.core.config.SwaggerConfiguration;\nimport com.paascloud.core.interceptor.TokenInterceptor;\nimport org.springframework.context.annotation.Configuration;\nimport org.springframework.context.annotation.Import;\nimport org.springframework.http.converter.HttpMessageConverter;\nimport org.springframework.web.servlet.config.annotation.EnableWebMvc;\nimport org.springframework.web.servlet.config.annotation.InterceptorRegistry;\nimport org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;\nimport org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;\n\nimport javax.annotation.Resource;\nimport java.util.List;\n\n\n/**\n * The class Mdc web mvc config.\n *\n * @author paascloud.net @gmail.com\n */\n@Configuration\n@EnableWebMvc\n@Import(SwaggerConfiguration.class)\npublic class OmcWebMvcConfig extends WebMvcConfigurerAdapter {\n\n\t@Resource\n\tprivate TokenInterceptor vueViewInterceptor;\n\n\t@Override\n\tpublic void addResourceHandlers(ResourceHandlerRegistry registry) {\n\t\tregistry.addResourceHandler(\"/**\")\n\t\t\t\t.addResourceLocations(\"classpath:/META-INF/resources/\", \"classpath:/resources/\", \"classpath:/static/\");\n\t}\n\n\t/**\n\t * Add interceptors.\n\t *\n\t * @param registry the registry\n\t */\n\t@Override\n\tpublic void addInterceptors(InterceptorRegistry registry) {\n\t\tsuper.addInterceptors(registry);\n\t\tregistry.addInterceptor(vueViewInterceptor)\n\t\t\t\t.addPathPatterns(\"/**\")\n\t\t\t\t.excludePathPatterns(\"/pay/alipayCallback\", \"/swagger-resources/**\", \"*.js\", \"/**/*.js\", \"*.css\", \"/**/*.css\", \"*.html\", \"/**/*.html\");\n\t}\n\n\t@Override\n\tpublic void configureMessageConverters(List<HttpMessageConverter<?>> converters) {\n\t\tPcObjectMapper.buidMvcMessageConverter(converters);\n\t}\n\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-omc/src/main/java/com/paascloud/provider/config/ResourceServerConfig.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：ResourceServerConfig.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.config;\n\nimport org.springframework.context.annotation.Configuration;\nimport org.springframework.security.config.annotation.web.builders.HttpSecurity;\nimport org.springframework.security.oauth2.config.annotation.web.configuration.EnableResourceServer;\nimport org.springframework.security.oauth2.config.annotation.web.configuration.ResourceServerConfigurerAdapter;\n\nimport javax.servlet.http.HttpServletResponse;\n\n/**\n * The class Resource server config.\n *\n * @author paascloud.net @gmail.com\n */\n@Configuration\n@EnableResourceServer\npublic class ResourceServerConfig extends ResourceServerConfigurerAdapter {\n\t@Override\n\tpublic void configure(HttpSecurity http) throws Exception {\n\t\thttp\n\t\t\t\t.headers().frameOptions().disable()\n\t\t\t\t.and()\n\t\t\t\t.csrf().disable()\n\t\t\t\t.exceptionHandling()\n\t\t\t\t.authenticationEntryPoint((request, response, authException) -> response.sendError(HttpServletResponse.SC_UNAUTHORIZED))\n\t\t\t\t.and()\n\t\t\t\t.authorizeRequests().antMatchers(\"/pay/alipayCallback\", \"/druid/**\", \"/swagger-ui.html\", \"/swagger-resources/**\", \"/v2/api-docs\", \"/api/applications\").permitAll()\n\t\t\t\t.anyRequest().authenticated();\n\t}\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-omc/src/main/java/com/paascloud/provider/mapper/OmcCartMapper.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：OmcCartMapper.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.mapper;\n\nimport com.paascloud.core.mybatis.MyMapper;\nimport com.paascloud.provider.model.domain.OmcCart;\nimport org.apache.ibatis.annotations.Mapper;\nimport org.apache.ibatis.annotations.Param;\nimport org.springframework.stereotype.Component;\n\nimport java.util.List;\n\n/**\n * The interface Omc cart mapper.\n *\n * @author paascloud.net@gmail.com\n */\n@Mapper\n@Component\npublic interface OmcCartMapper extends MyMapper<OmcCart> {\n\t/**\n\t * Select un checked cart product count by user id int.\n\t *\n\t * @param userId the user id\n\t *\n\t * @return the int\n\t */\n\tint selectUnCheckedCartProductCountByUserId(Long userId);\n\n\t/**\n\t * Select by product id and user id omc cart.\n\t *\n\t * @param productId the product id\n\t * @param userId    the user id\n\t *\n\t * @return the omc cart\n\t */\n\tOmcCart selectByProductIdAndUserId(@Param(\"productId\") Long productId, @Param(\"userId\") Long userId);\n\n\t/**\n\t * Delete by user id product ids int.\n\t *\n\t * @param userId        the user id\n\t * @param productIdList the product id list\n\t *\n\t * @return the int\n\t */\n\tint deleteByUserIdProductIds(@Param(\"userId\") Long userId, @Param(\"productIdList\") List<String> productIdList);\n\n\t/**\n\t * Checked or unchecked product int.\n\t *\n\t * @param userId    the user id\n\t * @param productId the product id\n\t * @param checked   the checked\n\t *\n\t * @return the int\n\t */\n\tint checkedOrUncheckedProduct(@Param(\"userId\") Long userId, @Param(\"productId\") Long productId, @Param(\"checked\") int checked);\n\n\t/**\n\t * Select cart product count int.\n\t *\n\t * @param userId the user id\n\t *\n\t * @return the int\n\t */\n\tint selectCartProductCount(Long userId);\n\n\t/**\n\t * Select checked cart by user id list.\n\t *\n\t * @param userId the user id\n\t *\n\t * @return the list\n\t */\n\tList<OmcCart> selectCheckedCartByUserId(Long userId);\n\n\t/**\n\t * Batch delete cart int.\n\t *\n\t * @param idList the id list\n\t *\n\t * @return the int\n\t */\n\tint batchDeleteCart(@Param(\"idList\") List<Long> idList);\n}"
  },
  {
    "path": "paascloud-provider/paascloud-provider-omc/src/main/java/com/paascloud/provider/mapper/OmcOrderDetailMapper.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：OmcOrderDetailMapper.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.mapper;\n\nimport com.paascloud.core.mybatis.MyMapper;\nimport com.paascloud.provider.model.domain.OmcOrderDetail;\n\nimport org.apache.ibatis.annotations.Mapper;\nimport org.apache.ibatis.annotations.Param;\nimport org.springframework.stereotype.Component;\n\nimport java.util.List;\n\n/**\n * The interface Omc order detail mapper.\n *\n * @author paascloud.net@gmail.com\n */\n@Mapper\n@Component\npublic interface OmcOrderDetailMapper extends MyMapper<OmcOrderDetail> {\n\t/**\n\t * Gets list by order no user id.\n\t *\n\t * @param orderNo the order no\n\t * @param userId  the user id\n\t *\n\t * @return the list by order no user id\n\t */\n\tList<OmcOrderDetail> getListByOrderNoUserId(@Param(\"orderNo\") String orderNo, @Param(\"userId\") Long userId);\n\n\t/**\n\t * Gets list by order no.\n\t *\n\t * @param orderNo the order no\n\t *\n\t * @return the list by order no\n\t */\n\tList<OmcOrderDetail> getListByOrderNo(String orderNo);\n\n\t/**\n\t * Batch insert order detail int.\n\t *\n\t * @param orderItemList the order item list\n\t *\n\t * @return the int\n\t */\n\tint batchInsertOrderDetail(@Param(\"orderDetailList\") List<OmcOrderDetail> orderItemList);\n}"
  },
  {
    "path": "paascloud-provider/paascloud-provider-omc/src/main/java/com/paascloud/provider/mapper/OmcOrderMapper.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：OmcOrderMapper.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.mapper;\n\nimport com.paascloud.core.mybatis.MyMapper;\nimport com.paascloud.provider.model.domain.OmcOrder;\nimport com.paascloud.provider.model.dto.OrderPageQuery;\nimport com.paascloud.provider.model.vo.OrderDocVo;\nimport org.apache.ibatis.annotations.Mapper;\nimport org.apache.ibatis.annotations.Param;\nimport org.springframework.stereotype.Component;\n\nimport java.util.List;\n\n/**\n * The interface Omc order mapper.\n *\n * @author paascloud.net @gmail.com\n */\n@Mapper\n@Component\npublic interface OmcOrderMapper extends MyMapper<OmcOrder> {\n\t/**\n\t * Select by user id and order no omc order.\n\t *\n\t * @param userId  the user id\n\t * @param orderNo the order no\n\t *\n\t * @return the omc order\n\t */\n\tOmcOrder selectByUserIdAndOrderNo(@Param(\"userId\") Long userId, @Param(\"orderNo\") String orderNo);\n\n\t/**\n\t * Select by order no omc order.\n\t *\n\t * @param orderNo the order no\n\t *\n\t * @return the omc order\n\t */\n\tOmcOrder selectByOrderNo(String orderNo);\n\n\t/**\n\t * Select by user id list.\n\t *\n\t * @param userId the user id\n\t *\n\t * @return the list\n\t */\n\tList<OmcOrder> selectByUserId(Long userId);\n\n\t/**\n\t * Select all order list.\n\t *\n\t * @return the list\n\t */\n\tList<OmcOrder> selectAllOrder();\n\n\t/**\n\t * Query order list with page list.\n\t *\n\t * @param orderPageQuery the order page query\n\t *\n\t * @return the list\n\t */\n\tList<OrderDocVo> queryOrderListWithPage(OrderPageQuery orderPageQuery);\n}"
  },
  {
    "path": "paascloud-provider/paascloud-provider-omc/src/main/java/com/paascloud/provider/mapper/OmcShippingMapper.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：OmcShippingMapper.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.mapper;\n\nimport com.paascloud.core.mybatis.MyMapper;\nimport com.paascloud.provider.model.domain.OmcShipping;\n\nimport org.apache.ibatis.annotations.Mapper;\nimport org.apache.ibatis.annotations.Param;\nimport org.springframework.stereotype.Component;\n\nimport java.util.List;\n\n/**\n * The interface Omc shipping mapper.\n *\n * @author paascloud.net@gmail.com\n */\n@Mapper\n@Component\npublic interface OmcShippingMapper extends MyMapper<OmcShipping> {\n\t/**\n\t * Delete by shipping id user id int.\n\t *\n\t * @param userId     the user id\n\t * @param shippingId the shipping id\n\t *\n\t * @return the int\n\t */\n\tint deleteByShippingIdUserId(@Param(\"userId\") Long userId, @Param(\"shippingId\") Integer shippingId);\n\n\t/**\n\t * Select by shipping id user id omc shipping.\n\t *\n\t * @param userId     the user id\n\t * @param shippingId the shipping id\n\t *\n\t * @return the omc shipping\n\t */\n\tOmcShipping selectByShippingIdUserId(@Param(\"userId\") Long userId, @Param(\"shippingId\") Long shippingId);\n\n\t/**\n\t * Select by user id list.\n\t *\n\t * @param userId the user id\n\t *\n\t * @return the list\n\t */\n\tList<OmcShipping> selectByUserId(@Param(\"userId\") Long userId);\n\n\t/**\n\t * Select default address by user id omc shipping.\n\t *\n\t * @param userId the user id\n\t *\n\t * @return the omc shipping\n\t */\n\tOmcShipping selectDefaultAddressByUserId(Long userId);\n}"
  },
  {
    "path": "paascloud-provider/paascloud-provider-omc/src/main/java/com/paascloud/provider/mapper/PtcPayInfoMapper.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：PtcPayInfoMapper.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.mapper;\n\nimport com.paascloud.core.mybatis.MyMapper;\nimport com.paascloud.provider.model.domain.PtcPayInfo;\nimport org.apache.ibatis.annotations.Mapper;\nimport org.springframework.stereotype.Component;\n\n/**\n * The interface Ptc pay info mapper.\n *\n * @author paascloud.net@gmail.com\n */\n@Mapper\n@Component\npublic interface PtcPayInfoMapper extends MyMapper<PtcPayInfo> {\n}"
  },
  {
    "path": "paascloud-provider/paascloud-provider-omc/src/main/java/com/paascloud/provider/model/domain/OmcCart.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：OmcCart.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.model.domain;\n\nimport com.paascloud.core.mybatis.BaseEntity;\nimport lombok.Data;\nimport lombok.EqualsAndHashCode;\n\nimport javax.persistence.Column;\nimport javax.persistence.Table;\n\n/**\n * The class Omc cart.\n *\n * @author paascloud.net@gmail.com\n */\n@EqualsAndHashCode(callSuper = true)\n@Data\n@Table(name = \"pc_omc_cart\")\npublic class OmcCart extends BaseEntity {\n\n\tprivate static final long serialVersionUID = 5333646386138778574L;\n\t@Column(name = \"user_id\")\n\tprivate Long userId;\n\n\t@Column(name = \"product_id\")\n\tprivate Long productId;\n\n\t/**\n\t * 数量\n\t */\n\tprivate Integer quantity;\n\n\t/**\n\t * 是否选择,1=已勾选,0=未勾选\n\t */\n\tprivate Integer checked;\n}"
  },
  {
    "path": "paascloud-provider/paascloud-provider-omc/src/main/java/com/paascloud/provider/model/domain/OmcOrder.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：OmcOrder.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.model.domain;\n\nimport com.paascloud.core.mybatis.BaseEntity;\nimport lombok.Data;\nimport lombok.EqualsAndHashCode;\n\nimport javax.persistence.Column;\nimport javax.persistence.Table;\nimport java.math.BigDecimal;\nimport java.util.Date;\n\n/**\n * The class Omc order.\n *\n * @author paascloud.net@gmail.com\n */\n@EqualsAndHashCode(callSuper = true)\n@Data\n@Table(name = \"pc_omc_order\")\npublic class OmcOrder extends BaseEntity {\n\n\tprivate static final long serialVersionUID = -8434937678211570532L;\n\t/**\n\t * 订单号\n\t */\n\t@Column(name = \"order_no\")\n\tprivate String orderNo;\n\n\t/**\n\t * 用户id\n\t */\n\t@Column(name = \"user_id\")\n\tprivate Long userId;\n\n\t@Column(name = \"shipping_id\")\n\tprivate Long shippingId;\n\n\t/**\n\t * 实际付款金额,单位是元,保留两位小数\n\t */\n\tprivate BigDecimal payment;\n\n\t/**\n\t * 支付类型,1-在线支付\n\t */\n\t@Column(name = \"payment_type\")\n\tprivate Integer paymentType;\n\n\t/**\n\t * 运费,单位是元\n\t */\n\tprivate Integer postage;\n\n\t/**\n\t * 订单状态:0-已取消-10-未付款, 20-已付款, 40-已发货, 50-交易成功, 60-交易关闭\n\t */\n\tprivate Integer status;\n\n\t/**\n\t * 支付时间\n\t */\n\t@Column(name = \"payment_time\")\n\tprivate Date paymentTime;\n\n\t/**\n\t * 发货时间\n\t */\n\t@Column(name = \"send_time\")\n\tprivate Date sendTime;\n\n\t/**\n\t * 交易完成时间\n\t */\n\t@Column(name = \"end_time\")\n\tprivate Date endTime;\n\n\t/**\n\t * 交易关闭时间\n\t */\n\t@Column(name = \"close_time\")\n\tprivate Date closeTime;\n}"
  },
  {
    "path": "paascloud-provider/paascloud-provider-omc/src/main/java/com/paascloud/provider/model/domain/OmcOrderDetail.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：OmcOrderDetail.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.model.domain;\n\nimport com.paascloud.core.mybatis.BaseEntity;\nimport lombok.Data;\nimport lombok.EqualsAndHashCode;\n\nimport javax.persistence.Column;\nimport javax.persistence.Table;\nimport java.math.BigDecimal;\n\n/**\n * The class Omc order detail.\n *\n * @author paascloud.net@gmail.com\n */\n@EqualsAndHashCode(callSuper = true)\n@Data\n@Table(name = \"pc_omc_order_detail\")\npublic class OmcOrderDetail extends BaseEntity {\n\n\tprivate static final long serialVersionUID = -2167960069551022897L;\n\t/**\n\t * 订单明细序列号\n\t */\n\t@Column(name = \"detail_no\")\n\tprivate String detailNo;\n\n\t@Column(name = \"user_id\")\n\tprivate Long userId;\n\n\t@Column(name = \"order_no\")\n\tprivate String orderNo;\n\n\t@Column(name = \"product_id\")\n\tprivate Long productId;\n\n\t/**\n\t * 商品名称\n\t */\n\t@Column(name = \"product_name\")\n\tprivate String productName;\n\n\t/**\n\t * 商品图片地址\n\t */\n\t@Column(name = \"product_image\")\n\tprivate String productImage;\n\n\t/**\n\t * 生成订单时的商品单价, 单位是元,保留两位小数\n\t */\n\t@Column(name = \"current_unit_price\")\n\tprivate BigDecimal currentUnitPrice;\n\n\t/**\n\t * 商品数量\n\t */\n\tprivate Integer quantity;\n\n\t/**\n\t * 商品总价,单位是元,保留两位小数\n\t */\n\t@Column(name = \"total_price\")\n\tprivate BigDecimal totalPrice;\n}"
  },
  {
    "path": "paascloud-provider/paascloud-provider-omc/src/main/java/com/paascloud/provider/model/domain/OmcShipping.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：OmcShipping.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.model.domain;\n\nimport com.paascloud.core.mybatis.BaseEntity;\nimport lombok.Data;\nimport lombok.EqualsAndHashCode;\n\nimport javax.persistence.Column;\nimport javax.persistence.Table;\n\n/**\n * The class Omc shipping.\n *\n * @author paascloud.net@gmail.com\n */\n@EqualsAndHashCode(callSuper = true)\n@Data\n@Table(name = \"pc_omc_shipping\")\npublic class OmcShipping extends BaseEntity {\n\n\tprivate static final long serialVersionUID = 7337074530378267740L;\n\t/**\n\t * 用户id\n\t */\n\t@Column(name = \"user_id\")\n\tprivate Long userId;\n\n\t/**\n\t * 收货姓名\n\t */\n\t@Column(name = \"receiver_name\")\n\tprivate String receiverName;\n\n\t/**\n\t * 收货固定电话\n\t */\n\t@Column(name = \"receiver_phone_no\")\n\tprivate String receiverPhoneNo;\n\n\t/**\n\t * 收货移动电话\n\t */\n\t@Column(name = \"receiver_mobile_no\")\n\tprivate String receiverMobileNo;\n\n\t/**\n\t * 收货人省ID\n\t */\n\t@Column(name = \"province_id\")\n\tprivate Long provinceId;\n\n\t/**\n\t * 省份\n\t */\n\t@Column(name = \"province_name\")\n\tprivate String provinceName;\n\n\t/**\n\t * 收货人城市ID\n\t */\n\t@Column(name = \"city_id\")\n\tprivate Long cityId;\n\n\t/**\n\t * 收货人城市名称\n\t */\n\t@Column(name = \"city_name\")\n\tprivate String cityName;\n\n\t/**\n\t * 区/县\n\t */\n\t@Column(name = \"district_name\")\n\tprivate String districtName;\n\n\t/**\n\t * 区/县 编码\n\t */\n\t@Column(name = \"district_id\")\n\tprivate Long districtId;\n\n\t/**\n\t * 街道ID\n\t */\n\t@Column(name = \"street_id\")\n\tprivate Long streetId;\n\n\t/**\n\t * 接到名称\n\t */\n\t@Column(name = \"street_name\")\n\tprivate String streetName;\n\n\t/**\n\t * 详细地址\n\t */\n\t@Column(name = \"detail_address\")\n\tprivate String detailAddress;\n\n\t/**\n\t * 邮编\n\t */\n\t@Column(name = \"receiver_zip_code\")\n\tprivate String receiverZipCode;\n\n\t/**\n\t * 邮编\n\t */\n\t@Column(name = \"default_address\")\n\tprivate Integer defaultAddress;\n}"
  },
  {
    "path": "paascloud-provider/paascloud-provider-omc/src/main/java/com/paascloud/provider/model/domain/PtcPayInfo.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：PtcPayInfo.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.model.domain;\n\nimport com.paascloud.core.mybatis.BaseEntity;\nimport lombok.Data;\nimport lombok.EqualsAndHashCode;\n\nimport javax.persistence.Column;\nimport javax.persistence.Table;\n\n/**\n * The class Ptc pay info.\n *\n * @author paascloud.net@gmail.com\n */\n@EqualsAndHashCode(callSuper = true)\n@Table(name = \"pc_ptc_pay_info\")\n@Data\npublic class PtcPayInfo extends BaseEntity {\n\n\tprivate static final long serialVersionUID = 7949091072343450552L;\n\t/**\n\t * 用户id\n\t */\n\t@Column(name = \"user_id\")\n\tprivate Long userId;\n\n\t/**\n\t * 订单号\n\t */\n\t@Column(name = \"order_no\")\n\tprivate String orderNo;\n\n\t/**\n\t * 支付平台:1-支付宝,2-微信\n\t */\n\t@Column(name = \"pay_platform\")\n\tprivate Integer payPlatform;\n\n\t/**\n\t * 支付宝支付流水号\n\t */\n\t@Column(name = \"platform_number\")\n\tprivate String platformNumber;\n\n\t/**\n\t * 支付宝支付状态\n\t */\n\t@Column(name = \"platform_status\")\n\tprivate String platformStatus;\n\n}"
  },
  {
    "path": "paascloud-provider/paascloud-provider-omc/src/main/java/com/paascloud/provider/service/MdcProductService.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：MdcProductService.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.service;\n\nimport com.paascloud.provider.model.dto.ProductDto;\nimport com.paascloud.provider.model.vo.ProductDetailVo;\n\n/**\n * The interface Mdc product service.\n *\n * @author paascloud.net @gmail.com\n */\npublic interface MdcProductService {\n\t/**\n\t * Select by id product dto.\n\t *\n\t * @param productId the product id\n\t *\n\t * @return the product dto\n\t */\n\tProductDto selectById(Long productId);\n\n\t/**\n\t * Gets product detail.\n\t *\n\t * @param productId the product id\n\t *\n\t * @return the product detail\n\t */\n\tProductDetailVo getProductDetail(Long productId);\n\n\t/**\n\t * Update product stock by id int.\n\t *\n\t * @param productDto the product dto\n\t *\n\t * @return the int\n\t */\n\tint updateProductStockById(ProductDto productDto);\n\n\t/**\n\t * Gets main image.\n\t *\n\t * @param productId the product id\n\t *\n\t * @return the main image\n\t */\n\tString getMainImage(Long productId);\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-omc/src/main/java/com/paascloud/provider/service/OmcCartService.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：OmcCartService.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.service;\n\nimport com.paascloud.base.dto.LoginAuthDto;\nimport com.paascloud.core.support.IService;\nimport com.paascloud.provider.model.domain.OmcCart;\nimport com.paascloud.provider.model.domain.OmcOrderDetail;\nimport com.paascloud.provider.model.vo.CartProductVo;\nimport com.paascloud.provider.model.vo.CartVo;\nimport com.paascloud.provider.model.vo.OrderProductVo;\n\nimport java.util.List;\n\n/**\n * The interface Omc cart service.\n *\n * @author paascloud.net@gmail.com\n */\npublic interface OmcCartService extends IService<OmcCart> {\n\t/**\n\t * 获取购物车信息.\n\t *\n\t * @param userId the user id\n\t *\n\t * @return the car vo\n\t */\n\tCartVo getCarVo(Long userId);\n\n\t/**\n\t * Select cart list by user id list.\n\t *\n\t * @param userId the user id\n\t *\n\t * @return the list\n\t */\n\tList<OmcCart> selectCartListByUserId(Long userId);\n\n\t/**\n\t * 更新购物车.\n\t *\n\t * @param cartProductVoList the cart product vo list\n\t *\n\t * @return the int\n\t */\n\tint updateCartList(List<CartProductVo> cartProductVoList);\n\n\t/**\n\t * Save cart.\n\t *\n\t * @param omcCart the omc cart\n\t * @param authDto the auth dto\n\t */\n\tvoid saveCart(OmcCart omcCart, LoginAuthDto authDto);\n\n\t/**\n\t * 保存购物车信息.\n\t *\n\t * @param userId    the user id\n\t * @param productId the product id\n\t * @param count     the count\n\t *\n\t * @return the int\n\t */\n\tint saveCart(Long userId, Long productId, int count);\n\n\t/**\n\t * Gets cart by user id and product id.\n\t *\n\t * @param userId    the user id\n\t * @param productId the product id\n\t *\n\t * @return the cart by user id and product id\n\t */\n\tOmcCart getCartByUserIdAndProductId(Long userId, Long productId);\n\n\t/**\n\t * 删除购物车商品信息.\n\t *\n\t * @param userId     the user id\n\t * @param productIds the product ids\n\t *\n\t * @return the int\n\t */\n\tint deleteProduct(Long userId, String productIds);\n\n\t/**\n\t * 选中或者反选商品信息.\n\t *\n\t * @param userId    the user id\n\t * @param productId the product id\n\t * @param checked   the checked\n\t *\n\t * @return the int\n\t */\n\tint selectOrUnSelect(Long userId, Long productId, int checked);\n\n\t/**\n\t * 更新购物车信息.\n\t *\n\t * @param userId    the user id\n\t * @param productId the product id\n\t * @param count     the count\n\t *\n\t * @return the int\n\t */\n\tint updateCart(Long userId, Long productId, int count);\n\n\t/**\n\t * 获取购物车商品数量.\n\t *\n\t * @param userId the user id\n\t *\n\t * @return the or cart product\n\t */\n\tOrderProductVo getOrderCartProduct(Long userId);\n\n\t/**\n\t * Gets cart order item.\n\t *\n\t * @param userId   the user id\n\t * @param cartList the cart list\n\t *\n\t * @return the cart order item\n\t */\n\tList<OmcOrderDetail> getCartOrderItem(Long userId, List<OmcCart> cartList);\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-omc/src/main/java/com/paascloud/provider/service/OmcOrderDetailService.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：OmcOrderDetailService.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.service;\n\nimport com.paascloud.core.support.IService;\nimport com.paascloud.provider.model.domain.OmcOrderDetail;\n\nimport java.util.List;\n\n/**\n * The interface Omc order detail service.\n *\n * @author paascloud.net@gmail.com\n */\npublic interface OmcOrderDetailService extends IService<OmcOrderDetail> {\n\t/**\n\t * 获取用户订单详情.\n\t *\n\t * @param orderNo the order no\n\t * @param userId  the user id\n\t *\n\t * @return the list by order no user id\n\t */\n\tList<OmcOrderDetail> getListByOrderNoUserId(String orderNo, Long userId);\n\n\t/**\n\t * Gets list by order no.\n\t *\n\t * @param orderNo the order no\n\t *\n\t * @return the list by order no\n\t */\n\tList<OmcOrderDetail> getListByOrderNo(String orderNo);\n\n\t/**\n\t * Batch insert order detail.\n\t *\n\t * @param omcOrderDetailList the omc order detail list\n\t */\n\tvoid batchInsertOrderDetail(List<OmcOrderDetail> omcOrderDetailList);\n}"
  },
  {
    "path": "paascloud-provider/paascloud-provider-omc/src/main/java/com/paascloud/provider/service/OmcOrderService.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：OmcOrderService.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.service;\n\nimport com.github.pagehelper.PageInfo;\nimport com.paascloud.base.dto.BaseQuery;\nimport com.paascloud.base.dto.LoginAuthDto;\nimport com.paascloud.core.support.IService;\nimport com.paascloud.provider.model.domain.OmcOrder;\nimport com.paascloud.provider.model.dto.OrderDto;\nimport com.paascloud.provider.model.dto.OrderPageQuery;\nimport com.paascloud.provider.model.vo.OrderVo;\n\n/**\n * The interface Omc order service.\n *\n * @author paascloud.net @gmail.com\n */\npublic interface OmcOrderService extends IService<OmcOrder> {\n\n\t/**\n\t * 创建订单.\n\t *\n\t * @param loginAuthDto the login auth dto\n\t * @param shippingId   the shipping id\n\t *\n\t * @return the order vo\n\t */\n\tOrderVo createOrderDoc(LoginAuthDto loginAuthDto, Long shippingId);\n\n\t/**\n\t * 取消订单.\n\t *\n\t * @param loginAuthDto the login auth dto\n\t * @param orderNo      the order no\n\t *\n\t * @return the int\n\t */\n\tint cancelOrderDoc(LoginAuthDto loginAuthDto, String orderNo);\n\n\t/**\n\t * 查询用户订单列表.\n\t *\n\t * @param userId    the user id\n\t * @param baseQuery the base query\n\t *\n\t * @return the page info\n\t */\n\tPageInfo queryUserOrderListWithPage(Long userId, BaseQuery baseQuery);\n\n\t/**\n\t * 查询订单状态.\n\t *\n\t * @param userId  the user id\n\t * @param orderNo the order no\n\t *\n\t * @return the boolean\n\t */\n\tboolean queryOrderPayStatus(Long userId, String orderNo);\n\n\t/**\n\t * Query by order no omc order.\n\t *\n\t * @param orderNo the order no\n\t *\n\t * @return the omc order\n\t */\n\tOmcOrder queryByOrderNo(String orderNo);\n\n\t/**\n\t * Query by user id and order no omc order.\n\t *\n\t * @param userId  the user id\n\t * @param orderNo the order no\n\t *\n\t * @return the omc order\n\t */\n\tOmcOrder queryByUserIdAndOrderNo(Long userId, String orderNo);\n\n\t/**\n\t * 根据订单号查询订单信息.\n\t *\n\t * @param orderNo the order no\n\t *\n\t * @return the order dto\n\t */\n\tOrderDto queryOrderDtoByOrderNo(String orderNo);\n\n\t/**\n\t * 根据订单号查询用户订单信息.\n\t *\n\t * @param userId  the user id\n\t * @param orderNo the order no\n\t *\n\t * @return the order dto\n\t */\n\tOrderDto queryOrderDtoByUserIdAndOrderNo(Long userId, String orderNo);\n\n\t/**\n\t * 查询用户订单详情.\n\t *\n\t * @param userId  the user id\n\t * @param orderNo the order no\n\t *\n\t * @return the order detail\n\t */\n\tOrderVo getOrderDetail(Long userId, String orderNo);\n\n\t/**\n\t * 查询订单详情.\n\t *\n\t * @param orderNo the order no\n\t *\n\t * @return the order detail\n\t */\n\tOrderVo getOrderDetail(String orderNo);\n\n\t/**\n\t * 分页查询订单列表.\n\t *\n\t * @param orderPageQuery the order page query\n\t *\n\t * @return the page info\n\t */\n\tPageInfo queryOrderListWithPage(OrderPageQuery orderPageQuery);\n}"
  },
  {
    "path": "paascloud-provider/paascloud-provider-omc/src/main/java/com/paascloud/provider/service/OmcShippingService.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：OmcShippingService.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.service;\n\nimport com.github.pagehelper.PageInfo;\nimport com.paascloud.base.dto.LoginAuthDto;\nimport com.paascloud.core.support.IService;\nimport com.paascloud.provider.model.domain.OmcShipping;\n\nimport java.util.List;\n\n/**\n * The interface Omc shipping service.\n *\n * @author paascloud.net@gmail.com\n */\npublic interface OmcShippingService extends IService<OmcShipping> {\n\t/**\n\t * 编辑收货人地址.\n\t *\n\t * @param loginAuthDto the login auth dto\n\t * @param shipping     the shipping\n\t *\n\t * @return the int\n\t */\n\tint saveShipping(LoginAuthDto loginAuthDto, OmcShipping shipping);\n\n\t/**\n\t * 删除收货人地址.\n\t *\n\t * @param userId     the user id\n\t * @param shippingId the shipping id\n\t *\n\t * @return the int\n\t */\n\tint deleteShipping(Long userId, Integer shippingId);\n\n\t/**\n\t * 根据Id查询收货人地址.\n\t *\n\t * @param userId     the user id\n\t * @param shippingId the shipping id\n\t *\n\t * @return the omc shipping\n\t */\n\tOmcShipping selectByShippingIdUserId(Long userId, Long shippingId);\n\n\t/**\n\t * Query shipping list list.\n\t *\n\t * @param omcShipping the omc shipping\n\t *\n\t * @return the list\n\t */\n\tList<OmcShipping> queryShippingList(OmcShipping omcShipping);\n\n\t/**\n\t * 分页查询收货人地址列表.\n\t *\n\t * @param omcShipping the omc shipping\n\t *\n\t * @return the page info\n\t */\n\tPageInfo queryShippingListWithPage(OmcShipping omcShipping);\n\n\t/**\n\t * 分页查询当前用户收货人地址列表.\n\t *\n\t * @param userId   the user id\n\t * @param pageNum  the page num\n\t * @param pageSize the page size\n\t *\n\t * @return the page info\n\t */\n\tPageInfo queryListWithPageByUserId(Long userId, int pageNum, int pageSize);\n\n\t/**\n\t * Select by user id list.\n\t *\n\t * @param userId the user id\n\t *\n\t * @return the list\n\t */\n\tList<OmcShipping> selectByUserId(Long userId);\n\n\t/**\n\t * 设置默认收货地址.\n\t *\n\t * @param loginAuthDto the login auth dto\n\t * @param addressId    the address id\n\t *\n\t * @return the default address\n\t */\n\tint setDefaultAddress(LoginAuthDto loginAuthDto, Long addressId);\n}"
  },
  {
    "path": "paascloud-provider/paascloud-provider-omc/src/main/java/com/paascloud/provider/service/OpcOssService.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：OpcOssService.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.service;\n\nimport com.paascloud.provider.model.dto.oss.OptGetUrlRequest;\nimport com.paascloud.provider.model.dto.oss.OptUploadFileReqDto;\nimport com.paascloud.provider.model.dto.oss.OptUploadFileRespDto;\n\n/**\n * The interface Opc oss service.\n *\n * @author paascloud.net@gmail.com\n */\npublic interface OpcOssService {\n\t/**\n\t * Upload file opt upload file resp dto.\n\t *\n\t * @param optUploadFileReqDto the opt upload file req dto\n\t *\n\t * @return the opt upload file resp dto\n\t */\n\tOptUploadFileRespDto uploadFile(OptUploadFileReqDto optUploadFileReqDto);\n\n\t/**\n\t * Gets file url.\n\t *\n\t * @param optGetUrlRequest the opt get url request\n\t *\n\t * @return the file url\n\t */\n\tString getFileUrl(OptGetUrlRequest optGetUrlRequest);\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-omc/src/main/java/com/paascloud/provider/service/PtcAlipayService.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：PtcAlipayService.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.service;\n\nimport com.paascloud.base.dto.LoginAuthDto;\nimport com.paascloud.wrapper.Wrapper;\n\nimport java.util.Map;\n\n/**\n * The interface Ptc alipay service.\n *\n * @author paascloud.net@gmail.com\n */\npublic interface PtcAlipayService {\n\n\t/**\n\t * 生成付款二维码.\n\t *\n\t * @param orderNo      the order no\n\t * @param loginAuthDto the login auth dto\n\t *\n\t * @return the wrapper\n\t */\n\tWrapper pay(String orderNo, LoginAuthDto loginAuthDto);\n\n\t/**\n\t * Ali pay callback wrapper.\n\t *\n\t * @param params the params\n\t *\n\t * @return the wrapper\n\t */\n\tWrapper aliPayCallback(Map<String, String> params);\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-omc/src/main/java/com/paascloud/provider/service/PtcPayInfoService.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：PtcPayInfoService.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.service;\n\nimport com.paascloud.core.support.IService;\nimport com.paascloud.provider.model.domain.PtcPayInfo;\n\n/**\n * The interface Ptc pay info service.\n *\n * @author paascloud.net@gmail.com\n */\npublic interface PtcPayInfoService extends IService<PtcPayInfo> {\n}"
  },
  {
    "path": "paascloud-provider/paascloud-provider-omc/src/main/java/com/paascloud/provider/service/impl/MdcProductServiceImpl.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：MdcProductServiceImpl.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.service.impl;\n\n\nimport com.google.common.base.Preconditions;\nimport com.paascloud.base.enums.ErrorCodeEnum;\nimport com.paascloud.provider.exceptions.MdcBizException;\nimport com.paascloud.provider.model.dto.ProductDto;\nimport com.paascloud.provider.model.vo.ProductDetailVo;\nimport com.paascloud.provider.service.MdcProductFeignApi;\nimport com.paascloud.provider.service.MdcProductQueryFeignApi;\nimport com.paascloud.provider.service.MdcProductService;\nimport com.paascloud.wrapper.Wrapper;\nimport lombok.extern.slf4j.Slf4j;\nimport org.springframework.stereotype.Service;\n\nimport javax.annotation.Resource;\n\n/**\n * The class Mdc product service.\n *\n * @author paascloud.net@gmail.com\n */\n@Slf4j\n@Service\npublic class MdcProductServiceImpl implements MdcProductService {\n\t@Resource\n\tprivate MdcProductQueryFeignApi mdcProductQueryFeignApi;\n\t@Resource\n\tprivate MdcProductFeignApi mdcProductFeignApi;\n\n\t@Override\n\tpublic ProductDto selectById(Long productId) {\n\t\tlog.info(\"查询商品信息. productId={}\", productId);\n\t\tPreconditions.checkArgument(productId != null, ErrorCodeEnum.MDC10021021.msg());\n\t\tWrapper<ProductDto> productDtoWrapper = mdcProductQueryFeignApi.selectById(productId);\n\n\t\tif (productDtoWrapper == null) {\n\t\t\tthrow new MdcBizException(ErrorCodeEnum.MDC10021003);\n\t\t}\n\t\tif (productDtoWrapper.error()) {\n\t\t\tthrow new MdcBizException(ErrorCodeEnum.MDC10021004, productId);\n\t\t}\n\t\treturn productDtoWrapper.getResult();\n\n\t}\n\n\t@Override\n\tpublic ProductDetailVo getProductDetail(Long productId) {\n\t\tlog.info(\"获取商品详情. productId={}\", productId);\n\t\tPreconditions.checkArgument(productId != null, ErrorCodeEnum.MDC10021021.msg());\n\n\t\tWrapper<ProductDetailVo> wrapper = mdcProductQueryFeignApi.getProductDetail(productId);\n\n\t\tif (wrapper == null) {\n\t\t\tthrow new MdcBizException(ErrorCodeEnum.GL99990002);\n\t\t}\n\t\tif (wrapper.error()) {\n\t\t\tthrow new MdcBizException(ErrorCodeEnum.MDC10021004, productId);\n\t\t}\n\t\treturn wrapper.getResult();\n\t}\n\n\t@Override\n\tpublic int updateProductStockById(ProductDto productDto) {\n\t\tPreconditions.checkArgument(productDto.getId() != null, ErrorCodeEnum.MDC10021021.msg());\n\t\tWrapper<Integer> wrapper = mdcProductFeignApi.updateProductStockById(productDto);\n\t\tif (wrapper == null) {\n\t\t\tthrow new MdcBizException(ErrorCodeEnum.GL99990002);\n\t\t}\n\t\tif (wrapper.error()) {\n\t\t\tthrow new MdcBizException(ErrorCodeEnum.MDC10021022, productDto.getId());\n\t\t}\n\t\treturn wrapper.getResult();\n\t}\n\n\t@Override\n\tpublic String getMainImage(final Long productId) {\n\t\tWrapper<String> wrapper = mdcProductFeignApi.getMainImage(productId);\n\t\tif (wrapper == null) {\n\t\t\tthrow new MdcBizException(ErrorCodeEnum.GL99990002);\n\t\t}\n\t\treturn wrapper.getResult();\n\t}\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-omc/src/main/java/com/paascloud/provider/service/impl/OmcCartServiceImpl.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：OmcCartServiceImpl.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.service.impl;\n\nimport com.google.common.base.Preconditions;\nimport com.google.common.base.Splitter;\nimport com.google.common.collect.Lists;\nimport com.paascloud.BigDecimalUtil;\nimport com.paascloud.PublicUtil;\nimport com.paascloud.base.constant.GlobalConstant;\nimport com.paascloud.base.dto.LoginAuthDto;\nimport com.paascloud.base.enums.ErrorCodeEnum;\nimport com.paascloud.core.support.BaseService;\nimport com.paascloud.provider.exceptions.MdcBizException;\nimport com.paascloud.provider.exceptions.OmcBizException;\nimport com.paascloud.provider.mapper.OmcCartMapper;\nimport com.paascloud.provider.model.constant.MdcApiConstant;\nimport com.paascloud.provider.model.constant.OmcApiConstant;\nimport com.paascloud.provider.model.domain.OmcCart;\nimport com.paascloud.provider.model.domain.OmcOrderDetail;\nimport com.paascloud.provider.model.dto.ProductDto;\nimport com.paascloud.provider.model.dto.oss.OptGetUrlRequest;\nimport com.paascloud.provider.model.vo.CartProductVo;\nimport com.paascloud.provider.model.vo.CartVo;\nimport com.paascloud.provider.model.vo.OrderItemVo;\nimport com.paascloud.provider.model.vo.OrderProductVo;\nimport com.paascloud.provider.service.MdcProductService;\nimport com.paascloud.provider.service.OmcCartService;\nimport com.paascloud.provider.service.OpcOssService;\nimport org.apache.commons.collections.CollectionUtils;\nimport org.apache.commons.lang3.StringUtils;\nimport org.springframework.stereotype.Service;\n\nimport javax.annotation.Resource;\nimport java.math.BigDecimal;\nimport java.util.List;\n\n/**\n * The class Omc cart service.\n *\n * @author paascloud.net@gmail.com\n */\n@Service\npublic class OmcCartServiceImpl extends BaseService<OmcCart> implements OmcCartService {\n\t@Resource\n\tprivate OmcCartMapper omcCartMapper;\n\t@Resource\n\tprivate MdcProductService mdcProductService;\n\t@Resource\n\tprivate OpcOssService opcOssService;\n\n\t@Override\n\tpublic CartVo getCarVo(Long userId) {\n\t\tlogger.info(\"getCarVo -  获取购物车列表 -- userId={}\", userId);\n\t\tCartVo cartVo = new CartVo();\n\t\tList<OmcCart> cartList = this.selectCartListByUserId(userId);\n\t\tList<CartProductVo> cartProductVoList = Lists.newArrayList();\n\n\t\tBigDecimal cartTotalPrice = new BigDecimal(\"0\");\n\n\t\tif (PublicUtil.isNotEmpty(cartList)) {\n\t\t\tfor (OmcCart cartItem : cartList) {\n\t\t\t\tCartProductVo cartProductVo = new CartProductVo();\n\t\t\t\tcartProductVo.setId(cartItem.getId());\n\t\t\t\tcartProductVo.setUserId(userId);\n\t\t\t\tcartProductVo.setProductId(cartItem.getProductId());\n\n\t\t\t\tProductDto product = mdcProductService.selectById(cartItem.getProductId());\n\n\t\t\t\tif (product == null) {\n\t\t\t\t\tthrow new MdcBizException(ErrorCodeEnum.MDC10021004, cartItem.getProductId());\n\t\t\t\t}\n\n\t\t\t\tcartProductVo.setProductMainImage(product.getMainImage());\n\t\t\t\tcartProductVo.setProductName(product.getName());\n\t\t\t\tcartProductVo.setProductSubtitle(product.getSubtitle());\n\t\t\t\tcartProductVo.setProductStatus(product.getStatus());\n\t\t\t\tcartProductVo.setProductPrice(product.getPrice());\n\t\t\t\tcartProductVo.setProductStock(product.getStock());\n\n\t\t\t\t//判断库存\n\t\t\t\tint buyLimitCount;\n\t\t\t\tif (product.getStock() >= cartItem.getQuantity()) {\n\t\t\t\t\t//库存充足的时候\n\t\t\t\t\tbuyLimitCount = cartItem.getQuantity();\n\t\t\t\t\tcartProductVo.setLimitQuantity(OmcApiConstant.Cart.LIMIT_NUM_SUCCESS);\n\t\t\t\t} else {\n\t\t\t\t\tbuyLimitCount = product.getStock();\n\t\t\t\t\tcartProductVo.setLimitQuantity(OmcApiConstant.Cart.LIMIT_NUM_FAIL);\n\t\t\t\t\t//购物车中更新有效库存\n\t\t\t\t\tOmcCart cartForQuantity = new OmcCart();\n\t\t\t\t\tcartForQuantity.setId(cartItem.getId());\n\t\t\t\t\tcartForQuantity.setQuantity(buyLimitCount);\n\t\t\t\t\tomcCartMapper.updateByPrimaryKeySelective(cartForQuantity);\n\t\t\t\t}\n\t\t\t\tcartProductVo.setQuantity(buyLimitCount);\n\t\t\t\t//计算总价\n\t\t\t\tcartProductVo.setProductTotalPrice(BigDecimalUtil.mul(product.getPrice().doubleValue(), cartProductVo.getQuantity()));\n\t\t\t\tcartProductVo.setChecked(cartItem.getChecked());\n\n\t\t\t\tif (cartItem.getChecked() == OmcApiConstant.Cart.CHECKED) {\n\t\t\t\t\t//如果已经勾选,增加到整个的购物车总价中\n\t\t\t\t\tcartTotalPrice = BigDecimalUtil.add(cartTotalPrice.doubleValue(), cartProductVo.getProductTotalPrice().doubleValue());\n\t\t\t\t}\n\t\t\t\tcartProductVoList.add(cartProductVo);\n\t\t\t}\n\t\t}\n\t\tcartVo.setCartTotalPrice(cartTotalPrice);\n\t\tcartVo.setCartProductVoList(cartProductVoList);\n\t\tcartVo.setAllChecked(this.getAllCheckedStatus(userId));\n\t\treturn cartVo;\n\t}\n\n\t@Override\n\tpublic List<OmcCart> selectCartListByUserId(Long userId) {\n\t\tlogger.info(\"selectCartListByUserId - 查询购物车记录 userId={}\", userId);\n\n\t\tPreconditions.checkArgument(userId != null, ErrorCodeEnum.UAC10011001.msg());\n\n\t\tOmcCart omcCart = new OmcCart();\n\t\tomcCart.setUserId(userId);\n\t\treturn omcCartMapper.select(omcCart);\n\t}\n\n\t@Override\n\tpublic int updateCartList(List<CartProductVo> cartProductVoList) {\n\t\tlogger.info(\"updateCartList - 更新购物车集合 cartProductVoList={}\", cartProductVoList);\n\n\t\tLoginAuthDto loginUser = new LoginAuthDto();\n\t\tloginUser.setLoginName(GlobalConstant.Sys.SUPER_MANAGER_LOGIN_NAME);\n\t\tloginUser.setUserId(1L);\n\t\tfor (CartProductVo cartProductVo : cartProductVoList) {\n\t\t\tInteger quantity = cartProductVo.getQuantity();\n\t\t\tInteger productChecked = cartProductVo.getChecked();\n\t\t\tLong productId = cartProductVo.getProductId();\n\n\t\t\tProductDto productDto = mdcProductService.selectById(productId);\n\n\t\t\tif (PublicUtil.isEmpty(productDto)) {\n\t\t\t\tthrow new MdcBizException(ErrorCodeEnum.MDC10021004, productId);\n\t\t\t}\n\n\t\t\tOmcCart omcCart = new OmcCart();\n\t\t\tomcCart.setUserId(loginUser.getUserId());\n\t\t\tomcCart.setQuantity(quantity);\n\t\t\tomcCart.setChecked(productChecked);\n\t\t\tomcCart.setProductId(productId);\n\t\t\tomcCart.setQuantity(quantity);\n\n\t\t\tthis.saveCart(omcCart, loginUser);\n\t\t}\n\t\treturn 1;\n\t}\n\n\t@Override\n\tpublic void saveCart(OmcCart omcCart, LoginAuthDto authDto) {\n\t\tlogger.info(\"saveCart - 保存购物车记录 omcCart={}, userId={}\", omcCart, authDto.getUserId());\n\n\t\tLong productId = omcCart.getProductId();\n\t\tLong userId = authDto.getUserId();\n\t\tPreconditions.checkArgument(productId != null, \"货品ID不能为空\");\n\t\tPreconditions.checkArgument(userId != null, ErrorCodeEnum.UAC10011001.msg());\n\n\t\tomcCart.setUpdateInfo(authDto);\n\t\tOmcCart omcCartExist = omcCartMapper.selectByProductIdAndUserId(productId, userId);\n\t\tif (PublicUtil.isEmpty(omcCartExist)) {\n\t\t\ttry {\n\t\t\t\tomcCartMapper.insertSelective(omcCart);\n\t\t\t} catch (Exception e) {\n\t\t\t\tlogger.error(\"新增购物车, 出现异常={}\", e.getMessage(), e);\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\t\tomcCart.setId(omcCartExist.getId());\n\t\tomcCart.setQuantity(omcCart.getQuantity() + omcCartExist.getQuantity());\n\t\tint updateResult = omcCartMapper.updateByPrimaryKeySelective(omcCart);\n\t\tif (updateResult < 1) {\n\t\t\tthrow new OmcBizException(ErrorCodeEnum.OMC10031014, omcCartExist.getId());\n\t\t}\n\n\t}\n\n\t@Override\n\tpublic int saveCart(Long userId, Long productId, int count) {\n\t\tlogger.info(\"saveCart - 保存购物车记录 userId={}, productId={}, count={}\", userId, productId, count);\n\n\t\tPreconditions.checkArgument(userId != null, ErrorCodeEnum.UAC10011001.msg());\n\t\tPreconditions.checkArgument(productId != null, ErrorCodeEnum.MDC10021021.msg());\n\t\tPreconditions.checkArgument(count != 0, \"数量不符\");\n\n\t\tint resultInt = 0;\n\t\tOmcCart cart = this.getCartByUserIdAndProductId(userId, productId);\n\t\tif (cart == null) {\n\t\t\tcart = new OmcCart();\n\t\t\tcart.setQuantity(count);\n\t\t\tcart.setChecked(OmcApiConstant.Cart.CHECKED);\n\t\t\tcart.setProductId(productId);\n\t\t\tcart.setUserId(userId);\n\t\t\tresultInt = omcCartMapper.insertSelective(cart);\n\t\t} else {\n\t\t\tcount = cart.getQuantity() == null ? 0 : cart.getQuantity() + count;\n\t\t\tcart.setQuantity(count);\n\t\t\tomcCartMapper.updateByPrimaryKeySelective(cart);\n\t\t}\n\t\treturn resultInt;\n\t}\n\n\t@Override\n\tpublic OmcCart getCartByUserIdAndProductId(Long userId, Long productId) {\n\t\tlogger.info(\"getCartByUserIdAndProductId - 查询购物车记录 userId={}, productId={}\", userId, productId);\n\n\t\tPreconditions.checkArgument(userId != null, ErrorCodeEnum.UAC10011001.msg());\n\t\tPreconditions.checkArgument(productId != null, ErrorCodeEnum.MDC10021021.msg());\n\n\t\treturn omcCartMapper.selectByProductIdAndUserId(productId, userId);\n\t}\n\n\t@Override\n\tpublic int deleteProduct(Long userId, String productIds) {\n\t\tlogger.info(\"deleteProduct - 删除购物车记录 userId={}, productIds={}\", userId, productIds);\n\t\tPreconditions.checkArgument(StringUtils.isNotEmpty(productIds), ErrorCodeEnum.MDC10021021.msg());\n\t\tList<String> productList = Splitter.on(\",\").splitToList(productIds);\n\n\t\tPreconditions.checkArgument(userId != null, ErrorCodeEnum.UAC10011001.msg());\n\n\t\treturn omcCartMapper.deleteByUserIdProductIds(userId, productList);\n\t}\n\n\t@Override\n\tpublic int selectOrUnSelect(Long userId, Long productId, int checked) {\n\t\tlogger.info(\"selectOrUnSelect - 选中购物车记录 userId={}, productId={}, checked={}\", userId, productId, checked);\n\n\t\tPreconditions.checkArgument(userId != null, ErrorCodeEnum.UAC10011001.msg());\n\n\t\treturn omcCartMapper.checkedOrUncheckedProduct(userId, productId, checked);\n\t}\n\n\t@Override\n\tpublic int updateCart(Long userId, Long productId, int count) {\n\t\tlogger.info(\"updateCart - 更新货品数量 userId={}, productId={}, count={}\", userId, productId, count);\n\n\t\tPreconditions.checkArgument(userId != null, ErrorCodeEnum.UAC10011001.msg());\n\t\tPreconditions.checkArgument(productId != null, ErrorCodeEnum.MDC10021021.msg());\n\n\t\tint resultInt;\n\t\tOmcCart cart = this.getCartByUserIdAndProductId(userId, productId);\n\t\tif (cart == null) {\n\t\t\tlogger.error(\"找不到商品信息, userId={}, productId={}\", userId, productId);\n\t\t\tthrow new MdcBizException(ErrorCodeEnum.MDC10021004, productId);\n\t\t}\n\t\tif (count == 0) {\n\t\t\tList<String> productList = Lists.newArrayList();\n\t\t\tproductList.add(productId.toString());\n\t\t\tresultInt = omcCartMapper.deleteByUserIdProductIds(userId, productList);\n\t\t} else {\n\t\t\tcart.setQuantity(count);\n\t\t\tresultInt = omcCartMapper.updateByPrimaryKeySelective(cart);\n\t\t}\n\n\t\treturn resultInt;\n\t}\n\n\t@Override\n\tpublic OrderProductVo getOrderCartProduct(Long userId) {\n\t\tPreconditions.checkArgument(userId != null, ErrorCodeEnum.UAC10011001.msg());\n\n\t\tOrderProductVo orderProductVo = new OrderProductVo();\n\n\t\tList<OmcCart> omcCartList = omcCartMapper.selectCheckedCartByUserId(userId);\n\t\tList<OmcOrderDetail> orderItemList = this.getCartOrderItem(userId, omcCartList);\n\n\t\tList<OrderItemVo> orderItemVoList = Lists.newArrayList();\n\t\tBigDecimal payment = new BigDecimal(\"0\");\n\t\tfor (OmcOrderDetail orderItem : orderItemList) {\n\t\t\tpayment = BigDecimalUtil.add(payment.doubleValue(), orderItem.getTotalPrice().doubleValue());\n\t\t\tfinal OptGetUrlRequest request = new OptGetUrlRequest();\n\t\t\trequest.setAttachmentId(Long.valueOf(orderItem.getProductImage()));\n\t\t\trequest.setEncrypt(true);\n\t\t\tString fileUrl = opcOssService.getFileUrl(request);\n\t\t\tOrderItemVo orderItemVo = assembleOrderItemVo(orderItem);\n\t\t\torderItemVo.setProductImage(fileUrl);\n\t\t\torderItemVoList.add(orderItemVo);\n\t\t}\n\n\t\torderProductVo.setProductTotalPrice(payment);\n\t\torderProductVo.setOrderItemVoList(orderItemVoList);\n\n\t\treturn orderProductVo;\n\t}\n\n\tprivate boolean getAllCheckedStatus(Long userId) {\n\t\tPreconditions.checkArgument(userId != null, ErrorCodeEnum.UAC10011001.msg());\n\t\treturn omcCartMapper.selectUnCheckedCartProductCountByUserId(userId) == 0;\n\n\t}\n\n\t@Override\n\tpublic List<OmcOrderDetail> getCartOrderItem(Long userId, List<OmcCart> cartList) {\n\t\tList<OmcOrderDetail> orderItemList = Lists.newArrayList();\n\t\tif (CollectionUtils.isEmpty(cartList)) {\n\t\t\tthrow new OmcBizException(ErrorCodeEnum.OMC10031001, userId);\n\t\t}\n\n\t\t//校验购物车的数据,包括产品的状态和数量\n\t\tfor (OmcCart cartItem : cartList) {\n\t\t\tOmcOrderDetail orderDetail = new OmcOrderDetail();\n\t\t\tProductDto product = mdcProductService.selectById(cartItem.getProductId());\n\t\t\tif (MdcApiConstant.ProductStatusEnum.ON_SALE.getCode() != product.getStatus()) {\n\t\t\t\tlogger.error(\"商品不是在线售卖状态, productId={}\", product.getId());\n\t\t\t\tthrow new OmcBizException(ErrorCodeEnum.MDC10021015, product.getId());\n\t\t\t}\n\n\t\t\t//校验库存\n\t\t\tif (cartItem.getQuantity() > product.getStock()) {\n\t\t\t\tlogger.error(\"商品库存不足, productId={}\", product.getId());\n\t\t\t\tthrow new OmcBizException(ErrorCodeEnum.MDC10021016, product.getId());\n\t\t\t}\n\n\t\t\torderDetail.setUserId(userId);\n\t\t\torderDetail.setProductId(product.getId());\n\t\t\torderDetail.setProductName(product.getName());\n\t\t\torderDetail.setProductImage(product.getMainImage());\n\t\t\torderDetail.setCurrentUnitPrice(product.getPrice());\n\t\t\torderDetail.setQuantity(cartItem.getQuantity());\n\t\t\torderDetail.setTotalPrice(BigDecimalUtil.mul(product.getPrice().doubleValue(), cartItem.getQuantity()));\n\t\t\torderItemList.add(orderDetail);\n\t\t}\n\t\treturn orderItemList;\n\t}\n\n\tprivate OrderItemVo assembleOrderItemVo(OmcOrderDetail orderItem) {\n\t\tOrderItemVo orderItemVo = new OrderItemVo();\n\t\torderItemVo.setOrderNo(orderItem.getOrderNo());\n\t\torderItemVo.setProductId(orderItem.getProductId());\n\t\torderItemVo.setProductName(orderItem.getProductName());\n\t\torderItemVo.setProductImage(orderItem.getProductImage());\n\t\torderItemVo.setCurrentUnitPrice(orderItem.getCurrentUnitPrice());\n\t\torderItemVo.setQuantity(orderItem.getQuantity());\n\t\torderItemVo.setTotalPrice(orderItem.getTotalPrice());\n\n\t\torderItemVo.setCreateTime(orderItem.getCreatedTime());\n\t\treturn orderItemVo;\n\t}\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-omc/src/main/java/com/paascloud/provider/service/impl/OmcOrderDetailServiceImpl.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：OmcOrderDetailServiceImpl.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.service.impl;\n\nimport com.google.common.base.Preconditions;\nimport com.paascloud.base.enums.ErrorCodeEnum;\nimport com.paascloud.core.support.BaseService;\nimport com.paascloud.provider.exceptions.OmcBizException;\nimport com.paascloud.provider.mapper.OmcOrderDetailMapper;\nimport com.paascloud.provider.model.domain.OmcOrderDetail;\nimport com.paascloud.provider.service.OmcOrderDetailService;\nimport org.apache.commons.lang3.StringUtils;\nimport org.springframework.stereotype.Service;\n\nimport javax.annotation.Resource;\nimport java.util.List;\n\n/**\n * The class Omc order detail service.\n *\n * @author paascloud.net@gmail.com\n */\n@Service\npublic class OmcOrderDetailServiceImpl extends BaseService<OmcOrderDetail> implements OmcOrderDetailService {\n\t@Resource\n\tprivate OmcOrderDetailMapper omcOrderDetailMapper;\n\n\t@Override\n\tpublic List<OmcOrderDetail> getListByOrderNoUserId(String orderNo, Long userId) {\n\t\tPreconditions.checkArgument(userId != null, ErrorCodeEnum.UAC10011001.msg());\n\t\tPreconditions.checkArgument(StringUtils.isNotEmpty(orderNo), \"订单号不能为空\");\n\n\t\treturn omcOrderDetailMapper.getListByOrderNoUserId(orderNo, userId);\n\t}\n\n\t@Override\n\tpublic List<OmcOrderDetail> getListByOrderNo(String orderNo) {\n\t\tPreconditions.checkArgument(StringUtils.isNotEmpty(orderNo), \"订单号不能为空\");\n\t\treturn omcOrderDetailMapper.getListByOrderNo(orderNo);\n\t}\n\n\t@Override\n\tpublic void batchInsertOrderDetail(List<OmcOrderDetail> omcOrderDetailList) {\n\t\tint insertResult = omcOrderDetailMapper.batchInsertOrderDetail(omcOrderDetailList);\n\t\tif (insertResult < omcOrderDetailList.size()) {\n\t\t\tthrow new OmcBizException(ErrorCodeEnum.OMC10031009);\n\t\t}\n\t}\n}"
  },
  {
    "path": "paascloud-provider/paascloud-provider-omc/src/main/java/com/paascloud/provider/service/impl/OmcOrderServiceImpl.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：OmcOrderServiceImpl.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.service.impl;\n\nimport com.github.pagehelper.PageHelper;\nimport com.github.pagehelper.PageInfo;\nimport com.google.common.base.Preconditions;\nimport com.google.common.collect.Lists;\nimport com.paascloud.BigDecimalUtil;\nimport com.paascloud.base.constant.GlobalConstant;\nimport com.paascloud.base.dto.BaseQuery;\nimport com.paascloud.base.dto.LoginAuthDto;\nimport com.paascloud.base.enums.ErrorCodeEnum;\nimport com.paascloud.core.support.BaseService;\nimport com.paascloud.provider.exceptions.OmcBizException;\nimport com.paascloud.provider.mapper.OmcCartMapper;\nimport com.paascloud.provider.mapper.OmcOrderMapper;\nimport com.paascloud.provider.mapper.OmcShippingMapper;\nimport com.paascloud.provider.model.constant.OmcApiConstant;\nimport com.paascloud.provider.model.domain.OmcCart;\nimport com.paascloud.provider.model.domain.OmcOrder;\nimport com.paascloud.provider.model.domain.OmcOrderDetail;\nimport com.paascloud.provider.model.domain.OmcShipping;\nimport com.paascloud.provider.model.dto.OrderDto;\nimport com.paascloud.provider.model.dto.OrderPageQuery;\nimport com.paascloud.provider.model.dto.ProductDto;\nimport com.paascloud.provider.model.vo.OrderDocVo;\nimport com.paascloud.provider.model.vo.OrderItemVo;\nimport com.paascloud.provider.model.vo.OrderVo;\nimport com.paascloud.provider.model.vo.ShippingVo;\nimport com.paascloud.provider.service.MdcProductService;\nimport com.paascloud.provider.service.OmcCartService;\nimport com.paascloud.provider.service.OmcOrderDetailService;\nimport com.paascloud.provider.service.OmcOrderService;\nimport org.apache.commons.collections.CollectionUtils;\nimport org.apache.commons.lang3.StringUtils;\nimport org.modelmapper.ModelMapper;\nimport org.springframework.stereotype.Service;\nimport org.springframework.transaction.annotation.Transactional;\n\nimport javax.annotation.Resource;\nimport java.math.BigDecimal;\nimport java.util.List;\nimport java.util.Objects;\n\n/**\n * The class Omc order service.\n *\n * @author paascloud.net@gmail.com\n */\n@Service\npublic class OmcOrderServiceImpl extends BaseService<OmcOrder> implements OmcOrderService {\n\n\t@Resource\n\tprivate OmcOrderMapper omcOrderMapper;\n\t@Resource\n\tprivate OmcCartMapper omcCartMapper;\n\t@Resource\n\tprivate OmcShippingMapper omcShippingMapper;\n\t@Resource\n\tprivate OmcCartService omcCartService;\n\t@Resource\n\tprivate OmcOrderDetailService omcOrderDetailService;\n\n\t@Resource\n\tprivate MdcProductService mdcProductService;\n\n\t@Override\n\t@Transactional(rollbackFor = Exception.class)\n\tpublic OrderVo createOrderDoc(LoginAuthDto loginAuthDto, Long shippingId) {\n\t\tLong userId = loginAuthDto.getUserId();\n\t\t//从购物车中获取数据\n\t\tList<OmcCart> cartList = omcCartMapper.selectCheckedCartByUserId(userId);\n\t\tif (CollectionUtils.isEmpty(cartList)) {\n\t\t\tthrow new OmcBizException(ErrorCodeEnum.OMC10031001, userId);\n\t\t}\n\t\t//计算这个订单的总价\n\t\tList<OmcOrderDetail> omcOrderDetailList = omcCartService.getCartOrderItem(userId, cartList);\n\n\t\tif (CollectionUtils.isEmpty(omcOrderDetailList)) {\n\t\t\tthrow new OmcBizException(ErrorCodeEnum.OMC10031001, userId);\n\t\t}\n\n\t\tBigDecimal payment = this.getOrderTotalPrice(omcOrderDetailList);\n\n\n\t\t//生成订单\n\t\tOmcOrder order = this.assembleOrder(userId, shippingId, payment);\n\t\tif (order == null) {\n\t\t\tlogger.error(\"生成订单失败, userId={}, shippingId={}, payment={}\", userId, shippingId, payment);\n\t\t\tthrow new OmcBizException(ErrorCodeEnum.OMC10031002);\n\t\t}\n\t\torder.setUpdateInfo(loginAuthDto);\n\t\tfor (OmcOrderDetail orderDetail : omcOrderDetailList) {\n\t\t\torderDetail.setUpdateInfo(loginAuthDto);\n\t\t\torderDetail.setOrderNo(order.getOrderNo());\n\n\n\t\t\torderDetail.setId(super.generateId());\n\t\t\torderDetail.setUpdateInfo(loginAuthDto);\n\t\t}\n\n\t\t//mybatis 批量插入\n\t\tomcOrderDetailService.batchInsertOrderDetail(omcOrderDetailList);\n\n\t\t//生成成功,我们要减少我们产品的库存\n\t\tthis.reduceProductStock(omcOrderDetailList);\n\t\t//清空一下购物车\n\t\tthis.cleanCart(cartList);\n\n\t\t//返回给前端数据\n\n\t\treturn assembleOrderVo(order, omcOrderDetailList);\n\t}\n\n\t@Override\n\tpublic int cancelOrderDoc(LoginAuthDto loginAuthDto, String orderNo) {\n\t\tLong userId = loginAuthDto.getUserId();\n\t\tOmcOrder order = omcOrderMapper.selectByUserIdAndOrderNo(userId, orderNo);\n\t\tif (order == null) {\n\t\t\tlogger.error(\"该用户此订单不存在, userId={}, orderNo={}\", userId, orderNo);\n\t\t\tthrow new OmcBizException(ErrorCodeEnum.OMC10031003);\n\t\t}\n\t\tif (order.getStatus() != OmcApiConstant.OrderStatusEnum.NO_PAY.getCode()) {\n\t\t\tthrow new OmcBizException(ErrorCodeEnum.OMC10031004);\n\t\t}\n\t\tOmcOrder updateOrder = new OmcOrder();\n\t\tupdateOrder.setId(order.getId());\n\t\tupdateOrder.setStatus(OmcApiConstant.OrderStatusEnum.CANCELED.getCode());\n\n\t\treturn omcOrderMapper.updateByPrimaryKeySelective(updateOrder);\n\t}\n\n\t@Override\n\tpublic PageInfo queryUserOrderListWithPage(Long userId, BaseQuery baseQuery) {\n\t\tPageHelper.startPage(baseQuery.getPageNum(), baseQuery.getPageSize());\n\t\tList<OmcOrder> orderList = omcOrderMapper.selectByUserId(userId);\n\t\tList<OrderVo> orderVoList = assembleOrderVoList(orderList, userId);\n\t\treturn new PageInfo<>(orderVoList);\n\t}\n\n\t@Override\n\tpublic boolean queryOrderPayStatus(Long userId, String orderNo) {\n\t\tOmcOrder order = omcOrderMapper.selectByUserIdAndOrderNo(userId, orderNo);\n\t\tif (order == null) {\n\t\t\tthrow new OmcBizException(ErrorCodeEnum.OMC10031003);\n\t\t}\n\t\treturn order.getStatus() >= OmcApiConstant.OrderStatusEnum.PAID.getCode();\n\t}\n\n\t@Override\n\tpublic OmcOrder queryByOrderNo(String orderNo) {\n\t\tPreconditions.checkArgument(StringUtils.isNotEmpty(orderNo), \"订单号不能为空\");\n\n\t\treturn omcOrderMapper.selectByOrderNo(orderNo);\n\t}\n\n\t@Override\n\tpublic OmcOrder queryByUserIdAndOrderNo(Long userId, String orderNo) {\n\t\tPreconditions.checkArgument(userId != null, ErrorCodeEnum.UAC10011001.msg());\n\t\tPreconditions.checkArgument(StringUtils.isNotEmpty(orderNo), \"订单号不能为空\");\n\n\t\treturn omcOrderMapper.selectByUserIdAndOrderNo(userId, orderNo);\n\t}\n\n\t@Override\n\tpublic OrderDto queryOrderDtoByOrderNo(String orderNo) {\n\t\tOmcOrder omcOrder = this.queryByOrderNo(orderNo);\n\t\tif (omcOrder == null) {\n\t\t\tthrow new OmcBizException(ErrorCodeEnum.OMC10031005, orderNo);\n\t\t}\n\t\tModelMapper modelMapper = new ModelMapper();\n\t\treturn modelMapper.map(omcOrder, OrderDto.class);\n\t}\n\n\t@Override\n\tpublic OrderDto queryOrderDtoByUserIdAndOrderNo(Long userId, String orderNo) {\n\t\tOmcOrder omcOrder = this.queryByUserIdAndOrderNo(userId, orderNo);\n\t\tif (omcOrder == null) {\n\t\t\tthrow new OmcBizException(ErrorCodeEnum.OMC10031005, orderNo);\n\t\t}\n\t\tModelMapper modelMapper = new ModelMapper();\n\t\treturn modelMapper.map(omcOrder, OrderDto.class);\n\t}\n\n\tprivate BigDecimal getOrderTotalPrice(List<OmcOrderDetail> orderItemList) {\n\t\tBigDecimal payment = new BigDecimal(\"0\");\n\t\tfor (OmcOrderDetail orderItem : orderItemList) {\n\t\t\tpayment = BigDecimalUtil.add(payment.doubleValue(), orderItem.getTotalPrice().doubleValue());\n\t\t}\n\t\treturn payment;\n\t}\n\n\tprivate OmcOrder assembleOrder(Long userId, Long shippingId, BigDecimal payment) {\n\t\tOmcOrder order = new OmcOrder();\n\t\tlong orderNo = this.generateOrderNo();\n\t\torder.setOrderNo(String.valueOf(orderNo));\n\t\torder.setStatus(OmcApiConstant.OrderStatusEnum.NO_PAY.getCode());\n\t\torder.setPostage(0);\n\t\torder.setPaymentType(GlobalConstant.PaymentTypeEnum.ONLINE_PAY.getCode());\n\t\torder.setPayment(payment);\n\n\t\torder.setUserId(userId);\n\t\torder.setShippingId(shippingId);\n\t\torder.setId(super.generateId());\n\t\t//发货时间等等\n\t\t//付款时间等等\n\t\tint rowCount = omcOrderMapper.insertSelective(order);\n\t\tif (rowCount > 0) {\n\t\t\treturn order;\n\t\t}\n\t\treturn null;\n\t}\n\n\tprivate long generateOrderNo() {\n\t\treturn super.generateId();\n\t}\n\n\tprivate OrderVo assembleOrderVo(OmcOrder order, List<OmcOrderDetail> orderItemList) {\n\t\tOrderVo orderVo = new OrderVo();\n\t\torderVo.setOrderNo(order.getOrderNo());\n\t\torderVo.setPayment(order.getPayment());\n\t\torderVo.setPaymentType(order.getPaymentType());\n\t\torderVo.setPaymentTypeDesc(Objects.requireNonNull(GlobalConstant.PaymentTypeEnum.codeOf(order.getPaymentType())).getValue());\n\n\t\torderVo.setPostage(order.getPostage());\n\t\torderVo.setStatus(order.getStatus());\n\t\torderVo.setStatusDesc(OmcApiConstant.OrderStatusEnum.codeOf(order.getStatus()).getValue());\n\n\t\torderVo.setShippingId(order.getShippingId());\n\t\tOmcShipping shipping = omcShippingMapper.selectByPrimaryKey(order.getShippingId());\n\t\tif (shipping != null) {\n\t\t\torderVo.setReceiverName(shipping.getReceiverName());\n\t\t\torderVo.setShippingVo(assembleShippingVo(shipping));\n\t\t}\n\n\t\torderVo.setPaymentTime(order.getPaymentTime());\n\t\torderVo.setSendTime(order.getSendTime());\n\t\torderVo.setEndTime(order.getEndTime());\n\t\torderVo.setCreateTime(order.getCreatedTime());\n\t\torderVo.setCloseTime(order.getCloseTime());\n\t\torderVo.setCreator(order.getCreator());\n\n\t\torderVo.setImageHost(\"\");\n\n\n\t\tList<OrderItemVo> orderItemVoList = Lists.newArrayList();\n\n\t\tfor (OmcOrderDetail orderItem : orderItemList) {\n\t\t\tOrderItemVo orderItemVo = assembleOrderItemVo(orderItem);\n\t\t\torderItemVoList.add(orderItemVo);\n\t\t}\n\t\torderVo.setOrderItemVoList(orderItemVoList);\n\t\treturn orderVo;\n\t}\n\n\tprivate ShippingVo assembleShippingVo(OmcShipping shipping) {\n\t\tShippingVo shippingVo = new ShippingVo();\n\t\tshippingVo.setReceiverName(shipping.getReceiverName());\n\t\tshippingVo.setReceiverAddress(shipping.getDetailAddress());\n\t\tshippingVo.setReceiverProvince(shipping.getProvinceName());\n\t\tshippingVo.setReceiverCity(shipping.getCityName());\n\t\tshippingVo.setReceiverDistrict(shipping.getDistrictName());\n\t\tshippingVo.setReceiverMobile(shipping.getReceiverMobileNo());\n\t\tshippingVo.setReceiverZip(shipping.getReceiverZipCode());\n\t\tshippingVo.setReceiverPhone(shippingVo.getReceiverPhone());\n\t\treturn shippingVo;\n\t}\n\n\tprivate OrderItemVo assembleOrderItemVo(OmcOrderDetail orderItem) {\n\t\tlogger.info(\"订单信息 orderItem={}\", orderItem);\n\t\tOrderItemVo orderItemVo = new OrderItemVo();\n\t\torderItemVo.setOrderNo(orderItem.getOrderNo());\n\t\torderItemVo.setProductId(orderItem.getProductId());\n\t\torderItemVo.setProductName(orderItem.getProductName());\n\t\t// 查询商品的头图\n\t\tString url = mdcProductService.getMainImage(orderItem.getProductId());\n\t\torderItemVo.setProductImage(url);\n\t\torderItemVo.setCurrentUnitPrice(orderItem.getCurrentUnitPrice());\n\t\torderItemVo.setQuantity(orderItem.getQuantity());\n\t\torderItemVo.setTotalPrice(orderItem.getTotalPrice());\n\n\t\torderItemVo.setCreateTime(orderItem.getCreatedTime());\n\t\treturn orderItemVo;\n\t}\n\n\tprivate void reduceProductStock(List<OmcOrderDetail> omcOrderDetailList) {\n\t\tfor (OmcOrderDetail orderItem : omcOrderDetailList) {\n\t\t\tProductDto product = mdcProductService.selectById(orderItem.getProductId());\n\t\t\tproduct.setChangeStock(0 - orderItem.getQuantity());\n\t\t\tmdcProductService.updateProductStockById(product);\n\t\t}\n\t}\n\n\tprivate void cleanCart(List<OmcCart> cartList) {\n\t\tList<Long> idList = Lists.newArrayList();\n\t\tfor (OmcCart cart : cartList) {\n\t\t\tidList.add(cart.getId());\n\t\t}\n\t\tint deleteCount = omcCartMapper.batchDeleteCart(idList);\n\t\tif (deleteCount < idList.size()) {\n\t\t\tthrow new OmcBizException(ErrorCodeEnum.OMC10031006);\n\t\t}\n\t}\n\n\tprivate List<OrderVo> assembleOrderVoList(List<OmcOrder> orderList, Long userId) {\n\t\tList<OrderVo> orderVoList = Lists.newArrayList();\n\t\tfor (OmcOrder order : orderList) {\n\t\t\tList<OmcOrderDetail> orderItemList;\n\t\t\tif (userId == null) {\n\t\t\t\torderItemList = omcOrderDetailService.getListByOrderNo(order.getOrderNo());\n\t\t\t} else {\n\t\t\t\torderItemList = omcOrderDetailService.getListByOrderNoUserId(order.getOrderNo(), userId);\n\t\t\t}\n\t\t\tOrderVo orderVo = assembleOrderVo(order, orderItemList);\n\t\t\torderVoList.add(orderVo);\n\t\t}\n\t\treturn orderVoList;\n\t}\n\n\t@Override\n\tpublic OrderVo getOrderDetail(Long userId, String orderNo) {\n\t\tlogger.info(\"获取订单明细, userId={}, orderNo={}\", userId, orderNo);\n\t\tOmcOrder order = omcOrderMapper.selectByUserIdAndOrderNo(userId, orderNo);\n\t\tif (null == order) {\n\t\t\tthrow new OmcBizException(ErrorCodeEnum.OMC10031005, orderNo);\n\t\t}\n\t\tList<OmcOrderDetail> orderItemList = omcOrderDetailService.getListByOrderNoUserId(orderNo, userId);\n\t\treturn assembleOrderVo(order, orderItemList);\n\t}\n\n\t@Override\n\tpublic OrderVo getOrderDetail(final String orderNo) {\n\t\tlogger.info(\"获取订单明细, orderNo={}\", orderNo);\n\t\tOmcOrder order = omcOrderMapper.selectByOrderNo(orderNo);\n\t\tif (null == order) {\n\t\t\tthrow new OmcBizException(ErrorCodeEnum.OMC10031005, orderNo);\n\t\t}\n\t\tList<OmcOrderDetail> orderItemList = omcOrderDetailService.getListByOrderNo(orderNo);\n\t\treturn assembleOrderVo(order, orderItemList);\n\t}\n\n\t@Override\n\tpublic PageInfo queryOrderListWithPage(final OrderPageQuery orderPageQuery) {\n\t\tPageHelper.startPage(orderPageQuery.getPageNum(), orderPageQuery.getPageSize());\n\t\tList<OrderDocVo> orderList = omcOrderMapper.queryOrderListWithPage(orderPageQuery);\n\t\treturn new PageInfo<>(orderList);\n\t}\n}"
  },
  {
    "path": "paascloud-provider/paascloud-provider-omc/src/main/java/com/paascloud/provider/service/impl/OmcShippingServiceImpl.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：OmcShippingServiceImpl.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.service.impl;\n\nimport com.github.pagehelper.PageHelper;\nimport com.github.pagehelper.PageInfo;\nimport com.google.common.base.Preconditions;\nimport com.paascloud.PublicUtil;\nimport com.paascloud.base.dto.LoginAuthDto;\nimport com.paascloud.base.enums.ErrorCodeEnum;\nimport com.paascloud.core.support.BaseService;\nimport com.paascloud.provider.exceptions.OmcBizException;\nimport com.paascloud.provider.mapper.OmcShippingMapper;\nimport com.paascloud.provider.model.constant.OmcApiConstant;\nimport com.paascloud.provider.model.domain.OmcShipping;\nimport com.paascloud.provider.service.OmcShippingService;\nimport org.apache.commons.lang3.StringUtils;\nimport org.springframework.stereotype.Service;\nimport org.springframework.transaction.annotation.Transactional;\n\nimport javax.annotation.Resource;\nimport java.util.List;\n\n/**\n * The class Omc shipping service.\n *\n * @author paascloud.net@gmail.com\n */\n@Service\npublic class OmcShippingServiceImpl extends BaseService<OmcShipping> implements OmcShippingService {\n\n\t@Resource\n\tprivate OmcShippingMapper omcShippingMapper;\n\n\t@Override\n\tpublic int saveShipping(LoginAuthDto loginAuthDto, OmcShipping shipping) {\n\t\tint resultInt;\n\t\tshipping.setUpdateInfo(loginAuthDto);\n\t\tif (shipping.isNew()) {\n\t\t\tresultInt = omcShippingMapper.insertSelective(shipping);\n\t\t} else {\n\t\t\tresultInt = omcShippingMapper.updateByPrimaryKeySelective(shipping);\n\t\t}\n\t\treturn resultInt;\n\t}\n\n\t@Override\n\tpublic int deleteShipping(Long userId, Integer shippingId) {\n\n\t\treturn omcShippingMapper.deleteByShippingIdUserId(userId, shippingId);\n\t}\n\n\t@Override\n\tpublic OmcShipping selectByShippingIdUserId(Long userId, Long shippingId) {\n\t\treturn omcShippingMapper.selectByShippingIdUserId(userId, shippingId);\n\t}\n\n\t@Override\n\tpublic List<OmcShipping> queryShippingList(OmcShipping shipping) {\n\t\treturn omcShippingMapper.select(shipping);\n\t}\n\n\t@Override\n\tpublic PageInfo queryShippingListWithPage(OmcShipping shipping) {\n\n\t\tshipping.setOrderBy(\"update_time desc\");\n\t\tPageHelper.startPage(shipping.getPageNum(), shipping.getPageSize());\n\t\tif (StringUtils.isEmpty(shipping.getReceiverName())) {\n\t\t\tshipping.setReceiverName(null);\n\t\t}\n\t\tif (StringUtils.isEmpty(shipping.getReceiverMobileNo())) {\n\t\t\tshipping.setReceiverMobileNo(null);\n\t\t}\n\t\tList<OmcShipping> omcShippingList = this.queryShippingList(shipping);\n\t\treturn new PageInfo<>(omcShippingList);\n\t}\n\n\t@Override\n\tpublic PageInfo queryListWithPageByUserId(Long userId, int pageNum, int pageSize) {\n\t\tPreconditions.checkArgument(userId != null, ErrorCodeEnum.UAC10011001.msg());\n\t\tPageHelper.startPage(pageNum, pageSize);\n\t\t//TODO 写死 不维护收人列表\n\t\tList<OmcShipping> omcShippingList = this.selectByUserId(1L);\n\t\treturn new PageInfo<>(omcShippingList);\n\t}\n\n\t@Override\n\tpublic List<OmcShipping> selectByUserId(Long userId) {\n\t\tPreconditions.checkArgument(userId != null, ErrorCodeEnum.UAC10011001.msg());\n\t\treturn omcShippingMapper.selectByUserId(userId);\n\t}\n\n\t@Transactional(rollbackFor = Exception.class)\n\t@Override\n\tpublic int setDefaultAddress(LoginAuthDto loginAuthDto, Long addressId) {\n\t\tLong userId = loginAuthDto.getUserId();\n\t\tPreconditions.checkArgument(addressId != null, \"地址ID不能为空\");\n\n\t\t// 1. 查找当前默认地址\n\t\tOmcShipping omcShipping = omcShippingMapper.selectDefaultAddressByUserId(userId);\n\t\tif (PublicUtil.isEmpty(omcShipping)) {\n\t\t\tthrow new OmcBizException(ErrorCodeEnum.OMC10031007);\n\t\t}\n\t\t// 2. 判断默认地址和当前传入地址是否相同\n\t\tif (addressId.equals(omcShipping.getId())) {\n\t\t\tlogger.info(\"所选地址和当前用户默认地址相同 userId={}, addressId={}\", userId, addressId);\n\t\t\treturn 1;\n\t\t}\n\t\t// 3. 相同不处理不相同把当前改为非默认, 把当前地址改为默认地址\n\t\tsetDefault(loginAuthDto, addressId, OmcApiConstant.Shipping.DEFAULT);\n\t\tsetDefault(loginAuthDto, omcShipping.getId(), OmcApiConstant.Shipping.NOT_DEFAULT);\n\n\t\treturn 1;\n\t}\n\n\tprivate void setDefault(LoginAuthDto loginAuthDto, Long addressId, int isDefault) {\n\t\tint result;\n\t\tOmcShipping updateNotDefault = new OmcShipping();\n\t\tupdateNotDefault.setDefaultAddress(isDefault);\n\t\tupdateNotDefault.setUpdateInfo(loginAuthDto);\n\t\tupdateNotDefault.setId(addressId);\n\t\tresult = omcShippingMapper.updateByPrimaryKeySelective(updateNotDefault);\n\t\tif (result < 1) {\n\t\t\tthrow new OmcBizException(ErrorCodeEnum.OMC10031008, addressId);\n\t\t}\n\t}\n}"
  },
  {
    "path": "paascloud-provider/paascloud-provider-omc/src/main/java/com/paascloud/provider/service/impl/OpcOssServiceImpl.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：OpcOssServiceImpl.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.service.impl;\n\nimport com.paascloud.base.enums.ErrorCodeEnum;\nimport com.paascloud.provider.exceptions.OmcBizException;\nimport com.paascloud.provider.model.dto.oss.OptGetUrlRequest;\nimport com.paascloud.provider.model.dto.oss.OptUploadFileReqDto;\nimport com.paascloud.provider.model.dto.oss.OptUploadFileRespDto;\nimport com.paascloud.provider.service.OpcOssFeignApi;\nimport com.paascloud.provider.service.OpcOssService;\nimport com.paascloud.wrapper.Wrapper;\nimport lombok.extern.slf4j.Slf4j;\nimport org.springframework.stereotype.Service;\n\nimport javax.annotation.Resource;\n\n/**\n * The class Opc oss service.\n *\n * @author paascloud.net@gmail.com\n */\n@Slf4j\n@Service\npublic class OpcOssServiceImpl implements OpcOssService {\n\t@Resource\n\tprivate OpcOssFeignApi opcOssFeignApi;\n\n\t@Override\n\tpublic OptUploadFileRespDto uploadFile(OptUploadFileReqDto optUploadFileReqDto) {\n\t\tlog.info(\"uploadFile - 上传附件. optUploadFileReqDto={}\", optUploadFileReqDto);\n\t\tWrapper<OptUploadFileRespDto> wrapper = opcOssFeignApi.uploadFile(optUploadFileReqDto);\n\t\tif (null == wrapper || wrapper.error()) {\n\t\t\tthrow new OmcBizException(ErrorCodeEnum.OMC10031012);\n\t\t}\n\t\treturn wrapper.getResult();\n\t}\n\n\t@Override\n\tpublic String getFileUrl(OptGetUrlRequest optGetUrlRequest) {\n\t\tlog.info(\"getFileUrl - 获取附件地址. optUploadFileReqDto={}\", optGetUrlRequest);\n\t\tWrapper<String> wrapper = opcOssFeignApi.getFileUrl(optGetUrlRequest);\n\t\tif (null == wrapper || wrapper.error()) {\n\t\t\tthrow new OmcBizException(ErrorCodeEnum.OMC10031013);\n\t\t}\n\t\treturn wrapper.getResult();\n\t}\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-omc/src/main/java/com/paascloud/provider/service/impl/PtcAlipayServiceImpl.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：PtcAlipayServiceImpl.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.service.impl;\n\nimport com.alipay.api.AlipayResponse;\nimport com.alipay.api.response.AlipayTradePrecreateResponse;\nimport com.alipay.demo.trade.config.Configs;\nimport com.alipay.demo.trade.model.ExtendParams;\nimport com.alipay.demo.trade.model.GoodsDetail;\nimport com.alipay.demo.trade.model.builder.AlipayTradePrecreateRequestBuilder;\nimport com.alipay.demo.trade.model.result.AlipayF2FPrecreateResult;\nimport com.alipay.demo.trade.service.AlipayTradeService;\nimport com.alipay.demo.trade.service.impl.AlipayTradeServiceImpl;\nimport com.alipay.demo.trade.utils.ZxingUtils;\nimport com.google.common.collect.Lists;\nimport com.paascloud.BigDecimalUtil;\nimport com.paascloud.base.dto.LoginAuthDto;\nimport com.paascloud.base.enums.ErrorCodeEnum;\nimport com.paascloud.core.generator.UniqueIdGenerator;\nimport com.paascloud.provider.exceptions.OmcBizException;\nimport com.paascloud.provider.mapper.PtcPayInfoMapper;\nimport com.paascloud.provider.model.constant.OmcApiConstant;\nimport com.paascloud.provider.model.constant.PtcApiConstant;\nimport com.paascloud.provider.model.domain.OmcOrder;\nimport com.paascloud.provider.model.domain.OmcOrderDetail;\nimport com.paascloud.provider.model.domain.PtcPayInfo;\nimport com.paascloud.provider.model.dto.OrderDto;\nimport com.paascloud.provider.model.dto.attachment.OptUploadFileByteInfoReqDto;\nimport com.paascloud.provider.model.dto.oss.OptGetUrlRequest;\nimport com.paascloud.provider.model.dto.oss.OptUploadFileReqDto;\nimport com.paascloud.provider.model.dto.oss.OptUploadFileRespDto;\nimport com.paascloud.provider.service.OmcOrderDetailService;\nimport com.paascloud.provider.service.OmcOrderService;\nimport com.paascloud.provider.service.OpcOssService;\nimport com.paascloud.provider.service.PtcAlipayService;\nimport com.paascloud.wrapper.WrapMapper;\nimport com.paascloud.wrapper.Wrapper;\nimport com.xiaoleilu.hutool.date.DateUtil;\nimport com.xiaoleilu.hutool.io.FileUtil;\nimport lombok.extern.slf4j.Slf4j;\nimport org.apache.commons.lang.StringUtils;\nimport org.modelmapper.ModelMapper;\nimport org.springframework.beans.factory.annotation.Value;\nimport org.springframework.stereotype.Service;\n\nimport javax.annotation.Resource;\nimport java.io.File;\nimport java.util.Date;\nimport java.util.List;\nimport java.util.Map;\n\n/**\n * The class Ptc alipay service.\n *\n * @author paascloud.net @gmail.com\n */\n@Slf4j\n@Service\npublic class PtcAlipayServiceImpl implements PtcAlipayService {\n\n\tprivate static AlipayTradeService tradeService;\n\n\tstatic {\n\n\t\tConfigs.init(\"zfbinfo.properties\");\n\n\t\ttradeService = new AlipayTradeServiceImpl.ClientBuilder().build();\n\t}\n\n\t@Resource\n\tprivate OmcOrderService omcOrderService;\n\t@Resource\n\tprivate OmcOrderDetailService omcOrderDetailService;\n\t@Resource\n\tprivate PtcPayInfoMapper ptcPayInfoMapper;\n\t@Resource\n\tprivate OpcOssService opcOssService;\n\n\t@Value(\"${paascloud.alipay.callback.url}\")\n\tprivate String alipayCallbackUrl;\n\t@Value(\"${paascloud.alipay.qrCode.pcPath}\")\n\tprivate String qrCodePcPath;\n\t@Value(\"${paascloud.alipay.qrCode.qiniuPath}\")\n\tprivate String qrCodeQiniuPath;\n\n\t/**\n\t * Pay wrapper.\n\t *\n\t * @param orderNo      the order no\n\t * @param loginAuthDto the login auth dto\n\t *\n\t * @return the wrapper\n\t */\n\t@Override\n\tpublic Wrapper pay(String orderNo, LoginAuthDto loginAuthDto) {\n\t\tLong userId = loginAuthDto.getUserId();\n\t\tOrderDto order = omcOrderService.queryOrderDtoByUserIdAndOrderNo(userId, orderNo);\n\t\tif (order == null) {\n\t\t\tthrow new OmcBizException(ErrorCodeEnum.OMC10031003);\n\t\t}\n\n\t\t// (必填) 商户网站订单系统中唯一订单号, 64个字符以内, 只能包含字母、数字、下划线,\n\t\t// 需保证商户系统端不能重复, 建议通过数据库sequence生成,\n\t\tString outTradeNo = order.getOrderNo();\n\n\n\t\t// (必填) 订单标题, 粗略描述用户的支付目的。如“xxx品牌xxx门店当面付扫码消费”\n\t\tString subject = \"PCMall扫码支付,订单号:\" + outTradeNo;\n\n\n\t\t// (必填) 订单总金额, 单位为元, 不能超过1亿元\n\t\t// 如果同时传入了【打折金额】,【不可打折金额】,【订单总金额】三者,则必须满足如下条件:【订单总金额】=【打折金额】+【不可打折金额】\n\t\tString totalAmount = order.getPayment().toString();\n\n\n\t\t// (可选) 订单不可打折金额, 可以配合商家平台配置折扣活动, 如果酒水不参与打折, 则将对应金额填写至此字段\n\t\t// 如果该值未传入,但传入了【订单总金额】,【打折金额】,则该值默认为【订单总金额】-【打折金额】\n\t\tString undiscountableAmount = \"0\";\n\n\n\t\t// 卖家支付宝账号ID, 用于支持一个签约账号下支持打款到不同的收款账号, (打款到sellerId对应的支付宝账号)\n\t\t// 如果该字段为空, 则默认为与支付宝签约的商户的PID, 也就是appid对应的PID\n\t\tString sellerId = \"\";\n\n\t\t// 订单描述, 可以对交易或商品进行一个详细地描述, 比如填写\"购买商品2件共15.00元\"\n\t\tString body = \"订单\" + outTradeNo + \"购买商品共\" + totalAmount + \"元\";\n\n\n\t\t// 商户操作员编号, 添加此参数可以为商户操作员做销售统计\n\t\tString operatorId = \"test_operator_id\";\n\n\t\t// (必填) 商户门店编号, 通过门店号和商家后台可以配置精准到门店的折扣信息, 详询支付宝技术支持\n\t\tString storeId = \"test_store_id\";\n\n\t\t// 业务扩展参数, 目前可添加由支付宝分配的系统商编号(通过setSysServiceProviderId方法), 详情请咨询支付宝技术支持\n\t\tExtendParams extendParams = new ExtendParams();\n\t\textendParams.setSysServiceProviderId(\"2088100200300400500\");\n\n\n\t\t// 支付超时, 定义为120分钟\n\t\tString timeoutExpress = \"120m\";\n\n\t\t// 商品明细列表, 需填写购买商品详细信息,\n\t\tList<GoodsDetail> goodsDetailList = Lists.newArrayList();\n\n\t\tList<OmcOrderDetail> orderItemList = omcOrderDetailService.getListByOrderNoUserId(orderNo, userId);\n\t\tfor (OmcOrderDetail orderItem : orderItemList) {\n\t\t\tGoodsDetail goods = GoodsDetail.newInstance(orderItem.getProductId().toString(), orderItem.getProductName(),\n\t\t\t\t\tBigDecimalUtil.mul(orderItem.getCurrentUnitPrice().doubleValue(), 100D).longValue(),\n\t\t\t\t\torderItem.getQuantity());\n\t\t\tgoodsDetailList.add(goods);\n\t\t}\n\n\t\t// 创建扫码支付请求builder, 设置请求参数\n\t\tAlipayTradePrecreateRequestBuilder builder = new AlipayTradePrecreateRequestBuilder()\n\t\t\t\t.setSubject(subject).setTotalAmount(totalAmount).setOutTradeNo(outTradeNo)\n\t\t\t\t.setUndiscountableAmount(undiscountableAmount).setSellerId(sellerId).setBody(body)\n\t\t\t\t.setOperatorId(operatorId).setStoreId(storeId).setExtendParams(extendParams)\n\t\t\t\t.setTimeoutExpress(timeoutExpress)\n\t\t\t\t//支付宝服务器主动通知商户服务器里指定的页面http路径,根据需要设置\n\t\t\t\t.setNotifyUrl(alipayCallbackUrl)\n\t\t\t\t.setGoodsDetailList(goodsDetailList);\n\n\n\t\tAlipayF2FPrecreateResult result = tradeService.tradePrecreate(builder);\n\t\tswitch (result.getTradeStatus()) {\n\t\t\tcase SUCCESS:\n\t\t\t\tlog.info(\"支付宝预下单成功: )\");\n\n\t\t\t\tAlipayTradePrecreateResponse response = result.getResponse();\n\t\t\t\tdumpResponse(response);\n\n\t\t\t\t// 需要修改为运行机器上的路径\n\t\t\t\tFile folder = new File(qrCodePcPath);\n\t\t\t\tif (!folder.exists()) {\n\t\t\t\t\tfolder.setWritable(true);\n\t\t\t\t\tfolder.mkdirs();\n\t\t\t\t}\n\t\t\t\t//细节细节细节\n\t\t\t\tString qrPath = String.format(qrCodePcPath + \"/qr-%s.png\", response.getOutTradeNo());\n\t\t\t\tString qrFileName = String.format(\"qr-%s.png\", response.getOutTradeNo());\n\n\t\t\t\tZxingUtils.getQRCodeImge(response.getQrCode(), 256, qrPath);\n\t\t\t\tFile qrCodeImage = new File(qrPath);\n\t\t\t\tOptUploadFileReqDto optUploadFileReqDto = new OptUploadFileReqDto();\n\n\t\t\t\toptUploadFileReqDto.setBucketName(\"paascloud-oss-bucket\");\n\t\t\t\toptUploadFileReqDto.setFilePath(qrCodeQiniuPath);\n\t\t\t\toptUploadFileReqDto.setFileType(\"png\");\n\t\t\t\toptUploadFileReqDto.setUserId(loginAuthDto.getUserId());\n\t\t\t\toptUploadFileReqDto.setUserName(loginAuthDto.getUserName());\n\t\t\t\tOptUploadFileByteInfoReqDto optUploadFileByteInfoReqDto = new OptUploadFileByteInfoReqDto();\n\t\t\t\toptUploadFileByteInfoReqDto.setFileName(qrFileName);\n\t\t\t\tbyte[] bytes = FileUtil.readBytes(qrCodeImage);\n\t\t\t\toptUploadFileByteInfoReqDto.setFileByteArray(bytes);\n\t\t\t\toptUploadFileReqDto.setUploadFileByteInfoReqDto(optUploadFileByteInfoReqDto);\n\t\t\t\tOptUploadFileRespDto optUploadFileRespDto = null;\n\t\t\t\ttry {\n\t\t\t\t\toptUploadFileRespDto = opcOssService.uploadFile(optUploadFileReqDto);\n\t\t\t\t\toptUploadFileRespDto.setRefNo(orderNo);\n\t\t\t\t\t// 获取二维码\n\t\t\t\t\tfinal OptGetUrlRequest request = new OptGetUrlRequest();\n\t\t\t\t\trequest.setAttachmentId(optUploadFileRespDto.getAttachmentId());\n\t\t\t\t\trequest.setEncrypt(true);\n\t\t\t\t\tString fileUrl = opcOssService.getFileUrl(request);\n\t\t\t\t\toptUploadFileRespDto.setAttachmentUrl(fileUrl);\n\t\t\t\t} catch (Exception e) {\n\t\t\t\t\tlog.error(\"上传二维码异常\", e);\n\t\t\t\t}\n\t\t\t\treturn WrapMapper.ok(optUploadFileRespDto);\n\t\t\tcase FAILED:\n\t\t\t\tlog.error(\"支付宝预下单失败!!!\");\n\t\t\t\treturn WrapMapper.error(\"支付宝预下单失败!!!\");\n\n\t\t\tcase UNKNOWN:\n\t\t\t\tlog.error(\"系统异常, 预下单状态未知!!!\");\n\t\t\t\treturn WrapMapper.error(\"系统异常, 预下单状态未知!!!\");\n\n\t\t\tdefault:\n\t\t\t\tlog.error(\"不支持的交易状态, 交易返回异常!!!\");\n\t\t\t\treturn WrapMapper.error(\"不支持的交易状态, 交易返回异常!!!\");\n\t\t}\n\t}\n\n\t/**\n\t * 简单打印应答\n\t */\n\tprivate void dumpResponse(AlipayResponse response) {\n\t\tif (response != null) {\n\t\t\tlog.info(String.format(\"code:%s, msg:%s\", response.getCode(), response.getMsg()));\n\t\t\tif (StringUtils.isNotEmpty(response.getSubCode())) {\n\t\t\t\tlog.info(String.format(\"subCode:%s, subMsg:%s\", response.getSubCode(),\n\t\t\t\t\t\tresponse.getSubMsg()));\n\t\t\t}\n\t\t\tlog.info(\"body:\" + response.getBody());\n\t\t}\n\t}\n\n\t@Override\n\tpublic Wrapper aliPayCallback(Map<String, String> params) {\n\t\tlog.info(\"支付宝回调. - aliPayCallback. params={}\", params);\n\t\tString orderNo = params.get(\"out_trade_no\");\n\t\tString tradeNo = params.get(\"trade_no\");\n\t\tString tradeStatus = params.get(\"trade_status\");\n\t\tOrderDto order = omcOrderService.queryOrderDtoByOrderNo(orderNo);\n\t\tif (order == null) {\n\t\t\tthrow new OmcBizException(ErrorCodeEnum.OMC10031010);\n\t\t}\n\t\tif (order.getStatus() >= OmcApiConstant.OrderStatusEnum.PAID.getCode()) {\n\t\t\tthrow new OmcBizException(ErrorCodeEnum.OMC10031011);\n\t\t}\n\t\tif (PtcApiConstant.AlipayCallback.TRADE_STATUS_TRADE_SUCCESS.equals(tradeStatus)) {\n\t\t\torder.setPaymentTime(DateUtil.parseDate(params.get(\"gmt_payment\")));\n\t\t\torder.setStatus(OmcApiConstant.OrderStatusEnum.PAID.getCode());\n\t\t\tModelMapper modelMapper = new ModelMapper();\n\t\t\tOmcOrder omcOrder = modelMapper.map(order, OmcOrder.class);\n\t\t\tomcOrderService.update(omcOrder);\n\t\t}\n\n\t\tPtcPayInfo payInfo = new PtcPayInfo();\n\t\tpayInfo.setUserId(order.getUserId());\n\t\tpayInfo.setOrderNo(order.getOrderNo());\n\t\tpayInfo.setPayPlatform(PtcApiConstant.PayPlatformEnum.ALIPAY.getCode());\n\t\tpayInfo.setPlatformNumber(tradeNo);\n\t\tpayInfo.setPlatformStatus(tradeStatus);\n\t\tpayInfo.setUpdateTime(new Date());\n\t\tpayInfo.setCreatedTime(new Date());\n\t\tpayInfo.setCreator(order.getCreator());\n\t\tpayInfo.setCreatorId(order.getUserId());\n\t\tpayInfo.setLastOperator(order.getLastOperator());\n\t\tpayInfo.setLastOperatorId(order.getLastOperatorId());\n\t\tpayInfo.setId(UniqueIdGenerator.generateId());\n\n\t\tptcPayInfoMapper.insertSelective(payInfo);\n\n\t\treturn WrapMapper.ok();\n\t}\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-omc/src/main/java/com/paascloud/provider/service/impl/PtcPayInfoServiceImpl.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：PtcPayInfoServiceImpl.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.service.impl;\n\nimport com.paascloud.provider.model.domain.PtcPayInfo;\nimport com.paascloud.core.support.BaseService;\nimport com.paascloud.provider.service.PtcPayInfoService;\nimport org.springframework.stereotype.Service;\n\n/**\n * The class Ptc pay info service.\n *\n * @author paascloud.net@gmail.com\n */\n@Service\npublic class PtcPayInfoServiceImpl extends BaseService<PtcPayInfo> implements PtcPayInfoService {\n}"
  },
  {
    "path": "paascloud-provider/paascloud-provider-omc/src/main/java/com/paascloud/provider/web/GlobalExceptionHandler.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：GlobalExceptionHandler.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.web;\n\n\nimport com.paascloud.base.enums.ErrorCodeEnum;\nimport com.paascloud.base.exception.BusinessException;\nimport com.paascloud.provider.model.dto.GlobalExceptionLogDto;\nimport com.paascloud.provider.service.MdcExceptionLogFeignApi;\nimport com.paascloud.wrapper.WrapMapper;\nimport com.paascloud.wrapper.Wrapper;\nimport lombok.extern.slf4j.Slf4j;\nimport org.springframework.beans.factory.annotation.Value;\nimport org.springframework.core.task.TaskExecutor;\nimport org.springframework.http.HttpStatus;\nimport org.springframework.web.bind.annotation.ExceptionHandler;\nimport org.springframework.web.bind.annotation.ResponseBody;\nimport org.springframework.web.bind.annotation.ResponseStatus;\nimport org.springframework.web.bind.annotation.RestControllerAdvice;\n\nimport javax.annotation.Resource;\n\n/**\n * 全局的的异常拦截器\n *\n * @author paascloud.net @gmail.com\n */\n@Slf4j\n@RestControllerAdvice\npublic class GlobalExceptionHandler {\n\t@Resource\n\tprivate TaskExecutor taskExecutor;\n\t@Value(\"${spring.profiles.active}\")\n\tString profile;\n\t@Value(\"${spring.application.name}\")\n\tString applicationName;\n\t@Resource\n\tprivate MdcExceptionLogFeignApi mdcExceptionLogFeignApi;\n\n\t/**\n\t * 参数非法异常.\n\t *\n\t * @param e the e\n\t *\n\t * @return the wrapper\n\t */\n\t@ExceptionHandler(IllegalArgumentException.class)\n\t@ResponseStatus(HttpStatus.OK)\n\t@ResponseBody\n\tpublic Wrapper illegalArgumentException(IllegalArgumentException e) {\n\t\tlog.error(\"参数非法异常={}\", e.getMessage(), e);\n\t\treturn WrapMapper.wrap(ErrorCodeEnum.GL99990100.code(), e.getMessage());\n\t}\n\n\t/**\n\t * 业务异常.\n\t *\n\t * @param e the e\n\t *\n\t * @return the wrapper\n\t */\n\t@ExceptionHandler(BusinessException.class)\n\t@ResponseStatus(HttpStatus.OK)\n\t@ResponseBody\n\tpublic Wrapper businessException(BusinessException e) {\n\t\tlog.error(\"业务异常={}\", e.getMessage(), e);\n\t\treturn WrapMapper.wrap(e.getCode() == 0 ? Wrapper.ERROR_CODE : e.getCode(), e.getMessage());\n\t}\n\n\n\t/**\n\t * 全局异常.\n\t *\n\t * @param e the e\n\t *\n\t * @return the wrapper\n\t */\n\t@ExceptionHandler(Exception.class)\n\t@ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)\n\t@ResponseBody\n\tpublic Wrapper exception(Exception e) {\n\t\tlog.info(\"保存全局异常信息 ex={}\", e.getMessage(), e);\n\t\ttaskExecutor.execute(() -> {\n\t\t\tGlobalExceptionLogDto globalExceptionLogDto = new GlobalExceptionLogDto().getGlobalExceptionLogDto(e, profile, applicationName);\n\t\t\tmdcExceptionLogFeignApi.saveAndSendExceptionLog(globalExceptionLogDto);\n\t\t});\n\t\treturn WrapMapper.error();\n\t}\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-omc/src/main/java/com/paascloud/provider/web/frontend/OmcOrderController.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：OmcOrderController.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.web.frontend;\n\nimport com.github.pagehelper.PageInfo;\nimport com.paascloud.base.dto.BaseQuery;\nimport com.paascloud.base.dto.LoginAuthDto;\nimport com.paascloud.core.support.BaseController;\nimport com.paascloud.provider.model.dto.OrderPageQuery;\nimport com.paascloud.provider.model.vo.OrderProductVo;\nimport com.paascloud.provider.model.vo.OrderVo;\nimport com.paascloud.provider.service.OmcCartService;\nimport com.paascloud.provider.service.OmcOrderService;\nimport com.paascloud.wrapper.WrapMapper;\nimport com.paascloud.wrapper.Wrapper;\nimport io.swagger.annotations.Api;\nimport io.swagger.annotations.ApiOperation;\nimport org.springframework.http.MediaType;\nimport org.springframework.web.bind.annotation.*;\n\nimport javax.annotation.Resource;\n\n/**\n * The class Omc order controller.\n *\n * @author paascloud.net@gmail.com\n */\n@RestController\n@RequestMapping(value = \"/order\")\n@Api(value = \"WEB - OmcOrderController\", produces = MediaType.APPLICATION_JSON_UTF8_VALUE)\npublic class OmcOrderController extends BaseController {\n\n\t@Resource\n\tprivate OmcOrderService omcOrderService;\n\t@Resource\n\tprivate OmcCartService omcCartService;\n\n\t/**\n\t * 获取购物车数量.\n\t *\n\t * @return the cart count\n\t */\n\t@PostMapping(value = \"getCartCount\")\n\tpublic Wrapper<Integer> getCartCount() {\n\t\treturn WrapMapper.ok(0);\n\t}\n\n\t/**\n\t * 获取购物车商品数量.\n\t *\n\t * @return the order cart product\n\t */\n\t@PostMapping(\"/getOrderCartProduct\")\n\t@ApiOperation(httpMethod = \"POST\", value = \"获取购物车商品数量\")\n\tpublic Wrapper getOrderCartProduct() {\n\t\tlogger.info(\"getOrderCartProduct - 获取购物车商品数量\");\n\t\tOrderProductVo orderCartProduct = omcCartService.getOrderCartProduct(getLoginAuthDto().getUserId());\n\t\treturn WrapMapper.ok(orderCartProduct);\n\t}\n\n\t/**\n\t * 创建订单.\n\t *\n\t * @param shippingId the shipping id\n\t *\n\t * @return the wrapper\n\t */\n\t@PostMapping(\"createOrderDoc/{shippingId}\")\n\t@ApiOperation(httpMethod = \"POST\", value = \"创建订单\")\n\tpublic Wrapper createOrderDoc(@PathVariable Long shippingId) {\n\t\tlogger.info(\"createOrderDoc - 创建订单. shippingId={}\", shippingId);\n\t\tLoginAuthDto loginAuthDto = getLoginAuthDto();\n\t\tlogger.info(\"操作人信息. loginAuthDto={}\", loginAuthDto);\n\n\t\tOrderVo orderDoc = omcOrderService.createOrderDoc(loginAuthDto, shippingId);\n\t\treturn WrapMapper.ok(orderDoc);\n\t}\n\n\n\t/**\n\t * 取消订单.\n\t *\n\t * @param orderNo the order no\n\t *\n\t * @return the wrapper\n\t */\n\t@PostMapping(\"cancelOrderDoc/{orderNo}\")\n\t@ApiOperation(httpMethod = \"POST\", value = \"取消订单\")\n\tpublic Wrapper cancelOrderDoc(@PathVariable String orderNo) {\n\t\tlogger.info(\"cancelOrderDoc - 取消订单. orderNo={}\", orderNo);\n\t\tLoginAuthDto loginAuthDto = getLoginAuthDto();\n\t\tlogger.info(\"操作人信息. loginAuthDto={}\", loginAuthDto);\n\n\t\tint result = omcOrderService.cancelOrderDoc(loginAuthDto, orderNo);\n\t\treturn handleResult(result);\n\t}\n\n\t/**\n\t * 查询订单详情.\n\t *\n\t * @param orderNo the order no\n\t *\n\t * @return the wrapper\n\t */\n\t@PostMapping(\"queryUserOrderDetailList/{orderNo}\")\n\t@ApiOperation(httpMethod = \"POST\", value = \"查询订单详情\")\n\tpublic Wrapper queryUserOrderDetailList(@PathVariable String orderNo) {\n\t\tlogger.info(\"queryUserOrderDetailList - 查询用户订单明细. orderNo={}\", orderNo);\n\n\t\tLong userId = getLoginAuthDto().getUserId();\n\t\tlogger.info(\"操作人信息. userId={}\", userId);\n\n\t\tOrderVo orderVo = omcOrderService.getOrderDetail(userId, orderNo);\n\t\treturn WrapMapper.ok(orderVo);\n\t}\n\n\t@PostMapping(\"queryUserOrderDetail/{orderNo}\")\n\t@ApiOperation(httpMethod = \"POST\", value = \"查询订单详情\")\n\tpublic Wrapper queryUserOrderDetail(@PathVariable String orderNo) {\n\t\tlogger.info(\"queryUserOrderDetail - 查询订单明细. orderNo={}\", orderNo);\n\n\t\tOrderVo orderVo = omcOrderService.getOrderDetail(orderNo);\n\t\treturn WrapMapper.ok(orderVo);\n\t}\n\n\t/**\n\t * Query user order list with page wrapper.\n\t *\n\t * @param baseQuery the base query\n\t *\n\t * @return the wrapper\n\t */\n\t@PostMapping(\"queryUserOrderListWithPage\")\n\t@ApiOperation(httpMethod = \"POST\", value = \"查询用户订单列表\")\n\tpublic Wrapper queryUserOrderListWithPage(@RequestBody BaseQuery baseQuery) {\n\t\tlogger.info(\"queryUserOrderListWithPage - 查询用户订单集合. baseQuery={}\", baseQuery);\n\n\t\tLong userId = getLoginAuthDto().getUserId();\n\t\tlogger.info(\"操作人信息. userId={}\", userId);\n\n\t\tPageInfo pageInfo = omcOrderService.queryUserOrderListWithPage(userId, baseQuery);\n\t\treturn WrapMapper.ok(pageInfo);\n\t}\n\n\t@PostMapping(\"queryOrderListWithPage\")\n\t@ApiOperation(httpMethod = \"POST\", value = \"查询用户订单列表\")\n\tpublic Wrapper queryOrderListWithPage(@RequestBody OrderPageQuery orderPageQuery) {\n\t\tlogger.info(\"queryOrderListWithPage - 查询订单集合. orderPageQuery={}\", orderPageQuery);\n\t\tPageInfo pageInfo = omcOrderService.queryOrderListWithPage(orderPageQuery);\n\t\treturn WrapMapper.ok(pageInfo);\n\t}\n\n\t/**\n\t * 查询订单状态.\n\t *\n\t * @param orderNo the order no\n\t *\n\t * @return the wrapper\n\t */\n\t@PostMapping(\"queryOrderPayStatus/{orderNo}\")\n\t@ApiOperation(httpMethod = \"POST\", value = \"查询订单状态\")\n\tpublic Wrapper<Boolean> queryOrderPayStatus(@PathVariable String orderNo) {\n\t\tlogger.info(\"queryOrderPayStatus - 查询订单状态. orderNo={}\", orderNo);\n\t\tboolean result = omcOrderService.queryOrderPayStatus(getLoginAuthDto().getUserId(), orderNo);\n\t\treturn WrapMapper.ok(result);\n\t}\n\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-omc/src/main/java/com/paascloud/provider/web/frontend/OmcShippingController.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：OmcShippingController.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.web.frontend;\n\nimport com.github.pagehelper.PageInfo;\nimport com.paascloud.core.support.BaseController;\nimport com.paascloud.provider.model.domain.OmcShipping;\nimport com.paascloud.provider.service.OmcShippingService;\nimport com.paascloud.wrapper.WrapMapper;\nimport com.paascloud.wrapper.Wrapper;\nimport io.swagger.annotations.Api;\nimport io.swagger.annotations.ApiOperation;\nimport org.springframework.http.MediaType;\nimport org.springframework.web.bind.annotation.*;\n\nimport javax.annotation.Resource;\n\n/**\n * The class Omc shipping controller.\n *\n * @author paascloud.net@gmail.com\n */\n@RestController\n@RequestMapping(value = \"/shipping\", produces = MediaType.APPLICATION_JSON_UTF8_VALUE)\n@Api(value = \"WEB - OmcShippingController\", produces = MediaType.APPLICATION_JSON_UTF8_VALUE)\npublic class OmcShippingController extends BaseController {\n\n\t@Resource\n\tprivate OmcShippingService omcShippingService;\n\n\t/**\n\t * 增加收货人地址.\n\t *\n\t * @param shipping the shipping\n\t *\n\t * @return the wrapper\n\t */\n\t@PostMapping(\"/addShipping\")\n\t@ApiOperation(httpMethod = \"POST\", value = \"增加收货人地址\")\n\tpublic Wrapper addShipping(OmcShipping shipping) {\n\n\t\tlogger.info(\"addShipping - 增加收货人地址. shipping={}\", shipping);\n\t\tint result = omcShippingService.saveShipping(getLoginAuthDto(), shipping);\n\t\treturn handleResult(result);\n\n\t}\n\n\t/**\n\t * 删除收货人地址.\n\t *\n\t * @param shippingId the shipping id\n\t *\n\t * @return the wrapper\n\t */\n\t@PostMapping(\"/deleteShipping/{shippingId}\")\n\t@ApiOperation(httpMethod = \"POST\", value = \"删除收货人地址\")\n\tpublic Wrapper deleteShipping(@PathVariable Integer shippingId) {\n\t\tLong userId = getLoginAuthDto().getUserId();\n\t\tlogger.info(\"deleteShipping - 删除收货人地址. userId={}, shippingId={}\", userId, shippingId);\n\t\tint result = omcShippingService.deleteShipping(userId, shippingId);\n\t\treturn handleResult(result);\n\t}\n\n\t/**\n\t * 编辑收货人地址.\n\t *\n\t * @param shipping the shipping\n\t *\n\t * @return the wrapper\n\t */\n\t@PostMapping(\"/updateShipping\")\n\t@ApiOperation(httpMethod = \"POST\", value = \"编辑收货人地址\")\n\tpublic Wrapper updateShipping(OmcShipping shipping) {\n\t\tlogger.info(\"updateShipping - 编辑收货人地址. shipping={}\", shipping);\n\t\tint result = omcShippingService.saveShipping(getLoginAuthDto(), shipping);\n\t\treturn handleResult(result);\n\t}\n\n\t/**\n\t * 设置默认收货地址.\n\t *\n\t * @param addressId the address id\n\t *\n\t * @return the default address\n\t */\n\t@PostMapping(\"/setDefaultAddress/{addressId}\")\n\t@ApiOperation(httpMethod = \"POST\", value = \"设置默认收货地址\")\n\tpublic Wrapper setDefaultAddress(@PathVariable Long addressId) {\n\t\tlogger.info(\"updateShipping - 设置默认地址. addressId={}\", addressId);\n\t\tint result = omcShippingService.setDefaultAddress(getLoginAuthDto(), addressId);\n\t\treturn handleResult(result);\n\t}\n\n\t/**\n\t * 根据Id查询收货人地址.\n\t *\n\t * @param shippingId the shipping id\n\t *\n\t * @return the wrapper\n\t */\n\t@PostMapping(\"/selectShippingById/{shippingId}\")\n\t@ApiOperation(httpMethod = \"POST\", value = \"根据Id查询收货人地址\")\n\tpublic Wrapper<OmcShipping> selectShippingById(@PathVariable Long shippingId) {\n\t\tLong userId = getLoginAuthDto().getUserId();\n\t\tlogger.info(\"selectShippingById - 根据Id查询收货人地址. userId={}, shippingId={}\", userId, shippingId);\n\t\tOmcShipping omcShipping = omcShippingService.selectByShippingIdUserId(userId, shippingId);\n\t\treturn WrapMapper.ok(omcShipping);\n\t}\n\n\t/**\n\t * 分页查询当前用户收货人地址列表.\n\t *\n\t * @param shipping the shipping\n\t *\n\t * @return the wrapper\n\t */\n\t@PostMapping(\"queryUserShippingListWithPage\")\n\t@ApiOperation(httpMethod = \"POST\", value = \"分页查询当前用户收货人地址列表\")\n\tpublic Wrapper<PageInfo> queryUserShippingListWithPage(@RequestBody OmcShipping shipping) {\n\t\tLong userId = getLoginAuthDto().getUserId();\n\t\tlogger.info(\"queryUserShippingListWithPage - 分页查询当前用户收货人地址列表.userId={} shipping={}\", userId, shipping);\n\t\tPageInfo pageInfo = omcShippingService.queryListWithPageByUserId(userId, shipping.getPageNum(), shipping.getPageSize());\n\t\treturn WrapMapper.ok(pageInfo);\n\t}\n\n\t/**\n\t * 分页查询收货人地址列表.\n\t *\n\t * @param shipping the shipping\n\t *\n\t * @return the wrapper\n\t */\n\t@PostMapping(\"queryShippingListWithPage\")\n\t@ApiOperation(httpMethod = \"POST\", value = \"分页查询收货人地址列表\")\n\tpublic Wrapper<PageInfo> queryShippingListWithPage(@RequestBody OmcShipping shipping) {\n\t\tlogger.info(\"queryShippingListWithPage - 分页查询收货人地址列表. shipping={}\", shipping);\n\t\tPageInfo pageInfo = omcShippingService.queryShippingListWithPage(shipping);\n\t\treturn WrapMapper.ok(pageInfo);\n\t}\n\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-omc/src/main/java/com/paascloud/provider/web/frontend/PtcPayController.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：PtcPayController.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.web.frontend;\n\nimport com.alipay.api.AlipayApiException;\nimport com.alipay.api.internal.util.AlipaySignature;\nimport com.alipay.demo.trade.config.Configs;\nimport com.google.common.collect.Maps;\nimport com.paascloud.base.dto.LoginAuthDto;\nimport com.paascloud.core.support.BaseController;\nimport com.paascloud.provider.model.constant.PtcApiConstant;\nimport com.paascloud.provider.service.PtcAlipayService;\nimport com.paascloud.wrapper.WrapMapper;\nimport com.paascloud.wrapper.Wrapper;\nimport io.swagger.annotations.Api;\nimport io.swagger.annotations.ApiOperation;\nimport org.springframework.http.MediaType;\nimport org.springframework.web.bind.annotation.PathVariable;\nimport org.springframework.web.bind.annotation.PostMapping;\nimport org.springframework.web.bind.annotation.RequestMapping;\nimport org.springframework.web.bind.annotation.RestController;\n\nimport javax.annotation.Resource;\nimport javax.servlet.http.HttpServletRequest;\nimport java.util.Map;\n\n/**\n * The class Ptc pay controller.\n *\n * @author paascloud.net @gmail.com\n */\n@RestController\n@RequestMapping(value = \"/pay\")\n@Api(value = \"WEB - PtcPayController\", produces = MediaType.APPLICATION_JSON_UTF8_VALUE)\npublic class PtcPayController extends BaseController {\n\t@Resource\n\tprivate PtcAlipayService ptcAlipayService;\n\n\t/**\n\t * 生成付款二维码.\n\t *\n\t * @param orderNo the order no\n\t *\n\t * @return the wrapper\n\t */\n\t@PostMapping(\"/createQrCodeImage/{orderNo}\")\n\t@ApiOperation(httpMethod = \"POST\", value = \"生成付款二维码\")\n\tpublic Wrapper createQrCodeImage(@PathVariable String orderNo) {\n\t\tLoginAuthDto loginAuthDto = getLoginAuthDto();\n\t\treturn ptcAlipayService.pay(orderNo, loginAuthDto);\n\t}\n\n\t/**\n\t * 支付宝回调信息.\n\t *\n\t * @param request the request\n\t *\n\t * @return the object\n\t */\n\t@PostMapping(\"/alipayCallback\")\n\t@ApiOperation(httpMethod = \"POST\", value = \"支付宝回调信息\")\n\tpublic Object alipayCallback(HttpServletRequest request) {\n\t\tlogger.info(\"收到支付宝回调信息\");\n\t\tMap<String, String> params = Maps.newHashMap();\n\n\t\tMap requestParams = request.getParameterMap();\n\t\tfor (Object o : requestParams.keySet()) {\n\t\t\tString name = (String) o;\n\t\t\tString[] values = (String[]) requestParams.get(name);\n\t\t\tString valueStr = \"\";\n\t\t\tfor (int i = 0; i < values.length; i++) {\n\n\t\t\t\tvalueStr = (i == values.length - 1) ? valueStr + values[i] : valueStr + values[i] + \",\";\n\t\t\t}\n\t\t\tparams.put(name, valueStr);\n\t\t}\n\t\tlogger.info(\"支付宝回调,sign:{},trade_status:{},参数:{}\", params.get(\"sign\"), params.get(\"trade_status\"), params.toString());\n\n\t\t//非常重要,验证回调的正确性,是不是支付宝发的.并且呢还要避免重复通知.\n\n\t\tparams.remove(\"sign_type\");\n\t\ttry {\n\t\t\tboolean alipayRSACheckedV2 = AlipaySignature.rsaCheckV2(params, Configs.getAlipayPublicKey(), \"utf-8\", Configs.getSignType());\n\n\t\t\tif (!alipayRSACheckedV2) {\n\t\t\t\treturn WrapMapper.error(\"非法请求,验证不通过,再恶意请求我就报警找网警了\");\n\t\t\t}\n\t\t} catch (AlipayApiException e) {\n\t\t\tlogger.error(\"支付宝验证回调异常\", e);\n\t\t}\n\n\t\t//todo 验证各种数据\n\t\tWrapper serverResponse = ptcAlipayService.aliPayCallback(params);\n\t\tif (serverResponse.success()) {\n\t\t\treturn PtcApiConstant.AlipayCallback.RESPONSE_SUCCESS;\n\t\t}\n\t\treturn PtcApiConstant.AlipayCallback.RESPONSE_FAILED;\n\t}\n\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-omc/src/main/java/com/paascloud/provider/web/rpc/MallCartFeignClient.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：MallCartFeignClient.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.web.rpc;\n\nimport com.paascloud.core.support.BaseController;\nimport com.paascloud.provider.model.vo.CartProductVo;\nimport com.paascloud.provider.service.OmcCartFeignApi;\nimport com.paascloud.provider.service.OmcCartService;\nimport com.paascloud.wrapper.Wrapper;\nimport io.swagger.annotations.Api;\nimport io.swagger.annotations.ApiOperation;\nimport org.springframework.cloud.context.config.annotation.RefreshScope;\nimport org.springframework.http.MediaType;\nimport org.springframework.web.bind.annotation.RequestBody;\nimport org.springframework.web.bind.annotation.RequestParam;\nimport org.springframework.web.bind.annotation.RestController;\n\nimport javax.annotation.Resource;\nimport java.util.List;\n\n/**\n * The class Mall cart feign client.\n *\n * @author paascloud.net@gmail.com\n */\n@RefreshScope\n@RestController\n@Api(value = \"API - MallCartFeignClient\", produces = MediaType.APPLICATION_JSON_UTF8_VALUE)\npublic class MallCartFeignClient extends BaseController implements OmcCartFeignApi {\n\n\t@Resource\n\tprivate OmcCartService omcCartService;\n\n\t@Override\n\t@ApiOperation(httpMethod = \"POST\", value = \"更新购物车\")\n\tpublic Wrapper updateCartList(@RequestBody List<CartProductVo> cartProductVoList) {\n\t\tlogger.info(\"updateCartList - 更新购物车. cartProductVoList={}\", cartProductVoList);\n\t\tint result = omcCartService.updateCartList(cartProductVoList);\n\t\treturn handleResult(result);\n\t}\n\n\t@Override\n\t@ApiOperation(httpMethod = \"POST\", value = \"保存购物车信息\")\n\tpublic Wrapper addProduct(@RequestParam(\"userId\") Long userId, @RequestParam(\"productId\") Long productId, @RequestParam(value = \"count\") Integer count) {\n\t\tlogger.info(\"updateCartList - 保存购物车信息. productId={}, count={}\", productId, count);\n\t\tint result = omcCartService.saveCart(userId, productId, count);\n\t\treturn handleResult(result);\n\t}\n\n\t@Override\n\t@ApiOperation(httpMethod = \"POST\", value = \"更新购物车信息\")\n\tpublic Wrapper updateProduct(@RequestParam(\"userId\") Long userId, @RequestParam(\"productId\") Long productId, @RequestParam(\"count\") Integer count) {\n\t\tlogger.info(\"updateProduct - 更新购物车信息. productId={}, count={}\", productId, count);\n\t\tint result = omcCartService.updateCart(userId, productId, count);\n\t\treturn handleResult(result);\n\t}\n\n\t@Override\n\t@ApiOperation(httpMethod = \"POST\", value = \"删除购物车商品信息\")\n\tpublic Wrapper deleteProduct(@RequestParam(\"userId\") Long userId, @RequestParam(\"productIds\") String productIds) {\n\t\tlogger.info(\"deleteProduct - 删除购物车商品信息. productIds={}, userId={}\", productIds, userId);\n\t\tint result = omcCartService.deleteProduct(userId, productIds);\n\t\treturn handleResult(result);\n\t}\n\n\t@Override\n\t@ApiOperation(httpMethod = \"POST\", value = \"选中或者反选商品信息\")\n\tpublic Wrapper selectOrUnSelect(@RequestParam(name = \"userId\") Long userId, @RequestParam(name = \"productId\", required = false) Long productId, @RequestParam(name = \"checked\") Integer checked) {\n\t\tlogger.info(\"selectOrUnSelect - 选中或者反选商品信息. productId={}, userId={}, checked={}\", productId, userId, checked);\n\t\tint result = omcCartService.selectOrUnSelect(userId, productId, checked);\n\t\treturn handleResult(result);\n\t}\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-omc/src/main/java/com/paascloud/provider/web/rpc/MallCartQueryFeignClient.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：MallCartQueryFeignClient.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.web.rpc;\n\nimport com.paascloud.core.support.BaseController;\nimport com.paascloud.provider.model.vo.CartVo;\nimport com.paascloud.provider.service.OmcCartQueryFeignApi;\nimport com.paascloud.provider.service.OmcCartService;\nimport com.paascloud.wrapper.WrapMapper;\nimport com.paascloud.wrapper.Wrapper;\nimport io.swagger.annotations.Api;\nimport io.swagger.annotations.ApiOperation;\nimport org.springframework.cloud.context.config.annotation.RefreshScope;\nimport org.springframework.http.MediaType;\nimport org.springframework.web.bind.annotation.RequestParam;\nimport org.springframework.web.bind.annotation.RestController;\n\nimport javax.annotation.Resource;\n\n/**\n * The class Mall cart query feign client.\n *\n * @author paascloud.net@gmail.com\n */\n@RefreshScope\n@RestController\n@Api(value = \"API - MallCartQueryFeignClient\", produces = MediaType.APPLICATION_JSON_UTF8_VALUE)\npublic class MallCartQueryFeignClient extends BaseController implements OmcCartQueryFeignApi {\n\n\t@Resource\n\tprivate OmcCartService omcCartService;\n\n\t@Override\n\t@ApiOperation(httpMethod = \"POST\", value = \"获取购物车信息\")\n\tpublic Wrapper<CartVo> getCartVo(@RequestParam(\"userId\") Long userId) {\n\t\tlogger.info(\"getCartVo - 获取购物车信息. userId={}\", userId);\n\t\tCartVo cartVo = omcCartService.getCarVo(userId);\n\t\treturn WrapMapper.wrap(Wrapper.SUCCESS_CODE, Wrapper.SUCCESS_MESSAGE, cartVo);\n\t}\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-omc/src/main/java/com/paascloud/provider/web/rpc/OmcOrderDetailFeignClient.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：OmcOrderDetailFeignClient.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.web.rpc;\n\nimport com.paascloud.provider.service.OmcOrderDetailFeignApi;\nimport com.paascloud.core.support.BaseController;\n\nimport org.springframework.cloud.context.config.annotation.RefreshScope;\nimport org.springframework.http.MediaType;\nimport org.springframework.web.bind.annotation.RestController;\n\nimport io.swagger.annotations.Api;\n\n/**\n * The class Omc order detail feign client.\n *\n * @author paascloud.net@gmail.com\n */\n@RefreshScope\n@RestController\n@Api(value = \"API - OmcOrderDetailFeignClient\", produces = MediaType.APPLICATION_JSON_UTF8_VALUE)\npublic class OmcOrderDetailFeignClient extends BaseController implements OmcOrderDetailFeignApi {\n\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-omc/src/main/java/com/paascloud/provider/web/rpc/OmcOrderDetailQueryFeignClient.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：OmcOrderDetailQueryFeignClient.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.web.rpc;\n\nimport com.google.common.collect.Lists;\nimport com.paascloud.core.support.BaseController;\nimport com.paascloud.provider.model.domain.OmcOrderDetail;\nimport com.paascloud.provider.model.dto.OrderDetailDto;\nimport com.paascloud.provider.service.OmcOrderDetailQueryFeignApi;\nimport com.paascloud.provider.service.OmcOrderDetailService;\nimport com.paascloud.wrapper.WrapMapper;\nimport com.paascloud.wrapper.Wrapper;\nimport io.swagger.annotations.Api;\nimport io.swagger.annotations.ApiOperation;\nimport org.springframework.beans.BeanUtils;\nimport org.springframework.cloud.context.config.annotation.RefreshScope;\nimport org.springframework.http.MediaType;\nimport org.springframework.web.bind.annotation.PathVariable;\nimport org.springframework.web.bind.annotation.RestController;\n\nimport javax.annotation.Resource;\nimport java.util.List;\n\n/**\n * The class Omc order detail query feign client.\n *\n * @author paascloud.net@gmail.com\n */\n@RefreshScope\n@RestController\n@Api(value = \"API - MallCartQueryFeignClient\", produces = MediaType.APPLICATION_JSON_UTF8_VALUE)\npublic class OmcOrderDetailQueryFeignClient extends BaseController implements OmcOrderDetailQueryFeignApi {\n\t@Resource\n\tprivate OmcOrderDetailService omcOrderDetailService;\n\n\t@Override\n\t@ApiOperation(httpMethod = \"POST\", value = \"获取用户订单详情\")\n\tpublic Wrapper<List<OrderDetailDto>> getListByOrderNoUserId(@PathVariable(\"orderNo\") String orderNo, @PathVariable(\"userId\") Long userId) {\n\t\tlogger.info(\"getListByOrderNoUserId - 获取用户订单详情. orderNo={}, userId={}\", orderNo, userId);\n\t\tList<OmcOrderDetail> list = omcOrderDetailService.getListByOrderNoUserId(orderNo, userId);\n\n\t\tList<OrderDetailDto> orderDetailDtoList = Lists.newArrayList();\n\n\t\tfor (OmcOrderDetail orderDetail : list) {\n\n\t\t\tOrderDetailDto orderDetailDto = new OrderDetailDto();\n\t\t\tBeanUtils.copyProperties(orderDetail, orderDetailDto);\n\t\t\torderDetailDtoList.add(orderDetailDto);\n\t\t}\n\n\t\treturn WrapMapper.ok(orderDetailDtoList);\n\t}\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-omc/src/main/java/com/paascloud/provider/web/rpc/OmcOrderFeignClient.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：OmcOrderFeignClient.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.web.rpc;\n\nimport com.paascloud.core.support.BaseController;\nimport com.paascloud.provider.model.domain.OmcOrder;\nimport com.paascloud.provider.model.dto.OrderDto;\nimport com.paascloud.provider.service.OmcOrderFeignApi;\nimport com.paascloud.provider.service.OmcOrderService;\nimport com.paascloud.wrapper.Wrapper;\nimport io.swagger.annotations.Api;\nimport io.swagger.annotations.ApiOperation;\nimport org.modelmapper.ModelMapper;\nimport org.springframework.cloud.context.config.annotation.RefreshScope;\nimport org.springframework.http.MediaType;\nimport org.springframework.web.bind.annotation.RequestBody;\nimport org.springframework.web.bind.annotation.RestController;\n\nimport javax.annotation.Resource;\n\n/**\n * The class Omc order feign client.\n *\n * @author paascloud.net@gmail.com\n */\n@RefreshScope\n@RestController\n@Api(value = \"API - OmcOrderFeignClient\", produces = MediaType.APPLICATION_JSON_UTF8_VALUE)\npublic class OmcOrderFeignClient extends BaseController implements OmcOrderFeignApi {\n\t@Resource\n\tprivate OmcOrderService omcOrderService;\n\n\t@Override\n\t@ApiOperation(httpMethod = \"POST\", value = \"更新订单信息\")\n\tpublic Wrapper updateOrderById(@RequestBody OrderDto orderDto) {\n\t\tlogger.info(\"updateOrderById - 更新订单信息. orderDto={}\", orderDto);\n\t\tModelMapper modelMapper = new ModelMapper();\n\t\tOmcOrder omcOrder = modelMapper.map(orderDto, OmcOrder.class);\n\t\tint updateResult = omcOrderService.update(omcOrder);\n\t\treturn handleResult(updateResult);\n\n\t}\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-omc/src/main/java/com/paascloud/provider/web/rpc/OmcOrderQueryFeignClient.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：OmcOrderQueryFeignClient.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.web.rpc;\n\nimport com.paascloud.core.support.BaseController;\nimport com.paascloud.provider.model.dto.OrderDto;\nimport com.paascloud.provider.service.OmcOrderQueryFeignApi;\nimport com.paascloud.provider.service.OmcOrderService;\nimport com.paascloud.wrapper.WrapMapper;\nimport com.paascloud.wrapper.Wrapper;\nimport io.swagger.annotations.Api;\nimport io.swagger.annotations.ApiOperation;\nimport org.springframework.cloud.context.config.annotation.RefreshScope;\nimport org.springframework.http.MediaType;\nimport org.springframework.web.bind.annotation.PathVariable;\nimport org.springframework.web.bind.annotation.RestController;\n\nimport javax.annotation.Resource;\n\n/**\n * The class Omc order query feign client.\n *\n * @author paascloud.net@gmail.com\n */\n@RefreshScope\n@RestController\n@Api(value = \"API - OmcOrderQueryFeignClient\", produces = MediaType.APPLICATION_JSON_UTF8_VALUE)\npublic class OmcOrderQueryFeignClient extends BaseController implements OmcOrderQueryFeignApi {\n\t@Resource\n\tprivate OmcOrderService omcOrderService;\n\n\t@Override\n\t@ApiOperation(httpMethod = \"POST\", value = \"根据订单号查询订单信息\")\n\tpublic Wrapper<OrderDto> queryByOrderNo(@PathVariable(\"orderNo\") String orderNo) {\n\t\tlogger.info(\"selectByOrderNo - 根据订单号查询订单信息. orderNo={}\", orderNo);\n\t\tOrderDto orderDto = omcOrderService.queryOrderDtoByOrderNo(orderNo);\n\t\treturn WrapMapper.ok(orderDto);\n\t}\n\n\t@Override\n\t@ApiOperation(httpMethod = \"POST\", value = \"根据订单号查询用户订单信息\")\n\tpublic Wrapper<OrderDto> queryByUserIdAndOrderNo(@PathVariable(\"userId\") Long userId, @PathVariable(\"orderNo\") String orderNo) {\n\t\tlogger.info(\"selectByUserIdAndOrderNo - 根据订单号查询用户订单信息. userId={}, orderNo={}\", userId, orderNo);\n\t\tOrderDto orderDto = omcOrderService.queryOrderDtoByUserIdAndOrderNo(userId, orderNo);\n\t\treturn WrapMapper.ok(orderDto);\n\t}\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-omc/src/main/resources/META-INF/spring-devtools.properties",
    "content": "restart.include.mapper=/mapper-[\\\\w-\\\\.]+jar\nrestart.include.pagehelper=/pagehelper-[\\\\w-\\\\.]+jar"
  },
  {
    "path": "paascloud-provider/paascloud-provider-omc/src/main/resources/ValidationMessages.properties",
    "content": ""
  },
  {
    "path": "paascloud-provider/paascloud-provider-omc/src/main/resources/application.yml",
    "content": "server:\n  port: 8050\n\nspring:\n  profiles:\n    active: dev\n  application:\n    name: @pom.artifactId@\n  datasource:\n    username: root\n    password: 123456"
  },
  {
    "path": "paascloud-provider/paascloud-provider-omc/src/main/resources/banner.txt",
    "content": "${AnsiColor.BRIGHT_CYAN}\n                                  .__                   .___                  __\n___________  _____    ______ ____ |  |   ____  __ __  __| _/     ____   _____/  |_\n\\____ \\__  \\ \\__  \\  /  ___// ___\\|  |  /  _ \\|  |  \\/ __ |     /    \\_/ __ \\   __\\\n|  |_> > __ \\_/ __ \\_\\___ \\\\  \\___|  |_(  <_> )  |  / /_/ |    |   |  \\  ___/|  |\n|   __(____  (____  /____  >\\___  >____/\\____/|____/\\____ | /\\ |___|  /\\___  >__|\n|__|       \\/     \\/     \\/     \\/ Powered by liuzhaoming\\/ \\/      \\/     \\/"
  },
  {
    "path": "paascloud-provider/paascloud-provider-omc/src/main/resources/bootstrap.yml",
    "content": "spring:\n  cloud:\n    config:\n      fail-fast: true\n      discovery:\n        service-id: paascloud-discovery\n        enabled: true\n      label: ${spring.profiles.active}\n      profile: ${spring.profiles.active}\n      username: admin\n      password: admin\n\neureka:\n  client:\n    serviceUrl:\n      defaultZone: http://root:root@paascloud-eureka:8761/eureka/\n  instance:\n    instance-id: ${spring.application.name}:${spring.cloud.client.ipAddress}:${server.port}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-omc/src/main/resources/conf/liquibase.properties",
    "content": "spring.datasource.driver-class-name= com.mysql.jdbc.Driver\nspring.datasource.url=jdbc:mysql://paascloud-db-mysql:3306/paascloud_omc?characterEncoding=utf8&useSSL=false\nspring.datasource.username= root\nspring.datasource.password= 123456"
  },
  {
    "path": "paascloud-provider/paascloud-provider-omc/src/main/resources/liquibase/index.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<databaseChangeLog\n        xmlns=\"http://www.liquibase.org/xml/ns/dbchangelog\"\n        xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n        xsi:schemaLocation=\"http://www.liquibase.org/xml/ns/dbchangelog\n         http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.1.xsd\">\n</databaseChangeLog>"
  },
  {
    "path": "paascloud-provider/paascloud-provider-omc/src/main/resources/logback-spring.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<configuration>\n    <include resource=\"org/springframework/boot/logging/logback/defaults.xml\"/>\n    ​\n    <springProperty scope=\"context\" name=\"springAppName\" source=\"spring.application.name\"/>\n    <!-- Example for logging into the build folder of your project -->\n    <property name=\"LOG_FILE\" value=\"/data/logs/paascloud/${springAppName}/${springAppName}\"/>\n    ​\n    <property name=\"CONSOLE_LOG_PATTERN\" value=\"%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr([${springAppName:-},%X{X-B3-TraceId:-},%X{X-B3-SpanId:-},%X{X-B3-ParentSpanId:-},%X{X-Span-Export:-}]){yellow} %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}\"/>\n\n    <!-- Appender to log to console -->\n    <appender name=\"console\" class=\"ch.qos.logback.core.ConsoleAppender\">\n        <filter class=\"ch.qos.logback.classic.filter.ThresholdFilter\">\n            <!-- Minimum logging level to be presented in the console logs -->\n            <level>DEBUG</level>\n        </filter>\n        <encoder>\n            <pattern>${CONSOLE_LOG_PATTERN}</pattern>\n            <charset>utf8</charset>\n        </encoder>\n    </appender>\n\n    <!-- Appender to log to file -->\n    <appender name=\"flatfile\" class=\"ch.qos.logback.core.rolling.RollingFileAppender\">\n        <file>${LOG_FILE}</file>\n        <rollingPolicy class=\"ch.qos.logback.core.rolling.TimeBasedRollingPolicy\">\n            <fileNamePattern>${LOG_FILE}.%d{yyyy-MM-dd}.gz</fileNamePattern>\n            <maxHistory>7</maxHistory>\n        </rollingPolicy>\n        <encoder>\n            <pattern>${CONSOLE_LOG_PATTERN}</pattern>\n            <charset>utf8</charset>\n        </encoder>\n    </appender>\n    ​\n    <!-- Appender to log to file in a JSON format -->\n    <appender name=\"logstash\" class=\"ch.qos.logback.core.rolling.RollingFileAppender\">\n        <file>${LOG_FILE}.json</file>\n        <rollingPolicy class=\"ch.qos.logback.core.rolling.TimeBasedRollingPolicy\">\n            <fileNamePattern>${LOG_FILE}.json.%d{yyyy-MM-dd}.gz</fileNamePattern>\n            <maxHistory>7</maxHistory>\n        </rollingPolicy>\n        <encoder class=\"net.logstash.logback.encoder.LoggingEventCompositeJsonEncoder\">\n            <providers>\n                <timestamp>\n                    <timeZone>UTC</timeZone>\n                </timestamp>\n                <pattern>\n                    <pattern>\n                        {\n                        \"severity\": \"%level\",\n                        \"service\": \"${springAppName:-}\",\n                        \"trace\": \"%X{X-B3-TraceId:-}\",\n                        \"span\": \"%X{X-B3-SpanId:-}\",\n                        \"parent\": \"%X{X-B3-ParentSpanId:-}\",\n                        \"exportable\": \"%X{X-Span-Export:-}\",\n                        \"pid\": \"${PID:-}\",\n                        \"thread\": \"%thread\",\n                        \"class\": \"%logger{40}\",\n                        \"rest\": \"%message\"\n                        }\n                    </pattern>\n                </pattern>\n            </providers>\n        </encoder>\n    </appender>\n\n    <appender name=\"MyBatisStatistics\" class=\"ch.qos.logback.core.rolling.RollingFileAppender\">\n        <rollingPolicy class=\"ch.qos.logback.core.rolling.TimeBasedRollingPolicy\">\n            <fileNamePattern>${LOG_FILE}.sql.%d{yyyy-MM-dd}.gz</fileNamePattern>\n            <maxHistory>10</maxHistory>\n        </rollingPolicy>\n        <encoder>\n            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36}-%msg%n</pattern>\n        </encoder>\n    </appender>\n\n    <logger name=\"com.paascloud.provider.mapper\" level=\"DEBUG\">\n        <appender-ref ref=\"MyBatisStatistics\" />\n    </logger>\n    ​\n    <root level=\"INFO\">\n        <appender-ref ref=\"console\"/>\n        <appender-ref ref=\"logstash\"/>\n        <appender-ref ref=\"flatfile\"/>\n    </root>\n</configuration>"
  },
  {
    "path": "paascloud-provider/paascloud-provider-omc/src/main/resources/mapper/OmcCartMapper.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n<!DOCTYPE mapper PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\" \"http://mybatis.org/dtd/mybatis-3-mapper.dtd\" >\n<mapper namespace=\"com.paascloud.provider.mapper.OmcCartMapper\">\n    <resultMap id=\"BaseResultMap\" type=\"com.paascloud.provider.model.domain.OmcCart\">\n        <id column=\"id\" property=\"id\" jdbcType=\"BIGINT\"/>\n        <result column=\"version\" property=\"version\" jdbcType=\"INTEGER\"/>\n        <result column=\"user_id\" property=\"userId\" jdbcType=\"BIGINT\"/>\n        <result column=\"product_id\" property=\"productId\" jdbcType=\"BIGINT\"/>\n        <result column=\"quantity\" property=\"quantity\" jdbcType=\"INTEGER\"/>\n        <result column=\"checked\" property=\"checked\" jdbcType=\"INTEGER\"/>\n        <result column=\"creator\" property=\"creator\" jdbcType=\"VARCHAR\"/>\n        <result column=\"creator_id\" property=\"creatorId\" jdbcType=\"BIGINT\"/>\n        <result column=\"created_time\" property=\"createdTime\" jdbcType=\"TIMESTAMP\"/>\n        <result column=\"last_operator\" property=\"lastOperator\" jdbcType=\"VARCHAR\"/>\n        <result column=\"last_operator_id\" property=\"lastOperatorId\" jdbcType=\"BIGINT\"/>\n        <result column=\"update_time\" property=\"updateTime\" jdbcType=\"TIMESTAMP\"/>\n    </resultMap>\n    <delete id=\"deleteByUserIdProductIds\" parameterType=\"map\">\n        delete from pc_omc_cart\n        where user_id = #{userId}\n        <if test=\"productIdList != null\">\n            and product_id in\n            <foreach collection=\"productIdList\" item=\"item\" index=\"index\" open=\"(\" separator=\",\" close=\")\">\n                #{item}\n            </foreach>\n        </if>\n    </delete>\n    <select id=\"selectUnCheckedCartProductCountByUserId\" resultType=\"java.lang.Integer\">\n        SELECT  count(1) from pc_omc_cart where checked = 0 and user_id = #{userId}\n    </select>\n    <select id=\"selectByProductIdAndUserId\" resultType=\"com.paascloud.provider.model.domain.OmcCart\" parameterType=\"map\">\n        SELECT  * from pc_omc_cart where product_id = #{productId} and user_id = #{userId}\n    </select>\n\n    <update id=\"checkedOrUncheckedProduct\" parameterType=\"map\">\n        UPDATE  pc_omc_cart\n        set checked = #{checked},\n        update_time = now()\n        where user_id = #{userId}\n        <if test=\"productId != null\">\n            and product_id = #{productId}\n        </if>\n    </update>\n    <update id=\"batchDeleteCart\" parameterType=\"list\">\n        delete from pc_omc_cart\n        where id IN\n        <foreach collection=\"idList\" item=\"item\" index=\"index\" open=\"(\" close=\")\" separator=\",\">\n            #{item}\n        </foreach>\n    </update>\n\n    <select id=\"selectCartProductCount\" parameterType=\"long\" resultType=\"int\">\n        select IFNULL(sum(quantity),0) as count from pc_omc_cart where user_id = #{userId}\n    </select>\n\n    <select id=\"selectCheckedCartByUserId\" parameterType=\"long\" resultMap=\"BaseResultMap\">\n        SELECT\n        *\n        from pc_omc_cart\n        where user_id = #{userId}\n        and checked = 1\n    </select>\n</mapper>"
  },
  {
    "path": "paascloud-provider/paascloud-provider-omc/src/main/resources/mapper/OmcOrderDetailMapper.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n<!DOCTYPE mapper PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\" \"http://mybatis.org/dtd/mybatis-3-mapper.dtd\" >\n<mapper namespace=\"com.paascloud.provider.mapper.OmcOrderDetailMapper\">\n    <resultMap id=\"BaseResultMap\" type=\"com.paascloud.provider.model.domain.OmcOrderDetail\" >\n        <id column=\"id\" property=\"id\" jdbcType=\"BIGINT\" />\n        <result column=\"version\" property=\"version\" jdbcType=\"INTEGER\" />\n        <result column=\"detail_no\" property=\"detailNo\" jdbcType=\"VARCHAR\" />\n        <result column=\"user_id\" property=\"userId\" jdbcType=\"BIGINT\" />\n        <result column=\"order_no\" property=\"orderNo\" jdbcType=\"VARCHAR\" />\n        <result column=\"product_id\" property=\"productId\" jdbcType=\"BIGINT\" />\n        <result column=\"product_name\" property=\"productName\" jdbcType=\"VARCHAR\" />\n        <result column=\"product_image\" property=\"productImage\" jdbcType=\"VARCHAR\" />\n        <result column=\"current_unit_price\" property=\"currentUnitPrice\" jdbcType=\"DECIMAL\" />\n        <result column=\"quantity\" property=\"quantity\" jdbcType=\"INTEGER\" />\n        <result column=\"total_price\" property=\"totalPrice\" jdbcType=\"DECIMAL\" />\n        <result column=\"creator\" property=\"creator\" jdbcType=\"VARCHAR\" />\n        <result column=\"creator_id\" property=\"creatorId\" jdbcType=\"BIGINT\" />\n        <result column=\"created_time\" property=\"createdTime\" jdbcType=\"TIMESTAMP\" />\n        <result column=\"last_operator\" property=\"lastOperator\" jdbcType=\"VARCHAR\" />\n        <result column=\"last_operator_id\" property=\"lastOperatorId\" jdbcType=\"BIGINT\" />\n        <result column=\"update_time\" property=\"updateTime\" jdbcType=\"TIMESTAMP\" />\n    </resultMap>\n    <sql id=\"Base_Column_List\" >\n        id, version, detail_no, user_id, order_no, product_id, product_name,\n        product_image, current_unit_price, quantity, total_price, creator, creator_id, created_time,\n        last_operator, last_operator_id, update_time\n    </sql>\n\n    <select id=\"getListByOrderNoUserId\" parameterType=\"map\" resultMap=\"BaseResultMap\">\n        SELECT\n        <include refid=\"Base_Column_List\"/>\n        from pc_omc_order_detail\n        where order_no = #{orderNo}\n        and user_id = #{userId}\n    </select>\n\n    <select id=\"getListByOrderNo\" parameterType=\"map\" resultMap=\"BaseResultMap\">\n        SELECT\n        <include refid=\"Base_Column_List\"/>\n        from pc_omc_order_detail\n        where order_no = #{orderNo}\n    </select>\n\n\n\n    <insert id=\"batchInsertOrderDetail\" parameterType=\"java.util.List\">\n        insert into pc_omc_order_detail\n        (id, version, detail_no, user_id, order_no, product_id, product_name,\n            product_image, current_unit_price, quantity, total_price, creator, creator_id, created_time,\n            last_operator, last_operator_id, update_time)\n        values\n        <foreach collection=\"orderDetailList\" index=\"index\" item=\"item\" separator=\",\">\n            (#{item.id,jdbcType=BIGINT},\n            #{item.version,jdbcType=INTEGER},\n            #{item.detailNo,jdbcType=VARCHAR},\n            #{item.userId,jdbcType=BIGINT},\n            #{item.orderNo,jdbcType=VARCHAR},\n            #{item.productId,jdbcType=BIGINT},\n            #{item.productName,jdbcType=VARCHAR},\n            #{item.productImage,jdbcType=VARCHAR},\n            #{item.currentUnitPrice,jdbcType=DECIMAL},\n            #{item.quantity,jdbcType=INTEGER},\n            #{item.totalPrice,jdbcType=DECIMAL},\n            #{item.creator,jdbcType=VARCHAR},\n            #{item.creatorId,jdbcType=BIGINT},\n            #{item.createdTime,jdbcType=TIMESTAMP},\n            #{item.lastOperator,jdbcType=VARCHAR},\n            #{item.lastOperatorId,jdbcType=BIGINT},\n            #{item.updateTime,jdbcType=TIMESTAMP})\n        </foreach>\n    </insert>\n</mapper>"
  },
  {
    "path": "paascloud-provider/paascloud-provider-omc/src/main/resources/mapper/OmcOrderMapper.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n<!DOCTYPE mapper PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\"\n        \"http://mybatis.org/dtd/mybatis-3-mapper.dtd\" >\n<mapper namespace=\"com.paascloud.provider.mapper.OmcOrderMapper\">\n  <resultMap id=\"BaseResultMap\" type=\"com.paascloud.provider.model.domain.OmcOrder\">\n    <id column=\"id\" property=\"id\" jdbcType=\"BIGINT\"/>\n    <result column=\"version\" property=\"version\" jdbcType=\"INTEGER\"/>\n    <result column=\"order_no\" property=\"orderNo\" jdbcType=\"VARCHAR\"/>\n    <result column=\"user_id\" property=\"userId\" jdbcType=\"BIGINT\"/>\n    <result column=\"shipping_id\" property=\"shippingId\" jdbcType=\"BIGINT\"/>\n    <result column=\"payment\" property=\"payment\" jdbcType=\"DECIMAL\"/>\n    <result column=\"payment_type\" property=\"paymentType\" jdbcType=\"INTEGER\"/>\n    <result column=\"postage\" property=\"postage\" jdbcType=\"INTEGER\"/>\n    <result column=\"status\" property=\"status\" jdbcType=\"INTEGER\"/>\n    <result column=\"payment_time\" property=\"paymentTime\" jdbcType=\"TIMESTAMP\"/>\n    <result column=\"send_time\" property=\"sendTime\" jdbcType=\"TIMESTAMP\"/>\n    <result column=\"end_time\" property=\"endTime\" jdbcType=\"TIMESTAMP\"/>\n    <result column=\"close_time\" property=\"closeTime\" jdbcType=\"TIMESTAMP\"/>\n    <result column=\"creator\" property=\"creator\" jdbcType=\"VARCHAR\"/>\n    <result column=\"creator_id\" property=\"creatorId\" jdbcType=\"BIGINT\"/>\n    <result column=\"created_time\" property=\"createdTime\" jdbcType=\"TIMESTAMP\"/>\n    <result column=\"last_operator\" property=\"lastOperator\" jdbcType=\"VARCHAR\"/>\n    <result column=\"last_operator_id\" property=\"lastOperatorId\" jdbcType=\"BIGINT\"/>\n    <result column=\"update_time\" property=\"updateTime\" jdbcType=\"TIMESTAMP\"/>\n  </resultMap>\n\n  <sql id=\"Base_Column_List\">\n    ${alias}.id,\n    ${alias}.version,\n    ${alias}.order_no,\n    ${alias}.user_id,\n    ${alias}.shipping_id,\n    ${alias}.payment,\n    ${alias}.payment_type,\n    ${alias}.postage,\n    ${alias}.status,\n    ${alias}.payment_time,\n    ${alias}.send_time,\n    ${alias}.end_time,\n    ${alias}.close_time,\n    ${alias}.creator,\n    ${alias}.creator_id,\n    ${alias}.created_time,\n    ${alias}.last_operator,\n    ${alias}.last_operator_id,\n    ${alias}.update_time\n  </sql>\n\n  <select id=\"selectByUserIdAndOrderNo\" resultMap=\"BaseResultMap\" parameterType=\"map\">\n    SELECT\n    <include refid=\"Base_Column_List\">\n      <property name=\"alias\" value=\"oder\"/>\n    </include>\n    from pc_omc_order oder\n    where oder.order_no = #{orderNo}\n    and oder.user_id = #{userId}\n  </select>\n  <select id=\"selectByOrderNo\" resultMap=\"BaseResultMap\" parameterType=\"string\">\n    SELECT\n    <include refid=\"Base_Column_List\">\n      <property name=\"alias\" value=\"oder\"/>\n    </include>\n    FROM pc_omc_order oder\n    where oder.order_no = #{orderNo}\n  </select>\n\n\n  <select id=\"selectByUserId\" resultMap=\"BaseResultMap\" parameterType=\"long\">\n    SELECT\n    <include refid=\"Base_Column_List\">\n      <property name=\"alias\" value=\"oder\"/>\n    </include>\n    from pc_omc_order oder\n    where oder.user_id = #{userId}\n    order by update_time desc\n  </select>\n\n\n  <select id=\"selectAllOrder\" resultMap=\"BaseResultMap\">\n    SELECT\n    <include refid=\"Base_Column_List\">\n      <property name=\"alias\" value=\"oder\"/>\n    </include>\n    from pc_omc_order oder\n    ORDER BY update_time desc\n  </select>\n  <select id=\"queryOrderListWithPage\" resultType=\"com.paascloud.provider.model.vo.OrderDocVo\">\n    SELECT\n    <include refid=\"Base_Column_List\">\n      <property name=\"alias\" value=\"oder\"/>\n    </include>\n    ,shipping.receiver_name\n    from pc_omc_order oder\n    LEFT JOIN pc_omc_shipping shipping ON oder.shipping_id = shipping.id\n    where 1 = 1\n    <if test=\"status != null and status != ''\">\n      and oder.status = #{status}\n    </if>\n    <if test=\"orderNo != null and orderNo != ''\">\n      and oder.order_no = #{orderNo}\n    </if>\n    ORDER BY update_time desc\n  </select>\n</mapper>"
  },
  {
    "path": "paascloud-provider/paascloud-provider-omc/src/main/resources/mapper/OmcShippingMapper.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n<!DOCTYPE mapper PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\"\n        \"http://mybatis.org/dtd/mybatis-3-mapper.dtd\" >\n<mapper namespace=\"com.paascloud.provider.mapper.OmcShippingMapper\">\n    <resultMap id=\"BaseResultMap\" type=\"com.paascloud.provider.model.domain.OmcShipping\">\n        <id column=\"id\" property=\"id\" jdbcType=\"BIGINT\"/>\n        <result column=\"version\" property=\"version\" jdbcType=\"INTEGER\"/>\n        <result column=\"receiver_name\" property=\"receiverName\" jdbcType=\"VARCHAR\"/>\n        <result column=\"receiver_phone_no\" property=\"receiverPhoneNo\" jdbcType=\"VARCHAR\"/>\n        <result column=\"receiver_mobile_no\" property=\"receiverMobileNo\" jdbcType=\"VARCHAR\"/>\n        <result column=\"province_id\" property=\"provinceId\" jdbcType=\"BIGINT\"/>\n        <result column=\"province_name\" property=\"provinceName\" jdbcType=\"VARCHAR\"/>\n        <result column=\"city_id\" property=\"cityId\" jdbcType=\"BIGINT\"/>\n        <result column=\"city_name\" property=\"cityName\" jdbcType=\"VARCHAR\"/>\n        <result column=\"district_name\" property=\"districtName\" jdbcType=\"VARCHAR\"/>\n        <result column=\"district_id\" property=\"districtId\" jdbcType=\"BIGINT\"/>\n        <result column=\"street_id\" property=\"streetId\" jdbcType=\"BIGINT\"/>\n        <result column=\"street_name\" property=\"streetName\" jdbcType=\"VARCHAR\"/>\n        <result column=\"detail_address\" property=\"detailAddress\" jdbcType=\"VARCHAR\"/>\n        <result column=\"receiver_zip_code\" property=\"receiverZipCode\" jdbcType=\"VARCHAR\"/>\n        <result column=\"default_address\" property=\"defaultAddress\" jdbcType=\"INTEGER\"/>\n        <result column=\"creator\" property=\"creator\" jdbcType=\"VARCHAR\"/>\n        <result column=\"creator_id\" property=\"creatorId\" jdbcType=\"BIGINT\"/>\n        <result column=\"created_time\" property=\"createdTime\" jdbcType=\"TIMESTAMP\"/>\n        <result column=\"last_operator\" property=\"lastOperator\" jdbcType=\"VARCHAR\"/>\n        <result column=\"last_operator_id\" property=\"lastOperatorId\" jdbcType=\"BIGINT\"/>\n        <result column=\"update_time\" property=\"updateTime\" jdbcType=\"TIMESTAMP\"/>\n    </resultMap>\n    <sql id=\"Base_Column_List\">\n        id, version, receiver_name, receiver_phone_no, receiver_mobile_no, province_id,\n        province_name, city_id, city_name, district_name, district_id, street_id, street_name,\n        detail_address, receiver_zip_code, creator, creator_id, created_time, last_operator,\n        last_operator_id, update_time\n    </sql>\n\n    <delete id=\"deleteByShippingIdUserId\" parameterType=\"map\">\n        DELETE FROM pc_omc_shipping\n        WHERE id = #{shippingId}\n              AND user_id = #{userId}\n    </delete>\n    <select id=\"selectByShippingIdUserId\" resultMap=\"BaseResultMap\" parameterType=\"map\">\n        SELECT\n        <include refid=\"Base_Column_List\"/>\n        from pc_omc_shipping\n        where id = #{shippingId}\n        and user_id = #{userId}\n    </select>\n    <select id=\"selectByUserId\" resultMap=\"BaseResultMap\" parameterType=\"map\">\n        SELECT\n        <include refid=\"Base_Column_List\"/>\n        from pc_omc_shipping\n        where user_id = #{userId}\n    </select>\n    <select id=\"selectDefaultAddressByUserId\"\n            resultType=\"com.paascloud.provider.model.domain.OmcShipping\">\n        SELECT\n            <include refid=\"Base_Column_List\"/>\n        from pc_omc_shipping\n        where id = #{shippingId}\n        and default = 1\n    </select>\n\n</mapper>"
  },
  {
    "path": "paascloud-provider/paascloud-provider-omc/src/main/resources/mapper/PtcPayInfoMapper.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n<!DOCTYPE mapper PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\" \"http://mybatis.org/dtd/mybatis-3-mapper.dtd\" >\n<mapper namespace=\"com.paascloud.provider.mapper.PtcPayInfoMapper\">\n    <resultMap id=\"BaseResultMap\" type=\"com.paascloud.provider.model.domain.PtcPayInfo\">\n        <id column=\"id\" property=\"id\" jdbcType=\"BIGINT\"/>\n        <result column=\"version\" property=\"version\" jdbcType=\"INTEGER\"/>\n        <result column=\"user_id\" property=\"userId\" jdbcType=\"BIGINT\"/>\n        <result column=\"order_no\" property=\"orderNo\" jdbcType=\"VARCHAR\"/>\n        <result column=\"pay_platform\" property=\"payPlatform\" jdbcType=\"INTEGER\"/>\n        <result column=\"platform_number\" property=\"platformNumber\" jdbcType=\"VARCHAR\"/>\n        <result column=\"platform_status\" property=\"platformStatus\" jdbcType=\"VARCHAR\"/>\n        <result column=\"creator\" property=\"creator\" jdbcType=\"VARCHAR\"/>\n        <result column=\"creator_id\" property=\"creatorId\" jdbcType=\"BIGINT\"/>\n        <result column=\"created_time\" property=\"createdTime\" jdbcType=\"TIMESTAMP\"/>\n        <result column=\"last_operator\" property=\"lastOperator\" jdbcType=\"VARCHAR\"/>\n        <result column=\"last_operator_id\" property=\"lastOperatorId\" jdbcType=\"BIGINT\"/>\n        <result column=\"update_time\" property=\"updateTime\" jdbcType=\"TIMESTAMP\"/>\n    </resultMap>\n</mapper>"
  },
  {
    "path": "paascloud-provider/paascloud-provider-omc/src/main/resources/zfbinfo.properties",
    "content": "# \\u652F\\u4ED8\\u5B9D\\u7F51\\u5173\\u540D\\u3001partnerId\\u548CappId\nopen_api_domain = https://openapi.alipaydev.com/gateway.do\nmcloud_api_domain = http://mcloudmonitor.com/gateway.do\n# \\u5546\\u6237UID\npid = 20881021*********\n# APPID\nappid = 20160805*********\n\n# RSA\\u79C1\\u94A5\\u3001\\u516C\\u94A5\\u548C\\u652F\\u4ED8\\u5B9D\\u516C\\u94A5\nprivate_key = *********\npublic_key = *********\n\n#SHA256withRsa\\u5BF9\\u5E94\\u652F\\u4ED8\\u5B9D\\u516C\\u94A5\nalipay_public_key = *********\n\n# \\u7B7E\\u540D\\u7C7B\\u578B: RSA->SHA1withRsa,RSA2->SHA256withRsa\nsign_type = RSA2\n# \\u5F53\\u9762\\u4ED8\\u6700\\u5927\\u67E5\\u8BE2\\u6B21\\u6570\\u548C\\u67E5\\u8BE2\\u95F4\\u9694\\uFF08\\u6BEB\\u79D2\\uFF09\nmax_query_retry = 5\nquery_duration = 5000\n\n# \\u5F53\\u9762\\u4ED8\\u6700\\u5927\\u64A4\\u9500\\u6B21\\u6570\\u548C\\u64A4\\u9500\\u95F4\\u9694\\uFF08\\u6BEB\\u79D2\\uFF09\nmax_cancel_retry = 3\ncancel_duration = 2000\n\n# \\u4EA4\\u6613\\u4FDD\\u969C\\u7EBF\\u7A0B\\u7B2C\\u4E00\\u6B21\\u8C03\\u5EA6\\u5EF6\\u8FDF\\u548C\\u8C03\\u5EA6\\u95F4\\u9694\\uFF08\\u79D2\\uFF09\nheartbeat_delay = 5\nheartbeat_duration = 900"
  },
  {
    "path": "paascloud-provider/paascloud-provider-omc/src/test/java/com/paascloud/provider/PaasCloudOmcApplicationTests.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：PaasCloudOmcApplicationTests.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider;\n\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\nimport org.springframework.boot.test.context.SpringBootTest;\nimport org.springframework.test.context.junit4.SpringRunner;\n\n@RunWith(SpringRunner.class)\n@SpringBootTest\npublic class PaasCloudOmcApplicationTests {\n\tprotected final Logger logger = LoggerFactory.getLogger(this.getClass());\n\t@Test\n\tpublic void contextLoads() {\n\n\t}\n\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-omc/src/test/resources/generator/generatorConfig.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE generatorConfiguration\n        PUBLIC \"-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN\"\n        \"http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd\">\n\n<generatorConfiguration>\n    <properties resource=\"application.yml\"/>\n\n    <context id=\"Mysql\" targetRuntime=\"MyBatis3Simple\" defaultModelType=\"flat\">\n        <property name=\"beginningDelimiter\" value=\"`\"/>\n        <property name=\"endingDelimiter\" value=\"`\"/>\n\n        <plugin type=\"tk.mybatis.mapper.generator.MapperPlugin\">\n            <property name=\"mappers\" value=\"com.paascloud.core.mybatis.MyMapper\"/>\n        </plugin>\n\n        <jdbcConnection driverClass=\"com.mysql.jdbc.Driver\"\n                        connectionURL=\"jdbc:mysql://127.0.0.1:3306/paas_cloud\"\n                        userId=\"root\"\n                        password=\"123456\">\n        </jdbcConnection>\n\n        <javaModelGenerator targetPackage=\"test.mybatis.springboot.model\" targetProject=\"src/test/java\"/>\n\n        <sqlMapGenerator targetPackage=\"mapper\" targetProject=\"src/test/resources\"/>\n\n        <javaClientGenerator targetPackage=\"test.mybatis.springboot.mapper\" targetProject=\"src/test/java\"\n                             type=\"XMLMAPPER\"/>\n\n        <table tableName=\"%\">\n            <!--mysql 配置-->\n            <generatedKey column=\"id\" sqlStatement=\"Mysql\" identity=\"true\"/>\n            <!--oracle 配置-->\n            <!--<generatedKey column=\"id\" sqlStatement=\"select SEQ_{1}.nextval from dual\" identity=\"false\" type=\"pre\"/>-->\n        </table>\n    </context>\n</generatorConfiguration>"
  },
  {
    "path": "paascloud-provider/paascloud-provider-opc/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n\txsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n\t<modelVersion>4.0.0</modelVersion>\n\n\t<artifactId>paascloud-provider-opc</artifactId>\n\t<packaging>jar</packaging>\n  <version>1.0</version>\n\n\t<name>paascloud-provider-opc</name>\n\t<description>开放平台中心 - Open platform center</description>\n\n\t<parent>\n\t\t<groupId>com.liuzm.paascloud.provider</groupId>\n\t\t<artifactId>paascloud-provider</artifactId>\n\t\t<version>1.0</version>\n\t</parent>\n\n\t<properties>\n\t\t<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>\n\t\t<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>\n\t\t<java.version>1.8</java.version>\n\t</properties>\n\n    <dependencies>\n        <dependency>\n            <groupId>mysql</groupId>\n            <artifactId>mysql-connector-java</artifactId>\n            <scope>runtime</scope>\n        </dependency>\n        <dependency>\n            <groupId>joda-time</groupId>\n            <artifactId>joda-time</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.mybatis.spring.boot</groupId>\n            <artifactId>mybatis-spring-boot-starter</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>tk.mybatis</groupId>\n            <artifactId>mapper-spring-boot-starter</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>com.github.pagehelper</groupId>\n            <artifactId>pagehelper-spring-boot-starter</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>com.alibaba</groupId>\n            <artifactId>druid-spring-boot-starter</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.springframework.cloud</groupId>\n            <artifactId>spring-cloud-starter-feign</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>com.fasterxml.jackson.core</groupId>\n            <artifactId>jackson-databind</artifactId>\n        </dependency>\n\n        <dependency>\n            <groupId>com.liuzm.paascloud.provider.api</groupId>\n            <artifactId>paascloud-provider-omc-api</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>com.liuzm.paascloud.provider.api</groupId>\n            <artifactId>paascloud-provider-mdc-api</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>com.aliyun</groupId>\n            <artifactId>aliyun-java-sdk-core</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>com.aliyun</groupId>\n            <artifactId>aliyun-java-sdk-dysmsapi</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>com.qiniu</groupId>\n            <artifactId>qiniu-java-sdk</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>com.liuzm.paascloud.provider.api</groupId>\n            <artifactId>paascloud-provider-opc-api</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.springframework.boot</groupId>\n            <artifactId>spring-boot-starter-mail</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.springframework.boot</groupId>\n            <artifactId>spring-boot-starter-freemarker</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>de.codecentric</groupId>\n            <artifactId>spring-boot-admin-starter-client</artifactId>\n        </dependency>\n\n        <dependency>\n            <groupId>com.github.penggle</groupId>\n            <artifactId>kaptcha</artifactId>\n        </dependency>\n      <dependency>\n        <groupId>com.liuzm.paascloud.provider.api</groupId>\n        <artifactId>paascloud-provider-sdk-api</artifactId>\n      </dependency>\n      <dependency>\n        <groupId>commons-io</groupId>\n        <artifactId>commons-io</artifactId>\n      </dependency>\n      <dependency>\n        <groupId>org.springframework.retry</groupId>\n        <artifactId>spring-retry</artifactId>\n      </dependency>\n    </dependencies>\n</project>\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-opc/src/main/java/com/paascloud/PaasCloudOpcApplication.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：PaasCloudOpcApplication.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud;\n\nimport com.google.code.kaptcha.impl.DefaultKaptcha;\nimport com.google.code.kaptcha.util.Config;\nimport liquibase.integration.spring.SpringLiquibase;\nimport org.springframework.boot.SpringApplication;\nimport org.springframework.boot.autoconfigure.SpringBootApplication;\nimport org.springframework.cache.annotation.EnableCaching;\nimport org.springframework.cloud.client.discovery.EnableDiscoveryClient;\nimport org.springframework.cloud.netflix.feign.EnableFeignClients;\nimport org.springframework.cloud.netflix.hystrix.EnableHystrix;\nimport org.springframework.context.annotation.Bean;\nimport org.springframework.retry.annotation.EnableRetry;\nimport org.springframework.transaction.annotation.EnableTransactionManagement;\nimport springfox.documentation.swagger2.annotations.EnableSwagger2;\n\nimport javax.sql.DataSource;\nimport java.util.Properties;\n\n\n/**\n * The class Paas cloud opc application.\n *\n * @author paascloud.net@gmail.com\n */\n@EnableRetry\n@EnableCaching\n@EnableHystrix\n@EnableSwagger2\n@EnableFeignClients\n@EnableDiscoveryClient\n@SpringBootApplication\n@EnableTransactionManagement\npublic class PaasCloudOpcApplication {\n\n\t/**\n\t * The entry point of application.\n\t *\n\t * @param args the input arguments\n\t */\n\tpublic static void main(String[] args) {\n\t\tSpringApplication.run(PaasCloudOpcApplication.class, args);\n\t}\n\n\t/**\n\t * Get kaptcha bean default kaptcha.\n\t *\n\t * @return the default kaptcha\n\t */\n\t@Bean(name = \"captchaProducer\")\n\tpublic DefaultKaptcha getKaptchaBean() {\n\t\tDefaultKaptcha defaultKaptcha = new DefaultKaptcha();\n\t\tProperties properties = new Properties();\n\t\tproperties.setProperty(\"kaptcha.border\", \"yes\");\n\t\tproperties.setProperty(\"kaptcha.border.color\", \"105,179,90\");\n\t\tproperties.setProperty(\"kaptcha.textproducer.font.color\", \"blue\");\n\t\tproperties.setProperty(\"kaptcha.image.width\", \"125\");\n\t\tproperties.setProperty(\"kaptcha.image.height\", \"45\");\n\t\tproperties.setProperty(\"kaptcha.session.key\", \"code\");\n\t\tproperties.setProperty(\"kaptcha.textproducer.char.length\", \"4\");\n\t\tproperties.setProperty(\"kaptcha.textproducer.font.names\", \"宋体,楷体,微软雅黑\");\n\t\tConfig config = new Config(properties);\n\t\tdefaultKaptcha.setConfig(config);\n\t\treturn defaultKaptcha;\n\t}\n\n\t@Bean\n\tpublic SpringLiquibase springLiquibase(DataSource dataSource) {\n\n\t\tSpringLiquibase springLiquibase = new SpringLiquibase();\n\n\t\tspringLiquibase.setDataSource(dataSource);\n\t\tspringLiquibase.setChangeLog(\"classpath:/liquibase/index.xml\");\n\n\t\treturn springLiquibase;\n\t}\n\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-opc/src/main/java/com/paascloud/provider/config/AliyunMqConfiguration.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：AliyunMqConfiguration.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.config;\n\nimport com.paascloud.PublicUtil;\nimport com.paascloud.base.constant.AliyunMqTopicConstants;\nimport com.paascloud.base.constant.GlobalConstant;\nimport com.paascloud.config.properties.PaascloudProperties;\nimport com.paascloud.provider.consumer.listener.OptPushMessageListener;\nimport lombok.extern.slf4j.Slf4j;\nimport org.apache.rocketmq.client.consumer.DefaultMQPushConsumer;\nimport org.apache.rocketmq.client.exception.MQClientException;\nimport org.apache.rocketmq.common.consumer.ConsumeFromWhere;\nimport org.springframework.context.annotation.Bean;\nimport org.springframework.context.annotation.Configuration;\nimport org.springframework.core.task.TaskExecutor;\n\nimport javax.annotation.Resource;\n\n/**\n * The class Aliyun mq configuration.\n *\n * @author paascloud.net@gmail.com\n */\n@Slf4j\n@Configuration\npublic class AliyunMqConfiguration {\n\n\t@Resource\n\tprivate PaascloudProperties paascloudProperties;\n\n\t@Resource\n\tprivate OptPushMessageListener optPushConsumer;\n\n\t@Resource\n\tprivate TaskExecutor taskExecutor;\n\n\t/**\n\t * Default mq push consumer default mq push consumer.\n\t *\n\t * @return the default mq push consumer\n\t *\n\t * @throws MQClientException the mq client exception\n\t */\n\t@Bean\n\tpublic DefaultMQPushConsumer defaultMQPushConsumer() throws MQClientException {\n\t\tDefaultMQPushConsumer consumer = new DefaultMQPushConsumer(paascloudProperties.getAliyun().getRocketMq().getConsumerGroup());\n\t\tconsumer.setNamesrvAddr(paascloudProperties.getAliyun().getRocketMq().getNamesrvAddr());\n\t\tconsumer.setConsumeFromWhere(ConsumeFromWhere.CONSUME_FROM_LAST_OFFSET);\n\n\t\tString[] strArray = AliyunMqTopicConstants.ConsumerTopics.OPT.split(GlobalConstant.Symbol.COMMA);\n\t\tfor (String aStrArray : strArray) {\n\t\t\tString[] topicArray = aStrArray.split(GlobalConstant.Symbol.AT);\n\t\t\tString topic = topicArray[0];\n\t\t\tString tags = topicArray[1];\n\t\t\tif (PublicUtil.isEmpty(tags)) {\n\t\t\t\ttags = \"*\";\n\t\t\t}\n\t\t\tconsumer.subscribe(topic, tags);\n\t\t\tlog.info(\"RocketMq OpcPushConsumer topic = {}, tags={}\", topic, tags);\n\t\t}\n\n\t\tconsumer.registerMessageListener(optPushConsumer);\n\t\tconsumer.setConsumeThreadMax(2);\n\t\tconsumer.setConsumeThreadMin(2);\n\n\t\ttaskExecutor.execute(() -> {\n\t\t\ttry {\n\t\t\t\tThread.sleep(5000);\n\t\t\t\tconsumer.start();\n\t\t\t\tlog.info(\"RocketMq OpcPushConsumer OK.\");\n\t\t\t} catch (InterruptedException | MQClientException e) {\n\t\t\t\tlog.error(\"RocketMq OpcPushConsumer, 出现异常={}\", e.getMessage(), e);\n\t\t\t}\n\t\t});\n\t\treturn consumer;\n\t}\n\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-opc/src/main/java/com/paascloud/provider/config/AliyunSmsConfiguration.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：AliyunSmsConfiguration.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.config;\n\nimport com.aliyuncs.DefaultAcsClient;\nimport com.aliyuncs.IAcsClient;\nimport com.aliyuncs.exceptions.ClientException;\nimport com.aliyuncs.profile.DefaultProfile;\nimport com.aliyuncs.profile.IClientProfile;\nimport com.paascloud.config.properties.PaascloudProperties;\nimport lombok.extern.slf4j.Slf4j;\nimport org.springframework.context.annotation.Bean;\nimport org.springframework.context.annotation.Configuration;\n\nimport javax.annotation.Resource;\n\n/**\n * The class Aliyun sms configuration.\n *\n * @author paascloud.net@gmail.com\n */\n@Slf4j\n@Configuration\npublic class AliyunSmsConfiguration {\n\n\t@Resource\n\tprivate PaascloudProperties paascloudProperties;\n\n\t/**\n\t * Acs client acs client.\n\t *\n\t * @return the acs client\n\t *\n\t * @throws ClientException the client exception\n\t */\n\t@Bean\n\tpublic IAcsClient acsClient() throws ClientException {\n\t\tlog.info(\"SMS Bean IAcsClient Start\");\n\t\tIClientProfile profile = DefaultProfile.getProfile(paascloudProperties.getAliyun().getSms().getRegionId(), paascloudProperties.getAliyun().getKey().getAccessKeyId(), paascloudProperties.getAliyun().getKey().getAccessKeySecret());\n\t\tDefaultProfile.addEndpoint(paascloudProperties.getAliyun().getSms().getEndpointName(), paascloudProperties.getAliyun().getSms().getRegionId(), paascloudProperties.getAliyun().getSms().getProduct(), paascloudProperties.getAliyun().getSms().getDomain());\n\t\tDefaultAcsClient defaultAcsClient = new DefaultAcsClient(profile);\n\t\tlog.info(\"加载SMS Bean IAcsClient OK\");\n\t\treturn defaultAcsClient;\n\t}\n\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-opc/src/main/java/com/paascloud/provider/config/OpcWebMvcConfig.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：OpcWebMvcConfig.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.config;\n\nimport com.paascloud.core.config.PcObjectMapper;\nimport com.paascloud.core.config.SwaggerConfiguration;\nimport com.paascloud.core.interceptor.TokenInterceptor;\nimport org.springframework.context.annotation.Configuration;\nimport org.springframework.context.annotation.Import;\nimport org.springframework.http.converter.HttpMessageConverter;\nimport org.springframework.web.servlet.config.annotation.EnableWebMvc;\nimport org.springframework.web.servlet.config.annotation.InterceptorRegistry;\nimport org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;\nimport org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;\n\nimport javax.annotation.Resource;\nimport java.util.List;\n\n\n/**\n * The class Mdc web mvc config.\n *\n * @author paascloud.net @gmail.com\n */\n@Configuration\n@EnableWebMvc\n@Import(SwaggerConfiguration.class)\npublic class OpcWebMvcConfig extends WebMvcConfigurerAdapter {\n\n\t@Resource\n\tprivate TokenInterceptor vueViewInterceptor;\n\n\t@Override\n\tpublic void addResourceHandlers(ResourceHandlerRegistry registry) {\n\t\tregistry.addResourceHandler(\"/**\")\n\t\t\t\t.addResourceLocations(\"classpath:/META-INF/resources/\", \"classpath:/resources/\", \"classpath:/static/\");\n\t}\n\n\t/**\n\t * Add interceptors.\n\t *\n\t * @param registry the registry\n\t */\n\t@Override\n\tpublic void addInterceptors(InterceptorRegistry registry) {\n\t\tsuper.addInterceptors(registry);\n\t\tregistry.addInterceptor(vueViewInterceptor)\n\t\t\t\t.addPathPatterns(\"/**\")\n\t\t\t\t.excludePathPatterns(\"/swagger-resources/**\", \"*.js\", \"/**/*.js\", \"*.css\", \"/**/*.css\", \"*.html\", \"/**/*.html\");\n\t}\n\n\t@Override\n\tpublic void configureMessageConverters(List<HttpMessageConverter<?>> converters) {\n\t\tPcObjectMapper.buidMvcMessageConverter(converters);\n\t}\n\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-opc/src/main/java/com/paascloud/provider/config/QiniuOssConfiguration.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：QiniuOssConfiguration.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.config;\n\nimport com.paascloud.config.properties.PaascloudProperties;\nimport com.qiniu.common.Zone;\nimport com.qiniu.storage.BucketManager;\nimport com.qiniu.storage.UploadManager;\nimport com.qiniu.util.Auth;\nimport lombok.extern.slf4j.Slf4j;\nimport org.springframework.context.annotation.Bean;\nimport org.springframework.context.annotation.Configuration;\n\nimport javax.annotation.Resource;\n\n/**\n * The class Qiniu oss configuration.\n *\n * @author paascloud.net@gmail.com\n */\n@Slf4j\n@Configuration\npublic class QiniuOssConfiguration {\n\n\t@Resource\n\tprivate PaascloudProperties paascloudProperties;\n\n\t/**\n\t * Auth auth.\n\t *\n\t * @return the auth\n\t */\n\t@Bean\n\tpublic Auth auth() {\n\t\tAuth auth = Auth.create(paascloudProperties.getQiniu().getKey().getAccessKey(), paascloudProperties.getQiniu().getKey().getSecretKey());\n\t\tlog.info(\"Create Auth OK.\");\n\t\treturn auth;\n\t}\n\n\t/**\n\t * Upload manager upload manager.\n\t *\n\t * @return the upload manager\n\t */\n\t@Bean\n\tpublic UploadManager uploadManager() {\n\t\tZone zone = Zone.autoZone();\n\t\t//创建上传对象\n\t\tUploadManager uploadManager = new UploadManager(new com.qiniu.storage.Configuration(zone));\n\t\tlog.info(\"Create UploadManager OK.\");\n\t\treturn uploadManager;\n\t}\n\n\t/**\n\t * Bucket manager bucket manager.\n\t *\n\t * @return the bucket manager\n\t */\n\t@Bean\n\tpublic BucketManager bucketManager() {\n\t\tZone zone = Zone.autoZone();\n\t\t//创建上传对象\n\t\tBucketManager uploadManager = new BucketManager(auth(), new com.qiniu.storage.Configuration(zone));\n\t\tlog.info(\"Create BucketManager OK.\");\n\t\treturn uploadManager;\n\t}\n\n\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-opc/src/main/java/com/paascloud/provider/config/ResourceServerConfig.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：ResourceServerConfig.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.config;\n\nimport org.springframework.context.annotation.Configuration;\nimport org.springframework.security.config.annotation.web.builders.HttpSecurity;\nimport org.springframework.security.oauth2.config.annotation.web.configuration.EnableResourceServer;\nimport org.springframework.security.oauth2.config.annotation.web.configuration.ResourceServerConfigurerAdapter;\n\nimport javax.servlet.http.HttpServletResponse;\n\n/**\n * The class Resource server config.\n *\n * @author paascloud.net @gmail.com\n */\n@Configuration\n@EnableResourceServer\npublic class ResourceServerConfig extends ResourceServerConfigurerAdapter {\n\t@Override\n\tpublic void configure(HttpSecurity http) throws Exception {\n\t\thttp\n\t\t\t\t.headers().frameOptions().disable()\n\t\t\t\t.and()\n\t\t\t\t.csrf().disable()\n\t\t\t\t.exceptionHandling()\n\t\t\t\t.authenticationEntryPoint((request, response, authException) -> response.sendError(HttpServletResponse.SC_UNAUTHORIZED))\n\t\t\t\t.and()\n\t\t\t\t.authorizeRequests().antMatchers(\"/pay/alipayCallback\", \"/druid/**\", \"/swagger-ui.html\", \"/swagger-resources/**\", \"/v2/api-docs\", \"/api/applications\").permitAll()\n\t\t\t\t.anyRequest().authenticated();\n\t}\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-opc/src/main/java/com/paascloud/provider/consumer/MdcTopicConsumer.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：MdcTopicConsumer.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.consumer;\n\nimport com.paascloud.JacksonUtil;\nimport com.paascloud.base.constant.AliyunMqTopicConstants;\nimport com.paascloud.core.mq.MqMessage;\nimport com.paascloud.provider.model.dto.UpdateAttachmentDto;\nimport com.paascloud.provider.service.OpcAttachmentService;\nimport com.qiniu.common.QiniuException;\nimport lombok.extern.slf4j.Slf4j;\nimport org.apache.commons.lang3.StringUtils;\nimport org.springframework.stereotype.Service;\nimport org.springframework.transaction.annotation.Transactional;\n\nimport javax.annotation.Resource;\nimport java.util.List;\n\n/**\n * The class Opt send sms topic consumer.\n *\n * @author paascloud.net@gmail.com\n */\n@Slf4j\n@Service\npublic class MdcTopicConsumer {\n\n\t@Resource\n\tprivate OpcAttachmentService opcAttachmentService;\n\n\t/**\n\t * Handler send sms topic.\n\t *\n\t * @param body      the body\n\t * @param topicName the topic name\n\t * @param tags      the tags\n\t * @param keys      the keys\n\t */\n\t@Transactional(rollbackFor = Exception.class)\n\tpublic void handlerSendSmsTopic(String body, String topicName, String tags, String keys) throws QiniuException {\n\t\tMqMessage.checkMessage(body, keys, topicName);\n\n\t\tif (StringUtils.equals(tags, AliyunMqTopicConstants.MqTagEnum.DELETE_ATTACHMENT.getTag())) {\n\t\t\tList<Long> idList = opcAttachmentService.queryAttachmentByRefNo(body);\n\t\t\tfor (final Long id : idList) {\n\t\t\t\topcAttachmentService.deleteFile(id);\n\t\t\t}\n\t\t} else {\n\t\t\tUpdateAttachmentDto attachmentDto;\n\t\t\ttry {\n\t\t\t\tattachmentDto = JacksonUtil.parseJson(body, UpdateAttachmentDto.class);\n\t\t\t} catch (Exception e) {\n\t\t\t\tlog.error(\"发送短信MQ出现异常={}\", e.getMessage(), e);\n\t\t\t\tthrow new IllegalArgumentException(\"JSON转换异常\", e);\n\t\t\t}\n\t\t\topcAttachmentService.updateAttachment(attachmentDto);\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-opc/src/main/java/com/paascloud/provider/consumer/OptSendEmailTopicConsumer.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：OptSendEmailTopicConsumer.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.consumer;\n\nimport com.paascloud.JacksonUtil;\nimport com.paascloud.core.mq.MqMessage;\nimport com.paascloud.provider.model.dto.PcSendEmailRequest;\nimport com.paascloud.provider.service.OptSendMailService;\nimport lombok.extern.slf4j.Slf4j;\nimport org.springframework.stereotype.Service;\n\nimport javax.annotation.Resource;\nimport java.util.Set;\n\n/**\n * The class Opt send email topic consumer.\n *\n * @author paascloud.net@gmail.com\n */\n@Slf4j\n@Service\npublic class OptSendEmailTopicConsumer {\n\n\t@Resource\n\tprivate OptSendMailService optSendMailService;\n\n\t/**\n\t * Handler send email topic.\n\t *\n\t * @param body      the body\n\t * @param topicName the topic name\n\t * @param tags      the tags\n\t * @param keys      the keys\n\t */\n\tpublic void handlerSendEmailTopic(String body, String topicName, String tags, String keys) {\n\t\tMqMessage.checkMessage(body, keys, topicName);\n\t\tPcSendEmailRequest request;\n\t\ttry {\n\t\t\trequest = JacksonUtil.parseJson(body, PcSendEmailRequest.class);\n\t\t} catch (Exception e) {\n\t\t\tlog.error(\"发送短信MQ出现异常={}\", e.getMessage(), e);\n\t\t\tthrow new IllegalArgumentException(\"处理MQ信息,JSON转换异常\");\n\t\t}\n\t\tString subject = request.getSubject();\n\t\tString text = request.getText();\n\t\tSet<String> to = request.getTo();\n\t\toptSendMailService.sendTemplateMail(subject, text, to);\n\t}\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-opc/src/main/java/com/paascloud/provider/consumer/OptSendSmsTopicConsumer.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：OptSendSmsTopicConsumer.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.consumer;\n\nimport com.aliyuncs.dysmsapi.model.v20170525.SendSmsRequest;\nimport com.paascloud.JacksonUtil;\nimport com.paascloud.core.mq.MqMessage;\nimport com.paascloud.provider.service.OptSmsService;\nimport lombok.extern.slf4j.Slf4j;\nimport org.apache.commons.lang3.StringUtils;\nimport org.springframework.stereotype.Service;\n\nimport javax.annotation.Resource;\n\n/**\n * The class Opt send sms topic consumer.\n *\n * @author paascloud.net@gmail.com\n */\n@Slf4j\n@Service\npublic class OptSendSmsTopicConsumer {\n\n\t@Resource\n\tprivate OptSmsService smsService;\n\n\t/**\n\t * Handler send sms topic.\n\t *\n\t * @param body      the body\n\t * @param topicName the topic name\n\t * @param tags      the tags\n\t * @param keys      the keys\n\t */\n\tpublic void handlerSendSmsTopic(String body, String topicName, String tags, String keys) {\n\t\tMqMessage.checkMessage(body, keys, topicName);\n\t\tSendSmsRequest sendSmsRequest;\n\t\ttry {\n\t\t\tsendSmsRequest = JacksonUtil.parseJson(body, SendSmsRequest.class);\n\t\t} catch (Exception e) {\n\t\t\tlog.error(\"发送短信MQ出现异常={}\", e.getMessage(), e);\n\t\t\tthrow new IllegalArgumentException(\"JSON转换异常\", e);\n\t\t}\n\t\tString ipAddr = sendSmsRequest.getOutId();\n\t\tif (StringUtils.isEmpty(ipAddr)) {\n\t\t\tthrow new IllegalArgumentException(\"outId不能为空\");\n\t\t}\n\t\tsmsService.sendSms(sendSmsRequest);\n\t}\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-opc/src/main/java/com/paascloud/provider/consumer/listener/OptPushMessageListener.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：OptPushMessageListener.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.consumer.listener;\n\nimport com.paascloud.PublicUtil;\nimport com.paascloud.base.constant.AliyunMqTopicConstants;\nimport com.paascloud.core.mq.MqMessage;\nimport com.paascloud.provider.annotation.MqConsumerStore;\nimport com.paascloud.provider.consumer.MdcTopicConsumer;\nimport com.paascloud.provider.consumer.OptSendEmailTopicConsumer;\nimport com.paascloud.provider.consumer.OptSendSmsTopicConsumer;\nimport com.paascloud.provider.service.MqMessageService;\nimport lombok.extern.slf4j.Slf4j;\nimport org.apache.rocketmq.client.consumer.listener.ConsumeConcurrentlyContext;\nimport org.apache.rocketmq.client.consumer.listener.ConsumeConcurrentlyStatus;\nimport org.apache.rocketmq.client.consumer.listener.MessageListenerConcurrently;\nimport org.apache.rocketmq.common.message.MessageExt;\nimport org.springframework.data.redis.core.StringRedisTemplate;\nimport org.springframework.data.redis.core.ValueOperations;\nimport org.springframework.stereotype.Component;\n\nimport javax.annotation.Resource;\nimport java.util.List;\nimport java.util.concurrent.TimeUnit;\n\n/**\n * The class Opt push message listener.\n *\n * @author paascloud.net@gmail.com\n */\n@Slf4j\n@Component\npublic class OptPushMessageListener implements MessageListenerConcurrently {\n\n\t@Resource\n\tprivate OptSendSmsTopicConsumer optSendSmsTopicService;\n\t@Resource\n\tprivate OptSendEmailTopicConsumer optSendEmailTopicService;\n\t@Resource\n\tprivate MdcTopicConsumer mdcTopicConsumer;\n\n\t@Resource\n\tprivate MqMessageService mqMessageService;\n\t@Resource\n\tprivate StringRedisTemplate srt;\n\n\t/**\n\t * Consume message consume concurrently status.\n\t *\n\t * @param messageExtList             the message ext list\n\t * @param consumeConcurrentlyContext the consume concurrently context\n\t *\n\t * @return the consume concurrently status\n\t */\n\t@Override\n\t@MqConsumerStore\n\tpublic ConsumeConcurrentlyStatus consumeMessage(List<MessageExt> messageExtList, ConsumeConcurrentlyContext consumeConcurrentlyContext) {\n\t\tMessageExt msg = messageExtList.get(0);\n\t\tString body = new String(msg.getBody());\n\t\tString topicName = msg.getTopic();\n\t\tString tags = msg.getTags();\n\t\tString keys = msg.getKeys();\n\t\tlog.info(\"MQ消费Topic={},tag={},key={}\", topicName, tags, keys);\n\t\tValueOperations<String, String> ops = srt.opsForValue();\n\t\t// 控制幂等性使用的key\n\t\ttry {\n\t\t\tMqMessage.checkMessage(body, topicName, tags, keys);\n\t\t\tString mqKV = null;\n\t\t\tif (srt.hasKey(keys)) {\n\t\t\t\tmqKV = ops.get(keys);\n\t\t\t}\n\t\t\tif (PublicUtil.isNotEmpty(mqKV)) {\n\t\t\t\tlog.error(\"MQ消费Topic={},tag={},key={}, 重复消费\", topicName, tags, keys);\n\t\t\t\treturn ConsumeConcurrentlyStatus.CONSUME_SUCCESS;\n\t\t\t}\n\t\t\tif (AliyunMqTopicConstants.MqTopicEnum.SEND_SMS_TOPIC.getTopic().equals(topicName)) {\n\t\t\t\toptSendSmsTopicService.handlerSendSmsTopic(body, topicName, tags, keys);\n\t\t\t}\n\t\t\tif (AliyunMqTopicConstants.MqTopicEnum.SEND_EMAIL_TOPIC.getTopic().equals(topicName)) {\n\t\t\t\toptSendEmailTopicService.handlerSendEmailTopic(body, topicName, tags, keys);\n\t\t\t}\n\t\t\tif (AliyunMqTopicConstants.MqTopicEnum.TPC_TOPIC.getTopic().equals(topicName)) {\n\t\t\t\tmqMessageService.deleteMessageTopic(body, tags);\n\t\t\t}\n\t\t\tif (AliyunMqTopicConstants.MqTopicEnum.MDC_TOPIC.getTopic().equals(topicName)) {\n\t\t\t\tmdcTopicConsumer.handlerSendSmsTopic(body, topicName, tags, keys);\n\t\t\t} else {\n\t\t\t\tlog.info(\"OPC订单信息消 topicName={} 不存在\", topicName);\n\t\t\t}\n\t\t} catch (IllegalArgumentException ex) {\n\t\t\tlog.error(\"校验MQ message 失败 ex={}\", ex.getMessage(), ex);\n\t\t} catch (Exception e) {\n\t\t\tlog.error(\"处理MQ message 失败 topicName={}, keys={}, ex={}\", topicName, keys, e.getMessage(), e);\n\t\t\treturn ConsumeConcurrentlyStatus.RECONSUME_LATER;\n\t\t}\n\t\tops.set(keys, keys, 10, TimeUnit.DAYS);\n\t\treturn ConsumeConcurrentlyStatus.CONSUME_SUCCESS;\n\t}\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-opc/src/main/java/com/paascloud/provider/mapper/OpcSmsSettingMapper.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：OpcSmsSettingMapper.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.mapper;\n\nimport com.paascloud.core.mybatis.MyMapper;\nimport com.paascloud.provider.model.domain.OpcSmsSetting;\nimport org.apache.ibatis.annotations.Mapper;\nimport org.springframework.stereotype.Component;\n\n/**\n * The interface Opc sms setting mapper.\n *\n * @author paascloud.net@gmail.com\n */\n@Mapper\n@Component\npublic interface OpcSmsSettingMapper extends MyMapper<OpcSmsSetting> {\n}"
  },
  {
    "path": "paascloud-provider/paascloud-provider-opc/src/main/java/com/paascloud/provider/mapper/OptAttachmentMapper.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：OptAttachmentMapper.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.mapper;\n\nimport com.paascloud.core.mybatis.MyMapper;\nimport com.paascloud.provider.model.domain.OptAttachment;\nimport com.paascloud.provider.model.dto.attachment.OptAttachmentReqDto;\nimport com.paascloud.provider.model.dto.attachment.OptAttachmentRespDto;\nimport org.apache.ibatis.annotations.Mapper;\nimport org.apache.ibatis.annotations.Param;\nimport org.springframework.stereotype.Component;\n\nimport java.util.List;\n\n/**\n * The interface Opt attachment mapper.\n *\n * @author paascloud.net @gmail.com\n */\n@Mapper\n@Component\npublic interface OptAttachmentMapper extends MyMapper<OptAttachment> {\n\t/**\n\t * Query attachment list.\n\t *\n\t * @param optAttachmentReqDto the opt attachment req dto\n\t *\n\t * @return the list\n\t */\n\tList<OptAttachmentRespDto> queryAttachment(OptAttachmentReqDto optAttachmentReqDto);\n\n\t/**\n\t * Query attachment by ref no list.\n\t *\n\t * @param refNo the ref no\n\t *\n\t * @return the list\n\t */\n\tList<Long> queryAttachmentByRefNo(@Param(\"refNo\") String refNo);\n\n\t/**\n\t * Delete by id list int.\n\t *\n\t * @param attachmentIdList the attachment id list\n\t *\n\t * @return the int\n\t */\n\tint deleteByIdList(@Param(\"idList\") List<Long> attachmentIdList);\n\n\t/**\n\t * List expire file list.\n\t *\n\t * @return the list\n\t */\n\tList<OptAttachment> listExpireFile();\n}"
  },
  {
    "path": "paascloud-provider/paascloud-provider-opc/src/main/java/com/paascloud/provider/model/domain/OpcSmsSetting.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：OpcSmsSetting.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.model.domain;\n\nimport com.paascloud.core.mybatis.BaseEntity;\nimport lombok.Data;\nimport lombok.EqualsAndHashCode;\nimport org.apache.ibatis.type.Alias;\n\nimport javax.persistence.Column;\nimport javax.persistence.Table;\n\n/**\n * The class Opc sms setting.\n *\n * @author paascloud.net@gmail.com\n */\n@EqualsAndHashCode(callSuper = true)\n@Data\n@Table(name = \"pc_opc_sms_setting\")\n@Alias(value = \"opcSmsSetting\")\npublic class OpcSmsSetting extends BaseEntity {\n\n\tprivate static final long serialVersionUID = -1811960778993500439L;\n\t/**\n\t * 可再次发送时间（毫秒）\n\t */\n\t@Column(name = \"again_send_time\")\n\tprivate Integer againSendTime;\n\n\t/**\n\t * 失效时间（分钟）\n\t */\n\t@Column(name = \"invalid_time\")\n\tprivate Integer invalidTime;\n\n\t/**\n\t * 短信类型\n\t */\n\tprivate String type;\n\n\t/**\n\t * 类型描述\n\t */\n\t@Column(name = \"type_desc\")\n\tprivate String typeDesc;\n\n\t/**\n\t * 模板code\n\t */\n\t@Column(name = \"templet_code\")\n\tprivate String templetCode;\n\n\t/**\n\t * 模板内容\n\t */\n\t@Column(name = \"templet_content\")\n\tprivate String templetContent;\n\n\t/**\n\t * 一天中可发送的最大数量\n\t */\n\t@Column(name = \"send_max_num\")\n\tprivate Integer sendMaxNum;\n\n\t/**\n\t * 一个IP一天中可发送的最大数量\n\t */\n\t@Column(name = \"ip_send_max_num\")\n\tprivate Integer ipSendMaxNum;\n\n\t/**\n\t * 备注\n\t */\n\tprivate String remark;\n\n\t/**\n\t * 删除标识(1-已删除；0-未删除)\n\t */\n\tprivate Integer yn;\n}"
  },
  {
    "path": "paascloud-provider/paascloud-provider-opc/src/main/java/com/paascloud/provider/model/domain/OptAttachment.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：OptAttachment.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.model.domain;\n\nimport com.paascloud.core.mybatis.BaseEntity;\nimport lombok.Data;\nimport lombok.EqualsAndHashCode;\n\nimport javax.persistence.Column;\nimport javax.persistence.Table;\n\n/**\n * The class Opt attachment.\n *\n * @author paascloud.net@gmail.com\n */\n@EqualsAndHashCode(callSuper = true)\n@Data\n@Table(name = \"pc_opt_attachment\")\npublic class OptAttachment extends BaseEntity {\n\n\tprivate static final long serialVersionUID = -2419047791219240612L;\n\t/**\n\t * 中心名称(英文简写)\n\t */\n\t@Column(name = \"center_name\")\n\tprivate String centerName;\n\n\t/**\n\t * 文件服务器根目录\n\t */\n\t@Column(name = \"bucket_name\")\n\tprivate String bucketName;\n\n\t/**\n\t * 上传附件的相关业务流水号\n\t */\n\t@Column(name = \"ref_no\")\n\tprivate String refNo;\n\n\t/**\n\t * 附件名称\n\t */\n\tprivate String name;\n\n\t/**\n\t * 附件存储相对路径\n\t */\n\tprivate String path;\n\n\t/**\n\t * 附件类型\n\t */\n\tprivate String type;\n\n\t/**\n\t * 附件格式\n\t */\n\tprivate String format;\n\n\t/**\n\t * 备注\n\t */\n\tprivate String description;\n}"
  },
  {
    "path": "paascloud-provider/paascloud-provider-opc/src/main/java/com/paascloud/provider/model/dto/attachment/OptAttachmentReqDto.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：OptAttachmentReqDto.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.model.dto.attachment;\n\nimport io.swagger.annotations.ApiModel;\nimport io.swagger.annotations.ApiModelProperty;\nimport lombok.Data;\n\nimport java.io.Serializable;\n\n/**\n * The class Opt attachment req dto.\n *\n * @author paascloud.net@gmail.com\n */\n@Data\n@ApiModel(value = \"OptAttachmentReqDto\")\npublic class OptAttachmentReqDto implements Serializable {\n\n\tprivate static final long serialVersionUID = -1727131719075160349L;\n\t/**\n\t * 主键\n\t */\n\t@ApiModelProperty(value = \"主键\")\n\tprivate Long id;\n\n\t/**\n\t * 附件流水号\n\t */\n\t@ApiModelProperty(value = \"附件流水号\")\n\tprivate String serialNo;\n\n\t/**\n\t * 上传附件的相关业务流水号\n\t */\n\t@ApiModelProperty(value = \"上传附件的相关业务流水号\")\n\tprivate String refNo;\n\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-opc/src/main/java/com/paascloud/provider/model/dto/mail/MailEntity.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：MailEntity.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.model.dto.mail;\n\nimport com.google.common.base.Preconditions;\nimport com.google.common.collect.Sets;\nimport com.paascloud.PubUtils;\nimport com.paascloud.PublicUtil;\nimport lombok.Data;\nimport lombok.extern.slf4j.Slf4j;\nimport org.springframework.mail.SimpleMailMessage;\n\nimport java.util.Date;\nimport java.util.Set;\n\n/**\n * The class Mail entity.\n *\n * @author paascloud.net@gmail.com\n */\n@Slf4j\n@Data\npublic class MailEntity {\n\t/**\n\t * 获取或设置电子邮件的回复地址。\n\t */\n\tprivate String replyTo;\n\t/**\n\t * 获取包含此电子邮件的收件人的地址集合。\n\t */\n\tprivate Set<String> to;\n\t/**\n\t * 获取包含此电子邮件的抄送 (CC) 收件人的地址集合。\n\t */\n\tprivate Set<String> cc;\n\t/**\n\t * 获取包含此电子邮件的密件抄送 (BCC) 收件人的地址集合。\n\t */\n\tprivate Set<String> bcc;\n\t/**\n\t * 发送时间\n\t */\n\tprivate Date sentDate;\n\t/**\n\t * 获取或设置此电子邮件的主题行。\n\t */\n\tprivate String subject;\n\t/**\n\t * 内容\n\t */\n\tprivate String text;\n\n\t/**\n\t * Instantiates a new Mail entity.\n\t *\n\t * @param subject the subject\n\t * @param text    the text\n\t * @param to      the to\n\t */\n\tpublic MailEntity(String subject, String text, Set<String> to) {\n\t\tthis.subject = subject;\n\t\tthis.text = text;\n\t\tthis.to = to;\n\t\tthis.sentDate = new Date();\n\t}\n\n\t/**\n\t * Instantiates a new Mail entity.\n\t *\n\t * @param subject the subject\n\t * @param text    the text\n\t * @param to      the to\n\t * @param cc      the cc\n\t */\n\tpublic MailEntity(String subject, String text, Set<String> to, Set<String> cc) {\n\t\tthis.subject = subject;\n\t\tthis.text = text;\n\t\tthis.to = to;\n\t\tthis.cc = cc;\n\t\tthis.sentDate = new Date();\n\t}\n\n\t/**\n\t * Create simple mail message simple mail message.\n\t *\n\t * @param subject the subject\n\t * @param text    the text\n\t * @param to      the to\n\t *\n\t * @return the simple mail message\n\t */\n\tpublic static SimpleMailMessage createSimpleMailMessage(String subject, String text, Set<String> to) {\n\t\tlog.info(\"参数异常, 邮件信息不完整 subject={}, text={}, to={}\", subject, text, to);\n\t\tPreconditions.checkArgument(!PubUtils.isNull(subject, text, to), \"参数异常, 邮件信息不完整\");\n\n\t\tString[] toArray = setToArray(to);\n\t\tSimpleMailMessage simpleMailMessage = new SimpleMailMessage();\n\t\tsimpleMailMessage.setSubject(subject);\n\t\tsimpleMailMessage.setText(text);\n\t\tsimpleMailMessage.setTo(toArray);\n\t\treturn simpleMailMessage;\n\t}\n\n\tprivate static String[] setToArray(Set<String> to) {\n\t\tSet<String> toSet = Sets.newHashSet();\n\t\tfor (String toStr : to) {\n\t\t\ttoStr = toStr.trim();\n\t\t\tif (PubUtils.isEmail(toStr)) {\n\t\t\t\ttoSet.add(toStr);\n\t\t\t}\n\t\t}\n\t\tif (PublicUtil.isEmpty(toSet)) {\n\t\t\treturn null;\n\t\t}\n\t\treturn toSet.toArray(new String[toSet.size()]);\n\t}\n\n\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-opc/src/main/java/com/paascloud/provider/service/OpcAttachmentService.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：OpcAttachmentService.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.service;\n\nimport com.paascloud.base.dto.LoginAuthDto;\nimport com.paascloud.core.support.IService;\nimport com.paascloud.provider.model.domain.OptAttachment;\nimport com.paascloud.provider.model.dto.UpdateAttachmentDto;\nimport com.paascloud.provider.model.dto.attachment.OptAttachmentRespDto;\nimport com.paascloud.provider.model.dto.oss.*;\nimport com.qiniu.common.QiniuException;\nimport org.springframework.web.multipart.MultipartHttpServletRequest;\n\nimport java.io.IOException;\nimport java.util.List;\n\n/**\n * The interface Opc attachment service.\n *\n * @author paascloud.net @gmail.com\n */\npublic interface OpcAttachmentService extends IService<OptAttachment> {\n\t/**\n\t * Upload file string.\n\t *\n\t * @param multipartRequest    the multipart request\n\t * @param optUploadFileReqDto the opt upload file req dto\n\t * @param loginAuthDto        the login auth dto\n\t * @param storeDbFlag         the store db flag\n\t *\n\t * @return the string\n\t */\n\tList<OptUploadFileRespDto> uploadFile(MultipartHttpServletRequest multipartRequest, OptUploadFileReqDto optUploadFileReqDto, LoginAuthDto loginAuthDto, boolean storeDbFlag);\n\n\t/**\n\t * 根据ID查询附件信息.\n\t *\n\t * @param id the id\n\t *\n\t * @return the opt attachment resp dto\n\t */\n\tOptAttachmentRespDto queryAttachmentById(Long id);\n\n\t/**\n\t * 根据关联单号查询附件信息.\n\t *\n\t * @param refNo the ref no\n\t *\n\t * @return the list\n\t */\n\tList<OptAttachmentRespDto> queryAttachmentListByRefNo(String refNo);\n\n\t/**\n\t * Query attachment by ref no list.\n\t *\n\t * @param refNo the ref no\n\t *\n\t * @return the list\n\t */\n\tList<Long> queryAttachmentByRefNo(String refNo);\n\n\t/**\n\t * Delete file int.\n\t *\n\t * @param fileName     the file name\n\t * @param bucketName   the bucket name\n\t * @param attachmentId the attachment id\n\t *\n\t * @return the int\n\t *\n\t * @throws QiniuException the qiniu exception\n\t */\n\tint deleteFile(String fileName, String bucketName, Long attachmentId) throws QiniuException;\n\n\t/**\n\t * Delete file int.\n\t *\n\t * @param attachmentId the attachment id\n\t *\n\t * @return the int\n\t *\n\t * @throws QiniuException the qiniu exception\n\t */\n\tint deleteFile(Long attachmentId) throws QiniuException;\n\n\t/**\n\t * Save attachment.\n\t *\n\t * @param optAttachment the opt attachment\n\t * @param loginAuthDto  the login auth dto\n\t */\n\tvoid saveAttachment(OptAttachment optAttachment, LoginAuthDto loginAuthDto);\n\n\t/**\n\t * RPC上传附件信息.\n\t *\n\t * @param optUploadFileReqDto the opt upload file req dto\n\t *\n\t * @return the opt upload file resp dto\n\t *\n\t * @throws IOException the io exception\n\t */\n\tOptUploadFileRespDto rpcUploadFile(OptUploadFileReqDto optUploadFileReqDto) throws IOException;\n\n\t/**\n\t * 获取附件完整路径.\n\t *\n\t * @param optGetUrlRequest the opt get url request\n\t *\n\t * @return the string\n\t */\n\tString rpcGetFileUrl(OptGetUrlRequest optGetUrlRequest);\n\n\t/**\n\t * Gets by id.\n\t *\n\t * @param attachmentId the attachment id\n\t *\n\t * @return the by id\n\t */\n\tOptAttachment getById(Long attachmentId);\n\n\t/**\n\t * Upload file opt upload file resp dto.\n\t *\n\t * @param uploadBytes  the upload bytes\n\t * @param fileName     the file name\n\t * @param fileType     the file type\n\t * @param filePath     the file path\n\t * @param bucketName   the bucket name\n\t * @param loginAuthDto the login auth dto\n\t *\n\t * @return the opt upload file resp dto\n\t *\n\t * @throws IOException the io exception\n\t */\n\tOptUploadFileRespDto uploadFile(byte[] uploadBytes, String fileName, String fileType, String filePath, String bucketName, LoginAuthDto loginAuthDto) throws IOException;\n\n\t/**\n\t * 更新附件.\n\t *\n\t * @param attachmentDto the attachment dto\n\t *\n\t * @throws QiniuException the qiniu exception\n\t */\n\tvoid updateAttachment(UpdateAttachmentDto attachmentDto) throws QiniuException;\n\n\t/**\n\t * List file url list.\n\t *\n\t * @param urlRequest the url request\n\t *\n\t * @return the list\n\t */\n\tList<ElementImgUrlDto> listFileUrl(OptBatchGetUrlRequest urlRequest);\n\n\t/**\n\t * List by ref no list.\n\t *\n\t * @param refNo the ref no\n\t *\n\t * @return the list\n\t */\n\tList<OptAttachment> listByRefNo(final String refNo);\n\n\t/**\n\t * 查询已过期的文件.\n\t *\n\t * @return the list\n\t */\n\tList<OptAttachment> listExpireFile();\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-opc/src/main/java/com/paascloud/provider/service/OpcOssService.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：OpcOssService.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.service;\n\nimport com.paascloud.provider.model.dto.oss.OptUploadFileRespDto;\nimport com.qiniu.common.QiniuException;\n\nimport java.io.IOException;\nimport java.util.Set;\n\n/**\n * The interface Opc oss service.\n *\n * @author paascloud.net@gmail.com\n */\npublic interface OpcOssService {\n\n\t/**\n\t * 删除文件\n\t *\n\t * @param fileName   文件路径 + 文件名\n\t * @param bucketName oss对象名称\n\t *\n\t * @throws QiniuException the qiniu exception\n\t */\n\tvoid deleteFile(String fileName, String bucketName) throws QiniuException;\n\n\t/**\n\t * Batch delete file set.\n\t *\n\t * @param fileNameList the file name list\n\t * @param bucketName   the bucket name\n\t *\n\t * @return the set\n\t *\n\t * @throws QiniuException the qiniu exception\n\t */\n\tSet<String> batchDeleteFile(String[] fileNameList, String bucketName) throws QiniuException;\n\n\t/**\n\t * 获取查看文件的Url\n\t *\n\t * @param domainOfBucket the domain of bucket\n\t * @param fileName       文件路径 + 文件名\n\t * @param expires        失效时间\n\t *\n\t * @return the file url\n\t */\n\tString getFileUrl(String domainOfBucket, String fileName, Long expires);\n\n\t/**\n\t * Gets file url.\n\t *\n\t * @param domainOfBucket the domain of bucket\n\t * @param fileName       the file name\n\t *\n\t * @return the file url\n\t */\n\tString getFileUrl(String domainOfBucket, String fileName);\n\n\t/**\n\t * Upload file opt upload file resp dto.\n\t *\n\t * @param uploadBytes the upload bytes\n\t * @param fileName    the file name\n\t * @param filePath    the file path\n\t * @param bucketName  the bucket name\n\t *\n\t * @return the opt upload file resp dto\n\t *\n\t * @throws IOException the io exception\n\t */\n\tOptUploadFileRespDto uploadFile(byte[] uploadBytes, String fileName, String filePath, String bucketName) throws IOException;\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-opc/src/main/java/com/paascloud/provider/service/OptFreeMarkerService.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：OptFreeMarkerService.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.service;\n\nimport freemarker.template.TemplateException;\n\nimport java.io.IOException;\nimport java.util.Map;\n\n\n/**\n * The interface Opt free marker service.\n *\n * @author paascloud.net@gmail.com\n */\npublic interface OptFreeMarkerService {\n\n\t/**\n\t * Gets template.\n\t *\n\t * @param map              the map\n\t * @param templateLocation the template location\n\t *\n\t * @return the template\n\t *\n\t * @throws IOException       the io exception\n\t * @throws TemplateException the template exception\n\t */\n\tString getTemplate(Map<String, Object> map, String templateLocation) throws IOException, TemplateException;\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-opc/src/main/java/com/paascloud/provider/service/OptSendMailService.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：OptSendMailService.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.service;\n\nimport java.util.Map;\nimport java.util.Set;\n\n/**\n * The interface Opt send mail service.\n *\n * @author paascloud.net@gmail.com\n */\npublic interface OptSendMailService {\n\t/**\n\t * Send simple mail int.\n\t *\n\t * @param subject the subject\n\t * @param text    the text\n\t * @param to      the to\n\t *\n\t * @return the int\n\t */\n\tint sendSimpleMail(String subject, String text, Set<String> to);\n\n\t/**\n\t * Send template mail int.\n\t *\n\t * @param subject the subject\n\t * @param text    the text\n\t * @param to      the to\n\t *\n\t * @return the int\n\t */\n\tint sendTemplateMail(String subject, String text, Set<String> to);\n\n\t/**\n\t * Send template mail int.\n\t *\n\t * @param model            the model\n\t * @param templateLocation the template location\n\t * @param subject          the subject\n\t * @param to               the to\n\t *\n\t * @return the int\n\t */\n\tint sendTemplateMail(Map<String, Object> model, String templateLocation, String subject, Set<String> to);\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-opc/src/main/java/com/paascloud/provider/service/OptSmsService.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：OptSmsService.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.service;\n\nimport com.aliyuncs.dysmsapi.model.v20170525.SendSmsRequest;\nimport com.aliyuncs.dysmsapi.model.v20170525.SendSmsResponse;\n\n/**\n * The interface Opt sms service.\n *\n * @author paascloud.net@gmail.com\n */\npublic interface OptSmsService {\n\t/**\n\t * Send sms send sms response.\n\t *\n\t * @param sendSmsRequest the send sms request\n\t *\n\t * @return the send sms response\n\t */\n\tSendSmsResponse sendSms(SendSmsRequest sendSmsRequest);\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-opc/src/main/java/com/paascloud/provider/service/impl/OptAttachmentServiceImpl.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：OptAttachmentServiceImpl.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.service.impl;\n\nimport com.google.common.base.Preconditions;\nimport com.google.common.collect.Lists;\nimport com.paascloud.PublicUtil;\nimport com.paascloud.base.constant.GlobalConstant;\nimport com.paascloud.base.dto.LoginAuthDto;\nimport com.paascloud.base.enums.ErrorCodeEnum;\nimport com.paascloud.config.properties.PaascloudProperties;\nimport com.paascloud.core.support.BaseService;\nimport com.paascloud.provider.exceptions.OpcBizException;\nimport com.paascloud.provider.mapper.OptAttachmentMapper;\nimport com.paascloud.provider.model.domain.OptAttachment;\nimport com.paascloud.provider.model.dto.UpdateAttachmentDto;\nimport com.paascloud.provider.model.dto.attachment.OptAttachmentReqDto;\nimport com.paascloud.provider.model.dto.attachment.OptAttachmentRespDto;\nimport com.paascloud.provider.model.dto.attachment.OptUploadFileByteInfoReqDto;\nimport com.paascloud.provider.model.dto.oss.*;\nimport com.paascloud.provider.service.OpcAttachmentService;\nimport com.paascloud.provider.service.OpcOssService;\nimport com.paascloud.provider.utils.CheckFileUtil;\nimport com.qiniu.common.QiniuException;\nimport com.xiaoleilu.hutool.io.FileTypeUtil;\nimport org.apache.commons.lang3.StringUtils;\nimport org.springframework.stereotype.Service;\nimport org.springframework.transaction.annotation.Transactional;\nimport org.springframework.web.multipart.MultipartFile;\nimport org.springframework.web.multipart.MultipartHttpServletRequest;\n\nimport javax.annotation.Resource;\nimport java.io.ByteArrayInputStream;\nimport java.io.IOException;\nimport java.io.InputStream;\nimport java.util.List;\n\n/**\n * The class Opt attachment service.\n *\n * @author paascloud.net @gmail.com\n */\n@Service\npublic class OptAttachmentServiceImpl extends BaseService<OptAttachment> implements OpcAttachmentService {\n\t@Resource\n\tprivate OptAttachmentMapper optAttachmentMapper;\n\t@Resource\n\tprivate OpcOssService optOssService;\n\t@Resource\n\tprivate PaascloudProperties paascloudProperties;\n\n\t@Override\n\tpublic List<OptUploadFileRespDto> uploadFile(MultipartHttpServletRequest multipartRequest, OptUploadFileReqDto optUploadFileReqDto, LoginAuthDto loginAuthDto, boolean storeDbFlag) {\n\t\tString fileType = optUploadFileReqDto.getFileType();\n\t\tString filePath = optUploadFileReqDto.getFilePath();\n\t\tString bucketName = optUploadFileReqDto.getBucketName();\n\t\tList<OptUploadFileRespDto> result = Lists.newArrayList();\n\t\tif (PublicUtil.isEmpty(filePath)) {\n\t\t\tfilePath = GlobalConstant.Sys.DEFAULT_FILE_PATH;\n\t\t}\n\t\ttry {\n\t\t\tList<MultipartFile> fileList = multipartRequest.getFiles(\"file\");\n\t\t\tif (fileList.isEmpty()) {\n\t\t\t\treturn result;\n\t\t\t}\n\n\t\t\tfor (MultipartFile multipartFile : fileList) {\n\t\t\t\tString fileName = multipartFile.getOriginalFilename();\n\t\t\t\tif (PublicUtil.isEmpty(fileName)) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tPreconditions.checkArgument(multipartFile.getSize() <= GlobalConstant.FILE_MAX_SIZE, \"上传文件不能大于5M\");\n\t\t\t\tInputStream inputStream = multipartFile.getInputStream();\n\n\t\t\t\tString inputStreamFileType = FileTypeUtil.getType(inputStream);\n\t\t\t\tCheckFileUtil.checkFileType(fileType, inputStreamFileType);\n\t\t\t\tOptUploadFileRespDto fileInfo;\n\t\t\t\tif (storeDbFlag) {\n\t\t\t\t\tfileInfo = this.uploadFile(multipartFile.getBytes(), fileName, fileType, filePath, bucketName, loginAuthDto);\n\t\t\t\t} else {\n\t\t\t\t\tfileInfo = optOssService.uploadFile(multipartFile.getBytes(), fileName, filePath, bucketName);\n\t\t\t\t}\n\t\t\t\tresult.add(fileInfo);\n\t\t\t}\n\t\t} catch (IOException e) {\n\t\t\tlogger.error(\"上传文件失败={}\", e.getMessage(), e);\n\t\t}\n\t\treturn result;\n\t}\n\n\t@Override\n\tpublic OptAttachmentRespDto queryAttachmentById(Long id) {\n\t\tPreconditions.checkArgument(id != null, \"ID不能为空\");\n\t\tOptAttachmentReqDto optAttachmentReqDto = new OptAttachmentReqDto();\n\t\toptAttachmentReqDto.setId(id);\n\t\tList<OptAttachmentRespDto> optAttachmentRespDtos = optAttachmentMapper.queryAttachment(optAttachmentReqDto);\n\t\treturn optAttachmentRespDtos == null ? null : optAttachmentRespDtos.get(0);\n\t}\n\n\t@Override\n\tpublic List<OptAttachmentRespDto> queryAttachmentListByRefNo(String refNo) {\n\t\tPreconditions.checkArgument(StringUtils.isNotEmpty(refNo), \"关联单号不能为空\");\n\t\tOptAttachmentReqDto optAttachmentReqDto = new OptAttachmentReqDto();\n\t\toptAttachmentReqDto.setRefNo(refNo);\n\t\treturn optAttachmentMapper.queryAttachment(optAttachmentReqDto);\n\t}\n\n\t@Override\n\tpublic List<Long> queryAttachmentByRefNo(final String refNo) {\n\t\treturn optAttachmentMapper.queryAttachmentByRefNo(refNo);\n\t}\n\n\t@Override\n\tpublic int deleteFile(String fileName, String bucketName, Long attachmentId) throws QiniuException {\n\t\tPreconditions.checkArgument(StringUtils.isNotEmpty(fileName), ErrorCodeEnum.OPC10040010.msg());\n\t\tPreconditions.checkArgument(StringUtils.isNotEmpty(bucketName), \"存储空间不能为空\");\n\n\t\toptOssService.deleteFile(fileName, bucketName);\n\t\treturn optAttachmentMapper.deleteByPrimaryKey(attachmentId);\n\t}\n\n\t@Override\n\tpublic int deleteFile(final Long attachmentId) throws QiniuException {\n\t\tOptAttachment optAttachment = optAttachmentMapper.selectByPrimaryKey(attachmentId);\n\t\tif (optAttachment != null) {\n\t\t\toptOssService.deleteFile(optAttachment.getPath() + optAttachment.getName(), optAttachment.getBucketName());\n\t\t\treturn optAttachmentMapper.deleteByPrimaryKey(attachmentId);\n\t\t}\n\t\treturn 1;\n\t}\n\n\t@Override\n\tpublic void saveAttachment(OptAttachment optAttachment, LoginAuthDto loginAuthDto) {\n\t\toptAttachment.setUpdateInfo(loginAuthDto);\n\t\tif (optAttachment.isNew()) {\n\t\t\toptAttachmentMapper.insertSelective(optAttachment);\n\t\t} else {\n\t\t\tint result = optAttachmentMapper.updateByPrimaryKeySelective(optAttachment);\n\t\t\tif (result < 1) {\n\t\t\t\tthrow new OpcBizException(ErrorCodeEnum.OPC10040007, optAttachment.getId());\n\t\t\t}\n\t\t}\n\t}\n\n\t@Override\n\tpublic OptUploadFileRespDto rpcUploadFile(OptUploadFileReqDto optUploadFileReqDto) throws IOException {\n\t\tString fileType = optUploadFileReqDto.getFileType();\n\t\tString filePath = optUploadFileReqDto.getFilePath();\n\t\tString bucketName = optUploadFileReqDto.getBucketName();\n\t\tOptUploadFileByteInfoReqDto uploadFileByteInfoReqDto = optUploadFileReqDto.getUploadFileByteInfoReqDto();\n\t\tLoginAuthDto authResDto = new LoginAuthDto();\n\t\tauthResDto.setUserId(optUploadFileReqDto.getUserId());\n\t\tauthResDto.setUserName(optUploadFileReqDto.getUserName());\n\n\t\tif (PublicUtil.isEmpty(filePath)) {\n\t\t\tfilePath = GlobalConstant.Oss.DEFAULT_FILE_PATH;\n\t\t}\n\t\tInputStream is = null;\n\t\ttry {\n\t\t\tPreconditions.checkArgument(uploadFileByteInfoReqDto != null, \"上传数据不能为空\");\n\t\t\tbyte[] fileByteArray = uploadFileByteInfoReqDto.getFileByteArray();\n\t\t\tPreconditions.checkArgument(fileByteArray.length / GlobalConstant.M_SIZE <= GlobalConstant.FILE_MAX_SIZE, \"上传文件不能大于5M\");\n\n\t\t\tString fileName = uploadFileByteInfoReqDto.getFileName();\n\t\t\tis = new ByteArrayInputStream(fileByteArray);\n\t\t\tString type = FileTypeUtil.getType(is);\n\t\t\tPreconditions.checkArgument(type.equals(fileType), \"文件类型不符\");\n\t\t\tfileName = filePath + fileName;\n\t\t\tOptUploadFileRespDto optUploadFileRespDto = this.uploadFile(fileByteArray, fileName, fileType, filePath, bucketName, authResDto);\n\t\t\toptUploadFileRespDto.setFileType(fileType);\n\t\t\treturn optUploadFileRespDto;\n\t\t} catch (IOException e) {\n\t\t\tlogger.error(\"上传文件失败={}\", e.getMessage(), e);\n\t\t} finally {\n\t\t\tif (null != is) {\n\t\t\t\tis.close();\n\t\t\t}\n\t\t}\n\t\treturn null;\n\t}\n\n\t/**\n\t * Rpc get file url string.\n\t *\n\t * @param optGetUrlRequest the opt get url request\n\t *\n\t * @return the string\n\t */\n\t@Override\n\tpublic String rpcGetFileUrl(OptGetUrlRequest optGetUrlRequest) {\n\t\tLong attachmentId = optGetUrlRequest.getAttachmentId();\n\t\tLong expires = optGetUrlRequest.getExpires();\n\t\tboolean encrypt = optGetUrlRequest.isEncrypt();\n\t\tif (null == attachmentId) {\n\t\t\tthrow new IllegalArgumentException(\"参数异常, 请检查参数\");\n\t\t}\n\n\t\tOptAttachment optAttachment = this.getById(attachmentId);\n\t\tString fileName = optAttachment.getPath() + optAttachment.getName();\n\n\t\treturn getUrl(expires, encrypt, fileName);\n\t}\n\n\tprivate String getUrl(final Long expires, final boolean encrypt, final String fileName) {\n\t\tfinal String domainOfBucket;\n\t\tif (encrypt) {\n\t\t\tdomainOfBucket = paascloudProperties.getQiniu().getOss().getPrivateHost();\n\t\t\treturn optOssService.getFileUrl(domainOfBucket, fileName, expires);\n\t\t} else {\n\t\t\tdomainOfBucket = paascloudProperties.getQiniu().getOss().getPublicHost();\n\t\t\treturn domainOfBucket + \"/\" + fileName;\n\t\t}\n\t}\n\n\t@Override\n\tpublic OptAttachment getById(Long attachmentId) {\n\t\tPreconditions.checkArgument(attachmentId != null, \"文件流水号不能为空\");\n\t\tOptAttachment optAttachment = optAttachmentMapper.selectByPrimaryKey(attachmentId);\n\t\tif (PublicUtil.isEmpty(optAttachment)) {\n\t\t\tthrow new OpcBizException(ErrorCodeEnum.OPC10040008, attachmentId);\n\t\t}\n\t\treturn optAttachment;\n\t}\n\n\t@Override\n\tpublic OptUploadFileRespDto uploadFile(byte[] uploadBytes, String fileName, String fileType, String filePath, String bucketName, LoginAuthDto loginAuthDto) throws IOException {\n\t\tOptUploadFileRespDto fileInfo = optOssService.uploadFile(uploadBytes, fileName, filePath, bucketName);\n\t\tinsertAttachment(fileType, bucketName, loginAuthDto, fileInfo);\n\t\treturn fileInfo;\n\t}\n\n\t@Override\n\t@Transactional(rollbackFor = Exception.class)\n\tpublic void updateAttachment(final UpdateAttachmentDto attachmentDto) throws QiniuException {\n\t\tList<Long> attachmentIdList = attachmentDto.getAttachmentIdList();\n\t\tLoginAuthDto loginAuthDto = attachmentDto.getLoginAuthDto();\n\t\tString refNo = attachmentDto.getRefNo();\n\t\tList<Long> idList = optAttachmentMapper.queryAttachmentByRefNo(refNo);\n\t\tif (PublicUtil.isNotEmpty(idList)) {\n\t\t\tidList.removeAll(attachmentIdList);\n\t\t\tfor (final Long id : idList) {\n\t\t\t\tthis.deleteFile(id);\n\t\t\t}\n\t\t}\n\t\tfor (final Long id : attachmentIdList) {\n\t\t\tOptAttachment optAttachment = new OptAttachment();\n\t\t\toptAttachment.setId(id);\n\t\t\toptAttachment.setRefNo(refNo);\n\t\t\toptAttachment.setUpdateInfo(loginAuthDto);\n\t\t\toptAttachmentMapper.updateByPrimaryKeySelective(optAttachment);\n\t\t}\n\t}\n\n\t@Override\n\tpublic List<ElementImgUrlDto> listFileUrl(final OptBatchGetUrlRequest urlRequest) {\n\t\tList<ElementImgUrlDto> result = Lists.newArrayList();\n\t\tString refNo = urlRequest.getRefNo();\n\t\tLong expires = urlRequest.getExpires();\n\t\tboolean encrypt = urlRequest.isEncrypt();\n\t\tPreconditions.checkArgument(StringUtils.isNotEmpty(refNo), \"业务单号不能为空\");\n\n\t\tList<OptAttachment> list = this.listByRefNo(refNo);\n\t\tfor (final OptAttachment optAttachment : list) {\n\t\t\tString fileName = optAttachment.getPath() + optAttachment.getName();\n\t\t\tString url = getUrl(expires, encrypt, fileName);\n\t\t\tif (StringUtils.isNotEmpty(url)) {\n\t\t\t\tElementImgUrlDto dto = new ElementImgUrlDto(url, optAttachment.getName(), optAttachment.getId());\n\t\t\t\tresult.add(dto);\n\t\t\t}\n\t\t}\n\t\treturn result;\n\t}\n\n\t@Override\n\tpublic List<OptAttachment> listByRefNo(final String refNo) {\n\t\tOptAttachment optAttachment = new OptAttachment();\n\t\toptAttachment.setRefNo(refNo);\n\t\treturn optAttachmentMapper.select(optAttachment);\n\t}\n\n\t@Override\n\tpublic List<OptAttachment> listExpireFile() {\n\t\treturn optAttachmentMapper.listExpireFile();\n\t}\n\n\tprivate void insertAttachment(String fileType, String bucketName, LoginAuthDto loginAuthDto, OptUploadFileRespDto fileInfo) {\n\t\tString attachmentName = fileInfo.getAttachmentName();\n\t\tlong id = generateId();\n\t\tOptAttachment optAttachment = new OptAttachment();\n\t\toptAttachment.setBucketName(bucketName);\n\t\toptAttachment.setFormat(fileInfo.getFileType());\n\t\toptAttachment.setName(attachmentName);\n\t\toptAttachment.setType(fileType);\n\t\toptAttachment.setFormat(StringUtils.substringAfterLast(attachmentName, \".\"));\n\t\toptAttachment.setPath(fileInfo.getAttachmentPath());\n\t\toptAttachment.setId(id);\n\t\toptAttachment.setCenterName(bucketName);\n\t\tfileInfo.setAttachmentId(id);\n\t\toptAttachment.setUpdateInfo(loginAuthDto);\n\t\toptAttachmentMapper.insertSelective(optAttachment);\n\t}\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-opc/src/main/java/com/paascloud/provider/service/impl/OptFreeMarkerServiceImpl.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：OptFreeMarkerServiceImpl.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.service.impl;\n\nimport com.google.common.base.Preconditions;\nimport com.paascloud.PublicUtil;\nimport com.paascloud.provider.service.OptFreeMarkerService;\nimport freemarker.template.Configuration;\nimport freemarker.template.Template;\nimport freemarker.template.TemplateException;\nimport org.springframework.stereotype.Service;\nimport org.springframework.ui.freemarker.FreeMarkerTemplateUtils;\n\nimport javax.annotation.Resource;\nimport java.io.IOException;\nimport java.util.Map;\n\n/**\n * The class Opt free marker service.\n *\n * @author paascloud.net@gmail.com\n */\n@Service\npublic class OptFreeMarkerServiceImpl implements OptFreeMarkerService {\n\n\t@Resource\n\tprivate Configuration configuration;\n\n\t@Override\n\tpublic String getTemplate(Map<String, Object> map, String templateLocation) throws IOException, TemplateException {\n\t\tPreconditions.checkArgument(PublicUtil.isNotEmpty(templateLocation), \"模板不能为空\");\n\t\tTemplate t = configuration.getTemplate(templateLocation, \"UTF-8\");\n\t\treturn FreeMarkerTemplateUtils.processTemplateIntoString(t, map);\n\t}\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-opc/src/main/java/com/paascloud/provider/service/impl/OptQiniuOssServiceImpl.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：OptQiniuOssServiceImpl.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.service.impl;\n\n\nimport com.google.common.base.Preconditions;\nimport com.google.common.collect.Sets;\nimport com.google.gson.Gson;\nimport com.paascloud.PublicUtil;\nimport com.paascloud.RedisKeyUtil;\nimport com.paascloud.UrlUtil;\nimport com.paascloud.base.enums.ErrorCodeEnum;\nimport com.paascloud.config.properties.PaascloudProperties;\nimport com.paascloud.core.generator.UniqueIdGenerator;\nimport com.paascloud.provider.exceptions.OpcBizException;\nimport com.paascloud.provider.model.dto.oss.OptUploadFileRespDto;\nimport com.paascloud.provider.service.OpcOssService;\nimport com.qiniu.common.QiniuException;\nimport com.qiniu.http.Response;\nimport com.qiniu.storage.BucketManager;\nimport com.qiniu.storage.UploadManager;\nimport com.qiniu.storage.model.BatchStatus;\nimport com.qiniu.storage.model.DefaultPutRet;\nimport com.qiniu.util.Auth;\nimport com.xiaoleilu.hutool.io.FileTypeUtil;\nimport lombok.extern.slf4j.Slf4j;\nimport org.apache.commons.lang3.StringUtils;\nimport org.springframework.data.redis.core.StringRedisTemplate;\nimport org.springframework.retry.annotation.Backoff;\nimport org.springframework.retry.annotation.Retryable;\nimport org.springframework.stereotype.Service;\n\nimport javax.annotation.Resource;\nimport java.io.ByteArrayInputStream;\nimport java.io.IOException;\nimport java.io.InputStream;\nimport java.util.Set;\nimport java.util.concurrent.TimeUnit;\n\n/**\n * The class Opt qiniu oss service.\n *\n * @author paascloud.net@gmail.com\n */\n@Slf4j\n@Service\npublic class OptQiniuOssServiceImpl implements OpcOssService {\n\t@Resource\n\tprivate BucketManager bucketManager;\n\t@Resource\n\tprivate Auth auth;\n\t@Resource\n\tprivate PaascloudProperties paascloudProperties;\n\t@Resource\n\tprivate UploadManager uploadManager;\n\t@Resource\n\tprivate StringRedisTemplate srt;\n\n\tprivate static final String OPEN_IMG_BUCKET = \"open-img-bucket\";\n\n\t@Override\n\t@Retryable(value = Exception.class, backoff = @Backoff(delay = 5000, multiplier = 2))\n\tpublic void deleteFile(String fileName, String bucketName) throws QiniuException {\n\t\tlog.info(\"deleteFile - 删除OSS文件. fileName={}, bucketName={}\", fileName, bucketName);\n\n\t\tPreconditions.checkArgument(StringUtils.isNotEmpty(fileName), ErrorCodeEnum.OPC10040010.msg());\n\t\tPreconditions.checkArgument(StringUtils.isNotEmpty(bucketName), \"存储空间不能为空\");\n\n\n\t\tResponse response = bucketManager.delete(bucketName, fileName);\n\t\tlog.info(\"deleteFile - 删除OSS文件. [OK] response={}\", response);\n\t}\n\n\t@Override\n\tpublic Set<String> batchDeleteFile(String[] fileNameList, String bucketName) throws QiniuException {\n\t\tlog.info(\"batchDeleteFile - 删除OSS文件. fileNameList={}, bucketName={}\", fileNameList, bucketName);\n\t\tBucketManager.BatchOperations batchOperations = new BucketManager.BatchOperations();\n\t\tbatchOperations.addDeleteOp(bucketName, fileNameList);\n\n\t\tResponse response = bucketManager.batch(batchOperations);\n\t\tBatchStatus[] batchStatusList = response.jsonToObject(BatchStatus[].class);\n\n\t\tSet<String> failSet = Sets.newHashSet();\n\t\tfor (int i = 0; i < fileNameList.length; i++) {\n\t\t\tBatchStatus status = batchStatusList[i];\n\t\t\tString fileName = fileNameList[i];\n\t\t\tif (status.code != 200) {\n\t\t\t\tfailSet.add(fileName);\n\t\t\t\tlog.error(\"batchDeleteFile - 删除OSS文件. [FAIL] fileName={}, error={}\", fileName, status.data.error);\n\t\t\t} else {\n\t\t\t\tlog.info(\"batchDeleteFile - 删除OSS文件. [OK] fileName={}, bucketName={}\", fileName, bucketName);\n\t\t\t}\n\t\t}\n\t\treturn failSet;\n\t}\n\n\t@Override\n\tpublic String getFileUrl(String domainOfBucket, String fileName, Long expires) {\n\t\tString downloadUrl;\n\t\tString encodedFileName = UrlUtil.getURLEncoderString(fileName);\n\t\tString url = String.format(\"%s/%s\", domainOfBucket, encodedFileName);\n\t\tlog.info(\"getFileUrl - 获取文件全路径. url={}\", url);\n\n\t\tif (null == expires) {\n\t\t\tdownloadUrl = auth.privateDownloadUrl(url);\n\t\t} else {\n\t\t\tdownloadUrl = auth.privateDownloadUrl(url, expires);\n\t\t}\n\t\tlog.info(\"getFileUrl - 获取文件全路径. [OK] downloadUrl={}\", downloadUrl);\n\t\treturn downloadUrl;\n\t}\n\n\t@Override\n\tpublic String getFileUrl(String domainOfBucket, String fileName) {\n\t\treturn this.getFileUrl(domainOfBucket, fileName, null);\n\t}\n\n\t@Override\n\tpublic OptUploadFileRespDto uploadFile(byte[] uploadBytes, String fileName, String filePath, String bucketName) throws IOException {\n\t\tlog.info(\"uploadFile - 上传文件. fileName={}, bucketName={}\", fileName, bucketName);\n\n\t\tPreconditions.checkArgument(uploadBytes != null, \"读取文件失败\");\n\t\tPreconditions.checkArgument(StringUtils.isNotEmpty(fileName), ErrorCodeEnum.OPC10040010.msg());\n\t\tPreconditions.checkArgument(StringUtils.isNotEmpty(filePath), \"文件路径不能为空\");\n\t\tPreconditions.checkArgument(StringUtils.isNotEmpty(bucketName), \"存储节点不能为空\");\n\n\t\tInputStream is = new ByteArrayInputStream(uploadBytes);\n\t\tString inputStreamFileType = FileTypeUtil.getType(is);\n\t\tString newFileName = UniqueIdGenerator.generateId() + \".\" + inputStreamFileType;\n\n\t\t// 检查数据大小\n\t\tthis.checkFileSize(uploadBytes);\n\n\t\tResponse response = uploadManager.put(uploadBytes, filePath + newFileName, getUpToken(bucketName));\n\t\tDefaultPutRet putRet = new Gson().fromJson(response.bodyString(), DefaultPutRet.class);\n\t\tlog.info(\"uploadFile - 上传文件. [OK] putRet={}\", putRet);\n\t\tif (PublicUtil.isEmpty(putRet) || StringUtils.isEmpty(putRet.key)) {\n\t\t\tthrow new OpcBizException(ErrorCodeEnum.OPC10040009);\n\t\t}\n\t\tString fileUrl;\n\t\t// 获取图片路径\n\t\tif (StringUtils.equals(OPEN_IMG_BUCKET, bucketName)) {\n\t\t\tfileUrl = paascloudProperties.getQiniu().getOss().getPublicHost() + \"/\" + filePath + newFileName;\n\t\t} else {\n\t\t\tString domainUrl = paascloudProperties.getQiniu().getOss().getPrivateHost();\n\t\t\tfileUrl = this.getFileUrl(domainUrl, fileName);\n\t\t}\n\t\tOptUploadFileRespDto result = new OptUploadFileRespDto();\n\t\tresult.setAttachmentUrl(fileUrl);\n\t\tresult.setAttachmentName(newFileName);\n\t\tresult.setAttachmentPath(filePath);\n\t\treturn result;\n\t}\n\n\tprivate String getUpToken(String bucketName) {\n\t\treturn auth.uploadToken(bucketName);\n\t}\n\n\tprivate void checkFileSize(byte[] uploadFileByte) {\n\t\tlong redisFileSize;\n\t\tLong fileMaxSize = paascloudProperties.getQiniu().getOss().getFileMaxSize();\n\t\tPreconditions.checkArgument(fileMaxSize != null, \"每天上传文件最大值没有配置\");\n\n\t\tString fileSizeKey = RedisKeyUtil.getFileSizeKey();\n\t\tlong fileSize = uploadFileByte.length;\n\n\t\tString redisFileSizeStr = srt.opsForValue().get(fileSizeKey);\n\n\t\tif(StringUtils.isEmpty(redisFileSizeStr)) {\n\t\t\tredisFileSizeStr = \"0\";\n\t\t}\n\t\tredisFileSize = Long.valueOf(redisFileSizeStr);\n\t\tif (fileSize + redisFileSize > fileMaxSize) {\n\t\t\tthrow new OpcBizException(ErrorCodeEnum.OPC10040011);\n\t\t}\n\n\t\tsrt.opsForValue().set(fileSizeKey, String.valueOf(redisFileSize + fileSize), 1, TimeUnit.DAYS);\n\t}\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-opc/src/main/java/com/paascloud/provider/service/impl/OptSendMailServiceImpl.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：OptSendMailServiceImpl.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.service.impl;\n\nimport com.google.common.base.Preconditions;\nimport com.google.common.collect.Sets;\nimport com.paascloud.PubUtils;\nimport com.paascloud.PublicUtil;\nimport com.paascloud.base.enums.ErrorCodeEnum;\nimport com.paascloud.provider.exceptions.OpcBizException;\nimport com.paascloud.provider.model.dto.mail.MailEntity;\nimport com.paascloud.provider.service.OptFreeMarkerService;\nimport com.paascloud.provider.service.OptSendMailService;\nimport freemarker.template.TemplateException;\nimport lombok.extern.slf4j.Slf4j;\nimport org.springframework.beans.factory.annotation.Value;\nimport org.springframework.core.task.TaskExecutor;\nimport org.springframework.mail.SimpleMailMessage;\nimport org.springframework.mail.javamail.JavaMailSender;\nimport org.springframework.mail.javamail.MimeMessageHelper;\nimport org.springframework.stereotype.Service;\n\nimport javax.annotation.Resource;\nimport javax.mail.MessagingException;\nimport javax.mail.internet.MimeMessage;\nimport java.io.IOException;\nimport java.util.Map;\nimport java.util.Set;\n\n/**\n * The class Opt send mail service.\n *\n * @author paascloud.net@gmail.com\n */\n@Slf4j\n@Service\npublic class OptSendMailServiceImpl implements OptSendMailService {\n\t@Resource\n\tprivate TaskExecutor taskExecutor;\n\t@Resource\n\tprivate OptFreeMarkerService optVelocityService;\n\n\t@Resource\n\tprivate JavaMailSender mailSender;\n\n\t@Value(\"${spring.mail.username}\")\n\tprivate String from;\n\n\t@Override\n\tpublic int sendSimpleMail(String subject, String text, Set<String> to) {\n\t\tlog.info(\"sendSimpleMail - 发送简单邮件. subject={}, text={}, to={}\", subject, text, to);\n\t\tint result = 1;\n\t\ttry {\n\t\t\tSimpleMailMessage message = MailEntity.createSimpleMailMessage(subject, text, to);\n\t\t\tmessage.setFrom(from);\n\t\t\ttaskExecutor.execute(() -> mailSender.send(message));\n\t\t} catch (Exception e) {\n\t\t\tlog.info(\"sendSimpleMail [FAIL] ex={}\", e.getMessage(), e);\n\t\t\tresult = 0;\n\t\t}\n\t\treturn result;\n\t}\n\n\t@Override\n\tpublic int sendTemplateMail(String subject, String text, Set<String> to) {\n\t\tlog.info(\"sendTemplateMail - 发送模板邮件. subject={}, text={}, to={}\", subject, text, to);\n\t\tint result = 1;\n\t\ttry {\n\t\t\tMimeMessage mimeMessage = getMimeMessage(subject, text, to);\n\t\t\ttaskExecutor.execute(() -> mailSender.send(mimeMessage));\n\t\t} catch (Exception e) {\n\t\t\tlog.info(\"sendTemplateMail [FAIL] ex={}\", e.getMessage(), e);\n\t\t\tresult = 0;\n\t\t}\n\t\treturn result;\n\t}\n\n\tprivate MimeMessage getMimeMessage(String subject, String text, Set<String> to) {\n\t\tPreconditions.checkArgument(!PubUtils.isNull(subject, text, to), \"参数异常, 邮件信息不完整\");\n\n\t\tString[] toArray = setToArray(to);\n\t\tPreconditions.checkArgument(PublicUtil.isNotEmpty(toArray), \"请输入收件人邮箱\");\n\t\tMimeMessage mimeMessage = mailSender.createMimeMessage();\n\t\tMimeMessageHelper helper;\n\t\ttry {\n\t\t\thelper = new MimeMessageHelper(mimeMessage, true);\n\t\t\thelper.setFrom(from);\n\t\t\thelper.setTo(toArray);\n\t\t\thelper.setSubject(subject);\n\t\t\thelper.setText(text, true);\n\t\t} catch (MessagingException e) {\n\t\t\tlog.error(\"生成邮件消息体, 出现异常={}\", e.getMessage(), e);\n\t\t\tthrow new OpcBizException(ErrorCodeEnum.OPC10040005);\n\t\t}\n\t\treturn mimeMessage;\n\t}\n\n\t@Override\n\tpublic int sendTemplateMail(Map<String, Object> model, String templateLocation, String subject, Set<String> to) {\n\t\tlog.info(\"sendTemplateMail - 发送模板邮件. subject={}, model={}, to={}, templateLocation={}\", subject, model, to, templateLocation);\n\n\t\tString text;\n\t\ttry {\n\t\t\ttext = optVelocityService.getTemplate(model, templateLocation);\n\t\t} catch (IOException | TemplateException e) {\n\t\t\tlog.info(\"sendTemplateMail [FAIL] ex={}\", e.getMessage(), e);\n\t\t\tthrow new OpcBizException(ErrorCodeEnum.OPC10040006, e);\n\t\t}\n\t\treturn this.sendTemplateMail(subject, text, to);\n\t}\n\n\n\tprivate String[] setToArray(Set<String> to) {\n\t\tPreconditions.checkArgument(PublicUtil.isNotEmpty(to), \"请输入收件人邮箱\");\n\n\t\tSet<String> toSet = Sets.newHashSet();\n\t\tfor (String toStr : to) {\n\t\t\ttoStr = toStr.trim();\n\t\t\tif (PubUtils.isEmail(toStr)) {\n\t\t\t\ttoSet.add(toStr);\n\t\t\t}\n\t\t}\n\t\tif (PublicUtil.isEmpty(toSet)) {\n\t\t\treturn null;\n\t\t}\n\t\treturn toSet.toArray(new String[toSet.size()]);\n\t}\n\n\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-opc/src/main/java/com/paascloud/provider/service/impl/OptSmsServiceImpl.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：OptSmsServiceImpl.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.service.impl;\n\nimport com.aliyuncs.IAcsClient;\nimport com.aliyuncs.dysmsapi.model.v20170525.SendSmsRequest;\nimport com.aliyuncs.dysmsapi.model.v20170525.SendSmsResponse;\nimport com.aliyuncs.exceptions.ClientException;\nimport com.google.common.base.Preconditions;\nimport com.paascloud.base.constant.GlobalConstant;\nimport com.paascloud.base.enums.ErrorCodeEnum;\nimport com.paascloud.config.properties.PaascloudProperties;\nimport com.paascloud.provider.exceptions.OpcBizException;\nimport com.paascloud.provider.service.OptSmsService;\nimport lombok.extern.slf4j.Slf4j;\nimport org.apache.commons.lang3.StringUtils;\nimport org.springframework.beans.factory.annotation.Value;\nimport org.springframework.stereotype.Service;\n\nimport javax.annotation.Resource;\n\n/**\n * The class Opt sms service.\n *\n * @author paascloud.net@gmail.com\n */\n@Slf4j\n@Service\npublic class OptSmsServiceImpl implements OptSmsService {\n\t@Resource\n\tprivate IAcsClient iAcsClient;\n\t@Resource\n\tprivate PaascloudProperties paascloudProperties;\n\t@Value(\"${spring.profiles.active}\")\n\tprivate String profile;\n\n\t@Override\n\tpublic SendSmsResponse sendSms(SendSmsRequest sendSmsRequest) {\n\t\tcheckParam(sendSmsRequest);\n\t\tSendSmsResponse acsResponse;\n\t\ttry {\n\t\t\tif (GlobalConstant.DEV_PROFILE.equals(profile)) {\n\t\t\t\tlog.error(\"dev环境不发送短信\");\n\t\t\t\treturn new SendSmsResponse();\n\t\t\t}\n\t\t\tif (GlobalConstant.TEST_PROFILE.equals(profile)) {\n\t\t\t\tlog.error(\"test环境不发送短信\");\n\t\t\t\treturn new SendSmsResponse();\n\t\t\t}\n\t\t\tacsResponse = iAcsClient.getAcsResponse(sendSmsRequest);\n\t\t} catch (ClientException e) {\n\t\t\tlog.error(\"send sms message error={}\", e.getMessage(), e);\n\t\t\tthrow new OpcBizException(ErrorCodeEnum.OPC10040004, e);\n\t\t}\n\t\tlog.info(\"send sms message OK acsResponse={}\", acsResponse);\n\t\treturn acsResponse;\n\t}\n\n\tprivate void checkParam(SendSmsRequest sendSmsRequest) {\n\t\tString templateCode = sendSmsRequest.getTemplateCode();\n\t\tString signName = sendSmsRequest.getSignName();\n\t\tif (StringUtils.isBlank(signName)) {\n\t\t\tsendSmsRequest.setSignName(paascloudProperties.getAliyun().getSms().getSignName());\n\t\t}\n\n\t\tString templateParam = sendSmsRequest.getTemplateParam();\n\t\tString phoneNumbers = sendSmsRequest.getPhoneNumbers();\n\n\t\tPreconditions.checkArgument(StringUtils.isNotEmpty(templateCode), \"短信模板不能为空\");\n\t\tPreconditions.checkArgument(StringUtils.isNotEmpty(phoneNumbers), \"手机号码不能为空\");\n\t\tPreconditions.checkArgument(StringUtils.isNotEmpty(templateParam), \"短信内容不能为空\");\n\t}\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-opc/src/main/java/com/paascloud/provider/utils/CheckFileUtil.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：CheckFileUtil.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.utils;\n\nimport com.google.common.base.Preconditions;\nimport com.google.common.collect.Maps;\nimport lombok.AccessLevel;\nimport lombok.NoArgsConstructor;\n\nimport java.util.ArrayList;\nimport java.util.Arrays;\nimport java.util.List;\nimport java.util.Map;\n\n/**\n * The class Check file util.\n *\n * @author paascloud.net@gmail.com\n */\n@NoArgsConstructor(access = AccessLevel.PRIVATE)\npublic class CheckFileUtil {\n\n\tprivate static final Map<String, String> FILE_TYPE_MAP = Maps.newHashMap();\n\n\t/**\n\t * Check file type.\n\t *\n\t * @param fileType            the file type\n\t * @param inputStreamFileType the input stream file type\n\t */\n\tpublic static void checkFileType(String fileType, String inputStreamFileType) {\n\t\tPreconditions.checkArgument(FileTypeEnum.getTypes().contains(fileType), \"上传文件类型不正确\");\n\n\t\t// 获取文件类型\n\t\tFILE_TYPE_MAP.clear();\n\t\t// 上传的是图片\n\t\tif (FileTypeEnum.PICTURE.getType().equals(fileType)) {\n\t\t\tgetPicFileType();\n\t\t\tPreconditions.checkArgument(FILE_TYPE_MAP.containsKey(inputStreamFileType), \"图片格式非法\");\n\t\t}\n\t\t// 上传的是音频\n\t\tif (FileTypeEnum.AUDIO.getType().equals(fileType)) {\n\t\t\tgetAudioFileType();\n\t\t\tPreconditions.checkArgument(FILE_TYPE_MAP.containsKey(inputStreamFileType), \"音频格式非法\");\n\t\t}\n\t\t// 上传的是视频\n\t\tif (FileTypeEnum.VIDEO.getType().equals(fileType)) {\n\t\t\tgetVideoFileType();\n\t\t\tPreconditions.checkArgument(FILE_TYPE_MAP.containsKey(inputStreamFileType), \"视频格式非法\");\n\t\t}\n\t}\n\n\n\tprivate static void getVideoFileType() {\n\t\t// Real Audio (ram)\n\t\tFILE_TYPE_MAP.put(\"ram\", \"2E7261FD\");\n\t\t// Real Media (rm)\n\t\tFILE_TYPE_MAP.put(\"rm\", \"2E524D46\");\n\t\t// Quicktime (mov)\n\t\tFILE_TYPE_MAP.put(\"mov\", \"00000014667479707174\");\n\t\t// rmvb\n\t\tFILE_TYPE_MAP.put(\"rmvb\", \"2e524d46000000120001\");\n\t\tFILE_TYPE_MAP.put(\"avi\", \"41564920\");\n\t\tFILE_TYPE_MAP.put(\"avi\", \"52494646b440c02b4156\");\n\t\tFILE_TYPE_MAP.put(\"flv\", \"464C5601050000000900\");\n\t\tFILE_TYPE_MAP.put(\"mp4\", \"00000020667479706d70\");\n\t\tFILE_TYPE_MAP.put(\"wmv\", \"3026b2758e66CF11a6d9\");\n\t\tFILE_TYPE_MAP.put(\"3gp\", \"00000014667479703367\");\n\t\tFILE_TYPE_MAP.put(\"mkv\", \"1a45dfa3010000000000\");\n\t}\n\n\tprivate static void getPicFileType() {\n\t\tFILE_TYPE_MAP.put(\"jpg\", \"FFD8FF\");\n\t\tFILE_TYPE_MAP.put(\"png\", \"89504E47\");\n\t\tFILE_TYPE_MAP.put(\"gif\", \"47494638\");\n\t\tFILE_TYPE_MAP.put(\"bmp\", \"424D\");\n\t\tFILE_TYPE_MAP.put(\"png\", \"89504E470D0a1a0a0000\");\n\t\t// 16色位图(bmp)\n\t\tFILE_TYPE_MAP.put(\"bmp\", \"424d228c010000000000\");\n\t\t// 24位位图(bmp)\n\t\tFILE_TYPE_MAP.put(\"bmp\", \"424d8240090000000000\");\n\t\t// 256色位图(bmp\n\t\tFILE_TYPE_MAP.put(\"bmp\", \"424d8e1b030000000000\");\n\t}\n\n\tprivate static void getAudioFileType() {\n\t\t// Wave (wav)\n\t\tFILE_TYPE_MAP.put(\"wav\", \"57415645\");\n\t\t// MIDI (mid)\n\t\tFILE_TYPE_MAP.put(\"mid\", \"4D546864\");\n\t\tFILE_TYPE_MAP.put(\"mp3\", \"49443303000000002176\");\n\t\tFILE_TYPE_MAP.put(\"wav\", \"52494646e27807005741\");\n\t\tFILE_TYPE_MAP.put(\"aac\", \"fff1508003fffcda004c\");\n\t\tFILE_TYPE_MAP.put(\"wv\", \"7776706ba22100000704\");\n\t\tFILE_TYPE_MAP.put(\"flac\", \"664c6143800000221200\");\n\t}\n\n\t/**\n\t * The enum File type enum.\n\t *\n\t * @author paascloud.net@gmail.com\n\t */\n\tpublic enum FileTypeEnum {\n\n\t\t/**\n\t\t * 音频\n\t\t */\n\t\tAUDIO(\"audio\", \"音频\"),\n\t\t/**\n\t\t * 图片\n\t\t */\n\t\tPICTURE(\"picture\", \"图片\"),\n\t\t/**\n\t\t * 视频\n\t\t */\n\t\tVIDEO(\"video\", \"视频\");\n\n\t\t/**\n\t\t * The Type.\n\t\t */\n\t\tString type;\n\t\t/**\n\t\t * The Name.\n\t\t */\n\t\tString name;\n\n\t\tFileTypeEnum(String type, String name) {\n\t\t\tthis.type = type;\n\t\t\tthis.name = name;\n\t\t}\n\n\t\t/**\n\t\t * Gets type.\n\t\t *\n\t\t * @return the type\n\t\t */\n\t\tpublic String getType() {\n\t\t\treturn type;\n\t\t}\n\n\t\t/**\n\t\t * Gets name.\n\t\t *\n\t\t * @return the name\n\t\t */\n\t\tpublic String getName() {\n\t\t\treturn name;\n\t\t}\n\n\t\t/**\n\t\t * Gets name.\n\t\t *\n\t\t * @param type the type\n\t\t *\n\t\t * @return the name\n\t\t */\n\t\tpublic static String getName(String type) {\n\t\t\tfor (FileTypeEnum ele : FileTypeEnum.values()) {\n\t\t\t\tif (ele.getType().equals(type)) {\n\t\t\t\t\treturn ele.getName();\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn null;\n\t\t}\n\n\t\t/**\n\t\t * Gets types.\n\t\t *\n\t\t * @return the types\n\t\t */\n\t\tpublic static List<String> getTypes() {\n\t\t\tList<String> list = new ArrayList<>();\n\t\t\tfor (FileTypeEnum ele : FileTypeEnum.values()) {\n\t\t\t\tlist.add(ele.getType());\n\t\t\t}\n\t\t\treturn list;\n\t\t}\n\n\t\t/**\n\t\t * 获取List集合\n\t\t *\n\t\t * @return List list\n\t\t */\n\t\tpublic static List<FileTypeEnum> getList() {\n\t\t\treturn Arrays.asList(FileTypeEnum.values());\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-opc/src/main/java/com/paascloud/provider/utils/GaoDeUtil.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：GaoDeUtil.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.utils;\n\nimport com.arronlong.httpclientutil.HttpClientUtil;\nimport com.arronlong.httpclientutil.common.HttpConfig;\nimport com.fasterxml.jackson.databind.ObjectMapper;\nimport com.paascloud.provider.model.dto.gaode.GaodeLocation;\nimport lombok.AccessLevel;\nimport lombok.NoArgsConstructor;\nimport lombok.extern.slf4j.Slf4j;\n\n\n/**\n * The class Gao de util.\n *\n * @author paascloud.net @gmail.com\n */\n@Slf4j\n@NoArgsConstructor(access = AccessLevel.PRIVATE)\npublic class GaoDeUtil {\n\n\t/**\n\t * Gets city by ip addr.\n\t *\n\t * @param ipAddr the ip addr\n\t *\n\t * @return the city by ip addr\n\t */\n\tpublic static GaodeLocation getCityByIpAddr(String ipAddr) {\n\t\t// http://lbs.amap.com/api/webservice/guide/api/ipconfig/\n\t\tlog.info(\"getCityByIpAddr - 根据IP定位. ipAddr={}\", ipAddr);\n\t\tGaodeLocation location = null;\n\t\tString urlAddressIp = \"http://restapi.amap.com/v3/ip?key=f8bdce6f882a98635bb0b7b897331327&ip=%s\";\n\t\tString url = String.format(urlAddressIp, ipAddr);\n\t\ttry {\n\t\t\tString str = HttpClientUtil.get(HttpConfig.custom().url(url));\n\t\t\tlocation = new ObjectMapper().readValue(str, GaodeLocation.class);\n\t\t} catch (Exception e) {\n\t\t\tlog.error(\"getCityByIpAddr={}\", e.getMessage(), e);\n\t\t}\n\t\tlog.info(\"getCityByIpAddr - 根据IP定位. ipAddr={}, location={}\", ipAddr, location);\n\t\treturn location;\n\t}\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-opc/src/main/java/com/paascloud/provider/web/GlobalExceptionHandler.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：GlobalExceptionHandler.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.web;\n\n\nimport com.paascloud.base.enums.ErrorCodeEnum;\nimport com.paascloud.base.exception.BusinessException;\nimport com.paascloud.provider.model.dto.GlobalExceptionLogDto;\nimport com.paascloud.provider.service.MdcExceptionLogFeignApi;\nimport com.paascloud.wrapper.WrapMapper;\nimport com.paascloud.wrapper.Wrapper;\nimport lombok.extern.slf4j.Slf4j;\nimport org.springframework.beans.factory.annotation.Value;\nimport org.springframework.core.task.TaskExecutor;\nimport org.springframework.http.HttpStatus;\nimport org.springframework.web.bind.annotation.ExceptionHandler;\nimport org.springframework.web.bind.annotation.ResponseBody;\nimport org.springframework.web.bind.annotation.ResponseStatus;\nimport org.springframework.web.bind.annotation.RestControllerAdvice;\nimport org.springframework.web.multipart.MultipartException;\n\nimport javax.annotation.Resource;\n\n/**\n * 全局的的异常拦截器\n *\n * @author paascloud.net @gmail.com\n */\n@Slf4j\n@RestControllerAdvice\npublic class GlobalExceptionHandler {\n\t@Resource\n\tprivate TaskExecutor taskExecutor;\n\t@Value(\"${spring.profiles.active}\")\n\tString profile;\n\t@Value(\"${spring.application.name}\")\n\tString applicationName;\n\t@Resource\n\tprivate MdcExceptionLogFeignApi mdcExceptionLogFeignApi;\n\n\t/**\n\t * 参数非法异常.\n\t *\n\t * @param e the e\n\t *\n\t * @return the wrapper\n\t */\n\t@ExceptionHandler(IllegalArgumentException.class)\n\t@ResponseStatus(HttpStatus.OK)\n\t@ResponseBody\n\tpublic Wrapper illegalArgumentException(IllegalArgumentException e) {\n\t\tlog.error(\"参数非法异常={}\", e.getMessage(), e);\n\t\treturn WrapMapper.wrap(ErrorCodeEnum.GL99990100.code(), e.getMessage());\n\t}\n\n\t/**\n\t * 业务异常.\n\t *\n\t * @param e the e\n\t *\n\t * @return the wrapper\n\t */\n\t@ExceptionHandler(BusinessException.class)\n\t@ResponseStatus(HttpStatus.OK)\n\t@ResponseBody\n\tpublic Wrapper businessException(BusinessException e) {\n\t\tlog.error(\"业务异常={}\", e.getMessage(), e);\n\t\treturn WrapMapper.wrap(e.getCode() == 0 ? Wrapper.ERROR_CODE : e.getCode(), e.getMessage());\n\t}\n\n\n\t/**\n\t * 全局异常.\n\t *\n\t * @param e the e\n\t *\n\t * @return the wrapper\n\t */\n\t@ExceptionHandler(Exception.class)\n\t@ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)\n\t@ResponseBody\n\tpublic Wrapper exception(Exception e) {\n\t\tlog.info(\"保存全局异常信息 ex={}\", e.getMessage(), e);\n\t\ttaskExecutor.execute(() -> {\n\t\t\tGlobalExceptionLogDto globalExceptionLogDto = new GlobalExceptionLogDto().getGlobalExceptionLogDto(e, profile, applicationName);\n\t\t\tmdcExceptionLogFeignApi.saveAndSendExceptionLog(globalExceptionLogDto);\n\t\t});\n\t\treturn WrapMapper.error();\n\t}\n\n\t@ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)\n\t@ResponseBody\n\t@ExceptionHandler(MultipartException.class)\n\tpublic Wrapper multipartException(Throwable t) {\n\t\tlog.error(\"上传文件, 出现错误={}\", t.getMessage(), t);\n\t\treturn WrapMapper.wrap(Wrapper.ERROR_CODE, \"文件超过限制\");\n\t}\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-opc/src/main/java/com/paascloud/provider/web/frontend/OpcFileController.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：OpcFileController.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.web.frontend;\n\nimport com.google.common.base.Preconditions;\nimport com.google.common.collect.Lists;\nimport com.google.common.collect.Maps;\nimport com.paascloud.base.constant.GlobalConstant;\nimport com.paascloud.base.exception.BusinessException;\nimport com.paascloud.core.support.BaseController;\nimport com.paascloud.provider.model.dto.attachment.OptAttachmentRespDto;\nimport com.paascloud.provider.model.dto.oss.OptUploadFileReqDto;\nimport com.paascloud.provider.model.dto.oss.OptUploadFileRespDto;\nimport com.paascloud.provider.service.OpcAttachmentService;\nimport com.paascloud.provider.service.OpcOssService;\nimport com.paascloud.wrapper.WrapMapper;\nimport com.paascloud.wrapper.Wrapper;\nimport io.swagger.annotations.Api;\nimport io.swagger.annotations.ApiOperation;\nimport org.apache.commons.lang3.StringUtils;\nimport org.springframework.http.MediaType;\nimport org.springframework.web.bind.annotation.PathVariable;\nimport org.springframework.web.bind.annotation.PostMapping;\nimport org.springframework.web.bind.annotation.RequestMapping;\nimport org.springframework.web.bind.annotation.RestController;\nimport org.springframework.web.multipart.MultipartHttpServletRequest;\n\nimport javax.annotation.Resource;\nimport javax.servlet.http.HttpServletRequest;\nimport java.util.List;\nimport java.util.Map;\n\n/**\n * The class Opt file controller.\n *\n * @author paascloud.net @gmail.com\n */\n@RestController\n@RequestMapping(value = \"/file\", produces = MediaType.APPLICATION_JSON_UTF8_VALUE)\n@Api(value = \"WEB - OptFileRest\", produces = MediaType.APPLICATION_JSON_UTF8_VALUE)\npublic class OpcFileController extends BaseController {\n\n\t@Resource\n\tprivate OpcAttachmentService optAttachmentService;\n\t@Resource\n\tprivate OpcOssService opcOssService;\n\n\t/**\n\t * 上传文件.\n\t *\n\t * @param request             the request\n\t * @param optUploadFileReqDto the opt upload file req dto\n\t *\n\t * @return the wrapper\n\t */\n\t@PostMapping(consumes = \"multipart/form-data\", value = \"/uploadFile\")\n\t@ApiOperation(httpMethod = \"POST\", value = \"上传文件\")\n\tpublic Wrapper<String> uploadFile(HttpServletRequest request, OptUploadFileReqDto optUploadFileReqDto) {\n\t\tStringBuilder temp = new StringBuilder();\n\t\tlogger.info(\"uploadFile - 上传文件. optUploadFileReqDto={}\", optUploadFileReqDto);\n\t\tPreconditions.checkArgument(StringUtils.isNotEmpty(optUploadFileReqDto.getFileType()), \"文件类型为空\");\n\t\tPreconditions.checkArgument(StringUtils.isNotEmpty(optUploadFileReqDto.getBucketName()), \"存储地址为空\");\n\n\t\tMultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;\n\t\tList<OptUploadFileRespDto> optUploadFileRespDtos = optAttachmentService.uploadFile(multipartRequest, optUploadFileReqDto, getLoginAuthDto(), true);\n\t\tfor (final OptUploadFileRespDto fileRespDto : optUploadFileRespDtos) {\n\t\t\ttemp.append(fileRespDto.getAttachmentId()).append(\",\");\n\t\t}\n\t\tString attachmentIds = temp.toString();\n\t\tif (StringUtils.isNotEmpty(attachmentIds)) {\n\t\t\tattachmentIds = StringUtils.substringBeforeLast(attachmentIds, GlobalConstant.Symbol.COMMA);\n\t\t}\n\t\treturn WrapMapper.ok(attachmentIds);\n\t}\n\n\t/**\n\t * Upload picture with wang editor map.\n\t *\n\t * @param request             the request\n\t * @param optUploadFileReqDto the opt upload file req dto\n\t *\n\t * @return the map\n\t */\n\t@PostMapping(consumes = \"multipart/form-data\", value = \"/uploadPictureWithWangEditor\")\n\t@ApiOperation(httpMethod = \"POST\", value = \"上传文件\")\n\tpublic Map<String, Object> uploadPictureWithWangEditor(HttpServletRequest request, OptUploadFileReqDto optUploadFileReqDto) {\n\t\tlogger.info(\"uploadWangEditor - 上传文件. optUploadFileReqDto={}\", optUploadFileReqDto);\n\n\t\tString fileType = optUploadFileReqDto.getFileType();\n\t\tString bucketName = optUploadFileReqDto.getBucketName();\n\t\tPreconditions.checkArgument(StringUtils.isNotEmpty(fileType), \"文件类型为空\");\n\t\tPreconditions.checkArgument(StringUtils.isNotEmpty(bucketName), \"存储地址为空\");\n\t\toptUploadFileReqDto.setFilePath(\"paascloud/picture/wangEditor/\");\n\t\tMultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;\n\t\tList<OptUploadFileRespDto> optUploadFileRespDtos = optAttachmentService.uploadFile(multipartRequest, optUploadFileReqDto, getLoginAuthDto(), false);\n\n\t\tList<String> imgUrlList = Lists.newArrayList();\n\t\tfor (final OptUploadFileRespDto fileRespDto : optUploadFileRespDtos) {\n\t\t\timgUrlList.add(fileRespDto.getAttachmentUrl());\n\t\t}\n\n\t\tMap<String, Object> map = Maps.newHashMap();\n\t\tmap.put(\"errno\", 0);\n\t\tmap.put(\"data\", imgUrlList.toArray());\n\t\treturn map;\n\t}\n\n\t/**\n\t * 根据ID查询附件信息.\n\t *\n\t * @param id the id\n\t *\n\t * @return the wrapper\n\t */\n\t@PostMapping(value = \"/queryAttachmentById/{id}\")\n\t@ApiOperation(httpMethod = \"POST\", value = \"根据ID查询附件信息\")\n\tpublic Wrapper<OptAttachmentRespDto> queryAttachment(@PathVariable Long id) {\n\t\tlogger.info(\"queryAttachment -根据ID查询文件信息. id={}\", id);\n\n\t\tOptAttachmentRespDto optAttachmentRespDto = optAttachmentService.queryAttachmentById(id);\n\t\treturn WrapMapper.ok(optAttachmentRespDto);\n\t}\n\n\t/**\n\t * 根据关联单号查询附件信息.\n\t *\n\t * @param refNo the ref no\n\t *\n\t * @return the wrapper\n\t */\n\t@PostMapping(value = \"/queryAttachmentListByRefNo/{refNo}\")\n\t@ApiOperation(httpMethod = \"POST\", value = \"根据关联单号查询附件信息\")\n\tpublic Wrapper<List<OptAttachmentRespDto>> queryAttachmentListByRefNo(@PathVariable String refNo) {\n\t\tlogger.info(\"queryAttachment -查询附件信息. refNo={}\", refNo);\n\n\t\tList<OptAttachmentRespDto> optAttachmentRespDtos = optAttachmentService.queryAttachmentListByRefNo(refNo);\n\t\treturn WrapMapper.ok(optAttachmentRespDtos);\n\t}\n\n\n\t/**\n\t * 删除附件信息.\n\t *\n\t * @param attachmentId the attachment id\n\t *\n\t * @return the wrapper\n\t */\n\t@PostMapping(value = \"/deleteAttachment/{attachmentId}\")\n\t@ApiOperation(httpMethod = \"POST\", value = \"删除附件信息\")\n\tpublic Wrapper deleteAttachment(@PathVariable Long attachmentId) {\n\t\tlogger.info(\"deleteAttachment - 删除文件. attachmentId={}\", attachmentId);\n\t\tint result;\n\t\ttry {\n\t\t\tresult = optAttachmentService.deleteFile(attachmentId);\n\t\t} catch (BusinessException ex) {\n\t\t\tlogger.error(\"删除文件, 出现异常={}\", ex.getMessage(), ex);\n\t\t\treturn WrapMapper.wrap(Wrapper.ERROR_CODE, \"出现异常\");\n\t\t} catch (Exception e) {\n\t\t\tlogger.error(\"删除取文件, 出现异常={}\", e.getMessage(), e);\n\t\t\treturn WrapMapper.error();\n\t\t}\n\t\treturn handleResult(result);\n\t}\n\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-opc/src/main/java/com/paascloud/provider/web/rpc/DingtalkFeignClient.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：DingtalkFeignClient.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.web.rpc;\n\nimport com.fasterxml.jackson.databind.ObjectMapper;\nimport com.google.common.base.Preconditions;\nimport com.paascloud.PublicUtil;\nimport com.paascloud.ValidateUtil;\nimport com.paascloud.core.support.BaseController;\nimport com.paascloud.provider.model.dto.robot.*;\nimport com.paascloud.provider.model.enums.RobotMsgTypeEnum;\nimport com.paascloud.provider.service.DingtalkFeignApi;\nimport com.paascloud.wrapper.WrapMapper;\nimport com.paascloud.wrapper.Wrapper;\nimport io.swagger.annotations.Api;\nimport io.swagger.annotations.ApiOperation;\nimport org.apache.http.HttpResponse;\nimport org.apache.http.HttpStatus;\nimport org.apache.http.client.HttpClient;\nimport org.apache.http.client.methods.HttpPost;\nimport org.apache.http.entity.StringEntity;\nimport org.apache.http.impl.client.HttpClients;\nimport org.springframework.http.MediaType;\nimport org.springframework.web.bind.annotation.RequestBody;\nimport org.springframework.web.bind.annotation.RestController;\n\nimport java.io.IOException;\n\n/**\n * The class Opc attachment feign client.\n *\n * @author paascloud.net @gmail.com\n */\n@RestController\n@Api(value = \"API - DingtalkFeignClient\", produces = MediaType.APPLICATION_JSON_UTF8_VALUE)\npublic class DingtalkFeignClient extends BaseController implements DingtalkFeignApi {\n\n\t@Override\n\t@ApiOperation(httpMethod = \"POST\", value = \"发送钉钉消息\")\n\tpublic Wrapper<Boolean> sendChatRobotMsg(@RequestBody ChatRobotMsgDto chatRobotMsgDto) {\n\t\tlogger.info(\"sendChatRobotMsg - 钉钉机器人开始发送消息. chatRobotMsgDto = {}\", chatRobotMsgDto);\n\t\tboolean result;\n\t\ttry {\n\t\t\tcheckChatReBotMsg(chatRobotMsgDto);\n\t\t\tHttpClient httpclient = HttpClients.createDefault();\n\t\t\tString webhookToken = \"https://oapi.dingtalk.com/robot/send?access_token=\" + chatRobotMsgDto.getWebhookToken();\n\t\t\tHttpPost httpPost = new HttpPost(webhookToken);\n\t\t\tObjectMapper mapper = new ObjectMapper();\n\t\t\tString robotJson = mapper.writeValueAsString(chatRobotMsgDto);\n\t\t\tlogger.info(\"robotJson = {}\", robotJson);\n\t\t\thttpPost.addHeader(\"Content-Type\", \"application/json; charset=utf-8\");\n\t\t\tStringEntity se = new StringEntity(robotJson, \"utf-8\");\n\t\t\thttpPost.setEntity(se);\n\t\t\tlogger.info(\"robotJson={}\", robotJson);\n\t\t\tlogger.info(\"httpPost={}\", httpPost);\n\t\t\tHttpResponse response;\n\t\t\tresponse = httpclient.execute(httpPost);\n\t\t\tif (HttpStatus.SC_OK == response.getStatusLine().getStatusCode()) {\n\t\t\t\tlogger.info(\"钉钉机器人发送消息成功 response={}\", response);\n\t\t\t\tresult = true;\n\t\t\t} else {\n\t\t\t\tlogger.error(\"钉钉机器人发送消息失败 response={}\", response);\n\t\t\t\tresult = false;\n\t\t\t}\n\t\t} catch (IOException e) {\n\t\t\tlogger.error(\"发送钉钉消息,出现异常 ex={}\", e.getMessage(), e);\n\t\t\treturn WrapMapper.error(\"发送钉钉消息失败\");\n\t\t}\n\t\treturn WrapMapper.ok(result);\n\t}\n\n\t/**\n\t * 校验消息体\n\t */\n\tprivate void checkChatReBotMsg(ChatRobotMsgDto chatRobotMsgDto) {\n\n\t\tString webhookToken = chatRobotMsgDto.getWebhookToken();\n\t\tString msgType = chatRobotMsgDto.getMsgType();\n\t\tPreconditions.checkArgument(PublicUtil.isNotEmpty(webhookToken), \"钉钉机器人token为空\");\n\t\tPreconditions.checkArgument(PublicUtil.isNotEmpty(msgType), \"钉钉机器人消息类型为空\");\n\n\t\tif (RobotMsgTypeEnum.MARKDOWN.getName().equals(msgType)) {\n\t\t\tMarkdownDto markdown = chatRobotMsgDto.getMarkdown();\n\t\t\tString text = markdown.getText();\n\t\t\tString title = markdown.getTitle();\n\n\t\t\tPreconditions.checkArgument(PublicUtil.isNotEmpty(markdown), \"markdown类型消息体为空\");\n\t\t\tPreconditions.checkArgument(PublicUtil.isNotEmpty(text), \"markdown文档内容为空\");\n\t\t\tPreconditions.checkArgument(PublicUtil.isNotEmpty(title), \"markdown文档标题为空\");\n\t\t} else if (RobotMsgTypeEnum.LINK.getName().equals(msgType)) {\n\t\t\tLinkDto link = chatRobotMsgDto.getLink();\n\t\t\tString text = link.getText();\n\t\t\tString title = link.getTitle();\n\t\t\tString messageUrl = link.getMessageUrl();\n\n\t\t\tPreconditions.checkArgument(PublicUtil.isNotEmpty(link), \"link类型消息体空\");\n\t\t\tPreconditions.checkArgument(PublicUtil.isNotEmpty(text), \"link文档内容为空\");\n\t\t\tPreconditions.checkArgument(PublicUtil.isNotEmpty(title), \"link文档标题为空\");\n\t\t\tPreconditions.checkArgument(PublicUtil.isNotEmpty(messageUrl), \"link文档点击消息跳转的URL空\");\n\t\t} else if (RobotMsgTypeEnum.TEXT.getName().equals(msgType)) {\n\t\t\tTextDto text = chatRobotMsgDto.getText();\n\t\t\tAtDto at = chatRobotMsgDto.getAt();\n\t\t\tString content = text.getContent();\n\n\t\t\tPreconditions.checkArgument(PublicUtil.isNotEmpty(text), \"text类型消息体空\");\n\t\t\tPreconditions.checkArgument(PublicUtil.isNotEmpty(content), \"text类型消息体内容为空\");\n\n\t\t\tif (PublicUtil.isNotEmpty(at)) {\n\t\t\t\tString[] atMobiles = at.getAtMobiles();\n\t\t\t\tif (PublicUtil.isNotEmpty(atMobiles)) {\n\t\t\t\t\tfor (String atMobile : atMobiles) {\n\t\t\t\t\t\tPreconditions.checkArgument(ValidateUtil.isMobileNumber(atMobile), \"手机号码:\" + atMobile + \"格式错误\");\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t} else {\n\t\t\tthrow new IllegalArgumentException(\"钉钉机器人消息类型错误\");\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-opc/src/main/java/com/paascloud/provider/web/rpc/OpcAttachmentFeignClient.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：OpcAttachmentFeignClient.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.web.rpc;\n\nimport com.paascloud.base.exception.BusinessException;\nimport com.paascloud.core.support.BaseController;\nimport com.paascloud.provider.exceptions.OpcBizException;\nimport com.paascloud.provider.model.domain.OptAttachment;\nimport com.paascloud.provider.model.dto.oss.*;\nimport com.paascloud.provider.service.OpcAttachmentService;\nimport com.paascloud.provider.service.OpcOssFeignApi;\nimport com.paascloud.provider.service.OpcOssService;\nimport com.paascloud.wrapper.WrapMapper;\nimport com.paascloud.wrapper.Wrapper;\nimport com.qiniu.common.QiniuException;\nimport io.swagger.annotations.Api;\nimport io.swagger.annotations.ApiOperation;\nimport org.springframework.http.MediaType;\nimport org.springframework.web.bind.annotation.RequestBody;\nimport org.springframework.web.bind.annotation.RequestPart;\nimport org.springframework.web.bind.annotation.RestController;\nimport org.springframework.web.multipart.MultipartFile;\n\nimport javax.annotation.Resource;\nimport java.util.List;\n\n/**\n * The class Opc attachment feign client.\n *\n * @author paascloud.net@gmail.com\n */\n@RestController\n@Api(value = \"API - OpcAttachmentFeignClient\", produces = MediaType.APPLICATION_JSON_UTF8_VALUE)\npublic class OpcAttachmentFeignClient extends BaseController implements OpcOssFeignApi {\n\n\t@Resource\n\tprivate OpcAttachmentService opcAttachmentService;\n\t@Resource\n\tprivate OpcOssService opcOssService;\n\n\t@Override\n\t@ApiOperation(httpMethod = \"POST\", value = \"上传文件\")\n\tpublic Wrapper<OptUploadFileRespDto> uploadFile(@RequestBody OptUploadFileReqDto optUploadFileReqDto) throws OpcBizException {\n\t\tOptUploadFileRespDto result;\n\t\ttry {\n\t\t\tlogger.info(\"rpcUploadFile - RPC上传附件信息. optUploadFileReqDto={}\", optUploadFileReqDto);\n\t\t\tresult = opcAttachmentService.rpcUploadFile(optUploadFileReqDto);\n\t\t} catch (BusinessException ex) {\n\t\t\tlogger.error(\"RPC上传附件信息, 出现异常={}\", ex.getMessage(), ex);\n\t\t\treturn WrapMapper.wrap(ex);\n\t\t} catch (Exception e) {\n\t\t\tlogger.error(\"RPC上传附件信息, 出现异常={}\", e.getMessage(), e);\n\t\t\treturn WrapMapper.error();\n\t\t}\n\t\treturn WrapMapper.wrap(Wrapper.SUCCESS_CODE, \"操作成功\", result);\n\t}\n\n\t@Override\n\t@ApiOperation(httpMethod = \"POST\", value = \"获取附件完整路径\")\n\tpublic Wrapper<String> getFileUrl(@RequestBody OptGetUrlRequest optGetUrlRequest) {\n\t\tString result;\n\t\ttry {\n\t\t\tlogger.info(\"getFileUrl - 获取附件完整路径. optGetUrlRequest={}\", optGetUrlRequest);\n\t\t\tresult = opcAttachmentService.rpcGetFileUrl(optGetUrlRequest);\n\t\t} catch (BusinessException ex) {\n\t\t\tlogger.error(\"RPC获取附件完整路径, 出现异常={}\", ex.getMessage(), ex);\n\t\t\treturn WrapMapper.wrap(ex);\n\t\t} catch (Exception e) {\n\t\t\tlogger.error(\"RPC获取附件完整路径, 出现异常={}\", e.getMessage(), e);\n\t\t\treturn WrapMapper.error();\n\t\t}\n\t\treturn WrapMapper.ok(result);\n\t}\n\n\t@Override\n\tpublic Wrapper<List<ElementImgUrlDto>> listFileUrl(@RequestBody OptBatchGetUrlRequest urlRequest) {\n\t\tlogger.info(\"getFileUrl - 批量获取url链接. urlRequest={}\", urlRequest);\n\t\tList<ElementImgUrlDto> result = opcAttachmentService.listFileUrl(urlRequest);\n\t\treturn WrapMapper.ok(result);\n\t}\n\n\t@Override\n\tpublic Wrapper<OptUploadFileRespDto> handleFileUpload(@RequestPart(value = \"file\") MultipartFile file) {\n\t\treturn null;\n\t}\n\n\t@Override\n\tpublic void deleteExpireFile() {\n\t\t// 1.查询过期的文件\n\t\tList<OptAttachment> list = opcAttachmentService.listExpireFile();\n\t\t// 2.删除这些文件\n\t\tfor (final OptAttachment attachment : list) {\n\t\t\ttry {\n\t\t\t\topcAttachmentService.deleteFile(attachment.getPath() + attachment.getName(), attachment.getBucketName(), attachment.getId());\n\t\t\t} catch (QiniuException e) {\n\t\t\t\tlogger.info(\"删除文件失败, attachmentId={}\", attachment.getId(), e);\n\t\t\t}\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-opc/src/main/java/com/paascloud/provider/web/rpc/OpcGaodeFeignClient.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：OpcGaodeFeignClient.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.web.rpc;\n\nimport com.paascloud.core.support.BaseController;\nimport com.paascloud.provider.model.dto.gaode.GaodeLocation;\nimport com.paascloud.provider.service.OpcGaodeFeignApi;\nimport com.paascloud.provider.utils.GaoDeUtil;\nimport com.paascloud.wrapper.WrapMapper;\nimport com.paascloud.wrapper.Wrapper;\nimport io.swagger.annotations.Api;\nimport io.swagger.annotations.ApiOperation;\nimport org.springframework.http.MediaType;\nimport org.springframework.web.bind.annotation.RequestParam;\nimport org.springframework.web.bind.annotation.RestController;\n\n/**\n * The class Opc attachment feign client.\n *\n * @author paascloud.net@gmail.com\n */\n@RestController\n@Api(value = \"API - OpcGaodeFeignClient\", produces = MediaType.APPLICATION_JSON_UTF8_VALUE)\npublic class OpcGaodeFeignClient extends BaseController implements OpcGaodeFeignApi {\n\n\t@Override\n\t@ApiOperation(httpMethod = \"POST\", value = \"根据IP获取位置信息\")\n\tpublic Wrapper<GaodeLocation> getLocationByIpAddr(@RequestParam(\"ipAddr\") String ipAddr) {\n\t\tString temp = \"127.0.\";\n\t\tString temp2 = \"192.168.\";\n\t\tif (ipAddr.startsWith(temp) || ipAddr.startsWith(temp2)) {\n\t\t\tipAddr = \"111.199.188.14\";\n\t\t}\n\t\treturn WrapMapper.ok(GaoDeUtil.getCityByIpAddr(ipAddr));\n\t}\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-opc/src/main/java/com/paascloud/provider/web/rpc/OpcMqMessageFeignClient.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：OpcMqMessageFeignClient.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.web.rpc;\n\n\nimport com.github.pagehelper.PageInfo;\nimport com.paascloud.base.dto.MessageQueryDto;\nimport com.paascloud.base.dto.MqMessageVo;\nimport com.paascloud.core.support.BaseController;\nimport com.paascloud.provider.service.MqMessageService;\nimport com.paascloud.provider.service.OpcMqMessageFeignApi;\nimport com.paascloud.wrapper.WrapMapper;\nimport com.paascloud.wrapper.Wrapper;\nimport io.swagger.annotations.Api;\nimport io.swagger.annotations.ApiOperation;\nimport org.springframework.http.MediaType;\nimport org.springframework.web.bind.annotation.RequestBody;\nimport org.springframework.web.bind.annotation.RequestParam;\nimport org.springframework.web.bind.annotation.RestController;\n\nimport javax.annotation.Resource;\nimport java.util.List;\n\n/**\n * Mq 消息.\n *\n * @author paascloud.net @gmail.com\n */\n@RestController\n@Api(value = \"API - OpcMqMessageFeignClient\", produces = MediaType.APPLICATION_JSON_UTF8_VALUE)\npublic class OpcMqMessageFeignClient extends BaseController implements OpcMqMessageFeignApi {\n\t@Resource\n\tprivate MqMessageService mqMessageService;\n\n\t@Override\n\t@ApiOperation(httpMethod = \"POST\", value = \"查询含有的messageKey\")\n\tpublic Wrapper<List<String>> queryMessageKeyList(@RequestParam(\"messageKeyList\") List<String> messageKeyList) {\n\t\tlogger.info(\"查询消息KEY. messageKeyList={}\", messageKeyList);\n\t\treturn WrapMapper.ok(mqMessageService.queryMessageKeyList(messageKeyList));\n\t}\n\n\t@Override\n\tpublic Wrapper<PageInfo<MqMessageVo>> queryMessageListWithPage(@RequestBody MessageQueryDto messageQueryDto) {\n\t\treturn mqMessageService.queryMessageListWithPage(messageQueryDto);\n\t}\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-opc/src/main/resources/META-INF/spring-devtools.properties",
    "content": "restart.include.mapper=/mapper-[\\\\w-\\\\.]+jar\nrestart.include.pagehelper=/pagehelper-[\\\\w-\\\\.]+jar"
  },
  {
    "path": "paascloud-provider/paascloud-provider-opc/src/main/resources/ValidationMessages.properties",
    "content": ""
  },
  {
    "path": "paascloud-provider/paascloud-provider-opc/src/main/resources/application.yml",
    "content": "server:\n  port: 8070\n\nspring:\n  profiles:\n    active: dev\n  application:\n    name: @pom.artifactId@\n  datasource:\n    username: root\n    password: 123456"
  },
  {
    "path": "paascloud-provider/paascloud-provider-opc/src/main/resources/banner.txt",
    "content": "${AnsiColor.BRIGHT_CYAN}\n                                  .__                   .___                  __\n___________  _____    ______ ____ |  |   ____  __ __  __| _/     ____   _____/  |_\n\\____ \\__  \\ \\__  \\  /  ___// ___\\|  |  /  _ \\|  |  \\/ __ |     /    \\_/ __ \\   __\\\n|  |_> > __ \\_/ __ \\_\\___ \\\\  \\___|  |_(  <_> )  |  / /_/ |    |   |  \\  ___/|  |\n|   __(____  (____  /____  >\\___  >____/\\____/|____/\\____ | /\\ |___|  /\\___  >__|\n|__|       \\/     \\/     \\/     \\/ Powered by liuzhaoming\\/ \\/      \\/     \\/"
  },
  {
    "path": "paascloud-provider/paascloud-provider-opc/src/main/resources/bootstrap.yml",
    "content": "spring:\n  cloud:\n    config:\n      fail-fast: true\n      discovery:\n        service-id: paascloud-discovery\n        enabled: true\n      label: ${spring.profiles.active}\n      profile: ${spring.profiles.active}\n      username: admin\n      password: admin\n\neureka:\n  client:\n    serviceUrl:\n      defaultZone: http://root:root@paascloud-eureka:8761/eureka/\n  instance:\n    instance-id: ${spring.application.name}:${spring.cloud.client.ipAddress}:${server.port}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-opc/src/main/resources/conf/liquibase.properties",
    "content": "spring.datasource.driver-class-name= com.mysql.jdbc.Driver\nspring.datasource.url=jdbc:mysql://paascloud-db-mysql:3306/paascloud_opc?characterEncoding=utf8&useSSL=false\nspring.datasource.username= root\nspring.datasource.password= 123456"
  },
  {
    "path": "paascloud-provider/paascloud-provider-opc/src/main/resources/liquibase/index.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<databaseChangeLog\n        xmlns=\"http://www.liquibase.org/xml/ns/dbchangelog\"\n        xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n        xsi:schemaLocation=\"http://www.liquibase.org/xml/ns/dbchangelog\n         http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.1.xsd\">\n</databaseChangeLog>"
  },
  {
    "path": "paascloud-provider/paascloud-provider-opc/src/main/resources/logback-spring.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<configuration>\n    <include resource=\"org/springframework/boot/logging/logback/defaults.xml\"/>\n    ​\n    <springProperty scope=\"context\" name=\"springAppName\" source=\"spring.application.name\"/>\n    <!-- Example for logging into the build folder of your project -->\n    <property name=\"LOG_FILE\" value=\"/data/logs/paascloud/${springAppName}/${springAppName}\"/>\n    ​\n    <property name=\"CONSOLE_LOG_PATTERN\" value=\"%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr([${springAppName:-},%X{X-B3-TraceId:-},%X{X-B3-SpanId:-},%X{X-B3-ParentSpanId:-},%X{X-Span-Export:-}]){yellow} %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}\"/>\n\n    <!-- Appender to log to console -->\n    <appender name=\"console\" class=\"ch.qos.logback.core.ConsoleAppender\">\n        <filter class=\"ch.qos.logback.classic.filter.ThresholdFilter\">\n            <!-- Minimum logging level to be presented in the console logs -->\n            <level>DEBUG</level>\n        </filter>\n        <encoder>\n            <pattern>${CONSOLE_LOG_PATTERN}</pattern>\n            <charset>utf8</charset>\n        </encoder>\n    </appender>\n\n    <!-- Appender to log to file -->\n    <appender name=\"flatfile\" class=\"ch.qos.logback.core.rolling.RollingFileAppender\">\n        <file>${LOG_FILE}</file>\n        <rollingPolicy class=\"ch.qos.logback.core.rolling.TimeBasedRollingPolicy\">\n            <fileNamePattern>${LOG_FILE}.%d{yyyy-MM-dd}.gz</fileNamePattern>\n            <maxHistory>7</maxHistory>\n        </rollingPolicy>\n        <encoder>\n            <pattern>${CONSOLE_LOG_PATTERN}</pattern>\n            <charset>utf8</charset>\n        </encoder>\n    </appender>\n    ​\n    <!-- Appender to log to file in a JSON format -->\n    <appender name=\"logstash\" class=\"ch.qos.logback.core.rolling.RollingFileAppender\">\n        <file>${LOG_FILE}.json</file>\n        <rollingPolicy class=\"ch.qos.logback.core.rolling.TimeBasedRollingPolicy\">\n            <fileNamePattern>${LOG_FILE}.json.%d{yyyy-MM-dd}.gz</fileNamePattern>\n            <maxHistory>7</maxHistory>\n        </rollingPolicy>\n        <encoder class=\"net.logstash.logback.encoder.LoggingEventCompositeJsonEncoder\">\n            <providers>\n                <timestamp>\n                    <timeZone>UTC</timeZone>\n                </timestamp>\n                <pattern>\n                    <pattern>\n                        {\n                        \"severity\": \"%level\",\n                        \"service\": \"${springAppName:-}\",\n                        \"trace\": \"%X{X-B3-TraceId:-}\",\n                        \"span\": \"%X{X-B3-SpanId:-}\",\n                        \"parent\": \"%X{X-B3-ParentSpanId:-}\",\n                        \"exportable\": \"%X{X-Span-Export:-}\",\n                        \"pid\": \"${PID:-}\",\n                        \"thread\": \"%thread\",\n                        \"class\": \"%logger{40}\",\n                        \"rest\": \"%message\"\n                        }\n                    </pattern>\n                </pattern>\n            </providers>\n        </encoder>\n    </appender>\n\n    <appender name=\"MyBatisStatistics\" class=\"ch.qos.logback.core.rolling.RollingFileAppender\">\n        <rollingPolicy class=\"ch.qos.logback.core.rolling.TimeBasedRollingPolicy\">\n            <fileNamePattern>${LOG_FILE}.sql.%d{yyyy-MM-dd}.gz</fileNamePattern>\n            <maxHistory>10</maxHistory>\n        </rollingPolicy>\n        <encoder>\n            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36}-%msg%n</pattern>\n        </encoder>\n    </appender>\n\n    <logger name=\"com.paascloud.provider.mapper\" level=\"DEBUG\">\n        <appender-ref ref=\"MyBatisStatistics\" />\n    </logger>\n    ​\n    <root level=\"DEBUG\">\n        <appender-ref ref=\"console\"/>\n        <appender-ref ref=\"logstash\"/>\n        <appender-ref ref=\"flatfile\"/>\n    </root>\n</configuration>"
  },
  {
    "path": "paascloud-provider/paascloud-provider-opc/src/main/resources/mapper/OpcSmsSettingMapper.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n<!DOCTYPE mapper PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\" \"http://mybatis.org/dtd/mybatis-3-mapper.dtd\" >\n<mapper namespace=\"com.paascloud.provider.mapper.OpcSmsSettingMapper\">\n    <resultMap id=\"BaseResultMap\" type=\"com.paascloud.provider.model.domain.OpcSmsSetting\">\n        <id column=\"id\" property=\"id\" jdbcType=\"BIGINT\"/>\n        <result column=\"version\" property=\"version\" jdbcType=\"INTEGER\"/>\n        <result column=\"again_send_time\" property=\"againSendTime\" jdbcType=\"INTEGER\"/>\n        <result column=\"invalid_time\" property=\"invalidTime\" jdbcType=\"INTEGER\"/>\n        <result column=\"type\" property=\"type\" jdbcType=\"VARCHAR\"/>\n        <result column=\"type_desc\" property=\"typeDesc\" jdbcType=\"VARCHAR\"/>\n        <result column=\"templet_code\" property=\"templetCode\" jdbcType=\"VARCHAR\"/>\n        <result column=\"templet_content\" property=\"templetContent\" jdbcType=\"VARCHAR\"/>\n        <result column=\"send_max_num\" property=\"sendMaxNum\" jdbcType=\"INTEGER\"/>\n        <result column=\"ip_send_max_num\" property=\"ipSendMaxNum\" jdbcType=\"INTEGER\"/>\n        <result column=\"remark\" property=\"remark\" jdbcType=\"VARCHAR\"/>\n        <result column=\"creator\" property=\"creator\" jdbcType=\"VARCHAR\"/>\n        <result column=\"creator_id\" property=\"creatorId\" jdbcType=\"BIGINT\"/>\n        <result column=\"created_time\" property=\"createdTime\" jdbcType=\"TIMESTAMP\"/>\n        <result column=\"last_operator\" property=\"lastOperator\" jdbcType=\"VARCHAR\"/>\n        <result column=\"last_operator_id\" property=\"lastOperatorId\" jdbcType=\"BIGINT\"/>\n        <result column=\"update_time\" property=\"updateTime\" jdbcType=\"TIMESTAMP\"/>\n        <result column=\"yn\" property=\"yn\" jdbcType=\"INTEGER\"/>\n    </resultMap>\n</mapper>"
  },
  {
    "path": "paascloud-provider/paascloud-provider-opc/src/main/resources/mapper/OptAttachmentMapper.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n<!DOCTYPE mapper PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\" \"http://mybatis.org/dtd/mybatis-3-mapper.dtd\" >\n<mapper namespace=\"com.paascloud.provider.mapper.OptAttachmentMapper\">\n  <resultMap id=\"BaseResultMap\" type=\"com.paascloud.provider.model.domain.OptAttachment\">\n    <id column=\"id\" property=\"id\" jdbcType=\"BIGINT\"/>\n    <result column=\"version\" property=\"version\" jdbcType=\"INTEGER\"/>\n    <result column=\"center_name\" property=\"centerName\" jdbcType=\"VARCHAR\"/>\n    <result column=\"bucket_name\" property=\"bucketName\" jdbcType=\"VARCHAR\"/>\n    <result column=\"ref_no\" property=\"refNo\" jdbcType=\"VARCHAR\"/>\n    <result column=\"name\" property=\"name\" jdbcType=\"VARCHAR\"/>\n    <result column=\"path\" property=\"path\" jdbcType=\"VARCHAR\"/>\n    <result column=\"type\" property=\"type\" jdbcType=\"VARCHAR\"/>\n    <result column=\"format\" property=\"format\" jdbcType=\"VARCHAR\"/>\n    <result column=\"description\" property=\"description\" jdbcType=\"VARCHAR\"/>\n    <result column=\"creator\" property=\"creator\" jdbcType=\"VARCHAR\"/>\n    <result column=\"creator_id\" property=\"creatorId\" jdbcType=\"BIGINT\"/>\n    <result column=\"created_time\" property=\"createdTime\" jdbcType=\"TIMESTAMP\"/>\n    <result column=\"last_operator\" property=\"lastOperator\" jdbcType=\"VARCHAR\"/>\n    <result column=\"last_operator_id\" property=\"lastOperatorId\" jdbcType=\"BIGINT\"/>\n    <result column=\"update_time\" property=\"updateTime\" jdbcType=\"TIMESTAMP\"/>\n  </resultMap>\n  <delete id=\"deleteByIdList\">\n    delete from pc_opt_attachment\n    where id in\n    <foreach collection=\"idList\" item=\"item\" index=\"index\" open=\"(\" separator=\",\" close=\")\">\n      #{item}\n    </foreach>\n  </delete>\n  <select id=\"queryAttachment\" resultType=\"com.paascloud.provider.model.dto.attachment.OptAttachmentRespDto\">\n    SELECT\n    id,\n    bucket_name,\n    ref_no,\n    path,\n    name,\n    type,\n    format,\n    description\n    FROM\n    pc_opt_attachment\n    <where>\n      <if test=\" id != null\">\n        id = #{id}\n      </if>\n      <if test=\" refNo != null and refNo != ''\">\n        ref_no = #{refNo}\n      </if>\n    </where>\n  </select>\n  <select id=\"queryAttachmentByRefNo\" resultType=\"java.lang.Long\">\n    SELECT id\n    FROM\n      pc_opt_attachment\n    WHERE\n      ref_no = #{refNo}\n  </select>\n  <select id=\"listExpireFile\" resultType=\"com.paascloud.provider.model.domain.OptAttachment\">\n    SELECT\n      id,\n      bucket_name,\n      path,\n      name\n    FROM\n      pc_opt_attachment\n    WHERE\n      ref_no = ''\n      AND DATE_SUB(CURDATE(), INTERVAL 1 DAY) &gt; date(created_time)\n  </select>\n</mapper>"
  },
  {
    "path": "paascloud-provider/paascloud-provider-opc/src/main/resources/templates/mail/sendRegisterSuccessTemplate.ftl",
    "content": "<html>\n<body>\n    <h3>尊敬的,  ${username}, 您好!</h3>\n\n    感谢您注册 paascloud快乐学习网, 请您在24小时内点击下面的认证链接, 完成账号邮箱认证。\n    ${url}\n    过期后链接将会自动失效(如果无法点击该链接, 可以将链接复制并粘帖到浏览器的地址输入框, 然后单击回车即可)。\n    如果您已经通过验证了, 请忽略这封邮件。\n    该邮件为系统自动发出, 请勿回复！\n\n    paascloud.net\n    ${dateTime}\n    Aug 8, 2017 2:05:58 PM\n</body>\n</html>"
  },
  {
    "path": "paascloud-provider/paascloud-provider-opc/src/main/resources/templates/mail/sendRegisterVerifyCodeTemplate.vm",
    "content": "<html>\n<body>\n    <h3>尊敬的,  ${!username}, 您好!</h3>\n\n    感谢您注册 paascloud快乐学习网, 请您在24小时内点击下面的认证链接, 完成账号邮箱认证。\n    ${!url}\n    过期后链接将会自动失效(如果无法点击该链接, 可以将链接复制并粘帖到浏览器的地址输入框, 然后单击回车即可)。\n    如果您已经通过验证了, 请忽略这封邮件。\n    该邮件为系统自动发出, 请勿回复！\n\n    paascloud.net\n    ${!dateTime}\n    Aug 8, 2017 2:05:58 PM\n</body>\n</html>"
  },
  {
    "path": "paascloud-provider/paascloud-provider-opc/src/test/java/com/paascloud/provider/PaasCloudOmcApplicationTests.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：PaasCloudOmcApplicationTests.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider;\n\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\nimport org.springframework.boot.test.context.SpringBootTest;\nimport org.springframework.test.context.junit4.SpringRunner;\n\n@RunWith(SpringRunner.class)\n@SpringBootTest\npublic class PaasCloudOmcApplicationTests {\n\tprotected final Logger logger = LoggerFactory.getLogger(this.getClass());\n\t@Test\n\tpublic void contextLoads() {\n\n\t}\n\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-opc/src/test/java/com/paascloud/provider/aliyun/MqProducerTest.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：MqProducerTest.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.aliyun;\n\nimport com.paascloud.provider.PaasCloudOmcApplicationTests;\n\n\npublic class MqProducerTest extends PaasCloudOmcApplicationTests {\n\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-opc/src/test/java/com/paascloud/provider/aliyun/OptSmsServiceTest.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：OptSmsServiceTest.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.aliyun;\n\nimport com.aliyuncs.dysmsapi.model.v20170525.SendSmsRequest;\nimport com.aliyuncs.dysmsapi.model.v20170525.SendSmsResponse;\nimport com.paascloud.provider.PaasCloudOmcApplicationTests;\nimport com.paascloud.provider.service.OptSmsService;\nimport org.junit.Test;\n\nimport javax.annotation.Resource;\n\npublic class OptSmsServiceTest extends PaasCloudOmcApplicationTests {\n\n\t@Resource\n\tprivate OptSmsService optSmsService;\n\n\t@Test\n\tpublic void sendMessageProducerTest() throws InterruptedException {\n\n\n\t\tSendSmsRequest request = new SendSmsRequest();\n\n\t\t//必填:待发送手机号\n\t\trequest.setPhoneNumbers(\"13718891700\");\n\t\t//必填:短信签名-可在短信控制台中找到\n\t\trequest.setSignName(\"快乐学习网\");\n\t\t//必填:短信模板-可在短信控制台中找到\n\t\trequest.setTemplateCode(\"SMS_78725128\");\n\t\t//可选:模板中的变量替换JSON串,如模板内容为\"亲爱的${name},您的验证码为${code}\"时,此处的值为\n\t\trequest.setTemplateParam(\"{\\\"code\\\":\\\"963852\\\"}\");\n\n\t\t//选填-上行短信扩展码(无特殊需求用户请忽略此字段)\n\t\t//request.setSmsUpExtendCode(\"90997\");\n\n\t\t//可选:outId为提供给业务方扩展字段,最终在短信回执消息中将此值带回给调用者\n\t\trequest.setOutId(\"yourOutId\");\n\n\t\tSendSmsResponse sendSmsResponse = optSmsService.sendSms(request);\n\t\tlogger.info(\"发送 生产数据 sendSmsResponse={}\", sendSmsResponse);\n\t}\n\n\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-opc/src/test/java/com/paascloud/provider/mail/MailTest.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：MailTest.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.mail;\n\nimport com.google.common.collect.Maps;\nimport com.google.common.collect.Sets;\nimport com.paascloud.provider.PaasCloudOmcApplicationTests;\nimport com.paascloud.provider.service.OptFreeMarkerService;\nimport com.paascloud.provider.service.OptSendMailService;\nimport lombok.extern.slf4j.Slf4j;\nimport org.junit.Ignore;\nimport org.junit.Test;\n\nimport javax.annotation.Resource;\nimport java.util.Map;\nimport java.util.Set;\n@Slf4j\npublic class MailTest extends PaasCloudOmcApplicationTests{\n    @Resource\n    private OptSendMailService optSendMailService;\n    @Resource\n    private OptFreeMarkerService optVelocityService;\n    @Test\n    @Ignore\n    public void sendSimpleMailText() throws Exception {\n        String subject = \"测试sendSimpleMail邮件\";\n        String text = \"<html><body><img src=\\\"cid:weixin\\\" >123456</body></html>\";\n        Set<String> to = Sets.newHashSet();\n        to.add(\"xxxx@163.com\");\n        optSendMailService.sendSimpleMail(subject, text, to);\n        Thread.sleep(20000);\n    }\n\n    @Test\n    @Ignore\n    public void getTemplateText() throws Exception {\n        Map<String, Object> map = Maps.newHashMap();\n        map.put(\"username\", \"paascloud\");\n        map.put(\"url\", \"http://www.beian.gov.cn/uac/user/activeEmail?token=04fd7024ba324d6d841614a7d44507cd\");\n        map.put(\"dateTime\", \"2017-01-01 22:22:22\");\n        String templateLocation = \"mail/sendRegisterSuccessTemplate.ftl\";\n        String template = optVelocityService.getTemplate(map, templateLocation);\n        log.info(template);\n    }\n\n    @Test\n    public void sendTemplateMailTest() throws Exception {\n        Map<String, Object> map = Maps.newHashMap();\n        map.put(\"username\", \"paascloud\");\n        map.put(\"url\", \"http://www.beian.gov.cn/uac/user/activeEmail?token=04fd7024ba324d6d841614a7d44507cd\");\n        map.put(\"dateTime\", \"2017-01-01 22:22:22\");\n\n        String templateLocation = \"mail/sendRegisterSuccessTemplate.ftl\";\n        String text = optVelocityService.getTemplate(map, templateLocation);\n\n        String subject = \"测试sendSimpleMail邮件\";\n        Set<String> to = Sets.newHashSet();\n        to.add(\"xxxxx@163.com\");\n\n        int sendTemplateMail = optSendMailService.sendTemplateMail(subject, text, to);\n\n        log.info(\"sendTemplateMailTest={}\", sendTemplateMail);\n    }\n\n    @Test\n    public void sendTemplateMailTest2() {\n        Map<String, Object> map = Maps.newHashMap();\n        map.put(\"username\", \"paascloud-sendTemplateMailTest2\");\n        map.put(\"url\", \"http://www.beian.gov.cn/uac/user/activeEmail?token=04fd7024ba324d6d841614a7d44507cd\");\n        map.put(\"dateTime\", \"2017-01-01 22:22:22\");\n        String templateLocation = \"mail/sendRegisterSuccessTemplate.ftl\";\n\n        String subject = \"测试sendSimpleMail邮件\";\n        Set<String> to = Sets.newHashSet();\n        to.add(\"xxxx@qq.com\");\n\n        int sendTemplateMail = optSendMailService.sendTemplateMail(map, templateLocation, subject, to);\n\n        log.info(\"sendTemplateMailTest2={}\", sendTemplateMail);\n    }\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-opc/src/test/java/com/paascloud/provider/qiniu/OpcOssServiceTest.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：OpcOssServiceTest.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.qiniu;\n\nimport com.paascloud.config.properties.PaascloudProperties;\nimport com.paascloud.provider.PaasCloudOmcApplicationTests;\nimport com.paascloud.provider.service.OpcOssService;\nimport com.qiniu.common.QiniuException;\nimport org.junit.Test;\n\nimport javax.annotation.Resource;\nimport java.io.File;\nimport java.io.FileInputStream;\nimport java.io.IOException;\n\npublic class OpcOssServiceTest extends PaasCloudOmcApplicationTests {\n\n\t@Resource\n\tprivate OpcOssService optOssService;\n\t@Resource\n\tprivate PaascloudProperties paascloudProperties;\n\n\t@Test\n\tpublic void uploadFileTest() throws InterruptedException, IOException {\n\n\t\tFile file = new File(\"C:\\\\Users\\\\Lenovo\\\\Pictures\\\\love\\\\love6.jpg\");\n\n\t\tFileInputStream inputStream = new FileInputStream(file);\n\n//\t\tDefaultPutRet defaultPutRet = optOssService.uploadFile(inputStream, \"love6.jpg\", \"picture\", \"paascloud-oss-bucket\");\n//\t\tlogger.info(\"发送 生产数据 defaultPutRet={}\", defaultPutRet);\n\t}\n\n\t@Test\n\tpublic void deleteFileTest() throws QiniuException {\n\n\t\toptOssService.deleteFile(\"picture/2017-08-03/2a55cf5b4fab42d0984c7fa4c3d1f95f.jpg\", \"paascloud-oss-bucket\");\n\t\tlogger.info(\"删除成功\");\n\t}\n\n\t@Test\n\tpublic void batchDeleteFileTest() throws QiniuException {\n\t\tString[] arr = new String[]{\"love1.jpg\", \"image/jpg/love3.jpg\"};\n\n\t\toptOssService.batchDeleteFile(arr, \"paascloud-oss-bucket\");\n\t\tlogger.info(\"删除成功\");\n\t}\n\n\n\t@Test\n\tpublic void getFileUrlTest() throws QiniuException {\n\n\t\tString fileUrl = optOssService.getFileUrl(paascloudProperties.getQiniu().getOss().getPrivateHost(), \"alipay/QRCode14e5d60fb30d4f7ea83ed3ec936ec54d.png\", 3600L);\n\t\tlogger.info(\"获取File url成功 fileUrl={}\", fileUrl);\n\t}\n\n\t@Test\n\tpublic void getFileUrlTest2() throws QiniuException {\n\n\t\tString fileUrl = optOssService.getFileUrl(paascloudProperties.getQiniu().getOss().getPrivateHost(),\n\t\t\t\t\"alipay/QRCode/5be9c68b531f471bb85948a4954d5e6f.png\");\n\t\tlogger.info(\"获取File url成功 fileUrl={}\", fileUrl);\n\t}\n\n\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-opc/src/test/resources/generator/generatorConfig.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE generatorConfiguration\n        PUBLIC \"-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN\"\n        \"http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd\">\n\n<generatorConfiguration>\n    <properties resource=\"application.yml\"/>\n\n    <context id=\"Mysql\" targetRuntime=\"MyBatis3Simple\" defaultModelType=\"flat\">\n        <property name=\"beginningDelimiter\" value=\"`\"/>\n        <property name=\"endingDelimiter\" value=\"`\"/>\n\n        <plugin type=\"tk.mybatis.mapper.generator.MapperPlugin\">\n            <property name=\"mappers\" value=\"com.paascloud.core.mybatis.MyMapper\"/>\n        </plugin>\n\n        <jdbcConnection driverClass=\"com.mysql.jdbc.Driver\"\n                        connectionURL=\"jdbc:mysql://127.0.0.1:3306/paas_cloud\"\n                        userId=\"root\"\n                        password=\"123456\">\n        </jdbcConnection>\n\n        <javaModelGenerator targetPackage=\"test.mybatis.springboot.model\" targetProject=\"src/test/java\"/>\n\n        <sqlMapGenerator targetPackage=\"mapper\" targetProject=\"src/test/resources\"/>\n\n        <javaClientGenerator targetPackage=\"test.mybatis.springboot.mapper\" targetProject=\"src/test/java\"\n                             type=\"XMLMAPPER\"/>\n\n        <table tableName=\"%\">\n            <!--mysql 配置-->\n            <generatedKey column=\"id\" sqlStatement=\"Mysql\" identity=\"true\"/>\n            <!--oracle 配置-->\n            <!--<generatedKey column=\"id\" sqlStatement=\"select SEQ_{1}.nextval from dual\" identity=\"false\" type=\"pre\"/>-->\n        </table>\n    </context>\n</generatorConfiguration>"
  },
  {
    "path": "paascloud-provider/paascloud-provider-tpc/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n\txsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n\t<modelVersion>4.0.0</modelVersion>\n\n    <parent>\n        <groupId>com.liuzm.paascloud.provider</groupId>\n        <artifactId>paascloud-provider</artifactId>\n        <version>1.0</version>\n    </parent>\n\n    <artifactId>paascloud-provider-tpc</artifactId>\n    <packaging>jar</packaging>\n\n    <name>paascloud-provider-tpc</name>\n    <description>任务中心 - Task processing center</description>\n\n\t<properties>\n\t\t<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>\n\t\t<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>\n\t\t<java.version>1.8</java.version>\n\t</properties>\n\n\t<dependencies>\n        <dependency>\n            <groupId>org.apache.rocketmq</groupId>\n            <artifactId>rocketmq-client</artifactId>\n            <version>4.1.0-incubating</version>\n        </dependency>\n        <dependency>\n            <groupId>com.liuzm.paascloud.provider.api</groupId>\n            <artifactId>paascloud-provider-opc-api</artifactId>\n        </dependency>\n    <dependency>\n      <groupId>com.liuzm.paascloud.provider.api</groupId>\n      <artifactId>paascloud-provider-mdc-api</artifactId>\n    </dependency>\n        <dependency>\n            <groupId>mysql</groupId>\n            <artifactId>mysql-connector-java</artifactId>\n            <scope>runtime</scope>\n        </dependency>\n        <dependency>\n            <groupId>joda-time</groupId>\n            <artifactId>joda-time</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.mybatis.spring.boot</groupId>\n            <artifactId>mybatis-spring-boot-starter</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>tk.mybatis</groupId>\n            <artifactId>mapper-spring-boot-starter</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>com.github.pagehelper</groupId>\n            <artifactId>pagehelper-spring-boot-starter</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.springframework.boot</groupId>\n            <artifactId>spring-boot-starter-jdbc</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>com.alibaba</groupId>\n            <artifactId>druid-spring-boot-starter</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>de.codecentric</groupId>\n            <artifactId>spring-boot-admin-starter-client</artifactId>\n        </dependency>\n        <dependency>\n          <groupId>org.springframework.cloud</groupId>\n          <artifactId>spring-cloud-starter-feign</artifactId>\n        </dependency>\n    <dependency>\n      <groupId>com.liuzm.paascloud</groupId>\n      <artifactId>elastic-job-lite-starter</artifactId>\n      <version>1.0</version>\n    </dependency>\n    <dependency>\n      <groupId>com.liuzm.paascloud.provider.api</groupId>\n      <artifactId>paascloud-provider-tpc-api</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>com.liuzm.paascloud.provider.api</groupId>\n      <artifactId>paascloud-provider-uac-api</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.springframework.retry</groupId>\n      <artifactId>spring-retry</artifactId>\n    </dependency>\n  </dependencies>\n</project>\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-tpc/src/main/java/com/paascloud/PaasCloudTpcApplication.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：PaasCloudTpcApplication.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud;\n\nimport liquibase.integration.spring.SpringLiquibase;\nimport org.springframework.boot.SpringApplication;\nimport org.springframework.boot.autoconfigure.SpringBootApplication;\nimport org.springframework.cache.annotation.EnableCaching;\nimport org.springframework.cloud.client.discovery.EnableDiscoveryClient;\nimport org.springframework.cloud.netflix.feign.EnableFeignClients;\nimport org.springframework.cloud.netflix.hystrix.EnableHystrix;\nimport org.springframework.context.annotation.Bean;\nimport org.springframework.retry.annotation.EnableRetry;\nimport org.springframework.transaction.annotation.EnableTransactionManagement;\n\nimport javax.sql.DataSource;\n\n/**\n * The class Paas cloud mdc application.\n *\n * @author paascloud.net@gmail.com\n */\n@EnableRetry\n@EnableCaching\n@EnableHystrix\n@EnableFeignClients\n@EnableDiscoveryClient\n@SpringBootApplication\n@EnableTransactionManagement\npublic class PaasCloudTpcApplication {\n\n\t/**\n\t * The entry point of application.\n\t *\n\t * @param args the input arguments\n\t */\n\tpublic static void main(String[] args) {\n\t\tSpringApplication.run(PaasCloudTpcApplication.class, args);\n\t}\n\n\t@Bean\n\tpublic SpringLiquibase springLiquibase(DataSource dataSource) {\n\n\t\tSpringLiquibase springLiquibase = new SpringLiquibase();\n\n\t\tspringLiquibase.setDataSource(dataSource);\n\t\tspringLiquibase.setChangeLog(\"classpath:/liquibase/index.xml\");\n\n\t\treturn springLiquibase;\n\t}\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-tpc/src/main/java/com/paascloud/provider/config/MqBeanInitRunner.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：MqBeanInitRunner.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.config;\n\nimport com.alibaba.fastjson.JSON;\nimport com.paascloud.base.constant.GlobalConstant;\nimport com.paascloud.config.properties.PaascloudProperties;\nimport com.paascloud.core.registry.RegistryCenterFactory;\nimport com.paascloud.core.registry.base.CoordinatorRegistryCenter;\nimport com.paascloud.core.registry.base.ReliableMessageRegisterDto;\nimport com.paascloud.provider.listener.MqConsumerChangeListener;\nimport com.paascloud.provider.listener.MqProducerChangeListener;\nimport com.paascloud.provider.service.MqProducerBeanFactory;\nimport com.paascloud.provider.service.TpcMqProducerService;\nimport lombok.extern.slf4j.Slf4j;\nimport org.apache.curator.framework.CuratorFramework;\nimport org.apache.curator.framework.recipes.cache.TreeCache;\nimport org.springframework.boot.CommandLineRunner;\nimport org.springframework.core.Ordered;\nimport org.springframework.core.annotation.Order;\nimport org.springframework.stereotype.Component;\n\nimport javax.annotation.Resource;\nimport java.util.List;\n\n/**\n * The class Redis init runner.\n *\n * @author paascloud.net @gmail.com\n */\n@Component\n@Order(Ordered.HIGHEST_PRECEDENCE)\n@Slf4j\npublic class MqBeanInitRunner implements CommandLineRunner {\n\t@Resource\n\tprivate PaascloudProperties paascloudProperties;\n\t@Resource\n\tprivate MqProducerChangeListener producerChangeListener;\n\t@Resource\n\tprivate MqConsumerChangeListener consumerChangeListener;\n\t@Resource\n\tprivate TpcMqProducerService tpcMqProducerService;\n\n\t/**\n\t * Run.\n\t *\n\t * @param args the args\n\t */\n\t@Override\n\tpublic void run(String... args) throws Exception {\n\t\tCoordinatorRegistryCenter coordinatorRegistryCenter = RegistryCenterFactory.createCoordinatorRegistryCenter(paascloudProperties.getZk());\n\t\tList<String> childrenKeys = coordinatorRegistryCenter.getChildrenKeys(GlobalConstant.ZK_REGISTRY_PRODUCER_ROOT_PATH);\n\t\tthis.initMqListener(coordinatorRegistryCenter);\n\t\tfor (final String childrenKey : childrenKeys) {\n\t\t\tint count = coordinatorRegistryCenter.getNumChildren(GlobalConstant.ZK_REGISTRY_PRODUCER_ROOT_PATH + GlobalConstant.Symbol.SLASH + childrenKey);\n\t\t\tif (count == 0) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tString producerString = coordinatorRegistryCenter.getDirectly(GlobalConstant.ZK_REGISTRY_PRODUCER_ROOT_PATH + GlobalConstant.Symbol.SLASH + childrenKey);\n\t\t\tReliableMessageRegisterDto producerDto = JSON.parseObject(producerString, ReliableMessageRegisterDto.class);\n\t\t\tMqProducerBeanFactory.buildProducerBean(producerDto);\n\t\t\ttry {\n\t\t\t\ttpcMqProducerService.updateOnLineStatusByPid(producerDto.getProducerGroup());\n\t\t\t} catch (Exception e) {\n\t\t\t\tlog.error(\"更新生产者状态为离线出现异常, ex={}\", e.getMessage(), e);\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate void initMqListener(CoordinatorRegistryCenter coordinatorRegistryCenter) throws Exception {\n\t\tCuratorFramework cf = (CuratorFramework) coordinatorRegistryCenter.getRawClient();\n\t\tinitProducerListener(cf);\n\t\tinitConsumerListener(cf);\n\t}\n\n\n\tprivate void initProducerListener(CuratorFramework cf) throws Exception {\n\t\tTreeCache treeCache = new TreeCache(cf, GlobalConstant.ZK_REGISTRY_PRODUCER_ROOT_PATH);\n\t\ttreeCache.getListenable().addListener(producerChangeListener);\n\t\ttreeCache.start();\n\t}\n\n\tprivate void initConsumerListener(CuratorFramework cf) throws Exception {\n\t\tTreeCache treeCache = new TreeCache(cf, GlobalConstant.ZK_REGISTRY_CONSUMER_ROOT_PATH);\n\t\ttreeCache.getListenable().addListener(consumerChangeListener);\n\t\ttreeCache.start();\n\t}\n\n}"
  },
  {
    "path": "paascloud-provider/paascloud-provider-tpc/src/main/java/com/paascloud/provider/config/ResourceServerConfig.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：ResourceServerConfig.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.config;\n\nimport org.springframework.context.annotation.Configuration;\nimport org.springframework.security.config.annotation.web.builders.HttpSecurity;\nimport org.springframework.security.oauth2.config.annotation.web.configuration.EnableResourceServer;\nimport org.springframework.security.oauth2.config.annotation.web.configuration.ResourceServerConfigurerAdapter;\n\nimport javax.servlet.http.HttpServletResponse;\n\n/**\n * The class Resource server config.\n *\n * @author paascloud.net @gmail.com\n */\n@Configuration\n@EnableResourceServer\npublic class ResourceServerConfig extends ResourceServerConfigurerAdapter {\n\t@Override\n\tpublic void configure(HttpSecurity http) throws Exception {\n\t\thttp\n\t\t\t\t.headers().frameOptions().disable()\n\t\t\t\t.and()\n\t\t\t\t.csrf().disable()\n\t\t\t\t.exceptionHandling()\n\t\t\t\t.authenticationEntryPoint((request, response, authException) -> response.sendError(HttpServletResponse.SC_UNAUTHORIZED))\n\t\t\t\t.and()\n\t\t\t\t.authorizeRequests().antMatchers(\"/pay/alipayCallback\", \"/druid/**\", \"/swagger-ui.html\", \"/swagger-resources/**\", \"/v2/api-docs\", \"/api/applications\").permitAll()\n\t\t\t\t.anyRequest().authenticated();\n\t}\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-tpc/src/main/java/com/paascloud/provider/config/TpcWebMvcConfig.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：TpcWebMvcConfig.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.config;\n\nimport com.paascloud.core.config.PcObjectMapper;\nimport com.paascloud.core.config.SwaggerConfiguration;\nimport com.paascloud.core.interceptor.TokenInterceptor;\nimport org.springframework.context.annotation.Configuration;\nimport org.springframework.context.annotation.Import;\nimport org.springframework.http.converter.HttpMessageConverter;\nimport org.springframework.web.servlet.config.annotation.EnableWebMvc;\nimport org.springframework.web.servlet.config.annotation.InterceptorRegistry;\nimport org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;\nimport org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;\n\nimport javax.annotation.Resource;\nimport java.util.List;\n\n\n/**\n * The class Mdc web mvc config.\n *\n * @author paascloud.net @gmail.com\n */\n@Configuration\n@EnableWebMvc\n@Import(SwaggerConfiguration.class)\npublic class TpcWebMvcConfig extends WebMvcConfigurerAdapter {\n\n\t@Resource\n\tprivate TokenInterceptor vueViewInterceptor;\n\n\t@Override\n\tpublic void addResourceHandlers(ResourceHandlerRegistry registry) {\n\t\tregistry.addResourceHandler(\"/**\")\n\t\t\t\t.addResourceLocations(\"classpath:/META-INF/resources/\", \"classpath:/resources/\", \"classpath:/static/\");\n\t}\n\n\t/**\n\t * Add interceptors.\n\t *\n\t * @param registry the registry\n\t */\n\t@Override\n\tpublic void addInterceptors(InterceptorRegistry registry) {\n\t\tsuper.addInterceptors(registry);\n\t\tregistry.addInterceptor(vueViewInterceptor)\n\t\t\t\t.addPathPatterns(\"/**\")\n\t\t\t\t.excludePathPatterns(\"/swagger-resources/**\", \"*.js\", \"/**/*.js\", \"*.css\", \"/**/*.css\", \"*.html\", \"/**/*.html\");\n\t}\n\n\t@Override\n\tpublic void configureMessageConverters(List<HttpMessageConverter<?>> converters) {\n\t\tPcObjectMapper.buidMvcMessageConverter(converters);\n\t}\n\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-tpc/src/main/java/com/paascloud/provider/job/dataflow/HandleSendingMessageJob.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：HandleSendingMessageJob.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.job.dataflow;\n\nimport com.google.common.collect.Lists;\nimport com.paascloud.DateUtil;\nimport com.paascloud.elastic.lite.JobParameter;\nimport com.paascloud.elastic.lite.annotation.ElasticJobConfig;\nimport com.paascloud.elastic.lite.job.AbstractBaseDataflowJob;\nimport com.paascloud.provider.mapper.TpcMqConfirmMapper;\nimport com.paascloud.provider.model.domain.TpcMqMessage;\nimport com.paascloud.provider.model.dto.MessageTaskQueryDto;\nimport com.paascloud.provider.model.enums.JobTaskStatusEnum;\nimport com.paascloud.provider.model.enums.MqSendStatusEnum;\nimport com.paascloud.provider.service.TpcMqMessageService;\nimport lombok.extern.slf4j.Slf4j;\nimport org.springframework.beans.factory.annotation.Value;\nimport org.springframework.stereotype.Component;\nimport org.springframework.transaction.annotation.Transactional;\n\nimport javax.annotation.Resource;\nimport java.util.Calendar;\nimport java.util.Date;\nimport java.util.List;\n\n/**\n * 处理发送中的消息数据.\n *\n * @author paascloud.net @gmail.com\n */\n@Component\n@Slf4j\n@ElasticJobConfig(cron = \"0/30 * * * * ?\", jobParameter = \"fetchNum=200\")\npublic class HandleSendingMessageJob extends AbstractBaseDataflowJob<TpcMqMessage> {\n\t@Resource\n\tprivate TpcMqMessageService tpcMqMessageService;\n\t@Value(\"${paascloud.message.handleTimeout}\")\n\tprivate int timeOutMinute;\n\t@Value(\"${paascloud.message.maxSendTimes}\")\n\tprivate int messageMaxSendTimes;\n\n\t@Value(\"${paascloud.message.resendMultiplier}\")\n\tprivate int messageResendMultiplier;\n\t@Resource\n\tprivate TpcMqConfirmMapper tpcMqConfirmMapper;\n\n\t/**\n\t * Fetch job data list.\n\t *\n\t * @param jobParameter the job parameter\n\t *\n\t * @return the list\n\t */\n\t@Override\n\tprotected List<TpcMqMessage> fetchJobData(JobParameter jobParameter) {\n\t\tMessageTaskQueryDto query = new MessageTaskQueryDto();\n\t\tquery.setCreateTimeBefore(DateUtil.getBeforeTime(timeOutMinute));\n\t\tquery.setMessageStatus(MqSendStatusEnum.SENDING.sendStatus());\n\t\tquery.setFetchNum(jobParameter.getFetchNum());\n\t\tquery.setShardingItem(jobParameter.getShardingItem());\n\t\tquery.setShardingTotalCount(jobParameter.getShardingTotalCount());\n\t\tquery.setTaskStatus(JobTaskStatusEnum.TASK_CREATE.status());\n\t\treturn tpcMqMessageService.listMessageForWaitingProcess(query);\n\t}\n\n\t/**\n\t * Process job data.\n\t *\n\t * @param taskList the task list\n\t */\n\t@Override\n\t@Transactional(rollbackFor = Exception.class)\n\tprotected void processJobData(List<TpcMqMessage> taskList) {\n\t\tfor (TpcMqMessage message : taskList) {\n\n\t\t\tInteger resendTimes = message.getResendTimes();\n\t\t\tif (resendTimes >= messageMaxSendTimes) {\n\t\t\t\ttpcMqMessageService.setMessageToAlreadyDead(message.getId());\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tint times = (resendTimes == 0 ? 1 : resendTimes) * messageResendMultiplier;\n\t\t\tlong currentTimeInMillis = Calendar.getInstance().getTimeInMillis();\n\t\t\tlong needTime = currentTimeInMillis - times * 60 * 1000;\n\t\t\tlong hasTime = message.getUpdateTime().getTime();\n\t\t\t// 判断是否达到了可以再次发送的时间条件\n\t\t\tif (hasTime > needTime) {\n\t\t\t\tlog.debug(\"currentTime[\" + com.xiaoleilu.hutool.date.DateUtil.formatDateTime(new Date()) + \"],[SENDING]消息上次发送时间[\" + com.xiaoleilu.hutool.date.DateUtil.formatDateTime(message.getUpdateTime()) + \"],必须过了[\" + times + \"]分钟才可以再发送。\");\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// 前置状态\n\t\t\tList<Integer> preStatusList = Lists.newArrayList(JobTaskStatusEnum.TASK_CREATE.status());\n\t\t\t// 设置任务状态为执行中\n\t\t\tmessage.setPreStatusList(preStatusList);\n\t\t\tmessage.setTaskStatus(JobTaskStatusEnum.TASK_EXETING.status());\n\t\t\tint updateRes = tpcMqMessageService.updateMqMessageTaskStatus(message);\n\t\t\tif (updateRes > 0) {\n\t\t\t\ttry {\n\n\t\t\t\t\t// 查询是否全部订阅者都确认了消息 是 则更新消息状态完成, 否则重发消息\n\n\t\t\t\t\tint count = tpcMqConfirmMapper.selectUnConsumedCount(message.getMessageKey());\n\t\t\t\t\tint status = JobTaskStatusEnum.TASK_CREATE.status();\n\t\t\t\t\tif (count < 1) {\n\t\t\t\t\t\tTpcMqMessage update = new TpcMqMessage();\n\t\t\t\t\t\tupdate.setMessageStatus(MqSendStatusEnum.FINISH.sendStatus());\n\t\t\t\t\t\tupdate.setId(message.getId());\n\t\t\t\t\t\ttpcMqMessageService.updateMqMessageStatus(update);\n\t\t\t\t\t\tstatus = JobTaskStatusEnum.TASK_SUCCESS.status();\n\t\t\t\t\t} else {\n\t\t\t\t\t\ttpcMqMessageService.resendMessageByMessageId(message.getId());\n\t\t\t\t\t}\n\n\t\t\t\t\t// 前置状态\n\t\t\t\t\tpreStatusList = Lists.newArrayList(JobTaskStatusEnum.TASK_EXETING.status());\n\t\t\t\t\t// 设置任务状态为执行中\n\t\t\t\t\tmessage.setPreStatusList(preStatusList);\n\t\t\t\t\tmessage.setTaskStatus(status);\n\t\t\t\t\ttpcMqMessageService.updateMqMessageTaskStatus(message);\n\t\t\t\t} catch (Exception e) {\n\t\t\t\t\tlog.error(\"重发失败 ex={}\", e.getMessage(), e);\n\t\t\t\t\t// 设置任务状态为执行中\n\t\t\t\t\tpreStatusList = Lists.newArrayList(JobTaskStatusEnum.TASK_EXETING.status());\n\t\t\t\t\tmessage.setPreStatusList(preStatusList);\n\t\t\t\t\tmessage.setTaskStatus(JobTaskStatusEnum.TASK_SUCCESS.status());\n\t\t\t\t\ttpcMqMessageService.updateMqMessageTaskStatus(message);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-tpc/src/main/java/com/paascloud/provider/job/dataflow/HandleWaitingConfirmMessageJob.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：HandleWaitingConfirmMessageJob.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.job.dataflow;\n\nimport com.google.common.collect.Lists;\nimport com.paascloud.DateUtil;\nimport com.paascloud.elastic.lite.JobParameter;\nimport com.paascloud.elastic.lite.annotation.ElasticJobConfig;\nimport com.paascloud.elastic.lite.job.AbstractBaseDataflowJob;\nimport com.paascloud.provider.model.dto.MessageTaskQueryDto;\nimport com.paascloud.provider.model.enums.JobTaskStatusEnum;\nimport com.paascloud.provider.model.enums.MqSendStatusEnum;\nimport com.paascloud.provider.service.TpcMqMessageService;\nimport com.paascloud.provider.service.UacRpcService;\nimport lombok.extern.slf4j.Slf4j;\nimport org.springframework.beans.factory.annotation.Value;\nimport org.springframework.stereotype.Component;\n\nimport javax.annotation.Resource;\nimport java.util.List;\n\n/**\n * 处理待确认的消息数据.\n *\n * @author paascloud.net @gmail.com\n */\n@Slf4j\n@Component\n@ElasticJobConfig(cron = \"0 0/10 * * * ?\", jobParameter = \"fetchNum=1000\")\npublic class HandleWaitingConfirmMessageJob extends AbstractBaseDataflowJob<String> {\n\t@Resource\n\tprivate TpcMqMessageService tpcMqMessageService;\n\t@Resource\n\tprivate UacRpcService uacRpcService;\n\t@Value(\"${paascloud.message.handleTimeout}\")\n\tprivate int timeOutMinute;\n\tprivate static final String PID_UAC = \"PID_UAC\";\n\n\t/**\n\t * Fetch job data list.\n\t *\n\t * @param jobParameter the job parameter\n\t *\n\t * @return the list\n\t */\n\t@Override\n\tprotected List<String> fetchJobData(JobParameter jobParameter) {\n\t\tMessageTaskQueryDto query = new MessageTaskQueryDto();\n\t\tquery.setCreateTimeBefore(DateUtil.getBeforeTime(timeOutMinute));\n\t\tquery.setMessageStatus(MqSendStatusEnum.WAIT_SEND.sendStatus());\n\t\tquery.setFetchNum(jobParameter.getFetchNum());\n\t\tquery.setShardingItem(jobParameter.getShardingItem());\n\t\tquery.setShardingTotalCount(jobParameter.getShardingTotalCount());\n\t\tquery.setTaskStatus(JobTaskStatusEnum.TASK_CREATE.status());\n\t\tquery.setProducerGroup(PID_UAC);\n\t\treturn tpcMqMessageService.queryWaitingConfirmMessageKeyList(query);\n\t}\n\n\t/**\n\t * Process job data.\n\t *\n\t * @param messageKeyList the message key list\n\t */\n\t@Override\n\tprotected void processJobData(List<String> messageKeyList) {\n\t\tif (messageKeyList == null) {\n\t\t\treturn;\n\t\t}\n\t\tList<String> resendMessageList = uacRpcService.queryWaitingConfirmMessageKeyList(messageKeyList);\n\t\tif (resendMessageList == null) {\n\t\t\tresendMessageList = Lists.newArrayList();\n\t\t}\n\t\tmessageKeyList.removeAll(resendMessageList);\n\t\ttpcMqMessageService.handleWaitingConfirmMessage(messageKeyList, resendMessageList);\n\t}\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-tpc/src/main/java/com/paascloud/provider/job/listener/HandleUserTokenJobListener.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：HandleUserTokenJobListener.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.job.listener;\n\nimport com.dangdang.ddframe.job.executor.ShardingContexts;\nimport com.dangdang.ddframe.job.lite.api.listener.ElasticJobListener;\nimport com.paascloud.provider.model.dto.robot.ChatRobotMsgDto;\nimport com.paascloud.provider.model.factory.ChatRobotMsgFactory;\nimport com.paascloud.provider.service.OpcRpcService;\nimport lombok.extern.slf4j.Slf4j;\nimport org.springframework.beans.factory.annotation.Value;\n\nimport javax.annotation.Resource;\nimport java.util.concurrent.atomic.AtomicLong;\n\n/**\n * The class Handle user token job listener.\n *\n * @author paascloud.net @gmail.com\n */\n@Slf4j\npublic class HandleUserTokenJobListener implements ElasticJobListener {\n\n\t@Resource\n\tprivate OpcRpcService opcRpcService;\n\n\tprivate AtomicLong startTime = new AtomicLong();\n\tprivate AtomicLong endTimestamp = new AtomicLong();\n\t@Value(\"paascloud.dingTalk.webhookToken.jobListener\")\n\tprivate String webhookToken;\n\n\t/**\n\t * Before job executed.\n\t *\n\t * @param shardingContexts the sharding contexts\n\t */\n\t@Override\n\tpublic void beforeJobExecuted(ShardingContexts shardingContexts) {\n\t\tlog.info(\"beforeJobExecuted - shardingContexts={}\", shardingContexts);\n\t\tstartTime.set(System.currentTimeMillis());\n\t}\n\n\t/**\n\t * After job executed.\n\t *\n\t * @param shardingContexts the sharding contexts\n\t */\n\t@Override\n\tpublic void afterJobExecuted(ShardingContexts shardingContexts) {\n\t\tlog.info(\"afterJobExecuted - shardingContexts={}\", shardingContexts);\n\t\tendTimestamp.set(System.currentTimeMillis());\n\t\tlong exeTime = endTimestamp.get() - startTime.get();\n\t\tString message = String.format(\"jobName: %s | 执行完毕, 总耗时: %s\", shardingContexts.getJobName(), exeTime + \"毫秒\");\n\t\tthis.sendDingTalk(message);\n\t}\n\n\tprivate void sendDingTalk(String message) {\n\t\tlog.info(\"开始发送消息. message={}\", message);\n\t\tChatRobotMsgDto chatRobotMsgDto = ChatRobotMsgFactory.createChatRobotTextMsg(webhookToken, message, false, null);\n\t\tboolean result = opcRpcService.sendChatRobotMsg(chatRobotMsgDto);\n\t\tif (result) {\n\t\t\tlog.info(\"发送消息成功. message={}\", message);\n\t\t} else {\n\t\t\tlog.error(\"发送消息失败. message={}\", message);\n\t\t}\n\t}\n}"
  },
  {
    "path": "paascloud-provider/paascloud-provider-tpc/src/main/java/com/paascloud/provider/job/simple/DeleteRpcConsumerMessageJob.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：DeleteRpcConsumerMessageJob.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.job.simple;\n\nimport com.alibaba.fastjson.JSON;\nimport com.dangdang.ddframe.job.api.ShardingContext;\nimport com.dangdang.ddframe.job.api.simple.SimpleJob;\nimport com.paascloud.base.constant.AliyunMqTopicConstants;\nimport com.paascloud.base.dto.ShardingContextDto;\nimport com.paascloud.config.properties.PaascloudProperties;\nimport com.paascloud.core.generator.UniqueIdGenerator;\nimport com.paascloud.elastic.lite.annotation.ElasticJobConfig;\nimport com.paascloud.provider.model.dto.TpcMqMessageDto;\nimport com.paascloud.provider.service.TpcMqMessageService;\nimport lombok.extern.slf4j.Slf4j;\n\nimport javax.annotation.Resource;\n\n/**\n * 定时清理所有订阅者消费成功的消息数据.\n *\n * @author paascloud.net @gmail.com\n */\n@Slf4j\n@ElasticJobConfig(cron = \"0 0 0 1/1 * ?\")\npublic class DeleteRpcConsumerMessageJob implements SimpleJob {\n\t@Resource\n\tprivate PaascloudProperties paascloudProperties;\n\t@Resource\n\tprivate TpcMqMessageService tpcMqMessageService;\n\n\t/**\n\t * Execute.\n\t *\n\t * @param shardingContext the sharding context\n\t */\n\t@Override\n\tpublic void execute(final ShardingContext shardingContext) {\n\t\tShardingContextDto shardingContextDto = new ShardingContextDto(shardingContext.getShardingTotalCount(), shardingContext.getShardingItem());\n\t\tfinal TpcMqMessageDto message = new TpcMqMessageDto();\n\t\tmessage.setMessageBody(JSON.toJSONString(shardingContextDto));\n\t\tmessage.setMessageTag(AliyunMqTopicConstants.MqTagEnum.DELETE_CONSUMER_MESSAGE.getTag());\n\t\tmessage.setMessageTopic(AliyunMqTopicConstants.MqTopicEnum.TPC_TOPIC.getTopic());\n\t\tmessage.setProducerGroup(paascloudProperties.getAliyun().getRocketMq().getProducerGroup());\n\t\tString refNo = Long.toString(UniqueIdGenerator.generateId());\n\t\tmessage.setRefNo(refNo);\n\t\tmessage.setMessageKey(refNo);\n\t\ttpcMqMessageService.saveAndSendMessage(message);\n\t}\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-tpc/src/main/java/com/paascloud/provider/job/simple/DeleteRpcExpireFileJob.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：DeleteRpcExpireFileJob.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.job.simple;\n\nimport com.dangdang.ddframe.job.api.ShardingContext;\nimport com.dangdang.ddframe.job.api.simple.SimpleJob;\nimport com.paascloud.elastic.lite.annotation.ElasticJobConfig;\nimport com.paascloud.provider.service.OpcRpcService;\nimport lombok.extern.slf4j.Slf4j;\n\nimport javax.annotation.Resource;\n\n/**\n * 定时清理无效OSS文件.\n *\n * @author paascloud.net @gmail.com\n */\n@Slf4j\n@ElasticJobConfig(cron = \"0 0 0 1/1 * ?\")\npublic class DeleteRpcExpireFileJob implements SimpleJob {\n\n\t@Resource\n\tprivate OpcRpcService opcRpcService;\n\n\t/**\n\t * Execute.\n\t *\n\t * @param shardingContext the sharding context\n\t */\n\t@Override\n\tpublic void execute(final ShardingContext shardingContext) {\n\t\topcRpcService.deleteExpireFile();\n\t}\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-tpc/src/main/java/com/paascloud/provider/job/simple/DeleteRpcProducerMessageJob.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：DeleteRpcProducerMessageJob.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.job.simple;\n\nimport com.alibaba.fastjson.JSON;\nimport com.dangdang.ddframe.job.api.ShardingContext;\nimport com.dangdang.ddframe.job.api.simple.SimpleJob;\nimport com.paascloud.base.constant.AliyunMqTopicConstants;\nimport com.paascloud.config.properties.PaascloudProperties;\nimport com.paascloud.core.generator.UniqueIdGenerator;\nimport com.paascloud.elastic.lite.annotation.ElasticJobConfig;\nimport com.paascloud.provider.model.dto.TpcMqMessageDto;\nimport com.paascloud.provider.service.TpcMqMessageService;\nimport lombok.extern.slf4j.Slf4j;\n\nimport javax.annotation.Resource;\n\n/**\n * 定时清理所有生产者发送成功的消息数据.\n *\n * @author paascloud.net @gmail.com\n */\n@Slf4j\n@ElasticJobConfig(cron = \"0 0 1 1/1 * ?\")\npublic class DeleteRpcProducerMessageJob implements SimpleJob {\n\n\t@Resource\n\tprivate PaascloudProperties paascloudProperties;\n\t@Resource\n\tprivate TpcMqMessageService tpcMqMessageService;\n\n\t/**\n\t * Execute.\n\t *\n\t * @param shardingContext the sharding context\n\t */\n\t@Override\n\tpublic void execute(final ShardingContext shardingContext) {\n\n\t\tfinal TpcMqMessageDto message = new TpcMqMessageDto();\n\t\tmessage.setMessageBody(JSON.toJSONString(shardingContext));\n\t\tmessage.setMessageTag(AliyunMqTopicConstants.MqTagEnum.DELETE_PRODUCER_MESSAGE.getTag());\n\t\tmessage.setMessageTopic(AliyunMqTopicConstants.MqTopicEnum.TPC_TOPIC.getTopic());\n\t\tmessage.setProducerGroup(paascloudProperties.getAliyun().getRocketMq().getProducerGroup());\n\t\tString refNo = Long.toString(UniqueIdGenerator.generateId());\n\t\tmessage.setRefNo(refNo);\n\t\tmessage.setMessageKey(refNo);\n\t\ttpcMqMessageService.saveAndSendMessage(message);\n\t}\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-tpc/src/main/java/com/paascloud/provider/job/simple/HandleUserJwtTokenJob.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：HandleUserJwtTokenJob.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.job.simple;\n\nimport com.dangdang.ddframe.job.api.ShardingContext;\nimport com.dangdang.ddframe.job.api.simple.SimpleJob;\nimport com.paascloud.elastic.lite.annotation.ElasticJobConfig;\nimport com.paascloud.provider.service.UacRpcService;\nimport lombok.extern.slf4j.Slf4j;\n\nimport javax.annotation.Resource;\n\n/**\n * The class Spring simple job.\n *\n * @author paascloud.net @gmail.com\n */\n@Slf4j\n@ElasticJobConfig(cron = \"0 0/30 * * * ?\")\npublic class HandleUserJwtTokenJob implements SimpleJob {\n\t@Resource\n\tprivate UacRpcService uacRpcService;\n\n\t/**\n\t * Execute.\n\t *\n\t * @param shardingContext the sharding context\n\t */\n\t@Override\n\tpublic void execute(final ShardingContext shardingContext) {\n\t\tuacRpcService.batchUpdateTokenOffLine();\n\t}\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-tpc/src/main/java/com/paascloud/provider/listener/MqConsumerChangeListener.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：MqConsumerChangeListener.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.listener;\n\nimport com.alibaba.fastjson.JSON;\nimport com.google.common.base.Charsets;\nimport com.paascloud.base.constant.GlobalConstant;\nimport com.paascloud.core.registry.base.ReliableMessageRegisterDto;\nimport com.paascloud.core.registry.exception.RegExceptionHandler;\nimport com.paascloud.provider.service.MqProducerBeanFactory;\nimport com.paascloud.provider.service.TpcMqConsumerService;\nimport lombok.extern.slf4j.Slf4j;\nimport org.apache.curator.framework.CuratorFramework;\nimport org.apache.curator.framework.recipes.cache.ChildData;\nimport org.apache.curator.framework.recipes.cache.TreeCacheEvent;\nimport org.apache.curator.framework.recipes.cache.TreeCacheListener;\nimport org.apache.zookeeper.data.Stat;\nimport org.springframework.stereotype.Component;\n\nimport javax.annotation.Resource;\n\n/**\n * The class Mq consumer change listener.\n *\n * @author paascloud.net @gmail.com\n */\n@Slf4j\n@Component\npublic class MqConsumerChangeListener implements TreeCacheListener {\n\t@Resource\n\tprivate TpcMqConsumerService tpcMqConsumerService;\n\n\t/**\n\t * Child event.\n\t *\n\t * @param client the client\n\t * @param event  the event\n\t */\n\t@Override\n\tpublic void childEvent(final CuratorFramework client, final TreeCacheEvent event) {\n\t\tChildData data = event.getData();\n\t\tif (data == null) {\n\t\t\treturn;\n\t\t}\n\t\tString path = data.getPath();\n\t\tif (GlobalConstant.ZK_REGISTRY_CONSUMER_ROOT_PATH.equals(path) || GlobalConstant.ZK_REGISTRY_CONSUMER_ROOT_PATH.equals(path)) {\n\t\t\treturn;\n\t\t}\n\t\tString[] split = path.split(GlobalConstant.Symbol.SLASH);\n\t\tString dataStr = new String(data.getData());\n\t\tswitch (event.getType()) {\n\t\t\tcase NODE_ADDED:\n\t\t\t\tlog.info(\"MqConsumerChangeListener CHILD_ADDED path={}, data={}\", path, dataStr);\n\t\t\t\tif (split.length == GlobalConstant.Number.SIX_INT) {\n\t\t\t\t\tString appPath = path.substring(0, path.lastIndexOf(GlobalConstant.Symbol.SLASH));\n\n\t\t\t\t\tReliableMessageRegisterDto dto = JSON.parseObject(getDirectly(client, appPath), ReliableMessageRegisterDto.class);\n\t\t\t\t\tif (this.getNumChildrenCount(client, appPath) > 0) {\n\t\t\t\t\t\ttpcMqConsumerService.updateOnLineStatusByCid(dto.getConsumerGroup());\n\t\t\t\t\t\tMqProducerBeanFactory.putCid(dto.getConsumerGroup());\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase NODE_REMOVED:\n\t\t\t\tlog.info(\"MqConsumerChangeListener NODE_REMOVED path={}, data={}\", path, dataStr);\n\t\t\t\tif (split.length == GlobalConstant.Number.SIX_INT) {\n\t\t\t\t\tString appPath = path.substring(0, path.lastIndexOf(GlobalConstant.Symbol.SLASH));\n\n\t\t\t\t\tReliableMessageRegisterDto dto = JSON.parseObject(getDirectly(client, appPath), ReliableMessageRegisterDto.class);\n\t\t\t\t\tif (this.getNumChildrenCount(client, appPath) < 1) {\n\t\t\t\t\t\ttpcMqConsumerService.updateOffLineStatusByCid(dto.getConsumerGroup());\n\t\t\t\t\t\tMqProducerBeanFactory.rmCid(dto.getConsumerGroup());\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase NODE_UPDATED:\n\t\t\t\tlog.error(\"MqConsumerChangeListener 本次版本不对更新做处理, path={}, data={}\", path, new String(data.getData()));\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\tprivate int getNumChildrenCount(CuratorFramework client, final String key) {\n\t\tlog.info(\"获取消费者节点个数 path={}\", key);\n\t\tStat stat = null;\n\t\ttry {\n\t\t\tstat = client.checkExists().forPath(key);\n\t\t} catch (final Exception ex) {\n\t\t\tlog.error(\"获取目录 key={}的子节点个数出现异常={}\", key, ex.getMessage(), ex);\n\t\t}\n\t\treturn stat == null ? 0 : stat.getNumChildren();\n\n\t}\n\n\tprivate String getDirectly(CuratorFramework client, final String key) {\n\t\ttry {\n\t\t\treturn new String(client.getData().forPath(key), Charsets.UTF_8);\n\t\t} catch (final Exception ex) {\n\t\t\tRegExceptionHandler.handleException(ex);\n\t\t\treturn null;\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-tpc/src/main/java/com/paascloud/provider/listener/MqProducerChangeListener.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：MqProducerChangeListener.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.listener;\n\nimport com.alibaba.fastjson.JSON;\nimport com.google.common.base.Charsets;\nimport com.paascloud.base.constant.GlobalConstant;\nimport com.paascloud.core.registry.base.ReliableMessageRegisterDto;\nimport com.paascloud.core.registry.exception.RegExceptionHandler;\nimport com.paascloud.provider.service.MqProducerBeanFactory;\nimport com.paascloud.provider.service.TpcMqProducerService;\nimport lombok.extern.slf4j.Slf4j;\nimport org.apache.curator.framework.CuratorFramework;\nimport org.apache.curator.framework.recipes.cache.ChildData;\nimport org.apache.curator.framework.recipes.cache.TreeCacheEvent;\nimport org.apache.curator.framework.recipes.cache.TreeCacheListener;\nimport org.apache.zookeeper.data.Stat;\nimport org.springframework.stereotype.Component;\n\nimport javax.annotation.Resource;\n\n/**\n * The class Mq producer change listener.\n *\n * @author paascloud.net @gmail.com\n */\n@Component\n@Slf4j\npublic class MqProducerChangeListener implements TreeCacheListener {\n\t@Resource\n\tprivate TpcMqProducerService tpcMqProducerService;\n\n\t/**\n\t * Child event.\n\t *\n\t * @param client the client\n\t * @param event  the event\n\t */\n\t@Override\n\tpublic void childEvent(final CuratorFramework client, final TreeCacheEvent event) {\n\t\tChildData data = event.getData();\n\t\tif (data == null) {\n\t\t\treturn;\n\t\t}\n\t\tString path = data.getPath();\n\t\tif (GlobalConstant.ZK_REGISTRY_PRODUCER_ROOT_PATH.equals(path) || GlobalConstant.ZK_REGISTRY_CONSUMER_ROOT_PATH.equals(path)) {\n\t\t\treturn;\n\t\t}\n\t\tString[] split = path.split(GlobalConstant.Symbol.SLASH);\n\t\tString dataStr = new String(data.getData());\n\t\tswitch (event.getType()) {\n\t\t\tcase NODE_ADDED:\n\t\t\t\tlog.info(\"MqProducerChangeListener CHILD_ADDED path={}, data={}\", path, dataStr);\n\t\t\t\tif (split.length == GlobalConstant.Number.SIX_INT) {\n\t\t\t\t\tString appPath = path.substring(0, path.lastIndexOf(GlobalConstant.Symbol.SLASH));\n\n\t\t\t\t\tReliableMessageRegisterDto dto = JSON.parseObject(getDirectly(client, appPath), ReliableMessageRegisterDto.class);\n\t\t\t\t\tif (this.getNumChildren(client, appPath) > 0) {\n\t\t\t\t\t\ttpcMqProducerService.updateOnLineStatusByPid(dto.getProducerGroup());\n\t\t\t\t\t\tMqProducerBeanFactory.buildProducerBean(dto);\n\t\t\t\t\t\tMqProducerBeanFactory.putPid(dto.getProducerGroup());\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase NODE_REMOVED:\n\t\t\t\tlog.info(\"MqProducerChangeListener NODE_REMOVED path={}, data={}\", path, dataStr);\n\t\t\t\tif (split.length == GlobalConstant.Number.SIX_INT) {\n\t\t\t\t\tString appPath = path.substring(0, path.lastIndexOf(GlobalConstant.Symbol.SLASH));\n\n\t\t\t\t\tReliableMessageRegisterDto dto = JSON.parseObject(getDirectly(client, appPath), ReliableMessageRegisterDto.class);\n\t\t\t\t\tif (this.getNumChildren(client, appPath) < 1) {\n\t\t\t\t\t\ttpcMqProducerService.updateOffLineStatusByPid(dto.getProducerGroup());\n\t\t\t\t\t\tMqProducerBeanFactory.rmPid(dto.getProducerGroup());\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase NODE_UPDATED:\n\t\t\t\tlog.error(\"本次版本不对更新做处理, path={}, data={}\", path, new String(data.getData()));\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\tprivate int getNumChildren(CuratorFramework client, final String key) {\n\t\tlog.info(\"获取生产者节点个数 path={}\", key);\n\t\tStat stat = null;\n\t\ttry {\n\t\t\tstat = client.checkExists().forPath(key);\n\t\t} catch (final Exception ex) {\n\t\t\tlog.error(\"获取目录 key={}的子节点个数出现异常={}\", key, ex.getMessage(), ex);\n\t\t}\n\t\treturn stat == null ? 0 : stat.getNumChildren();\n\t}\n\n\tprivate String getDirectly(CuratorFramework client, final String key) {\n\t\ttry {\n\t\t\treturn new String(client.getData().forPath(key), Charsets.UTF_8);\n\t\t} catch (final Exception ex) {\n\t\t\tRegExceptionHandler.handleException(ex);\n\t\t\treturn null;\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-tpc/src/main/java/com/paascloud/provider/mapper/TpcJobTaskMapper.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：TpcJobTaskMapper.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.mapper;\n\nimport com.paascloud.core.mybatis.MyMapper;\nimport com.paascloud.provider.model.domain.TpcJobTask;\nimport org.apache.ibatis.annotations.Mapper;\nimport org.springframework.stereotype.Component;\n\n/**\n * The interface Tpc job task mapper.\n *\n * @author paascloud.net @gmail.com\n */\n@Mapper\n@Component\npublic interface TpcJobTaskMapper extends MyMapper<TpcJobTask> {\n}"
  },
  {
    "path": "paascloud-provider/paascloud-provider-tpc/src/main/java/com/paascloud/provider/mapper/TpcMqConfirmMapper.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：TpcMqConfirmMapper.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.mapper;\n\nimport com.paascloud.core.mybatis.MyMapper;\nimport com.paascloud.provider.model.domain.TpcMqConfirm;\nimport org.apache.ibatis.annotations.Mapper;\nimport org.apache.ibatis.annotations.Param;\nimport org.springframework.stereotype.Component;\n\nimport java.util.List;\n\n/**\n * The interface Tpc mq confirm mapper.\n *\n * @author paascloud.net @gmail.com\n */\n@Component\n@Mapper\npublic interface TpcMqConfirmMapper extends MyMapper<TpcMqConfirm> {\n\t/**\n\t * Confirm receive message.\n\t *\n\t * @param confirmId the confirm id\n\t */\n\tvoid confirmReceiveMessage(@Param(\"cid\") Long confirmId);\n\n\t/**\n\t * Confirm consumed message.\n\t *\n\t * @param confirmId the confirm id\n\t */\n\tvoid confirmConsumedMessage(@Param(\"cid\") Long confirmId);\n\n\t/**\n\t * Gets id mq confirm.\n\t *\n\t * @param cid        the cid\n\t * @param messageKey the message key\n\t *\n\t * @return the id mq confirm\n\t */\n\tLong getIdMqConfirm(@Param(\"cid\") String cid, @Param(\"messageKey\") String messageKey);\n\n\t/**\n\t * Batch create mq confirm int.\n\t *\n\t * @param list the list\n\t *\n\t * @return the int\n\t */\n\tint batchCreateMqConfirm(@Param(\"tpcMqConfirmList\") List<TpcMqConfirm> list);\n\n\t/**\n\t * 查询没有消费的数量.\n\t *\n\t * @param messageKey the message key\n\t *\n\t * @return the int\n\t */\n\tint selectUnConsumedCount(@Param(\"messageKey\") String messageKey);\n}"
  },
  {
    "path": "paascloud-provider/paascloud-provider-tpc/src/main/java/com/paascloud/provider/mapper/TpcMqConsumerMapper.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：TpcMqConsumerMapper.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.mapper;\n\nimport com.paascloud.core.mybatis.MyMapper;\nimport com.paascloud.provider.model.domain.TpcMqConsumer;\nimport com.paascloud.provider.model.vo.TpcMqConsumerVo;\nimport com.paascloud.provider.model.vo.TpcMqSubscribeVo;\nimport org.apache.ibatis.annotations.Mapper;\nimport org.apache.ibatis.annotations.Param;\nimport org.springframework.stereotype.Component;\n\nimport java.util.List;\n\n/**\n * The interface Tpc mq consumer mapper.\n *\n * @author paascloud.net @gmail.com\n */\n@Mapper\n@Component\npublic interface TpcMqConsumerMapper extends MyMapper<TpcMqConsumer> {\n\t/**\n\t * 查询消费者列表.\n\t *\n\t * @param tpcMqConsumer the tpc mq consumer\n\t *\n\t * @return the list\n\t */\n\tList<TpcMqConsumerVo> listTpcMqConsumerVoWithPage(TpcMqConsumer tpcMqConsumer);\n\n\t/**\n\t * 分页查询MQ订阅列表.\n\t *\n\t * @param tpcMqConsumer the tpc mq consumer\n\t *\n\t * @return the list\n\t */\n\tList<TpcMqSubscribeVo> listTpcMqSubscribeVoWithPage(TpcMqConsumer tpcMqConsumer);\n\n\t/**\n\t * Delete subscribe tag by tag id int.\n\t *\n\t * @param tagId the tag id\n\t *\n\t * @return the int\n\t */\n\tint deleteSubscribeTagByTagId(@Param(\"tagId\") Long tagId);\n\n\t/**\n\t * List subscribe id by consumer id list.\n\t *\n\t * @param consumerId the consumer id\n\t *\n\t * @return the list\n\t */\n\tList<Long> listSubscribeIdByConsumerId(@Param(\"consumerId\") Long consumerId);\n\n\t/**\n\t * Delete subscribe by consumer id.\n\t *\n\t * @param consumerId the consumer id\n\t *\n\t * @return the int\n\t */\n\tint deleteSubscribeByConsumerId(@Param(\"consumerId\") Long consumerId);\n\n\t/**\n\t * Delete subscribe tag by subscribe id list.\n\t *\n\t * @param subscribeIdList the subscribe id list\n\t *\n\t * @return the int\n\t */\n\tint deleteSubscribeTagBySubscribeIdList(@Param(\"subscribeIdList\") List<Long> subscribeIdList);\n\n\t/**\n\t * List subscribe vo list.\n\t *\n\t * @param subscribeIdList the subscribe id list\n\t *\n\t * @return the list\n\t */\n\tList<TpcMqSubscribeVo> listSubscribeVo(@Param(\"subscribeIdList\") List<Long> subscribeIdList);\n\n\t/**\n\t * List consumer group by topic list.\n\t *\n\t * @param topic the topic\n\t *\n\t * @return the list\n\t */\n\tList<String> listConsumerGroupByTopic(@Param(\"topic\") String topic);\n\n\t/**\n\t * Gets by cid.\n\t *\n\t * @param consumerGroup the consumer group\n\t *\n\t * @return the by cid\n\t */\n\tTpcMqConsumer getByCid(String consumerGroup);\n}"
  },
  {
    "path": "paascloud-provider/paascloud-provider-tpc/src/main/java/com/paascloud/provider/mapper/TpcMqMessageMapper.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：TpcMqMessageMapper.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.mapper;\n\nimport com.paascloud.base.dto.MessageQueryDto;\nimport com.paascloud.core.mybatis.MyMapper;\nimport com.paascloud.provider.model.domain.TpcMqMessage;\nimport com.paascloud.provider.model.dto.MessageTaskQueryDto;\nimport com.paascloud.provider.model.vo.TpcMessageVo;\nimport org.apache.ibatis.annotations.Mapper;\nimport org.apache.ibatis.annotations.Param;\nimport org.springframework.stereotype.Component;\n\nimport java.util.List;\n\n/**\n * The interface Tpc mq message mapper.\n *\n * @author paascloud.net @gmail.com\n */\n@Component\n@Mapper\npublic interface TpcMqMessageMapper extends MyMapper<TpcMqMessage> {\n\t/**\n\t * Gets message by message key.\n\t *\n\t * @param messageKey the message key\n\t *\n\t * @return the message by message key\n\t */\n\tTpcMqMessage getByMessageKey(@Param(\"messageKey\") String messageKey);\n\n\t/**\n\t * Delete message by message key int.\n\t *\n\t * @param messageKey the message key\n\t *\n\t * @return the int\n\t */\n\tint deleteMessageByMessageKey(@Param(\"messageKey\") String messageKey);\n\n\t/**\n\t * Update already dead by task id.\n\t *\n\t * @param messageId the message id\n\t *\n\t * @return the int\n\t */\n\tint updateAlreadyDeadByMessageId(@Param(\"messageId\") Long messageId);\n\n\t/**\n\t * Add task exe count by id int.\n\t *\n\t * @param messageId the message id\n\t *\n\t * @return the int\n\t */\n\tint addTaskExeCountById(@Param(\"messageId\") Long messageId);\n\n\t/**\n\t * Query waiting confirm message key list list.\n\t *\n\t * @param query the query\n\t *\n\t * @return the list\n\t */\n\tList<String> queryWaitingConfirmMessageKeyList(MessageTaskQueryDto query);\n\n\t/**\n\t * Batch delete message int.\n\t *\n\t * @param deleteKeyList the delete key list\n\t *\n\t * @return the int\n\t */\n\tint batchDeleteMessage(@Param(\"messageKeyList\") List<String> deleteKeyList);\n\n\t/**\n\t * Update mq task message status int.\n\t *\n\t * @param message the message\n\t *\n\t * @return the int\n\t */\n\tint updateMqMessageTaskStatus(TpcMqMessage message);\n\n\t/**\n\t * List message for waiting process list.\n\t *\n\t * @param query the query\n\t *\n\t * @return the list\n\t */\n\tList<TpcMqMessage> listMessageForWaitingProcess(MessageTaskQueryDto query);\n\n\t/**\n\t * List reliable message vo with page list.\n\t *\n\t * @param messageQueryDto the message query dto\n\t *\n\t * @return the list\n\t */\n\tList<TpcMessageVo> listReliableMessageVoWithPage(MessageQueryDto messageQueryDto);\n\n\t/**\n\t * List reliable message vo list.\n\t *\n\t * @param messageIdList the message id list\n\t *\n\t * @return the list\n\t */\n\tList<TpcMessageVo> listReliableMessageVo(@Param(\"messageIdList\") List<Long> messageIdList);\n}"
  },
  {
    "path": "paascloud-provider/paascloud-provider-tpc/src/main/java/com/paascloud/provider/mapper/TpcMqProducerMapper.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：TpcMqProducerMapper.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.mapper;\n\nimport com.paascloud.core.mybatis.MyMapper;\nimport com.paascloud.provider.model.domain.TpcMqProducer;\nimport com.paascloud.provider.model.vo.TpcMqProducerVo;\nimport com.paascloud.provider.model.vo.TpcMqPublishVo;\nimport org.apache.ibatis.annotations.Mapper;\nimport org.apache.ibatis.annotations.Param;\nimport org.springframework.stereotype.Component;\n\nimport java.util.List;\n\n/**\n * The interface Tpc mq producer mapper.\n *\n * @author paascloud.net @gmail.com\n */\n@Mapper\n@Component\npublic interface TpcMqProducerMapper extends MyMapper<TpcMqProducer> {\n\n\t/**\n\t * 查询生产者集合.\n\t *\n\t * @param tpcMqProducer the tpc mq producer\n\t *\n\t * @return the list\n\t */\n\tList<TpcMqProducerVo> listTpcMqProducerVoWithPage(TpcMqProducer tpcMqProducer);\n\n\t/**\n\t * 查询发布消息集合.\n\t *\n\t * @param tpcMqProducer the tpc mq producer\n\t *\n\t * @return the list\n\t */\n\tList<TpcMqPublishVo> listTpcMqPublishVoWithPage(TpcMqProducer tpcMqProducer);\n\n\t/**\n\t * Delete publish by producer id int.\n\t *\n\t * @param producerId the producer id\n\t *\n\t * @return the int\n\t */\n\tint deletePublishByProducerId(@Param(\"producerId\") Long producerId);\n\n\t/**\n\t * Gets by pid.\n\t *\n\t * @param producerGroup the producer group\n\t *\n\t * @return the by pid\n\t */\n\tTpcMqProducer getByPid(@Param(\"pid\") String producerGroup);\n\n}"
  },
  {
    "path": "paascloud-provider/paascloud-provider-tpc/src/main/java/com/paascloud/provider/mapper/TpcMqSubscribeTagMapper.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：TpcMqSubscribeTagMapper.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.mapper;\n\nimport com.paascloud.core.mybatis.MyMapper;\nimport com.paascloud.provider.model.domain.TpcMqSubscribeTag;\nimport org.apache.ibatis.annotations.Mapper;\nimport org.springframework.stereotype.Component;\n\n/**\n * The interface Tpc mq subscribe tag mapper.\n *\n * @author paascloud.net @gmail.com\n */\n@Mapper\n@Component\npublic interface TpcMqSubscribeTagMapper extends MyMapper<TpcMqSubscribeTag> {\n}"
  },
  {
    "path": "paascloud-provider/paascloud-provider-tpc/src/main/java/com/paascloud/provider/mapper/TpcMqTagMapper.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：TpcMqTagMapper.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.mapper;\n\nimport com.paascloud.core.mybatis.MyMapper;\nimport com.paascloud.provider.model.domain.TpcMqTag;\nimport com.paascloud.provider.model.vo.TpcMqTagVo;\nimport org.apache.ibatis.annotations.Mapper;\nimport org.springframework.stereotype.Component;\n\nimport java.util.List;\n\n/**\n * The interface Tpc mq tag mapper.\n *\n * @author paascloud.net @gmail.com\n */\n@Mapper\n@Component\npublic interface TpcMqTagMapper extends MyMapper<TpcMqTag> {\n\t/**\n\t * List tpc mq tag vo with page list.\n\t *\n\t * @param tpcMqTag the tpc mq tag\n\t *\n\t * @return the list\n\t */\n\tList<TpcMqTagVo> listTpcMqTagVoWithPage(TpcMqTag tpcMqTag);\n}"
  },
  {
    "path": "paascloud-provider/paascloud-provider-tpc/src/main/java/com/paascloud/provider/mapper/TpcMqTopicMapper.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：TpcMqTopicMapper.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.mapper;\n\nimport com.paascloud.core.mybatis.MyMapper;\nimport com.paascloud.provider.model.domain.TpcMqTopic;\nimport com.paascloud.provider.model.vo.TpcMqTopicVo;\nimport org.apache.ibatis.annotations.Mapper;\nimport org.springframework.stereotype.Component;\n\nimport java.util.List;\n\n/**\n * The interface Tpc mq topic mapper.\n *\n * @author paascloud.net @gmail.com\n */\n@Mapper\n@Component\npublic interface TpcMqTopicMapper extends MyMapper<TpcMqTopic> {\n\t/**\n\t * List tpc mq topic vo with page list.\n\t *\n\t * @param tpcMqTopic the tpc mq topic\n\t *\n\t * @return the list\n\t */\n\tList<TpcMqTopicVo> listTpcMqTopicVoWithPage(TpcMqTopic tpcMqTopic);\n}"
  },
  {
    "path": "paascloud-provider/paascloud-provider-tpc/src/main/java/com/paascloud/provider/model/constant/.gitkeep",
    "content": ""
  },
  {
    "path": "paascloud-provider/paascloud-provider-tpc/src/main/java/com/paascloud/provider/model/domain/TpcJobTask.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：TpcJobTask.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.model.domain;\n\nimport lombok.Data;\nimport org.apache.ibatis.type.Alias;\n\nimport javax.persistence.*;\nimport java.io.Serializable;\nimport java.util.Date;\n\n/**\n * The class Tpc job task.\n *\n * @author paascloud.net @gmail.com\n */\n@Data\n@Table(name = \"pc_tpc_job_task\")\n@Alias(value = \"tpcJobTask\")\npublic class TpcJobTask implements Serializable {\n\tprivate static final long serialVersionUID = -7833392442916077253L;\n\t@Id\n\t@GeneratedValue(strategy = GenerationType.IDENTITY)\n\tprivate Long id;\n\n\tprivate Integer version;\n\n\t/**\n\t * 关联业务单号\n\t */\n\t@Column(name = \"ref_no\")\n\tprivate String refNo;\n\n\t/**\n\t * 业务类型\n\t */\n\t@Column(name = \"task_type\")\n\tprivate String taskType;\n\n\t/**\n\t * 执行次数\n\t */\n\t@Column(name = \"task_exe_count\")\n\tprivate Integer taskExeCount;\n\n\t/**\n\t * 任务数据\n\t */\n\t@Column(name = \"task_data\")\n\tprivate String taskData;\n\n\t/**\n\t * 是否死亡\n\t */\n\tprivate Integer dead;\n\n\t/**\n\t * 状态\n\t */\n\tprivate Integer status;\n\n\t/**\n\t * 执行实例IP\n\t */\n\t@Column(name = \"exe_instance_ip\")\n\tprivate String exeInstanceIp;\n\n\t/**\n\t * 创建时间\n\t */\n\t@Column(name = \"create_time\")\n\tprivate Date createTime;\n\n\t/**\n\t * 更新时间\n\t */\n\t@Column(name = \"update_time\")\n\tprivate Date updateTime;\n\n\t/**\n\t * 执行时间\n\t */\n\t@Column(name = \"exe_time\")\n\tprivate Integer exeTime;\n\n\t/**\n\t * 删除标识\n\t */\n\tprivate Integer yn;\n\n\t/**\n\t * Add send times.\n\t */\n\tpublic void addSendTimes() {\n\t\tthis.taskExeCount++;\n\t}\n}"
  },
  {
    "path": "paascloud-provider/paascloud-provider-tpc/src/main/java/com/paascloud/provider/model/domain/TpcMqConfirm.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：TpcMqConfirm.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.model.domain;\n\nimport lombok.Data;\nimport lombok.NoArgsConstructor;\nimport org.apache.ibatis.type.Alias;\n\nimport javax.persistence.*;\nimport java.util.Date;\n\n/**\n * The class Tpc mq confirm.\n *\n * @author paascloud.net @gmail.com\n */\n@Data\n@Alias(\"tpcMqConfirm\")\n@Table(name = \"pc_tpc_mq_confirm\")\n@NoArgsConstructor\npublic class TpcMqConfirm {\n\t/**\n\t * ID\n\t */\n\t@Id\n\t@GeneratedValue(strategy = GenerationType.IDENTITY)\n\tprivate Long id;\n\n\t/**\n\t * 版本号\n\t */\n\tprivate Integer version;\n\n\t/**\n\t * 任务ID\n\t */\n\t@Column(name = \"message_id\")\n\tprivate Long messageId;\n\n\t/**\n\t * 消息唯一标识\n\t */\n\t@Column(name = \"message_key\")\n\tprivate String messageKey;\n\n\t/**\n\t * 消费者组编码\n\t */\n\t@Column(name = \"consumer_code\")\n\tprivate String consumerCode;\n\n\t/**\n\t * 消费的数次\n\t */\n\t@Column(name = \"consume_count\")\n\tprivate Integer consumeCount;\n\n\t/**\n\t * 状态, 10 - 未确认 ; 20 - 已确认; 30 已消费\n\t */\n\tprivate Integer status;\n\n\t/**\n\t * 创建时间\n\t */\n\t@Column(name = \"created_time\")\n\tprivate Date createdTime;\n\n\t/**\n\t * 更新时间\n\t */\n\t@Column(name = \"update_time\")\n\tprivate Date updateTime;\n\n\t/**\n\t * Instantiates a new Tpc mq confirm.\n\t *\n\t * @param id           the id\n\t * @param messageId    the message id\n\t * @param messageKey   the message key\n\t * @param consumerCode the consumer code\n\t */\n\tpublic TpcMqConfirm(final Long id, final Long messageId, final String messageKey, final String consumerCode) {\n\t\tthis.id = id;\n\t\tthis.messageId = messageId;\n\t\tthis.messageKey = messageKey;\n\t\tthis.consumerCode = consumerCode;\n\t}\n}"
  },
  {
    "path": "paascloud-provider/paascloud-provider-tpc/src/main/java/com/paascloud/provider/model/domain/TpcMqConsumer.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：TpcMqConsumer.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.model.domain;\n\nimport com.paascloud.core.mybatis.BaseEntity;\nimport lombok.Data;\nimport lombok.EqualsAndHashCode;\nimport org.apache.ibatis.type.Alias;\n\nimport javax.persistence.Column;\nimport javax.persistence.Table;\n\n/**\n * The class Tpc mq consumer.\n *\n * @author paascloud.net @gmail.com\n */\n@EqualsAndHashCode(callSuper = true)\n@Data\n@Table(name = \"pc_tpc_mq_consumer\")\n@Alias(value = \"tpcMqConsumer\")\npublic class TpcMqConsumer extends BaseEntity {\n\n\tprivate static final long serialVersionUID = 9104188440392558541L;\n\n\t/**\n\t * 微服务名称\n\t */\n\t@Column(name = \"application_name\")\n\tprivate String applicationName;\n\n\t/**\n\t * 城市编码\n\t */\n\t@Column(name = \"consumer_code\")\n\tprivate String consumerCode;\n\n\t/**\n\t * 区域编码\n\t */\n\t@Column(name = \"consumer_name\")\n\tprivate String consumerName;\n\n\t/**\n\t * 状态, 0生效,10,失效\n\t */\n\tprivate Integer status;\n\n\t/**\n\t * 备注\n\t */\n\tprivate String remark;\n\n}"
  },
  {
    "path": "paascloud-provider/paascloud-provider-tpc/src/main/java/com/paascloud/provider/model/domain/TpcMqMessage.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：TpcMqMessage.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.model.domain;\n\nimport lombok.Data;\nimport org.apache.ibatis.type.Alias;\n\nimport javax.persistence.*;\nimport java.io.Serializable;\nimport java.util.Date;\nimport java.util.List;\n\n/**\n * The class Tpc mq message.\n *\n * @author paascloud.net @gmail.com\n */\n@Data\n@Alias(value = \"tpcMqMessage\")\n@Table(name = \"pc_tpc_mq_message\")\npublic class TpcMqMessage implements Serializable {\n\tprivate static final long serialVersionUID = -5951754367474682967L;\n\t/**\n\t * ID\n\t */\n\t@Id\n\t@GeneratedValue(strategy = GenerationType.IDENTITY)\n\tprivate Long id;\n\n\t/**\n\t * 版本号\n\t */\n\tprivate Integer version;\n\n\t/**\n\t * 消息key\n\t */\n\t@Column(name = \"message_key\")\n\tprivate String messageKey;\n\n\t/**\n\t * topic\n\t */\n\t@Column(name = \"message_topic\")\n\tprivate String messageTopic;\n\n\t/**\n\t * tag\n\t */\n\t@Column(name = \"message_tag\")\n\tprivate String messageTag;\n\n\t/**\n\t * 消息类型: 10 - 生产者 ; 20 - 消费者\n\t */\n\t@Column(name = \"message_type\")\n\tprivate Integer messageType;\n\n\t/**\n\t * 生产者PID\n\t */\n\t@Column(name = \"producer_group\")\n\tprivate String producerGroup;\n\n\t/**\n\t * 延时级别 1s 5s 10s 30s 1m 2m 3m 4m 5m 6m 7m 8m 9m 10m 20m 30m 1h 2h\n\t */\n\t@Column(name = \"delay_level\")\n\tprivate Integer delayLevel;\n\n\t/**\n\t * 顺序类型 0有序 1无序\n\t */\n\t@Column(name = \"order_type\")\n\tprivate Integer orderType;\n\n\t/**\n\t * 消息状态\n\t */\n\t@Column(name = \"message_status\")\n\tprivate Integer messageStatus;\n\n\t/**\n\t * 消息内容\n\t */\n\t@Column(name = \"message_body\")\n\tprivate String messageBody;\n\n\t/**\n\t * 状态\n\t */\n\t@Column(name = \"task_status\")\n\tprivate Integer taskStatus;\n\n\t/**\n\t * 执行次数\n\t */\n\t@Column(name = \"resend_times\")\n\tprivate Integer resendTimes;\n\n\t/**\n\t * 是否死亡 0 - 活着; 1-死亡\n\t */\n\tprivate Integer dead;\n\n\t/**\n\t * 执行时间\n\t */\n\t@Column(name = \"next_exe_time\")\n\tprivate Integer nextExeTime;\n\n\t/**\n\t * 是否删除 -0 未删除 -1 已删除\n\t */\n\tprivate Integer yn;\n\n\t/**\n\t * 创建时间\n\t */\n\t@Column(name = \"created_time\")\n\tprivate Date createdTime;\n\t/**\n\t * 更新时间\n\t */\n\t@Column(name = \"update_time\")\n\tprivate Date updateTime;\n\n\t@Transient\n\tprivate List<Integer> preStatusList;\n}"
  },
  {
    "path": "paascloud-provider/paascloud-provider-tpc/src/main/java/com/paascloud/provider/model/domain/TpcMqProducer.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：TpcMqProducer.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.model.domain;\n\nimport com.paascloud.core.mybatis.BaseEntity;\nimport lombok.Data;\nimport lombok.EqualsAndHashCode;\nimport org.apache.ibatis.type.Alias;\n\nimport javax.persistence.Column;\nimport javax.persistence.Table;\n\n/**\n * The class Tpc mq producer.\n *\n * @author paascloud.net @gmail.com\n */\n@EqualsAndHashCode(callSuper = true)\n@Data\n@Table(name = \"pc_tpc_mq_producer\")\n@Alias(value = \"tpcMqProducer\")\npublic class TpcMqProducer extends BaseEntity {\n\tprivate static final long serialVersionUID = -4064061704648362318L;\n\n\t/**\n\t * 微服务名称\n\t */\n\t@Column(name = \"application_name\")\n\tprivate String applicationName;\n\n\t/**\n\t * PID 生产者组编码\n\t */\n\t@Column(name = \"producer_code\")\n\tprivate String producerCode;\n\n\t/**\n\t * PID 生产者组名称\n\t */\n\t@Column(name = \"producer_name\")\n\tprivate String producerName;\n\n\t@Column(name = \"query_message_url\")\n\tprivate String queryMessageUrl;\n\n\t/**\n\t * 状态, 0生效,10,失效\n\t */\n\tprivate Integer status;\n\n\t/**\n\t * 备注\n\t */\n\tprivate String remark;\n}"
  },
  {
    "path": "paascloud-provider/paascloud-provider-tpc/src/main/java/com/paascloud/provider/model/domain/TpcMqSubscribeTag.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：TpcMqSubscribeTag.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.model.domain;\n\nimport com.paascloud.core.mybatis.BaseEntity;\nimport lombok.Data;\nimport lombok.EqualsAndHashCode;\nimport org.apache.ibatis.type.Alias;\n\nimport javax.persistence.Column;\nimport javax.persistence.Id;\nimport javax.persistence.Table;\n\n/**\n * The class Tpc mq consumer tag.\n *\n * @author paascloud.net @gmail.com\n */\n@EqualsAndHashCode(callSuper = true)\n@Data\n@Table(name = \"pc_tpc_mq_subscribe_tag\")\n@Alias(value = \"tpcMqConsumerTag\")\npublic class TpcMqSubscribeTag extends BaseEntity {\n\tprivate static final long serialVersionUID = 6227704457895628954L;\n\t/**\n\t * 消费者ID\n\t */\n\t@Id\n\t@Column(name = \"subscribe_id\")\n\tprivate Long subscribeId;\n\n\t/**\n\t * TAG_ID\n\t */\n\t@Id\n\t@Column(name = \"tag_id\")\n\tprivate Long tagId;\n}"
  },
  {
    "path": "paascloud-provider/paascloud-provider-tpc/src/main/java/com/paascloud/provider/model/domain/TpcMqTag.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：TpcMqTag.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.model.domain;\n\nimport com.paascloud.core.mybatis.BaseEntity;\nimport lombok.Data;\nimport lombok.EqualsAndHashCode;\nimport org.apache.ibatis.type.Alias;\n\nimport javax.persistence.Column;\nimport javax.persistence.Table;\n\n/**\n * The class Tpc mq tag.\n *\n * @author paascloud.net @gmail.com\n */\n@EqualsAndHashCode(callSuper = true)\n@Data\n@Table(name = \"pc_tpc_mq_tag\")\n@Alias(value = \"tpcMqTag\")\npublic class TpcMqTag extends BaseEntity {\n\tprivate static final long serialVersionUID = -1063353649973385058L;\n\n\t/**\n\t * 主题ID\n\t */\n\t@Column(name = \"topic_id\")\n\tprivate Long topicId;\n\n\t/**\n\t * 城市编码\n\t */\n\t@Column(name = \"tag_code\")\n\tprivate String tagCode;\n\n\t/**\n\t * 区域编码\n\t */\n\t@Column(name = \"tag_name\")\n\tprivate String tagName;\n\n\t/**\n\t * 状态, 0生效,10,失效\n\t */\n\tprivate Integer status;\n\n\t/**\n\t * 备注\n\t */\n\tprivate String remark;\n}"
  },
  {
    "path": "paascloud-provider/paascloud-provider-tpc/src/main/java/com/paascloud/provider/model/domain/TpcMqTopic.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：TpcMqTopic.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.model.domain;\n\nimport com.paascloud.core.mybatis.BaseEntity;\nimport lombok.Data;\nimport lombok.EqualsAndHashCode;\nimport org.apache.ibatis.type.Alias;\n\nimport javax.persistence.Column;\nimport javax.persistence.Table;\n\n/**\n * The class Tpc mq topic.\n *\n * @author paascloud.net @gmail.com\n */\n@EqualsAndHashCode(callSuper = true)\n@Data\n@Table(name = \"pc_tpc_mq_topic\")\n@Alias(value = \"tpcMqTopic\")\npublic class TpcMqTopic extends BaseEntity {\n\tprivate static final long serialVersionUID = 5642946024630652202L;\n\n\t/**\n\t * 城市编码\n\t */\n\t@Column(name = \"topic_code\")\n\tprivate String topicCode;\n\n\t/**\n\t * 区域编码\n\t */\n\t@Column(name = \"topic_name\")\n\tprivate String topicName;\n\n\t/**\n\t * MQ类型, 10 rocketmq 20 kafka\n\t */\n\t@Column(name = \"mq_type\")\n\tprivate Integer mqType;\n\n\t/**\n\t * 消息类型, 10 无序消息, 20 无序消息\n\t */\n\t@Column(name = \"msg_type\")\n\tprivate Integer msgType;\n\n\t/**\n\t * 状态, 0生效,10,失效\n\t */\n\tprivate Integer status;\n\n\t/**\n\t * 备注\n\t */\n\tprivate String remarks;\n}"
  },
  {
    "path": "paascloud-provider/paascloud-provider-tpc/src/main/java/com/paascloud/provider/model/dto/MessageTaskQueryDto.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：MessageTaskQueryDto.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.model.dto;\n\n\nimport lombok.Data;\n\n/**\n * The class Message task query dto.\n *\n * @author paascloud.net @gmail.com\n */\n@Data\npublic class MessageTaskQueryDto {\n\tprivate int yn;\n\tprivate Integer taskStatus;\n\tprivate int messageStatus;\n\tprivate int fetchNum;\n\tprivate int shardingItem;\n\tprivate int shardingTotalCount;\n\tprivate String producerGroup;\n\tprivate String createTimeBefore;\n\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-tpc/src/main/java/com/paascloud/provider/model/enums/JobTaskTypeEnum.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：JobTaskTypeEnum.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.model.enums;\n\n\n/**\n * The enum Job task type enum.\n *\n * @author paascloud.net @gmail.com\n */\npublic enum JobTaskTypeEnum {\n\n\t/**\n\t * Mq send message job task type enum.\n\t */\n\tMQ_SEND_MESSAGE(\"MQ_SEND_MESSAGE\", \"发送可靠消息\"),;\n\t/**\n\t * The Type.\n\t */\n\tString type;\n\n\t/**\n\t * The Value.\n\t */\n\tString value;\n\n\tJobTaskTypeEnum(String type, String value) {\n\t\tthis.type = type;\n\t\tthis.value = value;\n\t}\n\n\tpublic String type() {\n\t\treturn type;\n\t}\n\n\tpublic String value() {\n\t\treturn value;\n\t}\n\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-tpc/src/main/java/com/paascloud/provider/model/enums/MqConfirmStatusEnum.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：MqConfirmStatusEnum.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.model.enums;\n\n/**\n * The enum Mq confirm status enum.\n *\n * @author paascloud.net @gmail.com\n */\npublic enum MqConfirmStatusEnum {\n\t/**\n\t * 未确认.\n\t */\n\tUN_CONFIRMED(10, \"未确认\"),\n\n\t/**\n\t * 已确认.\n\t */\n\tCONFIRMED(20, \"已确认\"),\n\n\t/**\n\t * 已消费\n\t */\n\tCONSUMED(30, \"已消费\");\n\n\tprivate int confirmStatus;\n\n\tprivate String value;\n\n\tMqConfirmStatusEnum(int confirmStatus, String value) {\n\t\tthis.confirmStatus = confirmStatus;\n\t\tthis.value = value;\n\t}\n\n\t/**\n\t * Confirm status int.\n\t *\n\t * @return the int\n\t */\n\tpublic int confirmStatus() {\n\t\treturn confirmStatus;\n\t}\n\n\t/**\n\t * Value string.\n\t *\n\t * @return the string\n\t */\n\tpublic String value() {\n\t\treturn value;\n\t}\n\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-tpc/src/main/java/com/paascloud/provider/model/enums/MqSendStatusEnum.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：MqSendStatusEnum.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.model.enums;\n\n/**\n * The enum Mq send status enum.\n *\n * @author paascloud.net @gmail.com\n */\npublic enum MqSendStatusEnum {\n\t/**\n\t * 未发送.\n\t */\n\tWAIT_SEND(10, \"未发送\"),\n\n\t/**\n\t * 已发送.\n\t */\n\tSENDING(20, \"已发送\"),\n\n\t/**\n\t * 已完成\n\t */\n\tFINISH(30, \"已完成\");\n\n\tprivate int sendStatus;\n\n\tprivate String value;\n\n\tMqSendStatusEnum(int sendStatus, String value) {\n\t\tthis.sendStatus = sendStatus;\n\t\tthis.value = value;\n\t}\n\n\t/**\n\t * Confirm status int.\n\t *\n\t * @return the int\n\t */\n\tpublic int sendStatus() {\n\t\treturn sendStatus;\n\t}\n\n\t/**\n\t * Value string.\n\t *\n\t * @return the string\n\t */\n\tpublic String value() {\n\t\treturn value;\n\t}\n\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-tpc/src/main/java/com/paascloud/provider/model/enums/PIDEnum.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：PIDEnum.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.model.enums;\n\n\n/**\n * The enum Pid enum.\n *\n * @author paascloud.net @gmail.com\n */\npublic enum PIDEnum {\n\t/**\n\t * Pid uac pid enum.\n\t */\n\tPID_UAC,\n\t/**\n\t * Pid mdc pid enum.\n\t */\n\tPID_MDC,\n\t/**\n\t * Pid opc pid enum.\n\t */\n\tPID_OPC,;\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-tpc/src/main/java/com/paascloud/provider/model/vo/TpcMessageVo.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：TpcMessageVo.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.model.vo;\n\nimport com.paascloud.base.dto.BaseVo;\nimport lombok.Data;\nimport lombok.EqualsAndHashCode;\n\nimport javax.persistence.Transient;\nimport java.util.List;\n\n/**\n * The class Tpc mq message.\n *\n * @author paascloud.net @gmail.com\n */\n@EqualsAndHashCode(callSuper = true)\n@Data\npublic class TpcMessageVo extends BaseVo {\n\tprivate static final long serialVersionUID = 7353473261430862023L;\n\n\tprivate Integer version;\n\n\t/**\n\t * 消息key\n\t */\n\tprivate String messageKey;\n\n\t/**\n\t * topic\n\t */\n\tprivate String messageTopic;\n\n\t/**\n\t * tag\n\t */\n\tprivate String messageTag;\n\n\t/**\n\t * 消息类型: 10 - 生产者 ; 20 - 消费者\n\t */\n\tprivate Integer messageType;\n\n\t/**\n\t * 生产者PID\n\t */\n\tprivate String producerGroup;\n\n\t/**\n\t * 延时级别 1s 5s 10s 30s 1m 2m 3m 4m 5m 6m 7m 8m 9m 10m 20m 30m 1h 2h\n\t */\n\tprivate Integer delayLevel;\n\n\t/**\n\t * 顺序类型 0有序 1无序\n\t */\n\tprivate Integer orderType;\n\n\t/**\n\t * 消息状态\n\t */\n\tprivate Integer messageStatus;\n\n\t/**\n\t * 消息内容\n\t */\n\tprivate String messageBody;\n\n\t/**\n\t * 状态\n\t */\n\tprivate Integer taskStatus;\n\n\t/**\n\t * 执行次数\n\t */\n\tprivate Integer resendTimes;\n\n\t/**\n\t * 是否死亡 0 - 活着; 1-死亡\n\t */\n\tprivate Integer dead;\n\n\t/**\n\t * 执行时间\n\t */\n\tprivate Integer nextExeTime;\n\n\t/**\n\t * 是否删除 -0 未删除 -1 已删除\n\t */\n\tprivate Integer yn;\n\n\t@Transient\n\tprivate List<TpcMqConfirmVo> mqConfirmVoList;\n}"
  },
  {
    "path": "paascloud-provider/paascloud-provider-tpc/src/main/java/com/paascloud/provider/model/vo/TpcMqConfirmVo.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：TpcMqConfirmVo.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.model.vo;\n\nimport com.paascloud.base.dto.BaseVo;\nimport lombok.Data;\nimport lombok.EqualsAndHashCode;\nimport lombok.NoArgsConstructor;\n\n/**\n * The class Tpc mq confirm.\n *\n * @author paascloud.net @gmail.com\n */\n@EqualsAndHashCode(callSuper = true)\n@Data\n@NoArgsConstructor\npublic class TpcMqConfirmVo extends BaseVo {\n\tprivate static final long serialVersionUID = 8497361355200965902L;\n\n\t/**\n\t * 任务ID\n\t */\n\tprivate Long messageId;\n\n\t/**\n\t * 消息唯一标识\n\t */\n\tprivate String messageKey;\n\n\t/**\n\t * 消费者组编码\n\t */\n\tprivate String consumerCode;\n\n\t/**\n\t * 消费的数次\n\t */\n\tprivate Integer consumeCount;\n\n\t/**\n\t * 状态, 10 - 未确认 ; 20 - 已确认; 30 已消费\n\t */\n\tprivate Integer status;\n}"
  },
  {
    "path": "paascloud-provider/paascloud-provider-tpc/src/main/java/com/paascloud/provider/model/vo/TpcMqConsumerVo.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：TpcMqConsumerVo.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.model.vo;\n\nimport lombok.Data;\nimport lombok.EqualsAndHashCode;\n\nimport java.util.List;\n\n/**\n * The class Mdc mq consumer vo.\n *\n * @author paascloud.net @gmail.com\n */\n@EqualsAndHashCode(callSuper = true)\n@Data\npublic class TpcMqConsumerVo extends TpcMqSubscribeVo {\n\tprivate static final long serialVersionUID = 8833595265432073801L;\n\n\t/**\n\t * 订阅Topic集合\n\t */\n\tprivate List<TpcMqTopicVo> mqTopicVoList;\n\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-tpc/src/main/java/com/paascloud/provider/model/vo/TpcMqProducerVo.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：TpcMqProducerVo.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.model.vo;\n\nimport lombok.Data;\nimport lombok.EqualsAndHashCode;\n\nimport java.util.List;\n\n/**\n * The class Mdc mq producer vo.\n *\n * @author paascloud.net @gmail.com\n */\n@EqualsAndHashCode(callSuper = true)\n@Data\npublic class TpcMqProducerVo extends TpcMqPublishVo {\n\tprivate static final long serialVersionUID = -5644698735373761104L;\n\n\t/**\n\t * 发布Topic集合\n\t */\n\tprivate List<TpcMqTopicVo> mqTopicVoList;\n\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-tpc/src/main/java/com/paascloud/provider/model/vo/TpcMqPublishVo.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：TpcMqPublishVo.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.model.vo;\n\nimport com.paascloud.base.dto.BaseVo;\nimport lombok.Data;\nimport lombok.EqualsAndHashCode;\n\n/**\n * The class Mdc mq producer vo.\n *\n * @author paascloud.net @gmail.com\n */\n@EqualsAndHashCode(callSuper = true)\n@Data\npublic class TpcMqPublishVo extends BaseVo {\n\tprivate static final long serialVersionUID = -5644698735373761104L;\n\n\t/**\n\t * 主题编码\n\t */\n\tprivate String topicCode;\n\n\t/**\n\t * 主题名称\n\t */\n\tprivate String topicName;\n\n\t/**\n\t * 微服务名称\n\t */\n\tprivate String applicationName;\n\n\t/**\n\t * 城市编码\n\t */\n\tprivate String producerCode;\n\n\t/**\n\t * 区域编码\n\t */\n\tprivate String producerName;\n\n\t/**\n\t * 状态, 0生效,10,失效\n\t */\n\tprivate Integer status;\n\n\t/**\n\t * 备注\n\t */\n\tprivate String remark;\n\n\t/**\n\t * 预留对账的URL\n\t */\n\tprivate String queryMessageUrl;\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-tpc/src/main/java/com/paascloud/provider/model/vo/TpcMqSubscribeVo.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：TpcMqSubscribeVo.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.model.vo;\n\nimport com.paascloud.base.dto.BaseVo;\nimport lombok.Data;\nimport lombok.EqualsAndHashCode;\n\nimport java.util.List;\n\n/**\n * The class Mdc mq subscribe vo.\n *\n * @author paascloud.net @gmail.com\n */\n@EqualsAndHashCode(callSuper = true)\n@Data\npublic class TpcMqSubscribeVo extends BaseVo {\n\tprivate static final long serialVersionUID = 8833595265432073801L;\n\n\t/**\n\t * 主题编码\n\t */\n\tprivate String topicCode;\n\t/**\n\t * 主题名称\n\t */\n\tprivate String topicName;\n\n\t/**\n\t * 微服务名称\n\t */\n\tprivate String applicationName;\n\n\t/**\n\t * 城市编码\n\t */\n\tprivate String consumerCode;\n\n\t/**\n\t * 区域编码\n\t */\n\tprivate String consumerName;\n\n\t/**\n\t * 状态, 0生效,10,失效\n\t */\n\tprivate Integer status;\n\n\t/**\n\t * 备注\n\t */\n\tprivate String remark;\n\n\t/**\n\t * 订阅Tag列表\n\t */\n\tprivate List<TpcMqTagVo> tagVoList;\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-tpc/src/main/java/com/paascloud/provider/model/vo/TpcMqTagVo.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：TpcMqTagVo.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.model.vo;\n\nimport com.paascloud.base.dto.BaseVo;\nimport lombok.Data;\nimport lombok.EqualsAndHashCode;\n\n/**\n * The class Mdc mq tag vo.\n *\n * @author paascloud.net @gmail.com\n */\n@EqualsAndHashCode(callSuper = true)\n@Data\npublic class TpcMqTagVo extends BaseVo {\n\tprivate static final long serialVersionUID = -4176095424582783954L;\n\t/**\n\t * 主题ID\n\t */\n\tprivate Long topicId;\n\n\t/**\n\t * 主题编码\n\t */\n\tprivate String topicCode;\n\n\t/**\n\t * 主题名称\n\t */\n\tprivate String topicName;\n\n\t/**\n\t * 城市编码\n\t */\n\tprivate String tagCode;\n\n\t/**\n\t * 区域编码\n\t */\n\tprivate String tagName;\n\n\t/**\n\t * 状态, 0生效,10,失效\n\t */\n\tprivate Integer status;\n\n\t/**\n\t * 备注\n\t */\n\tprivate String remark;\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-tpc/src/main/java/com/paascloud/provider/model/vo/TpcMqTopicVo.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：TpcMqTopicVo.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.model.vo;\n\nimport com.paascloud.base.dto.BaseVo;\nimport lombok.Data;\nimport lombok.EqualsAndHashCode;\n\nimport java.util.List;\n\n/**\n * The class Tpc mq topic vo.\n *\n * @author paascloud.net @gmail.com\n */\n@EqualsAndHashCode(callSuper = true)\n@Data\npublic class TpcMqTopicVo extends BaseVo {\n\tprivate static final long serialVersionUID = 3857060544292574468L;\n\n\t/**\n\t * 生产者名称\n\t */\n\tprivate String producerName;\n\n\t/**\n\t * 城市编码\n\t */\n\tprivate String topicCode;\n\n\t/**\n\t * 区域编码\n\t */\n\tprivate String topicName;\n\n\t/**\n\t * MQ类型, 10 rocketmq 20 kafka\n\t */\n\tprivate Integer mqType;\n\n\t/**\n\t * 消息类型, 10 无序消息, 20 无序消息\n\t */\n\tprivate Integer msgType;\n\n\t/**\n\t * 状态, 0生效,10,失效\n\t */\n\tprivate Integer status;\n\n\t/**\n\t * 备注\n\t */\n\tprivate String remarks;\n\n\t/**\n\t * Tag 列表\n\t */\n\tprivate List<TpcMqTagVo> tagVoList;\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-tpc/src/main/java/com/paascloud/provider/mq/RocketMqProducer.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：RocketMqProducer.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.mq;\n\n\nimport com.paascloud.base.constant.GlobalConstant;\nimport com.paascloud.base.enums.ErrorCodeEnum;\nimport com.paascloud.core.mq.MqMessage;\nimport com.paascloud.provider.exceptions.TpcBizException;\nimport com.paascloud.provider.service.MqProducerBeanFactory;\nimport lombok.AccessLevel;\nimport lombok.NoArgsConstructor;\nimport lombok.extern.slf4j.Slf4j;\nimport org.apache.rocketmq.client.producer.SendResult;\nimport org.apache.rocketmq.common.message.Message;\n\n/**\n * The class Rocket mq producer.\n *\n * @author paascloud.net @gmail.com\n */\n@Slf4j\n@NoArgsConstructor(access = AccessLevel.PRIVATE)\npublic class RocketMqProducer {\n\n\tprivate static final int PRODUCER_RETRY_TIMES = 3;\n\n\tpublic static SendResult sendSimpleMessage(String body, String topic, String tag, String key, String pid, Integer delayLevel) {\n\t\tif (delayLevel == null) {\n\t\t\tdelayLevel = 0;\n\t\t}\n\t\tMessage message = MqMessage.checkMessage(body, topic, tag, key);\n\t\tif (delayLevel < 0 || delayLevel > GlobalConstant.Number.EIGHTEEN_INT) {\n\t\t\tthrow new TpcBizException(ErrorCodeEnum.TPC100500013, topic, key);\n\t\t}\n\t\tmessage.setDelayTimeLevel(delayLevel);\n\t\treturn retrySendMessage(pid, message);\n\t}\n\n\tprivate static SendResult retrySendMessage(String pid, Message msg) {\n\t\tint iniCount = 1;\n\t\tSendResult result;\n\t\twhile (true) {\n\t\t\ttry {\n\t\t\t\tresult = MqProducerBeanFactory.getBean(pid).send(msg);\n\t\t\t\tbreak;\n\t\t\t} catch (Exception e) {\n\t\t\t\tlog.error(\"发送消息失败:\", e);\n\t\t\t\tif (iniCount++ >= PRODUCER_RETRY_TIMES) {\n\t\t\t\t\tthrow new TpcBizException(ErrorCodeEnum.TPC100500014, msg.getTopic(), msg.getKeys());\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tlog.info(\"<== 发送MQ SendResult={}\", result);\n\t\treturn result;\n\t}\n\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-tpc/src/main/java/com/paascloud/provider/service/MdcRpcService.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：MdcRpcService.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.service;\n\n\nimport com.github.pagehelper.PageInfo;\nimport com.paascloud.base.dto.MessageQueryDto;\nimport com.paascloud.base.dto.MqMessageVo;\nimport com.paascloud.base.enums.ErrorCodeEnum;\nimport com.paascloud.provider.exceptions.TpcBizException;\nimport com.paascloud.wrapper.Wrapper;\nimport lombok.extern.slf4j.Slf4j;\nimport org.springframework.stereotype.Service;\n\nimport javax.annotation.Resource;\n\n/**\n * The class Mdc rpc service.\n *\n * @author paascloud.net @gmail.com\n */\n@Slf4j\n@Service\npublic class MdcRpcService {\n\t@Resource\n\tprivate MdcMqMessageFeignApi mdcMqMessageFeignApi;\n\n\tpublic Wrapper<PageInfo<MqMessageVo>> queryMessageListWithPage(final MessageQueryDto messageQueryDto) {\n\t\tWrapper<PageInfo<MqMessageVo>> wrapper = mdcMqMessageFeignApi.queryMessageListWithPage(messageQueryDto);\n\t\tif (wrapper == null) {\n\t\t\tlog.error(\"查询消息记录. 失败 result is null\");\n\t\t\tthrow new TpcBizException(ErrorCodeEnum.GL99990002);\n\t\t}\n\t\treturn wrapper;\n\t}\n}"
  },
  {
    "path": "paascloud-provider/paascloud-provider-tpc/src/main/java/com/paascloud/provider/service/MqProducerBeanFactory.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：MqProducerBeanFactory.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.service;\n\nimport com.google.common.base.Preconditions;\nimport com.paascloud.core.registry.base.ReliableMessageRegisterDto;\nimport com.paascloud.core.support.SpringContextHolder;\nimport org.apache.commons.lang3.StringUtils;\nimport org.apache.rocketmq.client.producer.DefaultMQProducer;\nimport org.springframework.beans.factory.config.BeanDefinition;\nimport org.springframework.beans.factory.support.BeanDefinitionBuilder;\n\nimport java.util.concurrent.ConcurrentHashMap;\n\n/**\n * The class Mq producer bean factory.\n *\n * @author paascloud.net @gmail.com\n */\npublic class MqProducerBeanFactory {\n\n\tprivate MqProducerBeanFactory() {\n\t}\n\n\tprivate static final ConcurrentHashMap<String, DefaultMQProducer> DEFAULT_MQ_PRODUCER_MAP = new ConcurrentHashMap<>();\n\tprivate static final ConcurrentHashMap<String, String> CONSUMER_STATUS_MAP = new ConcurrentHashMap<>();\n\tprivate static final ConcurrentHashMap<String, String> PRODUCER_STATUS_MAP = new ConcurrentHashMap<>();\n\n\t/**\n\t * Gets bean.\n\t *\n\t * @param pid the pid\n\t *\n\t * @return the bean\n\t */\n\tpublic static DefaultMQProducer getBean(String pid) {\n\t\tPreconditions.checkArgument(StringUtils.isNotEmpty(pid), \"getBean() pid is null\");\n\t\treturn DEFAULT_MQ_PRODUCER_MAP.get(pid);\n\t}\n\n\t/**\n\t * Build producer bean.\n\t *\n\t * @param producerDto the producer dto\n\t */\n\tpublic static void buildProducerBean(ReliableMessageRegisterDto producerDto) {\n\n\t\tString pid = producerDto.getProducerGroup();\n\t\tDefaultMQProducer mQProducer = DEFAULT_MQ_PRODUCER_MAP.get(pid);\n\t\tif (mQProducer == null) {\n\t\t\tString simpleName = producerDto.getProducerGroup();\n\t\t\tBeanDefinitionBuilder beanDefinitionBuilder = BeanDefinitionBuilder.rootBeanDefinition(DefaultMQProducer.class);\n\t\t\tbeanDefinitionBuilder.setScope(BeanDefinition.SCOPE_SINGLETON);\n\t\t\tbeanDefinitionBuilder.addPropertyValue(\"producerGroup\", producerDto.getProducerGroup());\n\t\t\tbeanDefinitionBuilder.addPropertyValue(\"namesrvAddr\", producerDto.getNamesrvAddr());\n\t\t\tbeanDefinitionBuilder.setInitMethodName(\"start\");\n\t\t\tbeanDefinitionBuilder.setDestroyMethodName(\"shutdown\");\n\t\t\tSpringContextHolder.getDefaultListableBeanFactory().registerBeanDefinition(simpleName, beanDefinitionBuilder.getBeanDefinition());\n\t\t\tDEFAULT_MQ_PRODUCER_MAP.put(simpleName, SpringContextHolder.getBean(simpleName));\n\t\t}\n\t}\n\n\tpublic static void putCid(String cid) {\n\t\tCONSUMER_STATUS_MAP.put(cid, cid);\n\t}\n\n\tpublic static void rmCid(String cid) {\n\t\tCONSUMER_STATUS_MAP.remove(cid);\n\t}\n\n\tpublic static void putPid(final String pid) {\n\t\tPRODUCER_STATUS_MAP.put(pid, pid);\n\t}\n\n\tpublic static void rmPid(String pid) {\n\t\tPRODUCER_STATUS_MAP.remove(pid);\n\t}\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-tpc/src/main/java/com/paascloud/provider/service/OmcRpcService.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：OmcRpcService.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.service;\n\nimport org.springframework.stereotype.Service;\n\n/**\n * The class Omc rpc service.\n *\n * @author paascloud.net @gmail.com\n */\n@Service\npublic class OmcRpcService {\n\n}"
  },
  {
    "path": "paascloud-provider/paascloud-provider-tpc/src/main/java/com/paascloud/provider/service/OpcRpcService.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：OpcRpcService.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.service;\n\n\nimport com.github.pagehelper.PageInfo;\nimport com.paascloud.base.dto.MessageQueryDto;\nimport com.paascloud.base.dto.MqMessageVo;\nimport com.paascloud.base.enums.ErrorCodeEnum;\nimport com.paascloud.provider.exceptions.TpcBizException;\nimport com.paascloud.provider.model.dto.robot.ChatRobotMsgDto;\nimport com.paascloud.wrapper.Wrapper;\nimport lombok.extern.slf4j.Slf4j;\nimport org.springframework.stereotype.Component;\n\nimport javax.annotation.Resource;\n\n/**\n * The class Opc rpc service.\n *\n * @author paascloud.net @gmail.com\n */\n@Slf4j\n@Component\npublic class OpcRpcService {\n\n\t@Resource\n\tprivate DingtalkFeignApi dingtalkFeignApi;\n\t@Resource\n\tprivate OpcOssFeignApi opcOssFeignApi;\n\t@Resource\n\tprivate OpcMqMessageFeignApi opcMqMessageFeignApi;\n\n\t/**\n\t * Send chat robot msg boolean.\n\t *\n\t * @param chatRobotMsgDto the chat robot msg dto\n\t *\n\t * @return the boolean\n\t */\n\tpublic boolean sendChatRobotMsg(ChatRobotMsgDto chatRobotMsgDto) {\n\t\tWrapper<Boolean> result = dingtalkFeignApi.sendChatRobotMsg(chatRobotMsgDto);\n\t\treturn result.getResult();\n\t}\n\n\t/**\n\t * Delete expire file.\n\t */\n\tpublic void deleteExpireFile() {\n\t\topcOssFeignApi.deleteExpireFile();\n\t}\n\n\tpublic Wrapper<PageInfo<MqMessageVo>> queryMessageListWithPage(final MessageQueryDto messageQueryDto) {\n\t\tWrapper<PageInfo<MqMessageVo>> wrapper = opcMqMessageFeignApi.queryMessageListWithPage(messageQueryDto);\n\t\tif (wrapper == null) {\n\t\t\tlog.error(\"查询消息记录 失败 result is null\");\n\t\t\tthrow new TpcBizException(ErrorCodeEnum.GL99990002);\n\t\t}\n\t\treturn wrapper;\n\t}\n}"
  },
  {
    "path": "paascloud-provider/paascloud-provider-tpc/src/main/java/com/paascloud/provider/service/TpcMqConsumerService.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：TpcMqConsumerService.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.service;\n\nimport com.paascloud.core.support.IService;\nimport com.paascloud.provider.model.domain.TpcMqConsumer;\nimport com.paascloud.provider.model.vo.TpcMqConsumerVo;\nimport com.paascloud.provider.model.vo.TpcMqSubscribeVo;\n\nimport java.util.List;\n\n/**\n * The interface Tpc mq consumer service.\n *\n * @author paascloud.net @gmail.com\n */\npublic interface TpcMqConsumerService extends IService<TpcMqConsumer> {\n\t/**\n\t * 查询Mq消费者列表.\n\t *\n\t * @param tpcMqConsumer the tpc mq consumer\n\t *\n\t * @return the list\n\t */\n\tList<TpcMqConsumerVo> listConsumerVoWithPage(TpcMqConsumer tpcMqConsumer);\n\n\t/**\n\t * 查询订阅者列表.\n\t *\n\t * @param tpcMqConsumer the tpc mq consumer\n\t *\n\t * @return the list\n\t */\n\tList<TpcMqSubscribeVo> listSubscribeVoWithPage(TpcMqConsumer tpcMqConsumer);\n\n\t/**\n\t * Delete by tag id.\n\t *\n\t * @param tagId the tag id\n\t *\n\t * @return the int\n\t */\n\tint deleteSubscribeTagByTagId(Long tagId);\n\n\t/**\n\t * 根据消费者ID删除消费者.\n\t *\n\t * @param id the id\n\t *\n\t * @return the int\n\t */\n\tint deleteConsumerById(Long id);\n\n\t/**\n\t * List subscribe vo list.\n\t *\n\t * @param subscribeIdList the subscribe id list\n\t *\n\t * @return the list\n\t */\n\tList<TpcMqSubscribeVo> listSubscribeVo(List<Long> subscribeIdList);\n\n\t/**\n\t * List consumer group by topic list.\n\t *\n\t * @param topic the topic\n\t *\n\t * @return the list\n\t */\n\tList<String> listConsumerGroupByTopic(String topic);\n\n\t/**\n\t * 根据cid更新生产者状态为在线.\n\t *\n\t * @param consumerGroup the consumer group\n\t */\n\tvoid updateOnLineStatusByCid(String consumerGroup);\n\n\t/**\n\t * 根据cid更新生产者状态为离线.\n\t *\n\t * @param consumerGroup the consumer group\n\t */\n\tvoid updateOffLineStatusByCid(String consumerGroup);\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-tpc/src/main/java/com/paascloud/provider/service/TpcMqMessageService.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：TpcMqMessageService.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.service;\n\nimport com.paascloud.base.dto.MessageQueryDto;\nimport com.paascloud.provider.model.domain.TpcMqMessage;\nimport com.paascloud.provider.model.dto.MessageTaskQueryDto;\nimport com.paascloud.provider.model.dto.TpcMqMessageDto;\nimport com.paascloud.provider.model.vo.TpcMessageVo;\nimport com.paascloud.wrapper.Wrapper;\n\nimport java.util.List;\n\n/**\n * The interface Tpc mq message service.\n *\n * @author paascloud.net @gmail.com\n */\npublic interface TpcMqMessageService {\n\t/**\n\t * 预存储消息.\n\t *\n\t * @param mqMessageDto the mq message dto\n\t */\n\tvoid saveMessageWaitingConfirm(TpcMqMessageDto mqMessageDto);\n\n\n\t/**\n\t * 确认并发送消息.\n\t *\n\t * @param messageKey the message key\n\t */\n\tvoid confirmAndSendMessage(String messageKey);\n\n\n\t/**\n\t * 存储并发送消息.\n\t *\n\t * @param mqMessageDto the mq message dto\n\t */\n\tvoid saveAndSendMessage(TpcMqMessageDto mqMessageDto);\n\n\n\t/**\n\t * 直接发送消息.\n\t *\n\t * @param body       the body\n\t * @param topic      the topic\n\t * @param tag        the tag\n\t * @param key        the key\n\t * @param pid        the pid\n\t * @param delayLevel the delay level\n\t */\n\tvoid directSendMessage(String body, String topic, String tag, String key, String pid, Integer delayLevel);\n\n\n\t/**\n\t * 重发消息.\n\t *\n\t * @param messageId the message id\n\t */\n\tvoid resendMessageByMessageId(Long messageId);\n\n\n\t/**\n\t * 根据messageId重发某条消息.\n\t *\n\t * @param messageKey the message key\n\t */\n\tvoid resendMessageByMessageKey(String messageKey);\n\n\n\t/**\n\t * 将消息标记为死亡消息.\n\t *\n\t * @param messageId the message id\n\t */\n\tvoid setMessageToAlreadyDead(Long messageId);\n\n\t/**\n\t * 根据消息ID删除消息\n\t *\n\t * @param messageKey the message key\n\t */\n\tvoid deleteMessageByMessageKey(String messageKey);\n\n\n\t/**\n\t * 重发某个消息队列中的全部已死亡的消息.\n\t *\n\t * @param topicName the topic name\n\t * @param batchSize the batch size\n\t */\n\tvoid resendAllDeadMessageByTopicName(String topicName, int batchSize);\n\n\t/**\n\t * List message for waiting process list.\n\t *\n\t * @param query the query\n\t *\n\t * @return the list\n\t */\n\tList<TpcMqMessage> listMessageForWaitingProcess(MessageTaskQueryDto query);\n\n\t/**\n\t * 确认收到消息.\n\t *\n\t * @param cid        the cid\n\t * @param messageKey the message key\n\t */\n\tvoid confirmReceiveMessage(String cid, String messageKey);\n\n\t/**\n\t * 确认消费消息.\n\t *\n\t * @param cid        the cid\n\t * @param messageKey the message key\n\t */\n\tvoid confirmConsumedMessage(String cid, String messageKey);\n\n\t/**\n\t * 更新消息确认状态.\n\t *\n\t * @param cid        the cid\n\t * @param messageKey the message key\n\t *\n\t * @return the int\n\t */\n\tint updateMqConfirmStatus(String cid, String messageKey);\n\n\t/**\n\t * 根据topic创建待确认的消息确认列表.\n\t *\n\t * @param topic      the topic\n\t * @param messageId  the message id\n\t * @param messageKey the message key\n\t */\n\tvoid createMqConfirmListByTopic(String topic, Long messageId, String messageKey);\n\n\t/**\n\t * 查询发送中且超时的消息.\n\t *\n\t * @param query the query\n\t *\n\t * @return the list\n\t */\n\tList<String> queryWaitingConfirmMessageKeyList(MessageTaskQueryDto query);\n\n\t/**\n\t * Handle waiting confirm message.\n\t *\n\t * @param deleteKeyList the delete key list\n\t * @param resendKeyList the resend key list\n\t */\n\tvoid handleWaitingConfirmMessage(List<String> deleteKeyList, List<String> resendKeyList);\n\n\t/**\n\t * 更新任务状态.\n\t *\n\t * @param message the message\n\t *\n\t * @return the int\n\t */\n\tint updateMqMessageTaskStatus(TpcMqMessage message);\n\n\t/**\n\t * Update mq message status.\n\t *\n\t * @param update the update\n\t *\n\t * @return the int\n\t */\n\tint updateMqMessageStatus(TpcMqMessage update);\n\n\t/**\n\t * Query record list with page page info.\n\t *\n\t * @param tpcMessageQueryDto the tpc message query dto\n\t *\n\t * @return the page info\n\t */\n\tWrapper queryRecordListWithPage(MessageQueryDto tpcMessageQueryDto);\n\n\t/**\n\t * List reliable message vo list.\n\t *\n\t * @param tpcMessageQueryDto the tpc message query dto\n\t *\n\t * @return the list\n\t */\n\tList<TpcMessageVo> listReliableMessageVo(MessageQueryDto tpcMessageQueryDto);\n\n\t/**\n\t * List reliable message vo list.\n\t *\n\t * @param messageIdList the message id list\n\t *\n\t * @return the list\n\t */\n\tList<TpcMessageVo> listReliableMessageVo(List<Long> messageIdList);\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-tpc/src/main/java/com/paascloud/provider/service/TpcMqProducerService.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：TpcMqProducerService.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.service;\n\nimport com.paascloud.core.support.IService;\nimport com.paascloud.provider.model.domain.TpcMqProducer;\nimport com.paascloud.provider.model.vo.TpcMqProducerVo;\nimport com.paascloud.provider.model.vo.TpcMqPublishVo;\n\nimport java.util.List;\n\n/**\n * The interface Tpc mq producer service.\n *\n * @author paascloud.net @gmail.com\n */\npublic interface TpcMqProducerService extends IService<TpcMqProducer> {\n\t/**\n\t * List producer vo with page list.\n\t *\n\t * @param mdcMqProducer the mdc mq producer\n\t *\n\t * @return the list\n\t */\n\tList<TpcMqProducerVo> listProducerVoWithPage(TpcMqProducer mdcMqProducer);\n\n\t/**\n\t * 查询发布者列表.\n\t *\n\t * @param mdcMqProducer the mdc mq producer\n\t *\n\t * @return the list\n\t */\n\tList<TpcMqPublishVo> listPublishVoWithPage(TpcMqProducer mdcMqProducer);\n\n\t/**\n\t * 根据生产者ID删除生产者.\n\t *\n\t * @param id the id\n\t *\n\t * @return the int\n\t */\n\tint deleteProducerById(Long id);\n\n\t/**\n\t * 根据pid更新生产者状态为在线.\n\t *\n\t * @param producerGroup the producer group\n\t */\n\tvoid updateOnLineStatusByPid(String producerGroup);\n\n\t/**\n\t * 根据pid更新生产者状态为离线.\n\t *\n\t * @param producerGroup the producer group\n\t */\n\tvoid updateOffLineStatusByPid(String producerGroup);\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-tpc/src/main/java/com/paascloud/provider/service/TpcMqTagService.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：TpcMqTagService.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.service;\n\nimport com.paascloud.core.support.IService;\nimport com.paascloud.provider.model.domain.TpcMqTag;\nimport com.paascloud.provider.model.vo.TpcMqTagVo;\n\nimport java.util.List;\n\n/**\n * The interface Tpc mq tag service.\n *\n * @author paascloud.net @gmail.com\n */\npublic interface TpcMqTagService extends IService<TpcMqTag> {\n\t/**\n\t * 查询Tag列表.\n\t *\n\t * @param mdcMqTag the mdc mq tag\n\t *\n\t * @return the list\n\t */\n\tList<TpcMqTagVo> listWithPage(TpcMqTag mdcMqTag);\n\n\t/**\n\t * 根据ID删除TAG.\n\t *\n\t * @param tagId the tag id\n\t *\n\t * @return the int\n\t */\n\tint deleteTagById(Long tagId);\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-tpc/src/main/java/com/paascloud/provider/service/TpcMqTopicService.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：TpcMqTopicService.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.service;\n\nimport com.paascloud.core.support.IService;\nimport com.paascloud.provider.model.domain.TpcMqTopic;\nimport com.paascloud.provider.model.vo.TpcMqTopicVo;\n\nimport java.util.List;\n\n/**\n * The interface Tpc mq topic service.\n *\n * @author paascloud.net @gmail.com\n */\npublic interface TpcMqTopicService extends IService<TpcMqTopic> {\n\t/**\n\t * 查询MQ topic列表.\n\t *\n\t * @param mdcMqTopic the mdc mq topic\n\t *\n\t * @return the list\n\t */\n\tList<TpcMqTopicVo> listWithPage(TpcMqTopic mdcMqTopic);\n\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-tpc/src/main/java/com/paascloud/provider/service/UacRpcService.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：UacRpcService.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.service;\n\nimport com.github.pagehelper.PageInfo;\nimport com.paascloud.base.dto.MessageQueryDto;\nimport com.paascloud.base.dto.MqMessageVo;\nimport com.paascloud.base.enums.ErrorCodeEnum;\nimport com.paascloud.provider.exceptions.TpcBizException;\nimport com.paascloud.provider.model.service.UacMqMessageFeignApi;\nimport com.paascloud.provider.model.service.UacUserTokenFeignApi;\nimport com.paascloud.wrapper.Wrapper;\nimport lombok.extern.slf4j.Slf4j;\nimport org.springframework.retry.annotation.Backoff;\nimport org.springframework.retry.annotation.Retryable;\nimport org.springframework.stereotype.Service;\n\nimport javax.annotation.Resource;\nimport java.util.List;\n\n/**\n * The class Uac rpc service.\n *\n * @author paascloud.net @gmail.com\n */\n@Service\n@Slf4j\npublic class UacRpcService {\n\t@Resource\n\tprivate UacUserTokenFeignApi uacUserTokenFeignApi;\n\t@Resource\n\tprivate UacMqMessageFeignApi uacMqMessageFeignApi;\n\n\t@Retryable(value = Exception.class, backoff = @Backoff(delay = 5000, multiplier = 2))\n\tpublic void batchUpdateTokenOffLine() {\n\t\tWrapper<Integer> wrapper = uacUserTokenFeignApi.updateTokenOffLine();\n\t\tif (wrapper == null) {\n\t\t\tlog.error(\"updateTokenOffLine 失败 result is null\");\n\t\t\treturn;\n\t\t}\n\t\tInteger result = wrapper.getResult();\n\t\tif (result == null || result == 0) {\n\t\t\tlog.error(\"updateTokenOffLine 失败\");\n\t\t} else {\n\t\t\tlog.error(\"updateTokenOffLine 成功\");\n\t\t}\n\t}\n\n\tpublic List<String> queryWaitingConfirmMessageKeyList(List<String> messageKeyList) {\n\t\tWrapper<List<String>> wrapper = uacMqMessageFeignApi.queryMessageKeyList(messageKeyList);\n\t\tif (wrapper == null) {\n\t\t\tlog.error(\"queryWaitingConfirmMessageKeyList 失败 result is null\");\n\t\t\tthrow new TpcBizException(ErrorCodeEnum.GL99990002);\n\t\t}\n\t\treturn wrapper.getResult();\n\t}\n\n\tpublic Wrapper<PageInfo<MqMessageVo>> queryMessageListWithPage(MessageQueryDto messageQueryDto) {\n\t\tWrapper<PageInfo<MqMessageVo>> wrapper = uacMqMessageFeignApi.queryMessageListWithPage(messageQueryDto);\n\t\tif (wrapper == null) {\n\t\t\tlog.error(\"查询消息记录 失败 result is null\");\n\t\t\tthrow new TpcBizException(ErrorCodeEnum.GL99990002);\n\t\t}\n\t\treturn wrapper;\n\t}\n\n}"
  },
  {
    "path": "paascloud-provider/paascloud-provider-tpc/src/main/java/com/paascloud/provider/service/impl/TpcMqConsumerServiceImpl.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：TpcMqConsumerServiceImpl.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.service.impl;\n\nimport com.paascloud.PublicUtil;\nimport com.paascloud.core.support.BaseService;\nimport com.paascloud.provider.mapper.TpcMqConsumerMapper;\nimport com.paascloud.provider.model.domain.TpcMqConsumer;\nimport com.paascloud.provider.model.vo.TpcMqConsumerVo;\nimport com.paascloud.provider.model.vo.TpcMqSubscribeVo;\nimport com.paascloud.provider.service.TpcMqConsumerService;\nimport org.springframework.stereotype.Service;\nimport org.springframework.transaction.annotation.Transactional;\n\nimport javax.annotation.Resource;\nimport java.util.List;\n\n/**\n * The class Tpc mq consumer service.\n *\n * @author paascloud.net @gmail.com\n */\n@Service\n@Transactional(rollbackFor = Exception.class)\npublic class TpcMqConsumerServiceImpl extends BaseService<TpcMqConsumer> implements TpcMqConsumerService {\n\t@Resource\n\tprivate TpcMqConsumerMapper tpcMqConsumerMapper;\n\n\t@Override\n\tpublic List<TpcMqConsumerVo> listConsumerVoWithPage(TpcMqConsumer tpcMqConsumer) {\n\t\treturn tpcMqConsumerMapper.listTpcMqConsumerVoWithPage(tpcMqConsumer);\n\t}\n\n\t@Override\n\tpublic List<TpcMqSubscribeVo> listSubscribeVoWithPage(TpcMqConsumer tpcMqConsumer) {\n\t\treturn tpcMqConsumerMapper.listTpcMqSubscribeVoWithPage(tpcMqConsumer);\n\t}\n\n\t@Override\n\tpublic int deleteSubscribeTagByTagId(Long tagId) {\n\t\treturn tpcMqConsumerMapper.deleteSubscribeTagByTagId(tagId);\n\t}\n\n\t@Override\n\tpublic int deleteConsumerById(Long consumerId) {\n\t\t// 删除消费者\n\t\ttpcMqConsumerMapper.deleteByPrimaryKey(consumerId);\n\t\t// 删除订阅关系\n\t\tList<Long> subscribeIdList = tpcMqConsumerMapper.listSubscribeIdByConsumerId(consumerId);\n\t\tif (PublicUtil.isNotEmpty(subscribeIdList)) {\n\t\t\ttpcMqConsumerMapper.deleteSubscribeByConsumerId(consumerId);\n\t\t\t// 删除订阅tag\n\t\t\ttpcMqConsumerMapper.deleteSubscribeTagBySubscribeIdList(subscribeIdList);\n\t\t}\n\t\treturn 1;\n\t}\n\n\t@Override\n\tpublic List<TpcMqSubscribeVo> listSubscribeVo(List<Long> subscribeIdList) {\n\t\treturn tpcMqConsumerMapper.listSubscribeVo(subscribeIdList);\n\t}\n\n\t@Override\n\tpublic List<String> listConsumerGroupByTopic(final String topic) {\n\t\treturn tpcMqConsumerMapper.listConsumerGroupByTopic(topic);\n\t}\n\n\t@Override\n\tpublic void updateOnLineStatusByCid(final String consumerGroup) {\n\t\tlogger.info(\"更新消费者cid={}状态为在线\", consumerGroup);\n\t\tthis.updateStatus(consumerGroup, 10);\n\n\t}\n\n\t@Override\n\tpublic void updateOffLineStatusByCid(final String consumerGroup) {\n\t\tlogger.info(\"更新消费者cid={}状态为离线\", consumerGroup);\n\t\tthis.updateStatus(consumerGroup, 20);\n\t}\n\n\tprivate void updateStatus(final String consumerGroup, final int status) {\n\t\tTpcMqConsumer tpcMqConsumer = tpcMqConsumerMapper.getByCid(consumerGroup);\n\t\tif (tpcMqConsumer.getStatus() != null && tpcMqConsumer.getStatus() != status) {\n\t\t\tTpcMqConsumer update = new TpcMqConsumer();\n\t\t\tupdate.setStatus(status);\n\t\t\tupdate.setId(tpcMqConsumer.getId());\n\t\t\ttpcMqConsumerMapper.updateByPrimaryKeySelective(update);\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-tpc/src/main/java/com/paascloud/provider/service/impl/TpcMqMessageServiceImpl.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：TpcMqMessageServiceImpl.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.service.impl;\n\nimport com.github.pagehelper.PageInfo;\nimport com.google.common.base.Preconditions;\nimport com.google.common.collect.Lists;\nimport com.paascloud.PublicUtil;\nimport com.paascloud.base.dto.MessageQueryDto;\nimport com.paascloud.base.dto.MqMessageVo;\nimport com.paascloud.base.enums.ErrorCodeEnum;\nimport com.paascloud.core.generator.UniqueIdGenerator;\nimport com.paascloud.core.support.BaseService;\nimport com.paascloud.provider.exceptions.TpcBizException;\nimport com.paascloud.provider.mapper.TpcMqConfirmMapper;\nimport com.paascloud.provider.mapper.TpcMqMessageMapper;\nimport com.paascloud.provider.model.domain.TpcMqConfirm;\nimport com.paascloud.provider.model.domain.TpcMqMessage;\nimport com.paascloud.provider.model.dto.MessageTaskQueryDto;\nimport com.paascloud.provider.model.dto.TpcMqMessageDto;\nimport com.paascloud.provider.model.enums.MqSendStatusEnum;\nimport com.paascloud.provider.model.enums.PIDEnum;\nimport com.paascloud.provider.model.vo.TpcMessageVo;\nimport com.paascloud.provider.mq.RocketMqProducer;\nimport com.paascloud.provider.service.*;\nimport com.paascloud.wrapper.WrapMapper;\nimport com.paascloud.wrapper.Wrapper;\nimport lombok.extern.slf4j.Slf4j;\nimport org.apache.commons.lang3.StringUtils;\nimport org.modelmapper.ModelMapper;\nimport org.springframework.stereotype.Service;\nimport org.springframework.transaction.annotation.Transactional;\n\nimport javax.annotation.Resource;\nimport java.util.Date;\nimport java.util.List;\n\n/**\n * The class Tpc mq message service.\n *\n * @author paascloud.net @gmail.com\n */\n@Service\n@Slf4j\n@Transactional(rollbackFor = Throwable.class)\npublic class TpcMqMessageServiceImpl extends BaseService<TpcMqMessage> implements TpcMqMessageService {\n\t@Resource\n\tprivate TpcMqMessageMapper tpcMqMessageMapper;\n\t@Resource\n\tprivate TpcMqConfirmMapper tpcMqConfirmMapper;\n\t@Resource\n\tprivate TpcMqConsumerService tpcMqConsumerService;\n\t@Resource\n\tprivate UacRpcService uacRpcService;\n\t@Resource\n\tprivate MdcRpcService mdcRpcService;\n\t@Resource\n\tprivate OpcRpcService opcRpcService;\n\n\t@Override\n\tpublic void saveMessageWaitingConfirm(TpcMqMessageDto messageDto) {\n\n\t\tif (StringUtils.isEmpty(messageDto.getMessageTopic())) {\n\t\t\tthrow new TpcBizException(ErrorCodeEnum.TPC10050001);\n\t\t}\n\n\t\tDate now = new Date();\n\t\tTpcMqMessage message = new ModelMapper().map(messageDto, TpcMqMessage.class);\n\t\tmessage.setMessageStatus(MqSendStatusEnum.WAIT_SEND.sendStatus());\n\t\tmessage.setUpdateTime(now);\n\t\tmessage.setCreatedTime(now);\n\t\ttpcMqMessageMapper.insertSelective(message);\n\t}\n\n\t@Override\n\tpublic void confirmAndSendMessage(String messageKey) {\n\t\tfinal TpcMqMessage message = tpcMqMessageMapper.getByMessageKey(messageKey);\n\t\tif (message == null) {\n\t\t\tthrow new TpcBizException(ErrorCodeEnum.TPC10050002);\n\t\t}\n\n\t\tTpcMqMessage update = new TpcMqMessage();\n\t\tupdate.setMessageStatus(MqSendStatusEnum.SENDING.sendStatus());\n\t\tupdate.setId(message.getId());\n\t\tupdate.setUpdateTime(new Date());\n\t\ttpcMqMessageMapper.updateByPrimaryKeySelective(update);\n\t\t// 创建消费待确认列表\n\t\tthis.createMqConfirmListByTopic(message.getMessageTopic(), message.getId(), message.getMessageKey());\n\t\t// 直接发送消息\n\t\tthis.directSendMessage(message.getMessageBody(), message.getMessageTopic(), message.getMessageTag(), message.getMessageKey(), message.getProducerGroup(), message.getDelayLevel());\n\t}\n\n\t@Override\n\tpublic void saveAndSendMessage(TpcMqMessageDto tpcMqMessageDto) {\n\t\tif (StringUtils.isEmpty(tpcMqMessageDto.getMessageTopic())) {\n\t\t\tthrow new TpcBizException(ErrorCodeEnum.TPC10050001);\n\t\t}\n\n\t\tDate now = new Date();\n\t\tTpcMqMessage message = new ModelMapper().map(tpcMqMessageDto, TpcMqMessage.class);\n\t\tmessage.setMessageStatus(MqSendStatusEnum.SENDING.sendStatus());\n\t\tmessage.setId(generateId());\n\t\tmessage.setUpdateTime(now);\n\t\tmessage.setCreatedTime(now);\n\n\t\ttpcMqMessageMapper.insertSelective(message);\n\t\t// 创建消费待确认列表\n\t\tthis.createMqConfirmListByTopic(message.getMessageTopic(), message.getId(), message.getMessageKey());\n\t\tthis.directSendMessage(tpcMqMessageDto.getMessageBody(), tpcMqMessageDto.getMessageTopic(), tpcMqMessageDto.getMessageTag(), tpcMqMessageDto.getMessageKey(), tpcMqMessageDto.getProducerGroup(), tpcMqMessageDto.getDelayLevel());\n\t}\n\n\t@Override\n\tpublic void directSendMessage(String body, String topic, String tag, String key, String pid, Integer delayLevel) {\n\t\tRocketMqProducer.sendSimpleMessage(body, topic, tag, key, pid, delayLevel);\n\t}\n\n\t@Override\n\tpublic void resendMessageByMessageId(Long messageId) {\n\t\tfinal TpcMqMessage message = tpcMqMessageMapper.selectByPrimaryKey(messageId);\n\t\tif (message == null) {\n\t\t\tthrow new TpcBizException(ErrorCodeEnum.TPC10050006);\n\t\t}\n\t\tthis.resendMessage(message);\n\t}\n\n\t@Override\n\tpublic void resendMessageByMessageKey(String messageKey) {\n\t\tfinal TpcMqMessage task = tpcMqMessageMapper.getByMessageKey(messageKey);\n\t\tthis.resendMessage(task);\n\t}\n\n\t@Override\n\tpublic void setMessageToAlreadyDead(Long messageId) {\n\t\tfinal TpcMqMessage task = tpcMqMessageMapper.selectByPrimaryKey(messageId);\n\t\tif (task == null) {\n\t\t\tthrow new TpcBizException(ErrorCodeEnum.TPC10050006);\n\t\t}\n\n\t\ttpcMqMessageMapper.updateAlreadyDeadByMessageId(messageId);\n\t}\n\n\t@Override\n\tpublic void deleteMessageByMessageKey(String messageKey) {\n\n\t\tint result = tpcMqMessageMapper.deleteMessageByMessageKey(messageKey);\n\t\tif (result < 1) {\n\t\t\tthrow new TpcBizException(ErrorCodeEnum.TPC10050003, messageKey);\n\t\t}\n\t}\n\n\t@Override\n\tpublic void resendAllDeadMessageByTopicName(String topicName, int batchSize) {\n\t\t// 1.查询该topic下所有死亡的消息\n\t\t// 2.分页\n\t}\n\n\t@Override\n\tpublic List<TpcMqMessage> listMessageForWaitingProcess(MessageTaskQueryDto query) {\n\t\treturn tpcMqMessageMapper.listMessageForWaitingProcess(query);\n\t}\n\n\t@Override\n\tpublic void confirmReceiveMessage(final String cid, final String messageKey) {\n\t\t// 1. 校验cid\n\t\t// 2. 校验messageKey\n\t\t// 3. 校验cid 和 messageKey\n\t\tLong confirmId = tpcMqConfirmMapper.getIdMqConfirm(cid, messageKey);\n\t\t// 3. 更新消费信息的状态\n\t\ttpcMqConfirmMapper.confirmReceiveMessage(confirmId);\n\t}\n\n\t@Override\n\tpublic void confirmConsumedMessage(final String cid, final String messageKey) {\n\t\tLong confirmId = tpcMqConfirmMapper.getIdMqConfirm(cid, messageKey);\n\t\ttpcMqConfirmMapper.confirmConsumedMessage(confirmId);\n\t}\n\n\t@Override\n\tpublic int updateMqConfirmStatus(final String cid, final String messageKey) {\n\t\treturn 0;\n\t}\n\n\t@Override\n\tpublic void createMqConfirmListByTopic(final String topic, final Long messageId, final String messageKey) {\n\t\tList<TpcMqConfirm> list = Lists.newArrayList();\n\t\tTpcMqConfirm tpcMqConfirm;\n\t\tList<String> consumerGroupList = tpcMqConsumerService.listConsumerGroupByTopic(topic);\n\t\tif (PublicUtil.isEmpty(consumerGroupList)) {\n\t\t\tthrow new TpcBizException(ErrorCodeEnum.TPC100500010, topic);\n\t\t}\n\t\tfor (final String cid : consumerGroupList) {\n\t\t\ttpcMqConfirm = new TpcMqConfirm(UniqueIdGenerator.generateId(), messageId, messageKey, cid);\n\t\t\tlist.add(tpcMqConfirm);\n\t\t}\n\n\t\ttpcMqConfirmMapper.batchCreateMqConfirm(list);\n\t}\n\n\t@Override\n\tpublic List<String> queryWaitingConfirmMessageKeyList(final MessageTaskQueryDto query) {\n\t\treturn tpcMqMessageMapper.queryWaitingConfirmMessageKeyList(query);\n\t}\n\n\t@Override\n\tpublic void handleWaitingConfirmMessage(final List<String> deleteKeyList, final List<String> resendKeyList) {\n\t\ttpcMqMessageMapper.batchDeleteMessage(deleteKeyList);\n\t\tfor (final String messageKey : resendKeyList) {\n\t\t\tthis.confirmAndSendMessage(messageKey);\n\t\t}\n\t}\n\n\t@Override\n\tpublic int updateMqMessageTaskStatus(final TpcMqMessage message) {\n\t\treturn tpcMqMessageMapper.updateMqMessageTaskStatus(message);\n\t}\n\n\t@Override\n\tpublic int updateMqMessageStatus(final TpcMqMessage update) {\n\t\treturn tpcMqMessageMapper.updateByPrimaryKeySelective(update);\n\t}\n\n\t@Override\n\tpublic Wrapper queryRecordListWithPage(final MessageQueryDto messageQueryDto) {\n\t\tString producerGroup = messageQueryDto.getProducerGroup();\n\t\tString messageKey = messageQueryDto.getMessageKey();\n\t\tPreconditions.checkArgument(StringUtils.isNotEmpty(producerGroup) || StringUtils.isNotEmpty(messageKey), \"messageKey 和 pid 必须选择一个\");\n\t\tif (StringUtils.isEmpty(producerGroup)) {\n\t\t\tList<MqMessageVo> result = Lists.newArrayList();\n\t\t\tWrapper<PageInfo<MqMessageVo>> uacWrapper = uacRpcService.queryMessageListWithPage(messageQueryDto);\n\t\t\tWrapper<PageInfo<MqMessageVo>> mdcWrapper = mdcRpcService.queryMessageListWithPage(messageQueryDto);\n\t\t\tWrapper<PageInfo<MqMessageVo>> opcWrapper = opcRpcService.queryMessageListWithPage(messageQueryDto);\n\n\t\t\tif (uacWrapper != null && uacWrapper.getResult() != null) {\n\t\t\t\tList<MqMessageVo> list = uacWrapper.getResult().getList();\n\t\t\t\tresult.addAll(list);\n\t\t\t}\n\t\t\tif (mdcWrapper != null && mdcWrapper.getResult() != null) {\n\t\t\t\tList<MqMessageVo> list = mdcWrapper.getResult().getList();\n\t\t\t\tresult.addAll(list);\n\t\t\t}\n\t\t\tif (opcWrapper != null && opcWrapper.getResult() != null) {\n\t\t\t\tList<MqMessageVo> list = opcWrapper.getResult().getList();\n\t\t\t\tresult.addAll(list);\n\t\t\t}\n\t\t\treturn WrapMapper.ok(new PageInfo<>(result));\n\t\t}\n\t\tif (StringUtils.equals(PIDEnum.PID_UAC.name(), producerGroup)) {\n\t\t\treturn uacRpcService.queryMessageListWithPage(messageQueryDto);\n\t\t} else if (StringUtils.equals(PIDEnum.PID_MDC.name(), producerGroup)) {\n\t\t\treturn mdcRpcService.queryMessageListWithPage(messageQueryDto);\n\t\t} else if (StringUtils.equals(PIDEnum.PID_OPC.name(), producerGroup)) {\n\t\t\treturn opcRpcService.queryMessageListWithPage(messageQueryDto);\n\t\t} else {\n\t\t\tlog.error(\"pid没有维护 pid={}\", producerGroup);\n\t\t}\n\t\treturn null;\n\t}\n\n\t@Override\n\tpublic List<TpcMessageVo> listReliableMessageVo(final MessageQueryDto messageQueryDto) {\n\t\treturn tpcMqMessageMapper.listReliableMessageVoWithPage(messageQueryDto);\n\t}\n\n\t@Override\n\tpublic List<TpcMessageVo> listReliableMessageVo(final List<Long> messageIdList) {\n\t\treturn tpcMqMessageMapper.listReliableMessageVo(messageIdList);\n\t}\n\n\tprivate void resendMessage(TpcMqMessage message) {\n\t\tif (message == null) {\n\t\t\tthrow new TpcBizException(ErrorCodeEnum.TPC10050002);\n\t\t}\n\t\ttpcMqMessageMapper.addTaskExeCountById(message.getId());\n\t\t//TODO 记录重发日志 1.系统自动重发 2.人工重发\n\t\tthis.directSendMessage(message.getMessageBody(), message.getMessageTopic(), message.getMessageTag(), message.getMessageKey(), message.getProducerGroup(), message.getDelayLevel());\n\t}\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-tpc/src/main/java/com/paascloud/provider/service/impl/TpcMqProducerServiceImpl.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：TpcMqProducerServiceImpl.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.service.impl;\n\nimport com.paascloud.core.support.BaseService;\nimport com.paascloud.provider.mapper.TpcMqProducerMapper;\nimport com.paascloud.provider.model.domain.TpcMqProducer;\nimport com.paascloud.provider.model.vo.TpcMqProducerVo;\nimport com.paascloud.provider.model.vo.TpcMqPublishVo;\nimport com.paascloud.provider.service.TpcMqProducerService;\nimport org.springframework.stereotype.Service;\nimport org.springframework.transaction.annotation.Transactional;\n\nimport javax.annotation.Resource;\nimport java.util.List;\n\n/**\n * The class Tpc mq producer service.\n *\n * @author paascloud.net @gmail.com\n */\n@Service\n@Transactional(rollbackFor = Exception.class)\npublic class TpcMqProducerServiceImpl extends BaseService<TpcMqProducer> implements TpcMqProducerService {\n\n\t@Resource\n\tprivate TpcMqProducerMapper mdcMqProducerMapper;\n\n\t@Override\n\tpublic List<TpcMqProducerVo> listProducerVoWithPage(TpcMqProducer mdcMqProducer) {\n\t\treturn mdcMqProducerMapper.listTpcMqProducerVoWithPage(mdcMqProducer);\n\t}\n\n\t@Override\n\tpublic List<TpcMqPublishVo> listPublishVoWithPage(TpcMqProducer mdcMqProducer) {\n\t\treturn mdcMqProducerMapper.listTpcMqPublishVoWithPage(mdcMqProducer);\n\t}\n\n\t@Override\n\tpublic int deleteProducerById(Long producerId) {\n\t\t// 删除consumer\n\t\tmdcMqProducerMapper.deleteByPrimaryKey(producerId);\n\t\t// 删除发布关系\n\t\treturn mdcMqProducerMapper.deletePublishByProducerId(producerId);\n\t}\n\n\t@Override\n\tpublic void updateOnLineStatusByPid(final String producerGroup) {\n\t\tlogger.info(\"更新生产者pid={}状态为在线\", producerGroup);\n\t\tthis.updateStatus(producerGroup, 10);\n\n\t}\n\n\t@Override\n\tpublic void updateOffLineStatusByPid(final String producerGroup) {\n\t\tlogger.info(\"更新生产者pid={}状态为离线\", producerGroup);\n\t\tthis.updateStatus(producerGroup, 20);\n\t}\n\n\tprivate void updateStatus(final String producerGroup, final int status) {\n\t\tTpcMqProducer tpcMqProducer = mdcMqProducerMapper.getByPid(producerGroup);\n\t\tif (tpcMqProducer.getStatus() != null && tpcMqProducer.getStatus() != status) {\n\t\t\tTpcMqProducer update = new TpcMqProducer();\n\t\t\tupdate.setStatus(status);\n\t\t\tupdate.setId(tpcMqProducer.getId());\n\t\t\tmdcMqProducerMapper.updateByPrimaryKeySelective(update);\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-tpc/src/main/java/com/paascloud/provider/service/impl/TpcMqTagServiceImpl.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：TpcMqTagServiceImpl.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.service.impl;\n\nimport com.paascloud.core.support.BaseService;\nimport com.paascloud.provider.mapper.TpcMqTagMapper;\nimport com.paascloud.provider.model.domain.TpcMqTag;\nimport com.paascloud.provider.model.vo.TpcMqTagVo;\nimport com.paascloud.provider.service.TpcMqConsumerService;\nimport com.paascloud.provider.service.TpcMqTagService;\nimport org.springframework.stereotype.Service;\nimport org.springframework.transaction.annotation.Transactional;\n\nimport javax.annotation.Resource;\nimport java.util.List;\n\n/**\n * The class Tpc mq tag service.\n *\n * @author paascloud.net @gmail.com\n */\n@Service\n@Transactional(rollbackFor = Exception.class)\npublic class TpcMqTagServiceImpl extends BaseService<TpcMqTag> implements TpcMqTagService {\n\n\t@Resource\n\tprivate TpcMqTagMapper mdcMqTagMapper;\n\t@Resource\n\tprivate TpcMqConsumerService mdcMqConsumerService;\n\n\t@Override\n\tpublic List<TpcMqTagVo> listWithPage(TpcMqTag mdcMqTag) {\n\t\treturn mdcMqTagMapper.listTpcMqTagVoWithPage(mdcMqTag);\n\t}\n\n\t@Override\n\tpublic int deleteTagById(Long tagId) {\n\t\t// 删除订阅的tag\n\t\tmdcMqConsumerService.deleteSubscribeTagByTagId(tagId);\n\t\t// 删除tag\n\t\treturn mdcMqTagMapper.deleteByPrimaryKey(tagId);\n\t}\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-tpc/src/main/java/com/paascloud/provider/service/impl/TpcMqTopicServiceImpl.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：TpcMqTopicServiceImpl.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.service.impl;\n\nimport com.paascloud.core.support.BaseService;\nimport com.paascloud.provider.mapper.TpcMqTopicMapper;\nimport com.paascloud.provider.model.domain.TpcMqTopic;\nimport com.paascloud.provider.model.vo.TpcMqTopicVo;\nimport com.paascloud.provider.service.TpcMqTopicService;\nimport org.springframework.stereotype.Service;\nimport org.springframework.transaction.annotation.Transactional;\n\nimport javax.annotation.Resource;\nimport java.util.List;\n\n/**\n * The class Tpc mq topic service.\n *\n * @author paascloud.net @gmail.com\n */\n@Service\n@Transactional(rollbackFor = Exception.class)\npublic class TpcMqTopicServiceImpl extends BaseService<TpcMqTopic> implements TpcMqTopicService {\n\t@Resource\n\tprivate TpcMqTopicMapper mdcMqTopicMapper;\n\n\t@Override\n\tpublic List<TpcMqTopicVo> listWithPage(TpcMqTopic mdcMqTopic) {\n\t\treturn mdcMqTopicMapper.listTpcMqTopicVoWithPage(mdcMqTopic);\n\t}\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-tpc/src/main/java/com/paascloud/provider/web/GlobalExceptionHandler.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：GlobalExceptionHandler.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.web;\n\n\nimport com.paascloud.base.enums.ErrorCodeEnum;\nimport com.paascloud.base.exception.BusinessException;\nimport com.paascloud.provider.model.dto.GlobalExceptionLogDto;\nimport com.paascloud.provider.service.MdcExceptionLogFeignApi;\nimport com.paascloud.wrapper.WrapMapper;\nimport com.paascloud.wrapper.Wrapper;\nimport lombok.extern.slf4j.Slf4j;\nimport org.springframework.beans.factory.annotation.Value;\nimport org.springframework.core.task.TaskExecutor;\nimport org.springframework.http.HttpStatus;\nimport org.springframework.web.bind.annotation.ExceptionHandler;\nimport org.springframework.web.bind.annotation.ResponseBody;\nimport org.springframework.web.bind.annotation.ResponseStatus;\nimport org.springframework.web.bind.annotation.RestControllerAdvice;\n\nimport javax.annotation.Resource;\n\n/**\n * 全局的的异常拦截器\n *\n * @author paascloud.net @gmail.com\n */\n@Slf4j\n@RestControllerAdvice\npublic class GlobalExceptionHandler {\n\t@Resource\n\tprivate TaskExecutor taskExecutor;\n\t@Value(\"${spring.profiles.active}\")\n\tString profile;\n\t@Value(\"${spring.application.name}\")\n\tString applicationName;\n\t@Resource\n\tprivate MdcExceptionLogFeignApi mdcExceptionLogFeignApi;\n\n\t/**\n\t * 参数非法异常.\n\t *\n\t * @param e the e\n\t *\n\t * @return the wrapper\n\t */\n\t@ExceptionHandler(IllegalArgumentException.class)\n\t@ResponseStatus(HttpStatus.OK)\n\t@ResponseBody\n\tpublic Wrapper illegalArgumentException(IllegalArgumentException e) {\n\t\tlog.error(\"参数非法异常={}\", e.getMessage(), e);\n\t\treturn WrapMapper.wrap(ErrorCodeEnum.GL99990100.code(), e.getMessage());\n\t}\n\n\t/**\n\t * 业务异常.\n\t *\n\t * @param e the e\n\t *\n\t * @return the wrapper\n\t */\n\t@ExceptionHandler(BusinessException.class)\n\t@ResponseStatus(HttpStatus.OK)\n\t@ResponseBody\n\tpublic Wrapper businessException(BusinessException e) {\n\t\tlog.error(\"业务异常={}\", e.getMessage(), e);\n\t\treturn WrapMapper.wrap(e.getCode() == 0 ? Wrapper.ERROR_CODE : e.getCode(), e.getMessage());\n\t}\n\n\n\t/**\n\t * 全局异常.\n\t *\n\t * @param e the e\n\t *\n\t * @return the wrapper\n\t */\n\t@ExceptionHandler(Exception.class)\n\t@ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)\n\t@ResponseBody\n\tpublic Wrapper exception(Exception e) {\n\t\tlog.info(\"保存全局异常信息 ex={}\", e.getMessage(), e);\n\t\ttaskExecutor.execute(() -> {\n\t\t\tGlobalExceptionLogDto globalExceptionLogDto = new GlobalExceptionLogDto().getGlobalExceptionLogDto(e, profile, applicationName);\n\t\t\tmdcExceptionLogFeignApi.saveAndSendExceptionLog(globalExceptionLogDto);\n\t\t});\n\t\treturn WrapMapper.error();\n\t}\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-tpc/src/main/java/com/paascloud/provider/web/frontend/TpcMessageMainController.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：TpcMessageMainController.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.web.frontend;\n\nimport com.github.pagehelper.PageHelper;\nimport com.github.pagehelper.PageInfo;\nimport com.paascloud.PublicUtil;\nimport com.paascloud.base.dto.MessageQueryDto;\nimport com.paascloud.core.support.BaseController;\nimport com.paascloud.provider.model.vo.TpcMessageVo;\nimport com.paascloud.provider.service.TpcMqMessageService;\nimport com.paascloud.wrapper.WrapMapper;\nimport com.paascloud.wrapper.Wrapper;\nimport io.swagger.annotations.Api;\nimport io.swagger.annotations.ApiOperation;\nimport io.swagger.annotations.ApiParam;\nimport org.springframework.http.MediaType;\nimport org.springframework.web.bind.annotation.*;\n\nimport javax.annotation.Resource;\nimport java.util.ArrayList;\nimport java.util.List;\nimport java.util.Map;\nimport java.util.TreeMap;\n\n/**\n * 异常管理.\n *\n * @author paascloud.net @gmail.com\n */\n@RestController\n@RequestMapping(value = \"/message\", produces = MediaType.APPLICATION_JSON_UTF8_VALUE)\n@Api(value = \"Web - TpcMessageMainController\", produces = MediaType.APPLICATION_JSON_UTF8_VALUE)\npublic class TpcMessageMainController extends BaseController {\n\t@Resource\n\tprivate TpcMqMessageService tpcMqMessageService;\n\n\t/**\n\t * 异常日志列表.\n\t *\n\t * @param messageQueryDto the message query dto\n\t *\n\t * @return the wrapper\n\t */\n\t@PostMapping(value = \"/queryRecordListWithPage\")\n\t@ApiOperation(httpMethod = \"POST\", value = \"分页查询各中心落地消息记录\")\n\tpublic Wrapper queryRecordListWithPage(@ApiParam(name = \"tpcMessageQueryDto\") @RequestBody MessageQueryDto messageQueryDto) {\n\t\tlogger.info(\"分页查询各中心落地消息记录. messageQueryDto={}\", messageQueryDto);\n\t\treturn tpcMqMessageService.queryRecordListWithPage(messageQueryDto);\n\t}\n\n\t/**\n\t * Resend message by id wrapper.\n\t *\n\t * @param messageId the message id\n\t *\n\t * @return the wrapper\n\t */\n\t@PostMapping(value = \"/resendMessageById/{messageId}\")\n\t@ApiOperation(httpMethod = \"POST\", value = \"重发消息\")\n\tpublic Wrapper resendMessageById(@PathVariable Long messageId) {\n\t\tlogger.info(\"重发消息. messageId={}\", messageId);\n\t\ttpcMqMessageService.resendMessageByMessageId(messageId);\n\t\treturn WrapMapper.ok();\n\t}\n\n\t/**\n\t * Query reliable list with page wrapper.\n\t *\n\t * @param messageQueryDto the message query dto\n\t *\n\t * @return the wrapper\n\t */\n\t@PostMapping(value = \"/queryReliableListWithPage\")\n\t@ApiOperation(httpMethod = \"POST\", value = \"分页查询可靠消息\")\n\tpublic Wrapper queryReliableListWithPage(@ApiParam(name = \"tpcMessageQueryDto\") @RequestBody MessageQueryDto messageQueryDto) {\n\t\tlogger.info(\"分页查询可靠消息. tpcMessageQueryDto={}\", messageQueryDto);\n\t\tPageHelper.startPage(messageQueryDto.getPageNum(), messageQueryDto.getPageSize());\n\t\tmessageQueryDto.setOrderBy(\"update_time desc\");\n\t\tList<TpcMessageVo> list = tpcMqMessageService.listReliableMessageVo(messageQueryDto);\n\t\tPageInfo<TpcMessageVo> pageInfo = new PageInfo<>(list);\n\t\tif (PublicUtil.isNotEmpty(list)) {\n\t\t\tMap<Long, TpcMessageVo> messageVoMap = this.trans2Map(list);\n\t\t\tList<Long> messageIdList = new ArrayList<>(messageVoMap.keySet());\n\n\t\t\tList<TpcMessageVo> mqConfirmVoList = tpcMqMessageService.listReliableMessageVo(messageIdList);\n\t\t\tfor (TpcMessageVo vo : mqConfirmVoList) {\n\t\t\t\tLong subscribeId = vo.getId();\n\t\t\t\tif (!messageVoMap.containsKey(subscribeId)) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tTpcMessageVo tpcMessageVo = messageVoMap.get(subscribeId);\n\t\t\t\ttpcMessageVo.setMqConfirmVoList(vo.getMqConfirmVoList());\n\t\t\t}\n\t\t\tpageInfo.setList(new ArrayList<>(messageVoMap.values()));\n\t\t}\n\t\treturn WrapMapper.ok(pageInfo);\n\t}\n\n\tprivate Map<Long, TpcMessageVo> trans2Map(List<TpcMessageVo> tpcMessageVoList) {\n\t\tMap<Long, TpcMessageVo> resultMap = new TreeMap<>((o1, o2) -> {\n\t\t\to1 = o1 == null ? 0 : o1;\n\t\t\to2 = o2 == null ? 0 : o2;\n\t\t\treturn o2.compareTo(o1);\n\t\t});\n\t\tfor (TpcMessageVo vo : tpcMessageVoList) {\n\t\t\tresultMap.put(vo.getId(), vo);\n\t\t}\n\t\treturn resultMap;\n\t}\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-tpc/src/main/java/com/paascloud/provider/web/frontend/TpcMqConsumerController.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：TpcMqConsumerController.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.web.frontend;\n\nimport com.github.pagehelper.PageHelper;\nimport com.github.pagehelper.PageInfo;\nimport com.paascloud.PublicUtil;\nimport com.paascloud.base.dto.LoginAuthDto;\nimport com.paascloud.base.dto.UpdateStatusDto;\nimport com.paascloud.core.annotation.LogAnnotation;\nimport com.paascloud.core.support.BaseController;\nimport com.paascloud.provider.model.domain.TpcMqConsumer;\nimport com.paascloud.provider.model.vo.TpcMqConsumerVo;\nimport com.paascloud.provider.model.vo.TpcMqSubscribeVo;\nimport com.paascloud.provider.service.TpcMqConsumerService;\nimport com.paascloud.wrapper.WrapMapper;\nimport com.paascloud.wrapper.Wrapper;\nimport io.swagger.annotations.Api;\nimport io.swagger.annotations.ApiOperation;\nimport io.swagger.annotations.ApiParam;\nimport org.springframework.http.MediaType;\nimport org.springframework.web.bind.annotation.*;\n\nimport javax.annotation.Resource;\nimport java.util.ArrayList;\nimport java.util.List;\nimport java.util.Map;\nimport java.util.TreeMap;\n\n\n/**\n * 消费者管理.\n *\n * @author paascloud.net @gmail.com\n */\n@RestController\n@RequestMapping(value = \"/consumer\", produces = MediaType.APPLICATION_JSON_UTF8_VALUE)\n@Api(value = \"WEB - TpcMqConsumerController\", produces = MediaType.APPLICATION_JSON_UTF8_VALUE)\npublic class TpcMqConsumerController extends BaseController {\n\n\t@Resource\n\tprivate TpcMqConsumerService tpcMqConsumerService;\n\n\t/**\n\t * 查询Mq消费者列表.\n\t *\n\t * @param tpcMqConsumer the tpc mq consumer\n\t *\n\t * @return the wrapper\n\t */\n\t@PostMapping(value = \"/queryConsumerVoListWithPage\")\n\t@ApiOperation(httpMethod = \"POST\", value = \"查询Mq消费者列表\")\n\tpublic Wrapper<List<TpcMqConsumerVo>> queryConsumerVoList(@ApiParam(name = \"consumer\", value = \"Mq消费者\") @RequestBody TpcMqConsumer tpcMqConsumer) {\n\n\t\tlogger.info(\"查询消费者列表tpcMqProducerQuery={}\", tpcMqConsumer);\n\t\tList<TpcMqConsumerVo> list = tpcMqConsumerService.listConsumerVoWithPage(tpcMqConsumer);\n\t\treturn WrapMapper.ok(list);\n\t}\n\n\t/**\n\t * 查询订阅者列表.\n\t *\n\t * @param tpcMqConsumer the tpc mq consumer\n\t *\n\t * @return the wrapper\n\t */\n\t@PostMapping(value = \"/querySubscribeListWithPage\")\n\t@ApiOperation(httpMethod = \"POST\", value = \"查询订阅者列表\")\n\tpublic Wrapper<PageInfo<TpcMqSubscribeVo>> querySubscribeListWithPage(@ApiParam(name = \"consumer\", value = \"Mq消费者\") @RequestBody TpcMqConsumer tpcMqConsumer) {\n\t\tlogger.info(\"查询Mq订阅列表tpcMqConsumerQuery={}\", tpcMqConsumer);\n\t\tPageHelper.startPage(tpcMqConsumer.getPageNum(), tpcMqConsumer.getPageSize());\n\t\ttpcMqConsumer.setOrderBy(\"update_time desc\");\n\t\tList<TpcMqSubscribeVo> list = tpcMqConsumerService.listSubscribeVoWithPage(tpcMqConsumer);\n\t\tPageInfo<TpcMqSubscribeVo> pageInfo = new PageInfo<>(list);\n\t\tif (PublicUtil.isNotEmpty(list)) {\n\t\t\tMap<Long, TpcMqSubscribeVo> tpcMqSubscribeVoMap = this.trans2Map(list);\n\t\t\tList<Long> subscribeIdList = new ArrayList<>(tpcMqSubscribeVoMap.keySet());\n\t\t\tList<TpcMqSubscribeVo> tagVoList = tpcMqConsumerService.listSubscribeVo(subscribeIdList);\n\t\t\tfor (TpcMqSubscribeVo vo : tagVoList) {\n\t\t\t\tLong subscribeId = vo.getId();\n\t\t\t\tif (!tpcMqSubscribeVoMap.containsKey(subscribeId)) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tTpcMqSubscribeVo tpcMqSubscribeVo = tpcMqSubscribeVoMap.get(subscribeId);\n\t\t\t\ttpcMqSubscribeVo.setTagVoList(vo.getTagVoList());\n\t\t\t}\n\t\t\tpageInfo.setList(new ArrayList<>(tpcMqSubscribeVoMap.values()));\n\t\t}\n\t\treturn WrapMapper.ok(pageInfo);\n\t}\n\n\tprivate Map<Long, TpcMqSubscribeVo> trans2Map(List<TpcMqSubscribeVo> resultDTOS) {\n\t\tMap<Long, TpcMqSubscribeVo> resultMap = new TreeMap<>((o1, o2) -> {\n\t\t\to1 = o1 == null ? 0 : o1;\n\t\t\to2 = o2 == null ? 0 : o2;\n\t\t\treturn o2.compareTo(o1);\n\t\t});\n\t\tfor (TpcMqSubscribeVo resultDTO : resultDTOS) {\n\t\t\tresultMap.put(resultDTO.getId(), resultDTO);\n\t\t}\n\t\treturn resultMap;\n\t}\n\n\t/**\n\t * 更改消费者状态.\n\t *\n\t * @param updateStatusDto the update status dto\n\t *\n\t * @return the wrapper\n\t */\n\t@PostMapping(value = \"/modifyStatusById\")\n\t@ApiOperation(httpMethod = \"POST\", value = \"更改消费者状态\")\n\t@LogAnnotation\n\tpublic Wrapper modifyConsumerStatusById(@ApiParam(value = \"更改消费者状态\") @RequestBody UpdateStatusDto updateStatusDto) {\n\t\tlogger.info(\"修改consumer状态 updateStatusDto={}\", updateStatusDto);\n\t\tLong consumerId = updateStatusDto.getId();\n\n\t\tLoginAuthDto loginAuthDto = getLoginAuthDto();\n\n\t\tTpcMqConsumer consumer = new TpcMqConsumer();\n\t\tconsumer.setId(consumerId);\n\t\tconsumer.setStatus(updateStatusDto.getStatus());\n\t\tconsumer.setUpdateInfo(loginAuthDto);\n\n\t\tint result = tpcMqConsumerService.update(consumer);\n\t\treturn super.handleResult(result);\n\t}\n\n\t/**\n\t * 根据消费者ID删除消费者.\n\t *\n\t * @param id the id\n\t *\n\t * @return the wrapper\n\t */\n\t@PostMapping(value = \"/deleteById/{id}\")\n\t@ApiOperation(httpMethod = \"POST\", value = \"根据消费者ID删除消费者\")\n\t@LogAnnotation\n\tpublic Wrapper deleteConsumerById(@PathVariable Long id) {\n\t\tlogger.info(\"删除consumer id={}\", id);\n\t\tint result = tpcMqConsumerService.deleteConsumerById(id);\n\t\treturn super.handleResult(result);\n\t}\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-tpc/src/main/java/com/paascloud/provider/web/frontend/TpcMqProducerController.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：TpcMqProducerController.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.web.frontend;\n\nimport com.github.pagehelper.PageHelper;\nimport com.github.pagehelper.PageInfo;\nimport com.paascloud.base.dto.LoginAuthDto;\nimport com.paascloud.base.dto.UpdateStatusDto;\nimport com.paascloud.core.annotation.LogAnnotation;\nimport com.paascloud.core.support.BaseController;\nimport com.paascloud.provider.model.domain.TpcMqProducer;\nimport com.paascloud.provider.model.vo.TpcMqProducerVo;\nimport com.paascloud.provider.model.vo.TpcMqPublishVo;\nimport com.paascloud.provider.service.TpcMqProducerService;\nimport com.paascloud.wrapper.WrapMapper;\nimport com.paascloud.wrapper.Wrapper;\nimport io.swagger.annotations.Api;\nimport io.swagger.annotations.ApiOperation;\nimport io.swagger.annotations.ApiParam;\nimport org.springframework.http.MediaType;\nimport org.springframework.web.bind.annotation.*;\n\nimport javax.annotation.Resource;\nimport java.util.List;\n\n\n/**\n * 生产者管理.\n *\n * @author paascloud.net @gmail.com\n */\n@RestController\n@RequestMapping(value = \"/producer\", produces = MediaType.APPLICATION_JSON_UTF8_VALUE)\n@Api(value = \"WEB - TpcMqProducerController\", produces = MediaType.APPLICATION_JSON_UTF8_VALUE)\npublic class TpcMqProducerController extends BaseController {\n\n\t@Resource\n\tprivate TpcMqProducerService tpcMqProducerService;\n\n\t/**\n\t * 查询生产者列表.\n\t *\n\t * @param tpcMqProducer the tpc mq producer\n\t *\n\t * @return the wrapper\n\t */\n\t@PostMapping(value = \"/queryProducerVoListWithPage\")\n\t@ApiOperation(httpMethod = \"POST\", value = \"查询生产者列表\")\n\tpublic Wrapper<List<TpcMqProducerVo>> queryProducerList(@ApiParam(name = \"producer\", value = \"Mq生产者\") @RequestBody TpcMqProducer tpcMqProducer) {\n\n\t\tlogger.info(\"查询生产者列表tpcMqTopicQuery={}\", tpcMqProducer);\n\t\tList<TpcMqProducerVo> list = tpcMqProducerService.listProducerVoWithPage(tpcMqProducer);\n\t\treturn WrapMapper.ok(list);\n\t}\n\n\t/**\n\t * 查询发布者列表.\n\t *\n\t * @param tpcMqProducer the tpc mq producer\n\t *\n\t * @return the wrapper\n\t */\n\t@PostMapping(value = \"/queryPublishListWithPage\")\n\t@ApiOperation(httpMethod = \"POST\", value = \"查询发布者列表\")\n\tpublic Wrapper<PageInfo<TpcMqPublishVo>> queryPublishListWithPage(@ApiParam(name = \"producer\", value = \"Mq生产者\") @RequestBody TpcMqProducer tpcMqProducer) {\n\t\tlogger.info(\"查询Mq发布列表tpcMqTopicQuery={}\", tpcMqProducer);\n\t\tPageHelper.startPage(tpcMqProducer.getPageNum(), tpcMqProducer.getPageSize());\n\t\ttpcMqProducer.setOrderBy(\"update_time desc\");\n\t\tList<TpcMqPublishVo> list = tpcMqProducerService.listPublishVoWithPage(tpcMqProducer);\n\t\treturn WrapMapper.ok(new PageInfo<>(list));\n\t}\n\n\t/**\n\t * 修改生产者状态.\n\t *\n\t * @param updateStatusDto the update status dto\n\t *\n\t * @return the wrapper\n\t */\n\t@PostMapping(value = \"/modifyStatusById\")\n\t@ApiOperation(httpMethod = \"POST\", value = \"修改生产者状态\")\n\t@LogAnnotation\n\tpublic Wrapper modifyProducerStatusById(@ApiParam(value = \"修改producer状态\") @RequestBody UpdateStatusDto updateStatusDto) {\n\t\tlogger.info(\"修改producer状态 updateStatusDto={}\", updateStatusDto);\n\t\tLong roleId = updateStatusDto.getId();\n\n\t\tLoginAuthDto loginAuthDto = getLoginAuthDto();\n\n\t\tTpcMqProducer producer = new TpcMqProducer();\n\t\tproducer.setId(roleId);\n\t\tproducer.setStatus(updateStatusDto.getStatus());\n\t\tproducer.setUpdateInfo(loginAuthDto);\n\n\t\tint result = tpcMqProducerService.update(producer);\n\t\treturn super.handleResult(result);\n\t}\n\n\t/**\n\t * 根据生产者ID删除生产者.\n\t *\n\t * @param id the id\n\t *\n\t * @return the wrapper\n\t */\n\t@PostMapping(value = \"/deleteById/{id}\")\n\t@ApiOperation(httpMethod = \"POST\", value = \"根据生产者ID删除生产者\")\n\t@LogAnnotation\n\tpublic Wrapper deleteProducerById(@PathVariable Long id) {\n\t\tlogger.info(\"删除producer id={}\", id);\n\t\tint result = tpcMqProducerService.deleteProducerById(id);\n\t\treturn super.handleResult(result);\n\t}\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-tpc/src/main/java/com/paascloud/provider/web/frontend/TpcMqTagController.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：TpcMqTagController.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.web.frontend;\n\nimport com.github.pagehelper.PageHelper;\nimport com.github.pagehelper.PageInfo;\nimport com.paascloud.base.dto.LoginAuthDto;\nimport com.paascloud.base.dto.UpdateStatusDto;\nimport com.paascloud.core.annotation.LogAnnotation;\nimport com.paascloud.core.support.BaseController;\nimport com.paascloud.provider.model.domain.TpcMqTag;\nimport com.paascloud.provider.model.vo.TpcMqTagVo;\nimport com.paascloud.provider.service.TpcMqTagService;\nimport com.paascloud.wrapper.WrapMapper;\nimport com.paascloud.wrapper.Wrapper;\nimport io.swagger.annotations.Api;\nimport io.swagger.annotations.ApiOperation;\nimport io.swagger.annotations.ApiParam;\nimport org.springframework.http.MediaType;\nimport org.springframework.web.bind.annotation.*;\n\nimport javax.annotation.Resource;\nimport java.util.List;\n\n\n/**\n * The class Tpc mq tag controller.\n *\n * @author paascloud.net @gmail.com\n */\n@RestController\n@RequestMapping(value = \"/tag\", produces = MediaType.APPLICATION_JSON_UTF8_VALUE)\n@Api(value = \"WEB - TpcMqTagController\", produces = MediaType.APPLICATION_JSON_UTF8_VALUE)\npublic class TpcMqTagController extends BaseController {\n\n\t@Resource\n\tprivate TpcMqTagService tpcMqTagService;\n\n\t/**\n\t * 查询MQ Tag列表.\n\t *\n\t * @param tpcMqTag the tpc mq tag\n\t *\n\t * @return the wrapper\n\t */\n\t@PostMapping(value = \"/queryTagListWithPage\")\n\t@ApiOperation(httpMethod = \"POST\", value = \"查询MQ-Tag列表\")\n\tpublic Wrapper<PageInfo<TpcMqTagVo>> queryTagListWithPage(@ApiParam(name = \"tag\", value = \"角色信息\") @RequestBody TpcMqTag tpcMqTag) {\n\n\t\tlogger.info(\"查询角色列表tpcMqTagQuery={}\", tpcMqTag);\n\t\tPageHelper.startPage(tpcMqTag.getPageNum(), tpcMqTag.getPageSize());\n\t\ttpcMqTag.setOrderBy(\"update_time desc\");\n\t\tList<TpcMqTagVo> list = tpcMqTagService.listWithPage(tpcMqTag);\n\t\treturn WrapMapper.ok(new PageInfo<>(list));\n\t}\n\n\t/**\n\t * 修改tag状态.\n\t *\n\t * @param updateStatusDto the update status dto\n\t *\n\t * @return the wrapper\n\t */\n\t@PostMapping(value = \"/modifyStatusById\")\n\t@ApiOperation(httpMethod = \"POST\", value = \"修改MQ-Tag状态\")\n\t@LogAnnotation\n\tpublic Wrapper modifyProducerStatusById(@ApiParam(value = \"修改tag状态\") @RequestBody UpdateStatusDto updateStatusDto) {\n\t\tlogger.info(\"修改tag状态 updateStatusDto={}\", updateStatusDto);\n\t\tLong roleId = updateStatusDto.getId();\n\n\t\tLoginAuthDto loginAuthDto = getLoginAuthDto();\n\n\t\tTpcMqTag tag = new TpcMqTag();\n\t\ttag.setId(roleId);\n\t\ttag.setStatus(updateStatusDto.getStatus());\n\t\ttag.setUpdateInfo(loginAuthDto);\n\n\t\tint result = tpcMqTagService.update(tag);\n\t\treturn super.handleResult(result);\n\t}\n\n\t/**\n\t * 根据Tag ID删除TAG.\n\t *\n\t * @param id the id\n\t *\n\t * @return the wrapper\n\t */\n\t@PostMapping(value = \"/deleteById/{id}\")\n\t@ApiOperation(httpMethod = \"POST\", value = \"根据ID删除TAG\")\n\t@LogAnnotation\n\tpublic Wrapper deleteTagById(@ApiParam(value = \"Tag ID\") @PathVariable Long id) {\n\t\tlogger.info(\"删除tag id={}\", id);\n\t\tint result = tpcMqTagService.deleteTagById(id);\n\t\treturn super.handleResult(result);\n\t}\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-tpc/src/main/java/com/paascloud/provider/web/frontend/TpcMqTopicController.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：TpcMqTopicController.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.web.frontend;\n\nimport com.paascloud.base.dto.LoginAuthDto;\nimport com.paascloud.base.dto.UpdateStatusDto;\nimport com.paascloud.core.annotation.LogAnnotation;\nimport com.paascloud.core.support.BaseController;\nimport com.paascloud.provider.model.domain.TpcMqTopic;\nimport com.paascloud.provider.model.vo.TpcMqTopicVo;\nimport com.paascloud.provider.service.TpcMqTopicService;\nimport com.paascloud.wrapper.WrapMapper;\nimport com.paascloud.wrapper.Wrapper;\nimport io.swagger.annotations.Api;\nimport io.swagger.annotations.ApiOperation;\nimport io.swagger.annotations.ApiParam;\nimport org.springframework.http.MediaType;\nimport org.springframework.web.bind.annotation.PostMapping;\nimport org.springframework.web.bind.annotation.RequestBody;\nimport org.springframework.web.bind.annotation.RequestMapping;\nimport org.springframework.web.bind.annotation.RestController;\n\nimport javax.annotation.Resource;\nimport java.util.List;\n\n\n/**\n * The class Tpc mq topic controller.\n *\n * @author paascloud.net @gmail.com\n */\n@RestController\n@RequestMapping(value = \"/topic\", produces = MediaType.APPLICATION_JSON_UTF8_VALUE)\n@Api(value = \"WEB - TpcMqTopicController\", produces = MediaType.APPLICATION_JSON_UTF8_VALUE)\npublic class TpcMqTopicController extends BaseController {\n\n\t@Resource\n\tprivate TpcMqTopicService tpcMqTopicService;\n\n\n\t/**\n\t * 查询MQ topic列表.\n\t *\n\t * @param tpcMqTopic the tpc mq topic\n\t *\n\t * @return the wrapper\n\t */\n\t@PostMapping(value = \"/queryTopicListWithPage\")\n\t@ApiOperation(httpMethod = \"POST\", value = \"查询MQ topic列表\")\n\tpublic Wrapper<List<TpcMqTopicVo>> queryTopicListWithPage(@ApiParam(name = \"topic\", value = \"MQ-Topic\") @RequestBody TpcMqTopic tpcMqTopic) {\n\n\t\tlogger.info(\"查询角色列表tpcMqTopicQuery={}\", tpcMqTopic);\n\t\tList<TpcMqTopicVo> list = tpcMqTopicService.listWithPage(tpcMqTopic);\n\t\treturn WrapMapper.ok(list);\n\t}\n\n\t/**\n\t * 修改topic状态.\n\t *\n\t * @param updateStatusDto the update status dto\n\t *\n\t * @return the wrapper\n\t */\n\t@PostMapping(value = \"/modifyStatusById\")\n\t@ApiOperation(httpMethod = \"POST\", value = \"修改topic状态\")\n\t@LogAnnotation\n\tpublic Wrapper modifyTopicStatusById(@ApiParam(value = \"修改topic状态\") @RequestBody UpdateStatusDto updateStatusDto) {\n\t\tlogger.info(\"修改topic状态 updateStatusDto={}\", updateStatusDto);\n\t\tLong roleId = updateStatusDto.getId();\n\n\t\tLoginAuthDto loginAuthDto = getLoginAuthDto();\n\n\t\tTpcMqTopic topic = new TpcMqTopic();\n\t\ttopic.setId(roleId);\n\t\ttopic.setStatus(updateStatusDto.getStatus());\n\t\ttopic.setUpdateInfo(loginAuthDto);\n\n\t\tint result = tpcMqTopicService.update(topic);\n\t\treturn super.handleResult(result);\n\t}\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-tpc/src/main/java/com/paascloud/provider/web/rpc/TpcMqMessageFeignClient.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：TpcMqMessageFeignClient.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.web.rpc;\n\nimport com.paascloud.core.support.BaseController;\nimport com.paascloud.provider.model.dto.TpcMqMessageDto;\nimport com.paascloud.provider.service.TpcMqMessageFeignApi;\nimport com.paascloud.provider.service.TpcMqMessageService;\nimport com.paascloud.wrapper.WrapMapper;\nimport com.paascloud.wrapper.Wrapper;\nimport io.swagger.annotations.Api;\nimport io.swagger.annotations.ApiOperation;\nimport org.springframework.http.MediaType;\nimport org.springframework.web.bind.annotation.RequestBody;\nimport org.springframework.web.bind.annotation.RequestParam;\nimport org.springframework.web.bind.annotation.RestController;\n\nimport javax.annotation.Resource;\n\n/**\n * The class Tpc mq message feign client.\n *\n * @author paascloud.net @gmail.com\n */\n@RestController\n@Api(value = \"API - TpcMqMessageFeignClient\", produces = MediaType.APPLICATION_JSON_UTF8_VALUE)\npublic class TpcMqMessageFeignClient extends BaseController implements TpcMqMessageFeignApi {\n\t@Resource\n\tprivate TpcMqMessageService tpcMqMessageService;\n\n\t@Override\n\t@ApiOperation(httpMethod = \"POST\", value = \"预存储消息\")\n\tpublic Wrapper saveMessageWaitingConfirm(@RequestBody TpcMqMessageDto mqMessageDto) {\n\t\tlogger.info(\"预存储消息. mqMessageDto={}\", mqMessageDto);\n\t\ttpcMqMessageService.saveMessageWaitingConfirm(mqMessageDto);\n\t\treturn WrapMapper.ok();\n\t}\n\n\t@Override\n\t@ApiOperation(httpMethod = \"POST\", value = \"确认并发送消息\")\n\tpublic Wrapper confirmAndSendMessage(@RequestParam(\"messageKey\") String messageKey) {\n\t\tlogger.info(\"确认并发送消息. messageKey={}\", messageKey);\n\t\ttpcMqMessageService.confirmAndSendMessage(messageKey);\n\t\treturn WrapMapper.ok();\n\t}\n\n\t@Override\n\t@ApiOperation(httpMethod = \"POST\", value = \"存储并发送消息\")\n\tpublic Wrapper saveAndSendMessage(@RequestBody TpcMqMessageDto message) {\n\t\tlogger.info(\"存储并发送消息. mqMessageDto={}\", message);\n\t\ttpcMqMessageService.saveAndSendMessage(message);\n\t\treturn WrapMapper.ok();\n\t}\n\n\t@Override\n\t@ApiOperation(httpMethod = \"POST\", value = \"直接发送消息\")\n\tpublic Wrapper directSendMessage(@RequestBody TpcMqMessageDto messageDto) {\n\t\tlogger.info(\"直接发送消息. mqMessageDto={}\", messageDto);\n\t\ttpcMqMessageService.directSendMessage(messageDto.getMessageBody(), messageDto.getMessageTopic(), messageDto.getMessageTag(), messageDto.getMessageKey(), messageDto.getProducerGroup(), messageDto.getDelayLevel());\n\t\treturn WrapMapper.ok();\n\t}\n\n\t@Override\n\t@ApiOperation(httpMethod = \"POST\", value = \"根据消息ID删除消息\")\n\tpublic Wrapper deleteMessageByMessageKey(@RequestParam(\"messageKey\") String messageKey) {\n\t\tlogger.info(\"根据消息ID删除消息. messageKey={}\", messageKey);\n\t\ttpcMqMessageService.deleteMessageByMessageKey(messageKey);\n\t\treturn WrapMapper.ok();\n\t}\n\n\t@Override\n\t@ApiOperation(httpMethod = \"POST\", value = \"确认收到消息\")\n\tpublic Wrapper confirmReceiveMessage(@RequestParam(\"cid\") final String cid, @RequestParam(\"messageKey\") final String messageKey) {\n\t\tlogger.info(\"确认收到消息. cid={}, messageKey={}\", cid, messageKey);\n\t\ttpcMqMessageService.confirmReceiveMessage(cid, messageKey);\n\t\treturn WrapMapper.ok();\n\t}\n\n\t@Override\n\t@ApiOperation(httpMethod = \"POST\", value = \"确认消费消息\")\n\tpublic Wrapper confirmConsumedMessage(@RequestParam(\"cid\") final String cid, @RequestParam(\"messageKey\") final String messageKey) {\n\t\tlogger.info(\"确认完成消费消息. cid={}, messageKey={}\", cid, messageKey);\n\t\ttpcMqMessageService.confirmConsumedMessage(cid, messageKey);\n\t\treturn WrapMapper.ok();\n\t}\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-tpc/src/main/resources/META-INF/spring-devtools.properties",
    "content": "restart.include.mapper=/mapper-[\\\\w-\\\\.]+jar\nrestart.include.pagehelper=/pagehelper-[\\\\w-\\\\.]+jar"
  },
  {
    "path": "paascloud-provider/paascloud-provider-tpc/src/main/resources/ValidationMessages.properties",
    "content": ""
  },
  {
    "path": "paascloud-provider/paascloud-provider-tpc/src/main/resources/application.yml",
    "content": "server:\n  port: 8090\n\nspring:\n  profiles:\n    active: dev\n  application:\n    name: @pom.artifactId@\n  datasource:\n    username: root\n    password: 123456\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-tpc/src/main/resources/banner.txt",
    "content": "${AnsiColor.BRIGHT_CYAN}\n                                  .__                   .___                  __\n___________  _____    ______ ____ |  |   ____  __ __  __| _/     ____   _____/  |_\n\\____ \\__  \\ \\__  \\  /  ___// ___\\|  |  /  _ \\|  |  \\/ __ |     /    \\_/ __ \\   __\\\n|  |_> > __ \\_/ __ \\_\\___ \\\\  \\___|  |_(  <_> )  |  / /_/ |    |   |  \\  ___/|  |\n|   __(____  (____  /____  >\\___  >____/\\____/|____/\\____ | /\\ |___|  /\\___  >__|\n|__|       \\/     \\/     \\/     \\/ Powered by liuzhaoming\\/ \\/      \\/     \\/"
  },
  {
    "path": "paascloud-provider/paascloud-provider-tpc/src/main/resources/bootstrap.yml",
    "content": "spring:\n  cloud:\n    config:\n      fail-fast: true\n      discovery:\n        service-id: paascloud-discovery\n        enabled: true\n      label: ${spring.profiles.active}\n      profile: ${spring.profiles.active}\n      username: admin\n      password: admin\n\neureka:\n  client:\n    serviceUrl:\n      defaultZone: http://root:root@paascloud-eureka:8761/eureka/\n  instance:\n    instance-id: ${spring.application.name}:${spring.cloud.client.ipAddress}:${server.port}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-tpc/src/main/resources/conf/liquibase.properties",
    "content": "spring.datasource.driver-class-name= com.mysql.jdbc.Driver\nspring.datasource.url=jdbc:mysql://paascloud-db-mysql:3306/paascloud_mdc?characterEncoding=utf8&useSSL=false\nspring.datasource.username= root\nspring.datasource.password= 123456"
  },
  {
    "path": "paascloud-provider/paascloud-provider-tpc/src/main/resources/liquibase/index.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<databaseChangeLog\n        xmlns=\"http://www.liquibase.org/xml/ns/dbchangelog\"\n        xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n        xsi:schemaLocation=\"http://www.liquibase.org/xml/ns/dbchangelog\n         http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.1.xsd\">\n</databaseChangeLog>"
  },
  {
    "path": "paascloud-provider/paascloud-provider-tpc/src/main/resources/logback-spring.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<configuration>\n    <include resource=\"org/springframework/boot/logging/logback/defaults.xml\"/>\n    ​\n    <springProperty scope=\"context\" name=\"springAppName\" source=\"spring.application.name\"/>\n    <!-- Example for logging into the build folder of your project -->\n    <property name=\"LOG_FILE\" value=\"/data/logs/paascloud/${springAppName}/${springAppName}\"/>\n    ​\n    <property name=\"CONSOLE_LOG_PATTERN\" value=\"%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr([${springAppName:-},%X{X-B3-TraceId:-},%X{X-B3-SpanId:-},%X{X-B3-ParentSpanId:-},%X{X-Span-Export:-}]){yellow} %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}\"/>\n\n    <!-- Appender to log to console -->\n    <appender name=\"console\" class=\"ch.qos.logback.core.ConsoleAppender\">\n        <filter class=\"ch.qos.logback.classic.filter.ThresholdFilter\">\n            <!-- Minimum logging level to be presented in the console logs -->\n            <level>DEBUG</level>\n        </filter>\n        <encoder>\n            <pattern>${CONSOLE_LOG_PATTERN}</pattern>\n            <charset>utf8</charset>\n        </encoder>\n    </appender>\n\n    <!-- Appender to log to file -->\n    <appender name=\"flatfile\" class=\"ch.qos.logback.core.rolling.RollingFileAppender\">\n        <file>${LOG_FILE}</file>\n        <rollingPolicy class=\"ch.qos.logback.core.rolling.TimeBasedRollingPolicy\">\n            <fileNamePattern>${LOG_FILE}.%d{yyyy-MM-dd}.gz</fileNamePattern>\n            <maxHistory>7</maxHistory>\n        </rollingPolicy>\n        <encoder>\n            <pattern>${CONSOLE_LOG_PATTERN}</pattern>\n            <charset>utf8</charset>\n        </encoder>\n    </appender>\n    ​\n    <!-- Appender to log to file in a JSON format -->\n    <appender name=\"logstash\" class=\"ch.qos.logback.core.rolling.RollingFileAppender\">\n        <file>${LOG_FILE}.json</file>\n        <rollingPolicy class=\"ch.qos.logback.core.rolling.TimeBasedRollingPolicy\">\n            <fileNamePattern>${LOG_FILE}.json.%d{yyyy-MM-dd}.gz</fileNamePattern>\n            <maxHistory>7</maxHistory>\n        </rollingPolicy>\n        <encoder class=\"net.logstash.logback.encoder.LoggingEventCompositeJsonEncoder\">\n            <providers>\n                <timestamp>\n                    <timeZone>UTC</timeZone>\n                </timestamp>\n                <pattern>\n                    <pattern>\n                        {\n                        \"severity\": \"%level\",\n                        \"service\": \"${springAppName:-}\",\n                        \"trace\": \"%X{X-B3-TraceId:-}\",\n                        \"span\": \"%X{X-B3-SpanId:-}\",\n                        \"parent\": \"%X{X-B3-ParentSpanId:-}\",\n                        \"exportable\": \"%X{X-Span-Export:-}\",\n                        \"pid\": \"${PID:-}\",\n                        \"thread\": \"%thread\",\n                        \"class\": \"%logger{40}\",\n                        \"rest\": \"%message\"\n                        }\n                    </pattern>\n                </pattern>\n            </providers>\n        </encoder>\n    </appender>\n\n    <appender name=\"MyBatisStatistics\" class=\"ch.qos.logback.core.rolling.RollingFileAppender\">\n        <rollingPolicy class=\"ch.qos.logback.core.rolling.TimeBasedRollingPolicy\">\n            <fileNamePattern>${LOG_FILE}.sql.%d{yyyy-MM-dd}.gz</fileNamePattern>\n            <maxHistory>10</maxHistory>\n        </rollingPolicy>\n        <encoder>\n            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36}-%msg%n</pattern>\n        </encoder>\n    </appender>\n\n    <logger name=\"com.paascloud.provider.mapper\" level=\"DEBUG\">\n        <appender-ref ref=\"MyBatisStatistics\" />\n    </logger>\n    ​\n    <root level=\"INFO\">\n        <appender-ref ref=\"console\"/>\n        <appender-ref ref=\"logstash\"/>\n        <appender-ref ref=\"flatfile\"/>\n    </root>\n</configuration>"
  },
  {
    "path": "paascloud-provider/paascloud-provider-tpc/src/main/resources/mapper/TpcJobTaskMapper.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n<!DOCTYPE mapper PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\" \"http://mybatis.org/dtd/mybatis-3-mapper.dtd\" >\n<mapper namespace=\"com.paascloud.provider.mapper.TpcJobTaskMapper\">\n  <resultMap id=\"BaseResultMap\" type=\"com.paascloud.provider.model.domain.TpcJobTask\">\n    <id column=\"id\" property=\"id\" jdbcType=\"VARCHAR\"/>\n    <result column=\"version\" property=\"version\" jdbcType=\"INTEGER\"/>\n    <result column=\"ref_no\" property=\"refNo\" jdbcType=\"VARCHAR\"/>\n    <result column=\"task_type\" property=\"taskType\" jdbcType=\"VARCHAR\"/>\n    <result column=\"task_exe_count\" property=\"taskExeCount\" jdbcType=\"INTEGER\"/>\n    <result column=\"task_data\" property=\"taskData\" jdbcType=\"LONGVARCHAR\"/>\n    <result column=\"dead\" property=\"dead\" jdbcType=\"INTEGER\"/>\n    <result column=\"status\" property=\"status\" jdbcType=\"INTEGER\"/>\n    <result column=\"exe_instance_ip\" property=\"exeInstanceIp\" jdbcType=\"VARCHAR\"/>\n    <result column=\"create_time\" property=\"createTime\" jdbcType=\"TIMESTAMP\"/>\n    <result column=\"update_time\" property=\"updateTime\" jdbcType=\"TIMESTAMP\"/>\n    <result column=\"exe_time\" property=\"exeTime\" jdbcType=\"INTEGER\"/>\n    <result column=\"yn\" property=\"yn\" jdbcType=\"INTEGER\"/>\n  </resultMap>\n</mapper>"
  },
  {
    "path": "paascloud-provider/paascloud-provider-tpc/src/main/resources/mapper/TpcMqConfirmMapper.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n<!DOCTYPE mapper PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\" \"http://mybatis.org/dtd/mybatis-3-mapper.dtd\" >\n<mapper namespace=\"com.paascloud.provider.mapper.TpcMqConfirmMapper\">\n  <resultMap id=\"BaseResultMap\" type=\"com.paascloud.provider.model.domain.TpcMqConfirm\">\n    <id column=\"id\" property=\"id\" jdbcType=\"BIGINT\"/>\n    <result column=\"version\" property=\"version\" jdbcType=\"INTEGER\"/>\n    <result column=\"message_id\" property=\"messageId\" jdbcType=\"BIGINT\"/>\n    <result column=\"message_key\" property=\"messageKey\" jdbcType=\"VARCHAR\"/>\n    <result column=\"consumer_code\" property=\"consumerCode\" jdbcType=\"VARCHAR\"/>\n    <result column=\"consume_count\" property=\"consumeCount\" jdbcType=\"INTEGER\"/>\n    <result column=\"status\" property=\"status\" jdbcType=\"INTEGER\"/>\n    <result column=\"created_time\" property=\"createdTime\" jdbcType=\"TIMESTAMP\"/>\n    <result column=\"update_time\" property=\"updateTime\" jdbcType=\"TIMESTAMP\"/>\n  </resultMap>\n  <insert id=\"batchCreateMqConfirm\">\n    insert into pc_tpc_mq_confirm\n    (\n    id,\n    message_id,\n    message_key,\n    consumer_code)\n    VALUES\n    <foreach collection=\"tpcMqConfirmList\" item=\"item\" index=\"index\" separator=\",\">\n      (\n      #{item.id,jdbcType=BIGINT},\n      #{item.messageId,jdbcType=BIGINT},\n      #{item.messageKey,jdbcType=VARCHAR},\n      #{item.consumerCode,jdbcType=VARCHAR}\n      )\n    </foreach>\n  </insert>\n  <update id=\"confirmReceiveMessage\">\n    UPDATE pc_tpc_mq_confirm\n    SET status = 20, consume_count = consume_count + 1\n    WHERE id = #{cid} AND status = 10\n  </update>\n  <update id=\"confirmConsumedMessage\">\n    UPDATE pc_tpc_mq_confirm\n    SET status = 30\n    WHERE id = #{cid} AND status in (10, 20)\n  </update>\n  <select id=\"getIdMqConfirm\" resultType=\"java.lang.Long\">\n    SELECT id\n    FROM pc_tpc_mq_confirm\n    WHERE consumer_code = #{cid} AND message_key = #{messageKey}\n  </select>\n  <select id=\"selectUnConsumedCount\" resultType=\"java.lang.Integer\">\n    SELECT count(1)\n    FROM pc_tpc_mq_confirm\n    WHERE status in (10, 20) AND message_key = #{messageKey}\n  </select>\n</mapper>"
  },
  {
    "path": "paascloud-provider/paascloud-provider-tpc/src/main/resources/mapper/TpcMqConsumerMapper.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n<!DOCTYPE mapper PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\" \"http://mybatis.org/dtd/mybatis-3-mapper.dtd\" >\n<mapper namespace=\"com.paascloud.provider.mapper.TpcMqConsumerMapper\">\n  <resultMap id=\"BaseResultMap\" type=\"com.paascloud.provider.model.domain.TpcMqConsumer\">\n    <id column=\"id\" property=\"id\" jdbcType=\"BIGINT\"/>\n    <result column=\"application_name\" property=\"applicationName\" jdbcType=\"VARCHAR\"/>\n    <result column=\"consumer_code\" property=\"consumerCode\" jdbcType=\"VARCHAR\"/>\n    <result column=\"consumer_name\" property=\"consumerName\" jdbcType=\"VARCHAR\"/>\n    <result column=\"status\" property=\"status\" jdbcType=\"INTEGER\"/>\n    <result column=\"remark\" property=\"remark\" jdbcType=\"VARCHAR\"/>\n    <result column=\"creator\" property=\"creator\" jdbcType=\"VARCHAR\"/>\n    <result column=\"creator_id\" property=\"creatorId\" jdbcType=\"BIGINT\"/>\n    <result column=\"created_time\" property=\"createdTime\" jdbcType=\"TIMESTAMP\"/>\n    <result column=\"last_operator\" property=\"lastOperator\" jdbcType=\"VARCHAR\"/>\n    <result column=\"last_operator_id\" property=\"lastOperatorId\" jdbcType=\"BIGINT\"/>\n    <result column=\"update_time\" property=\"updateTime\" jdbcType=\"TIMESTAMP\"/>\n  </resultMap>\n  <sql id=\"Base_Column_List\">\n    ${alias}.id, ${alias}.version, ${alias}.aplication_name, ${alias}.consumer_code, ${alias}.consumer_name, ${alias}.status, ${alias}.remark,\n    ${alias}.creator, ${alias}.creator_id, ${alias}.created_time, ${alias}.last_operator, ${alias}.last_operator_id, ${alias}.update_time\n  </sql>\n\n  <sql id=\"Base_Topic_Column_List\">\n    ${alias}.version as topic_version,\n    ${alias}.producer_id,\n    ${alias}.topic_code,\n    ${alias}.topic_name,\n    ${alias}.mq_type,\n    ${alias}.msg_type,\n    ${alias}.status as topic_status,\n    ${alias}.remarks as topic_remarks,\n    ${alias}.creator as topic_creator,\n    ${alias}.creator_id as topic_created_time,\n    ${alias}.created_time as topic_created_time,\n    ${alias}.last_operator as topic_last_operator,\n    ${alias}.last_operator_id as topic_last_operator_id,\n    ${alias}.update_time as topic_update_time\n  </sql>\n\n  <sql id=\"Base_Tag_Column_List\" >\n    ${alias}.id as tag_id, ${alias}.version as tag_version, ${alias}.topic_id, ${alias}.tag_code, ${alias}.tag_name,\n    ${alias}.status as tag_status, ${alias}.remark as tag_remark, ${alias}.creator as tag_creator, ${alias}.creator_id as tag_creator_id,\n    ${alias}.created_time as tag_created_time, ${alias}.last_operator as tag_last_operator, ${alias}.last_operator_id as tag_last_operator_id, ${alias}.update_time as tag_update_time\n  </sql>\n  <delete id=\"deleteSubscribeTagByTagId\">\n    DELETE FROM pc_tpc_mq_subscribe_tag WHERE tag_id = #{tagId}\n  </delete>\n  <delete id=\"deleteSubscribeByConsumerId\">\n    DELETE FROM pc_tpc_mq_subscribe WHERE consumer_id = #{consumerId}\n  </delete>\n  <delete id=\"deleteSubscribeTagBySubscribeIdList\">\n    DELETE FROM pc_tpc_mq_subscribe_tag WHERE subscribe_id IN\n    <foreach collection=\"subscribeIdList\" item=\"item\" index=\"index\" open=\"(\" separator=\",\" close=\")\">\n      #{item}\n    </foreach>\n  </delete>\n\n  <resultMap id=\"TpcMqConsumerVoResultMap\" extends=\"BaseResultMap\" type=\"com.paascloud.provider.model.vo.TpcMqConsumerVo\">\n    <collection property=\"mqTopicVoList\" ofType=\"com.paascloud.provider.model.vo.TpcMqTopicVo\">\n      <result property=\"topicCode\" column=\"topic_code\"/>\n      <result property=\"topicName\" column=\"topic_name\"/>\n      <result property=\"status\" column=\"topic_status\"/>\n      <result property=\"lastOperator\" column=\"topic_last_operator\"/>\n      <result property=\"updateTime\" column=\"topic_update_time\"/>\n    </collection>\n  </resultMap>\n  <select id=\"listTpcMqConsumerVoWithPage\" resultMap=\"TpcMqConsumerVoResultMap\">\n    SELECT\n    <include refid=\"Base_Column_List\">\n      <property name=\"alias\" value=\"consumer\"/>\n    </include>\n    ,\n    <include refid=\"Base_Topic_Column_List\">\n      <property name=\"alias\" value=\"topic\"/>\n    </include>\n    from pc_tpc_mq_consumer consumer\n    LEFT JOIN pc_tpc_mq_subscribe subscribe ON consumer.id = subscribe.consumer_id\n    LEFT JOIN pc_tpc_mq_topic topic on topic.id = subscribe.topic_id\n    WHERE 1 = 1\n    <if test=\"consumerCode != null and consumerCode !=''\">\n      AND consumer.consumer_code LIKE concat(#{consumerCode}, '%')\n    </if>\n    <if test=\"consumerName != null and consumerName !=''\">\n      AND consumer.consumer_name LIKE concat(#{consumerName}, '%')\n    </if>\n    <if test=\"status != null and status !=''\">\n      AND consumer.status = #{status,jdbcType=INTEGER}\n    </if>\n  </select>\n\n  <resultMap id=\"TpcMqSubscribeVoResultMap\" extends=\"BaseResultMap\" type=\"com.paascloud.provider.model.vo.TpcMqSubscribeVo\">\n    <result property=\"topicCode\" column=\"topic_code\"/>\n    <result property=\"topicName\" column=\"topic_name\"/>\n    <result property=\"id\" column=\"subscribeId\"/>\n  </resultMap>\n\n  <select id=\"listTpcMqSubscribeVoWithPage\" resultMap=\"TpcMqSubscribeVoResultMap\">\n    SELECT\n    <include refid=\"Base_Column_List\">\n      <property name=\"alias\" value=\"consumer\"/>\n    </include>\n    ,\n    topic.topic_code,\n    topic.topic_name,\n    subscribe.id as subscribeId\n    from\n    pc_tpc_mq_subscribe subscribe\n    LEFT JOIN pc_tpc_mq_consumer consumer ON subscribe.consumer_id = consumer.id\n    LEFT JOIN pc_tpc_mq_topic topic on topic.id = subscribe.topic_id\n    WHERE 1 = 1\n    <if test=\"consumerCode != null and consumerCode !=''\">\n      AND consumer.consumer_code LIKE concat(#{consumerCode}, '%')\n    </if>\n    <if test=\"consumerName != null and consumerName !=''\">\n      AND consumer.consumer_name LIKE concat(#{consumerName}, '%')\n    </if>\n    <if test=\"status != null and status !=''\">\n      AND consumer.status = #{status,jdbcType=INTEGER}\n    </if>\n  </select>\n  <select id=\"listSubscribeIdByConsumerId\" resultType=\"java.lang.Long\">\n    select id FROM pc_tpc_mq_subscribe WHERE consumer_id = #{consumerId}\n  </select>\n\n  <resultMap id=\"TpcMqSubscribeVoResultMapN\" type=\"com.paascloud.provider.model.vo.TpcMqSubscribeVo\">\n    <id property=\"id\" column=\"subscribeId\"/>\n    <collection property=\"tagVoList\" ofType=\"com.paascloud.provider.model.vo.TpcMqTagVo\">\n      <result property=\"tagCode\" column=\"tag_code\"/>\n      <result property=\"tagName\" column=\"tag_name\"/>\n      <result property=\"status\" column=\"tag_status\"/>\n      <result property=\"lastOperator\" column=\"tag_last_operator\"/>\n      <result property=\"updateTime\" column=\"tag_update_time\"/>\n    </collection>\n  </resultMap>\n\n  <select id=\"listSubscribeVo\" resultMap=\"TpcMqSubscribeVoResultMapN\">\n    SELECT\n    st.subscribe_id as subscribeId\n    ,\n    <include refid=\"Base_Tag_Column_List\">\n      <property name=\"alias\" value=\"tag\"/>\n    </include>\n    from pc_tpc_mq_subscribe_tag st\n    LEFT JOIN pc_tpc_mq_tag tag on tag.id = st.tag_id\n    WHERE st.subscribe_id IN\n    <foreach collection=\"subscribeIdList\" item=\"item\" index=\"index\" open=\"(\" separator=\",\" close=\")\">\n      #{item}\n    </foreach>\n  </select>\n  <select id=\"listConsumerGroupByTopic\" resultType=\"java.lang.String\">\n    SELECT consumer_code from pc_tpc_mq_subscribe WHERE topic_code = #{topic}\n  </select>\n  <select id=\"getByCid\" resultType=\"com.paascloud.provider.model.domain.TpcMqConsumer\">\n    SELECT\n    <include refid=\"Base_Column_List\">\n      <property name=\"alias\" value=\"consumer\"/>\n    </include>\n    from pc_tpc_mq_consumer consumer where consumer.consumer_code = #{cid}\n  </select>\n</mapper>"
  },
  {
    "path": "paascloud-provider/paascloud-provider-tpc/src/main/resources/mapper/TpcMqMessageMapper.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n<!DOCTYPE mapper PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\" \"http://mybatis.org/dtd/mybatis-3-mapper.dtd\" >\n<mapper namespace=\"com.paascloud.provider.mapper.TpcMqMessageMapper\">\n  <resultMap id=\"BaseResultMap\" type=\"com.paascloud.provider.model.domain.TpcMqMessage\">\n    <id column=\"id\" property=\"id\" jdbcType=\"BIGINT\"/>\n    <result column=\"version\" property=\"version\" jdbcType=\"INTEGER\"/>\n    <result column=\"message_key\" property=\"messageKey\" jdbcType=\"VARCHAR\"/>\n    <result column=\"message_topic\" property=\"messageTopic\" jdbcType=\"VARCHAR\"/>\n    <result column=\"message_tag\" property=\"messageTag\" jdbcType=\"VARCHAR\"/>\n    <result column=\"message_type\" property=\"messageType\" jdbcType=\"INTEGER\"/>\n    <result column=\"delay_level\" property=\"delayLevel\" jdbcType=\"INTEGER\"/>\n    <result column=\"order_type\" property=\"orderType\" jdbcType=\"INTEGER\"/>\n    <result column=\"message_status\" property=\"messageStatus\" jdbcType=\"INTEGER\"/>\n    <result column=\"task_status\" property=\"taskStatus\" jdbcType=\"INTEGER\"/>\n    <result column=\"update_time\" property=\"updateTime\" jdbcType=\"TIMESTAMP\"/>\n    <result column=\"resend_times\" property=\"resendTimes\" jdbcType=\"INTEGER\"/>\n    <result column=\"dead\" property=\"dead\" jdbcType=\"INTEGER\"/>\n    <result column=\"next_exe_time\" property=\"nextExeTime\" jdbcType=\"INTEGER\"/>\n    <result column=\"yn\" property=\"yn\" jdbcType=\"INTEGER\"/>\n    <result column=\"created_time\" property=\"createdTime\" jdbcType=\"TIMESTAMP\"/>\n  </resultMap>\n  <resultMap id=\"ResultMapWithBLOBs\" type=\"com.paascloud.provider.model.domain.TpcMqMessage\" extends=\"BaseResultMap\">\n    <result column=\"message_body\" property=\"messageBody\" jdbcType=\"LONGVARCHAR\"/>\n  </resultMap>\n  <sql id=\"Base_Column_List\">\n    ${alias}.id,\n    ${alias}.version,\n    ${alias}.message_key,\n    ${alias}.message_topic,\n    ${alias}.message_tag,\n    ${alias}.message_type,\n    ${alias}.producer_group,\n    ${alias}.delay_level,\n    ${alias}.order_type,\n    ${alias}.message_status,\n    ${alias}.task_status,\n    ${alias}.update_time,\n    ${alias}.resend_times,\n    ${alias}.dead,\n    ${alias}.next_exe_time,\n    ${alias}.yn,\n    ${alias}.creator,\n    ${alias}.creator_id,\n    ${alias}.created_time,\n    ${alias}.last_operator,\n    ${alias}.last_operator_id\n  </sql>\n  <sql id=\"Blob_Column_List\">\n    ${alias}.message_body\n  </sql>\n  <update id=\"addTaskExeCountById\">\n    UPDATE pc_tpc_mq_message\n    SET resend_times = resend_times + 1, update_time = now()\n    WHERE id = #{messageId}\n  </update>\n  <update id=\"updateAlreadyDeadByMessageId\">\n    UPDATE pc_tpc_mq_message\n    SET dead = 1, update_time = now(), task_status = 4\n    WHERE id = #{messageId}\n  </update>\n  <update id=\"updateMqMessageTaskStatus\">\n    UPDATE pc_tpc_mq_message\n    SET task_status = #{taskStatus}, update_time = now()\n    WHERE id = #{id}\n    and task_status IN\n    <foreach collection=\"preStatusList\" item=\"item\" index=\"index\" open=\"(\" close=\")\" separator=\",\">\n      #{item}\n    </foreach>\n  </update>\n\n  <delete id=\"deleteMessageByMessageKey\">\n    DELETE FROM pc_tpc_mq_message\n    WHERE message_key = #{messageKey,jdbcType=VARCHAR}\n  </delete>\n  <delete id=\"batchDeleteMessage\">\n    delete from pc_tpc_mq_message\n    where message_key IN\n    <foreach collection=\"messageKeyList\" item=\"item\" index=\"index\" open=\"(\" close=\")\" separator=\",\">\n      #{item}\n    </foreach>\n  </delete>\n  <select id=\"getByMessageKey\" resultType=\"tpcMqMessage\">\n    SELECT\n    <include refid=\"Base_Column_List\">\n      <property name=\"alias\" value=\"message\"/>\n    </include>\n    ,\n    <include refid=\"Blob_Column_List\">\n      <property name=\"alias\" value=\"message\"/>\n    </include>\n    FROM pc_tpc_mq_message message\n    WHERE message.message_key = #{messageKey,jdbcType=VARCHAR}\n  </select>\n  <select id=\"queryWaitingConfirmMessageKeyList\" resultType=\"java.lang.String\">\n    SELECT message_key\n    FROM\n      pc_tpc_mq_message\n    WHERE\n      mod(id, #{shardingTotalCount}) = #{shardingItem}\n      AND task_status = #{taskStatus}\n      AND message_status = #{messageStatus}\n      AND created_time &lt; #{createTimeBefore}\n      AND producer_group = #{producerGroup}\n      AND yn = 0\n    ORDER BY update_time\n    LIMIT ${fetchNum}\n  </select>\n  <select id=\"listMessageForWaitingProcess\" resultMap=\"ResultMapWithBLOBs\">\n    SELECT\n    <include refid=\"Base_Column_List\">\n      <property name=\"alias\" value=\"message\"/>\n    </include>\n    ,\n    <include refid=\"Blob_Column_List\">\n      <property name=\"alias\" value=\"message\"/>\n    </include>\n    FROM\n    pc_tpc_mq_message message\n    WHERE\n    mod(message.id, #{shardingTotalCount}) = #{shardingItem}\n    AND message.task_status = #{taskStatus}\n    AND message.message_status = #{messageStatus}\n    AND message.created_time &lt; #{createTimeBefore}\n    AND message.yn = 0\n    ORDER BY update_time\n    LIMIT ${fetchNum}\n  </select>\n  <select id=\"listReliableMessageVoWithPage\" resultType=\"com.paascloud.provider.model.vo.TpcMessageVo\">\n    SELECT\n    <include refid=\"Base_Column_List\">\n      <property name=\"alias\" value=\"message\"/>\n    </include>\n    ,\n    <include refid=\"Blob_Column_List\">\n      <property name=\"alias\" value=\"message\"/>\n    </include>\n    FROM\n    pc_tpc_mq_message message\n    WHERE 1 = 1\n    <if test=\"messageKey != null and messageKey !=''\">\n      AND message.message_key LIKE concat('%', #{messageKey,jdbcType=VARCHAR}, '%')\n    </if>\n    <if test=\"messageTopic != null and messageTopic !=''\">\n      AND message.message_topic = #{messageTopic,jdbcType=VARCHAR}\n    </if>\n    <if test=\"messageTag != null and messageTag !=''\">\n      AND message.message_tag = #{messageTag,jdbcType=VARCHAR}\n    </if>\n    <if test=\"producerGroup != null and producerGroup !=''\">\n      AND message.producer_group = #{producerGroup,jdbcType=VARCHAR}\n    </if>\n    <if test=\"messageStatus != null\">\n      AND message.message_status = #{messageStatus,jdbcType=INTEGER}\n    </if>\n    <if test=\"startQueryTime != null and endQueryTime != null\">\n      AND message.created_time BETWEEN #{startQueryTime} AND #{endQueryTime}\n    </if>\n    ORDER BY update_time desc\n  </select>\n\n  <resultMap id=\"TpcMqConsumerVoResultMap\" extends=\"ResultMapWithBLOBs\" type=\"com.paascloud.provider.model.vo.TpcMessageVo\">\n    <collection property=\"mqConfirmVoList\" ofType=\"com.paascloud.provider.model.vo.TpcMqConfirmVo\">\n      <result property=\"consumerCode\" column=\"consumerCode\"/>\n      <result property=\"consumeCount\" column=\"consumeCount\"/>\n      <result property=\"createdTime\" column=\"confirmCreatedTime\"/>\n      <result property=\"updateTime\" column=\"confirmUpdateTime\"/>\n      <result property=\"status\" column=\"confirmStatus\"/>\n    </collection>\n  </resultMap>\n\n  <select id=\"listReliableMessageVo\" resultMap=\"TpcMqConsumerVoResultMap\">\n    SELECT\n    confirm.consumer_code as consumerCode,\n    confirm.consume_count as consumeCount,\n    confirm.created_time AS confirmCreatedTime,\n    confirm.update_time AS confirmUpdateTime,\n    confirm.status as confirmStatus,\n    <include refid=\"Base_Column_List\">\n      <property name=\"alias\" value=\"message\"/>\n    </include>\n    ,\n    <include refid=\"Blob_Column_List\">\n      <property name=\"alias\" value=\"message\"/>\n    </include>\n    from pc_tpc_mq_message message\n    LEFT JOIN pc_tpc_mq_confirm confirm on message.id = confirm.message_id\n    WHERE message.id IN\n    <foreach collection=\"messageIdList\" item=\"item\" index=\"index\" open=\"(\" separator=\",\" close=\")\">\n      #{item}\n    </foreach>\n  </select>\n</mapper>"
  },
  {
    "path": "paascloud-provider/paascloud-provider-tpc/src/main/resources/mapper/TpcMqProducerMapper.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n<!DOCTYPE mapper PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\" \"http://mybatis.org/dtd/mybatis-3-mapper.dtd\" >\n<mapper namespace=\"com.paascloud.provider.mapper.TpcMqProducerMapper\">\n  <resultMap id=\"BaseResultMap\" type=\"com.paascloud.provider.model.domain.TpcMqProducer\">\n    <id column=\"id\" property=\"id\" jdbcType=\"BIGINT\"/>\n    <result column=\"application_name\" property=\"applicationName\" jdbcType=\"VARCHAR\"/>\n    <result column=\"producer_code\" property=\"producerCode\" jdbcType=\"VARCHAR\"/>\n    <result column=\"producer_name\" property=\"producerName\" jdbcType=\"VARCHAR\"/>\n    <result column=\"query_message_url\" property=\"queryMessageUrl\" jdbcType=\"VARCHAR\"/>\n    <result column=\"status\" property=\"status\" jdbcType=\"INTEGER\"/>\n    <result column=\"remark\" property=\"remark\" jdbcType=\"VARCHAR\"/>\n    <result column=\"creator\" property=\"creator\" jdbcType=\"VARCHAR\"/>\n    <result column=\"creator_id\" property=\"creatorId\" jdbcType=\"BIGINT\"/>\n    <result column=\"created_time\" property=\"createdTime\" jdbcType=\"TIMESTAMP\"/>\n    <result column=\"last_operator\" property=\"lastOperator\" jdbcType=\"VARCHAR\"/>\n    <result column=\"last_operator_id\" property=\"lastOperatorId\" jdbcType=\"BIGINT\"/>\n    <result column=\"update_time\" property=\"updateTime\" jdbcType=\"TIMESTAMP\"/>\n  </resultMap>\n  <sql id=\"Base_Column_List\">\n    ${alias}.id,\n    ${alias}.version,\n    ${alias}.aplication_name,\n    ${alias}.producer_code,\n    ${alias}.producer_name,\n    ${alias}.query_message_url,\n    ${alias}.status,\n    ${alias}.remark,\n    ${alias}.creator,\n    ${alias}.creator_id,\n    ${alias}.created_time,\n    ${alias}.last_operator,\n    ${alias}.last_operator_id,\n    ${alias}.update_time\n  </sql>\n\n  <sql id=\"Base_Topic_Column_List\">\n    ${alias}.version as topic_version,\n    ${alias}.producer_id,\n    ${alias}.topic_code,\n    ${alias}.topic_name,\n    ${alias}.mq_type,\n    ${alias}.msg_type,\n    ${alias}.status as topic_status,\n    ${alias}.remarks as topic_remarks,\n    ${alias}.creator as topic_creator,\n    ${alias}.creator_id as topic_created_time,\n    ${alias}.created_time as topic_created_time,\n    ${alias}.last_operator as topic_last_operator,\n    ${alias}.last_operator_id as topic_last_operator_id,\n    ${alias}.update_time as topic_update_time\n  </sql>\n  <delete id=\"deletePublishByProducerId\">\n    DELETE FROM pc_tpc_mq_publish WHERE producer_id = #{producerId}\n  </delete>\n\n  <resultMap id=\"TpcMqProducerVoResultMap\" extends=\"BaseResultMap\" type=\"com.paascloud.provider.model.vo.TpcMqProducerVo\">\n    <collection property=\"mqTopicVoList\" ofType=\"com.paascloud.provider.model.vo.TpcMqTopicVo\">\n      <result property=\"topicCode\" column=\"topic_code\"/>\n      <result property=\"topicName\" column=\"topic_name\"/>\n      <result property=\"status\" column=\"topic_status\"/>\n      <result property=\"lastOperator\" column=\"topic_last_operator\"/>\n      <result property=\"updateTime\" column=\"topic_update_time\"/>\n    </collection>\n  </resultMap>\n\n  <select id=\"listTpcMqProducerVoWithPage\" resultMap=\"TpcMqProducerVoResultMap\">\n    SELECT\n    <include refid=\"Base_Column_List\">\n      <property name=\"alias\" value=\"producer\"/>\n    </include>\n    ,\n    <include refid=\"Base_Topic_Column_List\">\n      <property name=\"alias\" value=\"topic\"/>\n    </include>\n    from pc_tpc_mq_producer producer\n    LEFT JOIN pc_tpc_mq_publish publish ON producer.id = publish.producer_id\n    LEFT JOIN pc_tpc_mq_topic topic on topic.id = publish.topic_id\n    where 1=1\n    <if test=\"producerCode != null and producerCode !=''\">\n      AND producer.producer_code LIKE concat(#{producerCode}, '%')\n    </if>\n    <if test=\"producerName != null and producerName !=''\">\n      AND producer.producer_name LIKE concat(#{producerName}, '%')\n    </if>\n    <if test=\"status != null and status !=''\">\n      AND producer.status = #{status,jdbcType=INTEGER}\n    </if>\n  </select>\n\n  <resultMap id=\"TpcMqPublishVoResultMap\" extends=\"BaseResultMap\" type=\"com.paascloud.provider.model.vo.TpcMqPublishVo\">\n    <result property=\"topicCode\" column=\"topic_code\"/>\n    <result property=\"topicName\" column=\"topic_name\"/>\n  </resultMap>\n\n  <select id=\"listTpcMqPublishVoWithPage\" resultMap=\"TpcMqPublishVoResultMap\">\n    SELECT\n    <include refid=\"Base_Column_List\">\n      <property name=\"alias\" value=\"producer\"/>\n    </include>\n    ,\n    topic.topic_code,\n    topic.topic_name\n    from\n    pc_tpc_mq_publish publish\n    LEFT JOIN pc_tpc_mq_producer producer ON publish.producer_id = producer.id\n    LEFT JOIN pc_tpc_mq_topic topic on topic.id = publish.topic_id\n    WHERE 1 = 1\n    <if test=\"producerCode != null and producerCode !=''\">\n      AND producer.producer_code LIKE concat(#{producerCode}, '%')\n    </if>\n    <if test=\"status != null and status !=''\">\n      AND producer.status = #{status,jdbcType=INTEGER}\n    </if>\n  </select>\n  <select id=\"getByPid\" resultType=\"com.paascloud.provider.model.domain.TpcMqProducer\">\n    SELECT\n    <include refid=\"Base_Column_List\">\n      <property name=\"alias\" value=\"producer\"/>\n    </include>\n    from pc_tpc_mq_producer producer where producer.producer_code = #{pid}\n  </select>\n</mapper>"
  },
  {
    "path": "paascloud-provider/paascloud-provider-tpc/src/main/resources/mapper/TpcMqSubscribeTagMapper.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n<!DOCTYPE mapper PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\" \"http://mybatis.org/dtd/mybatis-3-mapper.dtd\" >\n<mapper namespace=\"com.paascloud.provider.mapper.TpcMqSubscribeTagMapper\">\n    <resultMap id=\"BaseResultMap\" type=\"com.paascloud.provider.model.domain.TpcMqSubscribeTag\">\n        <id column=\"subscribe_id\" property=\"subscribeId\" jdbcType=\"BIGINT\"/>\n        <id column=\"tag_id\" property=\"tagId\" jdbcType=\"BIGINT\"/>\n    </resultMap>\n</mapper>"
  },
  {
    "path": "paascloud-provider/paascloud-provider-tpc/src/main/resources/mapper/TpcMqTagMapper.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n<!DOCTYPE mapper PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\" \"http://mybatis.org/dtd/mybatis-3-mapper.dtd\" >\n<mapper namespace=\"com.paascloud.provider.mapper.TpcMqTagMapper\">\n  <resultMap id=\"BaseResultMap\" type=\"com.paascloud.provider.model.domain.TpcMqTag\">\n    <id column=\"id\" property=\"id\" jdbcType=\"BIGINT\"/>\n    <result column=\"topic_id\" property=\"topicId\" jdbcType=\"BIGINT\"/>\n    <result column=\"tag_code\" property=\"tagCode\" jdbcType=\"VARCHAR\"/>\n    <result column=\"tag_name\" property=\"tagName\" jdbcType=\"VARCHAR\"/>\n    <result column=\"status\" property=\"status\" jdbcType=\"INTEGER\"/>\n    <result column=\"remark\" property=\"remark\" jdbcType=\"VARCHAR\"/>\n    <result column=\"creator\" property=\"creator\" jdbcType=\"VARCHAR\"/>\n    <result column=\"creator_id\" property=\"creatorId\" jdbcType=\"BIGINT\"/>\n    <result column=\"created_time\" property=\"createdTime\" jdbcType=\"TIMESTAMP\"/>\n    <result column=\"last_operator\" property=\"lastOperator\" jdbcType=\"VARCHAR\"/>\n    <result column=\"last_operator_id\" property=\"lastOperatorId\" jdbcType=\"BIGINT\"/>\n    <result column=\"update_time\" property=\"updateTime\" jdbcType=\"TIMESTAMP\"/>\n  </resultMap>\n\n  <sql id=\"Base_Column_List\">\n    ${alias}.id, ${alias}.version, ${alias}.topic_id, ${alias}.tag_code, ${alias}.tag_name,\n    ${alias}.status, ${alias}.remark, ${alias}.creator, ${alias}.creator_id,\n    ${alias}.created_time, ${alias}.last_operator, ${alias}.last_operator_id, ${alias}.update_time\n  </sql>\n\n  <resultMap id=\"TpcMqTagVoResultMap\" extends=\"BaseResultMap\" type=\"com.paascloud.provider.model.vo.TpcMqTagVo\">\n    <result property=\"topicCode\" column=\"topic_code\"/>\n    <result property=\"topicName\" column=\"topic_name\"/>\n  </resultMap>\n\n\n\n  <select id=\"listTpcMqTagVoWithPage\" resultMap=\"TpcMqTagVoResultMap\">\n    SELECT\n    <include refid=\"Base_Column_List\">\n      <property name=\"alias\" value=\"tag\"/>\n    </include>\n    ,\n    topic.topic_code,\n    topic.topic_name\n    from\n    pc_tpc_mq_tag tag\n    LEFT JOIN pc_tpc_mq_topic topic ON tag.topic_id = topic.id\n    WHERE 1 = 1\n    <if test=\"tagCode != null and tagCode !=''\">\n      AND tag.tag_code LIKE concat(#{tagCode}, '%')\n    </if>\n    <if test=\"tagName != null and tagName !=''\">\n      AND tag.tag_name LIKE concat(#{tagName}, '%')\n    </if>\n    <if test=\"topicId != null and topicId !=''\">\n      AND tag.topic_id = #{topicId,jdbcType=VARCHAR}\n    </if>\n    <if test=\"status != null and status !=''\">\n      AND tag.status = #{status,jdbcType=INTEGER}\n    </if>\n  </select>\n</mapper>"
  },
  {
    "path": "paascloud-provider/paascloud-provider-tpc/src/main/resources/mapper/TpcMqTopicMapper.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n<!DOCTYPE mapper PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\" \"http://mybatis.org/dtd/mybatis-3-mapper.dtd\" >\n<mapper namespace=\"com.paascloud.provider.mapper.TpcMqTopicMapper\">\n    <resultMap id=\"BaseResultMap\" type=\"com.paascloud.provider.model.domain.TpcMqTopic\">\n        <id column=\"id\" property=\"id\" jdbcType=\"BIGINT\"/>\n        <result column=\"topic_code\" property=\"topicCode\" jdbcType=\"VARCHAR\"/>\n        <result column=\"topic_name\" property=\"topicName\" jdbcType=\"VARCHAR\"/>\n        <result column=\"mq_type\" property=\"mqType\" jdbcType=\"INTEGER\"/>\n        <result column=\"msg_type\" property=\"msgType\" jdbcType=\"INTEGER\"/>\n        <result column=\"status\" property=\"status\" jdbcType=\"INTEGER\"/>\n        <result column=\"remarks\" property=\"remarks\" jdbcType=\"VARCHAR\"/>\n        <result column=\"creator\" property=\"creator\" jdbcType=\"VARCHAR\"/>\n        <result column=\"creator_id\" property=\"creatorId\" jdbcType=\"BIGINT\"/>\n        <result column=\"created_time\" property=\"createdTime\" jdbcType=\"TIMESTAMP\"/>\n        <result column=\"last_operator\" property=\"lastOperator\" jdbcType=\"VARCHAR\"/>\n        <result column=\"last_operator_id\" property=\"lastOperatorId\" jdbcType=\"BIGINT\"/>\n        <result column=\"update_time\" property=\"updateTime\" jdbcType=\"TIMESTAMP\"/>\n    </resultMap>\n    <sql id=\"Base_Column_List\" >\n        ${alias}.id, ${alias}.version, ${alias}.producer_id, ${alias}.topic_code, ${alias}.topic_name, ${alias}.mq_type, ${alias}.msg_type, ${alias}.status, ${alias}.remarks,\n        ${alias}.creator, ${alias}.creator_id, ${alias}.created_time, ${alias}.last_operator, ${alias}.last_operator_id, ${alias}.update_time\n    </sql>\n\n    <sql id=\"Base_Tag_Column_List\" >\n        ${alias}.id as tag_id, ${alias}.version as tag_version, ${alias}.topic_id, ${alias}.tag_code, ${alias}.tag_name,\n        ${alias}.status as tag_status, ${alias}.remark as tag_remark, ${alias}.creator as tag_creator, ${alias}.creator_id as tag_creator_id,\n        ${alias}.created_time as tag_created_time, ${alias}.last_operator as tag_last_operator, ${alias}.last_operator_id as tag_last_operator_id, ${alias}.update_time as tag_update_time\n    </sql>\n\n    <resultMap id=\"TpcMqTopicVoResultMap\" extends=\"BaseResultMap\" type=\"com.paascloud.provider.model.vo.TpcMqTopicVo\">\n        <collection property=\"tagVoList\" ofType=\"com.paascloud.provider.model.vo.TpcMqTagVo\">\n            <result property=\"tagCode\" column=\"tag_code\"/>\n            <result property=\"tagName\" column=\"tag_name\"/>\n            <result property=\"status\" column=\"tag_status\"/>\n            <result property=\"lastOperator\" column=\"tag_last_operator\"/>\n            <result property=\"updateTime\" column=\"tag_update_time\"/>\n        </collection>\n    </resultMap>\n\n    <select id=\"listTpcMqTopicVoWithPage\" resultMap=\"TpcMqTopicVoResultMap\">\n        SELECT\n            <include refid=\"Base_Column_List\">\n              <property name=\"alias\" value=\"topic\"></property>\n            </include>\n            ,\n            <include refid=\"Base_Tag_Column_List\">\n                <property name=\"alias\" value=\"tag\"></property>\n            </include>\n        FROM\n          pc_tpc_mq_topic topic\n        LEFT JOIN\n          pc_tpc_mq_tag tag ON topic.id = tag.topic_id\n        WHERE 1 = 1\n        <if test=\"topicCode != null and topicCode !=''\" >\n            AND topic.topic_code LIKE concat(#{topicCode}, '%')\n        </if>\n        <if test=\"topicName != null and topicName !=''\" >\n            AND topic.topic_name LIKE concat(#{topicName}, '%')\n        </if>\n        <if test=\"status != null and status !=''\" >\n            AND topic.status = #{status,jdbcType=INTEGER}\n        </if>\n    </select>\n</mapper>"
  },
  {
    "path": "paascloud-provider/paascloud-provider-tpc/src/test/java/com/paascloud/provider/PaasCloudMdcApplicationTests.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：PaasCloudMdcApplicationTests.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider;\n\nimport org.junit.runner.RunWith;\nimport org.springframework.boot.test.context.SpringBootTest;\nimport org.springframework.test.context.junit4.SpringRunner;\n\n@RunWith(SpringRunner.class)\n@SpringBootTest\npublic class PaasCloudMdcApplicationTests {\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-uac/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n         xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n  <modelVersion>4.0.0</modelVersion>\n\n  <artifactId>paascloud-provider-uac</artifactId>\n  <packaging>jar</packaging>\n\n  <name>paascloud-provider-uac</name>\n  <description>用户认证中心 - User authentication center</description>\n\n  <parent>\n    <groupId>com.liuzm.paascloud.provider</groupId>\n    <artifactId>paascloud-provider</artifactId>\n    <version>1.0</version>\n  </parent>\n\n  <properties>\n    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>\n    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>\n    <java.version>1.8</java.version>\n  </properties>\n\n  <dependencies>\n\n    <dependency>\n      <groupId>mysql</groupId>\n      <artifactId>mysql-connector-java</artifactId>\n      <scope>runtime</scope>\n    </dependency>\n    <dependency>\n      <groupId>io.jsonwebtoken</groupId>\n      <artifactId>jjwt</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>joda-time</groupId>\n      <artifactId>joda-time</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.mybatis.spring.boot</groupId>\n      <artifactId>mybatis-spring-boot-starter</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>tk.mybatis</groupId>\n      <artifactId>mapper-spring-boot-starter</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>com.github.pagehelper</groupId>\n      <artifactId>pagehelper-spring-boot-starter</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>com.alibaba</groupId>\n      <artifactId>druid-spring-boot-starter</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>com.fasterxml.jackson.core</groupId>\n      <artifactId>jackson-databind</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>com.liuzm.paascloud.provider.api</groupId>\n      <artifactId>paascloud-provider-uac-api</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>com.liuzm.paascloud.provider.api</groupId>\n      <artifactId>paascloud-provider-mdc-api</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>com.liuzm.paascloud.provider.api</groupId>\n      <artifactId>paascloud-provider-omc-api</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>com.liuzm.paascloud.provider.api</groupId>\n      <artifactId>paascloud-provider-opc-api</artifactId>\n      <version>1.0</version>\n    </dependency>\n    <dependency>\n      <groupId>com.liuzm.paascloud.provider.api</groupId>\n      <artifactId>paascloud-provider-sdk-api</artifactId>\n    </dependency>\n    <!-- https://mvnrepository.com/artifact/org.apache.rocketmq/rocketmq-client -->\n    <dependency>\n      <groupId>org.apache.rocketmq</groupId>\n      <artifactId>rocketmq-client</artifactId>\n      <version>4.1.0-incubating</version>\n    </dependency>\n    <dependency>\n      <groupId>de.codecentric</groupId>\n      <artifactId>spring-boot-admin-starter-client</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.springframework.boot</groupId>\n      <artifactId>spring-boot-starter-freemarker</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.springframework.cloud</groupId>\n      <artifactId>spring-cloud-starter-feign</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>com.github.penggle</groupId>\n      <artifactId>kaptcha</artifactId>\n    </dependency>\n\n    <dependency>\n      <groupId>org.springframework.cloud</groupId>\n      <artifactId>spring-cloud-starter-oauth2</artifactId>\n    </dependency>\n\n    <dependency>\n      <groupId>org.springframework.social</groupId>\n      <artifactId>spring-social-config</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.springframework.social</groupId>\n      <artifactId>spring-social-core</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.springframework.social</groupId>\n      <artifactId>spring-social-security</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.springframework.social</groupId>\n      <artifactId>spring-social-web</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>com.liuzm.paascloud.common</groupId>\n      <artifactId>paascloud-common-base</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>com.liuzm.paascloud.common</groupId>\n      <artifactId>paascloud-security-app</artifactId>\n    </dependency>\n  </dependencies>\n</project>\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/PaasCloudUacApplication.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：PaasCloudUacApplication.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud;\n\nimport com.paascloud.provider.service.impl.PcSmsCodeSender;\nimport com.paascloud.security.core.validate.code.sms.SmsCodeSender;\nimport liquibase.integration.spring.SpringLiquibase;\nimport org.springframework.boot.SpringApplication;\nimport org.springframework.boot.autoconfigure.SpringBootApplication;\nimport org.springframework.cloud.client.discovery.EnableDiscoveryClient;\nimport org.springframework.cloud.netflix.feign.EnableFeignClients;\nimport org.springframework.cloud.netflix.hystrix.EnableHystrix;\nimport org.springframework.context.annotation.Bean;\nimport org.springframework.context.support.ReloadableResourceBundleMessageSource;\nimport org.springframework.transaction.annotation.EnableTransactionManagement;\n\nimport javax.sql.DataSource;\n\n/**\n * The class Paas cloud uac application.\n *\n * @author paascloud.net@gmail.com\n */\n@EnableHystrix\n@EnableFeignClients\n@EnableDiscoveryClient\n@SpringBootApplication\n@EnableTransactionManagement\npublic class PaasCloudUacApplication {\n\n\t/**\n\t * The entry point of application.\n\t *\n\t * @param args the input arguments\n\t */\n\tpublic static void main(String[] args) {\n\t\tSpringApplication.run(PaasCloudUacApplication.class, args);\n\t}\n\n\t@Bean\n\tpublic SpringLiquibase springLiquibase(DataSource dataSource) {\n\n\t\tSpringLiquibase springLiquibase = new SpringLiquibase();\n\n\t\tspringLiquibase.setDataSource(dataSource);\n\t\tspringLiquibase.setChangeLog(\"classpath:/liquibase/index.xml\");\n\n\t\treturn springLiquibase;\n\t}\n\n\t@Bean\n\tpublic ReloadableResourceBundleMessageSource messageSource() {\n\t\tReloadableResourceBundleMessageSource messageSource = new ReloadableResourceBundleMessageSource();\n\t\tmessageSource.setBasename(\"classpath:org/springframework/security/messages_zh_CN\");\n\t\treturn messageSource;\n\t}\n\n\t@Bean\n\tpublic SmsCodeSender smsCodeSender() {\n\t\treturn new PcSmsCodeSender();\n\t}\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/config/AliyunMqConfiguration.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：AliyunMqConfiguration.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.config;\n\nimport com.paascloud.PublicUtil;\nimport com.paascloud.base.constant.AliyunMqTopicConstants;\nimport com.paascloud.base.constant.GlobalConstant;\nimport com.paascloud.config.properties.PaascloudProperties;\nimport com.paascloud.provider.mq.consumer.listener.UacPushMessageListener;\nimport lombok.extern.slf4j.Slf4j;\nimport org.apache.rocketmq.client.consumer.DefaultMQPushConsumer;\nimport org.apache.rocketmq.client.exception.MQClientException;\nimport org.apache.rocketmq.common.consumer.ConsumeFromWhere;\nimport org.springframework.context.annotation.Bean;\nimport org.springframework.context.annotation.Configuration;\nimport org.springframework.core.task.TaskExecutor;\n\nimport javax.annotation.Resource;\n\n/**\n * The class Aliyun mq configuration.\n *\n * @author paascloud.net@gmail.com\n */\n@Slf4j\n@Configuration\npublic class AliyunMqConfiguration {\n\t@Resource\n\tprivate UacPushMessageListener uacPushMessageListener;\n\n\t@Resource\n\tprivate PaascloudProperties paascloudProperties;\n\n\t@Resource\n\tprivate TaskExecutor taskExecutor;\n\n\t/**\n\t * Default mq push consumer default mq push consumer.\n\t *\n\t * @return the default mq push consumer\n\t *\n\t * @throws MQClientException the mq client exception\n\t */\n\t@Bean\n\tpublic DefaultMQPushConsumer defaultMQPushConsumer() throws MQClientException {\n\t\tDefaultMQPushConsumer consumer = new DefaultMQPushConsumer(paascloudProperties.getAliyun().getRocketMq().getConsumerGroup());\n\t\tconsumer.setNamesrvAddr(paascloudProperties.getAliyun().getRocketMq().getNamesrvAddr());\n\t\tconsumer.setConsumeFromWhere(ConsumeFromWhere.CONSUME_FROM_LAST_OFFSET);\n\n\t\tString[] strArray = AliyunMqTopicConstants.ConsumerTopics.UAC.split(GlobalConstant.Symbol.COMMA);\n\t\tfor (String aStrArray : strArray) {\n\t\t\tString[] topicArray = aStrArray.split(GlobalConstant.Symbol.AT);\n\t\t\tString topic = topicArray[0];\n\t\t\tString tags = topicArray[1];\n\t\t\tif (PublicUtil.isEmpty(tags)) {\n\t\t\t\ttags = \"*\";\n\t\t\t}\n\t\t\tconsumer.subscribe(topic, tags);\n\t\t\tlog.info(\"RocketMq UacPushConsumer topic = {}, tags={}\", topic, tags);\n\t\t}\n\n\t\tconsumer.registerMessageListener(uacPushMessageListener);\n\t\tconsumer.setConsumeThreadMax(2);\n\t\tconsumer.setConsumeThreadMin(2);\n\n\t\ttaskExecutor.execute(() -> {\n\t\t\ttry {\n\t\t\t\tThread.sleep(5000);\n\t\t\t\tconsumer.start();\n\t\t\t\tlog.info(\"RocketMq UacPushConsumer OK.\");\n\t\t\t} catch (InterruptedException | MQClientException e) {\n\t\t\t\tlog.error(\"RocketMq OpcPushConsumer, 出现异常={}\", e.getMessage(), e);\n\t\t\t}\n\t\t});\n\t\treturn consumer;\n\t}\n\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/config/CaptchaConfig.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：CaptchaConfig.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.config;\n\nimport com.google.code.kaptcha.impl.DefaultKaptcha;\nimport com.google.code.kaptcha.util.Config;\nimport org.springframework.context.annotation.Bean;\nimport org.springframework.context.annotation.Configuration;\n\nimport java.util.Properties;\n\n/**\n * The class Captcha config.\n *\n * @author paascloud.net @gmail.com\n */\n@Configuration\npublic class CaptchaConfig {\n\n\t/**\n\t * Get kaptcha bean default kaptcha.\n\t *\n\t * @return the default kaptcha\n\t */\n\t@Bean(name = \"captchaProducer\")\n\tpublic DefaultKaptcha getKaptchaBean() {\n\t\tDefaultKaptcha defaultKaptcha = new DefaultKaptcha();\n\t\tProperties properties = new Properties();\n\t\tproperties.setProperty(\"kaptcha.border\", \"no\");\n\t\tproperties.setProperty(\"kaptcha.border.color\", \"no\");\n\t\tproperties.setProperty(\"kaptcha.border.color\", \"220,227,232\");\n\t\tproperties.setProperty(\"kaptcha.textproducer.char.string\", \"2345689\");\n\t\tproperties.setProperty(\"kaptcha.textproducer.font.color\", \"black\");\n\t\tproperties.setProperty(\"kaptcha.textproducer.font.size\", \"16\");\n\t\tproperties.setProperty(\"kaptcha.image.width\", \"106\");\n\t\tproperties.setProperty(\"kaptcha.image.height\", \"30\");\n\t\tproperties.setProperty(\"kaptcha.session.key\", \"kaptchaCode\");\n\t\tproperties.setProperty(\"kaptcha.textproducer.char.length\", \"4\");\n\t\tproperties.setProperty(\"kaptcha.background.clear.from\", \"white\");\n\t\tproperties.setProperty(\"kaptcha.background.clear.to\", \"white\");\n\t\tproperties.setProperty(\"kaptcha.textproducer.char.space\", \"5\");\n\t\tproperties.setProperty(\"kaptcha.obscurificator.impl\", \"com.google.code.kaptcha.impl.ShadowGimpy\");\n\t\tproperties.setProperty(\"kaptcha.noise.impl\", \"com.google.code.kaptcha.impl.NoNoise\");\n\t\tproperties.setProperty(\"kaptcha.textproducer.font.names\", \"Verdana\");\n\t\tConfig config = new Config(properties);\n\t\tdefaultKaptcha.setConfig(config);\n\t\treturn defaultKaptcha;\n\t}\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/config/RedisInitRunner.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：RedisInitRunner.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.config;\n\nimport lombok.extern.slf4j.Slf4j;\nimport org.springframework.boot.CommandLineRunner;\nimport org.springframework.core.annotation.Order;\nimport org.springframework.stereotype.Component;\n\n/**\n * The class Redis init runner.\n *\n * @author paascloud.net @gmail.com\n */\n@Component\n@Order(value = 1)\n@Slf4j\npublic class RedisInitRunner implements CommandLineRunner {\n\n\t/**\n\t * Run.\n\t *\n\t * @param args the args\n\t */\n\t@Override\n\tpublic void run(String... args) {\n\t\tlog.info(\">>>>>>>>>>>>>>>服务启动执行，执行加载数据等操作 11111111 <<<<<<<<<<<<<\");\n\t}\n\n}"
  },
  {
    "path": "paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/config/UacWebMvcConfig.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：UacWebMvcConfig.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.config;\n\nimport com.paascloud.core.config.PcObjectMapper;\nimport com.paascloud.core.config.SwaggerConfiguration;\nimport com.paascloud.core.interceptor.TokenInterceptor;\nimport com.paascloud.security.core.properties.SecurityConstants;\nimport org.springframework.context.annotation.Configuration;\nimport org.springframework.context.annotation.Import;\nimport org.springframework.http.converter.HttpMessageConverter;\nimport org.springframework.web.servlet.config.annotation.EnableWebMvc;\nimport org.springframework.web.servlet.config.annotation.InterceptorRegistry;\nimport org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;\nimport org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;\n\nimport javax.annotation.Resource;\nimport java.util.List;\n\n/**\n * The class Web mvc config.\n *\n * @author paascloud.net @gmail.com\n */\n@Configuration\n@EnableWebMvc\n@Import(SwaggerConfiguration.class)\npublic class UacWebMvcConfig extends WebMvcConfigurerAdapter {\n\n\t@Resource\n\tprivate TokenInterceptor vueViewInterceptor;\n\n\t@Override\n\tpublic void addResourceHandlers(ResourceHandlerRegistry registry) {\n\t\tregistry.addResourceHandler(\"/**\")\n\t\t\t\t.addResourceLocations(\"classpath:/META-INF/resources/\", \"classpath:/resources/\", \"classpath:/static/\");\n\t}\n\n\t@Override\n\tpublic void addInterceptors(InterceptorRegistry registry) {\n\t\tsuper.addInterceptors(registry);\n\t\tregistry.addInterceptor(vueViewInterceptor)\n\t\t\t\t.addPathPatterns(\"/**\")\n\t\t\t\t.excludePathPatterns(\"/swagger-resources/**\", \"*.js\", \"/**/*.js\", \"*.css\", \"/**/*.css\", \"*.html\", \"/**/*.html\", SecurityConstants.DEFAULT_SOCIAL_USER_INFO_URL);\n\t}\n\n\t@Override\n\tpublic void configureMessageConverters(List<HttpMessageConverter<?>> converters) {\n\t\tPcObjectMapper.buidMvcMessageConverter(converters);\n\t}\n\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/manager/UserManager.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：UserManager.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.manager;\n\nimport com.google.common.base.Preconditions;\nimport com.paascloud.base.constant.GlobalConstant;\nimport com.paascloud.base.enums.ErrorCodeEnum;\nimport com.paascloud.provider.annotation.MqProducerStore;\nimport com.paascloud.provider.mapper.UacGroupUserMapper;\nimport com.paascloud.provider.mapper.UacRoleUserMapper;\nimport com.paascloud.provider.mapper.UacUserMapper;\nimport com.paascloud.provider.model.domain.MqMessageData;\nimport com.paascloud.provider.model.domain.UacGroupUser;\nimport com.paascloud.provider.model.domain.UacRoleUser;\nimport com.paascloud.provider.model.domain.UacUser;\nimport com.paascloud.provider.model.enums.MqSendTypeEnum;\nimport com.paascloud.provider.model.exceptions.UacBizException;\nimport com.paascloud.provider.service.impl.RedisServiceImpl;\nimport lombok.extern.slf4j.Slf4j;\nimport org.springframework.stereotype.Component;\nimport org.springframework.transaction.annotation.Transactional;\n\nimport javax.annotation.Resource;\n\n/**\n * The class User manager.\n *\n * @author paascloud.net @gmail.com\n */\n@Slf4j\n@Component\n@Transactional(rollbackFor = Exception.class)\npublic class UserManager {\n\t@Resource\n\tprivate UacUserMapper uacUserMapper;\n\t@Resource\n\tprivate UacRoleUserMapper uacRoleUserMapper;\n\t@Resource\n\tprivate UacGroupUserMapper uacGroupUserMapper;\n\t@Resource\n\tprivate RedisServiceImpl redisService;\n\n\t@MqProducerStore(sendType = MqSendTypeEnum.SAVE_AND_SEND)\n\tpublic void submitResetPwdEmail(final MqMessageData messageData) {\n\t\tlog.info(\"重置密码发送邮件. messageData={}\", messageData);\n\t}\n\n\t@MqProducerStore\n\tpublic void register(final MqMessageData mqMessageData, final UacUser uacUser) {\n\t\tlog.info(\"注册用户. mqMessageData={}, user={}\", mqMessageData, uacUser);\n\t\tuacUserMapper.insertSelective(uacUser);\n\t}\n\n\t@MqProducerStore\n\tpublic void resetLoginPwd(final MqMessageData mqMessageData, final UacUser update) {\n\t\tlog.info(\"重置密码. mqMessageData={}, user={}\", mqMessageData, update);\n\t\tint updateResult = uacUserMapper.updateByPrimaryKeySelective(update);\n\t\tif (updateResult < 1) {\n\t\t\tlog.error(\"用户【 {} 】重置密码失败\", update.getLoginName());\n\t\t} else {\n\t\t\tlog.info(\"用户【 {} 】重置密码失败\", update.getLoginName());\n\t\t}\n\t}\n\n\t@MqProducerStore\n\tpublic void activeUser(final MqMessageData mqMessageData, final UacUser uacUser, final String activeUserKey) {\n\t\tlog.info(\"激活用户. mqMessageData={}, user={}\", mqMessageData, uacUser);\n\t\tint result = uacUserMapper.updateByPrimaryKeySelective(uacUser);\n\t\tif (result < 1) {\n\t\t\tthrow new UacBizException(ErrorCodeEnum.UAC10011038, uacUser.getId());\n\t\t}\n\n\t\t// 绑定一个访客角色默认值roleId=10000\n\t\tfinal Long userId = uacUser.getId();\n\t\tPreconditions.checkArgument(userId != null, \"用戶Id不能爲空\");\n\n\t\tfinal Long roleId = 10000L;\n\n\t\tUacRoleUser roleUser = new UacRoleUser();\n\t\troleUser.setUserId(userId);\n\t\troleUser.setRoleId(roleId);\n\t\tuacRoleUserMapper.insertSelective(roleUser);\n\t\t// 绑定一个组织\n\t\tUacGroupUser groupUser = new UacGroupUser();\n\t\tgroupUser.setUserId(userId);\n\t\tgroupUser.setGroupId(GlobalConstant.Sys.SUPER_MANAGER_GROUP_ID);\n\t\tuacGroupUserMapper.insertSelective(groupUser);\n\t\t// 删除 activeUserToken\n\t\tredisService.deleteKey(activeUserKey);\n\t}\n\n\t@MqProducerStore(sendType = MqSendTypeEnum.SAVE_AND_SEND)\n\tpublic void sendSmsCode(final MqMessageData mqMessageData) {\n\t\tlog.info(\"发送短信验证码. mqMessageData={}\", mqMessageData);\n\t}\n\n\t@MqProducerStore(sendType = MqSendTypeEnum.SAVE_AND_SEND)\n\tpublic void sendEmailCode(final MqMessageData mqMessageData) {\n\t\tlog.info(\"发送邮件验证码. mqMessageData={}\", mqMessageData);\n\t}\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/mapper/UacActionMapper.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：UacActionMapper.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.mapper;\n\nimport com.paascloud.core.mybatis.MyMapper;\nimport com.paascloud.provider.model.domain.UacAction;\nimport com.paascloud.provider.model.domain.UacMenu;\nimport com.paascloud.provider.model.dto.user.Perm;\nimport com.paascloud.provider.model.vo.ActionVo;\nimport com.paascloud.provider.model.vo.MenuVo;\nimport org.apache.ibatis.annotations.Mapper;\nimport org.apache.ibatis.annotations.Param;\nimport org.springframework.stereotype.Component;\n\nimport java.util.List;\n\n/**\n * The interface Uac action mapper.\n *\n * @author paascloud.net@gmail.com\n */\n@Mapper\n@Component\npublic interface UacActionMapper extends MyMapper<UacAction> {\n\t/**\n\t * Find all perms list.\n\t *\n\t * @return the list\n\t */\n\tList<Perm> findAllPerms();\n\n\t/**\n\t * Find action code list by user id list.\n\t *\n\t * @param userId the user id\n\t *\n\t * @return the list\n\t */\n\tList<String> findActionCodeListByUserId(Long userId);\n\n\t/**\n\t * Batch delete by id list int.\n\t *\n\t * @param deleteIdList the delete id list\n\t *\n\t * @return the int\n\t */\n\tint batchDeleteByIdList(@Param(\"idList\") List<Long> deleteIdList);\n\n\t/**\n\t * Query action list with page list.\n\t *\n\t * @param uacAction the uac action\n\t *\n\t * @return the list\n\t */\n\tList<ActionVo> queryActionListWithPage(UacAction uacAction);\n\n\t/**\n\t * Delete by menu id int.\n\t *\n\t * @param id the id\n\t *\n\t * @return the int\n\t */\n\tint deleteByMenuId(@Param(\"menuId\") Long id);\n\n\t/**\n\t * Gets checked action list.\n\t *\n\t * @param roleId the role id\n\t *\n\t * @return the checked action list\n\t */\n\tList<Long> getCheckedActionList(@Param(\"roleId\") Long roleId);\n\n\t/**\n\t * Gets own auth list.\n\t *\n\t * @param userId the user id\n\t *\n\t * @return the own auth list\n\t */\n\tList<MenuVo> getOwnAuthList(@Param(\"userId\") Long userId);\n\n\t/**\n\t * Gets checked menu list.\n\t *\n\t * @param roleId the role id\n\t *\n\t * @return the checked menu list\n\t */\n\tList<Long> getCheckedMenuList(@Param(\"roleId\") Long roleId);\n\n\t/**\n\t * Gets own uac action list by user id.\n\t *\n\t * @param userId the user id\n\t *\n\t * @return the own uac action list by user id\n\t */\n\tList<UacAction> getOwnUacActionListByUserId(Long userId);\n\n\t/**\n\t * 根据角色ID查询权限列表.\n\t *\n\t * @param roleId the role id\n\t *\n\t * @return the list\n\t */\n\tList<UacAction> listActionListByRoleId(@Param(\"roleId\") Long roleId);\n\n\t/**\n\t * List action list list.\n\t *\n\t * @param menuList the menu list\n\t *\n\t * @return the list\n\t */\n\tList<UacAction> listActionList(@Param(\"menuList\") List<UacMenu> menuList);\n}"
  },
  {
    "path": "paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/mapper/UacGroupMapper.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：UacGroupMapper.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.mapper;\n\nimport com.paascloud.core.mybatis.MyMapper;\nimport com.paascloud.provider.model.domain.UacGroup;\nimport org.apache.ibatis.annotations.Mapper;\nimport org.springframework.stereotype.Component;\n\n/**\n * The interface Uac group mapper.\n *\n * @author paascloud.net@gmail.com\n */\n@Mapper\n@Component\npublic interface UacGroupMapper extends MyMapper<UacGroup> {\n}"
  },
  {
    "path": "paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/mapper/UacGroupUserMapper.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：UacGroupUserMapper.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.mapper;\n\nimport com.paascloud.core.mybatis.MyMapper;\nimport com.paascloud.provider.model.domain.UacGroup;\nimport com.paascloud.provider.model.domain.UacGroupUser;\nimport org.apache.ibatis.annotations.Mapper;\nimport org.apache.ibatis.annotations.Param;\nimport org.springframework.stereotype.Component;\n\nimport java.util.List;\n\n/**\n * The interface Uac group user mapper.\n *\n * @author paascloud.net@gmail.com\n */\n@Mapper\n@Component\npublic interface UacGroupUserMapper extends MyMapper<UacGroupUser> {\n\n\t/**\n\t * Query by user id uac group user.\n\t *\n\t * @param userId the user id\n\t *\n\t * @return the uac group user\n\t */\n\tUacGroupUser getByUserId(Long userId);\n\n\t/**\n\t * Update by user id int.\n\t *\n\t * @param uacGroupUser the uac group user\n\t *\n\t * @return the int\n\t */\n\tint updateByUserId(UacGroupUser uacGroupUser);\n\n\t/**\n\t * Select group list by user id list.\n\t *\n\t * @param userId the user id\n\t *\n\t * @return the list\n\t */\n\tList<UacGroup> selectGroupListByUserId(Long userId);\n\n\t/**\n\t * List by group id list.\n\t *\n\t * @param groupId the group id\n\t *\n\t * @return the list\n\t */\n\tList<UacGroupUser> listByGroupId(@Param(\"groupId\") Long groupId);\n\n\t/**\n\t * Delete exclude super mng int.\n\t *\n\t * @param groupId            the group id\n\t * @param superManagerRoleId the super manager role id\n\t *\n\t * @return the int\n\t */\n\tint deleteExcludeSuperMng(@Param(\"currentGroupId\") Long groupId, @Param(\"superManagerRoleId\") Long superManagerRoleId);\n}"
  },
  {
    "path": "paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/mapper/UacLogMapper.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：UacLogMapper.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.mapper;\n\nimport com.paascloud.core.mybatis.MyMapper;\nimport com.paascloud.provider.model.domain.UacLog;\nimport com.paascloud.provider.model.dto.log.UacLogMainDto;\nimport org.apache.ibatis.annotations.Mapper;\nimport org.apache.ibatis.annotations.Param;\nimport org.springframework.stereotype.Component;\n\nimport java.util.List;\n\n/**\n * The interface Uac log mapper.\n *\n * @author paascloud.net @gmail.com\n */\n@Mapper\n@Component\npublic interface UacLogMapper extends MyMapper<UacLog> {\n\t/**\n\t * Select user log list with user id list.\n\t *\n\t * @param userId the user id\n\t *\n\t * @return the list\n\t */\n\tList<UacLog> selectUserLogListByUserId(@Param(\"userId\") Long userId);\n\n\t/**\n\t * Query log list with page list.\n\t *\n\t * @param uacLogQueryDtoPage the uac log query dto page\n\t *\n\t * @return the list\n\t */\n\tList<UacLog> queryLogListWithPage(UacLogMainDto uacLogQueryDtoPage);\n}"
  },
  {
    "path": "paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/mapper/UacMenuMapper.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：UacMenuMapper.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.mapper;\n\nimport com.paascloud.core.mybatis.MyMapper;\nimport com.paascloud.provider.model.domain.UacMenu;\nimport com.paascloud.provider.model.vo.MenuVo;\nimport org.apache.ibatis.annotations.Mapper;\nimport org.apache.ibatis.annotations.Param;\nimport org.springframework.stereotype.Component;\n\nimport java.util.List;\nimport java.util.Set;\n\n/**\n * The interface Uac menu mapper.\n *\n * @author paascloud.net @gmail.com\n */\n@Mapper\n@Component\npublic interface UacMenuMapper extends MyMapper<UacMenu> {\n\n\t/**\n\t * Find menu vo list by user id list.\n\t *\n\t * @param userId the user id\n\t *\n\t * @return the list\n\t */\n\tList<MenuVo> findMenuVoListByUserId(Long userId);\n\n\t/**\n\t * Find menu code list by user id list.\n\t *\n\t * @param userId the user id\n\t *\n\t * @return the list\n\t */\n\tList<String> findMenuCodeListByUserId(Long userId);\n\n\t/**\n\t * Select menu list list.\n\t *\n\t * @param uacMenu the uac menu\n\t *\n\t * @return the list\n\t */\n\tList<UacMenu> selectMenuList(UacMenu uacMenu);\n\n\t/**\n\t * Select menu child count by pid int.\n\t *\n\t * @param pid the pid\n\t *\n\t * @return the int\n\t */\n\tint selectMenuChildCountByPid(Long pid);\n\n\t/**\n\t * Select by url uac menu.\n\t *\n\t * @param url the url\n\t *\n\t * @return the uac menu\n\t */\n\tUacMenu selectByUrl(String url);\n\n\t/**\n\t * Update menu int.\n\t *\n\t * @param uacMenu the uac menu\n\t *\n\t * @return the int\n\t */\n\tint updateMenu(UacMenu uacMenu);\n\n\t/**\n\t * 根据角色ID查询菜单列表.\n\t *\n\t * @param roleId the role id\n\t *\n\t * @return the list\n\t */\n\tList<UacMenu> listMenuListByRoleId(@Param(\"roleId\") Long roleId);\n\n\t/**\n\t * List menu list.\n\t *\n\t * @param menuIdList the menu id list\n\t *\n\t * @return the list\n\t */\n\tList<UacMenu> listMenu(@Param(\"menuIdList\") Set<Long> menuIdList);\n}"
  },
  {
    "path": "paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/mapper/UacRoleActionMapper.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：UacRoleActionMapper.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.mapper;\n\nimport com.paascloud.core.mybatis.MyMapper;\nimport com.paascloud.provider.model.domain.UacRoleAction;\nimport org.apache.ibatis.annotations.Mapper;\nimport org.apache.ibatis.annotations.Param;\nimport org.springframework.stereotype.Component;\n\nimport java.util.List;\n\n/**\n * The interface Uac role action mapper.\n *\n * @author paascloud.net @gmail.com\n */\n@Mapper\n@Component\npublic interface UacRoleActionMapper extends MyMapper<UacRoleAction> {\n\t/**\n\t * Delete by action id int.\n\t *\n\t * @param actionId the action id\n\t *\n\t * @return the int\n\t */\n\tint deleteByActionId(@Param(\"actionId\") Long actionId);\n\n\t/**\n\t * Delete by role id list int.\n\t *\n\t * @param roleIdList the role id list\n\t *\n\t * @return the int\n\t */\n\tint deleteByRoleIdList(@Param(\"roleIdList\") List<Long> roleIdList);\n}"
  },
  {
    "path": "paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/mapper/UacRoleMapper.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：UacRoleMapper.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.mapper;\n\nimport com.paascloud.core.mybatis.MyMapper;\nimport com.paascloud.provider.model.domain.UacRole;\nimport com.paascloud.provider.model.dto.role.BindUserDto;\nimport com.paascloud.provider.model.vo.RoleVo;\nimport org.apache.ibatis.annotations.Mapper;\nimport org.apache.ibatis.annotations.Param;\nimport org.springframework.stereotype.Component;\n\nimport java.util.List;\n\n/**\n * The interface Uac role mapper.\n *\n * @author paascloud.net@gmail.com\n */\n@Mapper\n@Component\npublic interface UacRoleMapper extends MyMapper<UacRole> {\n\t/**\n\t * Find by role code uac role.\n\t *\n\t * @param roleCode the role code\n\t *\n\t * @return the uac role\n\t */\n\tUacRole findByRoleCode(String roleCode);\n\n\t/**\n\t * Query role list with page list.\n\t *\n\t * @param role the role\n\t *\n\t * @return the list\n\t */\n\tList<RoleVo> queryRoleListWithPage(UacRole role);\n\n\t/**\n\t * Select all role info by user id list.\n\t *\n\t * @param userId the user id\n\t *\n\t * @return the list\n\t */\n\tList<UacRole> selectAllRoleInfoByUserId(Long userId);\n\n\t/**\n\t * Select role list list.\n\t *\n\t * @param uacRole the uac role\n\t *\n\t * @return the list\n\t */\n\tList<UacRole> selectRoleList(UacRole uacRole);\n\n\t/**\n\t * Batch delete by id list int.\n\t *\n\t * @param idList the id list\n\t *\n\t * @return the int\n\t */\n\tint batchDeleteByIdList(@Param(\"idList\") List<Long> idList);\n\n\t/**\n\t * Select all need bind user list.\n\t *\n\t * @param superManagerRoleId the super manager role id\n\t * @param currentUserId      the current user id\n\t *\n\t * @return the list\n\t */\n\tList<BindUserDto> selectAllNeedBindUser(@Param(\"superManagerRoleId\") Long superManagerRoleId, @Param(\"currentUserId\") Long currentUserId);\n}"
  },
  {
    "path": "paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/mapper/UacRoleMenuMapper.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：UacRoleMenuMapper.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.mapper;\n\nimport com.paascloud.core.mybatis.MyMapper;\nimport com.paascloud.provider.model.domain.UacRoleMenu;\nimport com.paascloud.provider.model.vo.role.MenuCountVo;\nimport org.apache.ibatis.annotations.Mapper;\nimport org.apache.ibatis.annotations.Param;\nimport org.springframework.stereotype.Component;\n\nimport java.util.List;\n\n/**\n * The interface Uac role menu mapper.\n *\n * @author paascloud.net @gmail.com\n */\n@Mapper\n@Component\npublic interface UacRoleMenuMapper extends MyMapper<UacRoleMenu> {\n\t/**\n\t * Count child menu num list.\n\t *\n\t * @param roleId the role id\n\t *\n\t * @return the list\n\t */\n\tList<MenuCountVo> countChildMenuNum(Long roleId);\n\n\t/**\n\t * Add role menu list int.\n\t *\n\t * @param addUacRoleMenuList the add uac role menu list\n\t *\n\t * @return the int\n\t */\n\tint addRoleMenuList(List<UacRoleMenu> addUacRoleMenuList);\n\n\n\t/**\n\t * Delete by role id list int.\n\t *\n\t * @param roleIdList the role id list\n\t *\n\t * @return the int\n\t */\n\tint deleteByRoleIdList(@Param(\"roleIdList\") List<Long> roleIdList);\n}"
  },
  {
    "path": "paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/mapper/UacRoleUserMapper.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：UacRoleUserMapper.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.mapper;\n\nimport com.paascloud.core.mybatis.MyMapper;\nimport com.paascloud.provider.model.domain.UacRoleUser;\nimport org.apache.ibatis.annotations.Mapper;\nimport org.apache.ibatis.annotations.Param;\nimport org.springframework.stereotype.Component;\n\nimport java.util.List;\n\n/**\n * The interface Uac role user mapper.\n *\n * @author paascloud.net@gmail.com\n */\n@Mapper\n@Component\npublic interface UacRoleUserMapper extends MyMapper<UacRoleUser> {\n\n\t/**\n\t * Delete exclude super mng int.\n\t *\n\t * @param currentRoleId the current role id\n\t * @param superRoleId   the super role id\n\t *\n\t * @return the int\n\t */\n\tint deleteExcludeSuperMng(@Param(\"currentRoleId\") Long currentRoleId, @Param(\"superRoleId\") Long superRoleId);\n\n\t/**\n\t * Gets by user id and role id.\n\t *\n\t * @param userId the user id\n\t * @param roleId the role id\n\t *\n\t * @return the by user id and role id\n\t */\n\tUacRoleUser getByUserIdAndRoleId(@Param(\"userId\") Long userId, @Param(\"roleId\") Long roleId);\n\n\t/**\n\t * List by user id list.\n\t *\n\t * @param userId the user id\n\t *\n\t * @return the list\n\t */\n\tList<UacRoleUser> listByUserId(@Param(\"userId\") Long userId);\n\n\t/**\n\t * List by role id list.\n\t *\n\t * @param roleId the role id\n\t *\n\t * @return the list\n\t */\n\tList<UacRoleUser> listByRoleId(@Param(\"roleId\") Long roleId);\n\n\t/**\n\t * List super user list.\n\t *\n\t * @param roleId the role id\n\t *\n\t * @return the list\n\t */\n\tList<Long> listSuperUser(@Param(\"roleId\") Long roleId);\n\n\t/**\n\t * List by role id list list.\n\t *\n\t * @param idList the id list\n\t *\n\t * @return the list\n\t */\n\tList<UacRoleUser> listByRoleIdList(@Param(\"roleIds\") List<Long> idList);\n\n\t/**\n\t * Delete by role id int.\n\t *\n\t * @param roleId the role id\n\t *\n\t * @return the int\n\t */\n\tint deleteByRoleId(@Param(\"roleId\") Long roleId);\n\n\t/**\n\t * Delete by role id list int.\n\t *\n\t * @param roleIdList the role id list\n\t *\n\t * @return the int\n\t */\n\tint deleteByRoleIdList(@Param(\"roleIdList\") List<Long> roleIdList);\n}"
  },
  {
    "path": "paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/mapper/UacUserMapper.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：UacUserMapper.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.mapper;\n\nimport com.paascloud.core.mybatis.MyMapper;\nimport com.paascloud.provider.model.domain.UacUser;\nimport com.paascloud.provider.model.dto.user.BindRoleDto;\nimport org.apache.ibatis.annotations.Mapper;\nimport org.apache.ibatis.annotations.Param;\nimport org.springframework.stereotype.Component;\n\nimport java.util.List;\nimport java.util.Map;\n\n/**\n * The interface Uac user mapper.\n *\n * @author paascloud.net @gmail.com\n */\n@Mapper\n@Component\npublic interface UacUserMapper extends MyMapper<UacUser> {\n\n\t/**\n\t * Find by login name uac user.\n\t *\n\t * @param loginName the login name\n\t *\n\t * @return the uac user\n\t */\n\tUacUser findByLoginName(String loginName);\n\n\t/**\n\t * Find by mobile no uac user.\n\t *\n\t * @param mobileNo the mobile no\n\t *\n\t * @return the uac user\n\t */\n\tUacUser findByMobileNo(@Param(\"mobileNo\") String mobileNo);\n\n\t/**\n\t * Find by login name and login pwd uac user.\n\t *\n\t * @param loginNamePwdMap the login name pwd map\n\t *\n\t * @return the uac user\n\t */\n\tUacUser findByLoginNameAndLoginPwd(Map<String, String> loginNamePwdMap);\n\n\t/**\n\t * Select user list list.\n\t *\n\t * @param uacUser the uac user\n\t *\n\t * @return the list\n\t */\n\tList<UacUser> selectUserList(UacUser uacUser);\n\n\t/**\n\t * Select user info by user id uac user.\n\t *\n\t * @param userId the user id\n\t *\n\t * @return the uac user\n\t */\n\tUacUser selectUserInfoByUserId(Long userId);\n\n\t/**\n\t * Update uac user int.\n\t *\n\t * @param user the user\n\t *\n\t * @return the int\n\t */\n\tint updateUacUser(UacUser user);\n\n\t/**\n\t * Select all need bind role list.\n\t *\n\t * @param superManagerRoleId the super manager role id\n\t *\n\t * @return the list\n\t */\n\tList<BindRoleDto> selectAllNeedBindRole(@Param(\"superManagerRoleId\") Long superManagerRoleId);\n\n\t/**\n\t * Find user info by login name uac user.\n\t *\n\t * @param loginName the login name\n\t *\n\t * @return the uac user\n\t */\n\tUacUser findUserInfoByLoginName(@Param(\"loginName\") String loginName);\n}"
  },
  {
    "path": "paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/mapper/UacUserMenuMapper.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：UacUserMenuMapper.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.mapper;\n\nimport com.paascloud.core.mybatis.MyMapper;\nimport com.paascloud.provider.model.domain.UacUserMenu;\nimport org.apache.ibatis.annotations.Mapper;\nimport org.springframework.stereotype.Component;\n\n/**\n * The interface Uac user menu mapper.\n *\n * @author paascloud.net@gmail.com\n */\n@Mapper\n@Component\npublic interface UacUserMenuMapper extends MyMapper<UacUserMenu> {\n}"
  },
  {
    "path": "paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/mapper/UacUserTokenMapper.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：UacUserTokenMapper.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.mapper;\n\nimport com.paascloud.core.mybatis.MyMapper;\nimport com.paascloud.provider.model.domain.UacUserToken;\nimport org.apache.ibatis.annotations.Mapper;\nimport org.springframework.stereotype.Component;\n\nimport java.util.List;\nimport java.util.Map;\n\n/**\n * The interface Uac user token mapper.\n *\n * @author paascloud.net @gmail.com\n */\n@Mapper\n@Component\npublic interface UacUserTokenMapper extends MyMapper<UacUserToken> {\n\t/**\n\t * Select token list list.\n\t *\n\t * @param userToken the user token\n\t *\n\t * @return the list\n\t */\n\tList<UacUserToken> selectTokenList(UacUserToken userToken);\n\n\t/**\n\t * 超时token更新为离线.\n\t *\n\t * @param map the map\n\t *\n\t * @return the int\n\t */\n\tint batchUpdateTokenOffLine(Map<String, Object> map);\n\n\t/**\n\t * 查询超时token Id 集合.\n\t *\n\t * @return the list\n\t */\n\tList<Long> listOffLineTokenId();\n}"
  },
  {
    "path": "paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/model/constant/MenuConstant.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：MenuConstant.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.model.constant;\n\n/**\n * The class Menu constant.\n *\n * @author paascloud.net@gmail.com\n */\npublic class MenuConstant {\n\t/**\n\t * 菜单根目录\n\t */\n\tpublic static final Integer MENU_LEVEL_ROOT = 0;\n\t/**\n\t * 一级菜单\n\t */\n\tpublic static final Integer MENU_LEVEL_FIRST = 1;\n\t/**\n\t * 二级菜单\n\t */\n\tpublic static final Integer MENU_LEVEL_TWO = 2;\n\t/**\n\t * 二级菜单\n\t */\n\tpublic static final Integer MENU_LEVEL_THREE = 3;\n\n\t/**\n\t * 菜单是叶子节点\n\t */\n\tpublic static final Integer MENU_LEAF_YES = 0;\n\t/**\n\t * 菜单不叶子节点\n\t */\n\tpublic static final Integer MENU_LEAF_NO = 1;\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/model/domain/UacAction.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：UacAction.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.model.domain;\n\nimport com.paascloud.core.mybatis.BaseEntity;\nimport lombok.Data;\nimport lombok.EqualsAndHashCode;\nimport org.apache.ibatis.type.Alias;\n\nimport javax.persistence.Column;\nimport javax.persistence.Table;\nimport javax.persistence.Transient;\nimport java.io.Serializable;\nimport java.util.List;\n\n/**\n * The class Uac action.\n *\n * @author paascloud.net@gmail.com\n */\n@EqualsAndHashCode(callSuper = true)\n@Data\n@Table(name = \"pc_uac_action\")\n@Alias(value = \"uacAction\")\npublic class UacAction extends BaseEntity implements Serializable {\n\tprivate static final long serialVersionUID = 6943147531573339665L;\n\n\t/**\n\t * 资源路径\n\t */\n\tprivate String url;\n\n\t/**\n\t * 权限名称\n\t */\n\t@Column(name = \"action_name\")\n\tprivate String actionName;\n\n\t/**\n\t * 权限编码\n\t */\n\t@Column(name = \"action_code\")\n\tprivate String actionCode;\n\n\t/**\n\t * 状态\n\t */\n\tprivate String status;\n\n\t/**\n\t * 备注\n\t */\n\tprivate String remark;\n\n\t/**\n\t * 菜单ID\n\t */\n\t@Column(name = \"menu_id\")\n\tprivate Long menuId;\n\n\t/**\n\t * 菜单ID\n\t */\n\t@Transient\n\tprivate List<Long> menuIdList;\n}"
  },
  {
    "path": "paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/model/domain/UacGroup.java",
    "content": "package com.paascloud.provider.model.domain;\n\nimport com.paascloud.core.mybatis.BaseEntity;\nimport lombok.Data;\nimport lombok.EqualsAndHashCode;\nimport org.apache.ibatis.type.Alias;\n\nimport javax.persistence.Column;\nimport javax.persistence.Table;\nimport javax.persistence.Transient;\nimport java.util.List;\n\n/**\n * The class Uac group.\n *\n * @author paascloud.net@gmail.com\n */\n@EqualsAndHashCode(callSuper = true)\n@Data\n@Table(name = \"pc_uac_group\")\n@Alias(value = \"uacGroup\")\npublic class UacGroup extends BaseEntity {\n\tprivate static final long serialVersionUID = 1752542793067966068L;\n\n\t/**\n\t * 组织编码\n\t */\n\t@Column(name = \"group_code\")\n\tprivate String groupCode;\n\n\t/**\n\t * 组织名称\n\t */\n\t@Column(name = \"group_name\")\n\tprivate String groupName;\n\n\t/**\n\t * 状态\n\t */\n\tprivate Integer status;\n\n\t/**\n\t * 组织类型 1：仓库 2：基地\n\t */\n\tprivate String type;\n\n\t/**\n\t * 父ID\n\t */\n\tprivate Long pid;\n\n\t/**\n\t * 层级\n\t */\n\tprivate Integer level;\n\n\t/**\n\t * 是否叶子节点,1不是0是\n\t */\n\tprivate Integer leaf;\n\n\t/**\n\t * 联系人\n\t */\n\tprivate String contact;\n\n\t/**\n\t * 组织地址\n\t */\n\t@Column(name = \"group_address\")\n\tprivate String groupAddress;\n\n\t/**\n\t * 省名称\n\t */\n\t@Column(name = \"province_name\")\n\tprivate String provinceName;\n\n\t/**\n\t * 省编码\n\t */\n\t@Column(name = \"province_id\")\n\tprivate Long provinceId;\n\n\t/**\n\t * 城市名称\n\t */\n\t@Column(name = \"city_name\")\n\tprivate String cityName;\n\n\t/**\n\t * 城市编码\n\t */\n\t@Column(name = \"city_id\")\n\tprivate Long cityId;\n\n\t/**\n\t * 区名称\n\t */\n\t@Column(name = \"area_name\")\n\tprivate String areaName;\n\n\t/**\n\t * 区编码\n\t */\n\t@Column(name = \"area_id\")\n\tprivate Long areaId;\n\n\t/**\n\t * 街道编码\n\t */\n\t@Column(name = \"street_id\")\n\tprivate Long streetId;\n\n\t/**\n\t * 街道名称\n\t */\n\t@Column(name = \"street_name\")\n\tprivate String streetName;\n\n\t/**\n\t * 详细地址\n\t */\n\t@Column(name = \"detail_address\")\n\tprivate String detailAddress;\n\n\t/**\n\t * 联系人手机号\n\t */\n\t@Column(name = \"contact_phone\")\n\tprivate String contactPhone;\n\n\t/**\n\t * 描述\n\t */\n\tprivate String remark;\n\n\t/**\n\t * 预留排序字段\n\t */\n\tprivate Integer number;\n\n\t/**\n\t * 上级组织编码\n\t */\n\t@Transient\n\tprivate String parentGroupCode;\n\n\t/**\n\t * 上级组织名称\n\t */\n\t@Transient\n\tprivate String parentGroupName;\n\n\t/**\n\t * 四级地址数组\n\t */\n\t@Transient\n\tprivate List<Long> addressList;\n\n}"
  },
  {
    "path": "paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/model/domain/UacGroupUser.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：UacGroupUser.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.model.domain;\n\nimport lombok.Data;\nimport org.apache.ibatis.type.Alias;\n\nimport javax.persistence.Column;\nimport javax.persistence.Table;\nimport java.io.Serializable;\n\n/**\n * The class Uac group user.\n *\n * @author paascloud.net@gmail.com\n */\n@Data\n@Table(name = \"pc_uac_group_user\")\n@Alias(value = \"uacGroupUser\")\npublic class UacGroupUser implements Serializable {\n\tprivate static final long serialVersionUID = 5167709959453148144L;\n\n\t/**\n\t * 角色ID\n\t */\n\t@Column(name = \"group_id\")\n\tprivate Long groupId;\n\n\t/**\n\t * 菜单ID\n\t */\n\t@Column(name = \"user_id\")\n\tprivate Long userId;\n}"
  },
  {
    "path": "paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/model/domain/UacLog.java",
    "content": "package com.paascloud.provider.model.domain;\n\nimport com.fasterxml.jackson.annotation.JsonFormat;\nimport com.paascloud.core.mybatis.BaseEntity;\nimport io.swagger.annotations.ApiModel;\nimport lombok.Data;\nimport lombok.EqualsAndHashCode;\nimport org.apache.ibatis.type.Alias;\nimport org.springframework.format.annotation.DateTimeFormat;\n\nimport javax.persistence.Column;\nimport javax.persistence.Table;\nimport java.util.Date;\n\n/**\n * The class Uac log.\n *\n * @author paascloud.net@gmail.com\n */\n@EqualsAndHashCode(callSuper = true)\n@Data\n@Table(name = \"pc_uac_log\")\n@ApiModel(\"操作日志\")\n@Alias(value = \"uacLog\")\npublic class UacLog extends BaseEntity {\n\n\tprivate static final long serialVersionUID = -3326236838689347547L;\n\t/**\n\t * 组织流水号\n\t */\n\t@Column(name = \"group_id\")\n\tprivate Long groupId;\n\n\t/**\n\t * 组织名称\n\t */\n\t@Column(name = \"group_name\")\n\tprivate String groupName;\n\n\t/**\n\t * 日志类型\n\t */\n\t@Column(name = \"log_type\")\n\tprivate String logType;\n\n\t/**\n\t * 日志类型名称\n\t */\n\t@Column(name = \"log_name\")\n\tprivate String logName;\n\n\t/**\n\t * 权限ID\n\t */\n\t@Column(name = \"action_id\")\n\tprivate Long actionId;\n\n\t/**\n\t * 权限编码\n\t */\n\t@Column(name = \"action_code\")\n\tprivate String actionCode;\n\n\t/**\n\t * 权限名称\n\t */\n\t@Column(name = \"action_name\")\n\tprivate String actionName;\n\n\t/**\n\t * 操作系统\n\t */\n\tprivate String os;\n\n\t/**\n\t * 浏览器类型\n\t */\n\tprivate String browser;\n\n\t/**\n\t * IP地址\n\t */\n\tprivate String ip;\n\n\t/**\n\t * 物理地址\n\t */\n\tprivate String mac;\n\n\t/**\n\t * 详细描述\n\t */\n\tprivate String description;\n\n\t/**\n\t * 请求参数\n\t */\n\t@Column(name = \"request_data\")\n\tprivate String requestData;\n\n\t/**\n\t * 请求地址\n\t */\n\t@Column(name = \"request_url\")\n\tprivate String requestUrl;\n\n\t/**\n\t * 响应结果\n\t */\n\t@Column(name = \"response_data\")\n\tprivate String responseData;\n\n\t/**\n\t * 类名\n\t */\n\t@Column(name = \"class_name\")\n\tprivate String className;\n\n\t/**\n\t * 方法名\n\t */\n\t@Column(name = \"method_name\")\n\tprivate String methodName;\n\n\t/**\n\t * 开始时间\n\t */\n\t@Column(name = \"start_time\")\n\t@DateTimeFormat(pattern = \"yyyy-MM-dd HH:mm:ss\")\n\t@JsonFormat(pattern = \"yyyy-MM-dd HH:mm:ss\", timezone = \"GMT+8\")\n\tprivate Date startTime;\n\n\t/**\n\t * 结束时间\n\t */\n\t@Column(name = \"end_time\")\n\t@DateTimeFormat(pattern = \"yyyy-MM-dd HH:mm:ss\")\n\t@JsonFormat(pattern = \"yyyy-MM-dd HH:mm:ss\", timezone = \"GMT+8\")\n\tprivate Date endTime;\n\n\t/**\n\t * 耗时,秒\n\t */\n\t@Column(name = \"excute_time\")\n\tprivate Long excuteTime;\n\t/**\n\t * 登录位置\n\t */\n\t@Column(name = \"location\")\n\tprivate String location;\n}"
  },
  {
    "path": "paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/model/domain/UacMenu.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：UacMenu.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.model.domain;\n\nimport com.paascloud.core.mybatis.BaseEntity;\nimport lombok.Data;\nimport lombok.EqualsAndHashCode;\nimport org.apache.ibatis.type.Alias;\n\nimport javax.persistence.Column;\nimport javax.persistence.Table;\n\n/**\n * The class Uac menu.\n *\n * @author paascloud.net@gmail.com\n */\n@EqualsAndHashCode(callSuper = true)\n@Data\n@Table(name = \"pc_uac_menu\")\n@Alias(value = \"uacMenu\")\npublic class UacMenu extends BaseEntity {\n\tprivate static final long serialVersionUID = 454644589405700059L;\n\n\t/**\n\t * 菜单编码\n\t */\n\t@Column(name = \"menu_code\")\n\tprivate String menuCode;\n\n\t/**\n\t * 菜单名称\n\t */\n\t@Column(name = \"menu_name\")\n\tprivate String menuName;\n\n\t/**\n\t * 状态\n\t */\n\tprivate String status;\n\n\t/**\n\t * 菜单URL\n\t */\n\tprivate String url;\n\n\t/**\n\t * 图标\n\t */\n\tprivate String icon;\n\n\t/**\n\t * 父ID\n\t */\n\tprivate Long pid;\n\n\t/**\n\t * 层级(最多三级1,2,3)\n\t */\n\tprivate Integer level;\n\n\t/**\n\t * 是否叶子节点,1不是0是\n\t */\n\tprivate Integer leaf;\n\n\t/**\n\t * 序号\n\t */\n\tprivate Integer number;\n\n\t/**\n\t * 备注\n\t */\n\tprivate String remark;\n\t/**\n\t * 系统ID\n\t */\n\t@Column(name = \"application_id\")\n\tprivate Long applicationId;\n}"
  },
  {
    "path": "paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/model/domain/UacRole.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：UacRole.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.model.domain;\n\nimport com.paascloud.core.mybatis.BaseEntity;\nimport lombok.Data;\nimport lombok.EqualsAndHashCode;\nimport org.apache.ibatis.type.Alias;\nimport org.hibernate.validator.constraints.Length;\n\nimport javax.persistence.Column;\nimport javax.persistence.Table;\nimport javax.validation.constraints.Pattern;\nimport java.io.Serializable;\n\n/**\n * The class Uac role.\n *\n * @author paascloud.net@gmail.com\n */\n@EqualsAndHashCode(callSuper = true)\n@Data\n@Table(name = \"pc_uac_role\")\n@Alias(value = \"uacRole\")\npublic class UacRole extends BaseEntity implements Serializable {\n\tprivate static final long serialVersionUID = -6049575043793281879L;\n\n\t/**\n\t * 角色编码\n\t */\n\t@Column(name = \"role_code\")\n\t@Pattern(regexp = \"^[A-Za-z0-9]+$\", message = \"{role.roleCode.pattern}\")\n\t@Length(min = 6, max = 20, message = \"{role.roleCode.length}\")\n\tprivate String roleCode;\n\n\t/**\n\t * 角色名称\n\t */\n\t@Column(name = \"role_name\")\n\t@Pattern(regexp = \"^[\\\\u4e00-\\\\u9faf]+$\", message = \"{role.roleName.pattern}\")\n\t@Length(min = 4, max = 10, message = \"{role.roleName.length}\")\n\tprivate String roleName;\n\n\t/**\n\t * 状态\n\t */\n\tprivate String status;\n\n\t/**\n\t * 备注\n\t */\n\t@Length(max = 150, message = \"{role.remark.length}\")\n\tprivate String remark;\n}"
  },
  {
    "path": "paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/model/domain/UacRoleAction.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：UacRoleAction.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.model.domain;\n\nimport lombok.Data;\nimport org.apache.ibatis.type.Alias;\n\nimport javax.persistence.Column;\nimport javax.persistence.Id;\nimport javax.persistence.Table;\nimport java.io.Serializable;\n\n/**\n * The class Uac role action.\n *\n * @author paascloud.net@gmail.com\n */\n@Data\n@Table(name = \"pc_uac_role_action\")\n@Alias(value = \"uacRoleAction\")\npublic class UacRoleAction implements Serializable {\n\tprivate static final long serialVersionUID = -4240611881810188284L;\n\n\t@Id\n\t@Column(name = \"role_id\")\n\tprivate Long roleId;\n\n\t@Id\n\t@Column(name = \"action_id\")\n\tprivate Long actionId;\n}"
  },
  {
    "path": "paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/model/domain/UacRoleMenu.java",
    "content": "package com.paascloud.provider.model.domain;\n\nimport lombok.Data;\nimport org.apache.ibatis.type.Alias;\n\nimport javax.persistence.Column;\nimport javax.persistence.Id;\nimport javax.persistence.Table;\nimport java.io.Serializable;\n\n/**\n * The class Uac role menu.\n *\n * @author paascloud.net@gmail.com\n */\n@Data\n@Table(name = \"pc_uac_role_menu\")\n@Alias(value = \"uacRoleMenu\")\npublic class UacRoleMenu implements Serializable {\n\tprivate static final long serialVersionUID = -9052683954152822756L;\n\t@Id\n\t@Column(name = \"role_id\")\n\tprivate Long roleId;\n\n\t@Id\n\t@Column(name = \"menu_id\")\n\tprivate Long menuId;\n}"
  },
  {
    "path": "paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/model/domain/UacRoleUser.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：UacRoleUser.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.model.domain;\n\nimport lombok.Data;\nimport org.apache.ibatis.type.Alias;\n\nimport javax.persistence.Column;\nimport javax.persistence.Id;\nimport javax.persistence.Table;\nimport java.io.Serializable;\n\n/**\n * The class Uac role user.\n *\n * @author paascloud.net@gmail.com\n */\n@Data\n@Table(name = \"pc_uac_role_user\")\n@Alias(value = \"uacRoleUser\")\npublic class UacRoleUser implements Serializable {\n\tprivate static final long serialVersionUID = -4598936929315554832L;\n\t@Id\n\t@Column(name = \"role_id\")\n\tprivate Long roleId;\n\n\t@Id\n\t@Column(name = \"user_id\")\n\tprivate Long userId;\n}"
  },
  {
    "path": "paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/model/domain/UacUser.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：UacUser.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.model.domain;\n\nimport com.fasterxml.jackson.annotation.JsonFormat;\nimport com.paascloud.core.mybatis.BaseEntity;\nimport io.swagger.annotations.ApiModelProperty;\nimport lombok.Data;\nimport lombok.EqualsAndHashCode;\nimport org.apache.ibatis.type.Alias;\nimport org.springframework.format.annotation.DateTimeFormat;\n\nimport javax.persistence.Column;\nimport javax.persistence.Table;\nimport javax.persistence.Transient;\nimport java.util.Date;\n\n/**\n * The class Uac user.\n *\n * @author paascloud.net@gmail.com\n */\n@EqualsAndHashCode(callSuper = true)\n@Data\n@Table(name = \"pc_uac_user\")\n@Alias(value = \"uacUser\")\npublic class UacUser extends BaseEntity {\n\tprivate static final long serialVersionUID = 5465775492730080699L;\n\n\t/**\n\t * 登录名\n\t */\n\t@Column(name = \"login_name\")\n\tprivate String loginName;\n\n\t/**\n\t * 登录密码\n\t */\n\t@Column(name = \"login_pwd\")\n\tprivate String loginPwd;\n\n\t/**\n\t * 盐,用于shiro加密, 字段停用\n\t */\n\tprivate String salt;\n\n\t/**\n\t * 工号\n\t */\n\t@Column(name = \"user_code\")\n\tprivate String userCode;\n\n\t/**\n\t * 姓名\n\t */\n\t@Column(name = \"user_name\")\n\tprivate String userName;\n\n\t/**\n\t * 手机号\n\t */\n\t@Column(name = \"mobile_no\")\n\tprivate String mobileNo;\n\n\t/**\n\t * 状态\n\t */\n\tprivate String status;\n\n\tprivate String email;\n\n\t/**\n\t * 用户来源\n\t */\n\t@Column(name = \"user_source\")\n\tprivate String userSource;\n\n\t/**\n\t * 操作员类型（2000伙伴, 3000客户, 1000运营）\n\t */\n\tprivate String type;\n\n\t/**\n\t * 最后登录IP地址\n\t */\n\t@Column(name = \"last_login_ip\")\n\tprivate String lastLoginIp;\n\n\t/**\n\t * 最后登录位置\n\t */\n\t@Column(name = \"last_login_location\")\n\tprivate String lastLoginLocation;\n\n\t/**\n\t * 描述\n\t */\n\tprivate String remark;\n\n\t/**\n\t * 最后登录时间\n\t */\n\t@Column(name = \"last_login_time\")\n\t@DateTimeFormat(pattern = \"yyyy-MM-dd HH:mm:ss\")\n\t@JsonFormat(pattern = \"yyyy-MM-dd HH:mm:ss\", timezone = \"GMT+8\")\n\tprivate Date lastLoginTime;\n\n\t/**\n\t * 是否更改过密码\n\t */\n\t@Column(name = \"is_changed_pwd\")\n\tprivate Short isChangedPwd;\n\n\t/**\n\t * 连续输错密码次数（连续5次输错就冻结帐号）\n\t */\n\t@Column(name = \"pwd_error_count\")\n\tprivate Short pwdErrorCount;\n\n\t/**\n\t * 最后输错密码时间\n\t */\n\t@Column(name = \"pwd_error_time\")\n\t@DateTimeFormat(pattern = \"yyyy-MM-dd HH:mm:ss\")\n\t@JsonFormat(pattern = \"yyyy-MM-dd HH:mm:ss\", timezone = \"GMT+8\")\n\tprivate Date pwdErrorTime;\n\n\t/**\n\t * 用户所属的组织ID\n\t */\n\t@ApiModelProperty(value = \"用户所属的组织ID\")\n\t@Transient\n\tprivate Long groupId;\n\n\t@ApiModelProperty(value = \"用户所属的组织名称\")\n\t@Transient\n\tprivate String groupName;\n}"
  },
  {
    "path": "paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/model/domain/UacUserMenu.java",
    "content": "package com.paascloud.provider.model.domain;\n\nimport com.paascloud.core.mybatis.BaseEntity;\nimport lombok.Data;\nimport lombok.EqualsAndHashCode;\n\n/**\n * The class Uac user menu.\n *\n * @author paascloud.net@gmail.com\n */\n@EqualsAndHashCode(callSuper = true)\n@Data\npublic class UacUserMenu extends BaseEntity {\n\tprivate static final long serialVersionUID = 71826276587527887L;\n\t/**\n\t * pc_uac_user_menu.user_id;用户id\n\t */\n\tprivate Long userId;\n\n\t/**\n\t * pc_uac_user_menu.menu_id;菜单id\n\t */\n\tprivate Long menuId;\n\n\t/**\n\t * pc_uac_user_menu.number;序号\n\t */\n\tprivate Integer number;\n}"
  },
  {
    "path": "paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/model/domain/UacUserToken.java",
    "content": "package com.paascloud.provider.model.domain;\n\nimport com.paascloud.core.mybatis.BaseEntity;\nimport lombok.Data;\nimport lombok.EqualsAndHashCode;\nimport org.apache.ibatis.type.Alias;\n\nimport javax.persistence.Column;\nimport javax.persistence.Table;\nimport javax.persistence.Transient;\nimport java.util.Date;\n\n/**\n * The class Uac user token.\n *\n * @author paascloud.net @gmail.com\n */\n@EqualsAndHashCode(callSuper = true)\n@Data\n@Alias(value = \"uacUserToken\")\n@Table(name = \"pc_uac_user_token\")\npublic class UacUserToken extends BaseEntity {\n\tprivate static final long serialVersionUID = 4341237600124353997L;\n\t/**\n\t * 父ID\n\t */\n\tprivate Long pid;\n\n\t/**\n\t * 登录名\n\t */\n\t@Column(name = \"login_name\")\n\tprivate String loginName;\n\n\t/**\n\t * 姓名\n\t */\n\t@Column(name = \"user_name\")\n\tprivate String userName;\n\n\t/**\n\t * 用户ID\n\t */\n\t@Column(name = \"user_id\")\n\tprivate Long userId;\n\n\t/**\n\t * 登陆人Ip地址\n\t */\n\t@Column(name = \"login_ip\")\n\tprivate String loginIp;\n\n\t/**\n\t * 登录地址\n\t */\n\t@Column(name = \"login_location\")\n\tprivate String loginLocation;\n\n\t/**\n\t * 登录地址\n\t */\n\t@Column(name = \"login_time\")\n\tprivate Date loginTime;\n\n\t/**\n\t * 操作系统\n\t */\n\tprivate String os;\n\n\t/**\n\t * 浏览器类型\n\t */\n\tprivate String browser;\n\n\t/**\n\t * 访问token\n\t */\n\t@Column(name = \"access_token\")\n\tprivate String accessToken;\n\n\t/**\n\t * 刷新token\n\t */\n\t@Column(name = \"refresh_token\")\n\tprivate String refreshToken;\n\n\t/**\n\t * 访问token的生效时间(秒)\n\t */\n\t@Column(name = \"access_token_validity\")\n\tprivate Integer accessTokenValidity;\n\n\t/**\n\t * 刷新token的生效时间(秒)\n\t */\n\t@Column(name = \"refresh_token_validity\")\n\tprivate Integer refreshTokenValidity;\n\n\t/**\n\t * 0 在线 10已刷新 20 离线\n\t */\n\tprivate Integer status;\n\n\t/**\n\t * 组织流水号\n\t */\n\t@Column(name = \"group_id\")\n\tprivate Long groupId;\n\n\t/**\n\t * 组织名称\n\t */\n\t@Column(name = \"group_name\")\n\tprivate String groupName;\n\n\t/**\n\t * 失效时间(秒)\n\t */\n\t@Transient\n\tprivate Integer expiresIn;\n}"
  },
  {
    "path": "paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/model/dto/action/ActionMainQueryDto.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：ActionMainQueryDto.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.model.dto.action;\n\nimport com.paascloud.base.dto.BaseQuery;\nimport io.swagger.annotations.ApiModel;\nimport lombok.Data;\nimport lombok.EqualsAndHashCode;\n\nimport java.util.List;\n\n/**\n * The class Action main query dto.\n *\n * @author paascloud.net @gmail.com\n */\n@EqualsAndHashCode(callSuper = true)\n@Data\n@ApiModel\npublic class ActionMainQueryDto extends BaseQuery {\n\tprivate static final long serialVersionUID = -1755881173841393763L;\n\t/**\n\t * 资源路径\n\t */\n\tprivate String url;\n\n\t/**\n\t * 权限名称\n\t */\n\tprivate String actionName;\n\n\t/**\n\t * 权限编码\n\t */\n\tprivate String actionCode;\n\n\t/**\n\t * 状态\n\t */\n\tprivate String status;\n\n\t/**\n\t * 菜单ID\n\t */\n\tprivate List<Long> menuIdList;\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/model/dto/action/UacActionCheckCodeDto.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：UacActionCheckCodeDto.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.model.dto.action;\n\nimport io.swagger.annotations.ApiModel;\nimport io.swagger.annotations.ApiModelProperty;\nimport lombok.Data;\nimport org.hibernate.validator.constraints.NotBlank;\n\nimport java.io.Serializable;\n\n\n/**\n * The class Uac menu check code dto.\n *\n * @author paascloud.net@gmail.com\n */\n@Data\n@ApiModel(value = \"UacActionCheckCodeDto\")\npublic class UacActionCheckCodeDto implements Serializable {\n\tprivate static final long serialVersionUID = 8687848883145768024L;\n\t/**\n\t * 权限的id\n\t */\n\t@ApiModelProperty(value = \"权限的id\")\n\tprivate Long actionId;\n\t/**\n\t * 权限的url\n\t */\n\t@ApiModelProperty(value = \"权限编码\")\n\t@NotBlank(message = \"权限编码不能为空\")\n\tprivate String actionCode;\n\n\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/model/dto/action/UacActionCheckUrlDto.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：UacActionCheckUrlDto.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.model.dto.action;\n\nimport io.swagger.annotations.ApiModel;\nimport io.swagger.annotations.ApiModelProperty;\nimport lombok.Data;\nimport org.hibernate.validator.constraints.NotBlank;\n\nimport java.io.Serializable;\n\n/**\n * The class Uac menu check url dto.\n *\n * @author paascloud.net@gmail.com\n */\n@Data\n@ApiModel(value = \"UacActionCheckUrlDto\")\npublic class UacActionCheckUrlDto implements Serializable {\n\tprivate static final long serialVersionUID = 839437721293973234L;\n\t/**\n\t * 权限的id\n\t */\n\t@ApiModelProperty(value = \"权限的id\")\n\tprivate Long actionId;\n\t/**\n\t * 权限的url\n\t */\n\t@ApiModelProperty(value = \"权限地址\")\n\t@NotBlank(message = \"权限地址不能为空\")\n\tprivate String url;\n\n\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/model/dto/base/ModifyStatusDto.java",
    "content": "package com.paascloud.provider.model.dto.base;\n\nimport io.swagger.annotations.ApiModel;\nimport io.swagger.annotations.ApiModelProperty;\nimport lombok.Data;\n\nimport java.io.Serializable;\n\n/**\n * The class Modify status dto.\n *\n * @author paascloud.net@gmail.com\n */\n@Data\n@ApiModel(value = \"更改状态\")\npublic class ModifyStatusDto implements Serializable {\n\n\tprivate static final long serialVersionUID = 1494899235149813850L;\n\t/**\n\t * 角色ID\n\t */\n\t@ApiModelProperty(value = \"角色ID\")\n\tprivate Long id;\n\n\t/**\n\t * 状态\n\t */\n\t@ApiModelProperty(value = \"状态\")\n\tprivate String status;\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/model/dto/email/SendEmailMessage.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：SendEmailMessage.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.model.dto.email;\n\nimport lombok.Data;\n\nimport java.io.Serializable;\n\n/**\n * The class Send email message.\n *\n * @author paascloud.net@gmail.com\n */\n@Data\npublic class SendEmailMessage implements Serializable {\n\tprivate static final long serialVersionUID = -8708881656765856624L;\n\n\t/**\n\t * 登录名\n\t */\n\tprivate String loginName;\n\n\t/**\n\t * 手机号码\n\t */\n\tprivate String email;\n\n\t/**\n\t * 验证码\n\t */\n\tprivate String emailCode;\n\n\t/**\n\t * 邮件模板Code\n\t */\n\tprivate String emailTemplateCode;\n\n\t/**\n\t * Instantiates a new Send email message.\n\t */\n\tpublic SendEmailMessage() {\n\t}\n\n\t/**\n\t * Instantiates a new Send email message.\n\t *\n\t * @param email the email\n\t */\n\tpublic SendEmailMessage(String email) {\n\t\tthis.email = email;\n\t}\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/model/dto/group/CheckGroupCodeDto.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：CheckGroupCodeDto.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.model.dto.group;\n\nimport io.swagger.annotations.ApiModel;\nimport io.swagger.annotations.ApiModelProperty;\nimport lombok.Data;\n\nimport java.io.Serializable;\n\n\n/**\n * The class Check group code dto.\n *\n * @author paascloud.net@gmail.com\n */\n@Data\n@ApiModel\npublic class CheckGroupCodeDto implements Serializable {\n\n\tprivate static final long serialVersionUID = -7471245927289653237L;\n\t@ApiModelProperty(value = \"组织ID\")\n\tprivate Long groupId;\n\n\t@ApiModelProperty(value = \"组织code\")\n\tprivate String groupCode;\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/model/dto/group/CheckGroupNameDto.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：CheckGroupNameDto.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.model.dto.group;\n\nimport io.swagger.annotations.ApiModel;\nimport io.swagger.annotations.ApiModelProperty;\nimport lombok.Data;\n\n\n/**\n * The class Check group name dto.\n *\n * @author paascloud.net@gmail.com\n */\n@Data\n@ApiModel\npublic class CheckGroupNameDto {\n\n\t@ApiModelProperty(value = \"组织ID\")\n\tprivate Long groupId;\n\n\t@ApiModelProperty(value = \"组织名称\")\n\tprivate String groupName;\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/model/dto/group/GroupBindUserDto.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：GroupBindUserDto.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.model.dto.group;\n\nimport com.paascloud.provider.model.dto.role.BindUserDto;\nimport io.swagger.annotations.ApiModel;\nimport io.swagger.annotations.ApiModelProperty;\nimport lombok.Data;\n\nimport java.io.Serializable;\nimport java.util.Set;\n\n/**\n * The class Group bind user dto.\n *\n * @author paascloud.net@gmail.com\n */\n@Data\n@ApiModel(value = \"GroupBindUserDto\")\npublic class GroupBindUserDto implements Serializable {\n\n\tprivate static final long serialVersionUID = 1383005712348886707L;\n\t/**\n\t * 未绑定的用户集合\n\t */\n\t@ApiModelProperty(value = \"所有用户集合\")\n\tprivate Set<BindUserDto> allUserSet;\n\n\t/**\n\t * 已经绑定的用户集合\n\t */\n\t@ApiModelProperty(value = \"已经绑定的用户集合\")\n\tprivate Set<Long> alreadyBindUserIdSet;\n\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/model/dto/group/GroupBindUserReqDto.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：GroupBindUserReqDto.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.model.dto.group;\n\nimport io.swagger.annotations.ApiModel;\nimport io.swagger.annotations.ApiModelProperty;\nimport lombok.Data;\n\nimport java.io.Serializable;\nimport java.util.List;\n\n\n/**\n * The class Group bind user req dto.\n *\n * @author paascloud.net@gmail.com\n */\n@Data\n@ApiModel(value = \"GroupBindUserReqDto\")\npublic class GroupBindUserReqDto implements Serializable {\n\tprivate static final long serialVersionUID = 89217138744995863L;\n\n\t@ApiModelProperty(value = \"组织ID\")\n\tprivate Long groupId;\n\n\t@ApiModelProperty(value = \"用户id\")\n\tprivate List<Long> userIdList;\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/model/dto/log/UacLogMainDto.java",
    "content": "package com.paascloud.provider.model.dto.log;\n\nimport com.fasterxml.jackson.annotation.JsonFormat;\nimport com.paascloud.base.dto.BaseQuery;\nimport io.swagger.annotations.ApiModel;\nimport io.swagger.annotations.ApiModelProperty;\nimport lombok.Data;\nimport lombok.EqualsAndHashCode;\nimport org.springframework.format.annotation.DateTimeFormat;\n\nimport java.util.Date;\nimport java.util.List;\n\n/**\n * The class Uac log main dto.\n *\n * @author paascloud.net@gmail.com\n */\n@EqualsAndHashCode(callSuper = true)\n@Data\n@ApiModel\npublic class UacLogMainDto extends BaseQuery {\n\n\tprivate static final long serialVersionUID = 3967075132487249652L;\n\t/**\n\t * 日志类型\n\t */\n\t@ApiModelProperty(value = \"日志类型\")\n\tprivate String logType;\n\t/**\n\t * 操作用户名称\n\t */\n\t@ApiModelProperty(value = \"操作用户名称\")\n\tprivate String creator;\n\t/**\n\t * 权限名称\n\t */\n\t@ApiModelProperty(value = \"权限名称\")\n\tprivate String actionName;\n\n\t/**\n\t * 权限编码\n\t */\n\t@ApiModelProperty(value = \"权限编码\")\n\tprivate String actionCode;\n\n\t/**\n\t * 菜单ID集合\n\t */\n\t@ApiModelProperty(value = \"菜单ID集合\")\n\tprivate List<Long> menuIdList;\n\n\t/**\n\t * 菜单ID集合\n\t */\n\t@ApiModelProperty(value = \"菜单ID\")\n\tprivate Long menuId;\n\n\t/**\n\t * 开始时间\n\t */\n\t@ApiModelProperty(value = \"开始时间\")\n\t@DateTimeFormat(pattern = \"yyyy-MM-dd HH:mm:ss\")\n\t@JsonFormat(pattern = \"yyyy-MM-dd HH:mm:ss\", timezone = \"GMT+8\")\n\tprivate Date startQueryTime;\n\n\t/**\n\t * 结束时间\n\t */\n\t@ApiModelProperty(value = \"结束时间\")\n\t@DateTimeFormat(pattern = \"yyyy-MM-dd HH:mm:ss\")\n\t@JsonFormat(pattern = \"yyyy-MM-dd HH:mm:ss\", timezone = \"GMT+8\")\n\tprivate Date endQueryTime;\n\n\t@ApiModelProperty(value = \"登录IP\")\n\tprivate String ip;\n\n\t@ApiModelProperty(value = \"登录位置\")\n\tprivate String location;\n\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/model/dto/menu/UacEditMenuDto.java",
    "content": "package com.paascloud.provider.model.dto.menu;\n\nimport io.swagger.annotations.ApiModel;\nimport io.swagger.annotations.ApiModelProperty;\nimport lombok.Data;\nimport org.hibernate.validator.constraints.NotBlank;\n\nimport java.io.Serializable;\n\n/**\n * The class Uac menu add dto.\n *\n * @author paascloud.net@gmail.com\n */\n@Data\n@ApiModel(value = \"菜单新增Dto\")\npublic class UacEditMenuDto implements Serializable {\n\tprivate static final long serialVersionUID = -9219271060355200235L;\n\n\t/**\n\t * 菜单的Id\n\t */\n\t@ApiModelProperty(value = \"菜单的Id\", required = true)\n\tprivate Long id;\n\t/**\n\t * 菜单的父Id\n\t */\n\t@ApiModelProperty(value = \"菜单的父Id\", required = true)\n\t@NotBlank(message = \"上级菜单不能为空\")\n\tprivate Long pid;\n\t/**\n\t * 菜单编码\n\t */\n\t@ApiModelProperty(value = \"菜单编码\", required = true)\n\t@NotBlank(message = \"菜单编码不能为空\")\n\tprivate String menuCode;\n\t/**\n\t * Icon编码\n\t */\n\t@ApiModelProperty(value = \"Icon编码\")\n\tprivate String icon;\n\t/**\n\t * 菜单名称\n\t */\n\t@ApiModelProperty(value = \"菜单名称\", required = true)\n\t@NotBlank(message = \"菜单名称不能为空\")\n\tprivate String menuName;\n\t/**\n\t * 菜单排序\n\t */\n\t@ApiModelProperty(value = \"菜单排序\", required = true)\n\tprivate Integer number;\n\t/**\n\t * 菜单地址\n\t */\n\t@ApiModelProperty(value = \"菜单地址\", required = true)\n\t@NotBlank(message = \"菜单地址不能为空\")\n\tprivate String url;\n\t/**\n\t * 备注说明\n\t */\n\t@ApiModelProperty(value = \"备注说明\")\n\tprivate String remark;\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/model/dto/menu/UacMenuCheckCodeDto.java",
    "content": "package com.paascloud.provider.model.dto.menu;\n\nimport io.swagger.annotations.ApiModel;\nimport io.swagger.annotations.ApiModelProperty;\nimport lombok.Data;\nimport org.hibernate.validator.constraints.NotBlank;\n\nimport java.io.Serializable;\n\n\n/**\n * The class Uac menu check code dto.\n *\n * @author paascloud.net@gmail.com\n */\n@Data\n@ApiModel(value = \"UacMenuCheckCodeDto\")\npublic class UacMenuCheckCodeDto implements Serializable {\n\tprivate static final long serialVersionUID = 8687848883145768024L;\n\t/**\n\t * 菜单的id\n\t */\n\t@ApiModelProperty(value = \"菜单的id\")\n\tprivate Long menuId;\n\t/**\n\t * 菜单的url\n\t */\n\t@ApiModelProperty(value = \"菜单编码\")\n\t@NotBlank(message = \"菜单编码不能为空\")\n\tprivate String menuCode;\n\n\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/model/dto/menu/UacMenuCheckNameDto.java",
    "content": "package com.paascloud.provider.model.dto.menu;\n\nimport io.swagger.annotations.ApiModel;\nimport io.swagger.annotations.ApiModelProperty;\nimport lombok.Data;\nimport org.hibernate.validator.constraints.NotBlank;\n\nimport java.io.Serializable;\n\n/**\n * The class Uac menu check name dto.\n *\n * @author paascloud.net@gmail.com\n */\n@Data\n@ApiModel(value = \"UacMenuCheckNameDto\")\npublic class UacMenuCheckNameDto implements Serializable {\n\tprivate static final long serialVersionUID = -2372025597901225230L;\n\t/**\n\t * 菜单的id\n\t */\n\t@ApiModelProperty(value = \"菜单的id\")\n\tprivate Long menuId;\n\t/**\n\t * 菜单的pid\n\t */\n\t@ApiModelProperty(value = \"上级菜单ID\")\n\t@NotBlank(message = \"上级菜单ID不能为空\")\n\tprivate Long pid;\n\t/**\n\t * 菜单的menuName\n\t */\n\t@ApiModelProperty(value = \"菜单名称\")\n\t@NotBlank(message = \"菜单名称不能为空\")\n\tprivate String menuName;\n\n\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/model/dto/menu/UacMenuCheckUrlDto.java",
    "content": "package com.paascloud.provider.model.dto.menu;\n\nimport io.swagger.annotations.ApiModel;\nimport io.swagger.annotations.ApiModelProperty;\nimport lombok.Data;\nimport org.hibernate.validator.constraints.NotBlank;\n\nimport java.io.Serializable;\n\n/**\n * The class Uac menu check url dto.\n *\n * @author paascloud.net@gmail.com\n */\n@Data\n@ApiModel(value = \"UacMenuCheckUrlDto\")\npublic class UacMenuCheckUrlDto implements Serializable {\n\tprivate static final long serialVersionUID = 839437721293973234L;\n\t/**\n\t * 菜单的id\n\t */\n\t@ApiModelProperty(value = \"菜单的id\")\n\tprivate Long menuId;\n\t/**\n\t * 菜单的url\n\t */\n\t@ApiModelProperty(value = \"菜单地址\")\n\t@NotBlank(message = \"菜单地址不能为空\")\n\tprivate String url;\n\n\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/model/dto/menu/UacMenuStatusDto.java",
    "content": "package com.paascloud.provider.model.dto.menu;\n\nimport io.swagger.annotations.ApiModel;\nimport io.swagger.annotations.ApiModelProperty;\nimport lombok.Data;\n\nimport java.io.Serializable;\n\n/**\n * The class Uac menu status dto.\n *\n * @author paascloud.net@gmail.com\n */\n@Data\n@ApiModel(value = \"UacMenuStatusDto\")\npublic class UacMenuStatusDto implements Serializable {\n\tprivate static final long serialVersionUID = 7834606418601316142L;\n\t/**\n\t * 菜单的Id\n\t */\n\t@ApiModelProperty(value = \"菜单的Id\", required = true)\n\tprivate Long id;\n\t/**\n\t * 菜单的父Id\n\t */\n\t@ApiModelProperty(value = \"菜单的状态\", required = true)\n\tprivate String status;\n\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/model/dto/menu/UacMenuUrlDto.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：UacMenuUrlDto.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.model.dto.menu;\n\nimport io.swagger.annotations.ApiModel;\nimport io.swagger.annotations.ApiModelProperty;\nimport lombok.Data;\n\nimport java.io.Serializable;\n\n/**\n * The class Uac menu url dto.\n *\n * @author paascloud.net@gmail.com\n */\n@Data\n@ApiModel(value = \"根据URL查询菜单Dto\")\npublic class UacMenuUrlDto implements Serializable {\n\n\n\tprivate static final long serialVersionUID = 456904676277011675L;\n\t@ApiModelProperty(value = \"系统Id\", required = true)\n\tprivate String systemId;\n\n\t@ApiModelProperty(value = \"用户ID\", required = true)\n\tprivate Long userId;\n\n\t@ApiModelProperty(value = \"url\", required = true)\n\tprivate String url;\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/model/dto/menu/UserMenuChildrenDto.java",
    "content": "package com.paascloud.provider.model.dto.menu;\n\nimport com.paascloud.provider.model.vo.MenuVo;\nimport lombok.Data;\n\nimport java.io.Serializable;\n\n/**\n * The class User menu children dto.\n *\n * @author paascloud.net@gmail.com\n */\n@Data\npublic class UserMenuChildrenDto implements Serializable {\n\tprivate static final long serialVersionUID = -6279523061450477189L;\n\t/**\n\t * 叶子节点菜单名称\n\t */\n\tprivate String leafMenuName;\n\t/**\n\t * 是否被选中,true\n\t */\n\tprivate boolean checked;\n\t/**\n\t * 跳转URL\n\t */\n\tprivate String url;\n\t/**\n\t * 叶子节点菜单Id\n\t */\n\tprivate Long leafMenuId;\n\n\n\t/**\n\t * Instantiates a new User menu children dto.\n\t *\n\t * @param menuVo the menu vo\n\t */\n\tpublic UserMenuChildrenDto(MenuVo menuVo) {\n\t\tthis.leafMenuName = menuVo.getMenuName();\n\t\tthis.url = menuVo.getUrl();\n\t\tthis.leafMenuId = menuVo.getId();\n\t}\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/model/dto/menu/UserMenuDto.java",
    "content": "package com.paascloud.provider.model.dto.menu;\n\nimport lombok.Data;\n\nimport java.io.Serializable;\nimport java.util.List;\n\n/**\n * The class User menu dto.\n *\n * @author paascloud.net@gmail.com\n */\n@Data\npublic class UserMenuDto implements Serializable {\n\tprivate static final long serialVersionUID = -5220054739321565548L;\n\t/**\n\t * 一级菜单名称\n\t */\n\tprivate String fistMenuName;\n\t/**\n\t * 一级菜单图标\n\t */\n\tprivate String fistMenuIcon;\n\t/**\n\t * 一级菜单Id\n\t */\n\tprivate String fistMenuId;\n\t/**\n\t * 所有的子节点\n\t */\n\tprivate List<UserMenuChildrenDto> children;\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/model/dto/omc/CartListQuery.java",
    "content": "package com.paascloud.provider.model.dto.omc;\n\nimport com.paascloud.provider.model.vo.CartProductVo;\nimport lombok.Data;\n\nimport java.io.Serializable;\nimport java.util.List;\n\n\n/**\n * The class Cart list query.\n *\n * @author paascloud.net@gmail.com\n */\n@Data\npublic class CartListQuery implements Serializable {\n\tprivate static final long serialVersionUID = -5968284112162772265L;\n\tprivate List<CartProductVo> cartProductVoList;\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/model/dto/role/BindUserDto.java",
    "content": "package com.paascloud.provider.model.dto.role;\n\nimport io.swagger.annotations.ApiModel;\nimport io.swagger.annotations.ApiModelProperty;\nimport lombok.Data;\n\nimport java.io.Serializable;\n\n/**\n * The class Bind user dto.\n *\n * @author paascloud.net @gmail.com\n */\n@Data\n@ApiModel(value = \"绑定的用户信息\")\npublic class BindUserDto implements Serializable {\n\n\tprivate static final long serialVersionUID = -3385971785265488527L;\n\t/**\n\t * 用户ID\n\t */\n\t@ApiModelProperty(value = \"用户ID\")\n\tprivate Long userId;\n\t/**\n\t * 手机号\n\t */\n\t@ApiModelProperty(value = \"手机号\")\n\tprivate String mobileNo;\n\t/**\n\t * 用户名\n\t */\n\t@ApiModelProperty(value = \"用户名\")\n\tprivate String userName;\n\t/**\n\t * 是否可以操作\n\t */\n\t@ApiModelProperty(value = \"是否可以操作\")\n\tprivate boolean disabled;\n\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/model/dto/role/CheckRoleCodeDto.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：CheckRoleCodeDto.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.model.dto.role;\n\nimport lombok.Data;\n\nimport java.io.Serializable;\n\n/**\n * The class Check role code dto.\n *\n * @author paascloud.net @gmail.com\n */\n@Data\npublic class CheckRoleCodeDto implements Serializable {\n\tprivate static final long serialVersionUID = 6369434659441735160L;\n\n\tprivate Long roleId;\n\tprivate String roleCode;\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/model/dto/role/RoleBindActionDto.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：RoleBindActionDto.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.model.dto.role;\n\nimport io.swagger.annotations.ApiModel;\nimport io.swagger.annotations.ApiModelProperty;\nimport lombok.Data;\n\nimport java.io.Serializable;\nimport java.util.Set;\n\n/**\n * The class Grant auth role.\n *\n * @author paascloud.net@gmail.com\n */\n@Data\n@ApiModel\npublic class RoleBindActionDto implements Serializable {\n\n\tprivate static final long serialVersionUID = -8589698204017834593L;\n\t/**\n\t * 按钮权限\n\t */\n\t@ApiModelProperty(value = \"按钮权限\")\n\tprivate Set<Long> actionIdList;\n\t/**\n\t * 角色Id\n\t */\n\t@ApiModelProperty(value = \"角色Id\")\n\tprivate Long roleId;\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/model/dto/role/RoleBindMenuDto.java",
    "content": "package com.paascloud.provider.model.dto.role;\n\nimport io.swagger.annotations.ApiModel;\nimport io.swagger.annotations.ApiModelProperty;\nimport lombok.Data;\n\nimport java.io.Serializable;\nimport java.util.Set;\n\n/**\n * The class Grant auth role.\n *\n * @author paascloud.net@gmail.com\n */\n@Data\n@ApiModel\npublic class RoleBindMenuDto implements Serializable {\n\n\tprivate static final long serialVersionUID = -8589698204017834593L;\n\t/**\n\t * 菜单权限\n\t */\n\t@ApiModelProperty(value = \"菜单权限\")\n\tprivate Set<Long> menuIdList;\n\t/**\n\t * 角色Id\n\t */\n\t@ApiModelProperty(value = \"角色Id\")\n\tprivate Long roleId;\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/model/dto/role/RoleBindUserDto.java",
    "content": "package com.paascloud.provider.model.dto.role;\n\nimport io.swagger.annotations.ApiModel;\nimport io.swagger.annotations.ApiModelProperty;\nimport lombok.Data;\n\nimport java.io.Serializable;\nimport java.util.Set;\n\n/**\n * The class Role bind user dto.\n *\n * @author paascloud.net@gmail.com\n */\n@Data\n@ApiModel(value = \"角色绑定用户\")\npublic class RoleBindUserDto implements Serializable {\n\n\tprivate static final long serialVersionUID = -2521583668470612548L;\n\t/**\n\t * 未绑定的用户集合\n\t */\n\t@ApiModelProperty(value = \"所有用户集合\")\n\tprivate Set<BindUserDto> allUserSet;\n\n\t/**\n\t * 已经绑定的用户集合\n\t */\n\t@ApiModelProperty(value = \"已经绑定的用户集合\")\n\tprivate Set<Long> alreadyBindUserIdSet;\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/model/dto/role/RoleBindUserReqDto.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：RoleBindUserReqDto.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.model.dto.role;\n\nimport io.swagger.annotations.ApiModel;\nimport io.swagger.annotations.ApiModelProperty;\nimport lombok.Data;\n\nimport java.io.Serializable;\nimport java.util.List;\n\n/**\n * The class Role bind user req dto.\n *\n * @author paascloud.net@gmail.com\n */\n@Data\n@ApiModel(value = \"角色绑定用户\")\npublic class RoleBindUserReqDto implements Serializable {\n\tprivate static final long serialVersionUID = 89217138744995863L;\n\n\t@ApiModelProperty(value = \"角色ID\")\n\tprivate Long roleId;\n\n\t@ApiModelProperty(value = \"需要绑定的用户ID集合\")\n\tprivate List<Long> userIdList;\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/model/dto/sms/SmsMessage.java",
    "content": "package com.paascloud.provider.model.dto.sms;\n\nimport lombok.Data;\nimport lombok.NoArgsConstructor;\n\nimport java.io.Serializable;\n\n/**\n * The class Sms message.\n *\n * @author paascloud.net@gmail.com\n */\n@Data\n@NoArgsConstructor\npublic class SmsMessage implements Serializable {\n\tprivate static final long serialVersionUID = -8708881656765856624L;\n\t/**\n\t * 手机号码\n\t */\n\tprivate String mobileNo;\n\n\t/**\n\t * 加密token\n\t */\n\tprivate String smsToken;\n\n\t/**\n\t * 验证码\n\t */\n\tprivate String smsCode;\n\n\t/**\n\t * 短信模板Code\n\t */\n\tprivate String smsTemplateCode;\n\n\t/**\n\t * 业务单号(这里使用ip地址)\n\t */\n\tprivate String outId;\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/model/dto/token/RefreshTokenDto.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：RefreshTokenDto.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.model.dto.token;\n\n\nimport lombok.Data;\nimport org.hibernate.validator.constraints.NotBlank;\n\n/**\n * The class Refresh token dto.\n *\n * @author paascloud.net @gmail.com\n */\n@Data\npublic class RefreshTokenDto {\n\t@NotBlank\n\tprivate String refreshToken;\n\t@NotBlank\n\tprivate String accessToken;\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/model/dto/token/TokenMainQueryDto.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：TokenMainQueryDto.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.model.dto.token;\n\n\nimport com.paascloud.base.dto.BaseQuery;\nimport io.swagger.annotations.ApiModel;\nimport lombok.Data;\nimport lombok.EqualsAndHashCode;\n\n/**\n * The class Token main query dto.\n *\n * @author paascloud.net @gmail.com\n */\n@Data\n@ApiModel\n@EqualsAndHashCode(callSuper = true)\npublic class TokenMainQueryDto extends BaseQuery {\n\tprivate static final long serialVersionUID = -4003383211817581110L;\n\tprivate String loginName;\n\n\tprivate String userName;\n\n\tprivate Integer status;\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/model/dto/user/BindRoleDto.java",
    "content": "package com.paascloud.provider.model.dto.user;\n\nimport io.swagger.annotations.ApiModel;\nimport io.swagger.annotations.ApiModelProperty;\nimport lombok.Data;\n\nimport java.io.Serializable;\n\n/**\n * The class Bind role dto.\n *\n * @author paascloud.net @gmail.com\n */\n@Data\n@ApiModel(value = \"绑定的用户信息\")\npublic class BindRoleDto implements Serializable {\n\n\tprivate static final long serialVersionUID = -3385971785265488527L;\n\t/**\n\t * 用户ID\n\t */\n\t@ApiModelProperty(value = \"用户ID\")\n\tprivate Long roleId;\n\t/**\n\t * 手机号\n\t */\n\t@ApiModelProperty(value = \"角色编码\")\n\tprivate String roleCode;\n\t/**\n\t * 用户名\n\t */\n\t@ApiModelProperty(value = \"角色名称\")\n\tprivate String roleName;\n\t/**\n\t * 是否可以操作\n\t */\n\t@ApiModelProperty(value = \"是否可以操作\")\n\tprivate boolean disabled;\n\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/model/dto/user/BindUserMenusDto.java",
    "content": "package com.paascloud.provider.model.dto.user;\n\nimport io.swagger.annotations.ApiModelProperty;\nimport lombok.Data;\n\nimport java.io.Serializable;\nimport java.util.List;\n\n\n/**\n * The class Bind user menus dto.\n *\n * @author paascloud.net@gmail.com\n */\n@Data\npublic class BindUserMenusDto implements Serializable {\n\n\tprivate static final long serialVersionUID = -5046118305639420777L;\n\n\t/**\n\t * 菜单ID\n\t */\n\t@ApiModelProperty(value = \"菜单ID\")\n\tprivate List<Long> menuIdList;\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/model/dto/user/BindUserRolesDto.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：BindUserRolesDto.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.model.dto.user;\n\nimport io.swagger.annotations.ApiModel;\nimport io.swagger.annotations.ApiModelProperty;\nimport lombok.Data;\n\nimport java.io.Serializable;\nimport java.util.List;\n\n/**\n * The class Bind user roles dto.\n *\n * @author paascloud.net@gmail.com\n */\n@ApiModel\n@Data\npublic class BindUserRolesDto implements Serializable {\n\n\tprivate static final long serialVersionUID = -9149237379943908522L;\n\t@ApiModelProperty(value = \"角色ID\")\n\tprivate Long userId;\n\n\t@ApiModelProperty(value = \"需要绑定的角色ID集合\")\n\tprivate List<Long> roleIdList;\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/model/dto/user/CheckEmailDto.java",
    "content": "package com.paascloud.provider.model.dto.user;\n\nimport io.swagger.annotations.ApiModel;\nimport io.swagger.annotations.ApiModelProperty;\nimport lombok.Data;\n\nimport java.io.Serializable;\n\n\n/**\n * The class Check user name dto.\n *\n * @author paascloud.net@gmail.com\n */\n@Data\n@ApiModel\npublic class CheckEmailDto implements Serializable {\n\n\tprivate static final long serialVersionUID = 3802825234063017559L;\n\t/**\n\t * 用户ID\n\t */\n\t@ApiModelProperty(value = \"用户ID\")\n\tprivate Long userId;\n\n\t/**\n\t * 登录名\n\t */\n\t@ApiModelProperty(value = \"邮箱\")\n\tprivate String email;\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/model/dto/user/CheckLoginNameDto.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：CheckLoginNameDto.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.model.dto.user;\n\nimport io.swagger.annotations.ApiModel;\nimport io.swagger.annotations.ApiModelProperty;\nimport lombok.Data;\n\nimport java.io.Serializable;\n\n\n/**\n * The class Check user name dto.\n *\n * @author paascloud.net@gmail.com\n */\n@Data\n@ApiModel(value = \"校验真实姓名唯一性Dto \")\npublic class CheckLoginNameDto implements Serializable {\n\n\tprivate static final long serialVersionUID = 3802825234063017559L;\n\t/**\n\t * 用户ID\n\t */\n\t@ApiModelProperty(value = \"用户ID\")\n\tprivate Long userId;\n\n\t/**\n\t * 登录名\n\t */\n\t@ApiModelProperty(value = \"用户姓名\")\n\tprivate String loginName;\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/model/dto/user/CheckNewPasswordDto.java",
    "content": "package com.paascloud.provider.model.dto.user;\n\nimport io.swagger.annotations.ApiModel;\nimport io.swagger.annotations.ApiModelProperty;\nimport lombok.Data;\n\nimport java.io.Serializable;\n\n\n/**\n * 校验密码.\n *\n * @author paascloud.net@gmail.com\n */\n@Data\n@ApiModel(value = \"校验新密码是否与原始密码相同Dto \")\npublic class CheckNewPasswordDto implements Serializable {\n\n\tprivate static final long serialVersionUID = 4630716723912494960L;\n\t/**\n\t * 登录名\n\t */\n\t@ApiModelProperty(value = \"登录名\")\n\tprivate String loginName;\n\n\t/**\n\t * 手机号\n\t */\n\t@ApiModelProperty(value = \"手机号\")\n\tprivate String newPassword;\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/model/dto/user/CheckUserNameDto.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：CheckUserNameDto.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.model.dto.user;\n\nimport io.swagger.annotations.ApiModel;\nimport io.swagger.annotations.ApiModelProperty;\nimport lombok.Data;\n\nimport java.io.Serializable;\n\n\n/**\n * The class Check user name dto.\n *\n * @author paascloud.net@gmail.com\n */\n@Data\n@ApiModel(value = \"校验真实姓名唯一性Dto \")\npublic class CheckUserNameDto implements Serializable {\n\n\tprivate static final long serialVersionUID = 3802825234063017559L;\n\t/**\n\t * 用户ID\n\t */\n\t@ApiModelProperty(value = \"用户ID\")\n\tprivate Long userId;\n\n\t/**\n\t * 用户姓名\n\t */\n\t@ApiModelProperty(value = \"用户姓名\")\n\tprivate String userName;\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/model/dto/user/CheckUserPhoneDto.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：CheckUserPhoneDto.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.model.dto.user;\n\nimport io.swagger.annotations.ApiModel;\nimport io.swagger.annotations.ApiModelProperty;\nimport lombok.Data;\n\nimport java.io.Serializable;\n\n\n/**\n * The class Check user phone dto.\n *\n * @author paascloud.net@gmail.com\n */\n@Data\n@ApiModel(value = \"校验用户电话号码唯一性Dto \")\npublic class CheckUserPhoneDto implements Serializable {\n\n\tprivate static final long serialVersionUID = 3378874756673320539L;\n\t/**\n\t * 用户ID\n\t */\n\t@ApiModelProperty(value = \"用户ID\")\n\tprivate Long userId;\n\n\t/**\n\t * 手机号\n\t */\n\t@ApiModelProperty(value = \"手机号\")\n\tprivate String mobileNo;\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/model/dto/user/LoginRespDto.java",
    "content": "package com.paascloud.provider.model.dto.user;\n\nimport com.paascloud.base.dto.LoginAuthDto;\nimport com.paascloud.provider.model.vo.MenuVo;\nimport io.swagger.annotations.ApiModel;\nimport io.swagger.annotations.ApiModelProperty;\nimport lombok.Data;\n\nimport java.io.Serializable;\nimport java.util.List;\n\n/**\n * The class Login resp dto.\n *\n * @author paascloud.net@gmail.com\n */\n@Data\n@ApiModel(value = \"发送短信参数Dto\")\npublic class LoginRespDto implements Serializable {\n\tprivate static final long serialVersionUID = -8992761897550131632L;\n\t@ApiModelProperty(value = \"登陆信息\")\n\tprivate LoginAuthDto loginAuthDto;\n\t@ApiModelProperty(value = \"菜单集合\")\n\tprivate List<MenuVo> menuList;\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/model/dto/user/ModifyUserStatusDto.java",
    "content": "package com.paascloud.provider.model.dto.user;\n\nimport io.swagger.annotations.ApiModel;\nimport io.swagger.annotations.ApiModelProperty;\nimport lombok.Data;\n\nimport java.io.Serializable;\n\n/**\n * The class Modify user status dto.\n *\n * @author paascloud.net@gmail.com\n */\n@Data\n@ApiModel(value = \"用户禁用/启用Dto \")\npublic class ModifyUserStatusDto implements Serializable {\n\n\tprivate static final long serialVersionUID = 1494899235149813850L;\n\t/**\n\t * 用户ID\n\t */\n\t@ApiModelProperty(value = \"用户ID\")\n\tprivate Long userId;\n\n\t/**\n\t * 状态\n\t */\n\t@ApiModelProperty(value = \"状态\")\n\tprivate String status;\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/model/dto/user/ResetLoginPwdDto.java",
    "content": "package com.paascloud.provider.model.dto.user;\n\nimport io.swagger.annotations.ApiModel;\nimport io.swagger.annotations.ApiModelProperty;\nimport lombok.Data;\n\nimport java.io.Serializable;\n\n/**\n * The class Reset login pwd dto.\n *\n * @author paascloud.net @gmail.com\n */\n@Data\n@ApiModel\npublic class ResetLoginPwdDto implements Serializable {\n\tprivate static final long serialVersionUID = -3599630825681985964L;\n\t/**\n\t * 新密码\n\t */\n\t@ApiModelProperty(value = \"密钥\")\n\tprivate String resetPwdKey;\n\t/**\n\t * 新密码\n\t */\n\t@ApiModelProperty(value = \"新密码\")\n\tprivate String newPassword;\n\n\t/**\n\t * 确认密码\n\t */\n\t@ApiModelProperty(value = \"确认密码\")\n\tprivate String confirmPwd;\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/model/dto/user/UserModifyPwdDto.java",
    "content": "package com.paascloud.provider.model.dto.user;\n\nimport io.swagger.annotations.ApiModel;\nimport io.swagger.annotations.ApiModelProperty;\nimport lombok.Data;\n\nimport java.io.Serializable;\n\n/**\n * The class User modify pwd dto.\n *\n * @author paascloud.net@gmail.com\n */\n@Data\n@ApiModel(value = \"用户修改密码Dto\")\npublic class UserModifyPwdDto implements Serializable {\n\n\tprivate static final long serialVersionUID = -3933378415083541145L;\n\t/**\n\t * 登录名\n\t */\n\t@ApiModelProperty(value = \"登录名\")\n\tprivate String loginName;\n\n\t/**\n\t * 原始密码\n\t */\n\t@ApiModelProperty(value = \"原始密码\")\n\tprivate String oldPassword;\n\n\t/**\n\t * 新密码\n\t */\n\t@ApiModelProperty(value = \"新密码\")\n\tprivate String newPassword;\n\n\t/**\n\t * 确认密码\n\t */\n\t@ApiModelProperty(value = \"确认密码\")\n\tprivate String confirmPwd;\n\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/model/dto/user/UserResetPwdDto.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：UserResetPwdDto.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.model.dto.user;\n\nimport io.swagger.annotations.ApiModel;\nimport io.swagger.annotations.ApiModelProperty;\nimport lombok.Data;\n\nimport java.io.Serializable;\n\n/**\n * The class User reset pwd dto.\n *\n * @author paascloud.net@gmail.com\n */\n@Data\n@ApiModel(value = \"用户忘记密码Dto\")\npublic class UserResetPwdDto implements Serializable {\n\n\tprivate static final long serialVersionUID = 1036552024852502298L;\n\t/**\n\t * 手机号\n\t */\n\t@ApiModelProperty(value = \"手机号\")\n\tprivate String mobileNo;\n\n\t/**\n\t * 新密码\n\t */\n\t@ApiModelProperty(value = \"新密码\")\n\tprivate String newPassword;\n\n\t/**\n\t * 确认密码\n\t */\n\t@ApiModelProperty(value = \"确认密码\")\n\tprivate String confirmPwd;\n\n\t/**\n\t * 短信验证码\n\t */\n\t@ApiModelProperty(value = \"短信验证码\")\n\tprivate String smsCode;\n\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/model/enums/UacActionStatusEnum.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：UacActionStatusEnum.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.model.enums;\n\n\n/**\n * The enum Uac action status enum.\n *\n * @author paascloud.net@gmail.com\n */\npublic enum UacActionStatusEnum {\n\t/**\n\t * 启用\n\t */\n\tENABLE(\"ENABLE\", \"启用\"),\n\t/**\n\t * 禁用\n\t */\n\tDISABLE(\"DISABLE\", \"禁用\");\n\n\t/**\n\t * The Type.\n\t */\n\tString type;\n\t/**\n\t * The Name.\n\t */\n\tString name;\n\n\tUacActionStatusEnum(String type, String name) {\n\t\tthis.type = type;\n\t\tthis.name = name;\n\t}\n\n\t/**\n\t * Gets type.\n\t *\n\t * @return the type\n\t */\n\tpublic String getType() {\n\t\treturn type;\n\t}\n\n\t/**\n\t * Gets name.\n\t *\n\t * @return the name\n\t */\n\tpublic String getName() {\n\t\treturn name;\n\t}\n\n\t/**\n\t * Gets name.\n\t *\n\t * @param type the type\n\t *\n\t * @return the name\n\t */\n\tpublic static String getName(String type) {\n\t\tfor (UacActionStatusEnum ele : UacActionStatusEnum.values()) {\n\t\t\tif (type.equals(ele.getType())) {\n\t\t\t\treturn ele.getName();\n\t\t\t}\n\t\t}\n\t\treturn null;\n\t}\n\n\t/**\n\t * Gets enum.\n\t *\n\t * @param type the type\n\t *\n\t * @return the enum\n\t */\n\tpublic static UacActionStatusEnum getEnum(String type) {\n\t\tfor (UacActionStatusEnum ele : UacActionStatusEnum.values()) {\n\t\t\tif (type.equals(ele.getType())) {\n\t\t\t\treturn ele;\n\t\t\t}\n\t\t}\n\t\treturn UacActionStatusEnum.ENABLE;\n\t}\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/model/enums/UacEmailTemplateEnum.java",
    "content": "package com.paascloud.provider.model.enums;\n\n/**\n * The enum Uac email template enum.\n *\n * @author paascloud.net@gmail.com\n */\npublic enum UacEmailTemplateEnum {\n\n\t/**\n\t * 重置密码-获取验证码\n\t */\n\tRESET_PWD_GET_CODE(\"RESET_PWD_CODE\", \"重置密码-获取验证码\", \"email/sendRestPwdCodeTemplate.ftl\"),\n\t/**\n\t * 忘记密码-等待重置密码.\n\t */\n\tRESET_PWD_SEND_MAIL(\"RESET_PWD_CODE\", \"忘记密码-等待重置密码\", \"email/sendRestLoginPwdTemplate.ftl\"),\n\t/**\n\t * 注册用户-等待激活用户.\n\t */\n\tACTIVE_USER(\"ACTIVE_USER\", \"注册用户-等待激活用户\", \"email/activeUserTemplate.ftl\"),\n\t/**\n\t * 注册用户-激活用户成功.\n\t */\n\tACTIVE_USER_SUCCESS(\"ACTIVE_USER_SUCCESS\", \"注册用户-激活用户成功\", \"email/activeUserSuccessTemplate.ftl\"),\n\t/**\n\t * 忘记密码-重置密码\n\t */\n\tRESET_LOGIN_PWD(\"RESET_LOGIN_PWD\", \"忘记密码-重置密码\", \"email/sendRestLoginPwdSuccessTemplate.ftl\"),\n\t/**\n\t * 忘记密码-邮件验证码\n\t */\n\tRESET_USER_EMAIL(\"RESET_USER_EMAIL\", \"修改邮箱-邮件验证码\", \"email/sendRestUserEmailTemplate.ftl\"),;\n\n\t/**\n\t * The Key.\n\t */\n\tString key;\n\t/**\n\t * The Subject.\n\t */\n\tString subject;\n\t/**\n\t * The Location.\n\t */\n\tString location;\n\n\tUacEmailTemplateEnum(String key, String subject, String location) {\n\t\tthis.key = key;\n\t\tthis.subject = subject;\n\t\tthis.location = location;\n\t}\n\n\t/**\n\t * Gets key.\n\t *\n\t * @return the key\n\t */\n\tpublic String getKey() {\n\t\treturn key;\n\t}\n\n\t/**\n\t * Gets location.\n\t *\n\t * @return the location\n\t */\n\tpublic String getLocation() {\n\t\treturn location;\n\t}\n\n\t/**\n\t * Gets subject.\n\t *\n\t * @return the subject\n\t */\n\tpublic String getSubject() {\n\t\treturn subject;\n\t}\n\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/model/enums/UacGroupStatusEnum.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：UacGroupStatusEnum.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.model.enums;\n\nimport com.google.common.collect.Lists;\n\nimport java.util.List;\n\n/**\n * The enum Uac group status enum.\n *\n * @author paascloud.net@gmail.com\n */\npublic enum UacGroupStatusEnum {\n\t/**\n\t * 启用\n\t */\n\tENABLE(0, \"启用\"),\n\t/**\n\t * 禁用\n\t */\n\tDISABLE(1, \"禁用\");\n\n\t/**\n\t * The Status.\n\t */\n\tint status;\n\t/**\n\t * The Value.\n\t */\n\tString value;\n\n\t/**\n\t * Gets name.\n\t *\n\t * @param status the status\n\t *\n\t * @return the name\n\t */\n\tpublic static String getName(int status) {\n\t\tfor (UacGroupStatusEnum ele : UacGroupStatusEnum.values()) {\n\t\t\tif (status == ele.getStatus()) {\n\t\t\t\treturn ele.getValue();\n\t\t\t}\n\t\t}\n\t\treturn null;\n\t}\n\n\tUacGroupStatusEnum(int status, String value) {\n\t\tthis.status = status;\n\t\tthis.value = value;\n\t}\n\n\t/**\n\t * Gets status.\n\t *\n\t * @return the status\n\t */\n\tpublic int getStatus() {\n\t\treturn status;\n\t}\n\n\t/**\n\t * Gets value.\n\t *\n\t * @return the value\n\t */\n\tpublic String getValue() {\n\t\treturn value;\n\t}\n\n\tprivate static List<Integer> getStatusList() {\n\t\tList<Integer> list = Lists.newArrayList();\n\t\tfor (UacGroupStatusEnum ele : UacGroupStatusEnum.values()) {\n\t\t\tlist.add(ele.getStatus());\n\t\t}\n\t\treturn list;\n\t}\n\n\t/**\n\t * Contains boolean.\n\t *\n\t * @param status the status\n\t *\n\t * @return the boolean\n\t */\n\tpublic static boolean contains(Integer status) {\n\t\tList<Integer> statusList = getStatusList();\n\t\treturn statusList.contains(status);\n\t}\n}"
  },
  {
    "path": "paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/model/enums/UacMenuStatusEnum.java",
    "content": "package com.paascloud.provider.model.enums;\n\n\n/**\n * The enum Uac menu status enum.\n *\n * @author paascloud.net@gmail.com\n */\npublic enum UacMenuStatusEnum {\n\t/**\n\t * 启用\n\t */\n\tENABLE(\"ENABLE\", \"启用\"),\n\t/**\n\t * 禁用\n\t */\n\tDISABLE(\"DISABLE\", \"禁用\");\n\n\t/**\n\t * The Type.\n\t */\n\tString type;\n\t/**\n\t * The Name.\n\t */\n\tString name;\n\n\tUacMenuStatusEnum(String type, String name) {\n\t\tthis.type = type;\n\t\tthis.name = name;\n\t}\n\n\t/**\n\t * Gets type.\n\t *\n\t * @return the type\n\t */\n\tpublic String getType() {\n\t\treturn type;\n\t}\n\n\t/**\n\t * Gets name.\n\t *\n\t * @return the name\n\t */\n\tpublic String getName() {\n\t\treturn name;\n\t}\n\n\n\t/**\n\t * Gets name.\n\t *\n\t * @param type the type\n\t *\n\t * @return the name\n\t */\n\tpublic static String getName(String type) {\n\t\tfor (UacMenuStatusEnum ele : UacMenuStatusEnum.values()) {\n\t\t\tif (type.equals(ele.getType())) {\n\t\t\t\treturn ele.getName();\n\t\t\t}\n\t\t}\n\t\treturn null;\n\t}\n\n\t/**\n\t * Gets enum.\n\t *\n\t * @param type the type\n\t *\n\t * @return the enum\n\t */\n\tpublic static UacMenuStatusEnum getEnum(String type) {\n\t\tfor (UacMenuStatusEnum ele : UacMenuStatusEnum.values()) {\n\t\t\tif (type.equals(ele.getType())) {\n\t\t\t\treturn ele;\n\t\t\t}\n\t\t}\n\t\treturn UacMenuStatusEnum.ENABLE;\n\t}\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/model/enums/UacRoleStatusEnum.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：UacRoleStatusEnum.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.model.enums;\n\n\n/**\n * The enum Uac role status enum.\n *\n * @author paascloud.net@gmail.com\n */\npublic enum UacRoleStatusEnum {\n\t/**\n\t * 启用\n\t */\n\tENABLE(\"ENABLE\", \"启用\"),\n\t/**\n\t * 禁用\n\t */\n\tDISABLE(\"DISABLE\", \"禁用\");\n\n\t/**\n\t * The Type.\n\t */\n\tString type;\n\t/**\n\t * The Name.\n\t */\n\tString name;\n\n\tUacRoleStatusEnum(String type, String name) {\n\t\tthis.type = type;\n\t\tthis.name = name;\n\t}\n\n\t/**\n\t * Gets type.\n\t *\n\t * @return the type\n\t */\n\tpublic String getType() {\n\t\treturn type;\n\t}\n\n\t/**\n\t * Gets name.\n\t *\n\t * @return the name\n\t */\n\tpublic String getName() {\n\t\treturn name;\n\t}\n\n\t/**\n\t * Gets name.\n\t *\n\t * @param type the type\n\t *\n\t * @return the name\n\t */\n\tpublic static String getName(String type) {\n\t\tfor (UacRoleStatusEnum ele : UacRoleStatusEnum.values()) {\n\t\t\tif (type.equals(ele.getType())) {\n\t\t\t\treturn ele.getName();\n\t\t\t}\n\t\t}\n\t\treturn null;\n\t}\n\n\t/**\n\t * Gets enum.\n\t *\n\t * @param type the type\n\t *\n\t * @return the enum\n\t */\n\tpublic static UacRoleStatusEnum getEnum(String type) {\n\t\tfor (UacRoleStatusEnum ele : UacRoleStatusEnum.values()) {\n\t\t\tif (type.equals(ele.getType())) {\n\t\t\t\treturn ele;\n\t\t\t}\n\t\t}\n\t\treturn UacRoleStatusEnum.ENABLE;\n\t}\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/model/enums/UacUserSourceEnum.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：UacUserSourceEnum.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.model.enums;\n\nimport java.util.Arrays;\nimport java.util.List;\n\n\n/**\n * The enum Uac user source enum.\n *\n * @author paascloud.net@gmail.com\n */\npublic enum UacUserSourceEnum {\n\n\t/**\n\t * 注册\n\t */\n\tREGISTER(\"REGISTER\", \"注册\"),\n\t/**\n\t * 后台新增\n\t */\n\tINSERT(\"INSERT\", \"后台新增\"),\n\t/**\n\t * 后台导入\n\t */\n\tIMPORT(\"IMPORT\", \"后台导入\"),\n\t/**\n\t * 手机\n\t */\n\tAPP(\"APP\", \"手机\"),;\n\n\t/**\n\t * The Key.\n\t */\n\tString key;\n\t/**\n\t * The Value.\n\t */\n\tString value;\n\n\tUacUserSourceEnum(String key, String value) {\n\t\tthis.key = key;\n\t\tthis.value = value;\n\t}\n\n\t/**\n\t * Gets key.\n\t *\n\t * @return the key\n\t */\n\tpublic String getKey() {\n\t\treturn key;\n\t}\n\n\t/**\n\t * Gets value.\n\t *\n\t * @return the value\n\t */\n\tpublic String getValue() {\n\t\treturn value;\n\t}\n\n\t/**\n\t * 获取key获取value\n\t *\n\t * @param key key\n\t *\n\t * @return value value\n\t */\n\tpublic static String getValue(String key) {\n\t\tfor (UacUserSourceEnum ele : UacUserSourceEnum.values()) {\n\t\t\tif (key.equals(ele.getKey())) {\n\t\t\t\treturn ele.getValue();\n\t\t\t}\n\t\t}\n\t\treturn null;\n\t}\n\n\t/**\n\t * 根据key获取该对象\n\t *\n\t * @param key key\n\t *\n\t * @return this enum\n\t */\n\tpublic static UacUserSourceEnum getEnum(String key) {\n\t\tfor (UacUserSourceEnum ele : UacUserSourceEnum.values()) {\n\t\t\tif (key.equals(ele.getKey())) {\n\t\t\t\treturn ele;\n\t\t\t}\n\t\t}\n\t\treturn null;\n\t}\n\n\t/**\n\t * 获取List集合\n\t *\n\t * @return List list\n\t */\n\tpublic static List<UacUserSourceEnum> getList() {\n\t\treturn Arrays.asList(UacUserSourceEnum.values());\n\t}\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/model/enums/UacUserStatusEnum.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：UacUserStatusEnum.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.model.enums;\n\nimport com.google.common.collect.Lists;\nimport com.google.common.collect.Maps;\n\nimport java.util.Arrays;\nimport java.util.List;\nimport java.util.Map;\n\n\n/**\n * The enum Uac user status enum.\n *\n * @author paascloud.net@gmail.com\n */\npublic enum UacUserStatusEnum {\n\n\t/**\n\t * Enable uac user status enum.\n\t */\n\t/*\n\t * 启用\n\t */\n\tENABLE(\"ENABLE\", \"启用\"),\n\t/**\n\t * 禁用\n\t */\n\tDISABLE(\"DISABLE\", \"禁用\");\n\n\t/**\n\t * The Key.\n\t */\n\tString key;\n\t/**\n\t * The Value.\n\t */\n\tString value;\n\n\tUacUserStatusEnum(String key, String value) {\n\t\tthis.key = key;\n\t\tthis.value = value;\n\t}\n\n\t/**\n\t * Gets key.\n\t *\n\t * @return the key\n\t */\n\tpublic String getKey() {\n\t\treturn key;\n\t}\n\n\t/**\n\t * Gets value.\n\t *\n\t * @return the value\n\t */\n\tpublic String getValue() {\n\t\treturn value;\n\t}\n\n\t/**\n\t * 获取key获取value\n\t *\n\t * @param key key\n\t *\n\t * @return value value\n\t */\n\tpublic static String getValue(String key) {\n\t\tfor (UacUserStatusEnum ele : UacUserStatusEnum.values()) {\n\t\t\tif (key.equals(ele.getKey())) {\n\t\t\t\treturn ele.getValue();\n\t\t\t}\n\t\t}\n\t\treturn null;\n\t}\n\n\t/**\n\t * 根据key获取该对象\n\t *\n\t * @param key key\n\t *\n\t * @return this enum\n\t */\n\tpublic static UacUserStatusEnum getEnum(String key) {\n\t\tfor (UacUserStatusEnum ele : UacUserStatusEnum.values()) {\n\t\t\tif (key.equals(ele.getKey())) {\n\t\t\t\treturn ele;\n\t\t\t}\n\t\t}\n\t\treturn null;\n\t}\n\n\t/**\n\t * 获取List集合\n\t *\n\t * @return List list\n\t */\n\tpublic static List<UacUserStatusEnum> getList() {\n\t\treturn Arrays.asList(UacUserStatusEnum.values());\n\t}\n\n\n\t/**\n\t * 获取map类型集合\n\t *\n\t * @return Map类型List集合 map 2 list\n\t */\n\tpublic static List<Map<String, String>> getMap2List() {\n\t\tList<Map<String, String>> list = Lists.newArrayList();\n\t\tfor (UacUserStatusEnum ele : UacUserStatusEnum.values()) {\n\t\t\tMap<String, String> map = Maps.newHashMap();\n\t\t\tmap.put(\"key\", ele.getKey());\n\t\t\tmap.put(\"value\", ele.getValue());\n\t\t\tlist.add(map);\n\t\t}\n\t\treturn list;\n\t}\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/model/enums/UacUserTokenStatusEnum.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：UacUserTokenStatusEnum.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.model.enums;\n\nimport com.google.common.collect.Lists;\n\nimport java.util.List;\n\n\n/**\n * The enum Uac user token status enum.\n *\n * @author paascloud.net @gmail.com\n */\npublic enum UacUserTokenStatusEnum {\n\t/**\n\t * 启用\n\t */\n\tON_LINE(0, \"在线\"),\n\t/**\n\t * 已刷新\n\t */\n\tON_REFRESH(10, \"已刷新\"),\n\t/**\n\t * 离线\n\t */\n\tOFF_LINE(20, \"离线\");\n\n\t/**\n\t * The Status.\n\t */\n\tint status;\n\t/**\n\t * The Value.\n\t */\n\tString value;\n\n\t/**\n\t * Gets name.\n\t *\n\t * @param status the status\n\t *\n\t * @return the name\n\t */\n\tpublic static String getName(int status) {\n\t\tfor (UacUserTokenStatusEnum ele : UacUserTokenStatusEnum.values()) {\n\t\t\tif (status == ele.getStatus()) {\n\t\t\t\treturn ele.getValue();\n\t\t\t}\n\t\t}\n\t\treturn null;\n\t}\n\n\tUacUserTokenStatusEnum(int status, String value) {\n\t\tthis.status = status;\n\t\tthis.value = value;\n\t}\n\n\t/**\n\t * Gets status.\n\t *\n\t * @return the status\n\t */\n\tpublic int getStatus() {\n\t\treturn status;\n\t}\n\n\t/**\n\t * Gets value.\n\t *\n\t * @return the value\n\t */\n\tpublic String getValue() {\n\t\treturn value;\n\t}\n\n\tprivate static List<Integer> getStatusList() {\n\t\tList<Integer> list = Lists.newArrayList();\n\t\tfor (UacUserTokenStatusEnum ele : UacUserTokenStatusEnum.values()) {\n\t\t\tlist.add(ele.getStatus());\n\t\t}\n\t\treturn list;\n\t}\n\n\t/**\n\t * Contains boolean.\n\t *\n\t * @param status the status\n\t *\n\t * @return the boolean\n\t */\n\tpublic static boolean contains(Integer status) {\n\t\tList<Integer> statusList = getStatusList();\n\t\treturn statusList.contains(status);\n\t}\n}"
  },
  {
    "path": "paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/model/enums/UacUserTypeEnum.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：UacUserTypeEnum.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.model.enums;\n\nimport java.util.Arrays;\nimport java.util.List;\n\n\n/**\n * The enum Uac user type enum.\n *\n * @author paascloud.net@gmail.com\n */\npublic enum UacUserTypeEnum {\n\n\t/**\n\t * 运营\n\t */\n\tOPERATE(\"1000\", \"运营\"),;\n\n\t/**\n\t * The Key.\n\t */\n\tString key;\n\t/**\n\t * The Value.\n\t */\n\tString value;\n\n\tUacUserTypeEnum(String key, String value) {\n\t\tthis.key = key;\n\t\tthis.value = value;\n\t}\n\n\t/**\n\t * Gets key.\n\t *\n\t * @return the key\n\t */\n\tpublic String getKey() {\n\t\treturn key;\n\t}\n\n\t/**\n\t * Gets value.\n\t *\n\t * @return the value\n\t */\n\tpublic String getValue() {\n\t\treturn value;\n\t}\n\n\t/**\n\t * 获取key获取value\n\t *\n\t * @param key key\n\t *\n\t * @return value value\n\t */\n\tpublic static String getValue(String key) {\n\t\tfor (UacUserTypeEnum ele : UacUserTypeEnum.values()) {\n\t\t\tif (key.equals(ele.getKey())) {\n\t\t\t\treturn ele.getValue();\n\t\t\t}\n\t\t}\n\t\treturn null;\n\t}\n\n\t/**\n\t * 根据key获取该对象\n\t *\n\t * @param key key\n\t *\n\t * @return this enum\n\t */\n\tpublic static UacUserTypeEnum getEnum(String key) {\n\t\tfor (UacUserTypeEnum ele : UacUserTypeEnum.values()) {\n\t\t\tif (key.equals(ele.getKey())) {\n\t\t\t\treturn ele;\n\t\t\t}\n\t\t}\n\t\treturn null;\n\t}\n\n\t/**\n\t * 获取List集合\n\t *\n\t * @return List list\n\t */\n\tpublic static List<UacUserTypeEnum> getList() {\n\t\treturn Arrays.asList(UacUserTypeEnum.values());\n\t}\n\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/model/enums/ZtreeAuthTypeEnum.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：ZtreeAuthTypeEnum.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.model.enums;\n\n\n/**\n * The enum Ztree auth type enum.\n *\n * @author paascloud.net@gmail.com\n */\npublic enum ZtreeAuthTypeEnum {\n\t/**\n\t * 菜单\n\t */\n\tMENU(\"MENU\", \"菜单\"),\n\t/**\n\t * 按钮\n\t */\n\tBUTTON(\"BUTTON\", \"按钮\");\n\n\t/**\n\t * The Type.\n\t */\n\tString type;\n\t/**\n\t * The Name.\n\t */\n\tString name;\n\n\tZtreeAuthTypeEnum(String type, String name) {\n\t\tthis.type = type;\n\t\tthis.name = name;\n\t}\n\n\t/**\n\t * Gets type.\n\t *\n\t * @return the type\n\t */\n\tpublic String getType() {\n\t\treturn type;\n\t}\n\n\t/**\n\t * Gets name.\n\t *\n\t * @return the name\n\t */\n\tpublic String getName() {\n\t\treturn name;\n\t}\n\n\t/**\n\t * Gets name.\n\t *\n\t * @param type the type\n\t *\n\t * @return the name\n\t */\n\tpublic static String getName(String type) {\n\t\tfor (ZtreeAuthTypeEnum ele : ZtreeAuthTypeEnum.values()) {\n\t\t\tif (type.equals(ele.getType())) {\n\t\t\t\treturn ele.getName();\n\t\t\t}\n\t\t}\n\t\treturn null;\n\t}\n\n\t/**\n\t * Gets enum.\n\t *\n\t * @param type the type\n\t *\n\t * @return the enum\n\t */\n\tpublic static ZtreeAuthTypeEnum getEnum(String type) {\n\t\tfor (ZtreeAuthTypeEnum ele : ZtreeAuthTypeEnum.values()) {\n\t\t\tif (type.equals(ele.getType())) {\n\t\t\t\treturn ele;\n\t\t\t}\n\t\t}\n\t\treturn ZtreeAuthTypeEnum.MENU;\n\t}\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/model/vo/ActionVo.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：ActionVo.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.model.vo;\n\nimport com.paascloud.base.dto.BaseVo;\nimport io.swagger.annotations.ApiModel;\nimport lombok.Data;\nimport lombok.EqualsAndHashCode;\n\n/**\n * The class Action vo.\n *\n * @author paascloud.net @gmail.com\n */\n@EqualsAndHashCode(callSuper = true)\n@Data\n@ApiModel\npublic class ActionVo extends BaseVo {\n\tprivate static final long serialVersionUID = 2019306004446193459L;\n\t/**\n\t * 资源路径\n\t */\n\tprivate String url;\n\n\t/**\n\t * 权限名称\n\t */\n\tprivate String actionName;\n\n\t/**\n\t * 权限\n\t */\n\tprivate String actionCode;\n\n\t/**\n\t * 状态\n\t */\n\tprivate String status;\n\n\t/**\n\t * 备注\n\t */\n\tprivate String remark;\n\n\t/**\n\t * 菜单ID\n\t */\n\tprivate Long menuId;\n\n\t/**\n\t * 菜单名称\n\t */\n\tprivate String menuName;\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/model/vo/BindAuthVo.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：BindAuthVo.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.model.vo;\n\n\nimport io.swagger.annotations.ApiModel;\nimport lombok.Data;\n\nimport java.util.List;\n\n/**\n * The class Bind auth vo.\n *\n * @author paascloud.net @gmail.com\n */\n@Data\n@ApiModel\npublic class BindAuthVo {\n\t/**\n\t * 包含按钮权限和菜单权限\n\t */\n\tprivate List<MenuVo> authTree;\n\t/**\n\t * 该角色含有的权限ID\n\t */\n\tprivate List<Long> checkedAuthList;\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/model/vo/ElementTreeVo.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：ElementTreeVo.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.model.vo;\n\nimport lombok.Data;\n\nimport java.io.Serializable;\nimport java.util.List;\n\n/**\n * The class Element tree vo.\n *\n * @author paascloud.net@gmail.com\n */\n@Data\npublic class ElementTreeVo implements Serializable {\n\tprivate static final long serialVersionUID = -7266614376023024646L;\n\n\tprivate String label;\n\n\tprivate List<ElementTreeVo> children;\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/model/vo/GroupZtreeVo.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：GroupZtreeVo.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.model.vo;\n\nimport com.fasterxml.jackson.annotation.JsonFormat;\nimport lombok.Getter;\nimport lombok.Setter;\nimport org.springframework.format.annotation.DateTimeFormat;\n\nimport java.io.Serializable;\nimport java.util.Date;\n\n/**\n * The class Group z tree vo.\n *\n * @author paascloud.net@gmail.com\n */\n@Getter\n@Setter\npublic class GroupZtreeVo extends ZtreeResponseVo implements Serializable {\n\n\tprivate static final long serialVersionUID = 8835704500635133372L;\n\t/**\n\t * 组织类型\n\t */\n\tprivate String groupType;\n\t/**\n\t * 组织编码\n\t */\n\tprivate String groupCode;\n\n\t/**\n\t * 组织流水号\n\t */\n\tprivate String groupSerialNo;\n\n\t/**\n\t * 组织名称\n\t */\n\tprivate String groupName;\n\n\t/**\n\t * 详细地址\n\t */\n\tprivate String groupAddress;\n\n\t/**\n\t * 所在城市\n\t */\n\tprivate String groupCity;\n\n\t/**\n\t * 联系人\n\t */\n\tprivate String contact;\n\n\t/**\n\t * 联系人电话\n\t */\n\tprivate String contactPhone;\n\n\t/**\n\t * 创建人\n\t */\n\tprivate String creator;\n\n\t/**\n\t * 图标样式\n\t */\n\tprivate String iconSkin;\n\n\t/**\n\t * 创建时间\n\t */\n\t@DateTimeFormat(pattern = \"yyyy-MM-dd\")\n\t@JsonFormat(pattern = \"yyyy-MM-dd HH:mm:ss\", timezone = \"GMT+8\")\n\tprivate Date createdTime;\n\n\t/**\n\t * 状态\n\t */\n\tprivate int status;\n\n\t/**\n\t * 层级\n\t */\n\tprivate Integer level;\n\t/**\n\t * 是否是节点\n\t */\n\tprivate Integer leaf;\n\n\t/**\n\t * Equals boolean.\n\t *\n\t * @param o the o\n\t *\n\t * @return the boolean\n\t */\n\t@Override\n\tpublic boolean equals(Object o) {\n\t\tif (this == o) {\n\t\t\treturn true;\n\t\t}\n\t\tif (o == null || getClass() != o.getClass()) {\n\t\t\treturn false;\n\t\t}\n\t\tif (!super.equals(o)) {\n\t\t\treturn false;\n\t\t}\n\n\t\tGroupZtreeVo that = (GroupZtreeVo) o;\n\n\t\treturn this.getId().equals(that.getId());\n\n\t}\n\n\t@Override\n\tpublic int hashCode() {\n\t\treturn super.hashCode();\n\t}\n\n\t/**\n\t * To string string.\n\t *\n\t * @return the string\n\t */\n\t@Override\n\tpublic String toString() {\n\t\treturn \"GroupZTreeVo{\" +\n\t\t\t\t\"groupType='\" + groupType + '\\'' +\n\t\t\t\t\", groupCode='\" + groupCode + '\\'' +\n\t\t\t\t\", groupSerialNo='\" + groupSerialNo + '\\'' +\n\t\t\t\t\", groupName='\" + groupName + '\\'' +\n\t\t\t\t\", groupAddress='\" + groupAddress + '\\'' +\n\t\t\t\t\", groupCity='\" + groupCity + '\\'' +\n\t\t\t\t\", contact='\" + contact + '\\'' +\n\t\t\t\t\", contactPhone='\" + contactPhone + '\\'' +\n\t\t\t\t\", creator='\" + creator + '\\'' +\n\t\t\t\t\", iconSkin='\" + iconSkin + '\\'' +\n\t\t\t\t\", createdTime=\" + createdTime +\n\t\t\t\t\", status='\" + status + '\\'' +\n\t\t\t\t\", level=\" + level +\n\t\t\t\t\", leaf=\" + leaf +\n\t\t\t\t'}';\n\t}\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/model/vo/JqTreeResponseVo.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：JqTreeResponseVo.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.model.vo;\n\n\nimport lombok.Data;\n\nimport java.util.Date;\n\n/**\n * The class Jq tree response vo.\n *\n * @author paascloud.net@gmail.com\n */\n@Data\npublic class JqTreeResponseVo {\n\n\t/**\n\t * 菜单ID\n\t */\n\tprivate Long id;\n\n\t/**\n\t * 父菜单ID\n\t */\n\tprivate Long pid;\n\n\t/**\n\t * 层级(最多三级1,2,3)\n\t */\n\tprivate Integer level;\n\n\t/**\n\t * 是否叶子节点,1不是0是\n\t */\n\tprivate boolean isLeaf;\n\n\tprivate boolean expanded;\n\n\t/**\n\t * 菜单编码\n\t */\n\tprivate String menuCode;\n\n\t/**\n\t * 菜单名称\n\t */\n\tprivate String menuName;\n\n\t/**\n\t * 状态\n\t */\n\tprivate int status;\n\n\t/**\n\t * 菜单URL\n\t */\n\tprivate String url;\n\n\t/**\n\t * 序号\n\t */\n\tprivate String number;\n\n\t/**\n\t * 备注(研发中心)\n\t */\n\tprivate String remark;\n\n\t/**\n\t * 创建人\n\t */\n\tprivate String creator;\n\n\t/**\n\t * 创建人ID\n\t */\n\tprivate Long creatorId;\n\n\t/**\n\t * 创建时间\n\t */\n\tprivate Date createdTime;\n\n\t/**\n\t * 最近操作人\n\t */\n\tprivate String lastOperator;\n\n\t/**\n\t * 最后操作人ID\n\t */\n\tprivate String lastOperatorId;\n\n\t/**\n\t * 更新时间\n\t */\n\tprivate Date updateTime;\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/model/vo/KaptchaVo.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：KaptchaVo.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.model.vo;\n\nimport io.swagger.annotations.Api;\nimport lombok.Data;\n\n/**\n * The class Kaptcha vo.\n *\n * @author paascloud.net @gmail.com\n */\n@Data\n@Api\npublic class KaptchaVo {\n\tprivate String cookieCode;\n\tprivate String base64Code;\n\tprivate String kaptchaCode;\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/model/vo/RoleVo.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：RoleVo.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.model.vo;\n\nimport com.paascloud.base.dto.BaseVo;\nimport lombok.Data;\nimport lombok.EqualsAndHashCode;\n\n/**\n * The class Role vo.\n *\n * @author paascloud.net @gmail.com\n */\n@EqualsAndHashCode(callSuper = true)\n@Data\npublic class RoleVo extends BaseVo {\n\n\tprivate static final long serialVersionUID = 3819529748816533170L;\n\n\t/**\n\t * 角色编码\n\t */\n\tprivate String roleCode;\n\n\tprivate String roleName;\n\n\t/**\n\t * 状态\n\t */\n\tprivate String status;\n\n\t/**\n\t * 备注\n\t */\n\tprivate String remark;\n}"
  },
  {
    "path": "paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/model/vo/UserBindRoleVo.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：UserBindRoleVo.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.model.vo;\n\nimport com.paascloud.provider.model.dto.user.BindRoleDto;\nimport io.swagger.annotations.ApiModel;\nimport io.swagger.annotations.ApiModelProperty;\nimport lombok.Data;\n\nimport java.io.Serializable;\nimport java.util.Set;\n\n/**\n * The class Role bind user dto.\n *\n * @author paascloud.net@gmail.com\n */\n@Data\n@ApiModel(value = \"角色绑定用户\")\npublic class UserBindRoleVo implements Serializable {\n\n\tprivate static final long serialVersionUID = -2521583668470612548L;\n\t/**\n\t * 未绑定的用户集合\n\t */\n\t@ApiModelProperty(value = \"所有用户集合\")\n\tprivate Set<BindRoleDto> allRoleSet;\n\n\t/**\n\t * 已经绑定的用户集合\n\t */\n\t@ApiModelProperty(value = \"已经绑定的用户集合\")\n\tprivate Set<Long> alreadyBindRoleIdSet;\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/model/vo/UserTokenVo.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：UserTokenVo.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.model.vo;\n\nimport com.paascloud.base.dto.BaseVo;\nimport lombok.Data;\nimport lombok.EqualsAndHashCode;\n\nimport java.util.Date;\n\n/**\n * The class User token vo.\n *\n * @author paascloud.net @gmail.com\n */\n@EqualsAndHashCode(callSuper = true)\n@Data\npublic class UserTokenVo extends BaseVo {\n\tprivate static final long serialVersionUID = -7181619498770168776L;\n\n\t/**\n\t * 登录名\n\t */\n\tprivate String loginName;\n\n\t/**\n\t * 姓名\n\t */\n\tprivate String userName;\n\n\t/**\n\t * 用户ID\n\t */\n\tprivate Long userId;\n\n\t/**\n\t * 登陆人Ip地址\n\t */\n\tprivate String loginIp;\n\n\t/**\n\t * 登录地址\n\t */\n\tprivate String loginLocation;\n\n\t/**\n\t * 登录地址\n\t */\n\tprivate Date loginTime;\n\n\t/**\n\t * 操作系统\n\t */\n\tprivate String os;\n\n\t/**\n\t * 浏览器类型\n\t */\n\tprivate String browser;\n\n\t/**\n\t * 访问token\n\t */\n\tprivate String accessToken;\n\n\t/**\n\t * 刷新token\n\t */\n\tprivate String refreshToken;\n\n\t/**\n\t * 访问token的生效时间(秒)\n\t */\n\tprivate Integer accessTokenValidity;\n\n\t/**\n\t * 刷新token的生效时间(秒)\n\t */\n\tprivate Integer refreshTokenValidity;\n\n\t/**\n\t * 0 在线 10已刷新 20 离线\n\t */\n\tprivate Integer status;\n\n\t/**\n\t * 组织名称\n\t */\n\tprivate String groupName;\n\n\t/**\n\t * 失效时间(秒)\n\t */\n\tprivate Integer expiresIn;\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/model/vo/UserVo.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：UserVo.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.model.vo;\n\nimport com.fasterxml.jackson.annotation.JsonFormat;\nimport com.paascloud.base.dto.BaseVo;\nimport com.paascloud.provider.model.domain.UacRole;\nimport lombok.Data;\nimport lombok.EqualsAndHashCode;\nimport org.springframework.format.annotation.DateTimeFormat;\n\nimport java.util.Date;\nimport java.util.List;\nimport java.util.Set;\n\n\n/**\n * The class User vo.\n *\n * @author paascloud.net@gmail.com\n */\n@EqualsAndHashCode(callSuper = true)\n@Data\npublic class UserVo extends BaseVo {\n\n\tprivate static final long serialVersionUID = -5489240986004922469L;\n\n\t/**\n\t * 登录名\n\t */\n\tprivate String loginName;\n\n\t/**\n\t * 工号\n\t */\n\tprivate String userCode;\n\n\t/**\n\t * 姓名\n\t */\n\tprivate String userName;\n\n\t/**\n\t * 手机号\n\t */\n\tprivate String mobileNo;\n\n\t/**\n\t * 状态\n\t */\n\tprivate String status;\n\n\t/**\n\t * 用户来源\n\t */\n\tprivate String userSource;\n\n\t/**\n\t * 操作员类型（1:超级管理员, 0:普通操作员）\n\t */\n\tprivate String type;\n\n\t/**\n\t * 最后登录IP地址\n\t */\n\tprivate String lastLoginIp;\n\n\t/**\n\t * 最后登录时间\n\t */\n\t@DateTimeFormat(pattern = \"yyyy-MM-dd HH:mm:ss\")\n\t@JsonFormat(pattern = \"yyyy-MM-dd HH:mm:ss\", timezone = \"GMT+8\")\n\tprivate Date lastLoginTime;\n\n\t/**\n\t * 组织名称\n\t */\n\tprivate String groupName;\n\n\t/**\n\t * 用户角色信息\n\t */\n\tprivate Set<UacRole> roles;\n\n\t/**\n\t * 用户拥有的菜单权限和按钮权限\n\t */\n\tprivate List<MenuVo> authTree;\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/model/vo/ViewMenuVo.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：ViewMenuVo.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.model.vo;\n\nimport com.paascloud.base.dto.BaseVo;\nimport io.swagger.annotations.ApiModel;\nimport lombok.Data;\nimport lombok.EqualsAndHashCode;\n\nimport java.io.Serializable;\n\n/**\n * The class Uac menu.\n *\n * @author paascloud.net@gmail.com\n */\n@EqualsAndHashCode(callSuper = true)\n@Data\n@ApiModel\npublic class ViewMenuVo extends BaseVo implements Serializable {\n\n\tprivate static final long serialVersionUID = 2713936834061516613L;\n\t/**\n\t * 菜单编码\n\t */\n\tprivate String menuCode;\n\n\t/**\n\t * 菜单名称\n\t */\n\tprivate String menuName;\n\n\t/**\n\t * 状态\n\t */\n\tprivate String status;\n\n\t/**\n\t * 菜单URL\n\t */\n\tprivate String url;\n\n\t/**\n\t * 图标\n\t */\n\tprivate String icon;\n\n\t/**\n\t * 父ID\n\t */\n\tprivate Long pid;\n\n\t/**\n\t * 上级菜单名称\n\t */\n\tprivate String parentMenuName;\n\n\t/**\n\t * 层级(最多三级1,2,3)\n\t */\n\tprivate Integer level;\n\n\t/**\n\t * 是否叶子节点,1不是0是\n\t */\n\tprivate Integer leaf;\n\n\t/**\n\t * 序号\n\t */\n\tprivate Integer number;\n\n\t/**\n\t * 备注\n\t */\n\tprivate String remark;\n\t/**\n\t * 系统ID\n\t */\n\tprivate Long applicationId;\n}"
  },
  {
    "path": "paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/model/vo/ZtreeResponseVo.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：ZtreeResponseVo.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.model.vo;\n\n\nimport com.paascloud.provider.model.enums.ZtreeAuthTypeEnum;\n\nimport java.io.Serializable;\n\n/**\n * The class Z tree response vo.\n *\n * @author paascloud.net@gmail.com\n */\npublic class ZtreeResponseVo implements Serializable {\n\n\tprivate static final long serialVersionUID = -5567984072691093330L;\n\n\tprivate Long id;\n\n\tprivate Long pId;\n\n\tprivate String name;\n\n\tprivate boolean open;\n\n\t/**\n\t * 菜单选中状态, true选中, false为未选中\n\t */\n\tprivate boolean checked;\n\n\tprivate String iconOpen;\n\n\tprivate String iconClose;\n\n\t/**\n\t * {@link ZtreeAuthTypeEnum}\n\t */\n\tprivate String type;\n\n\t/**\n\t * Gets id.\n\t *\n\t * @return the id\n\t */\n\tpublic Long getId() {\n\t\treturn id;\n\t}\n\n\t/**\n\t * Sets id.\n\t *\n\t * @param id the id\n\t */\n\tpublic void setId(Long id) {\n\t\tthis.id = id;\n\t}\n\n\t/**\n\t * Gets id.\n\t *\n\t * @return the id\n\t */\n\tpublic Long getpId() {\n\t\treturn pId;\n\t}\n\n\t/**\n\t * Sets id.\n\t *\n\t * @param pId the p id\n\t */\n\tpublic void setpId(Long pId) {\n\t\tthis.pId = pId;\n\t}\n\n\t/**\n\t * Gets name.\n\t *\n\t * @return the name\n\t */\n\tpublic String getName() {\n\t\treturn name;\n\t}\n\n\t/**\n\t * Sets name.\n\t *\n\t * @param name the name\n\t */\n\tpublic void setName(String name) {\n\t\tthis.name = name;\n\t}\n\n\t/**\n\t * Is open boolean.\n\t *\n\t * @return the boolean\n\t */\n\tpublic boolean isOpen() {\n\t\treturn open;\n\t}\n\n\t/**\n\t * Sets open.\n\t *\n\t * @param open the open\n\t */\n\tpublic void setOpen(boolean open) {\n\t\tthis.open = open;\n\t}\n\n\t/**\n\t * Gets icon open.\n\t *\n\t * @return the icon open\n\t */\n\tpublic String getIconOpen() {\n\t\treturn iconOpen;\n\t}\n\n\t/**\n\t * Sets icon open.\n\t *\n\t * @param iconOpen the icon open\n\t */\n\tpublic void setIconOpen(String iconOpen) {\n\t\tthis.iconOpen = iconOpen;\n\t}\n\n\t/**\n\t * Gets icon close.\n\t *\n\t * @return the icon close\n\t */\n\tpublic String getIconClose() {\n\t\treturn iconClose;\n\t}\n\n\t/**\n\t * Sets icon close.\n\t *\n\t * @param iconClose the icon close\n\t */\n\tpublic void setIconClose(String iconClose) {\n\t\tthis.iconClose = iconClose;\n\t}\n\n\t/**\n\t * Gets type.\n\t *\n\t * @return the type\n\t */\n\tpublic String getType() {\n\t\treturn type;\n\t}\n\n\t/**\n\t * Sets type.\n\t *\n\t * @param type the type\n\t */\n\tpublic void setType(String type) {\n\t\tthis.type = type;\n\t}\n\n\t/**\n\t * Equals boolean.\n\t *\n\t * @param o the o\n\t *\n\t * @return the boolean\n\t */\n\t@Override\n\tpublic boolean equals(Object o) {\n\t\tif (this == o) {\n\t\t\treturn true;\n\t\t}\n\t\tif (o == null || getClass() != o.getClass()) {\n\t\t\treturn false;\n\t\t}\n\n\t\tZtreeResponseVo that = (ZtreeResponseVo) o;\n\n\t\treturn id != null ? id.equals(that.id) : that.id == null;\n\n\t}\n\n\t/**\n\t * Hash code int.\n\t *\n\t * @return the int\n\t */\n\t@Override\n\tpublic int hashCode() {\n\t\treturn id != null ? id.hashCode() : 0;\n\t}\n\n\t/**\n\t * Is checked boolean.\n\t *\n\t * @return the boolean\n\t */\n\tpublic boolean isChecked() {\n\t\treturn checked;\n\t}\n\n\t/**\n\t * Sets checked.\n\t *\n\t * @param checked the checked\n\t */\n\tpublic void setChecked(boolean checked) {\n\t\tthis.checked = checked;\n\t}\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/model/vo/role/MenuCountVo.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：MenuCountVo.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.model.vo.role;\n\nimport lombok.Data;\n\n/**\n * 一级菜单下绑定子菜单个数\n *\n * @author paascloud.net @gmail.com\n */\n@Data\npublic class MenuCountVo {\n\n\t/**\n\t * 一级菜单id\n\t */\n\tprivate Long id;\n\n\t/**\n\t * 一级菜单名称\n\t */\n\tprivate String menuName;\n\n\t/**\n\t * 一级菜单下绑定子菜单个数\n\t */\n\tprivate int childNum;\n\n\t/**\n\t * Equals boolean.\n\t *\n\t * @param obj the obj\n\t *\n\t * @return the boolean\n\t */\n\t@Override\n\tpublic boolean equals(Object obj) {\n\t\tif (obj == null) {\n\t\t\treturn false;\n\t\t} else {\n\t\t\tif (obj instanceof MenuCountVo) {\n\t\t\t\tMenuCountVo m = (MenuCountVo) obj;\n\t\t\t\tif (m.id.equals(this.id)) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn false;\n\t\t}\n\t}\n\n\t/**\n\t * Hash code int.\n\t *\n\t * @return the int\n\t */\n\t@Override\n\tpublic int hashCode() {\n\t\treturn id.hashCode();\n\t}\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/model/vo/role/RoleZtreeVo.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：RoleZtreeVo.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.model.vo.role;\n\n\nimport com.paascloud.provider.model.vo.ZtreeResponseVo;\n\nimport java.io.Serializable;\n\n/**\n * 角色树\n *\n * @author paascloud.net @gmail.com\n */\npublic class RoleZtreeVo extends ZtreeResponseVo implements Serializable {\n\n\tprivate static final long serialVersionUID = 2094987521303893688L;\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/model/vo/treeview/AdditionalParameters.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：AdditionalParameters.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.model.vo.treeview;\n\nimport com.fasterxml.jackson.annotation.JsonProperty;\nimport io.swagger.annotations.ApiModel;\nimport lombok.Data;\n\nimport java.util.Map;\n\n/**\n * The class Additional parameters.\n *\n * @author paascloud.net@gmail.com\n */\n@Data\n@ApiModel\npublic class AdditionalParameters {\n\t/**\n\t * 子节点列表\n\t */\n\tprivate Map<String, Item> children;\n\n\t/**\n\t * 节点的Id\n\t */\n\tprivate Long id;\n\n\t/**\n\t * 是否有选中属性\n\t */\n\t@JsonProperty(\"item-selected\")\n\tprivate boolean itemSelected;\n\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/model/vo/treeview/Item.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：Item.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.model.vo.treeview;\n\nimport io.swagger.annotations.ApiModel;\nimport lombok.Data;\n\n/**\n * The class Item.\n *\n * @author paascloud.net@gmail.com\n */\n@Data\n@ApiModel\npublic class Item {\n\n\tprivate Long id;\n\t/**\n\t * 节点的名字\n\t */\n\tprivate String text;\n\n\t/**\n\t * 节点的类型：\"item\":文件 \"folder\":目录\n\t */\n\tprivate String type;\n\n\t/**\n\t * 子节点的信息\n\t */\n\tprivate AdditionalParameters additionalParameters;\n\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/model/vo/treeview/ItemType.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：ItemType.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.model.vo.treeview;\n\n/**\n * The class Item type.\n *\n * @author paascloud.net@gmail.com\n */\npublic interface ItemType {\n\t/**\n\t * 文件夹\n\t */\n\tString NODE_FOLDER = \"folder\";\n\t/**\n\t * 叶子节点\n\t */\n\tString NODE_ITEM = \"item\";\n}\n  "
  },
  {
    "path": "paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/mq/consumer/listener/UacPushMessageListener.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：UacPushMessageListener.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.mq.consumer.listener;\n\nimport com.paascloud.PublicUtil;\nimport com.paascloud.base.constant.AliyunMqTopicConstants;\nimport com.paascloud.core.mq.MqMessage;\nimport com.paascloud.provider.annotation.MqConsumerStore;\nimport com.paascloud.provider.service.MqMessageService;\nimport com.paascloud.provider.service.RedisService;\nimport lombok.extern.slf4j.Slf4j;\nimport org.apache.rocketmq.client.consumer.listener.ConsumeConcurrentlyContext;\nimport org.apache.rocketmq.client.consumer.listener.ConsumeConcurrentlyStatus;\nimport org.apache.rocketmq.client.consumer.listener.MessageListenerConcurrently;\nimport org.apache.rocketmq.common.message.MessageExt;\nimport org.springframework.stereotype.Component;\n\nimport javax.annotation.Resource;\nimport java.util.List;\nimport java.util.concurrent.TimeUnit;\n\n\n/**\n * The class Uac push message listener.\n *\n * @author paascloud.net @gmail.com\n */\n@Slf4j\n@Component\npublic class UacPushMessageListener implements MessageListenerConcurrently {\n\t@Resource\n\tprivate MqMessageService mqMessageService;\n\t@Resource\n\tprivate RedisService redisService;\n\n\t/**\n\t * Consume message consume concurrently status.\n\t *\n\t * @param messageExtList             the message ext list\n\t * @param consumeConcurrentlyContext the consume concurrently context\n\t *\n\t * @return the consume concurrently status\n\t */\n\t@Override\n\t@MqConsumerStore\n\tpublic ConsumeConcurrentlyStatus consumeMessage(List<MessageExt> messageExtList, ConsumeConcurrentlyContext consumeConcurrentlyContext) {\n\t\tMessageExt msg = messageExtList.get(0);\n\t\tString body = new String(msg.getBody());\n\t\tString topicName = msg.getTopic();\n\t\tString tags = msg.getTags();\n\t\tString keys = msg.getKeys();\n\n\t\ttry {\n\t\t\tMqMessage.checkMessage(body, topicName, tags, keys);\n\t\t\tString mqKV = redisService.getKey(keys);\n\t\t\tif (PublicUtil.isNotEmpty(mqKV)) {\n\t\t\t\tlog.error(\"MQ消费Topic={},tag={},key={}, 重复消费\", topicName, tags, keys);\n\t\t\t\treturn ConsumeConcurrentlyStatus.CONSUME_SUCCESS;\n\t\t\t}\n\t\t\tif (AliyunMqTopicConstants.MqTopicEnum.TPC_TOPIC.getTopic().equals(topicName)) {\n\t\t\t\tmqMessageService.deleteMessageTopic(body, tags);\n\t\t\t} else {\n\t\t\t\tlog.info(\"OPC订单信息消 topicName={} 不存在\", topicName);\n\t\t\t}\n\t\t} catch (IllegalArgumentException ex) {\n\t\t\tlog.error(\"校验MQ message 失败 ex={}\", ex.getMessage(), ex);\n\t\t} catch (Exception e) {\n\t\t\tlog.error(\"处理MQ message 失败 topicName={}, keys={}, ex={}\", topicName, keys, e.getMessage(), e);\n\t\t\treturn ConsumeConcurrentlyStatus.RECONSUME_LATER;\n\t\t}\n\n\t\tredisService.setKey(keys, keys, 10, TimeUnit.DAYS);\n\t\treturn ConsumeConcurrentlyStatus.CONSUME_SUCCESS;\n\t}\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/mq/producer/EmailProducer.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：EmailProducer.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.mq.producer;\n\nimport com.alibaba.fastjson.JSON;\nimport com.google.common.base.Preconditions;\nimport com.paascloud.RedisKeyUtil;\nimport com.paascloud.base.constant.AliyunMqTopicConstants;\nimport com.paascloud.base.enums.ErrorCodeEnum;\nimport com.paascloud.provider.model.domain.MqMessageData;\nimport com.paascloud.provider.model.dto.PcSendEmailRequest;\nimport com.paascloud.provider.model.enums.UacEmailTemplateEnum;\nimport com.paascloud.provider.model.exceptions.UacBizException;\nimport com.paascloud.provider.service.UacFreeMarkerService;\nimport lombok.extern.slf4j.Slf4j;\nimport org.springframework.stereotype.Component;\n\nimport javax.annotation.Resource;\nimport java.util.Map;\nimport java.util.Set;\n\n/**\n * The class Email producer.\n *\n * @author paascloud.net@gmail.com\n */\n@Component\n@Slf4j\npublic class EmailProducer {\n\t@Resource\n\tprivate UacFreeMarkerService uacFreeMarkerService;\n\n\t/**\n\t * Send email mq.\n\t *\n\t * @param emailSet          the email set\n\t * @param emailTemplateEnum the email template enum\n\t * @param param             the param\n\t */\n\tpublic MqMessageData sendEmailMq(Set<String> emailSet, UacEmailTemplateEnum emailTemplateEnum, AliyunMqTopicConstants.MqTagEnum tagEnum, Map<String, Object> param) {\n\t\tlog.info(\"pcSendEmailRequest - 发送邮件MQ. emailSet={}, param={}\", emailSet, param);\n\t\tString msgBody;\n\t\ttry {\n\n\t\t\tPreconditions.checkArgument(emailTemplateEnum != null, \"邮箱模板信息不存在\");\n\t\t\tPcSendEmailRequest request = new PcSendEmailRequest();\n\n\t\t\tString templateLocation = emailTemplateEnum.getLocation();\n\t\t\tString text = uacFreeMarkerService.getTemplate(param, templateLocation);\n\n\t\t\trequest.setText(text);\n\t\t\trequest.setTo(emailSet);\n\t\t\trequest.setSubject(emailTemplateEnum.getSubject());\n\n\t\t\tmsgBody = JSON.toJSONString(request);\n\t\t} catch (Exception e) {\n\t\t\tlog.error(\"发送邮件验证码 smsMessage转换为json字符串失败\", e);\n\t\t\tthrow new UacBizException(ErrorCodeEnum.UAC10011021);\n\t\t}\n\t\tString topic = tagEnum.getTopic();\n\t\tString tag = tagEnum.getTag();\n\t\tString key = RedisKeyUtil.createMqKey(topic, tag, emailSet.toString(), msgBody);\n\t\treturn new MqMessageData(msgBody, topic, tag, key);\n\t}\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/mq/producer/SmsProducer.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：SmsProducer.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.mq.producer;\n\nimport com.alibaba.fastjson.JSON;\nimport com.google.common.collect.Maps;\nimport com.paascloud.RedisKeyUtil;\nimport com.paascloud.base.constant.AliyunMqTopicConstants;\nimport com.paascloud.base.constant.AliyunSmsConstants;\nimport com.paascloud.base.enums.ErrorCodeEnum;\nimport com.paascloud.provider.model.domain.MqMessageData;\nimport com.paascloud.provider.model.dto.PcSendSmsRequest;\nimport com.paascloud.provider.model.dto.sms.SmsMessage;\nimport com.paascloud.provider.model.exceptions.UacBizException;\nimport lombok.extern.slf4j.Slf4j;\nimport org.springframework.stereotype.Component;\n\nimport java.util.Map;\n\n/**\n * The class Sms producer.\n *\n * @author paascloud.net@gmail.com\n */\n@Slf4j\n@Component\npublic class SmsProducer {\n\n\tpublic MqMessageData sendSmsCodeMq(SmsMessage smsMessage, AliyunSmsConstants.SmsTempletEnum templetEnum) {\n\t\tlog.info(\"sendSmsCodeMq - 发送短信验证码. smsMessage={}\", smsMessage);\n\t\tString msgBody;\n\t\ttry {\n\n\t\t\tPcSendSmsRequest request = new PcSendSmsRequest();\n\t\t\tMap<String, String> map = Maps.newHashMap();\n\t\t\t// 模板参数\n\t\t\tString smsParamName = templetEnum.getSmsParamName();\n\t\t\t// 模板编码\n\t\t\tString templetCode = templetEnum.getTempletCode();\n\t\t\t//替换模板验证码\n\t\t\tmap.put(smsParamName, smsMessage.getSmsCode());\n\t\t\tString param = JSON.toJSONString(map);\n\n\t\t\trequest.setPhoneNumbers(smsMessage.getMobileNo());\n\t\t\trequest.setTemplateCode(templetCode);\n\t\t\trequest.setTemplateParam(param);\n\t\t\trequest.setOutId(smsMessage.getOutId());\n\n\t\t\tmsgBody = JSON.toJSONString(request);\n\t\t} catch (Exception e) {\n\t\t\tlog.error(\"发送短信验证码 smsMessage转换为json字符串失败\", e);\n\t\t\tthrow new UacBizException(ErrorCodeEnum.UAC10011022);\n\t\t}\n\t\tString topic = AliyunMqTopicConstants.MqTopicEnum.SEND_SMS_TOPIC.getTopic();\n\t\tString tag = AliyunMqTopicConstants.MqTagEnum.REGISTER_USER_AUTH_CODE.getTag();\n\t\tString key = RedisKeyUtil.createMqKey(topic, tag, smsMessage.getMobileNo(), msgBody);\n\t\treturn new MqMessageData(msgBody, topic, tag, key);\n\t}\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/security/PcAuthenticationFailureHandler.java",
    "content": "package com.paascloud.provider.security;\n\nimport com.fasterxml.jackson.databind.ObjectMapper;\nimport com.paascloud.wrapper.WrapMapper;\nimport org.springframework.http.HttpStatus;\nimport org.springframework.security.core.AuthenticationException;\nimport org.springframework.security.web.authentication.SimpleUrlAuthenticationFailureHandler;\nimport org.springframework.stereotype.Component;\n\nimport javax.annotation.Resource;\nimport javax.servlet.ServletException;\nimport javax.servlet.http.HttpServletRequest;\nimport javax.servlet.http.HttpServletResponse;\nimport java.io.IOException;\n\n/**\n * APP环境下认证失败处理器\n *\n * @author paascloud.net @gmail.com\n */\n@Component(\"pcAuthenticationFailureHandler\")\npublic class PcAuthenticationFailureHandler extends SimpleUrlAuthenticationFailureHandler {\n\n\t@Resource\n\tprivate ObjectMapper objectMapper;\n\n\t/**\n\t * On authentication failure.\n\t *\n\t * @param request   the request\n\t * @param response  the response\n\t * @param exception the exception\n\t *\n\t * @throws IOException      the io exception\n\t * @throws ServletException the servlet exception\n\t */\n\t@Override\n\tpublic void onAuthenticationFailure(HttpServletRequest request, HttpServletResponse response,\n\t                                    AuthenticationException exception) throws IOException, ServletException {\n\n\t\tlogger.info(\"登录失败\");\n\n\t\t// 记录失败次数 和原因 ip等信息 5次登录失败,锁定用户, 不允许在此登录\n\n\t\tresponse.setStatus(HttpStatus.INTERNAL_SERVER_ERROR.value());\n\t\tresponse.setContentType(\"application/json;charset=UTF-8\");\n\t\tresponse.getWriter().write(objectMapper.writeValueAsString(WrapMapper.error(exception.getMessage())));\n\n\t}\n\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/security/PcAuthenticationSuccessHandler.java",
    "content": "package com.paascloud.provider.security;\n\nimport com.fasterxml.jackson.databind.ObjectMapper;\nimport com.paascloud.core.utils.RequestUtil;\nimport com.paascloud.provider.service.UacUserService;\nimport com.paascloud.security.core.SecurityUser;\nimport com.paascloud.wrapper.WrapMapper;\nimport lombok.extern.slf4j.Slf4j;\nimport org.apache.commons.collections.MapUtils;\nimport org.apache.commons.lang.StringUtils;\nimport org.springframework.http.HttpHeaders;\nimport org.springframework.security.core.Authentication;\nimport org.springframework.security.oauth2.common.OAuth2AccessToken;\nimport org.springframework.security.oauth2.common.exceptions.UnapprovedClientAuthenticationException;\nimport org.springframework.security.oauth2.provider.*;\nimport org.springframework.security.oauth2.provider.token.AuthorizationServerTokenServices;\nimport org.springframework.security.web.authentication.SavedRequestAwareAuthenticationSuccessHandler;\nimport org.springframework.stereotype.Component;\n\nimport javax.annotation.Resource;\nimport javax.servlet.ServletException;\nimport javax.servlet.http.HttpServletRequest;\nimport javax.servlet.http.HttpServletResponse;\nimport java.io.IOException;\n\n\n/**\n * APP环境下认证成功处理器.\n *\n * @author paascloud.net@gmail.com\n */\n@Component(\"pcAuthenticationSuccessHandler\")\n@Slf4j\npublic class PcAuthenticationSuccessHandler extends SavedRequestAwareAuthenticationSuccessHandler {\n\n\t@Resource\n\tprivate ObjectMapper objectMapper;\n\t@Resource\n\tprivate ClientDetailsService clientDetailsService;\n\t@Resource\n\tprivate UacUserService uacUserService;\n\t@Resource\n\tprivate AuthorizationServerTokenServices authorizationServerTokenServices;\n\n\tprivate static final String BEARER_TOKEN_TYPE = \"Basic \";\n\n\t@Override\n\tpublic void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response,\n\t                                    Authentication authentication) throws IOException, ServletException {\n\n\t\tlogger.info(\"登录成功\");\n\n\t\tString header = request.getHeader(HttpHeaders.AUTHORIZATION);\n\n\t\tif (header == null || !header.startsWith(BEARER_TOKEN_TYPE)) {\n\t\t\tthrow new UnapprovedClientAuthenticationException(\"请求头中无client信息\");\n\t\t}\n\n\t\tString[] tokens = RequestUtil.extractAndDecodeHeader(header);\n\t\tassert tokens.length == 2;\n\n\t\tString clientId = tokens[0];\n\t\tString clientSecret = tokens[1];\n\n\t\tClientDetails clientDetails = clientDetailsService.loadClientByClientId(clientId);\n\n\t\tif (clientDetails == null) {\n\t\t\tthrow new UnapprovedClientAuthenticationException(\"clientId对应的配置信息不存在:\" + clientId);\n\t\t} else if (!StringUtils.equals(clientDetails.getClientSecret(), clientSecret)) {\n\t\t\tthrow new UnapprovedClientAuthenticationException(\"clientSecret不匹配:\" + clientId);\n\t\t}\n\n\t\tTokenRequest tokenRequest = new TokenRequest(MapUtils.EMPTY_MAP, clientId, clientDetails.getScope(), \"custom\");\n\n\t\tOAuth2Request oAuth2Request = tokenRequest.createOAuth2Request(clientDetails);\n\n\t\tOAuth2Authentication oAuth2Authentication = new OAuth2Authentication(oAuth2Request, authentication);\n\n\t\tOAuth2AccessToken token = authorizationServerTokenServices.createAccessToken(oAuth2Authentication);\n\t\tSecurityUser principal = (SecurityUser) authentication.getPrincipal();\n\t\tuacUserService.handlerLoginData(token, principal, request);\n\n\t\tlog.info(\"用户【 {} 】记录登录日志\", principal.getUsername());\n\n\t\tresponse.setContentType(\"application/json;charset=UTF-8\");\n\t\tresponse.getWriter().write((objectMapper.writeValueAsString(WrapMapper.ok(token))));\n\n\t}\n\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/security/PcAuthorizationServerConfig.java",
    "content": "package com.paascloud.provider.security;\n\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.context.annotation.Bean;\nimport org.springframework.context.annotation.Configuration;\nimport org.springframework.security.authentication.AuthenticationManager;\nimport org.springframework.security.core.userdetails.UserDetailsService;\nimport org.springframework.security.oauth2.config.annotation.configurers.ClientDetailsServiceConfigurer;\nimport org.springframework.security.oauth2.config.annotation.web.configuration.AuthorizationServerConfigurerAdapter;\nimport org.springframework.security.oauth2.config.annotation.web.configuration.EnableAuthorizationServer;\nimport org.springframework.security.oauth2.config.annotation.web.configurers.AuthorizationServerEndpointsConfigurer;\nimport org.springframework.security.oauth2.config.annotation.web.configurers.AuthorizationServerSecurityConfigurer;\nimport org.springframework.security.oauth2.provider.token.TokenEnhancer;\nimport org.springframework.security.oauth2.provider.token.TokenEnhancerChain;\nimport org.springframework.security.oauth2.provider.token.TokenStore;\nimport org.springframework.security.oauth2.provider.token.store.JwtAccessTokenConverter;\nimport org.springframework.security.web.authentication.logout.LogoutSuccessHandler;\n\nimport javax.annotation.Resource;\nimport java.util.ArrayList;\nimport java.util.List;\n\n\n/**\n * The class Pc authorization server config.\n *\n * @author paascloud.net @gmail.com\n */\n@Configuration\n@EnableAuthorizationServer\npublic class PcAuthorizationServerConfig extends AuthorizationServerConfigurerAdapter {\n\n\t@Autowired\n\tprivate TokenStore tokenStore;\n\t@Autowired\n\tprivate AuthenticationManager authenticationManager;\n\t@Resource\n\tprivate UserDetailsService userDetailsService;\n\t@Resource\n\tprivate RestClientDetailsServiceImpl restClientDetailsService;\n\t@Autowired(required = false)\n\tprivate JwtAccessTokenConverter jwtAccessTokenConverter;\n\n\t@Autowired(required = false)\n\tprivate TokenEnhancer jwtTokenEnhancer;\n\n\t/**\n\t * Configure.\n\t *\n\t * @param security the security\n\t *\n\t * @throws Exception the exception\n\t */\n\t@Override\n\tpublic void configure(AuthorizationServerSecurityConfigurer security) throws Exception {\n\t\tsecurity.tokenKeyAccess(\"permitAll()\");\n\t\tsecurity.allowFormAuthenticationForClients();\n\t}\n\n\t/**\n\t * Configure.\n\t *\n\t * @param clients the clients\n\t *\n\t * @throws Exception the exception\n\t */\n\t@Override\n\tpublic void configure(ClientDetailsServiceConfigurer clients) throws Exception {\n\t\tclients.withClientDetails(restClientDetailsService);\n\t}\n\n\t/**\n\t * Configure.\n\t *\n\t * @param endpoints the endpoints\n\t *\n\t * @throws Exception the exception\n\t */\n\t@Override\n\tpublic void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception {\n\t\tendpoints.tokenStore(tokenStore)\n\t\t\t\t.authenticationManager(authenticationManager)\n\t\t\t\t.userDetailsService(userDetailsService);\n\n\t\tif (jwtAccessTokenConverter != null && jwtTokenEnhancer != null) {\n\t\t\tTokenEnhancerChain enhancerChain = new TokenEnhancerChain();\n\t\t\tList<TokenEnhancer> enhancers = new ArrayList<>();\n\t\t\tenhancers.add(jwtTokenEnhancer);\n\t\t\tenhancers.add(jwtAccessTokenConverter);\n\t\t\tenhancerChain.setTokenEnhancers(enhancers);\n\t\t\tendpoints.tokenEnhancer(enhancerChain).accessTokenConverter(jwtAccessTokenConverter);\n\t\t}\n\t}\n\n\t/**\n\t * 退出时的处理策略配置\n\t *\n\t * @return logout success handler\n\t */\n\t@Bean\n\tpublic LogoutSuccessHandler logoutSuccessHandler() {\n\t\treturn new PcLogoutSuccessHandler();\n\t}\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/security/PcLogoutSuccessHandler.java",
    "content": "package com.paascloud.provider.security;\n\nimport com.fasterxml.jackson.databind.ObjectMapper;\nimport com.paascloud.wrapper.WrapMapper;\nimport lombok.extern.slf4j.Slf4j;\nimport org.springframework.security.core.Authentication;\nimport org.springframework.security.web.authentication.logout.LogoutSuccessHandler;\n\nimport javax.servlet.http.HttpServletRequest;\nimport javax.servlet.http.HttpServletResponse;\nimport java.io.IOException;\n\n/**\n * 默认的退出成功处理器，如果设置了paascloud.security.browser.signOutUrl，则跳到配置的地址上，\n * 如果没配置，则返回json格式的响应。\n *\n * @author paascloud.net @gmail.com\n */\n@Slf4j\npublic class PcLogoutSuccessHandler implements LogoutSuccessHandler {\n\n\tprivate ObjectMapper objectMapper = new ObjectMapper();\n\n\t/**\n\t * On logout success.\n\t *\n\t * @param request        the request\n\t * @param response       the response\n\t * @param authentication the authentication\n\t *\n\t * @throws IOException the io exception\n\t */\n\t@Override\n\tpublic void onLogoutSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication)\n\t\t\tthrows IOException {\n\t\tlog.info(\"退出成功\");\n\t\tresponse.setContentType(\"application/json;charset=UTF-8\");\n\t\tresponse.getWriter().write(objectMapper.writeValueAsString(WrapMapper.ok(\"退出成功\")));\n\t}\n\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/security/PcPermissionAuthorizeConfigProvider.java",
    "content": "package com.paascloud.provider.security;\n\nimport com.paascloud.security.core.authorize.AuthorizeConfigProvider;\nimport org.springframework.core.annotation.Order;\nimport org.springframework.security.config.annotation.web.builders.HttpSecurity;\nimport org.springframework.security.config.annotation.web.configurers.ExpressionUrlAuthorizationConfigurer;\nimport org.springframework.stereotype.Component;\n\n/**\n * The class Pc permission authorize config provider.\n *\n * @author paascloud.net @gmail.com\n */\n@Order\n@Component\npublic class PcPermissionAuthorizeConfigProvider implements AuthorizeConfigProvider {\n\n\t/**\n\t * Config boolean.\n\t *\n\t * @param config the config\n\t *\n\t * @return the boolean\n\t */\n\t@Override\n\tpublic boolean config(ExpressionUrlAuthorizationConfigurer<HttpSecurity>.ExpressionInterceptUrlRegistry config) {\n\t\tconfig\n\t\t\t\t.anyRequest()\n\t\t\t\t.access(\"@permissionService.hasPermission(authentication,request)\");\n\t\treturn true;\n\t}\n\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/security/PcSecurityExpressionHandler.java",
    "content": "package com.paascloud.provider.security;\n\nimport org.springframework.context.ApplicationContext;\nimport org.springframework.context.annotation.Bean;\nimport org.springframework.context.annotation.Configuration;\nimport org.springframework.security.oauth2.provider.expression.OAuth2WebSecurityExpressionHandler;\n\n/**\n * The class My o auth 2 web security expression handler.\n *\n * @author paascloud.net @gmail.com\n */\n@Configuration\npublic class PcSecurityExpressionHandler extends OAuth2WebSecurityExpressionHandler {\n\t@Bean\n\tpublic OAuth2WebSecurityExpressionHandler oAuth2WebSecurityExpressionHandler(ApplicationContext applicationContext) {\n\t\tOAuth2WebSecurityExpressionHandler expressionHandler = new OAuth2WebSecurityExpressionHandler();\n\t\texpressionHandler.setApplicationContext(applicationContext);\n\t\treturn expressionHandler;\n\t}\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/security/RestClientDetailsServiceImpl.java",
    "content": "package com.paascloud.provider.security;\n\nimport com.paascloud.security.core.properties.OAuth2ClientProperties;\nimport com.paascloud.security.core.properties.SecurityProperties;\nimport lombok.extern.slf4j.Slf4j;\nimport org.apache.commons.lang3.ArrayUtils;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.security.oauth2.config.annotation.builders.InMemoryClientDetailsServiceBuilder;\nimport org.springframework.security.oauth2.provider.ClientDetails;\nimport org.springframework.security.oauth2.provider.ClientDetailsService;\nimport org.springframework.security.oauth2.provider.ClientRegistrationException;\nimport org.springframework.stereotype.Component;\n\nimport javax.annotation.PostConstruct;\n\n/**\n * The class Rest client details service.\n *\n * @author paascloud.net @gmail.com\n */\n@Slf4j\n@Component(\"restClientDetailsService\")\npublic class RestClientDetailsServiceImpl implements ClientDetailsService {\n\n\tprivate ClientDetailsService clientDetailsService;\n\n\t@Autowired\n\tprivate SecurityProperties securityProperties;\n\n\t/**\n\t * Init.\n\t */\n\t@PostConstruct\n\tpublic void init() {\n\t\tInMemoryClientDetailsServiceBuilder builder = new InMemoryClientDetailsServiceBuilder();\n\t\tif (ArrayUtils.isNotEmpty(securityProperties.getOauth2().getClients())) {\n\t\t\tfor (OAuth2ClientProperties client : securityProperties.getOauth2().getClients()) {\n\t\t\t\tbuilder.withClient(client.getClientId())\n\t\t\t\t\t\t.secret(client.getClientSecret())\n\t\t\t\t\t\t.authorizedGrantTypes(\"refresh_token\", \"password\", \"client_credentials\")\n\t\t\t\t\t\t.accessTokenValiditySeconds(client.getAccessTokenValidateSeconds())\n\t\t\t\t\t\t.refreshTokenValiditySeconds(client.getRefreshTokenValiditySeconds())\n\t\t\t\t\t\t.scopes(client.getScope());\n\t\t\t}\n\t\t}\n\t\ttry {\n\t\t\tclientDetailsService = builder.build();\n\t\t} catch (Exception e) {\n\t\t\tlog.error(\"init={}\", e.getMessage(), e);\n\t\t}\n\t}\n\n\t/**\n\t * Load client by client id client details.\n\t *\n\t * @param clientId the client id\n\t *\n\t * @return the client details\n\t *\n\t * @throws ClientRegistrationException the client registration exception\n\t */\n\t@Override\n\tpublic ClientDetails loadClientByClientId(String clientId) throws ClientRegistrationException {\n\t\treturn clientDetailsService.loadClientByClientId(clientId);\n\t}\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/security/SecurityUtils.java",
    "content": "package com.paascloud.provider.security;\n\nimport com.google.common.collect.Sets;\nimport lombok.AccessLevel;\nimport lombok.NoArgsConstructor;\nimport org.apache.commons.lang3.StringUtils;\nimport org.springframework.security.core.Authentication;\nimport org.springframework.security.core.GrantedAuthority;\nimport org.springframework.security.core.context.SecurityContextHolder;\nimport org.springframework.security.core.userdetails.UserDetails;\n\nimport java.security.Principal;\nimport java.util.Collection;\nimport java.util.Set;\n\n\n/**\n * The class Security utils.\n *\n * @author paascloud.net @gmail.com\n */\n@NoArgsConstructor(access = AccessLevel.PRIVATE)\npublic final class SecurityUtils {\n\n\tprivate static final String AUTH_LOGIN_AFTER_URL = \"/user/loginAfter/*\";\n\tprivate static final String AUTH_LOGOUT_URL = \"/user/logout\";\n\n\t/**\n\t * Gets current login name.\n\t *\n\t * @return the current login name\n\t */\n\tpublic static String getCurrentLoginName() {\n\n\t\tObject principal = SecurityContextHolder.getContext().getAuthentication().getPrincipal();\n\n\t\tif (principal instanceof UserDetails) {\n\n\t\t\treturn ((UserDetails) principal).getUsername();\n\n\t\t}\n\n\t\tif (principal instanceof Principal) {\n\n\t\t\treturn ((Principal) principal).getName();\n\n\t\t}\n\n\t\treturn String.valueOf(principal);\n\n\t}\n\n\tpublic static Set<String> getCurrentAuthorityUrl() {\n\t\tSet<String> path = Sets.newHashSet();\n\t\tAuthentication authentication = SecurityContextHolder.getContext().getAuthentication();\n\t\tCollection<? extends GrantedAuthority> authorities = authentication.getAuthorities();\n\t\tfor (final GrantedAuthority authority : authorities) {\n\t\t\tString url = authority.getAuthority();\n\t\t\tif (StringUtils.isNotEmpty(url)) {\n\t\t\t\tpath.add(url);\n\t\t\t}\n\t\t}\n\t\tpath.add(AUTH_LOGIN_AFTER_URL);\n\t\tpath.add(AUTH_LOGOUT_URL);\n\t\treturn path;\n\t}\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/security/UacUserDetailsServiceImpl.java",
    "content": "package com.paascloud.provider.security;\n\nimport com.paascloud.provider.model.domain.UacUser;\nimport com.paascloud.provider.service.UacUserService;\nimport com.paascloud.security.core.SecurityUser;\nimport org.springframework.security.authentication.BadCredentialsException;\nimport org.springframework.security.core.GrantedAuthority;\nimport org.springframework.security.core.userdetails.UserDetails;\nimport org.springframework.security.core.userdetails.UserDetailsService;\nimport org.springframework.stereotype.Component;\n\nimport javax.annotation.Resource;\nimport java.util.Collection;\n\n/**\n * The class Uac user details service.\n *\n * @author paascloud.net @gmail.com\n */\n@Component\npublic class UacUserDetailsServiceImpl implements UserDetailsService {\n\n\t@Resource\n\tprivate UacUserService uacUserService;\n\n\t/**\n\t * Load user by username user details.\n\t *\n\t * @param username the username\n\t *\n\t * @return the user details\n\t */\n\t@Override\n\tpublic UserDetails loadUserByUsername(String username) {\n\t\tCollection<GrantedAuthority> grantedAuthorities;\n\t\tUacUser user = uacUserService.findByLoginName(username);\n\t\tif (user == null) {\n\t\t\tthrow new BadCredentialsException(\"用户名不存在或者密码错误\");\n\t\t}\n\t\tuser = uacUserService.findUserInfoByUserId(user.getId());\n\t\tgrantedAuthorities = uacUserService.loadUserAuthorities(user.getId());\n\t\treturn new SecurityUser(user.getId(), user.getLoginName(), user.getLoginPwd(),\n\t\t\t\tuser.getUserName(), user.getGroupId(), user.getGroupName(), user.getStatus(), grantedAuthorities);\n\t}\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/service/EmailService.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：EmailService.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.service;\n\nimport com.paascloud.provider.model.dto.email.SendEmailMessage;\n\n/**\n * The interface Email service.\n *\n * @author paascloud.net @gmail.com\n */\npublic interface EmailService {\n\t/**\n\t * 重置密码发送邮件.\n\t *\n\t * @param email the email\n\t */\n\tvoid submitResetPwdEmail(String email);\n\n\t/**\n\t * 发送验证码\n\t *\n\t * @param sendEmailMessage the send email message\n\t * @param loginName        the login name\n\t */\n\tvoid sendEmailCode(SendEmailMessage sendEmailMessage, String loginName);\n\n\t/**\n\t * 校验验证码 返回 token 用户最后修改密码使用\n\t *\n\t * @param sendEmailMessage the send email message\n\t * @param loginName        the login name\n\t */\n\tvoid checkEmailCode(SendEmailMessage sendEmailMessage, String loginName);\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/service/MdcAddressService.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：MdcAddressService.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.service;\n\nimport com.paascloud.provider.model.dto.AddressDTO;\n\n/**\n * The interface Omc order service.\n *\n * @author paascloud.net@gmail.com\n */\npublic interface MdcAddressService {\n\t/**\n\t * Gets address by id.\n\t *\n\t * @param addressId the address id\n\t *\n\t * @return the address by id\n\t */\n\tAddressDTO getAddressById(Long addressId);\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/service/OpcRpcService.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：OpcRpcService.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.service;\n\n/**\n * The interface Opc rpc service.\n *\n * @author paascloud.net @gmail.com\n */\npublic interface OpcRpcService {\n\n\t/**\n\t * Gets location by id.\n\t *\n\t * @param addressId the address id\n\t *\n\t * @return the location by id\n\t */\n\tString getLocationById(String addressId);\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/service/RedisHashService.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：RedisHashService.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.service;\n\nimport java.util.List;\nimport java.util.Map;\nimport java.util.Set;\n\n/**\n * The interface Redis hash service.\n *\n * @author paascloud.net@gmail.com\n */\npublic interface RedisHashService {\n\n\t/**\n\t * 获取所有给定字段的值\n\t *\n\t * @param <T>    the type parameter\n\t * @param key    the key\n\t * @param fields the fields\n\t *\n\t * @return the value by fields\n\t */\n\t<T extends Object> List<T> getValueByFields(String key, Set<String> fields);\n\n\t/**\n\t * 获取所有给定字段的值\n\t *\n\t * @param <T>   the type parameter\n\t * @param key   the key\n\t * @param field the field\n\t *\n\t * @return the value by field\n\t */\n\t<T extends Object> List<T> getValueByField(String key, String field);\n\n\t/**\n\t * 同时将多个 field-value (域-值)对设置到哈希表 key 中\n\t *\n\t * @param key the key\n\t * @param map the map\n\t */\n\tvoid setValueByFields(String key, Map<String, Object> map);\n\n\t/**\n\t * 删除一个或多个哈希表字段R\n\t *\n\t * @param key      the key\n\t * @param hashKeys the hash keys\n\t *\n\t * @return the long\n\t */\n\tLong removeFields(String key, String... hashKeys);\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/service/RedisService.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：RedisService.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.service;\n\nimport java.util.concurrent.TimeUnit;\n\n/**\n * The interface Redis service.\n *\n * @author paascloud.net@gmail.com\n */\npublic interface RedisService {\n\n\t/**\n\t * Gets key.\n\t *\n\t * @param key the key\n\t *\n\t * @return the key\n\t */\n\tString getKey(String key);\n\n\t/**\n\t * Delete key.\n\t *\n\t * @param key the key\n\t */\n\tvoid deleteKey(String key);\n\n\t/**\n\t * Sets key.\n\t *\n\t * @param key   the key\n\t * @param value the value\n\t */\n\tvoid setKey(String key, String value);\n\n\t/**\n\t * Sets key.\n\t *\n\t * @param key     the key\n\t * @param value   the value\n\t * @param timeout the timeout\n\t * @param unit    the unit\n\t */\n\tvoid setKey(String key, String value, final long timeout, final TimeUnit unit);\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/service/RedisSetService.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：RedisSetService.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.service;\n\nimport java.util.Set;\n\n/**\n * The interface Redis set service.\n *\n * @author paascloud.net@gmail.com\n */\npublic interface RedisSetService {\n\t/**\n\t * 返回集合中的所有成员\n\t *\n\t * @param key the key\n\t *\n\t * @return the all value\n\t */\n\tSet<String> getAllValue(String key);\n\n\t/**\n\t * 向集合添加一个或多个成员\n\t *\n\t * @param key   the key\n\t * @param value the value\n\t *\n\t * @return the long\n\t */\n\tLong add(String key, String... value);\n\n\t/**\n\t * 移除集合中一个或多个成员\n\t *\n\t * @param key   the key\n\t * @param value the value\n\t *\n\t * @return the long\n\t */\n\tLong remove(String key, String... value);\n\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/service/SmsService.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：SmsService.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.service;\n\nimport com.paascloud.provider.model.dto.sms.SmsMessage;\n\nimport javax.servlet.http.HttpServletResponse;\n\n\n/**\n * The interface Sms service.\n *\n * @author paascloud.net @gmail.com\n */\npublic interface SmsService {\n\t/**\n\t * Send sms code.\n\t *\n\t * @param smsMessage the sms message\n\t * @param ipAddr     the ip addr\n\t */\n\tvoid sendSmsCode(SmsMessage smsMessage, String ipAddr);\n\n\t/**\n\t * Submit reset pwd phone.\n\t *\n\t * @param mobile   the mobile\n\t * @param response the response\n\t *\n\t * @return the string\n\t */\n\tString submitResetPwdPhone(String mobile, HttpServletResponse response);\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/service/UacActionService.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：UacActionService.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.service;\n\nimport com.github.pagehelper.PageInfo;\nimport com.paascloud.base.dto.LoginAuthDto;\nimport com.paascloud.provider.model.domain.UacAction;\nimport com.paascloud.provider.model.domain.UacMenu;\nimport com.paascloud.provider.model.dto.action.ActionMainQueryDto;\nimport com.paascloud.provider.model.vo.MenuVo;\nimport com.paascloud.core.support.IService;\n\nimport java.util.List;\n\n/**\n * The interface Uac action service.\n *\n * @author paascloud.net @gmail.com\n */\npublic interface UacActionService extends IService<UacAction> {\n\t/**\n\t * Query action list with page page info.\n\t *\n\t * @param actionMainQueryDto the action main query dto\n\t *\n\t * @return the page info\n\t */\n\tPageInfo queryActionListWithPage(ActionMainQueryDto actionMainQueryDto);\n\n\t/**\n\t * Delete action by id int.\n\t *\n\t * @param actionId the action id\n\t *\n\t * @return the int\n\t */\n\tint deleteActionById(Long actionId);\n\n\t/**\n\t * Batch delete by id list.\n\t *\n\t * @param deleteIdList the delete id list\n\t */\n\tvoid batchDeleteByIdList(List<Long> deleteIdList);\n\n\t/**\n\t * Save action.\n\t *\n\t * @param action       the action\n\t * @param loginAuthDto the login auth dto\n\t */\n\tvoid saveAction(UacAction action, LoginAuthDto loginAuthDto);\n\n\t/**\n\t * Delete by menu id int.\n\t *\n\t * @param id the id\n\t *\n\t * @return the int\n\t */\n\tint deleteByMenuId(Long id);\n\n\t/**\n\t * Gets checked auth list.\n\t *\n\t * @param roleId the role id\n\t *\n\t * @return the checked auth list\n\t */\n\tList<Long> getCheckedActionList(Long roleId);\n\n\t/**\n\t * Gets own auth list.\n\t *\n\t * @param userId the user id\n\t *\n\t * @return the own auth list\n\t */\n\tList<MenuVo> getOwnAuthList(Long userId);\n\n\t/**\n\t * Gets checked menu list.\n\t *\n\t * @param roleId the role id\n\t *\n\t * @return the checked menu list\n\t */\n\tList<Long> getCheckedMenuList(Long roleId);\n\n\t/**\n\t * 根据用户Id查询拥有的按钮权限.\n\t *\n\t * @param userId the user id\n\t *\n\t * @return the own uac action list\n\t */\n\tList<UacAction> getOwnActionListByUserId(Long userId);\n\n\t/**\n\t * 根据角色ID查询权限列表.\n\t *\n\t * @param roleId the role id\n\t *\n\t * @return the list\n\t */\n\tList<UacAction> listActionListByRoleId(Long roleId);\n\n\t/**\n\t * 根据菜单ID List 查询权限列表.\n\t *\n\t * @param uacMenus the uac menus\n\t *\n\t * @return the list\n\t */\n\tList<UacAction> listActionList(List<UacMenu> uacMenus);\n\n\t/**\n\t * Matches by url uac action.\n\t *\n\t * @param requestUrl the request url\n\t *\n\t * @return the uac action\n\t */\n\tUacAction matchesByUrl(String requestUrl);\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/service/UacFreeMarkerService.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：UacFreeMarkerService.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.service;\n\nimport freemarker.template.TemplateException;\n\nimport java.io.IOException;\nimport java.util.Map;\n\n\n/**\n * The interface Uac free marker service.\n *\n * @author paascloud.net@gmail.com\n */\npublic interface UacFreeMarkerService {\n\n\t/**\n\t * Gets template.\n\t *\n\t * @param map              the map\n\t * @param templateLocation the template location\n\t *\n\t * @return the template\n\t *\n\t * @throws IOException       the io exception\n\t * @throws TemplateException the template exception\n\t */\n\tString getTemplate(Map<String, Object> map, String templateLocation) throws IOException, TemplateException;\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/service/UacGroupService.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：UacGroupService.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.service;\n\n\nimport com.paascloud.base.dto.LoginAuthDto;\nimport com.paascloud.provider.model.domain.UacGroup;\nimport com.paascloud.provider.model.dto.group.GroupBindUserDto;\nimport com.paascloud.provider.model.dto.group.GroupBindUserReqDto;\nimport com.paascloud.provider.model.dto.user.IdStatusDto;\nimport com.paascloud.provider.model.vo.GroupZtreeVo;\nimport com.paascloud.provider.model.vo.MenuVo;\nimport com.paascloud.core.support.IService;\n\nimport java.util.List;\n\n/**\n * The interface Uac group service.\n *\n * @author paascloud.net@gmail.com\n */\npublic interface UacGroupService extends IService<UacGroup> {\n\n\t/**\n\t * Update uac group status by id int.\n\t *\n\t * @param idStatusDto  the id status dto\n\t * @param loginAuthDto the login auth dto\n\t *\n\t * @return the int\n\t */\n\tint updateUacGroupStatusById(IdStatusDto idStatusDto, LoginAuthDto loginAuthDto);\n\n\t/**\n\t * Delete uac group by id int.\n\t *\n\t * @param id the id\n\t *\n\t * @return the int\n\t */\n\tint deleteUacGroupById(Long id);\n\n\t/**\n\t * Query by id uac group.\n\t *\n\t * @param groupId the group id\n\t *\n\t * @return the uac group\n\t */\n\tUacGroup queryById(Long groupId);\n\n\t/**\n\t * Gets group tree.\n\t *\n\t * @param id the id\n\t *\n\t * @return the group tree\n\t */\n\tList<GroupZtreeVo> getGroupTree(Long id);\n\n\t/**\n\t * Find current user have group info list.\n\t *\n\t * @param userId the user id\n\t *\n\t * @return the list\n\t */\n\tList<MenuVo> getGroupTreeListByUserId(Long userId);\n\n\t/**\n\t * Gets group bind user dto.\n\t *\n\t * @param groupId the group id\n\t * @param userId  the user id\n\t *\n\t * @return the group bind user dto\n\t */\n\tGroupBindUserDto getGroupBindUserDto(Long groupId, Long userId);\n\n\t/**\n\t * Bind uac user 4 group int.\n\t *\n\t * @param groupBindUserReqDto the group bind user req dto\n\t * @param loginAuthDto        the login auth dto\n\t */\n\tvoid bindUacUser4Group(GroupBindUserReqDto groupBindUserReqDto, LoginAuthDto loginAuthDto);\n\n\t/**\n\t * Save uac group int.\n\t *\n\t * @param group        the group\n\t * @param loginAuthDto the login auth dto\n\t *\n\t * @return the int\n\t */\n\tint saveUacGroup(UacGroup group, LoginAuthDto loginAuthDto);\n\n\t/**\n\t * Gets by id.\n\t *\n\t * @param id the id\n\t *\n\t * @return the by id\n\t */\n\tUacGroup getById(Long id);\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/service/UacGroupUserService.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：UacGroupUserService.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.service;\n\nimport com.paascloud.provider.model.domain.UacGroup;\nimport com.paascloud.provider.model.domain.UacGroupUser;\nimport com.paascloud.core.support.IService;\n\nimport java.util.List;\n\n\n/**\n * The interface Uac group user service.\n *\n * @author paascloud.net@gmail.com\n */\npublic interface UacGroupUserService extends IService<UacGroupUser> {\n\t/**\n\t * 根据userId查询\n\t *\n\t * @param userId the user id\n\t *\n\t * @return the uac group user\n\t */\n\tUacGroupUser queryByUserId(Long userId);\n\n\t/**\n\t * 根据userId和version修改\n\t *\n\t * @param uacGroupUser the uac group user\n\t *\n\t * @return the int\n\t */\n\tint updateByUserId(UacGroupUser uacGroupUser);\n\n\t/**\n\t * 通过用户Id获取组织信息\n\t *\n\t * @param userId the user id\n\t *\n\t * @return the group list by user id\n\t */\n\tList<UacGroup> getGroupListByUserId(Long userId);\n\n\t/**\n\t * Save user group.\n\t *\n\t * @param id      the id\n\t * @param groupId the group id\n\t */\n\tvoid saveUserGroup(Long id, Long groupId);\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/service/UacLogService.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：UacLogService.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.service;\n\n\nimport com.github.pagehelper.PageInfo;\nimport com.paascloud.base.dto.LoginAuthDto;\nimport com.paascloud.core.annotation.OperationLogDto;\nimport com.paascloud.core.support.IService;\nimport com.paascloud.provider.model.domain.UacLog;\nimport com.paascloud.provider.model.dto.log.UacLogMainDto;\n\nimport java.util.List;\n\n/**\n * The interface Uac log service.\n *\n * @author paascloud.net @gmail.com\n */\npublic interface UacLogService extends IService<UacLog> {\n\n\t/**\n\t * Save log int.\n\t *\n\t * @param uacLog       the uac log\n\t * @param loginAuthDto the login auth dto\n\t *\n\t * @return the int\n\t */\n\tint saveLog(UacLog uacLog, LoginAuthDto loginAuthDto);\n\n\t/**\n\t * Query user log list with user id list.\n\t *\n\t * @param userId the user id\n\t *\n\t * @return the list\n\t */\n\tList<UacLog> selectUserLogListByUserId(Long userId);\n\n\t/**\n\t * Save operation log integer.\n\t *\n\t * @param operationLogDto the operation log dto\n\t *\n\t * @return the integer\n\t */\n\tInteger saveOperationLog(OperationLogDto operationLogDto);\n\n\t/**\n\t * Query log list with page wrapper.\n\t *\n\t * @param uacLogQueryDtoPage the uac log query dto page\n\t *\n\t * @return the wrapper\n\t */\n\tPageInfo queryLogListWithPage(UacLogMainDto uacLogQueryDtoPage);\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/service/UacLoginService.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：UacLoginService.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.service;\n\n\nimport com.paascloud.provider.model.dto.user.LoginRespDto;\n\n/**\n * The interface Uac login service.\n *\n * @author paascloud.net@gmail.com\n */\npublic interface UacLoginService {\n\n\t/**\n\t * Login after login resp dto.\n\t *\n\t * @param applicationId the application id\n\t *\n\t * @return the login resp dto\n\t */\n\tLoginRespDto loginAfter(Long applicationId);\n\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/service/UacMenuService.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：UacMenuService.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.service;\n\nimport com.paascloud.base.dto.LoginAuthDto;\nimport com.paascloud.provider.model.domain.UacMenu;\nimport com.paascloud.provider.model.dto.menu.UacMenuStatusDto;\nimport com.paascloud.provider.model.vo.MenuVo;\nimport com.paascloud.provider.model.vo.ViewMenuVo;\nimport com.paascloud.core.support.IService;\n\nimport java.util.List;\nimport java.util.Set;\n\n\n/**\n * The interface Uac menu service.\n *\n * @author paascloud.net @gmail.com\n */\npublic interface UacMenuService extends IService<UacMenu> {\n\t/**\n\t * Gets menu vo list by user id.\n\t *\n\t * @param userId        the user id\n\t * @param applicationId the application id\n\t *\n\t * @return the menu vo list by user id\n\t */\n\tList<MenuVo> getMenuVoList(Long userId, Long applicationId);\n\n\t/**\n\t * Save uac menu int.\n\t *\n\t * @param uacMenu      the uac menu\n\t * @param loginAuthDto the login auth dto\n\t *\n\t * @return the int\n\t */\n\tint saveUacMenu(UacMenu uacMenu, LoginAuthDto loginAuthDto);\n\n\t/**\n\t * Delete uac menu by id int.\n\t *\n\t * @param id           the id\n\t * @param loginAuthDto the login auth dto\n\t *\n\t * @return the int\n\t */\n\tint deleteUacMenuById(Long id, LoginAuthDto loginAuthDto);\n\n\t/**\n\t * Enable menu list int.\n\t *\n\t * @param menuList     the menu list\n\t * @param loginAuthDto the login auth dto\n\t *\n\t * @return the int\n\t */\n\tint enableMenuList(List<UacMenu> menuList, LoginAuthDto loginAuthDto);\n\n\t/**\n\t * Gets all parent menu by menu id.\n\t *\n\t * @param id the id\n\t *\n\t * @return the all parent menu by menu id\n\t */\n\tList<UacMenu> getAllParentMenuByMenuId(Long id);\n\n\t/**\n\t * Gets all child menu by menu id.\n\t *\n\t * @param id   the id\n\t * @param type the type\n\t *\n\t * @return the all child menu by menu id\n\t */\n\tList<UacMenu> getAllChildMenuByMenuId(Long id, String type);\n\n\t/**\n\t * Disable menu list int.\n\t *\n\t * @param menuList     the menu list\n\t * @param loginAuthDto the login auth dto\n\t *\n\t * @return the int\n\t */\n\tint disableMenuList(List<UacMenu> menuList, LoginAuthDto loginAuthDto);\n\n\t/**\n\t * Select menu list list.\n\t *\n\t * @param cusUacMenu the cus uac menu\n\t *\n\t * @return the list\n\t */\n\tList<UacMenu> selectMenuList(UacMenu cusUacMenu);\n\n\t/**\n\t * Find all menu list by auth res dto list.\n\t *\n\t * @param authResDto the auth res dto\n\t *\n\t * @return the list\n\t */\n\tList<MenuVo> findAllMenuListByAuthResDto(LoginAuthDto authResDto);\n\n\t/**\n\t * Gets vo by id.\n\t *\n\t * @param id the id\n\t *\n\t * @return the vo by id\n\t */\n\tViewMenuVo getViewVoById(Long id);\n\n\t/**\n\t * Update uac menu status by id.\n\t *\n\t * @param uacMenuStatusDto the uac menu status dto\n\t * @param loginAuthDto     the login auth dto\n\t */\n\tvoid updateUacMenuStatusById(UacMenuStatusDto uacMenuStatusDto, LoginAuthDto loginAuthDto);\n\n\t/**\n\t * 判断菜单是否有子菜单.\n\t *\n\t * @param menuId the menu id\n\t *\n\t * @return the boolean\n\t */\n\tboolean checkMenuHasChildMenu(Long menuId);\n\n\t/**\n\t * 根据角色ID查询菜单列表.\n\t *\n\t * @param roleId the role id\n\t *\n\t * @return the list\n\t */\n\tList<UacMenu> listMenuListByRoleId(Long roleId);\n\n\t/**\n\t * Gets menu list.\n\t *\n\t * @param menuIdList the menu id list\n\t *\n\t * @return the menu list\n\t */\n\tList<UacMenu> getMenuList(Set<Long> menuIdList);\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/service/UacPermissionService.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：UacPermissionService.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.service;\n\n\nimport org.springframework.security.core.Authentication;\n\nimport javax.servlet.http.HttpServletRequest;\n\n/**\n * The interface Uac permission service.\n *\n * @author paascloud.net @gmail.com\n */\npublic interface UacPermissionService {\n\n\t/**\n\t * Has permission boolean.\n\t *\n\t * @param authentication the authentication\n\t * @param request        the request\n\t *\n\t * @return the boolean\n\t */\n\tboolean hasPermission(Authentication authentication, HttpServletRequest request);\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/service/UacRoleActionService.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：UacRoleActionService.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.service;\n\nimport com.paascloud.provider.model.domain.UacRoleAction;\nimport com.paascloud.core.support.IService;\n\nimport java.util.List;\nimport java.util.Set;\n\n/**\n * The interface Uac role action service.\n *\n * @author paascloud.net @gmail.com\n */\npublic interface UacRoleActionService extends IService<UacRoleAction> {\n\t/**\n\t * List by role id list.\n\t *\n\t * @param roleId the role id\n\t *\n\t * @return the list\n\t */\n\tList<UacRoleAction> listByRoleId(Long roleId);\n\n\t/**\n\t * Delete by role id.\n\t *\n\t * @param roleId the role id\n\t */\n\tvoid deleteByRoleId(Long roleId);\n\n\t/**\n\t * Insert.\n\t *\n\t * @param roleId       the role id\n\t * @param actionIdList the action id list\n\t */\n\tvoid insert(Long roleId, Set<Long> actionIdList);\n\n\t/**\n\t * Delete by role id list int.\n\t *\n\t * @param roleIdList the role id list\n\t *\n\t * @return the int\n\t */\n\tint deleteByRoleIdList(List<Long> roleIdList);\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/service/UacRoleMenuService.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：UacRoleMenuService.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.service;\n\nimport com.paascloud.provider.model.domain.UacRoleMenu;\nimport com.paascloud.core.support.IService;\n\nimport java.util.List;\nimport java.util.Set;\n\n\n/**\n * The interface Uac role menu service.\n *\n * @author paascloud.net @gmail.com\n */\npublic interface UacRoleMenuService extends IService<UacRoleMenu> {\n\t/**\n\t * Del role menu list int.\n\t *\n\t * @param uacRoleMenus the uac role menus\n\t *\n\t * @return the int\n\t */\n\tint delRoleMenuList(Set<UacRoleMenu> uacRoleMenus);\n\n\t/**\n\t * Delete by role id.\n\t *\n\t * @param roleId the role id\n\t */\n\tvoid deleteByRoleId(Long roleId);\n\n\t/**\n\t * List by role id list.\n\t *\n\t * @param roleId the role id\n\t *\n\t * @return the list\n\t */\n\tList<UacRoleMenu> listByRoleId(Long roleId);\n\n\t/**\n\t * Insert.\n\t *\n\t * @param roleId     the role id\n\t * @param menuIdList the menu id list\n\t */\n\tvoid insert(Long roleId, Set<Long> menuIdList);\n\n\t/**\n\t * Delete by role id list.\n\t *\n\t * @param roleIdList the role id list\n\t */\n\tvoid deleteByRoleIdList(List<Long> roleIdList);\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/service/UacRoleService.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：UacRoleService.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.service;\n\nimport com.paascloud.base.dto.LoginAuthDto;\nimport com.paascloud.provider.model.domain.UacRole;\nimport com.paascloud.provider.model.dto.role.RoleBindActionDto;\nimport com.paascloud.provider.model.dto.role.RoleBindMenuDto;\nimport com.paascloud.provider.model.dto.role.RoleBindUserDto;\nimport com.paascloud.provider.model.dto.role.RoleBindUserReqDto;\nimport com.paascloud.provider.model.vo.BindAuthVo;\nimport com.paascloud.provider.model.vo.MenuVo;\nimport com.paascloud.provider.model.vo.RoleVo;\nimport com.paascloud.core.support.IService;\n\nimport java.util.List;\n\n\n/**\n * The interface Uac role service.\n *\n * @author paascloud.net@gmail.com\n */\npublic interface UacRoleService extends IService<UacRole> {\n\n\t/**\n\t * Find by role code uac role.\n\t *\n\t * @param roleCode the role code\n\t *\n\t * @return the uac role\n\t */\n\tUacRole findByRoleCode(String roleCode);\n\n\t/**\n\t * Query role list with page list.\n\t *\n\t * @param role the role\n\t *\n\t * @return the list\n\t */\n\tList<RoleVo> queryRoleListWithPage(UacRole role);\n\n\t/**\n\t * 根据角色删除用户.\n\t *\n\t * @param id the id\n\t *\n\t * @return the int\n\t */\n\tint deleteRoleById(Long id);\n\n\t/**\n\t * 保存用户.\n\t *\n\t * @param role         the role\n\t * @param loginAuthDto the login auth dto\n\t *\n\t * @return the int\n\t */\n\tint saveRole(UacRole role, LoginAuthDto loginAuthDto);\n\n\t/**\n\t * Gets auth tree no check menu.\n\t *\n\t * @param roleId the role id\n\t *\n\t * @return the auth tree no check menu\n\t */\n\tList<Long> getAuthTreeNoCheckMenu(Long roleId);\n\n\t/**\n\t * Grant auth 4 role int.\n\t *\n\t * @param grantAuthRole the grant auth role\n\t */\n\tvoid bindAction(RoleBindActionDto grantAuthRole);\n\n\t/**\n\t * 根据角色Id获取角色信息.\n\t *\n\t * @param roleId the role id\n\t *\n\t * @return the role by id\n\t */\n\tUacRole getRoleById(Long roleId);\n\n\t/**\n\t * 角色绑定用户获取穿梭框信息.\n\t *\n\t * @param roleId        the role id\n\t * @param currentUserId the current user id\n\t *\n\t * @return the role bind user dto by role id\n\t */\n\tRoleBindUserDto getRoleBindUserDto(Long roleId, Long currentUserId);\n\n\t/**\n\t * 角色绑定用户.\n\t *\n\t * @param roleBindUserReqDto the role bind user req dto\n\t * @param loginAuthDto       the login auth dto\n\t */\n\tvoid bindUser4Role(RoleBindUserReqDto roleBindUserReqDto, LoginAuthDto loginAuthDto);\n\n\t/**\n\t * Find all role info by user id list.\n\t *\n\t * @param userId the user id\n\t *\n\t * @return the list\n\t */\n\tList<UacRole> findAllRoleInfoByUserId(Long userId);\n\n\t/**\n\t * Gets auth tree by role id.\n\t *\n\t * @param roleId the role id\n\t *\n\t * @return the auth tree by role id\n\t */\n\tBindAuthVo getActionTreeByRoleId(Long roleId);\n\n\t/**\n\t * Batch delete by id list int.\n\t *\n\t * @param idList the id list\n\t */\n\tvoid batchDeleteByIdList(List<Long> idList);\n\n\t/**\n\t * Gets own auth tree by role id.\n\t *\n\t * @param userId the user id\n\t *\n\t * @return the own auth tree by role id\n\t */\n\tList<MenuVo> getOwnAuthTree(Long userId);\n\n\t/**\n\t * Bind menu.\n\t *\n\t * @param roleBindMenuDto the role bind menu dto\n\t */\n\tvoid bindMenu(RoleBindMenuDto roleBindMenuDto);\n\n\t/**\n\t * Gets menu tree by role id.\n\t *\n\t * @param roleId the role id\n\t *\n\t * @return the menu tree by role id\n\t */\n\tBindAuthVo getMenuTreeByRoleId(Long roleId);\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/service/UacRoleUserService.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：UacRoleUserService.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.service;\n\nimport com.paascloud.provider.model.domain.UacRoleUser;\nimport com.paascloud.core.support.IService;\n\nimport java.util.List;\n\n\n/**\n * The interface Uac role user service.\n *\n * @author paascloud.net@gmail.com\n */\npublic interface UacRoleUserService extends IService<UacRoleUser> {\n\t/**\n\t * 根据用户ID解除用户角色关联.\n\t *\n\t * @param userId the user id\n\t *\n\t * @return the int\n\t */\n\tint deleteByUserId(Long userId);\n\n\t/**\n\t * 根据用户ID查询绑定的角色ID列表.\n\t *\n\t * @param userId the user id\n\t *\n\t * @return the list\n\t */\n\tList<UacRoleUser> queryByUserId(Long userId);\n\n\t/**\n\t * 用户是否绑定该角色.\n\t *\n\t * @param userId the user id\n\t * @param roleId the role id\n\t *\n\t * @return the by user id and role id\n\t */\n\tUacRoleUser getByUserIdAndRoleId(Long userId, Long roleId);\n\n\t/**\n\t * 保存用户角色中间表信息.\n\t *\n\t * @param userId the user id\n\t * @param roleId the role id\n\t *\n\t * @return the int\n\t */\n\tint saveRoleUser(Long userId, Long roleId);\n\n\t/**\n\t * 根据角色信息查询用户ID集合.\n\t *\n\t * @param roleId the role id\n\t *\n\t * @return the list\n\t */\n\tList<UacRoleUser> listByRoleId(Long roleId);\n\n\t/**\n\t * 根据角色ID列表查询用户ID集合.\n\t *\n\t * @param idList the id list\n\t *\n\t * @return the list\n\t */\n\tList<UacRoleUser> listByRoleIdList(List<Long> idList);\n\n\t/**\n\t * List super user list.\n\t *\n\t * @param superManagerRoleId the super manager role id\n\t *\n\t * @return the list\n\t */\n\tList<Long> listSuperUser(Long superManagerRoleId);\n\n\t/**\n\t * Delete exclude super mng.\n\t *\n\t * @param roleId             the role id\n\t * @param superManagerRoleId the super manager role id\n\t */\n\tvoid deleteExcludeSuperMng(Long roleId, Long superManagerRoleId);\n\n\t/**\n\t * 根据用户ID查询集合.\n\t *\n\t * @param userId the user id\n\t *\n\t * @return the list\n\t */\n\tList<UacRoleUser> listByUserId(Long userId);\n\n\t/**\n\t * 根据角色ID集合解除关联关系.\n\t *\n\t * @param roleIdList the role id list\n\t */\n\tvoid deleteByRoleIdList(List<Long> roleIdList);\n\n\t/**\n\t * 根据角色ID解除关联关系.\n\t *\n\t * @param roleId the role id\n\t */\n\tvoid deleteByRoleId(Long roleId);\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/service/UacUserMenuService.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：UacUserMenuService.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.service;\n\nimport com.paascloud.provider.model.domain.UacUserMenu;\nimport com.paascloud.core.support.IService;\n\n/**\n * The interface Uac user menu service.\n *\n * @author paascloud.net@gmail.com\n */\npublic interface UacUserMenuService extends IService<UacUserMenu> {\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/service/UacUserService.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：UacUserService.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.service;\n\nimport com.github.pagehelper.PageInfo;\nimport com.paascloud.base.dto.LoginAuthDto;\nimport com.paascloud.core.support.IService;\nimport com.paascloud.provider.model.domain.UacLog;\nimport com.paascloud.provider.model.domain.UacUser;\nimport com.paascloud.provider.model.dto.menu.UserMenuDto;\nimport com.paascloud.provider.model.dto.user.*;\nimport com.paascloud.provider.model.vo.UserBindRoleVo;\nimport com.paascloud.security.core.SecurityUser;\nimport org.springframework.security.core.GrantedAuthority;\nimport org.springframework.security.oauth2.common.OAuth2AccessToken;\n\nimport javax.servlet.http.HttpServletRequest;\nimport java.util.Collection;\nimport java.util.List;\n\n/**\n * The interface Uac user service.\n *\n * @author paascloud.net @gmail.com\n */\npublic interface UacUserService extends IService<UacUser> {\n\t/**\n\t * 根据登录名查询用户信息\n\t *\n\t * @param loginName the login name\n\t *\n\t * @return the uac user\n\t */\n\tUacUser findByLoginName(String loginName);\n\n\t/**\n\t * 根据手机号查询用户信息.\n\t *\n\t * @param mobileNo the mobile no\n\t *\n\t * @return the uac user\n\t */\n\tUacUser findByMobileNo(String mobileNo);\n\n\t/**\n\t * 校验用户是否合法\n\t *\n\t * @param loginReqDto the login req dto\n\t */\n\tvoid checkUserIsCorrect(LoginReqDto loginReqDto);\n\n\t/**\n\t * 获得项目下所有的资源权限列表, 用于程序启动时的初始化工作\n\t * String[0] = 资源\n\t * String[1] = 权限\n\t *\n\t * @return all perms\n\t */\n\tList<Perm> getAllPerms();\n\n\t/**\n\t * 获得用户拥有的权限列表, 在首次验证用户对某个资源是否有权限时, 会调用此方法, 初始化用户权限\n\t *\n\t * @param userId the user id\n\t *\n\t * @return the user perms\n\t */\n\tList<String> getUserPerms(Long userId);\n\n\t/**\n\t * 更新用户信息\n\t *\n\t * @param uacUser the uac user\n\t *\n\t * @return the int\n\t */\n\tint updateUser(UacUser uacUser);\n\n\t/**\n\t * Query user list with page list.\n\t *\n\t * @param uacUser the uac user\n\t *\n\t * @return the list\n\t */\n\tPageInfo queryUserListWithPage(UacUser uacUser);\n\n\t/**\n\t * 根据用户ID删除用户.\n\t *\n\t * @param userId the user id\n\t *\n\t * @return the int\n\t */\n\tint deleteUserById(Long userId);\n\n\t/**\n\t * 根据用户ID查询用户信息.\n\t *\n\t * @param userId the user id\n\t *\n\t * @return the uac user\n\t */\n\tUacUser findUserInfoByUserId(Long userId);\n\n\t/**\n\t * 保存用户.\n\t *\n\t * @param user         the user\n\t * @param loginAuthDto the login auth dto\n\t */\n\tvoid saveUacUser(UacUser user, LoginAuthDto loginAuthDto);\n\n\t/**\n\t * 根据用户ID查询用户日志集合.\n\t *\n\t * @param userId the user id\n\t *\n\t * @return the list\n\t */\n\tList<UacLog> queryUserLogListWithUserId(Long userId);\n\n\t/**\n\t * 根据用户ID修改用户状态.\n\t *\n\t * @param uacUser      the uac user\n\t * @param loginAuthDto the login auth dto\n\t *\n\t * @return the int\n\t */\n\tint modifyUserStatusById(UacUser uacUser, LoginAuthDto loginAuthDto);\n\n\t/**\n\t * 绑定用户角色信息.\n\t *\n\t * @param bindUserRolesDto the bind user roles dto\n\t * @param loginAuthDto     the login auth dto\n\t */\n\tvoid bindUserRoles(BindUserRolesDto bindUserRolesDto, LoginAuthDto loginAuthDto);\n\n\t/**\n\t * 查询用户菜单.\n\t *\n\t * @param loginAuthDto the login auth dto\n\t *\n\t * @return the list\n\t */\n\tList<UserMenuDto> queryUserMenuDtoData(LoginAuthDto loginAuthDto);\n\n\t/**\n\t * 用户绑定菜单.\n\t *\n\t * @param menuIdList   the menu id list\n\t * @param loginAuthDto the login auth dto\n\t *\n\t * @return the int\n\t */\n\tint bindUserMenus(List<Long> menuIdList, LoginAuthDto loginAuthDto);\n\n\t/**\n\t * 根据用户ID查询用户信息.\n\t *\n\t * @param userId the user id\n\t *\n\t * @return the uac user\n\t */\n\tUacUser queryByUserId(Long userId);\n\n\t/**\n\t * 用户修改密码\n\t *\n\t * @param userModifyPwdDto the user modify pwd dto\n\t * @param authResDto       the auth res dto\n\t *\n\t * @return the int\n\t */\n\tint userModifyPwd(UserModifyPwdDto userModifyPwdDto, LoginAuthDto authResDto);\n\n\t/**\n\t * 用户忘记密码\n\t *\n\t * @param userResetPwdDto the user reset pwd dto\n\t *\n\t * @return the int\n\t */\n\tint userResetPwd(UserResetPwdDto userResetPwdDto);\n\n\t/**\n\t * 注册用户.\n\t *\n\t * @param registerDto the register dto\n\t */\n\tvoid register(UserRegisterDto registerDto);\n\n\t/**\n\t * 校验登录名是否存在.\n\t *\n\t * @param loginName the login name\n\t *\n\t * @return the boolean\n\t */\n\tboolean checkLoginName(String loginName);\n\n\t/**\n\t * 校验邮箱是否存在.\n\t *\n\t * @param loginName the login name\n\t *\n\t * @return the boolean\n\t */\n\tboolean checkEmail(String loginName);\n\n\t/**\n\t * 校验手机号是否存在.\n\t *\n\t * @param validValue the valid value\n\t *\n\t * @return the boolean\n\t */\n\tboolean checkMobileNo(String validValue);\n\n\t/**\n\t * 根据邮箱和登录名查询用户数量.\n\t *\n\t * @param loginName the login name\n\t * @param email     the email\n\t *\n\t * @return the int\n\t */\n\tint countUserByLoginNameAndEmail(String loginName, String email);\n\n\t/**\n\t * 重置密码.\n\t *\n\t * @param forgetResetPasswordDto 忘记密码实体\n\t *\n\t * @return the int\n\t */\n\tint userEmailResetPwd(ForgetResetPasswordDto forgetResetPasswordDto);\n\n\t/**\n\t * 修改用户邮箱.\n\t *\n\t * @param email        the email\n\t * @param emailCode    the email code\n\t * @param loginAuthDto the login auth dto\n\t */\n\tvoid modifyUserEmail(String email, String emailCode, LoginAuthDto loginAuthDto);\n\n\t/**\n\t * 重置登录密码.\n\t *\n\t * @param userId       the user id\n\t * @param loginAuthDto the login auth dto\n\t */\n\tvoid resetLoginPwd(Long userId, LoginAuthDto loginAuthDto);\n\n\t/**\n\t * 重置登录密码.\n\t *\n\t * @param resetLoginPwdDto the reset login pwd dto\n\t */\n\tvoid resetLoginPwd(ResetLoginPwdDto resetLoginPwdDto);\n\n\t/**\n\t * 获取绑定的角色信息.\n\t *\n\t * @param userId the user id\n\t *\n\t * @return the user bind role dto\n\t */\n\tUserBindRoleVo getUserBindRoleDto(Long userId);\n\n\t/**\n\t * 激活用户.\n\t *\n\t * @param activeUserToken the active user token\n\t */\n\tvoid activeUser(String activeUserToken);\n\n\t/**\n\t * 获取用户拥有的所有权限编码.\n\t *\n\t * @param userId the user id\n\t *\n\t * @return the collection\n\t */\n\tCollection<GrantedAuthority> loadUserAuthorities(Long userId);\n\n\t/**\n\t * Handler login data.\n\t *\n\t * @param token     the token\n\t * @param principal the principal\n\t * @param request   the request\n\t */\n\tvoid handlerLoginData(OAuth2AccessToken token, final SecurityUser principal, final HttpServletRequest request);\n\n\t/**\n\t * Find user info by login name uac user.\n\t *\n\t * @param loginName the login name\n\t *\n\t * @return the uac user\n\t */\n\tUacUser findUserInfoByLoginName(String loginName);\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/service/UacUserTokenService.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：UacUserTokenService.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.service;\n\nimport com.arronlong.httpclientutil.exception.HttpProcessException;\nimport com.github.pagehelper.PageInfo;\nimport com.paascloud.base.dto.LoginAuthDto;\nimport com.paascloud.base.dto.UserTokenDto;\nimport com.paascloud.core.support.IService;\nimport com.paascloud.provider.model.domain.UacUserToken;\nimport com.paascloud.provider.model.dto.token.TokenMainQueryDto;\n\nimport javax.servlet.http.HttpServletRequest;\n\n/**\n * 登录jwt token 管理.\n *\n * @author paascloud.net @gmail.com\n */\npublic interface UacUserTokenService extends IService<UacUserToken> {\n\t/**\n\t * 保存token.\n\t *\n\t * @param accessToken  the access token\n\t * @param refreshToken the refresh token\n\t * @param loginAuthDto the login auth dto\n\t * @param request      the request\n\t */\n\tvoid saveUserToken(String accessToken, String refreshToken, LoginAuthDto loginAuthDto, HttpServletRequest request);\n\n\t/**\n\t * 获取token.\n\t *\n\t * @param accessToken the access token\n\t *\n\t * @return the by access token\n\t */\n\tUserTokenDto getByAccessToken(String accessToken);\n\n\n\t/**\n\t * 更新token.\n\t *\n\t * @param tokenDto     the token dto\n\t * @param loginAuthDto the login auth dto\n\t */\n\tvoid updateUacUserToken(UserTokenDto tokenDto, LoginAuthDto loginAuthDto);\n\n\t/**\n\t * 分页查询token列表.\n\t *\n\t * @param token the token\n\t *\n\t * @return the page info\n\t */\n\tPageInfo listTokenWithPage(TokenMainQueryDto token);\n\n\t/**\n\t * 刷新token.\n\t *\n\t * @param accessToken  the access token\n\t * @param refreshToken the refresh token\n\t * @param request      the request\n\t *\n\t * @return the string\n\t *\n\t * @throws HttpProcessException the http process exception\n\t */\n\tString refreshToken(String accessToken, String refreshToken, HttpServletRequest request) throws HttpProcessException;\n\n\t/**\n\t * 更新token离线状态.\n\t *\n\t * @return the int\n\t */\n\tint batchUpdateTokenOffLine();\n\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/service/impl/EmailServiceImpl.java",
    "content": "package com.paascloud.provider.service.impl;\n\nimport com.google.common.base.Preconditions;\nimport com.google.common.collect.Maps;\nimport com.google.common.collect.Sets;\nimport com.paascloud.HttpAesUtil;\nimport com.paascloud.PubUtils;\nimport com.paascloud.RandomUtil;\nimport com.paascloud.RedisKeyUtil;\nimport com.paascloud.base.constant.AliyunMqTopicConstants;\nimport com.paascloud.base.enums.ErrorCodeEnum;\nimport com.paascloud.core.generator.UniqueIdGenerator;\nimport com.paascloud.provider.manager.UserManager;\nimport com.paascloud.provider.model.domain.MqMessageData;\nimport com.paascloud.provider.model.domain.UacUser;\nimport com.paascloud.provider.model.dto.email.SendEmailMessage;\nimport com.paascloud.provider.model.enums.UacEmailTemplateEnum;\nimport com.paascloud.provider.model.exceptions.UacBizException;\nimport com.paascloud.provider.mq.producer.EmailProducer;\nimport com.paascloud.provider.service.EmailService;\nimport com.paascloud.provider.service.RedisService;\nimport com.paascloud.provider.service.UacUserService;\nimport com.xiaoleilu.hutool.date.DateUtil;\nimport lombok.extern.slf4j.Slf4j;\nimport org.apache.commons.lang3.StringUtils;\nimport org.springframework.beans.factory.annotation.Value;\nimport org.springframework.data.redis.core.RedisTemplate;\nimport org.springframework.stereotype.Service;\nimport tk.mybatis.mapper.entity.Example;\n\nimport javax.annotation.Resource;\nimport java.util.Date;\nimport java.util.Map;\nimport java.util.Set;\nimport java.util.concurrent.TimeUnit;\n\n/**\n * The class Email service.\n *\n * @author paascloud.net@gmail.com\n */\n@Service\n@Slf4j\npublic class EmailServiceImpl implements EmailService {\n\t@Resource\n\tprivate EmailProducer emailProducer;\n\t@Resource\n\tprivate UacUserService uacUserService;\n\t@Value(\"${paascloud.auth.rest-pwd-url}\")\n\tprivate String resetPwdUrl;\n\t@Resource\n\tprivate RedisTemplate<String, Object> redisTemplate;\n\t@Resource\n\tprivate UserManager userManager;\n\t@Resource\n\tprivate RedisService redisService;\n\n\tprivate static final String KEY_STR = \"om8q6fq#A0Yl@qJy\";\n\tprivate static final String IV_STR = \"0#86gzOcsv1bXyIx\";\n\n\t@Override\n\tpublic void submitResetPwdEmail(String email) {\n\t\tPreconditions.checkArgument(StringUtils.isNotEmpty(email), ErrorCodeEnum.UAC10011018.msg());\n\n\t\t// 获取用户名\n\t\tUacUser uacUser = new UacUser();\n\t\tuacUser.setEmail(email);\n\t\tuacUser = uacUserService.selectOne(uacUser);\n\t\tif (uacUser == null) {\n\t\t\tthrow new UacBizException(ErrorCodeEnum.UAC10011004, email);\n\t\t}\n\n\t\tString resetPwdKey = PubUtils.uuid() + UniqueIdGenerator.generateId();\n\t\tredisTemplate.opsForValue().set(RedisKeyUtil.getResetPwdTokenKey(resetPwdKey), uacUser, 7 * 24, TimeUnit.HOURS);\n\n\t\tMap<String, Object> param = Maps.newHashMap();\n\t\tparam.put(\"loginName\", uacUser.getLoginName());\n\t\tparam.put(\"email\", email);\n\t\tparam.put(\"resetPwdUrl\", resetPwdUrl + resetPwdKey);\n\t\tparam.put(\"dateTime\", DateUtil.formatDateTime(new Date()));\n\n\t\tSet<String> to = Sets.newHashSet();\n\t\tto.add(email);\n\t\tMqMessageData messageData = emailProducer.sendEmailMq(to, UacEmailTemplateEnum.RESET_PWD_SEND_MAIL, AliyunMqTopicConstants.MqTagEnum.FORGOT_PASSWORD_AUTH_CODE, param);\n\t\tuserManager.submitResetPwdEmail(messageData);\n\t}\n\n\t@Override\n\tpublic void sendEmailCode(SendEmailMessage sendEmailMessage, String loginName) {\n\t\tPreconditions.checkArgument(StringUtils.isNotEmpty(loginName), \"用户名不能为空\");\n\t\tString email = sendEmailMessage.getEmail();\n\n\t\tPreconditions.checkArgument(StringUtils.isNotEmpty(email), ErrorCodeEnum.UAC10011018.msg());\n\t\tPreconditions.checkArgument(StringUtils.isNotEmpty(loginName), ErrorCodeEnum.UAC10011007.msg());\n\n\t\t// 解密\n\t\temail = decryptEmail(loginName, email);\n\n\t\tExample example = new Example(UacUser.class);\n\t\tExample.Criteria criteria = example.createCriteria();\n\t\tcriteria.andEqualTo(\"email\", email);\n\t\tcriteria.andNotEqualTo(\"loginName\", loginName);\n\t\tint result = uacUserService.selectCountByExample(example);\n\t\tif (result > 0) {\n\t\t\tthrow new UacBizException(ErrorCodeEnum.UAC10011019);\n\t\t}\n\n\t\tString emailCode = RandomUtil.createNumberCode(6);\n\t\tString key = RedisKeyUtil.getSendEmailCodeKey(loginName, email);\n\t\t// 在redis中绑定验证码\n\t\tredisService.setKey(key, emailCode, 7 * 24, TimeUnit.HOURS);\n\n\t\t// 先写死 类型多了再抽方法\n\t\tMap<String, Object> param = Maps.newHashMap();\n\t\tparam.put(\"loginName\", loginName);\n\t\tparam.put(\"email\", email);\n\t\tparam.put(\"emailCode\", emailCode);\n\t\tparam.put(\"dateTime\", DateUtil.formatDateTime(new Date()));\n\n\t\tSet<String> to = Sets.newHashSet();\n\t\tto.add(email);\n\n\t\tMqMessageData mqMessageData = emailProducer.sendEmailMq(to, UacEmailTemplateEnum.RESET_USER_EMAIL, AliyunMqTopicConstants.MqTagEnum.RESET_LOGIN_PWD, param);\n\t\tuserManager.sendEmailCode(mqMessageData);\n\t}\n\n\t@Override\n\tpublic void checkEmailCode(SendEmailMessage sendEmailMessage, String loginName) {\n\n\t\tString email = sendEmailMessage.getEmail();\n\t\tString emailCode = sendEmailMessage.getEmailCode();\n\n\t\tPreconditions.checkArgument(StringUtils.isNotEmpty(email), ErrorCodeEnum.UAC10011018.msg());\n\t\tPreconditions.checkArgument(StringUtils.isNotEmpty(emailCode), \"验证码不能为空\");\n\n\t\t// 解密用户名密码\n\t\temail = decryptEmail(loginName, email);\n\t\tString key = RedisKeyUtil.getSendEmailCodeKey(loginName, email);\n\t\tString emailCodeRedis = redisService.getKey(key);\n\t\tPreconditions.checkArgument(StringUtils.isNotEmpty(emailCodeRedis), \"验证码已过期\");\n\t\tPreconditions.checkArgument(StringUtils.equals(emailCode, emailCodeRedis), \"验证码错误\");\n\t}\n\n\tprivate String decryptEmail(final String loginName, String email) {\n\t\ttry {\n\t\t\temail = HttpAesUtil.decrypt(email, KEY_STR, false, IV_STR);\n\t\t\tlog.info(\"发送短信 解密loginName={}\", loginName);\n\t\t\tlog.info(\"发送短信 解密email={}\", email);\n\t\t} catch (Exception ex) {\n\t\t\tlog.info(\"发送短信 解密手机号码失败 密文loginName={}, email={}\", loginName, email);\n\t\t\tthrow new UacBizException(ErrorCodeEnum.UAC10011031);\n\t\t}\n\t\treturn email;\n\t}\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/service/impl/MdcAddressServiceImpl.java",
    "content": "package com.paascloud.provider.service.impl;\n\nimport com.google.common.base.Preconditions;\nimport com.paascloud.base.enums.ErrorCodeEnum;\nimport com.paascloud.provider.exceptions.MdcBizException;\nimport com.paascloud.provider.model.dto.AddressDTO;\nimport com.paascloud.provider.service.MdcAddressQueryFeignApi;\nimport com.paascloud.provider.service.MdcAddressService;\nimport com.paascloud.wrapper.Wrapper;\nimport org.springframework.stereotype.Service;\nimport org.springframework.transaction.annotation.Transactional;\n\nimport javax.annotation.Resource;\n\n/**\n * The class Mdc address service.\n *\n * @author paascloud.net @gmail.com\n */\n@Service\n@Transactional(rollbackFor = Exception.class)\npublic class MdcAddressServiceImpl implements MdcAddressService {\n\t@Resource\n\tprivate MdcAddressQueryFeignApi mdcAddressQueryFeignApi;\n\n\t@Override\n\t@Transactional(readOnly = true, rollbackFor = Exception.class)\n\tpublic AddressDTO getAddressById(Long addressId) {\n\t\tPreconditions.checkArgument(addressId != null, \"地址ID不能为空\");\n\t\tWrapper<AddressDTO> wrapper = mdcAddressQueryFeignApi.getById(addressId);\n\n\t\tif (wrapper == null) {\n\t\t\tthrow new MdcBizException(ErrorCodeEnum.GL99990002);\n\t\t}\n\t\tif (wrapper.error()) {\n\t\t\tthrow new MdcBizException(ErrorCodeEnum.MDC10021002);\n\t\t}\n\t\treturn wrapper.getResult();\n\t}\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/service/impl/OpcRpcServiceImpl.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：OpcRpcServiceImpl.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.service.impl;\n\nimport com.paascloud.base.constant.GlobalConstant;\nimport com.paascloud.base.enums.ErrorCodeEnum;\nimport com.paascloud.provider.exceptions.MdcBizException;\nimport com.paascloud.provider.model.dto.gaode.GaodeLocation;\nimport com.paascloud.provider.service.OpcGaodeFeignApi;\nimport com.paascloud.provider.service.OpcRpcService;\nimport com.paascloud.wrapper.Wrapper;\nimport lombok.extern.slf4j.Slf4j;\nimport org.springframework.stereotype.Service;\n\nimport javax.annotation.Resource;\n\n\n/**\n * The class Opc rpc service.\n *\n * @author paascloud.net @gmail.com\n */\n@Slf4j\n@Service\npublic class OpcRpcServiceImpl implements OpcRpcService {\n\t@Resource\n\tprivate OpcGaodeFeignApi opcGaodeFeignApi;\n\n\t@Override\n\tpublic String getLocationById(String addressId) {\n\t\ttry {\n\t\t\tWrapper<GaodeLocation> wrapper = opcGaodeFeignApi.getLocationByIpAddr(addressId);\n\t\t\tif (wrapper == null) {\n\t\t\t\tthrow new MdcBizException(ErrorCodeEnum.GL99990002);\n\t\t\t}\n\t\t\tif (wrapper.error()) {\n\t\t\t\tthrow new MdcBizException(ErrorCodeEnum.MDC10021002);\n\t\t\t}\n\n\t\t\tGaodeLocation result = wrapper.getResult();\n\n\t\t\tassert result != null;\n\t\t\treturn result.getProvince().contains(\"市\") ? result.getCity() : result.getProvince() + GlobalConstant.Symbol.SHORT_LINE + result.getCity();\n\t\t} catch (Exception e) {\n\t\t\tlog.error(\"getLocationById={}\", e.getMessage(), e);\n\t\t}\n\t\treturn null;\n\t}\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/service/impl/PcSmsCodeSender.java",
    "content": "\npackage com.paascloud.provider.service.impl;\n\nimport com.paascloud.base.constant.AliyunSmsConstants;\nimport com.paascloud.provider.model.dto.sms.SmsMessage;\nimport com.paascloud.provider.service.SmsService;\nimport com.paascloud.security.core.validate.code.sms.SmsCodeSender;\nimport lombok.extern.slf4j.Slf4j;\n\nimport javax.annotation.Resource;\n\n/**\n * 默认的短信验证码发送器\n *\n * @author paascloud.net @gmail.com\n */\n@Slf4j\npublic class PcSmsCodeSender implements SmsCodeSender {\n\t@Resource\n\tprivate SmsService smsService;\n\n\t@Override\n\tpublic void send(String mobile, String code, String ip) {\n\t\tlog.info(\"ip地址:{}向手机: {}发送短信验证码:{}\", ip, mobile, code);\n\t\tSmsMessage smsMessage = new SmsMessage();\n\t\tsmsMessage.setMobileNo(mobile);\n\t\tsmsMessage.setSmsCode(code);\n\t\tsmsMessage.setSmsTemplateCode(AliyunSmsConstants.SmsTempletEnum.UAC_PC_GLOBAL_TEMPLATE.getTempletCode());\n\t\tsmsService.sendSmsCode(smsMessage, ip);\n\t}\n\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/service/impl/RedisHashServiceImpl.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：RedisHashServiceImpl.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.service.impl;\n\nimport com.google.common.collect.Lists;\nimport com.paascloud.PublicUtil;\nimport com.paascloud.provider.service.RedisHashService;\nimport lombok.extern.slf4j.Slf4j;\nimport org.springframework.data.redis.core.HashOperations;\nimport org.springframework.data.redis.core.StringRedisTemplate;\nimport org.springframework.stereotype.Service;\n\nimport javax.annotation.Resource;\nimport java.util.Collections;\nimport java.util.List;\nimport java.util.Map;\nimport java.util.Set;\n\n/**\n * The class Redis hash service.\n *\n * @author paascloud.net@gmail.com\n */\n@Slf4j\n@Service\npublic class RedisHashServiceImpl implements RedisHashService {\n\t@Resource\n\tprivate StringRedisTemplate rt;\n\n\t@Override\n\tpublic <T> List<T> getValueByFields(String key, Set<String> fields) {\n\t\tHashOperations<String, String, T> hash = rt.opsForHash();\n\t\tif (!rt.hasKey(key)) {\n\t\t\treturn Collections.emptyList();\n\t\t}\n\t\tList<T> values = hash.multiGet(key, fields);\n\t\tif (PublicUtil.isEmpty(values)) {\n\t\t\treturn Collections.emptyList();\n\t\t}\n\t\tlog.info(\"getValueByFields - 根据key获取所有给定字段的值. [OK] key={}, fields={}, values={}\", key, fields, values);\n\t\treturn values;\n\n\t}\n\n\t@Override\n\tpublic <T> List<T> getValueByField(String key, String field) {\n\t\tHashOperations<String, String, T> hash = rt.opsForHash();\n\t\tif (!rt.hasKey(key)) {\n\t\t\treturn Collections.emptyList();\n\t\t}\n\t\tT value = hash.get(key, field);\n\t\tif (PublicUtil.isEmpty(value)) {\n\t\t\treturn Collections.emptyList();\n\t\t}\n\t\tList<T> values = Lists.newArrayList();\n\t\tvalues.add(value);\n\t\tlog.info(\"getValueByField - 根据key获取给定字段的值. [OK] key={}, field={}, values={}\", key, field, values);\n\t\treturn values;\n\t}\n\n\t@Override\n\tpublic void setValueByFields(String key, Map<String, Object> map) {\n\t\tHashOperations<String, String, Object> hash = rt.opsForHash();\n\t\thash.putAll(key, map);\n\t\tlog.info(\"setValueByFields - 同时将多个 field-value (域-值)对设置到哈希表 key 中. [ok] key={}, map={}\", key, map);\n\t}\n\n\t@Override\n\tpublic Long removeFields(String key, String... hashKeys) {\n\t\tHashOperations<String, String, Object> hash = rt.opsForHash();\n\t\tLong result = hash.delete(key, (Object) hashKeys);\n\t\tlog.info(\"removeFields- 删除一个或多个哈希表字段. [OK] key={}, hashKeys={}, result={}\", key, hashKeys, result);\n\t\treturn result;\n\t}\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/service/impl/RedisServiceImpl.java",
    "content": "package com.paascloud.provider.service.impl;\n\nimport com.google.common.base.Preconditions;\nimport com.paascloud.base.constant.GlobalConstant;\nimport com.paascloud.provider.service.RedisService;\nimport lombok.extern.slf4j.Slf4j;\nimport org.apache.commons.lang3.StringUtils;\nimport org.springframework.data.redis.core.StringRedisTemplate;\nimport org.springframework.data.redis.core.ValueOperations;\nimport org.springframework.stereotype.Service;\n\nimport javax.annotation.Resource;\nimport java.util.concurrent.TimeUnit;\n\n/**\n * The class Redis service.\n *\n * @author paascloud.net@gmail.com\n */\n@Slf4j\n@Service\npublic class RedisServiceImpl implements RedisService {\n\t@Resource\n\tprivate StringRedisTemplate rt;\n\n\t@Override\n\tpublic String getKey(String key) {\n\t\tString value = null;\n\t\tValueOperations<String, String> ops = rt.opsForValue();\n\t\tif (rt.hasKey(key)) {\n\t\t\tvalue = ops.get(key);\n\t\t}\n\t\tlog.info(\"getKey. [OK] key={}, value={}\", key, value);\n\t\treturn value;\n\t}\n\n\t@Override\n\tpublic void deleteKey(String key) {\n\t\trt.delete(key);\n\t\tlog.info(\"deleteKey. [OK] key={}\", key);\n\n\t}\n\n\t@Override\n\tpublic void setKey(String key, String value) {\n\t\tPreconditions.checkArgument(StringUtils.isNotEmpty(key), \"Redis key is not null\");\n\n\t\tValueOperations<String, String> ops = rt.opsForValue();\n\t\tops.set(key, value);\n\t\trt.expire(key, GlobalConstant.Sys.REDIS_DEFAULT_EXPIRE, TimeUnit.MINUTES);\n\t\tlog.info(\"setKey. [OK] key={}, value={}, expire=默认超时时间\", key, value);\n\n\n\t}\n\n\t@Override\n\tpublic void setKey(String key, String value, long timeout, TimeUnit unit) {\n\t\tPreconditions.checkArgument(StringUtils.isNotEmpty(key), \"Redis key is not null\");\n\t\tPreconditions.checkArgument(unit != null, \"TimeUnit is not null\");\n\t\tValueOperations<String, String> ops = rt.opsForValue();\n\t\tops.set(key, value);\n\t\trt.expire(key, timeout, unit);\n\t\tlog.info(\"setKey. [OK] key={}, value={}, timeout={}, unit={}\", key, value, timeout, unit);\n\n\t}\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/service/impl/RedisSetServiceImpl.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：RedisSetServiceImpl.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.service.impl;\n\nimport com.paascloud.provider.service.RedisSetService;\nimport lombok.extern.slf4j.Slf4j;\nimport org.springframework.data.redis.core.SetOperations;\nimport org.springframework.data.redis.core.StringRedisTemplate;\nimport org.springframework.stereotype.Service;\n\nimport javax.annotation.Resource;\nimport java.util.Set;\n\n/**\n * The class Redis set service.\n *\n * @author paascloud.net@gmail.com\n */\n@Slf4j\n@Service\npublic class RedisSetServiceImpl implements RedisSetService {\n\t@Resource\n\tprivate StringRedisTemplate rt;\n\n\t@Override\n\tpublic Set<String> getAllValue(String key) {\n\t\tSet<String> result;\n\t\tSetOperations<String, String> setOps = rt.opsForSet();\n\t\tresult = setOps.members(key);\n\t\tlog.info(\"getAllValue - 根据key获取元素. [OK] key={}, value={}\", key, result);\n\t\treturn result;\n\t}\n\n\t@Override\n\tpublic Long add(String key, String... value) {\n\t\tSetOperations<String, String> setOps = rt.opsForSet();\n\t\tLong result = setOps.add(key, value);\n\t\tlog.info(\"add - 向key里面添加元素, key={}, value={}, result={}\", key, value, result);\n\t\treturn result;\n\t}\n\n\t@Override\n\tpublic Long remove(String key, String... value) {\n\t\tSetOperations<String, String> setOps = rt.opsForSet();\n\t\tLong result = setOps.remove(key, (Object) value);\n\t\tlog.info(\"remove - 根据key移除元素, key={}, value={}, result={}\", key, value, result);\n\t\treturn result;\n\t}\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/service/impl/SmsServiceImpl.java",
    "content": "package com.paascloud.provider.service.impl;\n\nimport com.google.common.base.Preconditions;\nimport com.paascloud.PubUtils;\nimport com.paascloud.RedisKeyUtil;\nimport com.paascloud.base.constant.AliyunSmsConstants;\nimport com.paascloud.core.generator.UniqueIdGenerator;\nimport com.paascloud.provider.manager.UserManager;\nimport com.paascloud.provider.model.domain.MqMessageData;\nimport com.paascloud.provider.model.domain.UacUser;\nimport com.paascloud.provider.model.dto.sms.SmsMessage;\nimport com.paascloud.provider.mq.producer.SmsProducer;\nimport com.paascloud.provider.service.SmsService;\nimport com.paascloud.provider.service.UacUserService;\nimport com.paascloud.security.core.validate.code.CookieUtil;\nimport lombok.extern.slf4j.Slf4j;\nimport org.apache.commons.lang.StringUtils;\nimport org.springframework.data.redis.core.RedisTemplate;\nimport org.springframework.stereotype.Service;\n\nimport javax.annotation.Resource;\nimport javax.servlet.http.HttpServletResponse;\nimport java.util.concurrent.TimeUnit;\n\n/**\n * The class Sms service.\n *\n * @author paascloud.net@gmail.com\n */\n@Slf4j\n@Service\npublic class SmsServiceImpl implements SmsService {\n\t@Resource\n\tprivate SmsProducer smsProducer;\n\t@Resource\n\tprivate UacUserService uacUserService;\n\t@Resource\n\tprivate RedisTemplate<String, Object> redisTemplate;\n\t@Resource\n\tprivate UserManager userManager;\n\n\t@Override\n\tpublic void sendSmsCode(SmsMessage smsMessage, String ipAddr) {\n\t\tPreconditions.checkArgument(smsMessage != null, \"短信参数不能为空\");\n\t\tPreconditions.checkArgument(StringUtils.isNotEmpty(ipAddr), \"非法的IP地址\");\n\t\tString mobileNo = smsMessage.getMobileNo();\n\t\tPreconditions.checkArgument(StringUtils.isNotEmpty(mobileNo), \"手机号码不能为空\");\n\t\tString smsTemplateCode = smsMessage.getSmsTemplateCode();\n\n\t\tPreconditions.checkArgument(AliyunSmsConstants.SmsTempletEnum.isSmsTemplate(smsTemplateCode), \"短信模板没有维护\");\n\n\t\tsmsMessage.setMobileNo(mobileNo);\n\t\tsmsMessage.setOutId(ipAddr);\n\t\tAliyunSmsConstants.SmsTempletEnum templetEnum = AliyunSmsConstants.SmsTempletEnum.getEnum(smsTemplateCode);\n\t\tMqMessageData mqMessageData = smsProducer.sendSmsCodeMq(smsMessage, templetEnum);\n\t\tuserManager.sendSmsCode(mqMessageData);\n\n\t}\n\n\t@Override\n\tpublic String submitResetPwdPhone(String mobile, HttpServletResponse response) {\n\t\tPreconditions.checkArgument(StringUtils.isNotEmpty(mobile), \"手机号码不能为空\");\n\t\tPreconditions.checkArgument(PubUtils.isMobileNumber(mobile), \"手机号码格式不正确\");\n\n\t\tString resetPwdKey = PubUtils.uuid() + UniqueIdGenerator.generateId();\n\n\t\tUacUser user = uacUserService.findByMobileNo(mobile);\n\t\tredisTemplate.opsForValue().set(RedisKeyUtil.getResetPwdTokenKey(resetPwdKey), user, 10, TimeUnit.MINUTES);\n\t\tCookieUtil.setCookie(\"PASSCLOUD_PAAS_resetPwdKey\", resetPwdKey, 10 * 60, response);\n\t\treturn resetPwdKey;\n\t}\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/service/impl/UacActionServiceImpl.java",
    "content": "package com.paascloud.provider.service.impl;\n\nimport com.github.pagehelper.PageHelper;\nimport com.github.pagehelper.PageInfo;\nimport com.google.common.base.Joiner;\nimport com.google.common.base.Preconditions;\nimport com.paascloud.PublicUtil;\nimport com.paascloud.base.constant.GlobalConstant;\nimport com.paascloud.base.dto.LoginAuthDto;\nimport com.paascloud.base.enums.ErrorCodeEnum;\nimport com.paascloud.core.support.BaseService;\nimport com.paascloud.provider.mapper.UacActionMapper;\nimport com.paascloud.provider.mapper.UacRoleActionMapper;\nimport com.paascloud.provider.model.domain.UacAction;\nimport com.paascloud.provider.model.domain.UacMenu;\nimport com.paascloud.provider.model.dto.action.ActionMainQueryDto;\nimport com.paascloud.provider.model.exceptions.UacBizException;\nimport com.paascloud.provider.model.vo.ActionVo;\nimport com.paascloud.provider.model.vo.MenuVo;\nimport com.paascloud.provider.service.UacActionService;\nimport org.apache.commons.lang3.StringUtils;\nimport org.springframework.beans.BeanUtils;\nimport org.springframework.stereotype.Service;\nimport org.springframework.transaction.annotation.Transactional;\nimport org.springframework.util.AntPathMatcher;\n\nimport javax.annotation.Resource;\nimport java.util.List;\nimport java.util.Objects;\n\n/**\n * The class Uac action service.\n *\n * @author paascloud.net@gmail.com\n */\n@Service\n@Transactional(rollbackFor = Exception.class)\npublic class UacActionServiceImpl extends BaseService<UacAction> implements UacActionService {\n\t@Resource\n\tprivate UacActionMapper uacActionMapper;\n\t@Resource\n\tprivate UacRoleActionMapper uacRoleActionMapper;\n\tprivate AntPathMatcher antPathMatcher = new AntPathMatcher();\n\n\t@Override\n\t@Transactional(readOnly = true, rollbackFor = Exception.class)\n\tpublic PageInfo queryActionListWithPage(ActionMainQueryDto actionMainQueryDto) {\n\t\tList<Long> menuIdList = actionMainQueryDto.getMenuIdList();\n\t\tLong menuId = null;\n\t\tif (PublicUtil.isNotEmpty(menuIdList)) {\n\t\t\tmenuId = menuIdList.get(menuIdList.size() - 1);\n\t\t}\n\t\tUacAction uacAction = new UacAction();\n\t\tuacAction.setMenuId(menuId);\n\t\tBeanUtils.copyProperties(actionMainQueryDto, uacAction);\n\t\tuacAction.setOrderBy(\"update_time desc\");\n\t\tPageHelper.startPage(actionMainQueryDto.getPageNum(), actionMainQueryDto.getPageSize());\n\t\tList<ActionVo> actionList = uacActionMapper.queryActionListWithPage(uacAction);\n\t\treturn new PageInfo<>(actionList);\n\t}\n\n\t@Override\n\tpublic int deleteActionById(Long actionId) {\n\t\t//查询该角色下是否有用户绑定, 有的话提醒不能删除\n\t\tif (null == actionId) {\n\t\t\tthrow new IllegalArgumentException(\"权限ID不能为空\");\n\t\t}\n\n\t\tUacAction uacAction = uacActionMapper.selectByPrimaryKey(actionId);\n\t\tif (uacAction == null) {\n\t\t\tlogger.error(\"找不到权限信息 actionId={}\", actionId);\n\t\t\tthrow new UacBizException(ErrorCodeEnum.UAC10014001, actionId);\n\t\t}\n\n\t\t// 删除角色权限表数据  不查询了 直接删除了\n\t\tuacRoleActionMapper.deleteByActionId(actionId);\n\n\t\treturn uacActionMapper.deleteByPrimaryKey(actionId);\n\t}\n\n\t@Override\n\tpublic void batchDeleteByIdList(List<Long> deleteIdList) {\n\t\tlogger.info(\"批量删除角色. deleteIdList={}\", deleteIdList);\n\t\tPreconditions.checkArgument(PublicUtil.isNotEmpty(deleteIdList), \"删除权限ID不能为空\");\n\t\tint result = uacActionMapper.batchDeleteByIdList(deleteIdList);\n\t\tif (result < deleteIdList.size()) {\n\t\t\tthrow new UacBizException(ErrorCodeEnum.UAC10014002, Joiner.on(GlobalConstant.Symbol.COMMA).join(deleteIdList));\n\t\t}\n\t}\n\n\t@Override\n\tpublic void saveAction(UacAction action, LoginAuthDto loginAuthDto) {\n\t\tList<Long> menuIdList = action.getMenuIdList();\n\t\tLong menuId;\n\t\tPreconditions.checkArgument(PublicUtil.isNotEmpty(menuIdList), \"菜单名称不能为空\");\n\t\tmenuId = menuIdList.get(menuIdList.size() - 1);\n\t\taction.setMenuId(menuId);\n\t\taction.setUpdateInfo(loginAuthDto);\n\t\tif (action.isNew()) {\n\t\t\tLong actionId = super.generateId();\n\t\t\taction.setId(actionId);\n\t\t\tuacActionMapper.insertSelective(action);\n\t\t} else {\n\t\t\tint result = uacActionMapper.updateByPrimaryKeySelective(action);\n\t\t\tif (result < 1) {\n\t\t\t\tthrow new UacBizException(ErrorCodeEnum.UAC10014003);\n\t\t\t}\n\t\t}\n\t}\n\n\t@Override\n\tpublic int deleteByMenuId(Long id) {\n\t\tPreconditions.checkArgument(id != null, \"菜单ID不能为空\");\n\n\t\treturn uacActionMapper.deleteByMenuId(id);\n\t}\n\n\t@Override\n\t@Transactional(readOnly = true, rollbackFor = Exception.class)\n\tpublic List<Long> getCheckedActionList(Long roleId) {\n\t\tif (roleId == null) {\n\t\t\tthrow new UacBizException(ErrorCodeEnum.UAC10012001);\n\t\t}\n\t\treturn uacActionMapper.getCheckedActionList(roleId);\n\t}\n\n\t@Override\n\t@Transactional(readOnly = true, rollbackFor = Exception.class)\n\tpublic List<MenuVo> getOwnAuthList(Long userId) {\n\t\treturn uacActionMapper.getOwnAuthList(userId);\n\t}\n\n\t@Override\n\t@Transactional(readOnly = true, rollbackFor = Exception.class)\n\tpublic List<Long> getCheckedMenuList(Long roleId) {\n\t\tif (roleId == null) {\n\t\t\tthrow new UacBizException(ErrorCodeEnum.UAC10012001);\n\t\t}\n\t\treturn uacActionMapper.getCheckedMenuList(roleId);\n\t}\n\n\t@Override\n\tpublic List<UacAction> getOwnActionListByUserId(Long userId) {\n\t\tif (userId == null) {\n\t\t\tthrow new UacBizException(ErrorCodeEnum.UAC10011001);\n\t\t}\n\t\tList<UacAction> uacActionList;\n\t\tif (Objects.equals(userId, GlobalConstant.Sys.SUPER_MANAGER_USER_ID)) {\n\t\t\t// 获取全部权限信息\n\t\t\tuacActionList = uacActionMapper.selectAll();\n\t\t} else {\n\t\t\tuacActionList = uacActionMapper.getOwnUacActionListByUserId(userId);\n\t\t}\n\t\treturn uacActionList;\n\t}\n\n\t@Override\n\tpublic List<UacAction> listActionListByRoleId(Long roleId) {\n\t\treturn uacActionMapper.listActionListByRoleId(roleId);\n\t}\n\n\t@Override\n\tpublic List<UacAction> listActionList(List<UacMenu> uacMenus) {\n\t\treturn uacActionMapper.listActionList(uacMenus);\n\t}\n\n\t@Override\n\tpublic UacAction matchesByUrl(String requestUrl) {\n\t\tList<UacAction> uacActionList = uacActionMapper.selectAll();\n\t\tfor (UacAction uacAction : uacActionList) {\n\t\t\tString url = uacAction.getUrl();\n\t\t\tif (StringUtils.isEmpty(url)) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (antPathMatcher.match(url, requestUrl)) {\n\t\t\t\treturn uacAction;\n\t\t\t}\n\n\t\t}\n\t\treturn null;\n\t}\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/service/impl/UacFreeMarkerServiceImpl.java",
    "content": "package com.paascloud.provider.service.impl;\n\nimport com.google.common.base.Preconditions;\nimport com.paascloud.provider.service.UacFreeMarkerService;\nimport freemarker.template.Configuration;\nimport freemarker.template.Template;\nimport freemarker.template.TemplateException;\nimport org.apache.commons.lang3.StringUtils;\nimport org.springframework.stereotype.Service;\nimport org.springframework.ui.freemarker.FreeMarkerTemplateUtils;\n\nimport javax.annotation.Resource;\nimport java.io.IOException;\nimport java.util.Map;\n\n/**\n * The class Uac free marker service.\n *\n * @author paascloud.net@gmail.com\n */\n@Service\npublic class UacFreeMarkerServiceImpl implements UacFreeMarkerService {\n\n\t@Resource\n\tprivate Configuration configuration;\n\n\t@Override\n\tpublic String getTemplate(Map<String, Object> map, String templateLocation) throws IOException, TemplateException {\n\t\tPreconditions.checkArgument(StringUtils.isNotEmpty(templateLocation), \"模板不能为空\");\n\n\t\tTemplate t = configuration.getTemplate(templateLocation, \"UTF-8\");\n\t\treturn FreeMarkerTemplateUtils.processTemplateIntoString(t, map);\n\n//        return VelocityEngineUtils.mergeTemplateIntoString(velocityEngine, templateLocation, \"UTF-8\", map);\n\t}\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/service/impl/UacGroupServiceImpl.java",
    "content": "package com.paascloud.provider.service.impl;\n\nimport com.google.common.base.Preconditions;\nimport com.google.common.collect.Lists;\nimport com.google.common.collect.Sets;\nimport com.paascloud.Collections3;\nimport com.paascloud.PublicUtil;\nimport com.paascloud.base.constant.GlobalConstant;\nimport com.paascloud.base.dto.LoginAuthDto;\nimport com.paascloud.base.enums.ErrorCodeEnum;\nimport com.paascloud.core.support.BaseService;\nimport com.paascloud.provider.mapper.UacGroupMapper;\nimport com.paascloud.provider.mapper.UacGroupUserMapper;\nimport com.paascloud.provider.mapper.UacRoleMapper;\nimport com.paascloud.provider.mapper.UacRoleUserMapper;\nimport com.paascloud.provider.model.domain.UacGroup;\nimport com.paascloud.provider.model.domain.UacGroupUser;\nimport com.paascloud.provider.model.domain.UacUser;\nimport com.paascloud.provider.model.dto.group.GroupBindUserDto;\nimport com.paascloud.provider.model.dto.group.GroupBindUserReqDto;\nimport com.paascloud.provider.model.dto.role.BindUserDto;\nimport com.paascloud.provider.model.dto.user.IdStatusDto;\nimport com.paascloud.provider.model.enums.UacGroupStatusEnum;\nimport com.paascloud.provider.model.exceptions.UacBizException;\nimport com.paascloud.provider.model.vo.GroupZtreeVo;\nimport com.paascloud.provider.model.vo.MenuVo;\nimport com.paascloud.provider.service.MdcAddressService;\nimport com.paascloud.provider.service.UacGroupService;\nimport com.paascloud.provider.service.UacUserService;\nimport com.paascloud.provider.utils.TreeUtil;\nimport org.springframework.stereotype.Service;\nimport org.springframework.transaction.annotation.Transactional;\nimport org.springframework.util.StringUtils;\n\nimport javax.annotation.Resource;\nimport java.util.*;\n\n/**\n * The class Uac group service.\n *\n * @author paascloud.net@gmail.com\n */\n@Service\n@Transactional(rollbackFor = Exception.class)\npublic class UacGroupServiceImpl extends BaseService<UacGroup> implements UacGroupService {\n\n\t@Resource\n\tprivate UacGroupMapper uacGroupMapper;\n\t@Resource\n\tprivate UacGroupUserMapper uacGroupUserMapper;\n\t@Resource\n\tprivate UacRoleUserMapper uacRoleUserMapper;\n\t@Resource\n\tprivate UacRoleMapper uacRoleMapper;\n\t@Resource\n\tprivate UacUserService uacUserService;\n\t@Resource\n\tprivate MdcAddressService mdcAddressService;\n\n\tprivate int addUacGroup(UacGroup group) {\n\t\tif (StringUtils.isEmpty(group.getStatus())) {\n\t\t\tgroup.setStatus(UacGroupStatusEnum.ENABLE.getStatus());\n\t\t}\n\t\treturn uacGroupMapper.insertSelective(group);\n\t}\n\n\tprivate int editUacGroup(UacGroup group) {\n\t\treturn uacGroupMapper.updateByPrimaryKeySelective(group);\n\t}\n\n\t@Override\n\tpublic int updateUacGroupStatusById(IdStatusDto idStatusDto, LoginAuthDto loginAuthDto) {\n\n\t\tLong groupId = idStatusDto.getId();\n\t\tInteger status = idStatusDto.getStatus();\n\n\t\tUacGroup uacGroup = new UacGroup();\n\t\tuacGroup.setId(groupId);\n\t\tuacGroup.setStatus(status);\n\n\t\tUacGroup group = uacGroupMapper.selectByPrimaryKey(groupId);\n\t\tif (PublicUtil.isEmpty(group)) {\n\t\t\tthrow new UacBizException(ErrorCodeEnum.UAC10015001, groupId);\n\t\t}\n\t\tif (!UacGroupStatusEnum.contains(status)) {\n\t\t\tthrow new UacBizException(ErrorCodeEnum.UAC10015002);\n\t\t}\n\n\t\t//查询所有的组织\n\t\tList<UacGroup> totalGroupList = uacGroupMapper.selectAll();\n\t\tList<GroupZtreeVo> totalList = Lists.newArrayList();\n\t\tGroupZtreeVo zTreeVo;\n\t\tfor (UacGroup vo : totalGroupList) {\n\t\t\tzTreeVo = new GroupZtreeVo();\n\t\t\tzTreeVo.setId(vo.getId());\n\t\t\ttotalList.add(zTreeVo);\n\t\t}\n\n\t\tUacGroupUser uacGroupUser = new UacGroupUser();\n\t\tuacGroupUser.setUserId(loginAuthDto.getUserId());\n\t\tUacGroupUser groupUser = uacGroupUserMapper.selectOne(uacGroupUser);\n\t\t// 查询当前登陆人所在的组织信息\n\t\tUacGroup currentUserUacGroup = uacGroupMapper.selectByPrimaryKey(groupUser.getGroupId());\n\t\t// 查询当前登陆人能禁用的所有子节点\n\t\tList<GroupZtreeVo> childGroupList = this.getGroupTree(currentUserUacGroup.getId());\n\t\t// 计算不能禁用的组织= 所有的组织 - 禁用的所有子节点\n\t\ttotalList.removeAll(childGroupList);\n\t\t// 判断所选的组织是否在不能禁用的列表里\n\t\tGroupZtreeVo zTreeVo1 = new GroupZtreeVo();\n\t\tzTreeVo1.setId(group.getId());\n\t\tif (totalList.contains(zTreeVo1)) {\n\t\t\tthrow new UacBizException(ErrorCodeEnum.UAC10011023);\n\t\t}\n\t\tif (groupUser.getGroupId().equals(uacGroup.getId()) && UacGroupStatusEnum.ENABLE.getStatus() == group.getStatus()) {\n\t\t\tthrow new UacBizException(ErrorCodeEnum.UAC10011023);\n\t\t}\n\t\tuacGroup.setGroupName(group.getGroupName());\n\t\tuacGroup.setGroupCode(group.getGroupCode());\n\t\tuacGroup.setVersion(group.getVersion() + 1);\n\t\tint result = uacGroupMapper.updateByPrimaryKeySelective(uacGroup);\n\t\t// 获取当前所选组织的所有子节点\n\t\tList<GroupZtreeVo> childUacGroupList = this.getGroupTree(uacGroup.getId());\n\t\t// 批量修改组织状态\n\t\tif (PublicUtil.isNotEmpty(childUacGroupList)) {\n\t\t\tUacGroup childGroup;\n\t\t\tfor (GroupZtreeVo uacGroup1 : childUacGroupList) {\n\t\t\t\tif (UacGroupStatusEnum.ENABLE.getStatus() == status) {\n\t\t\t\t\tUacGroup parentGroup = uacGroupMapper.selectByPrimaryKey(uacGroup1.getpId());\n\t\t\t\t\tif (parentGroup.getStatus() == UacGroupStatusEnum.DISABLE.getStatus()) {\n\t\t\t\t\t\tthrow new UacBizException(ErrorCodeEnum.UAC10015003);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tchildGroup = new UacGroup();\n\t\t\t\tchildGroup.setStatus(uacGroup.getStatus());\n\t\t\t\tchildGroup.setId(uacGroup1.getId());\n\t\t\t\tresult = uacGroupMapper.updateByPrimaryKeySelective(childGroup);\n\t\t\t\tif (result < 1) {\n\t\t\t\t\tthrow new UacBizException(ErrorCodeEnum.UAC10015006, uacGroup1.getId());\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn result;\n\t}\n\n\t@Override\n\tpublic int deleteUacGroupById(Long id) {\n\n\t\tPreconditions.checkArgument(id != null, \"组织id为空\");\n\t\tPreconditions.checkArgument(!Objects.equals(id, GlobalConstant.Sys.SUPER_MANAGER_GROUP_ID), \"该组织不能删除\");\n\n\t\t// 根据前台传入的组织参数校验该组织是否存在\n\t\tUacGroup uacGroup = uacGroupMapper.selectByPrimaryKey(id);\n\t\tif (PublicUtil.isEmpty(uacGroup)) {\n\t\t\tthrow new UacBizException(ErrorCodeEnum.UAC10015004, id);\n\t\t}\n\t\t//判断该组织下是否存在子节点\n\t\tUacGroup childGroup = new UacGroup();\n\t\tchildGroup.setPid(id);\n\t\tList<UacGroup> childGroupList = uacGroupMapper.select(childGroup);\n\t\tif (PublicUtil.isNotEmpty(childGroupList)) {\n\t\t\tthrow new UacBizException(ErrorCodeEnum.UAC10015007, id);\n\t\t}\n\t\t//判断该组织下是否存在用户\n\t\tUacGroupUser uacGroupUser = new UacGroupUser();\n\t\tuacGroupUser.setGroupId(id);\n\t\tList<UacGroupUser> uacGroupUserList = uacGroupUserMapper.select(uacGroupUser);\n\t\tif (PublicUtil.isNotEmpty(uacGroupUserList)) {\n\t\t\tthrow new UacBizException(ErrorCodeEnum.UAC10015008, id);\n\t\t}\n\n\t\treturn mapper.deleteByPrimaryKey(id);\n\t}\n\n\t@Override\n\t@Transactional(readOnly = true, rollbackFor = Exception.class)\n\tpublic UacGroup queryById(Long groupId) {\n\t\tPreconditions.checkArgument(PublicUtil.isNotEmpty(groupId), \"组织Id不能为空\");\n\t\tUacGroup query = new UacGroup();\n\t\tquery.setId(groupId);\n\t\treturn uacGroupMapper.selectOne(query);\n\t}\n\n\t@Override\n\t@Transactional(readOnly = true, rollbackFor = Exception.class)\n\tpublic List<GroupZtreeVo> getGroupTree(Long groupId) {\n\t\t// 1. 如果是仓库则 直接把仓库信息封装成ztreeVo返回\n\t\tList<GroupZtreeVo> tree = Lists.newArrayList();\n\n\t\tUacGroup uacGroup = uacGroupMapper.selectByPrimaryKey(groupId);\n\n\t\tGroupZtreeVo zTreeMenuVo = buildGroupZTreeVoByGroup(uacGroup);\n\t\tif (0L == uacGroup.getPid()) {\n\t\t\tzTreeMenuVo.setOpen(true);\n\t\t}\n\n\t\ttree.add(zTreeMenuVo);\n\n\t\t// 2.如果是组织id则遍历组织+仓库的树结构\n\n\t\t// 如果是组织 则查询父id为\n\t\tUacGroup uacGroupQuery = new UacGroup();\n\t\tuacGroupQuery.setPid(groupId);\n\t\tList<UacGroup> groupList = uacGroupMapper.select(uacGroupQuery);\n\t\tif (PublicUtil.isNotEmpty(groupList)) {\n\t\t\ttree = buildNode(groupList, tree);\n\t\t}\n\n\t\treturn tree;\n\t}\n\n\t@Override\n\t@Transactional(readOnly = true, rollbackFor = Exception.class)\n\tpublic List<MenuVo> getGroupTreeListByUserId(Long userId) {\n\t\tUacGroupUser groupUser = uacGroupUserMapper.getByUserId(userId);\n\t\tLong groupId = groupUser.getGroupId();\n\t\t//查询当前登陆人所在的组织信息\n\t\tUacGroup currentUserUacGroup = uacGroupMapper.selectByPrimaryKey(groupId);\n\t\t//获取当前所选组织的所有子节点\n\t\tList<GroupZtreeVo> childUacGroupList = this.getGroupTree(currentUserUacGroup.getId());\n\t\treturn this.buildGroupTree(childUacGroupList, groupId);\n\t}\n\n\tprivate List<MenuVo> buildGroupTree(List<GroupZtreeVo> childUacGroupList, Long currentGroupId) {\n\t\tList<MenuVo> listVo = Lists.newArrayList();\n\t\tMenuVo menuVo;\n\t\tfor (GroupZtreeVo group : childUacGroupList) {\n\t\t\tmenuVo = new MenuVo();\n\t\t\tmenuVo.setId(group.getId());\n\t\t\tif (currentGroupId.equals(group.getId())) {\n\t\t\t\tmenuVo.setPid(0L);\n\t\t\t} else {\n\t\t\t\tmenuVo.setPid(group.getpId());\n\t\t\t}\n\t\t\tmenuVo.setMenuCode(group.getGroupCode());\n\t\t\tmenuVo.setMenuName(group.getGroupName());\n\t\t\tlistVo.add(menuVo);\n\t\t}\n\n\t\treturn TreeUtil.getChildMenuVos(listVo, 0L);\n\t}\n\n\t@Override\n\t@Transactional(readOnly = true, rollbackFor = Exception.class)\n\tpublic GroupBindUserDto getGroupBindUserDto(Long groupId, Long currentUserId) {\n\t\tGroupBindUserDto groupBindUserDto = new GroupBindUserDto();\n\t\tSet<Long> alreadyBindUserIdSet = Sets.newHashSet();\n\t\tUacGroup uacGroup = uacGroupMapper.selectByPrimaryKey(groupId);\n\t\tif (PublicUtil.isEmpty(uacGroup)) {\n\t\t\tlogger.error(\"找不到uacGroup={}, 的组织\", uacGroup);\n\t\t\tthrow new UacBizException(ErrorCodeEnum.UAC10015001, groupId);\n\t\t}\n\n\t\t// 查询所有用户包括已禁用的用户\n\t\tList<BindUserDto> bindUserDtoList = uacRoleMapper.selectAllNeedBindUser(GlobalConstant.Sys.SUPER_MANAGER_ROLE_ID, currentUserId);\n\t\t// 该组织已经绑定的用户\n\t\tList<UacGroupUser> setAlreadyBindUserSet = uacGroupUserMapper.listByGroupId(groupId);\n\n\t\tSet<BindUserDto> allUserSet = new HashSet<>(bindUserDtoList);\n\n\t\tfor (UacGroupUser uacGroupUser : setAlreadyBindUserSet) {\n\t\t\talreadyBindUserIdSet.add(uacGroupUser.getUserId());\n\t\t}\n\n\t\tgroupBindUserDto.setAllUserSet(allUserSet);\n\t\tgroupBindUserDto.setAlreadyBindUserIdSet(alreadyBindUserIdSet);\n\n\t\treturn groupBindUserDto;\n\t}\n\n\t/**\n\t * Bind uac user 4 group int.\n\t *\n\t * @param groupBindUserReqDto the group bind user req dto\n\t * @param authResDto          the auth res dto\n\t */\n\t@Override\n\tpublic void bindUacUser4Group(GroupBindUserReqDto groupBindUserReqDto, LoginAuthDto authResDto) {\n\t\tif (groupBindUserReqDto == null) {\n\t\t\tlogger.error(\"参数不能为空\");\n\t\t\tthrow new IllegalArgumentException(\"参数不能为空\");\n\t\t}\n\n\t\tLong groupId = groupBindUserReqDto.getGroupId();\n\t\tLong loginUserId = authResDto.getUserId();\n\t\tList<Long> userIdList = groupBindUserReqDto.getUserIdList();\n\n\t\tif (null == groupId) {\n\t\t\tthrow new IllegalArgumentException(\"組織ID不能为空\");\n\t\t}\n\n\t\tUacGroup group = uacGroupMapper.selectByPrimaryKey(groupId);\n\n\t\tif (group == null) {\n\t\t\tlogger.error(\"找不到角色信息 groupId={}\", groupId);\n\t\t\tthrow new UacBizException(ErrorCodeEnum.UAC10015001, groupId);\n\t\t}\n\n\t\tif (PublicUtil.isNotEmpty(userIdList) && userIdList.contains(loginUserId)) {\n\t\t\tlogger.error(\"不能操作当前登录用户 userId={}\", loginUserId);\n\t\t\tthrow new UacBizException(ErrorCodeEnum.UAC10011023);\n\t\t}\n\n\t\t// 查询超级管理员用户Id集合\n\t\tList<Long> superUserList = uacRoleUserMapper.listSuperUser(GlobalConstant.Sys.SUPER_MANAGER_ROLE_ID);\n\t\tList<Long> unionList = Collections3.intersection(userIdList, superUserList);\n\t\tif (PublicUtil.isNotEmpty(userIdList) && PublicUtil.isNotEmpty(unionList)) {\n\t\t\tlogger.error(\"不能操作超级管理员用户 超级用户={}\", unionList);\n\t\t\tthrow new UacBizException(ErrorCodeEnum.UAC10011023);\n\t\t}\n\n\t\t// 1. 先取消对该角色的用户绑定(不包含超级管理员用户)\n\t\tList<UacGroupUser> groupUsers = uacGroupUserMapper.listByGroupId(groupId);\n\n\t\tif (PublicUtil.isNotEmpty(groupUsers)) {\n\t\t\tuacGroupUserMapper.deleteExcludeSuperMng(groupId, GlobalConstant.Sys.SUPER_MANAGER_ROLE_ID);\n\t\t}\n\n\t\tif (PublicUtil.isEmpty(userIdList)) {\n\t\t\t// 取消该角色的所有用户的绑定\n\t\t\tlogger.info(\"取消绑定所有非超级管理员用户成功\");\n\t\t\treturn;\n\t\t}\n\n\t\t// 绑定所选用户\n\t\tfor (Long userId : userIdList) {\n\t\t\tUacUser uacUser = uacUserService.queryByUserId(userId);\n\t\t\tif (PublicUtil.isEmpty(uacUser)) {\n\t\t\t\tlogger.error(\"找不到绑定的用户 userId={}\", userId);\n\t\t\t\tthrow new UacBizException(ErrorCodeEnum.UAC10011024, userId);\n\t\t\t}\n\t\t\tUacGroupUser uacGroupUser = new UacGroupUser();\n\t\t\tuacGroupUser.setUserId(userId);\n\t\t\tuacGroupUser.setGroupId(groupId);\n\t\t\tuacGroupUserMapper.insertSelective(uacGroupUser);\n\t\t}\n\t}\n\n\t@Override\n\tpublic int saveUacGroup(UacGroup group, LoginAuthDto loginAuthDto) {\n\n\t\tint result;\n\t\tPreconditions.checkArgument(!StringUtils.isEmpty(group.getPid()), \"上级节点不能为空\");\n\n\t\tUacGroup parenGroup = uacGroupMapper.selectByPrimaryKey(group.getPid());\n\t\tif (PublicUtil.isEmpty(parenGroup)) {\n\t\t\tthrow new UacBizException(ErrorCodeEnum.UAC10015009, group.getPid());\n\t\t}\n\t\tsetGroupAddress(group);\n\t\tgroup.setUpdateInfo(loginAuthDto);\n\n\t\tif (group.isNew()) {\n\t\t\tLong groupId = super.generateId();\n\t\t\tgroup.setId(groupId);\n\t\t\tgroup.setLevel(parenGroup.getLevel() + 1);\n\t\t\tresult = this.addUacGroup(group);\n\t\t} else {\n\t\t\tresult = this.editUacGroup(group);\n\t\t}\n\t\treturn result;\n\t}\n\n\t@Override\n\t@Transactional(readOnly = true, rollbackFor = Exception.class)\n\tpublic UacGroup getById(Long id) {\n\t\tUacGroup uacGroup = uacGroupMapper.selectByPrimaryKey(id);\n\t\tif (PublicUtil.isEmpty(uacGroup)) {\n\t\t\tthrow new UacBizException(ErrorCodeEnum.UAC10015001, id);\n\t\t}\n\t\tUacGroup parentGroup = uacGroupMapper.selectByPrimaryKey(uacGroup.getPid());\n\t\tif (parentGroup != null) {\n\t\t\tuacGroup.setParentGroupCode(parentGroup.getGroupCode());\n\t\t\tuacGroup.setParentGroupName(parentGroup.getGroupName());\n\t\t}\n\t\t// 处理饿了吗级联菜单回显地址\n\t\tLong provinceId = uacGroup.getProvinceId();\n\t\tLong cityId = uacGroup.getCityId();\n\t\tLong areaId = uacGroup.getAreaId();\n\t\tLong streetId = uacGroup.getStreetId();\n\t\tList<Long> addressList = Lists.newArrayList();\n\t\tif (provinceId != null) {\n\t\t\taddressList.add(provinceId);\n\t\t}\n\t\tif (cityId != null) {\n\t\t\taddressList.add(cityId);\n\t\t}\n\t\tif (areaId != null) {\n\t\t\taddressList.add(areaId);\n\t\t}\n\t\tif (streetId != null) {\n\t\t\taddressList.add(streetId);\n\t\t}\n\t\tuacGroup.setAddressList(addressList);\n\t\treturn uacGroup;\n\t}\n\n\tprivate void setGroupAddress(UacGroup uacGroup) {\n\t\tList<Long> addressList = uacGroup.getAddressList();\n\t\tPreconditions.checkArgument(!PublicUtil.isEmpty(addressList), \"地址不能为空\");\n\t\tPreconditions.checkArgument(addressList.size() >= GlobalConstant.TWO_INT, \"地址至少选两级\");\n\n\t\tStringBuilder groupAddress = new StringBuilder();\n\t\tint level = 0;\n\t\tfor (Long addressId : addressList) {\n\t\t\t// 根据地址ID获取地址名称\n\t\t\tString addressName = mdcAddressService.getAddressById(addressId).getName();\n\t\t\tif (level == 0) {\n\t\t\t\tuacGroup.setProvinceId(addressId);\n\t\t\t\tuacGroup.setProvinceName(addressName);\n\t\t\t} else if (level == 1) {\n\t\t\t\tuacGroup.setCityId(addressId);\n\t\t\t\tuacGroup.setCityName(addressName);\n\t\t\t} else if (level == 2) {\n\t\t\t\tuacGroup.setAreaId(addressId);\n\t\t\t\tuacGroup.setAreaName(addressName);\n\t\t\t} else {\n\t\t\t\tuacGroup.setStreetId(addressId);\n\t\t\t\tuacGroup.setStreetName(addressName);\n\t\t\t}\n\t\t\tgroupAddress.append(addressName);\n\t\t\tlevel++;\n\t\t}\n\t\tuacGroup.setGroupAddress(groupAddress.toString());\n\t}\n\n\tprivate GroupZtreeVo buildGroupZTreeVoByGroup(UacGroup group) {\n\t\tGroupZtreeVo vo = new GroupZtreeVo();\n\n\t\tvo.setId(group.getId());\n\t\tvo.setpId(group.getPid());\n\t\tvo.setName(group.getGroupName());\n\t\tvo.setType(group.getType());\n\t\tvo.setStatus(group.getStatus());\n\t\tvo.setLeaf(group.getLevel());\n\t\tvo.setLevel(group.getLevel());\n\t\tvo.setGroupCode(group.getGroupCode());\n\n\t\tvo.setContact(group.getContact());\n\t\tvo.setContactPhone(group.getContactPhone());\n\t\tvo.setCreatedTime(group.getCreatedTime() == null ? new Date() : group.getCreatedTime());\n\t\tvo.setCreator(group.getCreator());\n\t\tvo.setGroupAddress(group.getGroupAddress());\n\t\tvo.setGroupName(group.getGroupName());\n\n\t\treturn vo;\n\t}\n\n\tprivate List<GroupZtreeVo> buildNode(List<UacGroup> groupList, List<GroupZtreeVo> tree) {\n\n\t\tfor (UacGroup group : groupList) {\n\n\t\t\tGroupZtreeVo groupZTreeVo = buildGroupZTreeVoByGroup(group);\n\n\t\t\tif (0L == group.getPid()) {\n\t\t\t\tgroupZTreeVo.setOpen(true);\n\t\t\t}\n\t\t\t// 设置根节点\n\t\t\ttree.add(groupZTreeVo);\n\n\t\t\tUacGroup query = new UacGroup();\n\t\t\tquery.setPid(group.getId());\n\n\t\t\tList<UacGroup> groupChildrenList = uacGroupMapper.select(query);\n\t\t\t// 有子节点 递归查询\n\t\t\tif (PublicUtil.isNotEmpty(groupChildrenList)) {\n\t\t\t\tbuildNode(groupChildrenList, tree);\n\t\t\t}\n\n\t\t}\n\t\treturn tree;\n\t}\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/service/impl/UacGroupUserServiceImpl.java",
    "content": "package com.paascloud.provider.service.impl;\n\nimport com.paascloud.core.support.BaseService;\nimport com.paascloud.provider.mapper.UacGroupUserMapper;\nimport com.paascloud.provider.model.domain.UacGroup;\nimport com.paascloud.provider.model.domain.UacGroupUser;\nimport com.paascloud.provider.service.UacGroupUserService;\nimport org.springframework.stereotype.Service;\n\nimport javax.annotation.Resource;\nimport java.util.List;\n\n/**\n * The class Uac group user service.\n *\n * @author paascloud.net@gmail.com\n */\n@Service\npublic class UacGroupUserServiceImpl extends BaseService<UacGroupUser> implements UacGroupUserService {\n\t@Resource\n\tprivate UacGroupUserMapper uacGroupUserMapper;\n\n\t@Override\n\tpublic UacGroupUser queryByUserId(Long userId) {\n\t\treturn uacGroupUserMapper.getByUserId(userId);\n\t}\n\n\t@Override\n\tpublic int updateByUserId(UacGroupUser uacGroupUser) {\n\t\treturn uacGroupUserMapper.updateByUserId(uacGroupUser);\n\t}\n\n\t@Override\n\tpublic List<UacGroup> getGroupListByUserId(Long userId) {\n\t\treturn uacGroupUserMapper.selectGroupListByUserId(userId);\n\t}\n\n\t@Override\n\tpublic void saveUserGroup(Long userId, Long groupId) {\n\t\tUacGroupUser groupUser = new UacGroupUser();\n\t\tgroupUser.setUserId(userId);\n\t\tgroupUser.setGroupId(groupId);\n\t\tuacGroupUserMapper.insertSelective(groupUser);\n\t}\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/service/impl/UacLogServiceImpl.java",
    "content": "package com.paascloud.provider.service.impl;\n\nimport com.github.pagehelper.PageHelper;\nimport com.github.pagehelper.PageInfo;\nimport com.paascloud.PublicUtil;\nimport com.paascloud.base.dto.LoginAuthDto;\nimport com.paascloud.core.annotation.OperationLogDto;\nimport com.paascloud.core.support.BaseService;\nimport com.paascloud.provider.mapper.UacLogMapper;\nimport com.paascloud.provider.model.domain.UacAction;\nimport com.paascloud.provider.model.domain.UacLog;\nimport com.paascloud.provider.model.dto.log.UacLogMainDto;\nimport com.paascloud.provider.service.OpcRpcService;\nimport com.paascloud.provider.service.UacActionService;\nimport com.paascloud.provider.service.UacLogService;\nimport org.modelmapper.ModelMapper;\nimport org.springframework.stereotype.Service;\nimport org.springframework.transaction.annotation.Transactional;\n\nimport javax.annotation.Resource;\nimport java.util.List;\n\n/**\n * The class Uac log service.\n *\n * @author paascloud.net@gmail.com\n */\n@Service\n@Transactional(rollbackFor = Exception.class)\npublic class UacLogServiceImpl extends BaseService<UacLog> implements UacLogService {\n\t@Resource\n\tprivate UacLogMapper uacLogMapper;\n\t@Resource\n\tprivate OpcRpcService opcRpcService;\n\t@Resource\n\tprivate UacActionService uacActionService;\n\n\t@Override\n\tpublic int saveLog(UacLog uacLog, LoginAuthDto loginAuthDto) {\n\t\t// 根据uri 查询url对应的权限\n\t\tUacAction uacAction = uacActionService.matchesByUrl(uacLog.getRequestUrl());\n\t\tif (uacAction != null) {\n\t\t\tuacLog.setActionId(uacAction.getId());\n\t\t\tuacLog.setActionCode(uacAction.getActionCode());\n\t\t\tuacLog.setActionName(uacAction.getActionName());\n\t\t}\n\t\tuacLog.setUpdateInfo(loginAuthDto);\n\t\tuacLog.setId(this.generateId());\n\t\treturn uacLogMapper.insertSelective(uacLog);\n\t}\n\n\t@Override\n\t@Transactional(readOnly = true, rollbackFor = Exception.class)\n\tpublic List<UacLog> selectUserLogListByUserId(Long userId) {\n\t\treturn uacLogMapper.selectUserLogListByUserId(userId);\n\t}\n\n\t@Override\n\tpublic Integer saveOperationLog(OperationLogDto operationLogDto) {\n\t\t// 根据uri 查询url对应的权限\n\t\tUacAction uacAction = uacActionService.matchesByUrl(operationLogDto.getRequestUrl());\n\t\tif (uacAction != null) {\n\t\t\toperationLogDto.setActionCode(uacAction.getActionCode());\n\t\t\toperationLogDto.setActionName(uacAction.getActionName());\n\t\t\toperationLogDto.setActionId(uacAction.getId());\n\t\t}\n\t\tModelMapper modelMapper = new ModelMapper();\n\t\tUacLog uacLog = modelMapper.map(operationLogDto, UacLog.class);\n\t\tuacLog.setId(generateId());\n\t\t// 获取操作位置\n\t\tString locationById = opcRpcService.getLocationById(operationLogDto.getIp());\n\t\tuacLog.setLocation(locationById);\n\t\treturn uacLogMapper.insertSelective(uacLog);\n\t}\n\n\t@Override\n\tpublic PageInfo queryLogListWithPage(UacLogMainDto uacLogQueryDtoPage) {\n\t\tList<Long> menuIdList = uacLogQueryDtoPage.getMenuIdList();\n\t\tLong actionId = null;\n\t\tif (PublicUtil.isNotEmpty(menuIdList)) {\n\t\t\tactionId = menuIdList.get(menuIdList.size() - 1);\n\t\t}\n\t\tuacLogQueryDtoPage.setMenuId(actionId);\n\t\tPageHelper.startPage(uacLogQueryDtoPage.getPageNum(), uacLogQueryDtoPage.getPageSize());\n\t\tList<UacLog> actionList = uacLogMapper.queryLogListWithPage(uacLogQueryDtoPage);\n\t\treturn new PageInfo<>(actionList);\n\t}\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/service/impl/UacLoginServiceImpl.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：UacLoginServiceImpl.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.service.impl;\n\nimport com.google.common.base.Preconditions;\nimport com.paascloud.PublicUtil;\nimport com.paascloud.base.dto.LoginAuthDto;\nimport com.paascloud.base.enums.ErrorCodeEnum;\nimport com.paascloud.provider.model.constant.UacConstant;\nimport com.paascloud.provider.model.domain.UacUser;\nimport com.paascloud.provider.model.dto.user.LoginRespDto;\nimport com.paascloud.provider.model.exceptions.UacBizException;\nimport com.paascloud.provider.model.vo.MenuVo;\nimport com.paascloud.provider.security.SecurityUtils;\nimport com.paascloud.provider.service.UacLoginService;\nimport com.paascloud.provider.service.UacMenuService;\nimport com.paascloud.provider.service.UacUserService;\nimport lombok.extern.slf4j.Slf4j;\nimport org.apache.commons.lang.StringUtils;\nimport org.springframework.stereotype.Service;\nimport org.springframework.transaction.annotation.Transactional;\n\nimport javax.annotation.Resource;\nimport java.util.List;\n\n\n/**\n * The class Uac login service.\n *\n * @author paascloud.net@gmail.com\n */\n@Slf4j\n@Service\n@Transactional(rollbackFor = Exception.class)\npublic class UacLoginServiceImpl implements UacLoginService {\n\n\t@Resource\n\tprivate UacUserService uacUserService;\n\t@Resource\n\tprivate UacMenuService uacMenuService;\n\n\t@Override\n\tpublic LoginRespDto loginAfter(Long applicationId) {\n\t\tLoginRespDto loginRespDto = new LoginRespDto();\n\t\tString loginName = SecurityUtils.getCurrentLoginName();\n\t\tif (StringUtils.isEmpty(loginName)) {\n\t\t\tlog.error(\"操作超时, 请重新登录 loginName={}\", loginName);\n\t\t\tPreconditions.checkArgument(StringUtils.isNotEmpty(loginName), \"操作超时, 请重新登录\");\n\t\t}\n\n\t\tUacUser uacUser = uacUserService.findByLoginName(loginName);\n\t\tif (PublicUtil.isEmpty(uacUser)) {\n\t\t\tlog.info(\"找不到用户信息 loginName={}\", loginName);\n\t\t\tthrow new UacBizException(ErrorCodeEnum.UAC10011002, loginName);\n\t\t}\n\n\t\tLoginAuthDto loginAuthDto = this.getLoginAuthDto(uacUser);\n\t\tList<MenuVo> menuVoList = uacMenuService.getMenuVoList(uacUser.getId(), applicationId);\n\t\tif (PublicUtil.isNotEmpty(menuVoList) && UacConstant.MENU_ROOT.equals(menuVoList.get(0).getMenuCode())) {\n\t\t\tmenuVoList = menuVoList.get(0).getSubMenu();\n\t\t}\n\t\tloginRespDto.setLoginAuthDto(loginAuthDto);\n\t\tloginRespDto.setMenuList(menuVoList);\n\t\treturn loginRespDto;\n\t}\n\n\tprivate LoginAuthDto getLoginAuthDto(UacUser uacUser) {\n\t\tLoginAuthDto loginAuthDto = new LoginAuthDto();\n\t\tloginAuthDto.setUserId(uacUser.getId());\n\t\tloginAuthDto.setUserName(uacUser.getUserName());\n\t\tloginAuthDto.setLoginName(uacUser.getLoginName());\n\t\treturn loginAuthDto;\n\t}\n\n\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/service/impl/UacMenuServiceImpl.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：UacMenuServiceImpl.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.service.impl;\n\nimport com.google.common.base.Preconditions;\nimport com.google.common.collect.Lists;\nimport com.google.common.collect.Maps;\nimport com.google.common.collect.Sets;\nimport com.paascloud.PublicUtil;\nimport com.paascloud.base.constant.GlobalConstant;\nimport com.paascloud.base.dto.LoginAuthDto;\nimport com.paascloud.base.enums.ErrorCodeEnum;\nimport com.paascloud.core.support.BaseService;\nimport com.paascloud.provider.mapper.UacMenuMapper;\nimport com.paascloud.provider.model.constant.MenuConstant;\nimport com.paascloud.provider.model.domain.UacMenu;\nimport com.paascloud.provider.model.domain.UacRoleMenu;\nimport com.paascloud.provider.model.dto.menu.UacMenuStatusDto;\nimport com.paascloud.provider.model.enums.UacMenuStatusEnum;\nimport com.paascloud.provider.model.exceptions.UacBizException;\nimport com.paascloud.provider.model.vo.MenuVo;\nimport com.paascloud.provider.model.vo.ViewMenuVo;\nimport com.paascloud.provider.service.UacActionService;\nimport com.paascloud.provider.service.UacMenuService;\nimport com.paascloud.provider.service.UacRoleMenuService;\nimport com.paascloud.provider.utils.TreeUtil;\nimport org.apache.commons.lang3.StringUtils;\nimport org.modelmapper.ModelMapper;\nimport org.springframework.beans.BeanUtils;\nimport org.springframework.stereotype.Service;\nimport org.springframework.transaction.annotation.Transactional;\n\nimport javax.annotation.Resource;\nimport java.util.*;\n\n\n/**\n * The class Uac menu service.\n *\n * @author paascloud.net@gmail.com\n */\n@Service\n@Transactional(rollbackFor = Exception.class)\npublic class UacMenuServiceImpl extends BaseService<UacMenu> implements UacMenuService {\n\t@Resource\n\tprivate UacMenuMapper uacMenuMapper;\n\t@Resource\n\tprivate UacRoleMenuService uacRoleMenuService;\n\t@Resource\n\tprivate UacActionService uacActionService;\n\n\t@Override\n\t@Transactional(readOnly = true, rollbackFor = Exception.class)\n\tpublic List<MenuVo> getMenuVoList(Long userId, Long applicationId) {\n\t\t// 1.查询该用户下所有的菜单列表\n\t\tList<MenuVo> menuVoList = Lists.newArrayList();\n\t\tList<UacMenu> menuList;\n\t\tSet<UacMenu> menuSet = Sets.newHashSet();\n\t\t// 如果是admin则返回所有的菜单\n\t\tif (userId == 1L) {\n\t\t\t// 1.1 查询该用户下所有的菜单列表\n\t\t\tUacMenu uacMenuQuery = new UacMenu();\n\t\t\tuacMenuQuery.setStatus(UacMenuStatusEnum.ENABLE.getType());\n\t\t\tuacMenuQuery.setApplicationId(applicationId);\n\t\t\tuacMenuQuery.setOrderBy(\" level asc,number asc\");\n\t\t\tmenuList = uacMenuMapper.selectMenuList(uacMenuQuery);\n\t\t} else {\n\t\t\t// 1.2查询该用户下所有的菜单列表\n\t\t\tmenuVoList = uacMenuMapper.findMenuVoListByUserId(userId);\n\t\t\tif (PublicUtil.isEmpty(menuVoList)) {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\tSet<Long> ids = Sets.newHashSet();\n\t\t\tfor (final MenuVo menuVo : menuVoList) {\n\t\t\t\tids.add(menuVo.getId());\n\t\t\t}\n\n\t\t\tList<UacMenu> ownMenuList = this.getMenuList(ids);\n\n\t\t\t// 查出所有含有菜单的菜单信息\n\t\t\tUacMenu uacMenu = new UacMenu();\n\t\t\tuacMenu.setStatus(UacMenuStatusEnum.ENABLE.getType());\n\t\t\tList<UacMenu> allMenuList = this.selectMenuList(uacMenu);\n\t\t\tMap<Long, UacMenu> map = Maps.newHashMap();\n\t\t\tfor (final UacMenu menu : allMenuList) {\n\t\t\t\tmap.put(menu.getId(), menu);\n\t\t\t}\n\n\t\t\tfor (final UacMenu menu : ownMenuList) {\n\t\t\t\tgetPid(menuSet, menu, map);\n\t\t\t}\n\t\t\tmenuList = new ArrayList<>(menuSet);\n\t\t}\n\t\tList<MenuVo> list = getMenuVo(menuList);\n\t\tif (PublicUtil.isNotEmpty(menuVoList)) {\n\t\t\tlist.addAll(menuVoList);\n\t\t}\n\t\t// 2.递归成树\n\t\treturn TreeUtil.getChildMenuVos(list, 0L);\n\t}\n\n\tprivate void getPid(Set<UacMenu> menuSet, UacMenu menu, Map<Long, UacMenu> map) {\n\t\tUacMenu parent = map.get(menu.getPid());\n\t\tif (parent != null && parent.getId() != 0L) {\n\t\t\tmenuSet.add(parent);\n\t\t\tgetPid(menuSet, parent, map);\n\t\t}\n\t}\n\n\tprivate List<MenuVo> getMenuVo(List<UacMenu> list) {\n\t\tList<MenuVo> menuVoList = Lists.newArrayList();\n\t\tfor (UacMenu uacMenu : list) {\n\t\t\tMenuVo menuVo = new MenuVo();\n\t\t\tBeanUtils.copyProperties(uacMenu, menuVo);\n\t\t\tmenuVo.setUrl(uacMenu.getUrl());\n\t\t\tmenuVo.setMenuName(uacMenu.getMenuName());\n\t\t\tmenuVoList.add(menuVo);\n\t\t}\n\t\treturn menuVoList;\n\t}\n\n\t@Override\n\tpublic int saveUacMenu(UacMenu menu, LoginAuthDto loginAuthDto) {\n\t\tLong pid = menu.getPid();\n\t\tmenu.setUpdateInfo(loginAuthDto);\n\t\tUacMenu parentMenu = mapper.selectByPrimaryKey(pid);\n\t\tif (PublicUtil.isEmpty(parentMenu)) {\n\t\t\tthrow new UacBizException(ErrorCodeEnum.UAC10013001, pid);\n\t\t}\n\t\tif (menu.isNew()) {\n\n\t\t\tUacMenu updateMenu = new UacMenu();\n\t\t\tmenu.setLevel(parentMenu.getLevel() + 1);\n\t\t\tupdateMenu.setLeaf(MenuConstant.MENU_LEAF_NO);\n\t\t\tupdateMenu.setId(pid);\n\t\t\tLong menuId = super.generateId();\n\t\t\tmenu.setId(menuId);\n\t\t\tint result = mapper.updateByPrimaryKeySelective(updateMenu);\n\t\t\tif (result < 1) {\n\t\t\t\tthrow new UacBizException(ErrorCodeEnum.UAC10013002, menuId);\n\t\t\t}\n\n\t\t\tmenu.setStatus(UacMenuStatusEnum.ENABLE.getType());\n\t\t\tmenu.setCreatorId(loginAuthDto.getUserId());\n\t\t\tmenu.setCreator(loginAuthDto.getUserName());\n\t\t\tmenu.setLastOperatorId(loginAuthDto.getUserId());\n\t\t\tmenu.setLastOperator(loginAuthDto.getUserName());\n\t\t\t// 新增的菜单是叶子节点\n\t\t\tmenu.setLeaf(MenuConstant.MENU_LEAF_YES);\n\t\t\treturn uacMenuMapper.insertSelective(menu);\n\t\t} else {\n\t\t\treturn uacMenuMapper.updateByPrimaryKeySelective(menu);\n\t\t}\n\t}\n\n\t@Override\n\tpublic int deleteUacMenuById(Long id, LoginAuthDto loginAuthDto) {\n\t\tPreconditions.checkArgument(id != null, \"菜单id不能为空\");\n\t\tint result;\n\t\t// 获取当前菜单信息\n\t\tUacMenu uacMenuQuery = new UacMenu();\n\t\tuacMenuQuery.setId(id);\n\t\tuacMenuQuery = mapper.selectOne(uacMenuQuery);\n\t\tif (PublicUtil.isEmpty(uacMenuQuery)) {\n\t\t\tthrow new UacBizException(ErrorCodeEnum.UAC10013003, id);\n\t\t}\n\n\t\t// 删除菜单与角色的关联关系\n\t\tUacRoleMenu uacRoleMenu = new UacRoleMenu();\n\t\tuacRoleMenu.setMenuId(id);\n\t\tuacRoleMenuService.delete(uacRoleMenu);\n\n\n\t\t// 删除菜单\n\t\tresult = uacMenuMapper.deleteByPrimaryKey(id);\n\t\tif (result < 1) {\n\t\t\tlogger.error(\"删除菜单失败 menuId={}\", id);\n\t\t\tthrow new UacBizException(ErrorCodeEnum.UAC10013008, id);\n\t\t}\n\n\t\t// 删除权限\n\t\t// TODO 应该先查询再删除\n\t\tuacActionService.deleteByMenuId(id);\n\n\t\t// 修改当前删除菜单的父菜单是否是叶子节点\n\t\tUacMenu updateParentUacMenu = new UacMenu();\n\t\tupdateParentUacMenu.setId(uacMenuQuery.getPid());\n\t\tupdateParentUacMenu.setLeaf(MenuConstant.MENU_LEAF_YES);\n\t\t// 是二三级\n\t\tif (Objects.equals(MenuConstant.MENU_LEVEL_TWO, uacMenuQuery.getLevel()) || Objects.equals(MenuConstant.MENU_LEVEL_THREE, uacMenuQuery.getLevel())) {\n\t\t\t// 查询是否是叶子节点\n\t\t\tint count = uacMenuMapper.selectMenuChildCountByPid(uacMenuQuery.getPid());\n\t\t\tif (count == 0) {\n\t\t\t\tuacMenuMapper.updateByPrimaryKeySelective(updateParentUacMenu);\n\t\t\t}\n\t\t}\n\t\treturn result;\n\t}\n\n\t@Override\n\tpublic int enableMenuList(List<UacMenu> menuList, LoginAuthDto loginAuthDto) {\n\t\tUacMenu uacMenuUpdate = new UacMenu();\n\t\tint sum = 0;\n\t\tfor (UacMenu menu : menuList) {\n\t\t\tuacMenuUpdate.setId(menu.getId());\n\t\t\tuacMenuUpdate.setVersion(menu.getVersion() + 1);\n\t\t\tuacMenuUpdate.setStatus(UacMenuStatusEnum.ENABLE.getType());\n\t\t\tuacMenuUpdate.setLastOperator(loginAuthDto.getLoginName());\n\t\t\tuacMenuUpdate.setLastOperatorId(loginAuthDto.getUserId());\n\t\t\tuacMenuUpdate.setUpdateTime(new Date());\n\t\t\tint result = mapper.updateByPrimaryKeySelective(uacMenuUpdate);\n\t\t\tif (result > 0) {\n\t\t\t\tsum += 1;\n\t\t\t} else {\n\t\t\t\tthrow new UacBizException(ErrorCodeEnum.UAC10013004, menu.getId());\n\t\t\t}\n\t\t}\n\t\treturn sum;\n\t}\n\n\t@Override\n\t@Transactional(readOnly = true, rollbackFor = Exception.class)\n\tpublic List<UacMenu> getAllParentMenuByMenuId(Long menuId) {\n\t\tUacMenu uacMenuQuery = new UacMenu();\n\t\tuacMenuQuery.setId(menuId);\n\t\tuacMenuQuery = mapper.selectOne(uacMenuQuery);\n\t\tList<UacMenu> uacMenuList = Lists.newArrayList();\n\t\tuacMenuList = buildParentNote(uacMenuList, uacMenuQuery);\n\t\treturn uacMenuList;\n\t}\n\n\t@Override\n\t@Transactional(readOnly = true, rollbackFor = Exception.class)\n\tpublic List<UacMenu> getAllChildMenuByMenuId(Long menuId, String menuStatus) {\n\t\tUacMenu uacMenuQuery = new UacMenu();\n\t\tuacMenuQuery.setId(menuId);\n\t\tuacMenuQuery = mapper.selectOne(uacMenuQuery);\n\t\tList<UacMenu> uacMenuList = Lists.newArrayList();\n\t\tuacMenuList = buildNode(uacMenuList, uacMenuQuery, menuStatus);\n\t\treturn uacMenuList;\n\t}\n\n\t@Override\n\tpublic int disableMenuList(List<UacMenu> menuList, LoginAuthDto loginAuthDto) {\n\t\tUacMenu uacMenuUpdate = new UacMenu();\n\t\tint sum = 0;\n\t\tfor (UacMenu menu : menuList) {\n\t\t\tuacMenuUpdate.setId(menu.getId());\n\t\t\tuacMenuUpdate.setVersion(menu.getVersion() + 1);\n\t\t\tuacMenuUpdate.setStatus(UacMenuStatusEnum.DISABLE.getType());\n\t\t\tuacMenuUpdate.setLastOperator(loginAuthDto.getLoginName());\n\t\t\tuacMenuUpdate.setLastOperatorId(loginAuthDto.getUserId());\n\t\t\tuacMenuUpdate.setUpdateTime(new Date());\n\t\t\tint result = mapper.updateByPrimaryKeySelective(uacMenuUpdate);\n\t\t\tif (result > 0) {\n\t\t\t\tsum += 1;\n\t\t\t} else {\n\t\t\t\tthrow new UacBizException(ErrorCodeEnum.UAC10013005, menu.getId());\n\t\t\t}\n\t\t}\n\t\treturn sum;\n\t}\n\n\t@Override\n\t@Transactional(readOnly = true, rollbackFor = Exception.class)\n\tpublic List<UacMenu> selectMenuList(UacMenu uacMenu) {\n\t\treturn uacMenuMapper.selectMenuList(uacMenu);\n\t}\n\n\t@Override\n\t@Transactional(readOnly = true, rollbackFor = Exception.class)\n\tpublic List<MenuVo> findAllMenuListByAuthResDto(LoginAuthDto authResDto) {\n\t\tList<MenuVo> voList = Lists.newArrayList();\n\t\tPreconditions.checkArgument(authResDto != null, \"无权访问\");\n\n\t\tif (!GlobalConstant.Sys.SUPER_MANAGER_LOGIN_NAME.equals(authResDto.getLoginName())) {\n\t\t\tvoList = uacMenuMapper.findMenuVoListByUserId(authResDto.getUserId());\n\t\t} else {\n\t\t\tUacMenu uacMenuQuery = new UacMenu();\n\t\t\t// 查询启用的菜单\n\t\t\tuacMenuQuery.setStatus(UacMenuStatusEnum.ENABLE.getType());\n\t\t\tuacMenuQuery.setOrderBy(\" level asc,number asc\");\n\t\t\tList<UacMenu> list = uacMenuMapper.select(uacMenuQuery);\n\t\t\tfor (UacMenu uacMenu : list) {\n\t\t\t\tMenuVo menuVo = new MenuVo();\n\t\t\t\tBeanUtils.copyProperties(uacMenu, menuVo);\n\t\t\t\tvoList.add(menuVo);\n\t\t\t}\n\t\t}\n\t\treturn voList;\n\t}\n\n\t@Override\n\t@Transactional(readOnly = true, rollbackFor = Exception.class)\n\tpublic ViewMenuVo getViewVoById(Long id) {\n\t\tPreconditions.checkArgument(id != null, \"菜单ID不能为空\");\n\t\tUacMenu menu = uacMenuMapper.selectByPrimaryKey(id);\n\n\t\tif (menu == null) {\n\t\t\tlogger.error(\"找不到菜单信息id={}\", id);\n\t\t\tthrow new UacBizException(ErrorCodeEnum.UAC10013003, id);\n\t\t}\n\n\t\t// 获取父级菜单信息\n\t\tUacMenu parentMenu = uacMenuMapper.selectByPrimaryKey(menu.getPid());\n\n\t\tModelMapper modelMapper = new ModelMapper();\n\t\tViewMenuVo menuVo = modelMapper.map(menu, ViewMenuVo.class);\n\n\t\tif (parentMenu != null) {\n\t\t\tmenuVo.setParentMenuName(parentMenu.getMenuName());\n\t\t}\n\n\t\treturn menuVo;\n\t}\n\n\t@Override\n\tpublic void updateUacMenuStatusById(UacMenuStatusDto uacMenuStatusDto, LoginAuthDto loginAuthDto) {\n\t\tLong id = uacMenuStatusDto.getId();\n\t\tString status = uacMenuStatusDto.getStatus();\n\t\tPreconditions.checkArgument(id != null, \"菜单ID不能为空\");\n\t\tPreconditions.checkArgument(StringUtils.isNotEmpty(status), \"菜单状态不能为空\");\n\n\t\tUacMenu uacMenuQuery = this.selectByKey(id);\n\t\tif (MenuConstant.MENU_LEVEL_ROOT.equals(uacMenuQuery.getLevel())) {\n\t\t\tthrow new UacBizException(ErrorCodeEnum.UAC10013007);\n\t\t}\n\t\t// 要处理的菜单集合\n\t\tList<UacMenu> menuList = Lists.newArrayList();\n\n\t\tint result;\n\t\tif (status.equals(UacMenuStatusEnum.DISABLE.getType())) {\n\t\t\t// 获取菜单以及子菜单\n\t\t\tmenuList = this.getAllChildMenuByMenuId(id, UacMenuStatusEnum.ENABLE.getType());\n\t\t\t// 禁用菜单以及子菜单\n\t\t\tresult = this.disableMenuList(menuList, loginAuthDto);\n\t\t} else {\n\t\t\t// 获取菜单、其子菜单以及父菜单\n\t\t\tUacMenu uacMenu = new UacMenu();\n\t\t\tuacMenu.setPid(id);\n\t\t\tresult = this.selectCount(uacMenu);\n\t\t\t// 此菜单含有子菜单\n\t\t\tif (result > 0) {\n\t\t\t\tmenuList = this.getAllChildMenuByMenuId(id, UacMenuStatusEnum.DISABLE.getType());\n\t\t\t}\n\t\t\tList<UacMenu> menuListTemp = this.getAllParentMenuByMenuId(id);\n\t\t\tfor (UacMenu menu : menuListTemp) {\n\t\t\t\tif (!menuList.contains(menu)) {\n\t\t\t\t\tmenuList.add(menu);\n\t\t\t\t}\n\t\t\t}\n\t\t\t// 启用菜单、其子菜单以及父菜单\n\t\t\tresult = this.enableMenuList(menuList, loginAuthDto);\n\t\t}\n\t\tif (result < 1) {\n\t\t\tthrow new UacBizException(ErrorCodeEnum.UAC10013006, id);\n\t\t}\n\t}\n\n\t@Override\n\t@Transactional(readOnly = true, rollbackFor = Exception.class)\n\tpublic boolean checkMenuHasChildMenu(Long pid) {\n\t\tPreconditions.checkArgument(pid != null, \"菜单pid不能为空\");\n\n\t\tUacMenu uacMenu = new UacMenu();\n\t\tuacMenu.setStatus(UacMenuStatusEnum.ENABLE.getType());\n\t\tuacMenu.setPid(pid);\n\n\t\treturn mapper.selectCount(uacMenu) > 0;\n\t}\n\n\t@Override\n\tpublic List<UacMenu> listMenuListByRoleId(Long roleId) {\n\t\tList<UacMenu> menuList = uacMenuMapper.listMenuListByRoleId(roleId);\n\t\tList<UacMenu> addMenuList = Lists.newArrayList();\n\n\t\tif (PublicUtil.isNotEmpty(menuList)) {\n\t\t\tfor (UacMenu uacMenu : menuList) {\n\t\t\t\tgetMenuList(addMenuList, uacMenu.getPid());\n\t\t\t}\n\t\t}\n\t\tmenuList.addAll(addMenuList);\n\t\treturn new ArrayList<>(new HashSet<>(menuList));\n\t}\n\n\t@Override\n\tpublic List<UacMenu> getMenuList(final Set<Long> menuIdList) {\n\t\treturn uacMenuMapper.listMenu(menuIdList);\n\t}\n\n\tprivate List<UacMenu> getMenuList(List<UacMenu> uacMenuList, Long menuId) {\n\t\tUacMenu uacMenu = uacMenuMapper.selectByPrimaryKey(menuId);\n\t\tif (uacMenu != null) {\n\t\t\tLong pid = uacMenu.getPid();\n\t\t\tif (pid != null) {\n\t\t\t\tuacMenuList.add(uacMenu);\n\t\t\t\tgetMenuList(uacMenuList, pid);\n\t\t\t}\n\t\t}\n\t\treturn uacMenuList;\n\t}\n\n\t/**\n\t * 递归获取菜单的子菜单\n\t */\n\tprivate List<UacMenu> buildNode(List<UacMenu> uacMenuList, UacMenu uacMenu, String menuStatus) {\n\t\tList<UacMenu> uacMenuQueryList = mapper.select(uacMenu);\n\t\tUacMenu uacMenuQuery;\n\t\tfor (UacMenu menu : uacMenuQueryList) {\n\t\t\t// 启用状态\n\t\t\tif (menuStatus.equals(menu.getStatus()) && !MenuConstant.MENU_LEVEL_ROOT.equals(menu.getLevel())) {\n\t\t\t\tuacMenuList.add(menu);\n\t\t\t}\n\t\t\tuacMenuQuery = new UacMenu();\n\t\t\tuacMenuQuery.setPid(menu.getId());\n\t\t\tbuildNode(uacMenuList, uacMenuQuery, menuStatus);\n\t\t}\n\t\treturn uacMenuList;\n\t}\n\n\t/**\n\t * 递归获取菜单的父菜单\n\t */\n\tprivate List<UacMenu> buildParentNote(List<UacMenu> uacMenuList, UacMenu uacMenu) {\n\t\tList<UacMenu> uacMenuQueryList = mapper.select(uacMenu);\n\t\tUacMenu uacMenuQuery;\n\t\tfor (UacMenu menu : uacMenuQueryList) {\n\t\t\tif (UacMenuStatusEnum.DISABLE.getType().equals(menu.getStatus()) && !MenuConstant.MENU_LEVEL_ROOT.equals(menu.getLevel())) {\n\t\t\t\t// 禁用状态\n\t\t\t\tuacMenuList.add(menu);\n\t\t\t}\n\t\t\tuacMenuQuery = new UacMenu();\n\t\t\tuacMenuQuery.setId(menu.getPid());\n\t\t\tbuildParentNote(uacMenuList, uacMenuQuery);\n\t\t}\n\t\treturn uacMenuList;\n\t}\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/service/impl/UacPermissionServiceImpl.java",
    "content": "package com.paascloud.provider.service.impl;\n\nimport com.google.common.base.Joiner;\nimport com.paascloud.base.constant.GlobalConstant;\nimport com.paascloud.provider.security.SecurityUtils;\nimport com.paascloud.provider.service.UacPermissionService;\nimport lombok.extern.slf4j.Slf4j;\nimport org.apache.commons.lang3.StringUtils;\nimport org.springframework.security.core.Authentication;\nimport org.springframework.security.oauth2.provider.ClientDetails;\nimport org.springframework.security.oauth2.provider.ClientDetailsService;\nimport org.springframework.stereotype.Component;\nimport org.springframework.util.AntPathMatcher;\n\nimport javax.annotation.Resource;\nimport javax.servlet.http.HttpServletRequest;\nimport java.util.Set;\n\n/**\n * The class Uac permission service.\n *\n * @author paascloud.net @gmail.com\n */\n@Slf4j\n@Component(\"permissionService\")\npublic class UacPermissionServiceImpl implements UacPermissionService {\n\tprivate AntPathMatcher antPathMatcher = new AntPathMatcher();\n\tprivate static final String OAUTH2_CLIENT_PREFIX = \"paascloud-client-\";\n\n\t@Resource\n\tprivate ClientDetailsService clientDetailsService;\n\n\t@Override\n\tpublic boolean hasPermission(Authentication authentication, HttpServletRequest request) {\n\t\tString currentLoginName = SecurityUtils.getCurrentLoginName();\n\t\tSet<String> currentAuthorityUrl = SecurityUtils.getCurrentAuthorityUrl();\n\t\tString requestURI = request.getRequestURI();\n\t\tlog.info(\"验证权限loginName={}, requestURI={}, hasAuthorityUrl={}\", currentLoginName, requestURI, Joiner.on(GlobalConstant.Symbol.COMMA).join(currentAuthorityUrl));\n\t\t// 超级管理员 全部都可以访问\n\t\tif (StringUtils.equals(currentLoginName, GlobalConstant.Sys.SUPER_MANAGER_LOGIN_NAME)) {\n\t\t\treturn true;\n\t\t}\n\n\t\t// DEMO项目Feign客户端具有所有权限, 如果需要则在角色权限中控制\n\t\tif (currentLoginName.contains(OAUTH2_CLIENT_PREFIX)) {\n\t\t\tClientDetails clientDetails = clientDetailsService.loadClientByClientId(currentLoginName);\n\t\t\treturn clientDetails != null;\n\t\t}\n\n\t\tfor (final String authority : currentAuthorityUrl) {\n\t\t\t// DEMO项目放过查询权限\n\t\t\tif (requestURI.contains(\"query\") || requestURI.contains(\"get\") || requestURI.contains(\"check\") || requestURI.contains(\"select\")) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tif (antPathMatcher.match(authority, requestURI)) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t\treturn false;\n\t}\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/service/impl/UacRoleActionServiceImpl.java",
    "content": "package com.paascloud.provider.service.impl;\n\nimport com.paascloud.base.enums.ErrorCodeEnum;\nimport com.paascloud.core.support.BaseService;\nimport com.paascloud.provider.mapper.UacRoleActionMapper;\nimport com.paascloud.provider.model.domain.UacRoleAction;\nimport com.paascloud.provider.model.exceptions.UacBizException;\nimport com.paascloud.provider.service.UacRoleActionService;\nimport org.springframework.stereotype.Service;\nimport org.springframework.transaction.annotation.Transactional;\n\nimport javax.annotation.Resource;\nimport java.util.List;\nimport java.util.Set;\n\n/**\n * The class Uac role action service.\n *\n * @author paascloud.net@gmail.com\n */\n@Service\n@Transactional(rollbackFor = Exception.class)\npublic class UacRoleActionServiceImpl extends BaseService<UacRoleAction> implements UacRoleActionService {\n\t@Resource\n\tprivate UacRoleActionMapper uacRoleActionMapper;\n\n\t@Override\n\t@Transactional(readOnly = true, rollbackFor = Exception.class)\n\tpublic List<UacRoleAction> listByRoleId(Long roleId) {\n\t\tif (roleId == null) {\n\t\t\tthrow new UacBizException(ErrorCodeEnum.UAC10012001);\n\t\t}\n\t\tUacRoleAction roleMenu = new UacRoleAction();\n\t\troleMenu.setRoleId(roleId);\n\t\treturn uacRoleActionMapper.select(roleMenu);\n\t}\n\n\t@Override\n\tpublic void deleteByRoleId(Long roleId) {\n\t\tif (roleId == null) {\n\t\t\tthrow new UacBizException(ErrorCodeEnum.UAC10012001);\n\t\t}\n\t\tUacRoleAction roleMenu = new UacRoleAction();\n\t\troleMenu.setRoleId(roleId);\n\t\tuacRoleActionMapper.delete(roleMenu);\n\t}\n\n\t@Override\n\tpublic void insert(Long roleId, Set<Long> actionIdList) {\n\t\tif (roleId == null) {\n\t\t\tthrow new UacBizException(ErrorCodeEnum.UAC10012001);\n\t\t}\n\t\tUacRoleAction uacRoleAction = new UacRoleAction();\n\t\tuacRoleAction.setRoleId(roleId);\n\t\tfor (Long actionId : actionIdList) {\n\t\t\tuacRoleAction.setActionId(actionId);\n\t\t\tuacRoleActionMapper.insert(uacRoleAction);\n\t\t}\n\t}\n\n\t@Override\n\tpublic int deleteByRoleIdList(final List<Long> roleIdList) {\n\t\treturn uacRoleActionMapper.deleteByRoleIdList(roleIdList);\n\t}\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/service/impl/UacRoleMenuServiceImpl.java",
    "content": "package com.paascloud.provider.service.impl;\n\nimport com.paascloud.base.enums.ErrorCodeEnum;\nimport com.paascloud.core.support.BaseService;\nimport com.paascloud.provider.mapper.UacRoleMenuMapper;\nimport com.paascloud.provider.model.domain.UacRoleMenu;\nimport com.paascloud.provider.model.exceptions.UacBizException;\nimport com.paascloud.provider.service.UacRoleMenuService;\nimport org.springframework.stereotype.Service;\nimport org.springframework.transaction.annotation.Transactional;\n\nimport javax.annotation.Resource;\nimport java.util.List;\nimport java.util.Set;\n\n/**\n * The class Uac role menu service.\n *\n * @author paascloud.net@gmail.com\n */\n@Service\n@Transactional(rollbackFor = Exception.class)\npublic class UacRoleMenuServiceImpl extends BaseService<UacRoleMenu> implements UacRoleMenuService {\n\t@Resource\n\tprivate UacRoleMenuMapper uacRoleMenuMapper;\n\n\t@Override\n\tpublic int delRoleMenuList(Set<UacRoleMenu> uacRoleMenus) {\n\t\tint result = 0;\n\t\tfor (UacRoleMenu uacRoleMenu : uacRoleMenus) {\n\t\t\tresult += uacRoleMenuMapper.delete(uacRoleMenu);\n\t\t}\n\t\treturn result;\n\t}\n\n\t@Override\n\tpublic void deleteByRoleId(Long roleId) {\n\t\tif (roleId == null) {\n\t\t\tthrow new UacBizException(ErrorCodeEnum.UAC10012001);\n\t\t}\n\t\tUacRoleMenu roleMenu = new UacRoleMenu();\n\t\troleMenu.setRoleId(roleId);\n\t\tuacRoleMenuMapper.delete(roleMenu);\n\t}\n\n\t@Override\n\t@Transactional(readOnly = true, rollbackFor = Exception.class)\n\tpublic List<UacRoleMenu> listByRoleId(Long roleId) {\n\t\tif (roleId == null) {\n\t\t\tthrow new UacBizException(ErrorCodeEnum.UAC10012001);\n\t\t}\n\t\tUacRoleMenu roleMenu = new UacRoleMenu();\n\t\troleMenu.setRoleId(roleId);\n\t\treturn uacRoleMenuMapper.select(roleMenu);\n\t}\n\n\t@Override\n\tpublic void insert(Long roleId, Set<Long> menuIdList) {\n\t\tif (roleId == null) {\n\t\t\tthrow new UacBizException(ErrorCodeEnum.UAC10012001);\n\t\t}\n\t\tUacRoleMenu uacRoleMenu = new UacRoleMenu();\n\t\tuacRoleMenu.setRoleId(roleId);\n\t\tfor (Long menuId : menuIdList) {\n\t\t\tuacRoleMenu.setMenuId(menuId);\n\t\t\tuacRoleMenuMapper.insertSelective(uacRoleMenu);\n\t\t}\n\t}\n\n\t@Override\n\tpublic void deleteByRoleIdList(final List<Long> roleIdList) {\n\t\tuacRoleMenuMapper.deleteByRoleIdList(roleIdList);\n\t}\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/service/impl/UacRoleServiceImpl.java",
    "content": "package com.paascloud.provider.service.impl;\n\nimport com.google.common.base.Joiner;\nimport com.google.common.base.Preconditions;\nimport com.google.common.collect.Lists;\nimport com.google.common.collect.Sets;\nimport com.paascloud.Collections3;\nimport com.paascloud.PublicUtil;\nimport com.paascloud.base.constant.GlobalConstant;\nimport com.paascloud.base.dto.LoginAuthDto;\nimport com.paascloud.base.enums.ErrorCodeEnum;\nimport com.paascloud.core.support.BaseService;\nimport com.paascloud.provider.mapper.UacRoleMapper;\nimport com.paascloud.provider.mapper.UacRoleMenuMapper;\nimport com.paascloud.provider.model.domain.*;\nimport com.paascloud.provider.model.dto.role.*;\nimport com.paascloud.provider.model.exceptions.UacBizException;\nimport com.paascloud.provider.model.vo.BindAuthVo;\nimport com.paascloud.provider.model.vo.MenuVo;\nimport com.paascloud.provider.model.vo.RoleVo;\nimport com.paascloud.provider.model.vo.role.MenuCountVo;\nimport com.paascloud.provider.service.*;\nimport com.paascloud.provider.utils.TreeUtil;\nimport org.springframework.beans.BeanUtils;\nimport org.springframework.stereotype.Service;\nimport org.springframework.transaction.annotation.Transactional;\n\nimport javax.annotation.Resource;\nimport java.util.*;\n\n\n/**\n * The class Uac role service.\n *\n * @author paascloud.net@gmail.com\n */\n@Service\n@Transactional(rollbackFor = Exception.class)\npublic class UacRoleServiceImpl extends BaseService<UacRole> implements UacRoleService {\n\t@Resource\n\tprivate UacRoleMapper uacRoleMapper;\n\t@Resource\n\tprivate UacRoleUserService uacRoleUserService;\n\t@Resource\n\tprivate UacRoleMenuMapper uacRoleMenuMapper;\n\t@Resource\n\tprivate UacUserService uacUserService;\n\t@Resource\n\tprivate UacRoleMenuService uacRoleMenuService;\n\t@Resource\n\tprivate UacMenuService uacMenuService;\n\t@Resource\n\tprivate UacActionService uacActionService;\n\t@Resource\n\tprivate UacRoleActionService uacRoleActionService;\n\n\t@Override\n\t@Transactional(readOnly = true, rollbackFor = Exception.class)\n\tpublic UacRole findByRoleCode(String roleCode) {\n\t\treturn uacRoleMapper.findByRoleCode(roleCode);\n\t}\n\n\t@Override\n\t@Transactional(readOnly = true, rollbackFor = Exception.class)\n\tpublic List<RoleVo> queryRoleListWithPage(UacRole role) {\n\t\treturn uacRoleMapper.queryRoleListWithPage(role);\n\t}\n\n\t@Override\n\tpublic int deleteRoleById(Long roleId) {\n\t\t//查询该角色下是否有用户绑定, 有的话提醒不能删除\n\t\tif (null == roleId) {\n\t\t\tthrow new IllegalArgumentException(ErrorCodeEnum.UAC10012001.msg());\n\t\t}\n\n\t\t// 超级管理员不能删除\n\t\tif (Objects.equals(roleId, GlobalConstant.Sys.SUPER_MANAGER_ROLE_ID)) {\n\t\t\tthrow new UacBizException(ErrorCodeEnum.UAC10012003);\n\t\t}\n\n\t\tList<UacRoleUser> uruList = uacRoleUserService.listByRoleId(roleId);\n\n\t\tif (!uruList.isEmpty()) {\n\t\t\tuacRoleUserService.deleteByRoleId(roleId);\n\t\t}\n\n\t\tuacRoleActionService.deleteByRoleId(roleId);\n\t\tuacRoleMenuService.deleteByRoleId(roleId);\n\t\treturn uacRoleMapper.deleteByPrimaryKey(roleId);\n\t}\n\n\t@Override\n\tpublic int saveRole(UacRole role, LoginAuthDto loginAuthDto) {\n\t\tint result = 0;\n\t\trole.setUpdateInfo(loginAuthDto);\n\t\tif (role.isNew()) {\n\t\t\trole.setId(super.generateId());\n\t\t\tuacRoleMapper.insertSelective(role);\n\t\t} else {\n\t\t\tresult = uacRoleMapper.updateByPrimaryKeySelective(role);\n\t\t}\n\t\treturn result;\n\t}\n\n\t@Override\n\t@Transactional(readOnly = true, rollbackFor = Exception.class)\n\tpublic List<Long> getAuthTreeNoCheckMenu(Long roleId) {\n\t\t//查询某个角色下一级菜单下的二级菜单个数, 去掉二级菜单个数为0的一级菜单选中状态\n\t\tList<MenuCountVo> menuCountVos = uacRoleMenuMapper.countChildMenuNum(roleId);\n\t\tList<Long> noCheckedMenu = Lists.newArrayList();\n\t\tfor (MenuCountVo vo : menuCountVos) {\n\t\t\tnoCheckedMenu.add(vo.getId());\n\t\t}\n\n\t\treturn noCheckedMenu;\n\t}\n\n\t@Override\n\tpublic void bindAction(RoleBindActionDto grantAuthRole) {\n\t\tLong roleId = grantAuthRole.getRoleId();\n\t\tSet<Long> actionIdList = grantAuthRole.getActionIdList();\n\n\t\tif (roleId == null) {\n\t\t\tthrow new UacBizException(ErrorCodeEnum.UAC10012001);\n\t\t}\n\n\t\tif (Objects.equals(roleId, GlobalConstant.Sys.SUPER_MANAGER_ROLE_ID)) {\n\t\t\tlogger.error(\"越权操作, 超级管理员用户不允许操作\");\n\t\t\tthrow new UacBizException(ErrorCodeEnum.UAC10011023);\n\t\t}\n\n\t\tUacRole uacRole = uacRoleMapper.selectByPrimaryKey(roleId);\n\n\t\tif (uacRole == null) {\n\t\t\tlogger.error(\"找不到角色信息. roleId={}\", roleId);\n\t\t\tthrow new UacBizException(ErrorCodeEnum.UAC10012005, roleId);\n\t\t}\n\n\t\t// TODO 校验参数的合法性(这里不写了 累得慌 也就是校验菜单和权限是否存在)\n\t\tList<UacRoleAction> uacRoleActionList = uacRoleActionService.listByRoleId(roleId);\n\n\t\tif (PublicUtil.isNotEmpty(uacRoleActionList)) {\n\t\t\tuacRoleActionService.deleteByRoleId(roleId);\n\t\t}\n\n\t\tif (PublicUtil.isEmpty(actionIdList)) {\n\t\t\tlogger.error(\"传入按钮权限Id为空, 取消所有按钮权限\");\n\t\t} else {\n\t\t\t// 绑定权限\n\t\t\tuacRoleActionService.insert(roleId, actionIdList);\n\t\t}\n\t}\n\n\t@Override\n\t@Transactional(readOnly = true, rollbackFor = Exception.class)\n\tpublic UacRole getRoleById(Long roleId) {\n\t\treturn uacRoleMapper.selectByPrimaryKey(roleId);\n\t}\n\n\t@Override\n\t@Transactional(readOnly = true, rollbackFor = Exception.class)\n\tpublic RoleBindUserDto getRoleBindUserDto(Long roleId, Long currentUserId) {\n\t\tRoleBindUserDto roleBindUserDto = new RoleBindUserDto();\n\t\tSet<Long> alreadyBindUserIdSet = Sets.newHashSet();\n\t\tUacRole uacRole = uacRoleMapper.selectByPrimaryKey(roleId);\n\t\tif (PublicUtil.isEmpty(uacRole)) {\n\t\t\tlogger.error(\"找不到roleId={}, 的角色\", roleId);\n\t\t\tthrow new UacBizException(ErrorCodeEnum.UAC10012005, roleId);\n\t\t}\n\n\t\t// 查询所有用户包括已禁用的用户\n\t\tList<BindUserDto> bindUserDtoList = uacRoleMapper.selectAllNeedBindUser(GlobalConstant.Sys.SUPER_MANAGER_ROLE_ID, currentUserId);\n\t\t// 该角色已经绑定的用户\n\t\tList<UacRoleUser> setAlreadyBindUserSet = uacRoleUserService.listByRoleId(roleId);\n\t\tSet<BindUserDto> allUserSet = new HashSet<>(bindUserDtoList);\n\n\t\tfor (UacRoleUser uacRoleUser : setAlreadyBindUserSet) {\n\t\t\talreadyBindUserIdSet.add(uacRoleUser.getUserId());\n\t\t}\n\n\t\troleBindUserDto.setAllUserSet(allUserSet);\n\t\troleBindUserDto.setAlreadyBindUserIdSet(alreadyBindUserIdSet);\n\n\t\treturn roleBindUserDto;\n\t}\n\n\t@Override\n\tpublic void bindUser4Role(RoleBindUserReqDto roleBindUserReqDto, LoginAuthDto authResDto) {\n\n\t\tif (roleBindUserReqDto == null) {\n\t\t\tlogger.error(\"参数不能为空\");\n\t\t\tthrow new IllegalArgumentException(\"参数不能为空\");\n\t\t}\n\n\t\tLong roleId = roleBindUserReqDto.getRoleId();\n\t\tLong loginUserId = authResDto.getUserId();\n\t\tList<Long> userIdList = roleBindUserReqDto.getUserIdList();\n\n\t\tif (null == roleId) {\n\t\t\tthrow new IllegalArgumentException(ErrorCodeEnum.UAC10012001.msg());\n\t\t}\n\n\t\tUacRole role = this.getRoleById(roleId);\n\n\t\tif (role == null) {\n\t\t\tlogger.error(\"找不到角色信息 roleId={}\", roleId);\n\t\t\tthrow new UacBizException(ErrorCodeEnum.UAC10012005, roleId);\n\t\t}\n\n\t\tif (PublicUtil.isNotEmpty(userIdList) && userIdList.contains(loginUserId)) {\n\t\t\tlogger.error(\"不能操作当前登录用户 userId={}\", loginUserId);\n\t\t\tthrow new UacBizException(ErrorCodeEnum.UAC10011023);\n\t\t}\n\n\t\t// 查询超级管理员用户Id集合\n\t\tList<Long> superUserList = uacRoleUserService.listSuperUser(GlobalConstant.Sys.SUPER_MANAGER_ROLE_ID);\n\t\tList<Long> unionList = Collections3.intersection(userIdList, superUserList);\n\t\tif (PublicUtil.isNotEmpty(userIdList) && PublicUtil.isNotEmpty(unionList)) {\n\t\t\tlogger.error(\"不能操作超级管理员用户 超级用户={}\", unionList);\n\t\t\tthrow new UacBizException(ErrorCodeEnum.UAC10011023);\n\t\t}\n\n\t\t// 1. 先取消对该角色的用户绑定(不包含超级管理员用户)\n\t\tList<UacRoleUser> userRoles = uacRoleUserService.listByRoleId(roleId);\n\n\t\tif (PublicUtil.isNotEmpty(userRoles)) {\n\t\t\tuacRoleUserService.deleteExcludeSuperMng(roleId, GlobalConstant.Sys.SUPER_MANAGER_ROLE_ID);\n\t\t}\n\n\t\tif (PublicUtil.isEmpty(userIdList)) {\n\t\t\t// 取消该角色的所有用户的绑定\n\t\t\tlogger.info(\"取消绑定所有非超级管理员用户成功\");\n\t\t\treturn;\n\t\t}\n\n\t\t// 绑定所选用户\n\t\tfor (Long userId : userIdList) {\n\t\t\tUacUser uacUser = uacUserService.queryByUserId(userId);\n\t\t\tif (PublicUtil.isEmpty(uacUser)) {\n\t\t\t\tlogger.error(\"找不到绑定的用户 userId={}\", userId);\n\t\t\t\tthrow new UacBizException(ErrorCodeEnum.UAC10011024, userId);\n\t\t\t}\n\t\t\tuacRoleUserService.saveRoleUser(userId, roleId);\n\t\t}\n\n\t}\n\n\t@Override\n\t@Transactional(readOnly = true, rollbackFor = Exception.class)\n\tpublic List<UacRole> findAllRoleInfoByUserId(Long userId) {\n\t\treturn uacRoleMapper.selectAllRoleInfoByUserId(userId);\n\t}\n\n\t@Override\n\t@Transactional(readOnly = true, rollbackFor = Exception.class)\n\tpublic BindAuthVo getActionTreeByRoleId(Long roleId) {\n\t\tBindAuthVo bindAuthVo = new BindAuthVo();\n\t\tif (roleId == null) {\n\t\t\tthrow new UacBizException(ErrorCodeEnum.UAC10012001);\n\t\t}\n\n\t\tUacRole roleById = this.getRoleById(roleId);\n\t\tif (roleById == null) {\n\t\t\tlogger.error(\"找不到角色信息 roleId={}\", roleId);\n\t\t\tthrow new UacBizException(ErrorCodeEnum.UAC10012005, roleId);\n\t\t}\n\n\t\tList<UacMenu> uacMenus = uacMenuService.listMenuListByRoleId(roleId);\n\t\tif (PublicUtil.isEmpty(uacMenus)) {\n\t\t\tthrow new UacBizException(ErrorCodeEnum.UAC10013009);\n\t\t}\n\t\t// 查询所有的权限信息\n\t\tList<UacAction> uacActions = uacActionService.listActionList(uacMenus);\n\t\t// 合并菜单和按钮权限 递归生成树结构\n\n\t\tList<MenuVo> menuVoList = this.getAuthList(uacMenus, uacActions);\n\n\t\tList<MenuVo> tree = TreeUtil.getChildMenuVos(menuVoList, 0L);\n\n\t\t// 获取所有绑定的菜单和按钮权限Id集合\n\t\tList<Long> checkedAuthList = uacActionService.getCheckedActionList(roleId);\n\n\t\tbindAuthVo.setAuthTree(tree);\n\t\tbindAuthVo.setCheckedAuthList(checkedAuthList);\n\n\t\treturn bindAuthVo;\n\t}\n\n\tprivate List<MenuVo> getAuthList(List<UacMenu> uacMenus, List<UacAction> uacActions) {\n\t\tList<MenuVo> menuVoList = Lists.newArrayList();\n\t\tMenuVo menuVo;\n\t\tfor (UacMenu uacMenu : uacMenus) {\n\t\t\tmenuVo = new MenuVo();\n\t\t\tBeanUtils.copyProperties(uacMenu, menuVo);\n\t\t\tmenuVo.setRemark(\"menu\");\n\t\t\tmenuVoList.add(menuVo);\n\t\t}\n\t\tif (PublicUtil.isNotEmpty(uacActions)) {\n\t\t\tfor (UacAction uacAction : uacActions) {\n\t\t\t\tmenuVo = new MenuVo();\n\t\t\t\tmenuVo.setId(uacAction.getId());\n\t\t\t\tmenuVo.setMenuName(uacAction.getActionName());\n\t\t\t\tmenuVo.setMenuCode(uacAction.getActionCode());\n\t\t\t\tmenuVo.setPid(uacAction.getMenuId());\n\t\t\t\tmenuVo.setUrl(uacAction.getUrl());\n\t\t\t\tmenuVo.setRemark(\"action\");\n\t\t\t\tmenuVoList.add(menuVo);\n\t\t\t}\n\t\t}\n\t\treturn menuVoList;\n\t}\n\n\t@Override\n\tpublic void batchDeleteByIdList(List<Long> roleIdList) {\n\t\tlogger.info(\"批量删除角色. idList={}\", roleIdList);\n\t\tPreconditions.checkArgument(PublicUtil.isNotEmpty(roleIdList), \"删除角色ID不存在\");\n\n\t\tList<UacRoleUser> uruList = uacRoleUserService.listByRoleIdList(roleIdList);\n\t\tif (!uruList.isEmpty()) {\n\t\t\tuacRoleUserService.deleteByRoleIdList(roleIdList);\n\t\t}\n\n\t\tuacRoleMenuService.deleteByRoleIdList(roleIdList);\n\t\tuacRoleActionService.deleteByRoleIdList(roleIdList);\n\n\t\tint result = uacRoleMapper.batchDeleteByIdList(roleIdList);\n\t\tif (result < roleIdList.size()) {\n\t\t\tthrow new UacBizException(ErrorCodeEnum.UAC10012006, Joiner.on(GlobalConstant.Symbol.COMMA).join(roleIdList));\n\t\t}\n\t}\n\n\t@Override\n\t@Transactional(readOnly = true, rollbackFor = Exception.class)\n\tpublic List<MenuVo> getOwnAuthTree(Long userId) {\n\t\tif (userId == null) {\n\t\t\tthrow new UacBizException(ErrorCodeEnum.UAC10011001);\n\t\t}\n\n\t\treturn uacMenuService.getMenuVoList(userId, GlobalConstant.Sys.OPER_APPLICATION_ID);\n\t}\n\n\t@Override\n\tpublic void bindMenu(RoleBindMenuDto roleBindMenuDto) {\n\n\t\tLong roleId = roleBindMenuDto.getRoleId();\n\t\tSet<Long> menuIdList = roleBindMenuDto.getMenuIdList();\n\n\t\tif (roleId == null) {\n\t\t\tthrow new UacBizException(ErrorCodeEnum.UAC10012001);\n\t\t}\n\n\t\tif (Objects.equals(roleId, GlobalConstant.Sys.SUPER_MANAGER_ROLE_ID)) {\n\t\t\tlogger.error(\"越权操作, 超级管理员用户不允许操作\");\n\t\t\tthrow new UacBizException(ErrorCodeEnum.UAC10011023);\n\t\t}\n\n\t\tUacRole uacRole = uacRoleMapper.selectByPrimaryKey(roleId);\n\n\t\tif (uacRole == null) {\n\t\t\tlogger.error(\"找不到角色信息. roleId={}\", roleId);\n\t\t\tthrow new UacBizException(ErrorCodeEnum.UAC10012005, roleId);\n\t\t}\n\n\t\t// TODO 校验参数的合法性(这里不写了 累得慌 也就是校验菜单和权限是否存在)\n\t\tList<UacRoleMenu> uacRoleMenuList = uacRoleMenuService.listByRoleId(roleId);\n\n\t\tif (PublicUtil.isNotEmpty(uacRoleMenuList)) {\n\t\t\tuacRoleMenuService.deleteByRoleId(roleId);\n\t\t}\n\n\t\t// menuSet actionIdList 如果为空则 取消该角色所有权限\n\t\tif (PublicUtil.isEmpty(menuIdList)) {\n\t\t\tlogger.error(\"传入菜单权限Id为空, 取消菜单权限\");\n\t\t} else {\n\t\t\t// 绑定菜单\n\t\t\tuacRoleMenuService.insert(roleId, menuIdList);\n\n\t\t}\n\t}\n\n\t@Override\n\t@Transactional(readOnly = true, rollbackFor = Exception.class)\n\tpublic BindAuthVo getMenuTreeByRoleId(Long roleId) {\n\t\tBindAuthVo bindAuthVo = new BindAuthVo();\n\t\tPreconditions.checkArgument(roleId != null, ErrorCodeEnum.UAC10012001.msg());\n\n\t\tUacRole roleById = this.getRoleById(roleId);\n\t\tif (roleById == null) {\n\t\t\tlogger.error(\"找不到角色信息 roleId={}\", roleId);\n\t\t\tthrow new UacBizException(ErrorCodeEnum.UAC10012005, roleId);\n\t\t}\n\n\t\t// 查询所有的菜单信息\n\t\tList<UacMenu> uacMenus = uacMenuService.selectAll();\n\t\t// 合并菜单和按钮权限 递归生成树结构\n\n\t\tList<MenuVo> menuVoList = this.getAuthList(uacMenus, null);\n\n\t\tList<MenuVo> tree = TreeUtil.getChildMenuVos(menuVoList, 0L);\n\n\t\t// 获取所有绑定的菜单和按钮权限Id集合\n\t\tList<Long> checkedAuthList = uacActionService.getCheckedMenuList(roleId);\n\n\t\tbindAuthVo.setAuthTree(tree);\n\t\tbindAuthVo.setCheckedAuthList(checkedAuthList);\n\n\t\treturn bindAuthVo;\n\t}\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/service/impl/UacRoleUserServiceImpl.java",
    "content": "package com.paascloud.provider.service.impl;\n\nimport com.google.common.base.Joiner;\nimport com.google.common.base.Preconditions;\nimport com.paascloud.PublicUtil;\nimport com.paascloud.base.constant.GlobalConstant;\nimport com.paascloud.base.enums.ErrorCodeEnum;\nimport com.paascloud.core.support.BaseService;\nimport com.paascloud.provider.mapper.UacRoleUserMapper;\nimport com.paascloud.provider.model.domain.UacRoleUser;\nimport com.paascloud.provider.model.exceptions.UacBizException;\nimport com.paascloud.provider.service.UacRoleUserService;\nimport org.springframework.stereotype.Service;\nimport org.springframework.transaction.annotation.Transactional;\n\nimport javax.annotation.Resource;\nimport java.util.List;\nimport java.util.Objects;\n\n/**\n * The class Uac role user service.\n *\n * @author paascloud.net@gmail.com\n */\n@Service\n@Transactional(rollbackFor = Exception.class)\npublic class UacRoleUserServiceImpl extends BaseService<UacRoleUser> implements UacRoleUserService {\n\t@Resource\n\tprivate UacRoleUserMapper uacRoleUserMapper;\n\n\t@Override\n\tpublic int deleteByUserId(Long userId) {\n\t\tif (null == userId) {\n\t\t\tthrow new UacBizException(ErrorCodeEnum.UAC10011001);\n\t\t}\n\n\t\tUacRoleUser param = new UacRoleUser();\n\t\tparam.setUserId(userId);\n\t\treturn uacRoleUserMapper.delete(param);\n\t}\n\n\t@Override\n\t@Transactional(readOnly = true, rollbackFor = Exception.class)\n\tpublic List<UacRoleUser> queryByUserId(Long userId) {\n\t\tif (null == userId) {\n\t\t\tthrow new UacBizException(ErrorCodeEnum.UAC10011001);\n\t\t}\n\n\t\treturn uacRoleUserMapper.listByUserId(userId);\n\t}\n\n\t@Override\n\t@Transactional(readOnly = true, rollbackFor = Exception.class)\n\tpublic UacRoleUser getByUserIdAndRoleId(Long userId, Long roleId) {\n\n\t\tif (null == userId) {\n\t\t\tthrow new UacBizException(ErrorCodeEnum.UAC10011001);\n\t\t}\n\n\t\tif (null == roleId) {\n\t\t\tthrow new UacBizException(ErrorCodeEnum.UAC10012001);\n\t\t}\n\n\t\treturn uacRoleUserMapper.getByUserIdAndRoleId(userId, roleId);\n\t}\n\n\t@Override\n\tpublic int saveRoleUser(Long userId, Long roleId) {\n\t\tif (userId == null) {\n\t\t\tthrow new UacBizException(ErrorCodeEnum.UAC10011001);\n\t\t}\n\t\tif (roleId == null) {\n\t\t\tthrow new UacBizException(ErrorCodeEnum.UAC10012001);\n\t\t}\n\n\t\tUacRoleUser roleUser = new UacRoleUser();\n\t\troleUser.setUserId(userId);\n\t\troleUser.setRoleId(roleId);\n\t\treturn uacRoleUserMapper.insertSelective(roleUser);\n\t}\n\n\t@Override\n\t@Transactional(readOnly = true, rollbackFor = Exception.class)\n\tpublic List<UacRoleUser> listByRoleId(Long roleId) {\n\t\tif (roleId == null) {\n\t\t\tthrow new UacBizException(ErrorCodeEnum.UAC10012001);\n\t\t}\n\t\treturn uacRoleUserMapper.listByRoleId(roleId);\n\t}\n\n\t@Override\n\t@Transactional(readOnly = true, rollbackFor = Exception.class)\n\tpublic List<UacRoleUser> listByRoleIdList(List<Long> idList) {\n\t\tif (PublicUtil.isEmpty(idList)) {\n\t\t\tthrow new UacBizException(ErrorCodeEnum.UAC10012001);\n\t\t}\n\t\treturn uacRoleUserMapper.listByRoleIdList(idList);\n\t}\n\n\t@Override\n\t@Transactional(readOnly = true, rollbackFor = Exception.class)\n\tpublic List<Long> listSuperUser(Long superManagerRoleId) {\n\t\tif (superManagerRoleId == null) {\n\t\t\tthrow new UacBizException(ErrorCodeEnum.UAC10012001);\n\t\t}\n\t\treturn uacRoleUserMapper.listSuperUser(superManagerRoleId);\n\t}\n\n\t@Override\n\tpublic void deleteExcludeSuperMng(Long roleId, Long superManagerRoleId) {\n\t\tif (roleId == null) {\n\t\t\tthrow new UacBizException(ErrorCodeEnum.UAC10012001);\n\t\t}\n\t\tif (superManagerRoleId == null) {\n\t\t\tthrow new UacBizException(ErrorCodeEnum.UAC10012004);\n\t\t}\n\t\tuacRoleUserMapper.deleteExcludeSuperMng(roleId, superManagerRoleId);\n\n\t}\n\n\t@Override\n\t@Transactional(readOnly = true, rollbackFor = Exception.class)\n\tpublic List<UacRoleUser> listByUserId(Long userId) {\n\t\tif (userId == null) {\n\t\t\tthrow new UacBizException(ErrorCodeEnum.UAC10011001);\n\t\t}\n\t\treturn uacRoleUserMapper.listByUserId(userId);\n\t}\n\n\t@Override\n\tpublic void deleteByRoleIdList(List<Long> roleIdList) {\n\t\tPreconditions.checkArgument(PublicUtil.isNotEmpty(roleIdList), ErrorCodeEnum.UAC10012001.msg());\n\t\tPreconditions.checkArgument(!roleIdList.contains(GlobalConstant.Sys.SUPER_MANAGER_ROLE_ID), \"超级管理员角色不能删除\");\n\t\tint result = uacRoleUserMapper.deleteByRoleIdList(roleIdList);\n\t\tif (result < roleIdList.size()) {\n\t\t\tthrow new UacBizException(ErrorCodeEnum.UAC10012007, Joiner.on(GlobalConstant.Symbol.COMMA).join(roleIdList));\n\t\t}\n\t}\n\n\t@Override\n\tpublic void deleteByRoleId(Long roleId) {\n\t\tPreconditions.checkArgument(roleId != null, ErrorCodeEnum.UAC10012001.msg());\n\t\tPreconditions.checkArgument(!Objects.equals(roleId, GlobalConstant.Sys.SUPER_MANAGER_ROLE_ID), \"超级管理员角色不能删除\");\n\n\t\tint result = uacRoleUserMapper.deleteByRoleId(roleId);\n\t\tif (result < 1) {\n\t\t\tthrow new UacBizException(ErrorCodeEnum.UAC10012006, roleId);\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/service/impl/UacUserMenuServiceImpl.java",
    "content": "package com.paascloud.provider.service.impl;\n\n\nimport com.paascloud.core.support.BaseService;\nimport com.paascloud.provider.model.domain.UacUserMenu;\nimport com.paascloud.provider.service.UacUserMenuService;\nimport org.springframework.stereotype.Service;\nimport org.springframework.transaction.annotation.Transactional;\n\n/**\n * The class Uac user menu service.\n *\n * @author paascloud.net@gmail.com\n */\n@Service\n@Transactional(rollbackFor = Exception.class)\npublic class UacUserMenuServiceImpl extends BaseService<UacUserMenu> implements UacUserMenuService {\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/service/impl/UacUserServiceImpl.java",
    "content": "package com.paascloud.provider.service.impl;\n\nimport com.github.pagehelper.PageHelper;\nimport com.github.pagehelper.PageInfo;\nimport com.google.common.base.Preconditions;\nimport com.google.common.collect.Lists;\nimport com.google.common.collect.Maps;\nimport com.google.common.collect.Sets;\nimport com.paascloud.*;\nimport com.paascloud.base.constant.AliyunMqTopicConstants;\nimport com.paascloud.base.constant.GlobalConstant;\nimport com.paascloud.base.dto.LoginAuthDto;\nimport com.paascloud.base.enums.ErrorCodeEnum;\nimport com.paascloud.core.enums.LogTypeEnum;\nimport com.paascloud.core.support.BaseService;\nimport com.paascloud.core.utils.RequestUtil;\nimport com.paascloud.provider.manager.UserManager;\nimport com.paascloud.provider.mapper.UacActionMapper;\nimport com.paascloud.provider.mapper.UacMenuMapper;\nimport com.paascloud.provider.mapper.UacUserMapper;\nimport com.paascloud.provider.mapper.UacUserMenuMapper;\nimport com.paascloud.provider.model.domain.*;\nimport com.paascloud.provider.model.dto.menu.UserMenuChildrenDto;\nimport com.paascloud.provider.model.dto.menu.UserMenuDto;\nimport com.paascloud.provider.model.dto.user.*;\nimport com.paascloud.provider.model.enums.UacEmailTemplateEnum;\nimport com.paascloud.provider.model.enums.UacUserSourceEnum;\nimport com.paascloud.provider.model.enums.UacUserStatusEnum;\nimport com.paascloud.provider.model.enums.UacUserTypeEnum;\nimport com.paascloud.provider.model.exceptions.UacBizException;\nimport com.paascloud.provider.model.vo.MenuVo;\nimport com.paascloud.provider.model.vo.UserBindRoleVo;\nimport com.paascloud.provider.mq.producer.EmailProducer;\nimport com.paascloud.provider.service.*;\nimport com.paascloud.provider.utils.Md5Util;\nimport com.paascloud.security.core.SecurityUser;\nimport com.xiaoleilu.hutool.date.DateUtil;\nimport eu.bitwalker.useragentutils.UserAgent;\nimport org.springframework.beans.factory.annotation.Value;\nimport org.springframework.core.task.TaskExecutor;\nimport org.springframework.data.redis.core.RedisTemplate;\nimport org.springframework.security.core.GrantedAuthority;\nimport org.springframework.security.core.authority.SimpleGrantedAuthority;\nimport org.springframework.security.oauth2.common.OAuth2AccessToken;\nimport org.springframework.stereotype.Service;\nimport org.springframework.transaction.annotation.Transactional;\nimport org.springframework.util.StringUtils;\n\nimport javax.annotation.Resource;\nimport javax.servlet.http.HttpServletRequest;\nimport java.util.*;\nimport java.util.concurrent.TimeUnit;\n\n\n/**\n * The class Uac user service.\n *\n * @author paascloud.net@gmail.com\n */\n@Service\n@Transactional(rollbackFor = Exception.class)\npublic class UacUserServiceImpl extends BaseService<UacUser> implements UacUserService {\n\t@Resource\n\tprivate UacUserMapper uacUserMapper;\n\t@Resource\n\tprivate UacMenuService uacMenuService;\n\t@Resource\n\tprivate UacActionMapper uacActionMapper;\n\t@Resource\n\tprivate UacMenuMapper uacMenuMapper;\n\t@Resource\n\tprivate UacGroupUserService uacGroupUserService;\n\t@Resource\n\tprivate UacLogService uacLogService;\n\t@Resource\n\tprivate UacRoleService uacRoleService;\n\t@Resource\n\tprivate UacRoleUserService uacRoleUserService;\n\t@Resource\n\tprivate UacUserMenuMapper uacUserMenuMapper;\n\t@Resource\n\tprivate UacUserMenuService uacUserMenuService;\n\t@Resource\n\tprivate RedisService redisService;\n\t@Resource\n\tprivate EmailProducer emailProducer;\n\t@Value(\"${paascloud.auth.active-user-url}\")\n\tprivate String activeUserUrl;\n\t@Resource\n\tprivate UacActionService uacActionService;\n\t@Resource\n\tprivate RedisTemplate<String, Object> redisTemplate;\n\t@Resource\n\tprivate TaskExecutor taskExecutor;\n\t@Resource\n\tprivate UacUserTokenService uacUserTokenService;\n\t@Resource\n\tprivate OpcRpcService opcRpcService;\n\t@Resource\n\tprivate UserManager userManager;\n\n\t@Override\n\t@Transactional(readOnly = true, rollbackFor = Exception.class)\n\tpublic UacUser findByLoginName(String loginName) {\n\t\tlogger.info(\"findByLoginName - 根据用户名查询用户信息. loginName={}\", loginName);\n\n\t\treturn uacUserMapper.findByLoginName(loginName);\n\t}\n\n\t@Override\n\tpublic UacUser findByMobileNo(String mobileNo) {\n\t\treturn uacUserMapper.findByMobileNo(mobileNo);\n\t}\n\n\t@Override\n\t@Transactional(readOnly = true, rollbackFor = Exception.class)\n\tpublic void checkUserIsCorrect(LoginReqDto loginReqDto) {\n\t\tlogger.info(\"用户【\" + loginReqDto.getLoginName() + \"】进行密码认证......\");\n\n\t\tMap<String, String> loginNamePwdMap = Maps.newHashMap();\n\t\tloginNamePwdMap.put(\"loginName\", loginReqDto.getLoginName());\n\t\tloginNamePwdMap.put(\"loginPwd\", loginReqDto.getLoginPwd());\n\n\t\tUacUser uacUser = uacUserMapper.findByLoginNameAndLoginPwd(loginNamePwdMap);\n\t\tif (PublicUtil.isEmpty(uacUser)) {\n\t\t\tlogger.info(\"用户【\" + loginReqDto.getLoginName() + \"】密码认证失败\");\n\t\t\tthrow new UacBizException(ErrorCodeEnum.UAC10011002, loginReqDto.getLoginName());\n\t\t}\n\n\t\tlogger.info(\"用户【\" + loginReqDto.getLoginName() + \"】密码认证成功\");\n\t}\n\n\t@Override\n\t@Transactional(readOnly = true, rollbackFor = Exception.class)\n\tpublic List<Perm> getAllPerms() {\n\t\tlogger.info(\"获取全部的权限...\");\n\t\treturn uacActionMapper.findAllPerms();\n\t}\n\n\t@Override\n\t@Transactional(readOnly = true, rollbackFor = Exception.class)\n\tpublic List<String> getUserPerms(Long userId) {\n\t\tlogger.info(\"获取用户权限列表userId={}\", userId);\n\n\t\t//1.获取所有菜单权限\n\t\tList<String> menuPermList = uacMenuMapper.findMenuCodeListByUserId(userId);\n\t\t//2.获取所有的按钮权限\n\t\tList<String> buttonPermList = uacActionMapper.findActionCodeListByUserId(userId);\n\t\t//3.将菜单权限和按钮权限汇总去重返回\n\t\tSet<String> set = Sets.newHashSet();\n\t\tset.addAll(menuPermList);\n\t\tset.addAll(buttonPermList);\n\t\treturn new ArrayList<>(set);\n\t}\n\n\t@Override\n\tpublic int updateUser(UacUser uacUser) {\n\t\tlogger.info(\"更新用户信息 uacUser={}\", uacUser);\n\t\tint updateResult = uacUserMapper.updateByPrimaryKeySelective(uacUser);\n\t\tif (updateResult < 1) {\n\t\t\tlogger.info(\"用户【 {} 】修改用户信息失败\", uacUser.getId());\n\t\t} else {\n\t\t\tlogger.info(\"用户【 {} 】修改用户信息成功\", uacUser.getId());\n\t\t}\n\t\treturn updateResult;\n\t}\n\n\t@Override\n\t@Transactional(readOnly = true, rollbackFor = Exception.class)\n\tpublic PageInfo queryUserListWithPage(UacUser uacUser) {\n\t\tPageHelper.startPage(uacUser.getPageNum(), uacUser.getPageSize());\n\t\tuacUser.setOrderBy(\"u.update_time desc\");\n\t\tList<UacUser> uacUserList = uacUserMapper.selectUserList(uacUser);\n\t\treturn new PageInfo<>(uacUserList);\n\t}\n\n\t@Override\n\tpublic int deleteUserById(Long userId) {\n\t\treturn 0;\n\t}\n\n\t@Override\n\t@Transactional(readOnly = true, rollbackFor = Exception.class)\n\tpublic UacUser findUserInfoByUserId(Long userId) {\n\t\treturn uacUserMapper.selectUserInfoByUserId(userId);\n\t}\n\n\t@Override\n\tpublic void saveUacUser(UacUser user, LoginAuthDto loginAuthDto) {\n\n\t\tString loginName = user.getLoginName();\n\n\t\tPreconditions.checkArgument(!StringUtils.isEmpty(loginName), \"用户名不能为空\");\n\t\tPreconditions.checkArgument(user.getGroupId() != null, \"组织不能为空\");\n\n\t\tuser.setUpdateInfo(loginAuthDto);\n\t\tif (user.isNew()) {\n\t\t\tString loginPwd = user.getLoginPwd();\n\t\t\tPreconditions.checkArgument(!StringUtils.isEmpty(loginPwd), ErrorCodeEnum.UAC10011014.msg());\n\n\t\t\tuser.setLoginPwd(Md5Util.encrypt(loginPwd));\n\t\t\t// 验证用户名是否存在\n\t\t\tUacUser query = new UacUser();\n\t\t\tquery.setLoginName(loginName);\n\t\t\tint count = uacUserMapper.selectCount(query);\n\t\t\tif (count > 0) {\n\t\t\t\tthrow new UacBizException(ErrorCodeEnum.UAC10011025, loginName);\n\t\t\t}\n\t\t\tLong userId = super.generateId();\n\t\t\t// 1.保存用户信息\n\t\t\tuser.setId(userId);\n\t\t\tuser.setLoginName(loginName);\n\t\t\tuser.setType(UacUserTypeEnum.OPERATE.getKey());\n\t\t\tuser.setUserSource(UacUserSourceEnum.INSERT.getKey());\n\t\t\t// TODO 校验状态是否合法\n\t\t\tuacUserMapper.insertSelective(user);\n\n\t\t\t// 2.添加组织关联\n\t\t\tUacGroupUser groupUser = new UacGroupUser();\n\t\t\tgroupUser.setGroupId(user.getGroupId());\n\t\t\tgroupUser.setUserId(userId);\n\t\t\tuacGroupUserService.save(groupUser);\n\t\t} else {\n\t\t\tUacUser uacUser = uacUserMapper.selectByPrimaryKey(user.getId());\n\t\t\tPreconditions.checkArgument(uacUser != null, \"用户不存在\");\n\t\t\t// 1.更新用户信息\n\t\t\tint updateInt = uacUserMapper.updateUacUser(user);\n\t\t\tif (updateInt < 1) {\n\t\t\t\tthrow new UacBizException(ErrorCodeEnum.UAC10011026, user.getId());\n\t\t\t}\n\t\t\t// 2.绑定组织信息\n\t\t\tUacGroupUser uacGroupUser = uacGroupUserService.queryByUserId(user.getId());\n\t\t\tif (uacGroupUser == null) {\n\t\t\t\t// 添加组织关联\n\t\t\t\tUacGroupUser groupUser = new UacGroupUser();\n\t\t\t\tgroupUser.setGroupId(user.getGroupId());\n\t\t\t\tgroupUser.setUserId(user.getId());\n\t\t\t\tuacGroupUserService.save(groupUser);\n\t\t\t} else {\n\t\t\t\t//修改组织\n\t\t\t\tUacGroupUser groupUser = new UacGroupUser();\n\t\t\t\tgroupUser.setUserId(user.getId());\n\t\t\t\tgroupUser.setGroupId(user.getGroupId());\n\t\t\t\tuacGroupUserService.updateByUserId(groupUser);\n\t\t\t}\n\t\t}\n\n\t}\n\n\t@Override\n\t@Transactional(readOnly = true, rollbackFor = Exception.class)\n\tpublic List<UacLog> queryUserLogListWithUserId(Long userId) {\n\t\tif (PublicUtil.isEmpty(userId)) {\n\t\t\tthrow new UacBizException(ErrorCodeEnum.UAC10011001);\n\t\t}\n\t\treturn uacLogService.selectUserLogListByUserId(userId);\n\t}\n\n\t@Override\n\tpublic int modifyUserStatusById(UacUser uacUser, LoginAuthDto authResDto) {\n\t\tLong loginUserId = authResDto.getUserId();\n\t\tLong userId = uacUser.getId();\n\t\tif (loginUserId.equals(userId)) {\n\t\t\tthrow new UacBizException(ErrorCodeEnum.UAC10011023);\n\t\t}\n\t\tUacUser u = uacUserMapper.selectByPrimaryKey(userId);\n\t\tif (u == null) {\n\t\t\tthrow new UacBizException(ErrorCodeEnum.UAC10011011, userId);\n\t\t}\n\n\t\t// 更新用户最后修改人与修改时间\n\t\tuacUser.setVersion(u.getVersion() + 1);\n\t\tuacUser.setUpdateInfo(authResDto);\n\t\treturn uacUserMapper.updateByPrimaryKeySelective(uacUser);\n\t}\n\n\t@Override\n\tpublic void bindUserRoles(BindUserRolesDto bindUserRolesDto, LoginAuthDto authResDto) {\n\n\t\tif (bindUserRolesDto == null) {\n\t\t\tlogger.error(\"参数不能为空\");\n\t\t\tthrow new IllegalArgumentException(\"参数不能为空\");\n\t\t}\n\n\t\tLong operUserId = bindUserRolesDto.getUserId();\n\t\tLong loginUserId = authResDto.getUserId();\n\t\tList<Long> roleIdList = bindUserRolesDto.getRoleIdList();\n\n\t\tif (null == operUserId) {\n\t\t\tthrow new UacBizException(ErrorCodeEnum.UAC10011001);\n\t\t}\n\n\t\t// 任何用户不能操作admin用户\n\t\tif (Objects.equals(operUserId, GlobalConstant.Sys.SUPER_MANAGER_USER_ID)) {\n\t\t\tthrow new UacBizException(ErrorCodeEnum.UAC10011034);\n\t\t}\n\n\t\tUacUser user = this.queryByUserId(operUserId);\n\n\t\tif (user == null) {\n\t\t\tlogger.error(\"找不到用户信息 operUserId={}\", operUserId);\n\t\t\tthrow new UacBizException(ErrorCodeEnum.UAC10011003, operUserId);\n\t\t}\n\n\t\tif (PublicUtil.isNotEmpty(roleIdList) && roleIdList.contains(GlobalConstant.Sys.SUPER_MANAGER_ROLE_ID)) {\n\t\t\tlogger.error(\"操作超级管理员角色 userId={}\", loginUserId);\n\t\t\tthrow new UacBizException(ErrorCodeEnum.UAC10011023);\n\t\t}\n\n\t\t// 1. 先取消对该角色的用户绑定(不包含超级管理员用户)\n\t\tList<UacRoleUser> userRoles = uacRoleUserService.listByUserId(operUserId);\n\n\t\tif (PublicUtil.isNotEmpty(userRoles)) {\n\t\t\tuacRoleUserService.deleteByUserId(operUserId);\n\t\t}\n\n\t\t// 更新用户的操作时间\n\t\tfinal UacUser updateUser = new UacUser();\n\t\tupdateUser.setId(operUserId);\n\t\tupdateUser.setUpdateInfo(authResDto);\n\t\tuacUserMapper.updateUacUser(updateUser);\n\n\t\tif (PublicUtil.isEmpty(roleIdList)) {\n\t\t\t// 取消该角色的所有用户的绑定\n\t\t\tlogger.info(\"绑定角色成功\");\n\t\t\treturn;\n\t\t}\n\n\t\t// 绑定所选用户\n\t\tfor (Long roleId : roleIdList) {\n\t\t\tUacRole uacRole = uacRoleService.getRoleById(roleId);\n\t\t\tif (uacRole == null) {\n\t\t\t\tlogger.error(\"找不到绑定的角色. roleId={}\", roleId);\n\t\t\t\tthrow new UacBizException(ErrorCodeEnum.UAC10012008, roleId);\n\t\t\t}\n\t\t\tuacRoleUserService.saveRoleUser(operUserId, roleId);\n\t\t}\n\t}\n\n\t@Override\n\t@Transactional(readOnly = true, rollbackFor = Exception.class)\n\tpublic List<UserMenuDto> queryUserMenuDtoData(LoginAuthDto authResDto) {\n\t\t// 返回的结果集\n\t\tList<UserMenuDto> list = Lists.newArrayList();\n\t\tList<MenuVo> menuList; // 该用户下所有的菜单集合\n\t\tLong userId = authResDto.getUserId();\n\t\tList<Long> ownerMenuIdList = Lists.newArrayList();\n\t\tPreconditions.checkArgument(!PubUtils.isNull(authResDto, userId), \"无访问权限\");\n\n\t\t// 查询该用户下所有的菜单Id集合\n\t\tUacUserMenu query = new UacUserMenu();\n\t\tquery.setUserId(userId);\n\t\tList<UacUserMenu> userMenus = uacUserMenuMapper.select(query);\n\t\tfor (UacUserMenu userMenu : userMenus) {\n\t\t\tif (PublicUtil.isEmpty(userMenu.getUserId())) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\townerMenuIdList.add(userMenu.getMenuId());\n\t\t}\n\n\n\t\t//判断是否为admin用户 如果是则返回所有菜单, 如果不是走下面流程\n\t\tmenuList = uacMenuService.getMenuVoList(userId, 1L);\n\t\tfor (MenuVo menuVo : menuList) {\n\t\t\t// 一级菜单\n\t\t\tUserMenuDto userMenuDto = new UserMenuDto();\n\t\t\tuserMenuDto.setFistMenuIcon(menuVo.getIcon());\n\t\t\tuserMenuDto.setFistMenuName(menuVo.getMenuName());\n\t\t\tList<MenuVo> sub2Menu = menuVo.getSubMenu();\n\t\t\tList<UserMenuChildrenDto> children = Lists.newArrayList();\n\t\t\tfor (MenuVo vo2 : sub2Menu) {\n\t\t\t\t// 二级菜单 如果没有子节直接放入\n\t\t\t\tif (!vo2.isHasMenu()) {\n\t\t\t\t\tUserMenuChildrenDto userMenuChildrenDto = new UserMenuChildrenDto(vo2);\n\t\t\t\t\t//判断是否含有该菜单, 含有为true, 不含有为false\n\t\t\t\t\tif (ownerMenuIdList.contains(vo2.getId())) {\n\t\t\t\t\t\tuserMenuChildrenDto.setChecked(true);\n\t\t\t\t\t}\n\t\t\t\t\tchildren.add(userMenuChildrenDto);\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\t// 如果二级节点有子节继续循环三级菜单\n\t\t\t\tList<MenuVo> sub3Menu = vo2.getSubMenu();\n\t\t\t\tfor (MenuVo vo3 : sub3Menu) {\n\t\t\t\t\tUserMenuChildrenDto dto = new UserMenuChildrenDto(vo3);\n\t\t\t\t\t//判断是否含有该菜单, 含有为true, 不含有为false\n\t\t\t\t\tif (ownerMenuIdList.contains(vo3.getId())) {\n\t\t\t\t\t\tdto.setChecked(true);\n\t\t\t\t\t}\n\t\t\t\t\tchildren.add(dto);\n\t\t\t\t}\n\t\t\t}\n\t\t\tuserMenuDto.setChildren(children);\n\t\t\tlist.add(userMenuDto);\n\t\t}\n\n\t\treturn list;\n\t}\n\n\t@Override\n\tpublic int bindUserMenus(List<Long> menuIdList, LoginAuthDto authResDto) {\n\t\t// 1.1 如果menuIdList is null 则清空中间表\n\t\t// 1.2 判断越权操作(是否为该用户所属角色的菜单)\n\t\t// 1.3 判断该记录是否为子节点,如果不是子节点则不允许操作\n\t\t// 2 操作数据,先删除再插入, 这里主要考虑避免角色授权和用户修改角色要操作用户菜单中间表,在显示上做过滤,然后再操作中物理删除中间表信息,坐到数据一致性\n\t\tLong userId = authResDto.getUserId();\n\t\tList<UacUserMenu> uacUserMenuList = Lists.newArrayList();\n\n\t\tUacUserMenu uacUserMenu = new UacUserMenu();\n\t\tuacUserMenu.setUserId(userId);\n\n\t\tif (PublicUtil.isEmpty(menuIdList)) {\n\t\t\treturn deleteUserMenuList(uacUserMenu);\n\t\t}\n\n\t\t// 校验数据\n\t\tthis.checkUserMenuList(menuIdList, authResDto, uacUserMenuList);\n\n\t\t// 操作数据库\n\t\treturn handleUserMenuList(uacUserMenuList, uacUserMenu);\n\t}\n\n\t@Override\n\t@Transactional(readOnly = true, rollbackFor = Exception.class)\n\tpublic UacUser queryByUserId(Long userId) {\n\t\tlogger.info(\"queryByUserId - 根据用户查询用户信息接口. userId={}\", userId);\n\t\tUacUser uacUser = uacUserMapper.selectByPrimaryKey(userId);\n\t\tif (PublicUtil.isNotEmpty(uacUser)) {\n\t\t\tuacUser.setLoginPwd(\"\");\n\t\t}\n\t\treturn uacUser;\n\t}\n\n\t@Override\n\tpublic int userModifyPwd(UserModifyPwdDto userModifyPwdDto, LoginAuthDto authResDto) {\n\t\tString loginName = userModifyPwdDto.getLoginName();\n\t\tString oldPassword = userModifyPwdDto.getOldPassword();\n\t\tString newPassword = userModifyPwdDto.getNewPassword();\n\t\tString confirmPwd = userModifyPwdDto.getConfirmPwd();\n\n\t\tPreconditions.checkArgument(!PublicUtil.isEmpty(loginName), ErrorCodeEnum.UAC10011007.msg());\n\t\tPreconditions.checkArgument(!PublicUtil.isEmpty(oldPassword), \"原始密码不能为空\");\n\t\tPreconditions.checkArgument(!PublicUtil.isEmpty(newPassword), \"新密码不能为空\");\n\t\tPreconditions.checkArgument(!PublicUtil.isEmpty(confirmPwd), ErrorCodeEnum.UAC10011009.msg());\n\t\tPreconditions.checkArgument(newPassword.equals(confirmPwd), \"两次密码不一致, 请重新输入！\");\n\n\n\t\tUacUser user = uacUserMapper.findByLoginName(loginName);\n\t\tif (PublicUtil.isEmpty(user)) {\n\t\t\tthrow new UacBizException(ErrorCodeEnum.UAC10011002, loginName);\n\t\t}\n\n\t\tString oldPwd = user.getLoginPwd();\n\t\tString newEncrypt = Md5Util.encrypt(newPassword);\n\n\t\tif (!Md5Util.matches(oldPassword, oldPwd)) {\n\t\t\tthrow new UacBizException(ErrorCodeEnum.UAC10011035);\n\t\t}\n\n\t\tUacUser uacUser = new UacUser();\n\t\tif (Md5Util.matches(newPassword, oldPwd)) {\n\t\t\tthrow new UacBizException(ErrorCodeEnum.UAC10011036);\n\t\t}\n\n\t\tuacUser.setLoginPwd(Md5Util.encrypt(newPassword));\n\t\tuacUser.setId(user.getId());\n\t\tuacUser.setLoginPwd(newEncrypt);\n\t\t// 该用户已经修改过密码\n\t\tuacUser.setIsChangedPwd(Short.valueOf(\"1\"));\n\t\tuacUser.setUpdateInfo(authResDto);\n\n\t\treturn uacUserMapper.updateByPrimaryKeySelective(uacUser);\n\n\t\t// TODO 发送重置密码成功的邮件\n\t}\n\n\t@Override\n\tpublic int userResetPwd(UserResetPwdDto userResetPwdDto) {\n\t\tString mobileNo = userResetPwdDto.getMobileNo();\n\t\tString newPassword = userResetPwdDto.getNewPassword();\n\t\tString confirmPwd = userResetPwdDto.getConfirmPwd();\n\n\t\tPreconditions.checkArgument(!StringUtils.isEmpty(mobileNo), \"手机号码不能为空\");\n\t\tPreconditions.checkArgument(!StringUtils.isEmpty(newPassword), \"新密码不能为空\");\n\t\tPreconditions.checkArgument(!StringUtils.isEmpty(confirmPwd), ErrorCodeEnum.UAC10011009.msg());\n\t\tPreconditions.checkArgument(newPassword.equals(confirmPwd), \"两次密码不一致\");\n\n\t\tUacUser query = new UacUser();\n\t\tquery.setMobileNo(mobileNo);\n\t\tUacUser user = uacUserMapper.selectOne(query);\n\t\tif (user == null) {\n\t\t\tthrow new UacBizException(ErrorCodeEnum.UAC10011027, mobileNo);\n\t\t}\n\n\t\tUacUser uacUser = new UacUser();\n\t\tuacUser.setLoginPwd(Md5Util.encrypt(newPassword));\n\t\tuacUser.setId(user.getId());\n\n\t\t// 更新用户最后修改人与修改时间\n\t\tuacUser.setVersion(user.getVersion() + 1);\n\t\tuacUser.setLastOperator(user.getLoginName());\n\t\tuacUser.setLastOperatorId(user.getId());\n\t\tuacUser.setUpdateTime(new Date());\n\n\t\treturn uacUserMapper.updateByPrimaryKeySelective(uacUser);\n\t}\n\n\t@Override\n\tpublic void register(UserRegisterDto registerDto) {\n\t\t// 校验注册信息\n\t\tvalidateRegisterInfo(registerDto);\n\t\tString mobileNo = registerDto.getMobileNo();\n\t\tString email = registerDto.getEmail();\n\t\tDate row = new Date();\n\t\tString salt = String.valueOf(generateId());\n\t\t// 封装注册信息\n\t\tlong id = generateId();\n\t\tUacUser uacUser = new UacUser();\n\t\tuacUser.setLoginName(registerDto.getLoginName());\n\t\tuacUser.setSalt(salt);\n\t\tuacUser.setLoginPwd(Md5Util.encrypt(registerDto.getLoginPwd()));\n\t\tuacUser.setMobileNo(mobileNo);\n\t\tuacUser.setStatus(UacUserStatusEnum.DISABLE.getKey());\n\t\tuacUser.setUserSource(UacUserSourceEnum.REGISTER.getKey());\n\t\tuacUser.setCreatedTime(row);\n\t\tuacUser.setUpdateTime(row);\n\t\tuacUser.setEmail(email);\n\t\tuacUser.setId(id);\n\t\tuacUser.setCreatorId(id);\n\t\tuacUser.setCreator(registerDto.getLoginName());\n\t\tuacUser.setLastOperatorId(id);\n\t\tuacUser.setUserName(registerDto.getLoginName());\n\t\tuacUser.setLastOperator(registerDto.getLoginName());\n\n\t\t// 发送激活邮件\n\t\tString activeToken = PubUtils.uuid() + super.generateId();\n\t\tredisService.setKey(RedisKeyUtil.getActiveUserKey(activeToken), email, 1, TimeUnit.DAYS);\n\n\t\tMap<String, Object> param = Maps.newHashMap();\n\t\tparam.put(\"loginName\", registerDto.getLoginName());\n\t\tparam.put(\"email\", registerDto.getEmail());\n\t\tparam.put(\"activeUserUrl\", activeUserUrl + activeToken);\n\t\tparam.put(\"dateTime\", DateUtil.formatDateTime(new Date()));\n\n\t\tSet<String> to = Sets.newHashSet();\n\t\tto.add(registerDto.getEmail());\n\n\t\tMqMessageData mqMessageData = emailProducer.sendEmailMq(to, UacEmailTemplateEnum.ACTIVE_USER, AliyunMqTopicConstants.MqTagEnum.ACTIVE_USER, param);\n\t\tuserManager.register(mqMessageData, uacUser);\n\t}\n\n\t@Override\n\t@Transactional(readOnly = true, rollbackFor = Exception.class)\n\tpublic boolean checkLoginName(String loginName) {\n\t\tPreconditions.checkArgument(!StringUtils.isEmpty(loginName), ErrorCodeEnum.UAC10011007.msg());\n\n\t\tUacUser uacUser = new UacUser();\n\t\tuacUser.setLoginName(loginName);\n\t\tint result = 1;\n\t\ttry {\n\t\t\tresult = uacUserMapper.selectCount(uacUser);\n\t\t} catch (Exception e) {\n\t\t\tlogger.error(\" 验证用户名是否存在,出现异常={}\", e.getMessage(), e);\n\t\t}\n\t\treturn result < 1;\n\t}\n\n\t@Override\n\t@Transactional(readOnly = true, rollbackFor = Exception.class)\n\tpublic boolean checkEmail(String email) {\n\t\tPreconditions.checkArgument(!StringUtils.isEmpty(email), \"email不能为空\");\n\n\t\tUacUser uacUser = new UacUser();\n\t\tuacUser.setEmail(email);\n\t\tint result = 1;\n\t\ttry {\n\t\t\tresult = uacUserMapper.selectCount(uacUser);\n\t\t} catch (Exception e) {\n\t\t\tlogger.error(\" 验证email是否存在,出现异常={}\", e.getMessage(), e);\n\t\t}\n\t\treturn result < 1;\n\t}\n\n\t@Override\n\t@Transactional(readOnly = true, rollbackFor = Exception.class)\n\tpublic boolean checkMobileNo(String mobileNo) {\n\t\tPreconditions.checkArgument(!StringUtils.isEmpty(mobileNo), \"手机号码不能为空\");\n\n\t\tUacUser uacUser = new UacUser();\n\t\tuacUser.setMobileNo(mobileNo);\n\t\tint result = 1;\n\t\ttry {\n\t\t\tresult = uacUserMapper.selectCount(uacUser);\n\t\t} catch (Exception e) {\n\t\t\tlogger.error(\" 验证email是否存在,出现异常={}\", e.getMessage(), e);\n\t\t}\n\t\treturn result < 1;\n\t}\n\n\t@Override\n\t@Transactional(readOnly = true, rollbackFor = Exception.class)\n\tpublic int countUserByLoginNameAndEmail(String loginName, String email) {\n\t\tPreconditions.checkArgument(!StringUtils.isEmpty(loginName), ErrorCodeEnum.UAC10011007.msg());\n\t\tPreconditions.checkArgument(!StringUtils.isEmpty(email), ErrorCodeEnum.UAC10011018.msg());\n\n\t\tUacUser uacUser = new UacUser();\n\t\tuacUser.setLoginName(loginName);\n\t\tuacUser.setEmail(email);\n\n\t\treturn uacUserMapper.selectCount(uacUser);\n\t}\n\n\t@Override\n\tpublic int userEmailResetPwd(ForgetResetPasswordDto forgetResetPasswordDto) {\n\t\tthis.validateEmailResetPwd(forgetResetPasswordDto);\n\t\tString loginName = forgetResetPasswordDto.getLoginName();\n\n\t\tUacUser user = this.findByLoginName(loginName);\n\t\tUacUser uacUser = new UacUser();\n\t\tuacUser.setLoginPwd(Md5Util.encrypt(forgetResetPasswordDto.getLoginPwd()));\n\t\tuacUser.setId(user.getId());\n\t\tLoginAuthDto authUser = new LoginAuthDto();\n\t\tauthUser.setLoginName(loginName);\n\t\tauthUser.setUserId(user.getId());\n\t\tauthUser.setUserName(user.getUserName());\n\t\tuacUser.setUpdateInfo(authUser);\n\n\t\treturn uacUserMapper.updateByPrimaryKeySelective(uacUser);\n\n\n\t}\n\n\t@Override\n\tpublic void modifyUserEmail(String email, String emailCode, LoginAuthDto loginAuthDto) {\n\t\t// 校验用户信息\n\t\tPreconditions.checkArgument(!StringUtils.isEmpty(email), ErrorCodeEnum.UAC10011018.msg());\n\t\tPreconditions.checkArgument(PubUtils.isEmail(email), \"邮箱格式不正确\");\n\n\t\tUacUser uacUser = new UacUser();\n\t\tuacUser.setId(loginAuthDto.getUserId());\n\t\tuacUser.setEmail(email);\n\t\tuacUser.setUpdateInfo(loginAuthDto);\n\t\tint result = this.updateUser(uacUser);\n\t\tif (result < 1) {\n\t\t\tthrow new UacBizException(ErrorCodeEnum.UAC10011037, loginAuthDto.getUserId());\n\t\t}\n\t}\n\n\t@Override\n\tpublic void resetLoginPwd(Long userId, LoginAuthDto loginAuthDto) {\n\t\tif (userId == null) {\n\t\t\tthrow new UacBizException(ErrorCodeEnum.UAC10011001);\n\t\t}\n\t\tUacUser uacUser = this.queryByUserId(userId);\n\t\tif (uacUser == null) {\n\t\t\tlogger.error(\"找不到用户. userId={}\", userId);\n\t\t\tthrow new UacBizException(ErrorCodeEnum.UAC10011003, userId);\n\t\t}\n\n\t\tPreconditions.checkArgument(!StringUtils.isEmpty(uacUser.getEmail()), \"邮箱地址不能为空\");\n\n\t\tString newLoginPwd = RandomUtil.createComplexCode(8);\n\t\tUacUser update = new UacUser();\n\t\tupdate.setId(uacUser.getId());\n\t\tupdate.setLoginPwd(Md5Util.encrypt(newLoginPwd));\n\t\tshort isChangedPwd = 0;\n\t\tupdate.setIsChangedPwd(isChangedPwd);\n\n\t\tMap<String, Object> param = Maps.newHashMap();\n\t\tparam.put(\"loginName\", uacUser.getLoginName());\n\t\tparam.put(\"newLoginPwd\", newLoginPwd);\n\t\tparam.put(\"dateTime\", DateUtil.formatDateTime(new Date()));\n\n\t\tSet<String> to = Sets.newHashSet();\n\t\tto.add(uacUser.getEmail());\n\n\t\tfinal MqMessageData mqMessageData = emailProducer.sendEmailMq(to, UacEmailTemplateEnum.RESET_LOGIN_PWD, AliyunMqTopicConstants.MqTagEnum.RESET_LOGIN_PWD, param);\n\t\tuserManager.resetLoginPwd(mqMessageData, update);\n\n\n\t}\n\n\t@Override\n\tpublic void resetLoginPwd(ResetLoginPwdDto resetLoginPwdDto) {\n\t\tString confirmPwd = resetLoginPwdDto.getConfirmPwd();\n\t\tString newPassword = resetLoginPwdDto.getNewPassword();\n\t\tString resetPwdKey = resetLoginPwdDto.getResetPwdKey();\n\n\t\tPreconditions.checkArgument(!StringUtils.isEmpty(newPassword), ErrorCodeEnum.UAC10011014.msg());\n\t\tPreconditions.checkArgument(!StringUtils.isEmpty(confirmPwd), ErrorCodeEnum.UAC10011009.msg());\n\t\tPreconditions.checkArgument(!StringUtils.isEmpty(resetPwdKey), \"链接已失效\");\n\t\tPreconditions.checkArgument(newPassword.equals(confirmPwd), \"两次输入密码不一致\");\n\n\t\tString resetPwdTokenKey = RedisKeyUtil.getResetPwdTokenKey(resetPwdKey);\n\t\tUacUser uacUser = (UacUser) redisTemplate.opsForValue().get(resetPwdTokenKey);\n\n\t\tif (StringUtils.isEmpty(uacUser)) {\n\t\t\tthrow new UacBizException(ErrorCodeEnum.UAC10011028);\n\t\t}\n\n\t\tLoginAuthDto loginAuthDto = new LoginAuthDto();\n\t\tloginAuthDto.setUserName(uacUser.getUserName());\n\t\tloginAuthDto.setLoginName(uacUser.getLoginName());\n\t\tloginAuthDto.setUserId(uacUser.getId());\n\n\t\tUacUser update = new UacUser();\n\t\tString salt = generateId() + \"\";\n\t\tupdate.setLoginPwd(Md5Util.encrypt(newPassword));\n\t\tupdate.setSalt(salt);\n\t\tupdate.setId(uacUser.getId());\n\t\t// 该用户已经修改过密码\n\t\tupdate.setIsChangedPwd((Short.valueOf(\"1\")));\n\t\tupdate.setUpdateInfo(loginAuthDto);\n\n\t\tint result = uacUserMapper.updateByPrimaryKeySelective(update);\n\t\tif (result < 1) {\n\t\t\tthrow new UacBizException(ErrorCodeEnum.UAC10011029);\n\t\t}\n\t\tredisTemplate.delete(resetPwdTokenKey);\n\t}\n\n\t@Override\n\t@Transactional(readOnly = true, rollbackFor = Exception.class)\n\tpublic UserBindRoleVo getUserBindRoleDto(Long userId) {\n\t\tUserBindRoleVo userBindRoleVo = new UserBindRoleVo();\n\t\tSet<Long> alreadyBindRoleIdSet = Sets.newHashSet();\n\t\tUacUser uacUser = this.queryByUserId(userId);\n\t\tif (uacUser == null) {\n\t\t\tlogger.error(\"找不到userId={}, 的用户\", userId);\n\t\t\tthrow new UacBizException(ErrorCodeEnum.UAC10011003, userId);\n\t\t}\n\n\t\t// 查询所有角色包括该用户拥有的角色\n\t\tList<BindRoleDto> bindRoleDtoList = uacUserMapper.selectAllNeedBindRole(GlobalConstant.Sys.SUPER_MANAGER_ROLE_ID);\n\t\t// 该角色已经绑定的用户\n\t\tList<UacRoleUser> setAlreadyBindRoleSet = uacRoleUserService.listByUserId(userId);\n\n\t\tSet<BindRoleDto> allUserSet = new HashSet<>(bindRoleDtoList);\n\n\t\tfor (UacRoleUser uacRoleUser : setAlreadyBindRoleSet) {\n\t\t\talreadyBindRoleIdSet.add(uacRoleUser.getRoleId());\n\t\t}\n\n\t\tuserBindRoleVo.setAllRoleSet(allUserSet);\n\t\tuserBindRoleVo.setAlreadyBindRoleIdSet(alreadyBindRoleIdSet);\n\n\t\treturn userBindRoleVo;\n\t}\n\n\t@Override\n\tpublic void activeUser(String activeUserToken) {\n\t\tPreconditions.checkArgument(!StringUtils.isEmpty(activeUserToken), \"激活用户失败\");\n\n\t\tString activeUserKey = RedisKeyUtil.getActiveUserKey(activeUserToken);\n\n\t\tString email = redisService.getKey(activeUserKey);\n\n\t\tif (StringUtils.isEmpty(email)) {\n\t\t\tthrow new UacBizException(ErrorCodeEnum.UAC10011030);\n\t\t}\n\t\t// 修改用户状态, 绑定访客角色\n\t\tUacUser uacUser = new UacUser();\n\t\tuacUser.setEmail(email);\n\n\t\tuacUser = uacUserMapper.selectOne(uacUser);\n\t\tif (uacUser == null) {\n\t\t\tlogger.error(\"找不到用户信息. email={}\", email);\n\t\t\tthrow new UacBizException(ErrorCodeEnum.UAC10011004, email);\n\t\t}\n\n\t\tUacUser update = new UacUser();\n\t\tupdate.setId(uacUser.getId());\n\t\tupdate.setStatus(UacUserStatusEnum.ENABLE.getKey());\n\t\tLoginAuthDto loginAuthDto = new LoginAuthDto();\n\t\tloginAuthDto.setUserId(uacUser.getId());\n\t\tloginAuthDto.setUserName(uacUser.getLoginName());\n\t\tloginAuthDto.setLoginName(uacUser.getLoginName());\n\t\tupdate.setUpdateInfo(loginAuthDto);\n\n\t\tUacUser user = this.queryByUserId(uacUser.getId());\n\n\t\tMap<String, Object> param = Maps.newHashMap();\n\t\tparam.put(\"loginName\", user.getLoginName());\n\t\tparam.put(\"dateTime\", DateUtil.formatDateTime(new Date()));\n\n\t\tSet<String> to = Sets.newHashSet();\n\t\tto.add(user.getEmail());\n\n\n\t\tMqMessageData mqMessageData = emailProducer.sendEmailMq(to, UacEmailTemplateEnum.ACTIVE_USER_SUCCESS, AliyunMqTopicConstants.MqTagEnum.ACTIVE_USER_SUCCESS, param);\n\t\tuserManager.activeUser(mqMessageData, update, activeUserKey);\n\t}\n\n\t@Override\n\tpublic Collection<GrantedAuthority> loadUserAuthorities(Long userId) {\n\n\t\tList<UacAction> ownAuthList = uacActionService.getOwnActionListByUserId(userId);\n\t\tList<GrantedAuthority> authList = Lists.newArrayList();\n\t\tfor (UacAction action : ownAuthList) {\n\t\t\tGrantedAuthority grantedAuthority = new SimpleGrantedAuthority(action.getUrl());\n\t\t\tauthList.add(grantedAuthority);\n\t\t}\n\t\treturn authList;\n\t}\n\n\t@Override\n\tpublic void handlerLoginData(OAuth2AccessToken token, final SecurityUser principal, HttpServletRequest request) {\n\n\t\tfinal UserAgent userAgent = UserAgent.parseUserAgentString(request.getHeader(\"User-Agent\"));\n\t\t//获取客户端操作系统\n\t\tfinal String os = userAgent.getOperatingSystem().getName();\n\t\t//获取客户端浏览器\n\t\tfinal String browser = userAgent.getBrowser().getName();\n\t\tfinal String remoteAddr = RequestUtil.getRemoteAddr(request);\n\t\t// 根据IP获取位置信息\n\t\tfinal String remoteLocation = opcRpcService.getLocationById(remoteAddr);\n\t\tfinal String requestURI = request.getRequestURI();\n\n\t\tUacUser uacUser = new UacUser();\n\t\tLong userId = principal.getUserId();\n\t\tuacUser.setLastLoginIp(remoteAddr);\n\t\tuacUser.setId(userId);\n\t\tuacUser.setLastLoginTime(new Date());\n\t\tuacUser.setLastLoginLocation(remoteLocation);\n\t\tLoginAuthDto loginAuthDto = new LoginAuthDto(userId, principal.getLoginName(), principal.getNickName(), principal.getGroupId(), principal.getGroupName());\n\t\t// 记录token日志\n\t\tString accessToken = token.getValue();\n\t\tString refreshToken = token.getRefreshToken().getValue();\n\t\tuacUserTokenService.saveUserToken(accessToken, refreshToken, loginAuthDto, request);\n\t\t// 记录最后登录信息\n\t\ttaskExecutor.execute(() -> this.updateUser(uacUser));\n\t\t// 记录操作日志\n\n\t\tUacLog log = new UacLog();\n\t\tlog.setGroupId(principal.getGroupId());\n\t\tlog.setGroupName(principal.getGroupName());\n\t\tlog.setIp(remoteAddr);\n\t\tlog.setLocation(remoteLocation);\n\t\tlog.setOs(os);\n\t\tlog.setBrowser(browser);\n\t\tlog.setRequestUrl(requestURI);\n\t\tlog.setLogType(LogTypeEnum.LOGIN_LOG.getType());\n\t\tlog.setLogName(LogTypeEnum.LOGIN_LOG.getName());\n\n\t\ttaskExecutor.execute(() -> uacLogService.saveLog(log, loginAuthDto));\n\t}\n\n\t@Override\n\tpublic UacUser findUserInfoByLoginName(final String loginName) {\n\t\treturn uacUserMapper.findUserInfoByLoginName(loginName);\n\t}\n\n\tprivate void validateEmailResetPwd(ForgetResetPasswordDto forgetResetPasswordDto) {\n\t\t//校验注册信息\n\t\tString forgetToken = forgetResetPasswordDto.getForgetToken();\n\t\tString loginPwd = forgetResetPasswordDto.getLoginPwd();\n\t\tString loginName = forgetResetPasswordDto.getLoginName();\n\t\tString email = forgetResetPasswordDto.getEmail();\n\t\tString emailCode = forgetResetPasswordDto.getEmailCode();\n\n\t\tPreconditions.checkArgument(!StringUtils.isEmpty(loginName), ErrorCodeEnum.UAC10011007.msg());\n\t\tPreconditions.checkArgument(!StringUtils.isEmpty(email), ErrorCodeEnum.UAC10011018.msg());\n\t\tPreconditions.checkArgument(!StringUtils.isEmpty(loginPwd), ErrorCodeEnum.UAC10011014.msg());\n\t\tPreconditions.checkArgument(!StringUtils.isEmpty(forgetToken), \"非法操作\");\n\t\tPreconditions.checkArgument(!StringUtils.isEmpty(emailCode), \"验证码不能为空\");\n\n\t\t// 验证token\n\t\tString key = RedisKeyUtil.getResetPwdTokenKey(email);\n\t\tString forgetKey = redisService.getKey(key);\n\n\t\ttry {\n\t\t\tHttpAesUtil.decrypt(forgetToken, forgetKey, false, forgetKey);\n\t\t} catch (Exception e) {\n\t\t\tthrow new UacBizException(ErrorCodeEnum.UAC10011031);\n\t\t}\n\n\t\tint count = this.countUserByLoginNameAndEmail(loginName, email);\n\t\t// 校验token\n\t\tif (count < 1) {\n\t\t\tthrow new UacBizException(ErrorCodeEnum.UAC10011032, loginName, email);\n\t\t}\n\t}\n\n\t/**\n\t * 删除用户菜单表\n\t */\n\tprivate int deleteUserMenuList(UacUserMenu uacUserMenu) {\n\t\tint selCount = uacUserMenuMapper.selectCount(uacUserMenu);\n\t\t// 如果查询结果为空, 默认认为已删除成功\n\t\tif (selCount < 1) {\n\t\t\treturn 1;\n\t\t}\n\n\t\tint delCount = uacUserMenuMapper.delete(uacUserMenu);\n\t\tif (delCount < selCount) {\n\t\t\tlogger.error(\"清空该用户常用菜单失败 delCount = {} selCount = {}\", delCount, selCount);\n\t\t\tthrow new UacBizException(ErrorCodeEnum.UAC10011033);\n\t\t}\n\n\t\treturn delCount;\n\t}\n\n\t/**\n\t * 校验数据是否合法\n\t *\n\t * @param menuIdList      需要操作的菜单Id集合\n\t * @param authResDto      登录用户\n\t * @param uacUserMenuList 需要插入的记录\n\t */\n\tprivate void checkUserMenuList(List<Long> menuIdList, LoginAuthDto authResDto, List<UacUserMenu> uacUserMenuList) {\n\n\t\tList<MenuVo> currentUserMenuVoList = uacMenuService.findAllMenuListByAuthResDto(authResDto);\n\t\tList<Long> currentUserMenuIdList = Lists.newArrayList();\n\t\tfor (MenuVo menuVo : currentUserMenuVoList) {\n\t\t\tLong menuId = menuVo.getId();\n\n\t\t\tif (PublicUtil.isEmpty(menuId)) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tcurrentUserMenuIdList.add(menuId);\n\t\t}\n\n\t\tPreconditions.checkArgument(currentUserMenuIdList.containsAll(menuIdList), \"参数异常\");\n\n\t\t// TODO 预留一个过滤已失效菜单的接口\n\t\tfor (Long menuId : menuIdList) {\n\t\t\tif (uacMenuService.checkMenuHasChildMenu(menuId)) {\n\t\t\t\tlogger.error(\" 选择菜单不是根目录 menuId= {}\", menuId);\n\t\t\t\tthrow new UacBizException(ErrorCodeEnum.UAC10013010, menuId);\n\t\t\t}\n\t\t\tUacUserMenu uacUserMenu = new UacUserMenu();\n\t\t\tuacUserMenu.setUserId(authResDto.getUserId());\n\t\t\tuacUserMenu.setMenuId(menuId);\n\t\t\tuacUserMenuList.add(uacUserMenu);\n\t\t}\n\t}\n\n\tprivate int handleUserMenuList(List<UacUserMenu> uacUserMenuList, UacUserMenu uacUserMenu) {\n\t\t// 如果存在记录则清空数据表\n\t\tdeleteUserMenuList(uacUserMenu);\n\n\t\treturn uacUserMenuService.batchSave(uacUserMenuList);\n\t}\n\n\tprivate void validateRegisterInfo(UserRegisterDto registerDto) {\n\t\tString mobileNo = registerDto.getMobileNo();\n\n\t\tPreconditions.checkArgument(!StringUtils.isEmpty(registerDto.getLoginName()), ErrorCodeEnum.UAC10011007.msg());\n\t\tPreconditions.checkArgument(!StringUtils.isEmpty(registerDto.getEmail()), ErrorCodeEnum.UAC10011018.msg());\n\t\tPreconditions.checkArgument(!StringUtils.isEmpty(mobileNo), \"手机号不能为空\");\n\t\tPreconditions.checkArgument(!StringUtils.isEmpty(registerDto.getLoginPwd()), ErrorCodeEnum.UAC10011014.msg());\n\t\tPreconditions.checkArgument(!StringUtils.isEmpty(registerDto.getConfirmPwd()), ErrorCodeEnum.UAC10011009.msg());\n\t\tPreconditions.checkArgument(!StringUtils.isEmpty(registerDto.getRegisterSource()), \"验证类型错误\");\n\t\tPreconditions.checkArgument(registerDto.getLoginPwd().equals(registerDto.getConfirmPwd()), \"两次密码不一致\");\n\n\t\tUacUser uacUser = new UacUser();\n\t\tuacUser.setLoginName(registerDto.getLoginName());\n\t\tint count = uacUserMapper.selectCount(uacUser);\n\t\tif (count > 0) {\n\t\t\tthrow new UacBizException(ErrorCodeEnum.UAC10011012);\n\t\t}\n\n\t\tuacUser = new UacUser();\n\t\tuacUser.setMobileNo(registerDto.getMobileNo());\n\t\tcount = uacUserMapper.selectCount(uacUser);\n\t\tif (count > 0) {\n\t\t\tthrow new UacBizException(ErrorCodeEnum.UAC10011013);\n\t\t}\n\n\t\tuacUser = new UacUser();\n\t\tuacUser.setEmail(registerDto.getEmail());\n\t\tcount = uacUserMapper.selectCount(uacUser);\n\t\tif (count > 0) {\n\t\t\tthrow new UacBizException(ErrorCodeEnum.UAC10011019);\n\t\t}\n\n\t}\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/service/impl/UacUserTokenServiceImpl.java",
    "content": "package com.paascloud.provider.service.impl;\n\nimport com.alibaba.fastjson.JSON;\nimport com.alibaba.fastjson.JSONObject;\nimport com.arronlong.httpclientutil.HttpClientUtil;\nimport com.arronlong.httpclientutil.common.HttpConfig;\nimport com.arronlong.httpclientutil.common.HttpHeader;\nimport com.arronlong.httpclientutil.exception.HttpProcessException;\nimport com.github.pagehelper.PageHelper;\nimport com.github.pagehelper.PageInfo;\nimport com.google.common.collect.Maps;\nimport com.paascloud.PublicUtil;\nimport com.paascloud.RedisKeyUtil;\nimport com.paascloud.base.dto.LoginAuthDto;\nimport com.paascloud.base.dto.UserTokenDto;\nimport com.paascloud.core.support.BaseService;\nimport com.paascloud.core.utils.RequestUtil;\nimport com.paascloud.provider.mapper.UacUserTokenMapper;\nimport com.paascloud.provider.model.domain.UacUser;\nimport com.paascloud.provider.model.domain.UacUserToken;\nimport com.paascloud.provider.model.dto.token.TokenMainQueryDto;\nimport com.paascloud.provider.model.enums.UacUserTokenStatusEnum;\nimport com.paascloud.provider.service.OpcRpcService;\nimport com.paascloud.provider.service.UacUserService;\nimport com.paascloud.provider.service.UacUserTokenService;\nimport com.paascloud.security.core.properties.OAuth2ClientProperties;\nimport com.paascloud.security.core.properties.SecurityProperties;\nimport eu.bitwalker.useragentutils.UserAgent;\nimport org.apache.commons.lang3.StringUtils;\nimport org.apache.http.Header;\nimport org.modelmapper.ModelMapper;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.beans.factory.annotation.Value;\nimport org.springframework.data.redis.core.RedisTemplate;\nimport org.springframework.http.HttpHeaders;\nimport org.springframework.stereotype.Service;\nimport org.springframework.transaction.annotation.Transactional;\n\nimport javax.annotation.Resource;\nimport javax.servlet.http.HttpServletRequest;\nimport java.util.HashMap;\nimport java.util.List;\nimport java.util.Map;\nimport java.util.concurrent.TimeUnit;\n\n\n/**\n * The class Uac user token service.\n *\n * @author paascloud.net @gmail.com\n */\n@Service\n@Transactional(rollbackFor = Exception.class)\npublic class UacUserTokenServiceImpl extends BaseService<UacUserToken> implements UacUserTokenService {\n\t@Resource\n\tprivate UacUserTokenMapper uacUserTokenMapper;\n\t@Resource\n\tprivate UacUserService uacUserService;\n\t@Autowired\n\tprivate SecurityProperties securityProperties;\n\t@Resource\n\tprivate RedisTemplate<String, Object> redisTemplate;\n\t@Resource\n\tprivate OpcRpcService opcRpcService;\n\t@Value(\"${paascloud.auth.refresh-token-url}\")\n\tprivate String refreshTokenUrl;\n\n\t@Override\n\tpublic void saveUserToken(String accessToken, String refreshToken, LoginAuthDto loginAuthDto, HttpServletRequest request) {\n\t\t// 获取登录时间\n\t\tLong userId = loginAuthDto.getUserId();\n\t\tUacUser uacUser = uacUserService.selectByKey(userId);\n\t\tfinal UserAgent userAgent = UserAgent.parseUserAgentString(request.getHeader(\"User-Agent\"));\n\t\t//获取客户端操作系统\n\t\tfinal String os = userAgent.getOperatingSystem().getName();\n\t\t//获取客户端浏览器\n\t\tfinal String browser = userAgent.getBrowser().getName();\n\t\tfinal String remoteAddr = RequestUtil.getRemoteAddr(request);\n\t\t// 根据IP获取位置信息\n\t\tfinal String remoteLocation = opcRpcService.getLocationById(remoteAddr);\n\n\t\t// 存入mysql数据库\n\t\tUacUserToken uacUserToken = new UacUserToken();\n\t\tOAuth2ClientProperties[] clients = securityProperties.getOauth2().getClients();\n\t\tint accessTokenValidateSeconds = clients[0].getAccessTokenValidateSeconds();\n\t\tint refreshTokenValiditySeconds = clients[0].getRefreshTokenValiditySeconds();\n\t\tuacUserToken.setOs(os);\n\t\tuacUserToken.setBrowser(browser);\n\t\tuacUserToken.setAccessToken(accessToken);\n\t\tuacUserToken.setAccessTokenValidity(accessTokenValidateSeconds);\n\t\tuacUserToken.setLoginIp(remoteAddr);\n\t\tuacUserToken.setLoginLocation(remoteLocation);\n\t\tuacUserToken.setLoginTime(uacUser.getLastLoginTime());\n\t\tuacUserToken.setLoginName(loginAuthDto.getLoginName());\n\t\tuacUserToken.setRefreshToken(refreshToken);\n\t\tuacUserToken.setRefreshTokenValidity(refreshTokenValiditySeconds);\n\t\tuacUserToken.setStatus(UacUserTokenStatusEnum.ON_LINE.getStatus());\n\t\tuacUserToken.setUserId(userId);\n\t\tuacUserToken.setUserName(loginAuthDto.getUserName());\n\t\tuacUserToken.setUpdateInfo(loginAuthDto);\n\t\tuacUserToken.setGroupId(loginAuthDto.getGroupId());\n\t\tuacUserToken.setGroupName(loginAuthDto.getGroupName());\n\t\tuacUserToken.setId(generateId());\n\t\tuacUserTokenMapper.insertSelective(uacUserToken);\n\t\tUserTokenDto userTokenDto = new ModelMapper().map(uacUserToken, UserTokenDto.class);\n\t\t// 存入redis数据库\n\t\tupdateRedisUserToken(accessToken, accessTokenValidateSeconds, userTokenDto);\n\t}\n\n\tprivate void updateRedisUserToken(String accessToken, int accessTokenValidateSeconds, UserTokenDto userTokenDto) {\n\t\tredisTemplate.opsForValue().set(RedisKeyUtil.getAccessTokenKey(accessToken), userTokenDto, accessTokenValidateSeconds, TimeUnit.SECONDS);\n\t}\n\n\t@Override\n\tpublic UserTokenDto getByAccessToken(String accessToken) {\n\t\tUserTokenDto userTokenDto = (UserTokenDto) redisTemplate.opsForValue().get(RedisKeyUtil.getAccessTokenKey(accessToken));\n\t\tif (userTokenDto == null) {\n\t\t\tUacUserToken uacUserToken = new UacUserToken();\n\t\t\tuacUserToken.setAccessToken(accessToken);\n\t\t\tuacUserToken = uacUserTokenMapper.selectOne(uacUserToken);\n\t\t\tuserTokenDto = new ModelMapper().map(uacUserToken, UserTokenDto.class);\n\t\t}\n\t\treturn userTokenDto;\n\t}\n\n\t@Override\n\tpublic void updateUacUserToken(UserTokenDto tokenDto, LoginAuthDto loginAuthDto) {\n\t\tUacUserToken uacUserToken = new ModelMapper().map(tokenDto, UacUserToken.class);\n\t\tuacUserToken.setUpdateInfo(loginAuthDto);\n\t\tuacUserTokenMapper.updateByPrimaryKeySelective(uacUserToken);\n\t\tOAuth2ClientProperties[] clients = securityProperties.getOauth2().getClients();\n\t\tint accessTokenValidateSeconds = clients[0].getAccessTokenValidateSeconds();\n\t\tupdateRedisUserToken(uacUserToken.getAccessToken(), accessTokenValidateSeconds, tokenDto);\n\t}\n\n\t@Override\n\tpublic PageInfo listTokenWithPage(TokenMainQueryDto token) {\n\t\tPageHelper.startPage(token.getPageNum(), token.getPageSize());\n\t\tUacUserToken userToken = new UacUserToken();\n\t\tuserToken.setStatus(token.getStatus());\n\t\tif (token.getStatus() != null) {\n\t\t\tuserToken.setStatus(token.getStatus());\n\t\t}\n\n\t\tif (StringUtils.isNotBlank(token.getLoginName())) {\n\t\t\tuserToken.setLoginName(token.getLoginName());\n\t\t}\n\t\tif (StringUtils.isNotBlank(token.getUserName())) {\n\t\t\tuserToken.setUserName(token.getUserName());\n\t\t}\n\t\tList<UacUserToken> userTokenList = uacUserTokenMapper.selectTokenList(userToken);\n\t\treturn new PageInfo<>(userTokenList);\n\t}\n\n\t@Override\n\tpublic String refreshToken(String accessToken, String refreshToken, HttpServletRequest request) throws HttpProcessException {\n\t\tString token;\n\t\tMap<String, Object> map = new HashMap<>(2);\n\t\tmap.put(\"grant_type\", \"refresh_token\");\n\t\tmap.put(\"refresh_token\", refreshToken);\n\n\t\t//插件式配置请求参数（网址、请求参数、编码、client）\n\t\tHeader[] headers = HttpHeader.custom().contentType(HttpHeader.Headers.APP_FORM_URLENCODED).authorization(request.getHeader(HttpHeaders.AUTHORIZATION)).build();\n\t\tHttpConfig config = HttpConfig.custom().headers(headers).url(refreshTokenUrl).map(map);\n\t\ttoken = HttpClientUtil.post(config);\n\t\tJSONObject jsonObj = JSON.parseObject(token);\n\t\tString accessTokenNew = (String) jsonObj.get(\"access_token\");\n\t\tString refreshTokenNew = (String) jsonObj.get(\"refresh_token\");\n\t\tString loginName = (String) jsonObj.get(\"loginName\");\n\t\t// 更新本次token数据\n\t\tUserTokenDto tokenDto = this.getByAccessToken(accessToken);\n\t\ttokenDto.setStatus(UacUserTokenStatusEnum.ON_REFRESH.getStatus());\n\t\tUacUser uacUser = uacUserService.findUserInfoByLoginName(loginName);\n\n\t\tLoginAuthDto loginAuthDto = new LoginAuthDto(uacUser.getId(), uacUser.getLoginName(), uacUser.getUserName(), uacUser.getGroupId(), uacUser.getGroupName());\n\t\tthis.updateUacUserToken(tokenDto, loginAuthDto);\n\t\t// 创建刷新token\n\t\tthis.saveUserToken(accessTokenNew, refreshTokenNew, loginAuthDto, request);\n\t\treturn token;\n\t}\n\n\t@Override\n\tpublic int batchUpdateTokenOffLine() {\n\t\tList<Long> idList = uacUserTokenMapper.listOffLineTokenId();\n\t\tif (PublicUtil.isEmpty(idList)) {\n\t\t\treturn 1;\n\t\t}\n\t\tMap<String, Object> map = Maps.newHashMap();\n\t\tmap.put(\"status\", 20);\n\t\tmap.put(\"tokenIdList\", idList);\n\t\treturn uacUserTokenMapper.batchUpdateTokenOffLine(map);\n\t}\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/utils/Md5Util.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：Md5Util.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.utils;\n\nimport lombok.AccessLevel;\nimport lombok.NoArgsConstructor;\nimport lombok.extern.slf4j.Slf4j;\nimport org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;\n\n\n/**\n * The class Md 5 util.\n *\n * @author paascloud.net @gmail.com\n */\n@Slf4j\n@NoArgsConstructor(access = AccessLevel.PRIVATE)\npublic class Md5Util {\n\n\t/**\n\t * Encrypt string.\n\t *\n\t * @param password 密码\n\t *\n\t * @return the string\n\t */\n\tpublic static String encrypt(String password) {\n\t\treturn new BCryptPasswordEncoder().encode(password);\n\t}\n\n\t/**\n\t * 密码是否匹配.\n\t *\n\t * @param rawPassword     明文\n\t * @param encodedPassword 密文\n\t *\n\t * @return the boolean\n\t */\n\tpublic static boolean matches(CharSequence rawPassword, String encodedPassword) {\n\t\treturn new BCryptPasswordEncoder().matches(rawPassword, encodedPassword);\n\t}\n\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/utils/TreeUtil.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：TreeUtil.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.utils;\n\nimport com.google.common.collect.Lists;\nimport com.paascloud.PublicUtil;\nimport com.paascloud.provider.model.vo.MenuVo;\nimport lombok.AccessLevel;\nimport lombok.NoArgsConstructor;\n\nimport java.util.List;\nimport java.util.Objects;\n\n/**\n * The class Tree util.\n *\n * @author paascloud.net@gmail.com\n */\n@NoArgsConstructor(access = AccessLevel.PRIVATE)\npublic class TreeUtil {\n\t/**\n\t * 根据父节点的ID获取所有子节点\n\t *\n\t * @param list     具有树形结构特点的集合\n\t * @param parentId 父节点ID\n\t *\n\t * @return 树形结构集合 child menu vos\n\t */\n\tpublic static List<MenuVo> getChildMenuVos(List<MenuVo> list, Long parentId) {\n\t\tList<MenuVo> returnList = Lists.newArrayList();\n\n\t\tfor (MenuVo menuVo : list) {\n\t\t\tif (menuVo.getPid() == null) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (Objects.equals(menuVo.getPid(), parentId)) {\n\t\t\t\trecursionFn(list, menuVo);\n\t\t\t\treturnList.add(menuVo);\n\t\t\t}\n\t\t}\n\t\treturn returnList;\n\t}\n\n\t/**\n\t * 递归列表\n\t */\n\tprivate static void recursionFn(List<MenuVo> list, MenuVo t) {\n\t\t// 得到子节点列表\n\t\tList<MenuVo> childList = getChildList(list, t);\n\t\tt.setSubMenu(childList);\n\t\tif (PublicUtil.isNotEmpty(childList)) {\n\t\t\tt.setHasMenu(true);\n\t\t}\n\t\tfor (MenuVo tChild : childList) {\n\t\t\t// 判断是否有子节点\n\t\t\tif (hasChild(list, tChild)) {\n\t\t\t\tfor (MenuVo n : childList) {\n\t\t\t\t\trecursionFn(list, n);\n\t\t\t\t}\n\t\t\t\ttChild.setHasMenu(true);\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * 得到子节点列表\n\t */\n\tprivate static List<MenuVo> getChildList(List<MenuVo> list, MenuVo t) {\n\t\tList<MenuVo> tList = Lists.newArrayList();\n\n\t\tfor (MenuVo menuVo : list) {\n\t\t\tif (PublicUtil.isEmpty(menuVo.getPid())) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (Objects.equals(menuVo.getPid(), t.getId())) {\n\t\t\t\ttList.add(menuVo);\n\t\t\t}\n\t\t}\n\t\treturn tList;\n\t}\n\n\t/**\n\t * 判断是否有子节点\n\t */\n\tprivate static boolean hasChild(List<MenuVo> list, MenuVo t) {\n\t\treturn !getChildList(list, t).isEmpty();\n\t}\n\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/web/GlobalExceptionHandler.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：GlobalExceptionHandler.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.web;\n\n\nimport com.paascloud.base.enums.ErrorCodeEnum;\nimport com.paascloud.base.exception.BusinessException;\nimport com.paascloud.provider.model.dto.GlobalExceptionLogDto;\nimport com.paascloud.provider.service.MdcExceptionLogFeignApi;\nimport com.paascloud.wrapper.WrapMapper;\nimport com.paascloud.wrapper.Wrapper;\nimport lombok.extern.slf4j.Slf4j;\nimport org.springframework.beans.factory.annotation.Value;\nimport org.springframework.core.task.TaskExecutor;\nimport org.springframework.http.HttpStatus;\nimport org.springframework.security.access.AccessDeniedException;\nimport org.springframework.web.bind.annotation.*;\n\nimport javax.annotation.Resource;\n\n/**\n * 全局的的异常拦截器\n *\n * @author paascloud.net @gmail.com\n */\n@Slf4j\n@RestControllerAdvice\npublic class GlobalExceptionHandler {\n\t@Resource\n\tprivate TaskExecutor taskExecutor;\n\t@Value(\"${spring.profiles.active}\")\n\tString profile;\n\t@Value(\"${spring.application.name}\")\n\tString applicationName;\n\t@Resource\n\tprivate MdcExceptionLogFeignApi mdcExceptionLogFeignApi;\n\n\t/**\n\t * 参数非法异常.\n\t *\n\t * @param e the e\n\t *\n\t * @return the wrapper\n\t */\n\t@ExceptionHandler(IllegalArgumentException.class)\n\t@ResponseStatus(HttpStatus.OK)\n\t@ResponseBody\n\tpublic Wrapper illegalArgumentException(IllegalArgumentException e) {\n\t\tlog.error(\"参数非法异常={}\", e.getMessage(), e);\n\t\treturn WrapMapper.wrap(ErrorCodeEnum.GL99990100.code(), e.getMessage());\n\t}\n\n\t/**\n\t * 业务异常.\n\t *\n\t * @param e the e\n\t *\n\t * @return the wrapper\n\t */\n\t@ExceptionHandler(BusinessException.class)\n\t@ResponseStatus(HttpStatus.OK)\n\t@ResponseBody\n\tpublic Wrapper businessException(BusinessException e) {\n\t\tlog.error(\"业务异常={}\", e.getMessage(), e);\n\t\treturn WrapMapper.wrap(e.getCode() == 0 ? Wrapper.ERROR_CODE : e.getCode(), e.getMessage());\n\t}\n\n\t/**\n\t * 无权限访问.\n\t *\n\t * @param e the e\n\t *\n\t * @return the wrapper\n\t */\n\t@ExceptionHandler(AccessDeniedException.class)\n\t@ResponseStatus(HttpStatus.UNAUTHORIZED)\n\t@ResponseBody\n\tpublic Wrapper unAuthorizedException(AccessDeniedException e) {\n\t\tlog.error(\"业务异常={}\", e.getMessage(), e);\n\t\treturn WrapMapper.wrap(ErrorCodeEnum.GL99990401.code(), ErrorCodeEnum.GL99990401.msg());\n\t}\n\n\n\t/**\n\t * 全局异常.\n\t *\n\t * @param e the e\n\t *\n\t * @return the wrapper\n\t */\n\t@ExceptionHandler(Exception.class)\n\t@ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)\n\t@ResponseBody\n\tpublic Wrapper exception(Exception e) {\n\t\tlog.info(\"保存全局异常信息 ex={}\", e.getMessage(), e);\n\t\ttaskExecutor.execute(() -> {\n\t\t\tGlobalExceptionLogDto globalExceptionLogDto = new GlobalExceptionLogDto().getGlobalExceptionLogDto(e, profile, applicationName);\n\t\t\tmdcExceptionLogFeignApi.saveAndSendExceptionLog(globalExceptionLogDto);\n\t\t});\n\t\treturn WrapMapper.error();\n\t}\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/web/admin/AuthRestController.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：AuthRestController.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.web.admin;\n\nimport com.google.common.base.Preconditions;\nimport com.paascloud.base.dto.CheckValidDto;\nimport com.paascloud.core.annotation.OperationLogDto;\nimport com.paascloud.core.support.BaseController;\nimport com.paascloud.provider.model.constant.UacApiConstant;\nimport com.paascloud.provider.model.domain.UacUser;\nimport com.paascloud.provider.model.dto.user.ResetLoginPwdDto;\nimport com.paascloud.provider.model.dto.user.UserRegisterDto;\nimport com.paascloud.provider.model.enums.UacUserStatusEnum;\nimport com.paascloud.provider.service.EmailService;\nimport com.paascloud.provider.service.SmsService;\nimport com.paascloud.provider.service.UacLogService;\nimport com.paascloud.provider.service.UacUserService;\nimport com.paascloud.wrapper.WrapMapper;\nimport com.paascloud.wrapper.Wrapper;\nimport io.swagger.annotations.Api;\nimport io.swagger.annotations.ApiOperation;\nimport org.apache.commons.lang3.StringUtils;\nimport org.springframework.http.MediaType;\nimport org.springframework.web.bind.annotation.*;\n\nimport javax.annotation.Resource;\nimport javax.servlet.http.HttpServletRequest;\nimport javax.servlet.http.HttpServletResponse;\n\n/**\n * 不认证的URL请求.\n *\n * @author paascloud.net @gmail.com\n */\n@RestController\n@RequestMapping(value = \"/auth\")\n@Api(value = \"Web-AuthRestController\", produces = MediaType.APPLICATION_JSON_UTF8_VALUE)\npublic class AuthRestController extends BaseController {\n\t@Resource\n\tprivate UacUserService uacUserService;\n\t@Resource\n\tprivate SmsService smsService;\n\t@Resource\n\tprivate EmailService emailService;\n\t@Resource\n\tprivate UacLogService uacLogService;\n\n\t/**\n\t * 校验手机号码.\n\t *\n\t * @param mobileNo the mobile no\n\t *\n\t * @return the wrapper\n\t */\n\t@PostMapping(value = \"/checkPhoneActive/{mobileNo}\")\n\t@ApiOperation(httpMethod = \"POST\", value = \"校验手机号码\")\n\tpublic Wrapper<Boolean> checkPhoneActive(@PathVariable String mobileNo) {\n\t\tUacUser uacUser = new UacUser();\n\t\tuacUser.setStatus(UacUserStatusEnum.ENABLE.getKey());\n\t\tuacUser.setMobileNo(mobileNo);\n\t\tint count = uacUserService.selectCount(uacUser);\n\t\treturn WrapMapper.ok(count > 0);\n\t}\n\n\t/**\n\t * 校验邮箱.\n\t *\n\t * @param email the email\n\t *\n\t * @return the wrapper\n\t */\n\t@PostMapping(value = \"/checkEmailActive/{email:.+}\")\n\t@ApiOperation(httpMethod = \"POST\", value = \"校验邮箱\")\n\tpublic Wrapper<Boolean> checkEmailActive(@PathVariable(\"email\") String email) {\n\t\tUacUser uacUser = new UacUser();\n\t\tuacUser.setStatus(UacUserStatusEnum.ENABLE.getKey());\n\t\tuacUser.setEmail(email);\n\t\tint count = uacUserService.selectCount(uacUser);\n\t\treturn WrapMapper.ok(count > 0);\n\t}\n\n\t/**\n\t * 校验数据.\n\t *\n\t * @param checkValidDto the check valid dto\n\t *\n\t * @return the wrapper\n\t */\n\t@PostMapping(value = \"/checkValid\")\n\t@ApiOperation(httpMethod = \"POST\", value = \"校验数据\")\n\tpublic Wrapper checkValid(@RequestBody CheckValidDto checkValidDto) {\n\t\tString type = checkValidDto.getType();\n\t\tString validValue = checkValidDto.getValidValue();\n\n\t\tPreconditions.checkArgument(StringUtils.isNotEmpty(validValue), \"参数错误\");\n\t\tString message = null;\n\t\tboolean result = false;\n\t\t//开始校验\n\t\tif (UacApiConstant.Valid.LOGIN_NAME.equals(type)) {\n\t\t\tresult = uacUserService.checkLoginName(validValue);\n\t\t\tif (!result) {\n\t\t\t\tmessage = \"用户名已存在\";\n\t\t\t}\n\t\t}\n\t\tif (UacApiConstant.Valid.EMAIL.equals(type)) {\n\t\t\tresult = uacUserService.checkEmail(validValue);\n\t\t\tif (!result) {\n\t\t\t\tmessage = \"邮箱已存在\";\n\t\t\t}\n\t\t}\n\n\t\tif (UacApiConstant.Valid.MOBILE_NO.equals(type)) {\n\t\t\tresult = uacUserService.checkMobileNo(validValue);\n\t\t\tif (!result) {\n\t\t\t\tmessage = \"手机号码已存在\";\n\t\t\t}\n\t\t}\n\n\t\treturn WrapMapper.wrap(Wrapper.SUCCESS_CODE, message, result);\n\t}\n\n\n\t/**\n\t * 重置密码-邮箱-提交.\n\t *\n\t * @param email the email\n\t *\n\t * @return the wrapper\n\t */\n\t@PostMapping(value = \"/submitResetPwdEmail\")\n\t@ApiOperation(httpMethod = \"POST\", value = \"重置密码-邮箱-提交\")\n\tpublic Wrapper<String> submitResetPwdEmail(@RequestParam(\"email\") String email) {\n\t\tlogger.info(\"重置密码-邮箱-提交, email={}\", email);\n\t\temailService.submitResetPwdEmail(email);\n\t\treturn WrapMapper.ok();\n\t}\n\n\n\t/**\n\t * 重置密码-手机-提交.\n\t *\n\t * @param mobile   the mobile\n\t * @param response the response\n\t *\n\t * @return the wrapper\n\t */\n\t@PostMapping(value = \"/submitResetPwdPhone\")\n\t@ApiOperation(httpMethod = \"POST\", value = \"重置密码-手机-提交\")\n\tpublic Wrapper<String> submitResetPwdPhone(@RequestParam(\"mobile\") String mobile, HttpServletResponse response) {\n\t\tlogger.info(\"重置密码-手机-提交, mobile={}\", mobile);\n\t\tString token = smsService.submitResetPwdPhone(mobile, response);\n\t\treturn WrapMapper.ok(token);\n\t}\n\n\t/**\n\t * 重置密码-最终提交.\n\t *\n\t * @param resetLoginPwdDto the reset login pwd dto\n\t *\n\t * @return the wrapper\n\t */\n\t@PostMapping(value = \"/resetLoginPwd\")\n\t@ApiOperation(httpMethod = \"POST\", value = \"重置密码-最终提交\")\n\tpublic Wrapper<Boolean> checkResetSmsCode(ResetLoginPwdDto resetLoginPwdDto) {\n\t\tuacUserService.resetLoginPwd(resetLoginPwdDto);\n\t\treturn WrapMapper.ok();\n\t}\n\n\t/**\n\t * 注册用户.\n\t *\n\t * @param user the user\n\t *\n\t * @return the wrapper\n\t */\n\t@PostMapping(value = \"/register\")\n\t@ApiOperation(httpMethod = \"POST\", value = \"注册用户\")\n\tpublic Wrapper registerUser(UserRegisterDto user) {\n\t\tuacUserService.register(user);\n\t\treturn WrapMapper.ok();\n\t}\n\n\t/**\n\t * 激活用户.\n\t *\n\t * @param activeUserToken the active user token\n\t *\n\t * @return the wrapper\n\t */\n\t@GetMapping(value = \"/activeUser/{activeUserToken}\")\n\t@ApiOperation(httpMethod = \"POST\", value = \"激活用户\")\n\tpublic Wrapper activeUser(@PathVariable String activeUserToken) {\n\t\tuacUserService.activeUser(activeUserToken);\n\t\treturn WrapMapper.ok(\"激活成功\");\n\t}\n\n\t/**\n\t * 查询日志.\n\t *\n\t * @param operationLogDto the operation log dto\n\t *\n\t * @return the integer\n\t */\n\t@PostMapping(value = \"/saveLog\")\n\t@ApiOperation(httpMethod = \"POST\", value = \"查询日志\")\n\tpublic Integer saveLog(@RequestBody OperationLogDto operationLogDto) {\n\t\tlogger.info(\"saveLog - 保存操作日志. operationLogDto={}\", operationLogDto);\n\t\treturn uacLogService.saveOperationLog(operationLogDto);\n\t}\n\n\t@PostMapping(value = \"/callback/qq\")\n\tpublic void callbackQQ(HttpServletRequest request) {\n\t\tlogger.info(\"callback - callback qq. request={}\", request);\n\t}\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/web/admin/UacActionCommonController.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：UacActionCommonController.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.web.admin;\n\n\nimport com.paascloud.provider.model.domain.UacAction;\nimport com.paascloud.provider.model.dto.action.UacActionCheckCodeDto;\nimport com.paascloud.provider.model.dto.action.UacActionCheckUrlDto;\nimport com.paascloud.provider.service.UacActionService;\nimport com.paascloud.core.support.BaseController;\nimport com.paascloud.wrapper.WrapMapper;\nimport com.paascloud.wrapper.Wrapper;\nimport io.swagger.annotations.Api;\nimport io.swagger.annotations.ApiOperation;\nimport io.swagger.annotations.ApiParam;\nimport org.springframework.http.MediaType;\nimport org.springframework.web.bind.annotation.PostMapping;\nimport org.springframework.web.bind.annotation.RequestBody;\nimport org.springframework.web.bind.annotation.RequestMapping;\nimport org.springframework.web.bind.annotation.RestController;\nimport tk.mybatis.mapper.entity.Example;\n\nimport javax.annotation.Resource;\n\n/**\n * The class Uac action common controller.\n *\n * @author paascloud.net@gmail.com\n */\n@RestController\n@RequestMapping(value = \"/action\", produces = MediaType.APPLICATION_JSON_UTF8_VALUE)\n@Api(value = \"Web - UacActionCommonController\", produces = MediaType.APPLICATION_JSON_UTF8_VALUE)\npublic class UacActionCommonController extends BaseController {\n\n\n\t@Resource\n\tprivate UacActionService uacActionService;\n\n\t/**\n\t * 检测权限编码是否已存在\n\t *\n\t * @param uacActionCheckCodeDto the uac action check code dto\n\t *\n\t * @return the wrapper\n\t */\n\t@PostMapping(value = \"/checkActionCode\")\n\t@ApiOperation(httpMethod = \"POST\", value = \"检测权限编码是否已存在\")\n\tpublic Wrapper<Boolean> checkActionCode(@ApiParam(name = \"uacActionCheckCodeDto\", value = \"id与url\") @RequestBody UacActionCheckCodeDto uacActionCheckCodeDto) {\n\t\tlogger.info(\"校验权限编码唯一性 uacActionCheckCodeDto={}\", uacActionCheckCodeDto);\n\n\t\tLong id = uacActionCheckCodeDto.getActionId();\n\t\tString actionCode = uacActionCheckCodeDto.getActionCode();\n\n\t\tExample example = new Example(UacAction.class);\n\t\tExample.Criteria criteria = example.createCriteria();\n\n\t\tif (id != null) {\n\t\t\tcriteria.andNotEqualTo(\"id\", id);\n\t\t}\n\t\tcriteria.andEqualTo(\"actionCode\", actionCode);\n\n\t\tint result = uacActionService.selectCountByExample(example);\n\t\treturn WrapMapper.ok(result < 1);\n\t}\n\n\t/**\n\t * 检测权限URL唯一性\n\t *\n\t * @param uacActionCheckUrlDto the uac action check url dto\n\t *\n\t * @return the wrapper\n\t */\n\t@PostMapping(value = \"/checkUrl\")\n\t@ApiOperation(httpMethod = \"POST\", value = \"检测权限URL唯一性\")\n\tpublic Wrapper<Boolean> checkActionUrl(@ApiParam(name = \"uacActionCheckUrlDto\", value = \"id与url\") @RequestBody UacActionCheckUrlDto uacActionCheckUrlDto) {\n\t\tlogger.info(\"检测权限URL唯一性 uacActionCheckUrlDto={}\", uacActionCheckUrlDto);\n\n\t\tLong id = uacActionCheckUrlDto.getActionId();\n\t\tString url = uacActionCheckUrlDto.getUrl();\n\n\t\tExample example = new Example(UacAction.class);\n\t\tExample.Criteria criteria = example.createCriteria();\n\n\t\tif (id != null) {\n\t\t\tcriteria.andNotEqualTo(\"id\", id);\n\t\t}\n\t\tcriteria.andEqualTo(\"url\", url);\n\n\t\tint result = uacActionService.selectCountByExample(example);\n\t\treturn WrapMapper.ok(result < 1);\n\t}\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/web/admin/UacActionMainController.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：UacActionMainController.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.web.admin;\n\nimport com.github.pagehelper.PageInfo;\nimport com.google.common.base.Preconditions;\nimport com.paascloud.base.dto.LoginAuthDto;\nimport com.paascloud.core.annotation.LogAnnotation;\nimport com.paascloud.core.annotation.ValidateAnnotation;\nimport com.paascloud.core.support.BaseController;\nimport com.paascloud.core.utils.RequestUtil;\nimport com.paascloud.provider.model.domain.UacAction;\nimport com.paascloud.provider.model.dto.action.ActionMainQueryDto;\nimport com.paascloud.provider.model.dto.base.ModifyStatusDto;\nimport com.paascloud.provider.service.UacActionService;\nimport com.paascloud.wrapper.WrapMapper;\nimport com.paascloud.wrapper.Wrapper;\nimport io.swagger.annotations.Api;\nimport io.swagger.annotations.ApiOperation;\nimport io.swagger.annotations.ApiParam;\nimport org.springframework.http.MediaType;\nimport org.springframework.web.bind.annotation.*;\n\nimport javax.annotation.Resource;\nimport java.util.List;\n\n\n/**\n * The class Uac action main controller.\n *\n * @author paascloud.net @gmail.com\n */\n@RestController\n@RequestMapping(value = \"/action\", produces = MediaType.APPLICATION_JSON_UTF8_VALUE)\n@Api(value = \"Web - UacActionMainController\", produces = MediaType.APPLICATION_JSON_UTF8_VALUE)\npublic class UacActionMainController extends BaseController {\n\n\t@Resource\n\tprivate UacActionService uacActionService;\n\n\t/**\n\t * 分页查询角色信息.\n\t *\n\t * @param action the action\n\t *\n\t * @return the wrapper\n\t */\n\t@PostMapping(value = \"/queryListWithPage\")\n\t@ApiOperation(httpMethod = \"POST\", value = \"查询角色列表\")\n\tpublic Wrapper queryUacActionListWithPage(@ApiParam(name = \"action\", value = \"角色信息\") @RequestBody ActionMainQueryDto action) {\n\n\t\tlogger.info(\"查询角色列表actionQuery={}\", action);\n\t\tPageInfo pageInfo = uacActionService.queryActionListWithPage(action);\n\t\treturn WrapMapper.ok(pageInfo);\n\t}\n\n\t/**\n\t * 删除角色信息.\n\t *\n\t * @param id the id\n\t *\n\t * @return the wrapper\n\t */\n\t@PostMapping(value = \"/deleteActionById/{id}\")\n\t@ApiOperation(httpMethod = \"POST\", value = \"删除角色\")\n\t@LogAnnotation\n\tpublic Wrapper deleteUacActionById(@ApiParam(name = \"id\", value = \"角色id\") @PathVariable Long id) {\n\t\tint result = uacActionService.deleteActionById(id);\n\t\treturn super.handleResult(result);\n\t}\n\n\t/**\n\t * 批量删除角色.\n\t *\n\t * @param deleteIdList the delete id list\n\t *\n\t * @return the wrapper\n\t */\n\t@PostMapping(value = \"/batchDeleteByIdList\")\n\t@ApiOperation(httpMethod = \"POST\", value = \"批量删除角色\")\n\t@LogAnnotation\n\tpublic Wrapper batchDeleteByIdList(@ApiParam(name = \"deleteIdList\", value = \"角色Id\") @RequestBody List<Long> deleteIdList) {\n\t\tlogger.info(\"批量删除角色 idList={}\", deleteIdList);\n\t\tuacActionService.batchDeleteByIdList(deleteIdList);\n\t\treturn WrapMapper.ok();\n\t}\n\n\n\t/**\n\t * 保存权限信息.\n\t *\n\t * @param action the action\n\t *\n\t * @return the wrapper\n\t */\n\t@PostMapping(value = \"/save\")\n\t@ApiOperation(httpMethod = \"POST\", value = \"新增角色\")\n\t@ValidateAnnotation\n\t@LogAnnotation\n\tpublic Wrapper save(@ApiParam(name = \"action\", value = \"角色信息\") @RequestBody UacAction action) {\n\t\tLoginAuthDto loginAuthDto = RequestUtil.getLoginUser();\n\t\tuacActionService.saveAction(action, loginAuthDto);\n\t\treturn WrapMapper.ok();\n\t}\n\n\t/**\n\t * 根据权限Id修改角色状态.\n\t *\n\t * @param modifyStatusDto the modify status dto\n\t *\n\t * @return the wrapper\n\t */\n\t@PostMapping(value = \"/modifyStatus\")\n\t@ApiOperation(httpMethod = \"POST\", value = \"根据权限Id修改角色状态\")\n\t@LogAnnotation\n\tpublic Wrapper modifyActionStatus(@ApiParam(name = \"modifyActionStatus\", value = \"修改权限状态\") @RequestBody ModifyStatusDto modifyStatusDto) {\n\t\tlogger.info(\"根据角色Id修改权限状态 modifyStatusDto={}\", modifyStatusDto);\n\t\tLong actionId = modifyStatusDto.getId();\n\t\tPreconditions.checkArgument(actionId != null, \"权限ID不能为空\");\n\n\t\tUacAction uacRole = new UacAction();\n\t\tuacRole.setId(actionId);\n\t\tuacRole.setStatus(modifyStatusDto.getStatus());\n\t\tuacRole.setUpdateInfo(getLoginAuthDto());\n\n\t\tint result = uacActionService.update(uacRole);\n\t\treturn super.handleResult(result);\n\t}\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/web/admin/UacGrantAuth4RoleController.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：UacGrantAuth4RoleController.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.web.admin;\n\nimport com.paascloud.core.annotation.LogAnnotation;\nimport com.paascloud.core.support.BaseController;\nimport com.paascloud.provider.model.dto.role.RoleBindActionDto;\nimport com.paascloud.provider.model.dto.role.RoleBindMenuDto;\nimport com.paascloud.provider.service.UacRoleService;\nimport com.paascloud.wrapper.WrapMapper;\nimport com.paascloud.wrapper.Wrapper;\nimport io.swagger.annotations.Api;\nimport io.swagger.annotations.ApiOperation;\nimport io.swagger.annotations.ApiParam;\nimport org.springframework.http.MediaType;\nimport org.springframework.web.bind.annotation.PostMapping;\nimport org.springframework.web.bind.annotation.RequestBody;\nimport org.springframework.web.bind.annotation.RequestMapping;\nimport org.springframework.web.bind.annotation.RestController;\n\nimport javax.annotation.Resource;\n\n\n/**\n * 角色授权.\n *\n * @author paascloud.net @gmail.com\n */\n@RestController\n@RequestMapping(value = \"/role\", produces = MediaType.APPLICATION_JSON_UTF8_VALUE)\n@Api(value = \"Web - UacGrantAuth4RoleController\", produces = MediaType.APPLICATION_JSON_UTF8_VALUE)\npublic class UacGrantAuth4RoleController extends BaseController {\n\n\t@Resource\n\tprivate UacRoleService uacRoleService;\n\n\t/**\n\t * 角色分配权限.\n\t *\n\t * @param roleBindActionDto the role bind action dto\n\t *\n\t * @return the wrapper\n\t */\n\t@PostMapping(value = \"/bindAction\")\n\t@ApiOperation(httpMethod = \"POST\", value = \"角色分配权限\")\n\t@LogAnnotation\n\tpublic Wrapper bindAction(@ApiParam(name = \"bindAuth\", value = \"权限信息\") @RequestBody RoleBindActionDto roleBindActionDto) {\n\t\tlogger.info(\"角色分配权限. roleBindActionDto= {}\", roleBindActionDto);\n\t\tuacRoleService.bindAction(roleBindActionDto);\n\t\treturn WrapMapper.ok();\n\t}\n\n\t/**\n\t * 角色分配权限.\n\t *\n\t * @param roleBindMenuDto the role bind menu dto\n\t *\n\t * @return the wrapper\n\t */\n\t@PostMapping(value = \"/bindMenu\")\n\t@ApiOperation(httpMethod = \"POST\", value = \"角色分配权限\")\n\t@LogAnnotation\n\tpublic Wrapper bindMenu(@ApiParam(name = \"bindAuth\", value = \"权限信息\") @RequestBody RoleBindMenuDto roleBindMenuDto) {\n\t\tlogger.info(\"角色分配权限. roleBindMenuDto= {}\", roleBindMenuDto);\n\t\tuacRoleService.bindMenu(roleBindMenuDto);\n\t\treturn WrapMapper.ok();\n\t}\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/web/admin/UacGroupBindUserController.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：UacGroupBindUserController.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.web.admin;\n\n\nimport com.paascloud.base.dto.LoginAuthDto;\nimport com.paascloud.core.annotation.LogAnnotation;\nimport com.paascloud.core.support.BaseController;\nimport com.paascloud.provider.model.dto.group.GroupBindUserDto;\nimport com.paascloud.provider.model.dto.group.GroupBindUserReqDto;\nimport com.paascloud.provider.service.UacGroupService;\nimport com.paascloud.wrapper.WrapMapper;\nimport com.paascloud.wrapper.Wrapper;\nimport io.swagger.annotations.Api;\nimport io.swagger.annotations.ApiOperation;\nimport io.swagger.annotations.ApiParam;\nimport org.springframework.http.MediaType;\nimport org.springframework.web.bind.annotation.*;\n\nimport javax.annotation.Resource;\n\n/**\n * 组织绑定用户.\n *\n * @author paascloud.net @gmail.com\n */\n@RestController\n@RequestMapping(value = \"/group\", produces = MediaType.APPLICATION_JSON_UTF8_VALUE)\n@Api(value = \"Web - UacGroupBindUserController\", produces = MediaType.APPLICATION_JSON_UTF8_VALUE)\npublic class UacGroupBindUserController extends BaseController {\n\n\t@Resource\n\tprivate UacGroupService uacGroupService;\n\n\t/**\n\t * 组织绑定用户\n\t *\n\t * @param groupBindUserReqDto the group bind user req dto\n\t *\n\t * @return the wrapper\n\t */\n\t@PostMapping(value = \"/bindUser\")\n\t@LogAnnotation\n\t@ApiOperation(httpMethod = \"POST\", value = \"组织绑定用户\")\n\tpublic Wrapper bindUser4Role(@ApiParam(name = \"uacGroupBindUserReqDto\", value = \"组织绑定用户\") @RequestBody GroupBindUserReqDto groupBindUserReqDto) {\n\t\tlogger.info(\"组织绑定用户...  groupBindUserReqDto={}\", groupBindUserReqDto);\n\t\tLoginAuthDto loginAuthDto = super.getLoginAuthDto();\n\t\tuacGroupService.bindUacUser4Group(groupBindUserReqDto, loginAuthDto);\n\t\treturn WrapMapper.ok();\n\t}\n\n\t/**\n\t * 组织绑定用户页面数据\n\t *\n\t * @param groupId the group id\n\t *\n\t * @return the group bind user page info\n\t */\n\t@PostMapping(value = \"/getBindUser/{groupId}\")\n\t@ApiOperation(httpMethod = \"POST\", value = \"获取组织绑定用户页面数据\")\n\tpublic Wrapper<GroupBindUserDto> getGroupBindUserPageInfo(@ApiParam(name = \"groupId\", value = \"组织id\") @PathVariable Long groupId) {\n\t\tlogger.info(\"查询组织绑定用户页面数据 groupId={}\", groupId);\n\t\tLoginAuthDto loginAuthDto = super.getLoginAuthDto();\n\t\tLong currentUserId = loginAuthDto.getUserId();\n\t\tGroupBindUserDto bindUserDto = uacGroupService.getGroupBindUserDto(groupId, currentUserId);\n\t\treturn WrapMapper.ok(bindUserDto);\n\t}\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/web/admin/UacGroupCommonController.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：UacGroupCommonController.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.web.admin;\n\nimport com.paascloud.base.dto.LoginAuthDto;\nimport com.paascloud.core.support.BaseController;\nimport com.paascloud.provider.model.domain.UacGroup;\nimport com.paascloud.provider.model.dto.group.CheckGroupCodeDto;\nimport com.paascloud.provider.model.dto.group.CheckGroupNameDto;\nimport com.paascloud.provider.model.enums.UacGroupTypeEnum;\nimport com.paascloud.provider.model.vo.GroupZtreeVo;\nimport com.paascloud.provider.service.UacGroupService;\nimport com.paascloud.wrapper.WrapMapper;\nimport com.paascloud.wrapper.Wrapper;\nimport io.swagger.annotations.Api;\nimport io.swagger.annotations.ApiOperation;\nimport io.swagger.annotations.ApiParam;\nimport org.springframework.http.MediaType;\nimport org.springframework.web.bind.annotation.*;\nimport tk.mybatis.mapper.entity.Example;\n\nimport javax.annotation.Resource;\nimport java.util.List;\nimport java.util.Map;\n\n/**\n * 组织相关公用接口\n *\n * @author paascloud.net @gmail.com\n */\n@RestController\n@RequestMapping(value = \"/group\", produces = MediaType.APPLICATION_JSON_UTF8_VALUE)\n@Api(value = \"Web - UacGroupCommonController\", produces = MediaType.APPLICATION_JSON_UTF8_VALUE)\npublic class UacGroupCommonController extends BaseController {\n\n\t@Resource\n\tprivate UacGroupService uacGroupService;\n\n\t/**\n\t * 根据当前登录人查询组织列表\n\t *\n\t * @return the group tree by id\n\t */\n\t@PostMapping(value = \"/getGroupTree\")\n\t@ApiOperation(httpMethod = \"POST\", value = \"根据当前登录人查询组织列表\")\n\tpublic Wrapper<List<GroupZtreeVo>> getGroupTreeById() {\n\n\t\tlogger.info(\"根据当前登录人查询组织列表\");\n\t\tLoginAuthDto loginAuthDto = super.getLoginAuthDto();\n\t\tLong groupId = loginAuthDto.getGroupId();\n\t\tUacGroup uacGroup = uacGroupService.queryById(groupId);\n\t\tList<GroupZtreeVo> tree = uacGroupService.getGroupTree(uacGroup.getId());\n\t\treturn WrapMapper.wrap(Wrapper.SUCCESS_CODE, \"操作成功\", tree);\n\t}\n\n\t/**\n\t * 通过组织ID查询组织树\n\t *\n\t * @param groupId the group id\n\t *\n\t * @return the group tree by id\n\t */\n\t@PostMapping(value = \"/getGroupTree/{groupId}\")\n\t@ApiOperation(httpMethod = \"POST\", value = \"通过组织ID查询组织列表\")\n\tpublic Wrapper<List<GroupZtreeVo>> getGroupTreeById(@ApiParam(name = \"groupId\", value = \"通过组织ID查询组织列表\") @PathVariable Long groupId) {\n\n\t\tlogger.info(\"通过组织ID查询组织列表 groupId={}\", groupId);\n\n\t\tList<GroupZtreeVo> tree = uacGroupService.getGroupTree(groupId);\n\t\treturn WrapMapper.wrap(Wrapper.SUCCESS_CODE, \"操作成功\", tree);\n\t}\n\n\t/**\n\t * Check group name with edit wrapper.\n\t *\n\t * @param checkGroupNameDto the check group name dto\n\t *\n\t * @return the wrapper\n\t */\n\t@PostMapping(value = \"/checkGroupName\")\n\t@ApiOperation(httpMethod = \"POST\", value = \"编辑校验组织名唯一性\")\n\tpublic Wrapper<Boolean> checkGroupName(@ApiParam(name = \"checkGroupName\", value = \"组织名称\") @RequestBody CheckGroupNameDto checkGroupNameDto) {\n\t\tlogger.info(\"校验组织名称唯一性 checkGroupNameDto={}\", checkGroupNameDto);\n\n\t\tLong id = checkGroupNameDto.getGroupId();\n\t\tString groupName = checkGroupNameDto.getGroupName();\n\n\t\tExample example = new Example(UacGroup.class);\n\t\tExample.Criteria criteria = example.createCriteria();\n\n\t\tif (id != null) {\n\t\t\tcriteria.andNotEqualTo(\"id\", id);\n\t\t}\n\t\tcriteria.andEqualTo(\"groupName\", groupName);\n\n\t\tint result = uacGroupService.selectCountByExample(example);\n\t\treturn WrapMapper.ok(result < 1);\n\t}\n\n\t/**\n\t * 修改时验证组织编码\n\t *\n\t * @param checkGroupCodeDto the check group code dto\n\t *\n\t * @return the wrapper\n\t */\n\t@PostMapping(value = \"/checkGroupCode\")\n\t@ApiOperation(httpMethod = \"POST\", value = \"修改校验组织编码唯一性\")\n\tpublic Wrapper<Boolean> checkGroupCode(@ApiParam(name = \"checkGroupCode\", value = \"组织相关信息\") @RequestBody CheckGroupCodeDto checkGroupCodeDto) {\n\t\tlogger.info(\"校验组织编码唯一性 checkGroupCodeDto={}\", checkGroupCodeDto);\n\n\t\tLong id = checkGroupCodeDto.getGroupId();\n\t\tString groupCode = checkGroupCodeDto.getGroupCode();\n\n\t\tExample example = new Example(UacGroup.class);\n\t\tExample.Criteria criteria = example.createCriteria();\n\n\t\tif (id != null) {\n\t\t\tcriteria.andNotEqualTo(\"id\", id);\n\t\t}\n\t\tcriteria.andEqualTo(\"groupCode\", groupCode);\n\n\t\tint result = uacGroupService.selectCountByExample(example);\n\t\treturn WrapMapper.ok(result < 1);\n\t}\n\n\t/**\n\t * 查询组织类型\n\t *\n\t * @return the wrapper\n\t */\n\t@PostMapping(value = \"queryGroupType\")\n\t@ApiOperation(httpMethod = \"POST\", value = \"查询组织类型\")\n\tpublic Wrapper<List<Map<String, String>>> queryGroupType() {\n\t\tList<Map<String, String>> groupTypeList = UacGroupTypeEnum.getMap2List();\n\t\treturn WrapMapper.wrap(Wrapper.SUCCESS_CODE, Wrapper.SUCCESS_MESSAGE, groupTypeList);\n\t}\n\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/web/admin/UacGroupMainController.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：UacGroupMainController.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.web.admin;\n\n\nimport com.paascloud.base.dto.LoginAuthDto;\nimport com.paascloud.core.annotation.LogAnnotation;\nimport com.paascloud.provider.model.domain.UacGroup;\nimport com.paascloud.provider.model.dto.user.IdStatusDto;\nimport com.paascloud.provider.model.vo.MenuVo;\nimport com.paascloud.provider.service.UacGroupService;\nimport com.paascloud.core.support.BaseController;\nimport com.paascloud.wrapper.WrapMapper;\nimport com.paascloud.wrapper.Wrapper;\nimport io.swagger.annotations.Api;\nimport io.swagger.annotations.ApiOperation;\nimport io.swagger.annotations.ApiParam;\nimport org.springframework.http.MediaType;\nimport org.springframework.web.bind.annotation.*;\n\nimport javax.annotation.Resource;\nimport java.util.List;\n\n/**\n * 组织管理主页面\n *\n * @author paascloud.net @gmail.com\n */\n@RestController\n@RequestMapping(value = \"/group\", produces = MediaType.APPLICATION_JSON_UTF8_VALUE)\n@Api(value = \"Web - UacGroupMainController\", produces = MediaType.APPLICATION_JSON_UTF8_VALUE)\npublic class UacGroupMainController extends BaseController {\n\n\t@Resource\n\tprivate UacGroupService uacGroupService;\n\n\t/**\n\t * 根据id删除组织\n\t *\n\t * @param id the id\n\t *\n\t * @return the wrapper\n\t */\n\t@PostMapping(value = \"/deleteById/{id}\")\n\t@LogAnnotation\n\t@ApiOperation(httpMethod = \"POST\", value = \"根据id删除组织\")\n\tpublic Wrapper deleteGroupById(@ApiParam(name = \"id\", value = \"组织id\") @PathVariable Long id) {\n\t\tlogger.info(\" 根据id删除组织 id={}\", id);\n\t\tint result = uacGroupService.deleteUacGroupById(id);\n\t\tif (result < 1) {\n\t\t\treturn WrapMapper.wrap(Wrapper.ERROR_CODE, \"操作失败\");\n\t\t} else {\n\t\t\treturn WrapMapper.wrap(Wrapper.SUCCESS_CODE, \"操作成功\");\n\t\t}\n\t}\n\n\t/**\n\t * 根据id修改组织状态\n\t *\n\t * @param idStatusDto the id status dto\n\t *\n\t * @return the wrapper\n\t */\n\t@PostMapping(value = \"/modifyStatus\")\n\t@LogAnnotation\n\t@ApiOperation(httpMethod = \"POST\", value = \"根据id修改组织状态\")\n\tpublic Wrapper modifyGroupStatus(@ApiParam(name = \"modifyGroupStatus\", value = \"修改状态\") @RequestBody IdStatusDto idStatusDto) {\n\t\tlogger.info(\"根据id修改组织状态 idStatusDto={}\", idStatusDto);\n\t\tUacGroup uacGroup = new UacGroup();\n\t\tuacGroup.setId(idStatusDto.getId());\n\t\tLoginAuthDto loginAuthDto = super.getLoginAuthDto();\n\t\tInteger status = idStatusDto.getStatus();\n\t\tuacGroup.setStatus(status);\n\t\tint result = uacGroupService.updateUacGroupStatusById(idStatusDto, loginAuthDto);\n\t\tif (result < 1) {\n\t\t\treturn WrapMapper.wrap(Wrapper.ERROR_CODE, \"操作失败\");\n\t\t} else {\n\t\t\treturn WrapMapper.wrap(Wrapper.SUCCESS_CODE, \"操作成功\");\n\t\t}\n\t}\n\n\n\t/**\n\t * 获取主页面数据\n\t *\n\t * @return the wrapper\n\t */\n\t@PostMapping(value = \"/getTree\")\n\t@ApiOperation(httpMethod = \"POST\", value = \"获取菜单树\")\n\tpublic Wrapper<List<MenuVo>> getTree() {\n\t\tLong userId = super.getLoginAuthDto().getUserId();\n\t\tList<MenuVo> tree = uacGroupService.getGroupTreeListByUserId(userId);\n\t\treturn WrapMapper.ok(tree);\n\t}\n\n\t/**\n\t * 编辑组织\n\t *\n\t * @param group the group\n\t *\n\t * @return the wrapper\n\t */\n\t@PostMapping(value = \"/save\")\n\t@LogAnnotation\n\t@ApiOperation(httpMethod = \"POST\", value = \"修改组织信息\")\n\tpublic Wrapper editGroup(@ApiParam(name = \"group\", value = \"组织信息\") @RequestBody UacGroup group) {\n\t\tLoginAuthDto loginAuthDto = super.getLoginAuthDto();\n\t\tuacGroupService.saveUacGroup(group, loginAuthDto);\n\t\treturn WrapMapper.ok();\n\t}\n\n\n\t/**\n\t * 获取编辑页面数据\n\t *\n\t * @param id the id\n\t *\n\t * @return the edit group page info\n\t */\n\t@PostMapping(value = \"/queryById/{id}\")\n\t@ApiOperation(httpMethod = \"POST\", value = \"获取编辑页面数据\")\n\tpublic Wrapper<UacGroup> getEditGroupPageInfo(@ApiParam(name = \"id\", value = \"组织id\") @PathVariable Long id) {\n\t\tUacGroup uacGroup = uacGroupService.getById(id);\n\t\treturn WrapMapper.ok(uacGroup);\n\t}\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/web/admin/UacLogMainController.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：UacLogMainController.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.web.admin;\n\nimport com.github.pagehelper.PageInfo;\nimport com.paascloud.core.support.BaseController;\nimport com.paascloud.provider.model.dto.log.UacLogMainDto;\nimport com.paascloud.provider.service.UacLogService;\nimport com.paascloud.wrapper.WrapMapper;\nimport com.paascloud.wrapper.Wrapper;\nimport io.swagger.annotations.Api;\nimport io.swagger.annotations.ApiOperation;\nimport io.swagger.annotations.ApiParam;\nimport org.springframework.http.MediaType;\nimport org.springframework.web.bind.annotation.PostMapping;\nimport org.springframework.web.bind.annotation.RequestBody;\nimport org.springframework.web.bind.annotation.RequestMapping;\nimport org.springframework.web.bind.annotation.RestController;\n\nimport javax.annotation.Resource;\n\n/**\n * 日志管理.\n *\n * @author paascloud.net@gmail.com\n */\n@RestController\n@RequestMapping(value = \"/log\", produces = MediaType.APPLICATION_JSON_UTF8_VALUE)\n@Api(value = \"Web - UacLogMainController\", produces = MediaType.APPLICATION_JSON_UTF8_VALUE)\npublic class UacLogMainController extends BaseController {\n\t@Resource\n\tprivate UacLogService uacLogService;\n\n\t/**\n\t * 查询日志列表.\n\t *\n\t * @param uacLogQueryDtoPage the uac log query dto page\n\t *\n\t * @return the wrapper\n\t */\n\t@PostMapping(value = \"/queryListWithPage\")\n\t@ApiOperation(httpMethod = \"POST\", value = \"查询日志列表\")\n\tpublic Wrapper queryLogListWithPage(@ApiParam(name = \"uacLogQueryDtoPage\", value = \"日志查询条件\") @RequestBody UacLogMainDto uacLogQueryDtoPage) {\n\t\tlogger.info(\"查询日志处理列表 uacLogQueryDtoPage={}\", uacLogQueryDtoPage);\n\t\tPageInfo pageInfo = uacLogService.queryLogListWithPage(uacLogQueryDtoPage);\n\t\treturn WrapMapper.ok(pageInfo);\n\t}\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/web/admin/UacMenuCommonController.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：UacMenuCommonController.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.web.admin;\n\n\nimport com.paascloud.provider.model.domain.UacMenu;\nimport com.paascloud.provider.model.dto.menu.UacMenuCheckCodeDto;\nimport com.paascloud.provider.model.dto.menu.UacMenuCheckNameDto;\nimport com.paascloud.provider.model.dto.menu.UacMenuCheckUrlDto;\nimport com.paascloud.provider.service.UacMenuService;\nimport com.paascloud.core.support.BaseController;\nimport com.paascloud.wrapper.WrapMapper;\nimport com.paascloud.wrapper.Wrapper;\nimport io.swagger.annotations.Api;\nimport io.swagger.annotations.ApiOperation;\nimport io.swagger.annotations.ApiParam;\nimport org.springframework.http.MediaType;\nimport org.springframework.web.bind.annotation.PostMapping;\nimport org.springframework.web.bind.annotation.RequestBody;\nimport org.springframework.web.bind.annotation.RequestMapping;\nimport org.springframework.web.bind.annotation.RestController;\nimport tk.mybatis.mapper.entity.Example;\n\nimport javax.annotation.Resource;\n\n/**\n * 菜单.\n *\n * @author paascloud.net @gmail.com\n */\n@RestController\n@RequestMapping(value = \"/menu\", produces = MediaType.APPLICATION_JSON_UTF8_VALUE)\n@Api(value = \"Web - UacMenuCommonController\", produces = MediaType.APPLICATION_JSON_UTF8_VALUE)\npublic class UacMenuCommonController extends BaseController {\n\n\n\t@Resource\n\tprivate UacMenuService uacMenuService;\n\n\t/**\n\t * 检测菜单编码是否已存在\n\t *\n\t * @param uacMenuCheckCodeDto the uac menu check code dto\n\t *\n\t * @return the wrapper\n\t */\n\t@PostMapping(value = \"/checkMenuCode\")\n\t@ApiOperation(httpMethod = \"POST\", value = \"检测菜单编码是否已存在\")\n\tpublic Wrapper<Boolean> checkUacMenuActionCode(@ApiParam(name = \"uacMenuCheckCodeDto\", value = \"id与url\") @RequestBody UacMenuCheckCodeDto uacMenuCheckCodeDto) {\n\t\tlogger.info(\"校验菜单编码唯一性 uacMenuCheckCodeDto={}\", uacMenuCheckCodeDto);\n\n\t\tLong id = uacMenuCheckCodeDto.getMenuId();\n\t\tString menuCode = uacMenuCheckCodeDto.getMenuCode();\n\n\t\tExample example = new Example(UacMenu.class);\n\t\tExample.Criteria criteria = example.createCriteria();\n\n\t\tif (id != null) {\n\t\t\tcriteria.andNotEqualTo(\"id\", id);\n\t\t}\n\t\tcriteria.andEqualTo(\"menuCode\", menuCode);\n\n\t\tint result = uacMenuService.selectCountByExample(example);\n\t\treturn WrapMapper.ok(result < 1);\n\t}\n\n\t/**\n\t * 检测菜单名称唯一性\n\t *\n\t * @param uacMenuCheckNameDto the uac menu check name dto\n\t *\n\t * @return the wrapper\n\t */\n\t@PostMapping(value = \"/checkMenuName\")\n\t@ApiOperation(httpMethod = \"POST\", value = \"检测菜单名称唯一性\")\n\tpublic Wrapper<Boolean> checkUacMenuName(@ApiParam(name = \"uacMenuCheckNameDto\", value = \"id与name\") @RequestBody UacMenuCheckNameDto uacMenuCheckNameDto) {\n\t\tlogger.info(\"校验菜单名称唯一性 uacMenuCheckNameDto={}\", uacMenuCheckNameDto);\n\t\tLong id = uacMenuCheckNameDto.getMenuId();\n\t\tLong pid = uacMenuCheckNameDto.getPid();\n\t\tString menuName = uacMenuCheckNameDto.getMenuName();\n\n\t\tExample example = new Example(UacMenu.class);\n\t\tExample.Criteria criteria = example.createCriteria();\n\n\t\tif (id != null) {\n\t\t\tcriteria.andNotEqualTo(\"id\", id);\n\t\t}\n\t\tcriteria.andEqualTo(\"menuName\", menuName);\n\t\tcriteria.andEqualTo(\"pid\", pid);\n\n\t\tint result = uacMenuService.selectCountByExample(example);\n\t\treturn WrapMapper.ok(result < 1);\n\t}\n\n\n\t/**\n\t * 检测菜单URL唯一性\n\t *\n\t * @param uacMenuCheckUrlDto the uac menu check url dto\n\t *\n\t * @return the wrapper\n\t */\n\t@PostMapping(value = \"/checkMenuUrl\")\n\t@ApiOperation(httpMethod = \"POST\", value = \"检测菜单URL唯一性\")\n\tpublic Wrapper<Boolean> checkUacMenuUrl(@ApiParam(name = \"uacMenuCheckUrlDto\", value = \"id与url\") @RequestBody UacMenuCheckUrlDto uacMenuCheckUrlDto) {\n\t\tlogger.info(\"检测菜单URL唯一性 uacMenuCheckUrlDto={}\", uacMenuCheckUrlDto);\n\n\t\tLong id = uacMenuCheckUrlDto.getMenuId();\n\t\tString url = uacMenuCheckUrlDto.getUrl();\n\n\t\tExample example = new Example(UacMenu.class);\n\t\tExample.Criteria criteria = example.createCriteria();\n\n\t\tif (id != null) {\n\t\t\tcriteria.andNotEqualTo(\"id\", id);\n\t\t}\n\t\tcriteria.andEqualTo(\"url\", url);\n\n\t\tint result = uacMenuService.selectCountByExample(example);\n\t\treturn WrapMapper.ok(result < 1);\n\t}\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/web/admin/UacMenuMainController.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：UacMenuMainController.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.web.admin;\n\nimport com.google.common.base.Preconditions;\nimport com.paascloud.base.dto.LoginAuthDto;\nimport com.paascloud.core.annotation.LogAnnotation;\nimport com.paascloud.core.support.BaseController;\nimport com.paascloud.provider.model.domain.UacMenu;\nimport com.paascloud.provider.model.dto.menu.UacEditMenuDto;\nimport com.paascloud.provider.model.dto.menu.UacMenuStatusDto;\nimport com.paascloud.provider.model.vo.MenuVo;\nimport com.paascloud.provider.model.vo.ViewMenuVo;\nimport com.paascloud.provider.service.UacMenuService;\nimport com.paascloud.wrapper.WrapMapper;\nimport com.paascloud.wrapper.Wrapper;\nimport io.swagger.annotations.Api;\nimport io.swagger.annotations.ApiOperation;\nimport io.swagger.annotations.ApiParam;\nimport org.springframework.beans.BeanUtils;\nimport org.springframework.http.MediaType;\nimport org.springframework.web.bind.annotation.*;\n\nimport javax.annotation.Resource;\nimport java.util.List;\n\n/**\n * 菜单主页面.\n *\n * @author paascloud.net @gmail.com\n */\n@RestController\n@RequestMapping(value = \"/menu\", produces = MediaType.APPLICATION_JSON_UTF8_VALUE)\n@Api(value = \"Web - UacMenuMainController\", produces = MediaType.APPLICATION_JSON_UTF8_VALUE)\npublic class UacMenuMainController extends BaseController {\n\n\t@Resource\n\tprivate UacMenuService uacMenuService;\n\n\t/**\n\t * 获取菜单列表数据\n\t *\n\t * @return the wrapper\n\t */\n\t@PostMapping(value = \"/getTree\")\n\t@ApiOperation(httpMethod = \"POST\", value = \"获取菜单树\")\n\tpublic Wrapper<List<MenuVo>> queryMenuTreeList() {\n\t\tList<MenuVo> menuVoList = uacMenuService.getMenuVoList(getLoginAuthDto().getUserId(), null);\n\t\treturn WrapMapper.ok(menuVoList);\n\t}\n\n\t/**\n\t * 编辑菜单.\n\t *\n\t * @param id the id\n\t *\n\t * @return the wrapper\n\t */\n\t@PostMapping(value = \"/queryById/{id}\")\n\t@ApiOperation(httpMethod = \"POST\", value = \"编辑菜单\")\n\tpublic Wrapper<ViewMenuVo> queryMenuVoById(@ApiParam(name = \"id\", value = \"菜单id\") @PathVariable Long id) {\n\t\tViewMenuVo menuVo = uacMenuService.getViewVoById(id);\n\t\treturn WrapMapper.ok(menuVo);\n\t}\n\n\n\t/**\n\t * 根据id修改菜单的禁用状态\n\t *\n\t * @param uacMenuStatusDto the uac menu status dto\n\t *\n\t * @return the wrapper\n\t */\n\t@PostMapping(value = \"/modifyStatus\")\n\t@ApiOperation(httpMethod = \"POST\", value = \"修改菜单状态\")\n\t@LogAnnotation\n\tpublic Wrapper updateUacMenuStatusById(@ApiParam(name = \"uacMenuStatusDto\", value = \"修改菜单状态Dto\") @RequestBody UacMenuStatusDto uacMenuStatusDto) {\n\t\tlogger.info(\"根据id修改菜单的禁用状态 uacMenuStatusDto={}\", uacMenuStatusDto);\n\t\tLoginAuthDto loginAuthDto = getLoginAuthDto();\n\t\tuacMenuService.updateUacMenuStatusById(uacMenuStatusDto, loginAuthDto);\n\t\treturn WrapMapper.ok();\n\t}\n\n\t/**\n\t * 新增菜单.\n\t *\n\t * @param uacMenuAddDto the uac menu add dto\n\t *\n\t * @return the wrapper\n\t */\n\t@PostMapping(value = \"/save\")\n\t@ApiOperation(httpMethod = \"POST\", value = \"新增菜单\")\n\t@LogAnnotation\n\tpublic Wrapper saveMenu(@ApiParam(name = \"saveMenu\", value = \"保存菜单\") @RequestBody UacEditMenuDto uacMenuAddDto) {\n\t\tUacMenu uacMenu = new UacMenu();\n\t\tLoginAuthDto loginAuthDto = getLoginAuthDto();\n\t\tBeanUtils.copyProperties(uacMenuAddDto, uacMenu);\n\t\tuacMenuService.saveUacMenu(uacMenu, loginAuthDto);\n\t\treturn WrapMapper.ok();\n\t}\n\n\t/**\n\t * 根据id删除菜单\n\t *\n\t * @param id the id\n\t *\n\t * @return the wrapper\n\t */\n\t@PostMapping(value = \"/deleteById/{id}\")\n\t@ApiOperation(httpMethod = \"POST\", value = \"删除菜单\")\n\t@LogAnnotation\n\tpublic Wrapper<Integer> deleteUacMenuById(@ApiParam(name = \"id\", value = \"菜单id\") @PathVariable Long id) {\n\t\tlogger.info(\" 根据id删除菜单 id={}\", id);\n\t\tLoginAuthDto loginAuthDto = getLoginAuthDto();\n\n\t\tPreconditions.checkArgument(id != null, \"菜单ID不能为空\");\n\n\t\t// 判断此菜单是否有子节点\n\t\tboolean hasChild = uacMenuService.checkMenuHasChildMenu(id);\n\t\tif (hasChild) {\n\t\t\treturn WrapMapper.wrap(Wrapper.ERROR_CODE, \"此菜单含有子菜单, 请先删除子菜单\");\n\t\t}\n\n\t\tint result = uacMenuService.deleteUacMenuById(id, loginAuthDto);\n\t\treturn super.handleResult(result);\n\t}\n}"
  },
  {
    "path": "paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/web/admin/UacRoleBindUserController.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：UacRoleBindUserController.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.web.admin;\n\nimport com.paascloud.base.dto.LoginAuthDto;\nimport com.paascloud.core.annotation.LogAnnotation;\nimport com.paascloud.core.support.BaseController;\nimport com.paascloud.provider.model.dto.role.RoleBindUserDto;\nimport com.paascloud.provider.model.dto.role.RoleBindUserReqDto;\nimport com.paascloud.provider.service.UacRoleService;\nimport com.paascloud.wrapper.WrapMapper;\nimport com.paascloud.wrapper.Wrapper;\nimport io.swagger.annotations.Api;\nimport io.swagger.annotations.ApiOperation;\nimport io.swagger.annotations.ApiParam;\nimport org.springframework.http.MediaType;\nimport org.springframework.web.bind.annotation.*;\n\nimport javax.annotation.Resource;\n\n/**\n * 角色绑定用户.\n *\n * @author paascloud.net @gmail.com\n */\n@RestController\n@RequestMapping(value = \"/role\", produces = MediaType.APPLICATION_JSON_UTF8_VALUE)\n@Api(value = \"Web - UacRoleBindUserController\", produces = MediaType.APPLICATION_JSON_UTF8_VALUE)\npublic class UacRoleBindUserController extends BaseController {\n\n\t@Resource\n\tprivate UacRoleService uacRoleService;\n\n\t/**\n\t * 角色绑定用户.\n\t *\n\t * @param roleBindUserReqDto the role bind user req dto\n\t *\n\t * @return the wrapper\n\t */\n\t@LogAnnotation\n\t@PostMapping(value = \"/bindUser\")\n\t@ApiOperation(httpMethod = \"POST\", value = \"角色绑定用户\")\n\tpublic Wrapper bindUser(@ApiParam(name = \"uacRoleBindUserReqDto\", value = \"角色绑定用户\") @RequestBody RoleBindUserReqDto roleBindUserReqDto) {\n\t\tlogger.info(\"roleBindUser={}\", roleBindUserReqDto);\n\t\tLoginAuthDto loginAuthDto = getLoginAuthDto();\n\t\tuacRoleService.bindUser4Role(roleBindUserReqDto, loginAuthDto);\n\t\treturn WrapMapper.ok();\n\t}\n\n\t/**\n\t * 获取角色绑定用户页面数据.\n\t *\n\t * @param roleId the role id\n\t *\n\t * @return the wrapper\n\t */\n\t@PostMapping(value = \"/getBindUser/{roleId}\")\n\t@ApiOperation(httpMethod = \"POST\", value = \"获取角色绑定用户页面数据\")\n\tpublic Wrapper<RoleBindUserDto> getBindUser(@ApiParam(name = \"roleId\", value = \"角色id\") @PathVariable Long roleId) {\n\t\tlogger.info(\"获取角色绑定用户页面数据. roleId={}\", roleId);\n\t\tLoginAuthDto loginAuthDto = super.getLoginAuthDto();\n\t\tLong currentUserId = loginAuthDto.getUserId();\n\t\tRoleBindUserDto bindUserDto = uacRoleService.getRoleBindUserDto(roleId, currentUserId);\n\t\treturn WrapMapper.ok(bindUserDto);\n\t}\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/web/admin/UacRoleCommonController.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：UacRoleCommonController.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.web.admin;\n\nimport com.paascloud.core.support.BaseController;\nimport com.paascloud.provider.model.domain.UacRole;\nimport com.paascloud.provider.model.dto.role.CheckRoleCodeDto;\nimport com.paascloud.provider.model.vo.BindAuthVo;\nimport com.paascloud.provider.service.UacRoleService;\nimport com.paascloud.wrapper.WrapMapper;\nimport com.paascloud.wrapper.Wrapper;\nimport io.swagger.annotations.Api;\nimport io.swagger.annotations.ApiOperation;\nimport io.swagger.annotations.ApiParam;\nimport org.springframework.http.MediaType;\nimport org.springframework.web.bind.annotation.*;\nimport tk.mybatis.mapper.entity.Example;\n\nimport javax.annotation.Resource;\n\n/**\n * 角色管理-公共方法.\n *\n * @author paascloud.net @gmail.com\n */\n@RestController\n@RequestMapping(value = \"/role\", produces = MediaType.APPLICATION_JSON_UTF8_VALUE)\n@Api(value = \"Web - UacRoleCommonController\", produces = MediaType.APPLICATION_JSON_UTF8_VALUE)\npublic class UacRoleCommonController extends BaseController {\n\n\t@Resource\n\tprivate UacRoleService uacRoleService;\n\n\t/**\n\t * 查看角色信息.\n\t *\n\t * @param id the id\n\t *\n\t * @return the wrapper\n\t */\n\t@PostMapping(value = \"/queryRoleInfoById/{id}\")\n\t@ApiOperation(httpMethod = \"POST\", value = \"查看角色信息\")\n\tpublic Wrapper<UacRole> queryRoleInfo(@PathVariable Long id) {\n\t\tUacRole role = uacRoleService.selectByKey(id);\n\t\treturn WrapMapper.wrap(Wrapper.SUCCESS_CODE, Wrapper.SUCCESS_MESSAGE, role);\n\t}\n\n\t/**\n\t * 验证角色编码是否存在.\n\t *\n\t * @param checkRoleCodeDto the check role code dto\n\t *\n\t * @return the wrapper\n\t */\n\t@PostMapping(value = \"/checkRoleCode\")\n\t@ApiOperation(httpMethod = \"POST\", value = \"验证角色编码是否存在\")\n\tpublic Wrapper<Boolean> checkUacRoleCode(@ApiParam(name = \"roleCode\", value = \"角色编码\") @RequestBody CheckRoleCodeDto checkRoleCodeDto) {\n\n\t\tlogger.info(\"校验角色编码唯一性 checkRoleCodeDto={}\", checkRoleCodeDto);\n\n\t\tLong id = checkRoleCodeDto.getRoleId();\n\t\tString roleCode = checkRoleCodeDto.getRoleCode();\n\n\t\tExample example = new Example(UacRole.class);\n\t\tExample.Criteria criteria = example.createCriteria();\n\n\t\tif (id != null) {\n\t\t\tcriteria.andNotEqualTo(\"id\", id);\n\t\t}\n\t\tcriteria.andEqualTo(\"roleCode\", roleCode);\n\n\t\tint result = uacRoleService.selectCountByExample(example);\n\t\treturn WrapMapper.ok(result < 1);\n\t}\n\n\t/**\n\t * 获取权限树\n\t *\n\t * @param roleId the role id\n\t *\n\t * @return the auth tree by role id\n\t */\n\t@PostMapping(value = \"/getActionTreeByRoleId/{roleId}\")\n\t@ApiOperation(httpMethod = \"POST\", value = \"获取权限树\")\n\tpublic Wrapper<BindAuthVo> getActionTreeByRoleId(@ApiParam(name = \"roleId\", value = \"角色id\") @PathVariable Long roleId) {\n\t\tlogger.info(\"roleId={}\", roleId);\n\t\tBindAuthVo bindAuthVo = uacRoleService.getActionTreeByRoleId(roleId);\n\t\treturn WrapMapper.ok(bindAuthVo);\n\t}\n\n\t/**\n\t * 获取菜单树.\n\t *\n\t * @param roleId the role id\n\t *\n\t * @return the menu tree by role id\n\t */\n\t@PostMapping(value = \"/getMenuTreeByRoleId/{roleId}\")\n\t@ApiOperation(httpMethod = \"POST\", value = \"获取菜单树\")\n\tpublic Wrapper<BindAuthVo> getMenuTreeByRoleId(@ApiParam(name = \"roleId\", value = \"角色id\") @PathVariable Long roleId) {\n\t\tlogger.info(\"roleId={}\", roleId);\n\t\tBindAuthVo bindAuthVo = uacRoleService.getMenuTreeByRoleId(roleId);\n\t\treturn WrapMapper.ok(bindAuthVo);\n\t}\n\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/web/admin/UacRoleMainController.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：UacRoleMainController.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.web.admin;\n\nimport com.github.pagehelper.PageHelper;\nimport com.github.pagehelper.PageInfo;\nimport com.paascloud.base.dto.LoginAuthDto;\nimport com.paascloud.base.enums.ErrorCodeEnum;\nimport com.paascloud.core.annotation.LogAnnotation;\nimport com.paascloud.core.annotation.ValidateAnnotation;\nimport com.paascloud.core.support.BaseController;\nimport com.paascloud.core.utils.RequestUtil;\nimport com.paascloud.provider.model.domain.UacRole;\nimport com.paascloud.provider.model.domain.UacRoleUser;\nimport com.paascloud.provider.model.dto.base.ModifyStatusDto;\nimport com.paascloud.provider.model.enums.UacRoleStatusEnum;\nimport com.paascloud.provider.model.exceptions.UacBizException;\nimport com.paascloud.provider.model.vo.RoleVo;\nimport com.paascloud.provider.service.UacRoleService;\nimport com.paascloud.provider.service.UacRoleUserService;\nimport com.paascloud.wrapper.WrapMapper;\nimport com.paascloud.wrapper.Wrapper;\nimport io.swagger.annotations.Api;\nimport io.swagger.annotations.ApiOperation;\nimport io.swagger.annotations.ApiParam;\nimport org.springframework.http.MediaType;\nimport org.springframework.web.bind.annotation.*;\n\nimport javax.annotation.Resource;\nimport java.util.List;\n\n\n/**\n * 角色管理主页面.\n *\n * @author paascloud.net @gmail.com\n */\n@RestController\n@RequestMapping(value = \"/role\", produces = MediaType.APPLICATION_JSON_UTF8_VALUE)\n@Api(value = \"Web - UacRoleMainController\", produces = MediaType.APPLICATION_JSON_UTF8_VALUE)\npublic class UacRoleMainController extends BaseController {\n\n\t@Resource\n\tprivate UacRoleService uacRoleService;\n\t@Resource\n\tprivate UacRoleUserService uacRoleUserService;\n\n\t/**\n\t * 分页查询角色信息.\n\t *\n\t * @param role the role\n\t *\n\t * @return the wrapper\n\t */\n\t@PostMapping(value = \"/queryRoleListWithPage\")\n\t@ApiOperation(httpMethod = \"POST\", value = \"查询角色列表\")\n\tpublic Wrapper<PageInfo<RoleVo>> queryUacRoleListWithPage(@ApiParam(name = \"role\", value = \"角色信息\") @RequestBody UacRole role) {\n\n\t\tlogger.info(\"查询角色列表roleQuery={}\", role);\n\t\tPageHelper.startPage(role.getPageNum(), role.getPageSize());\n\t\trole.setOrderBy(\"update_time desc\");\n\t\tList<RoleVo> roleVoList = uacRoleService.queryRoleListWithPage(role);\n\t\treturn WrapMapper.ok(new PageInfo<>(roleVoList));\n\t}\n\n\t/**\n\t * 删除角色信息.\n\t *\n\t * @param id the id\n\t *\n\t * @return the wrapper\n\t */\n\t@LogAnnotation\n\t@PostMapping(value = \"/deleteRoleById/{id}\")\n\t@ApiOperation(httpMethod = \"POST\", value = \"删除角色\")\n\tpublic Wrapper deleteUacRoleById(@ApiParam(name = \"id\", value = \"角色id\") @PathVariable Long id) {\n\t\tint result = uacRoleService.deleteRoleById(id);\n\t\treturn super.handleResult(result);\n\t}\n\n\t/**\n\t * 批量删除角色.\n\t *\n\t * @param deleteIdList the delete id list\n\t *\n\t * @return the wrapper\n\t */\n\t@LogAnnotation\n\t@PostMapping(value = \"/batchDeleteByIdList\")\n\t@ApiOperation(httpMethod = \"POST\", value = \"批量删除角色\")\n\tpublic Wrapper batchDeleteByIdList(@ApiParam(name = \"deleteIdList\", value = \"角色Id\") @RequestBody List<Long> deleteIdList) {\n\t\tlogger.info(\"批量删除角色 idList={}\", deleteIdList);\n\t\tuacRoleService.batchDeleteByIdList(deleteIdList);\n\t\treturn WrapMapper.ok();\n\t}\n\n\t/**\n\t * 修改角色状态.\n\t *\n\t * @param modifyStatusDto the modify status dto\n\t *\n\t * @return the wrapper\n\t */\n\t@LogAnnotation\n\t@PostMapping(value = \"/modifyRoleStatusById\")\n\t@ApiOperation(httpMethod = \"POST\", value = \"根据角色Id修改角色状态\")\n\tpublic Wrapper modifyUacRoleStatusById(@ApiParam(name = \"modifyRoleStatusDto\", value = \"修改角色状态数据\") @RequestBody ModifyStatusDto modifyStatusDto) {\n\t\tlogger.info(\"根据角色Id修改角色状态 modifyStatusDto={}\", modifyStatusDto);\n\t\tLong roleId = modifyStatusDto.getId();\n\t\tif (roleId == null) {\n\t\t\tthrow new UacBizException(ErrorCodeEnum.UAC10012001);\n\t\t}\n\n\t\tLoginAuthDto loginAuthDto = getLoginAuthDto();\n\t\tLong userId = loginAuthDto.getUserId();\n\n\t\tUacRoleUser ru = uacRoleUserService.getByUserIdAndRoleId(userId, roleId);\n\n\t\tif (ru != null && UacRoleStatusEnum.DISABLE.getType().equals(modifyStatusDto.getStatus())) {\n\t\t\tthrow new UacBizException(ErrorCodeEnum.UAC10012002);\n\t\t}\n\n\t\tUacRole uacRole = new UacRole();\n\t\tuacRole.setId(roleId);\n\t\tuacRole.setStatus(modifyStatusDto.getStatus());\n\t\tuacRole.setUpdateInfo(loginAuthDto);\n\n\t\tint result = uacRoleService.update(uacRole);\n\t\treturn super.handleResult(result);\n\t}\n\n\n\t/**\n\t * 保存用户.\n\t *\n\t * @param role the role\n\t *\n\t * @return the wrapper\n\t */\n\t@PostMapping(value = \"/save\")\n\t@ApiOperation(httpMethod = \"POST\", value = \"新增角色\")\n\t@ValidateAnnotation\n\t@LogAnnotation\n\tpublic Wrapper save(@ApiParam(name = \"role\", value = \"角色信息\") @RequestBody UacRole role) {\n\t\tLoginAuthDto loginAuthDto = RequestUtil.getLoginUser();\n\t\tuacRoleService.saveRole(role, loginAuthDto);\n\t\treturn WrapMapper.ok();\n\t}\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/web/admin/UacTokenMainController.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：UacTokenMainController.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.web.admin;\n\nimport com.github.pagehelper.PageInfo;\nimport com.paascloud.core.support.BaseController;\nimport com.paascloud.provider.model.dto.token.TokenMainQueryDto;\nimport com.paascloud.provider.service.UacUserTokenService;\nimport com.paascloud.wrapper.WrapMapper;\nimport com.paascloud.wrapper.Wrapper;\nimport io.swagger.annotations.Api;\nimport io.swagger.annotations.ApiOperation;\nimport io.swagger.annotations.ApiParam;\nimport org.springframework.http.MediaType;\nimport org.springframework.web.bind.annotation.PostMapping;\nimport org.springframework.web.bind.annotation.RequestBody;\nimport org.springframework.web.bind.annotation.RequestMapping;\nimport org.springframework.web.bind.annotation.RestController;\n\nimport javax.annotation.Resource;\n\n\n/**\n * token主页面.\n *\n * @author paascloud.net @gmail.com\n */\n@RestController\n@RequestMapping(value = \"/token\", produces = MediaType.APPLICATION_JSON_UTF8_VALUE)\n@Api(value = \"Web - UacTokenMainController\", produces = MediaType.APPLICATION_JSON_UTF8_VALUE)\npublic class UacTokenMainController extends BaseController {\n\n\t@Resource\n\tprivate UacUserTokenService uacUserTokenService;\n\n\t/**\n\t * 分页查询角色信息.\n\t *\n\t * @param token the token\n\t *\n\t * @return the wrapper\n\t */\n\t@PostMapping(value = \"/queryListWithPage\")\n\t@ApiOperation(httpMethod = \"POST\", value = \"查询在线用户列表\")\n\tpublic Wrapper queryUacActionListWithPage(@ApiParam(name = \"token\") @RequestBody TokenMainQueryDto token) {\n\t\tlogger.info(\"查询在线用户列表. token={}\", token);\n\t\tPageInfo pageInfo = uacUserTokenService.listTokenWithPage(token);\n\t\treturn WrapMapper.ok(pageInfo);\n\t}\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/web/admin/UacUserCommonController.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：UacUserCommonController.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.web.admin;\n\nimport com.paascloud.PublicUtil;\nimport com.paascloud.base.dto.LoginAuthDto;\nimport com.paascloud.core.annotation.LogAnnotation;\nimport com.paascloud.core.support.BaseController;\nimport com.paascloud.provider.model.domain.UacRole;\nimport com.paascloud.provider.model.domain.UacUser;\nimport com.paascloud.provider.model.dto.user.*;\nimport com.paascloud.provider.model.vo.MenuVo;\nimport com.paascloud.provider.model.vo.UserVo;\nimport com.paascloud.provider.service.UacRoleService;\nimport com.paascloud.provider.service.UacUserService;\nimport com.paascloud.provider.utils.Md5Util;\nimport com.paascloud.wrapper.WrapMapper;\nimport com.paascloud.wrapper.Wrapper;\nimport io.swagger.annotations.Api;\nimport io.swagger.annotations.ApiOperation;\nimport io.swagger.annotations.ApiParam;\nimport org.springframework.beans.BeanUtils;\nimport org.springframework.http.MediaType;\nimport org.springframework.web.bind.annotation.*;\nimport tk.mybatis.mapper.entity.Example;\n\nimport javax.annotation.Resource;\nimport java.util.HashSet;\nimport java.util.List;\n\n/**\n * 用户管理-公共方法.\n *\n * @author paascloud.net@gmail.com\n */\n@RestController\n@RequestMapping(value = \"/user\", produces = MediaType.APPLICATION_JSON_UTF8_VALUE)\n@Api(value = \"Web - UacUserCommonController\", produces = MediaType.APPLICATION_JSON_UTF8_VALUE)\npublic class UacUserCommonController extends BaseController {\n\n\t@Resource\n\tprivate UacUserService uacUserService;\n\t@Resource\n\tprivate UacRoleService uacRoleService;\n\n\n\t/**\n\t * 根据userId查询用户详细信息（连表查询）.\n\t *\n\t * @return the wrapper\n\t */\n\t@PostMapping(value = \"/queryUserInfo/{loginName}\")\n\t@ApiOperation(httpMethod = \"POST\", value = \"根据userId查询用户详细信息\")\n\tpublic Wrapper<UserVo> queryUserInfo(@PathVariable String loginName) {\n\t\tlogger.info(\"根据userId查询用户详细信息\");\n\t\tUserVo userVo = new UserVo();\n\t\tUacUser uacUser = uacUserService.findByLoginName(loginName);\n\t\tuacUser = uacUserService.findUserInfoByUserId(uacUser.getId());\n\t\tList<UacRole> roleList = uacRoleService.findAllRoleInfoByUserId(uacUser.getId());\n\t\tList<MenuVo> authTree = uacRoleService.getOwnAuthTree(uacUser.getId());\n\t\tBeanUtils.copyProperties(uacUser, userVo);\n\t\tif (PublicUtil.isNotEmpty(roleList)) {\n\t\t\tuserVo.setRoles(new HashSet<>(roleList));\n\t\t}\n\t\tuserVo.setAuthTree(authTree);\n\t\treturn WrapMapper.ok(userVo);\n\t}\n\n\n\t/**\n\t * 校验登录名唯一性.\n\t *\n\t * @param checkLoginNameDto the check login name dto\n\t *\n\t * @return the wrapper\n\t */\n\t@PostMapping(value = \"/checkLoginName\")\n\t@ApiOperation(httpMethod = \"POST\", value = \"校验登录名唯一性\")\n\tpublic Wrapper<Boolean> checkLoginName(@ApiParam(name = \"loginName\", value = \"登录名\") @RequestBody CheckLoginNameDto checkLoginNameDto) {\n\t\tlogger.info(\"校验登录名唯一性 checkLoginNameDto={}\", checkLoginNameDto);\n\n\t\tLong id = checkLoginNameDto.getUserId();\n\t\tString loginName = checkLoginNameDto.getLoginName();\n\n\t\tExample example = new Example(UacUser.class);\n\t\tExample.Criteria criteria = example.createCriteria();\n\t\tcriteria.andEqualTo(\"loginName\", loginName);\n\t\tif (id != null) {\n\t\t\tcriteria.andNotEqualTo(\"id\", id);\n\t\t}\n\n\t\tint result = uacUserService.selectCountByExample(example);\n\t\treturn WrapMapper.ok(result < 1);\n\t}\n\n\t/**\n\t * 校验登录名唯一性.\n\t *\n\t * @param checkEmailDto the check email dto\n\t *\n\t * @return the wrapper\n\t */\n\t@PostMapping(value = \"/checkEmail\")\n\t@ApiOperation(httpMethod = \"POST\", value = \"校验登录名唯一性\")\n\tpublic Wrapper<Boolean> checkEmail(@RequestBody CheckEmailDto checkEmailDto) {\n\t\tlogger.info(\"校验邮箱唯一性 checkEmailDto={}\", checkEmailDto);\n\n\t\tLong id = checkEmailDto.getUserId();\n\t\tString email = checkEmailDto.getEmail();\n\n\t\tExample example = new Example(UacUser.class);\n\t\tExample.Criteria criteria = example.createCriteria();\n\t\tcriteria.andEqualTo(\"email\", email);\n\t\tif (id != null) {\n\t\t\tcriteria.andNotEqualTo(\"id\", id);\n\t\t}\n\n\t\tint result = uacUserService.selectCountByExample(example);\n\t\treturn WrapMapper.ok(result < 1);\n\t}\n\n\n\t/**\n\t * 校验真实姓名唯一性.\n\t *\n\t * @param checkUserNameDto the check user name dto\n\t *\n\t * @return the wrapper\n\t */\n\t@PostMapping(value = \"/checkUserName\")\n\t@ApiOperation(httpMethod = \"POST\", value = \"校验真实姓名唯一性\")\n\tpublic Wrapper<Boolean> checkUserName(@ApiParam(name = \"checkUserNameDto\", value = \"校验真实姓名唯一性Dto\") @RequestBody CheckUserNameDto checkUserNameDto) {\n\t\tlogger.info(\" 校验真实姓名唯一性 checkUserNameDto={}\", checkUserNameDto);\n\t\tLong id = checkUserNameDto.getUserId();\n\t\tString name = checkUserNameDto.getUserName();\n\n\t\tExample example = new Example(UacUser.class);\n\t\tExample.Criteria criteria = example.createCriteria();\n\t\tcriteria.andEqualTo(\"userName\", name);\n\t\tif (id != null) {\n\t\t\tcriteria.andNotEqualTo(\"id\", id);\n\t\t}\n\n\t\tint result = uacUserService.selectCountByExample(example);\n\t\treturn WrapMapper.ok(result < 1);\n\t}\n\n\n\t/**\n\t * 校验用户电话号码唯一性.\n\t *\n\t * @param checkUserPhoneDto the check user phone dto\n\t *\n\t * @return the wrapper\n\t */\n\t@PostMapping(value = \"/checkUserPhone\")\n\t@ApiOperation(httpMethod = \"POST\", value = \"校验用户电话号码唯一性\")\n\tpublic Wrapper<Boolean> checkUserPhone(@ApiParam(name = \"checkUserPhoneDto\", value = \"校验用户电话号码唯一性Dto\") @RequestBody CheckUserPhoneDto checkUserPhoneDto) {\n\t\tlogger.info(\" 校验用户电话号码唯一性 checkUserPhoneDto={}\", checkUserPhoneDto);\n\t\tLong id = checkUserPhoneDto.getUserId();\n\t\tString mobileNo = checkUserPhoneDto.getMobileNo();\n\t\tExample example = new Example(UacUser.class);\n\t\tExample.Criteria criteria = example.createCriteria();\n\t\tcriteria.andEqualTo(\"mobileNo\", mobileNo);\n\n\t\tif (id != null) {\n\t\t\tcriteria.andNotEqualTo(\"id\", id);\n\t\t}\n\n\t\tint result = uacUserService.selectCountByExample(example);\n\t\treturn WrapMapper.ok(result < 1);\n\t}\n\n\n\t/**\n\t * 校验新密码是否与原始密码相同.\n\t *\n\t * @param checkNewPasswordDto 修改密码实体\n\t *\n\t * @return the wrapper\n\t */\n\t@PostMapping(value = \"/checkNewPassword\")\n\t@ApiOperation(httpMethod = \"POST\", value = \"校验新密码是否与原始密码相同\")\n\tpublic Wrapper<Boolean> checkNewPassword(@ApiParam(name = \"checkNewPasswordDto\", value = \"校验新密码是否与原始密码相同Dto\") @RequestBody CheckNewPasswordDto checkNewPasswordDto) {\n\t\tlogger.info(\" 校验新密码是否与原始密码相同 checkNewPasswordDto={}\", checkNewPasswordDto);\n\t\tString loginName = checkNewPasswordDto.getLoginName();\n\t\tString newPassword = checkNewPasswordDto.getNewPassword();\n\t\tUacUser uacUser = new UacUser();\n\t\tuacUser.setLoginName(loginName);\n\t\tint result = 0;\n\t\tUacUser user = uacUserService.findByLoginName(loginName);\n\t\tif (user == null) {\n\t\t\tlogger.error(\"找不到用户. loginName={}\", loginName);\n\t\t} else {\n\t\t\tuacUser.setLoginPwd(Md5Util.encrypt(newPassword));\n\t\t\tresult = uacUserService.selectCount(uacUser);\n\t\t}\n\t\treturn WrapMapper.ok(result < 1);\n\t}\n\n\t/**\n\t * 修改用户邮箱\n\t *\n\t * @param email     the email\n\t * @param emailCode the email code\n\t *\n\t * @return the wrapper\n\t */\n\t@LogAnnotation\n\t@PostMapping(value = \"/modifyUserEmail/{email}/{emailCode}\")\n\t@ApiOperation(httpMethod = \"POST\", value = \"修改用户信息\")\n\tpublic Wrapper<Integer> modifyUserEmail(@PathVariable String email, @PathVariable String emailCode) {\n\t\tlogger.info(\" 修改用户信息 email={}, emailCode={}\", email, emailCode);\n\t\tLoginAuthDto loginAuthDto = getLoginAuthDto();\n\t\tuacUserService.modifyUserEmail(email, emailCode, loginAuthDto);\n\t\treturn WrapMapper.ok();\n\t}\n\n\t/**\n\t * 获取已有权限树\n\t *\n\t * @return the auth tree by role id\n\t */\n\t@PostMapping(value = \"/getOwnAuthTree\")\n\t@ApiOperation(httpMethod = \"POST\", value = \"获取权限树\")\n\tpublic Wrapper<List<MenuVo>> getOwnAuthTree() {\n\t\tList<MenuVo> tree = uacRoleService.getOwnAuthTree(getLoginAuthDto().getUserId());\n\t\treturn WrapMapper.ok(tree);\n\t}\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/web/admin/UacUserLoginController.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：UacUserLoginController.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.web.admin;\n\nimport com.google.common.base.Preconditions;\nimport com.paascloud.base.dto.UserTokenDto;\nimport com.paascloud.core.support.BaseController;\nimport com.paascloud.core.utils.RequestUtil;\nimport com.paascloud.provider.model.dto.user.LoginRespDto;\nimport com.paascloud.provider.model.enums.UacUserTokenStatusEnum;\nimport com.paascloud.provider.service.UacLoginService;\nimport com.paascloud.provider.service.UacUserTokenService;\nimport com.paascloud.wrapper.WrapMapper;\nimport com.paascloud.wrapper.Wrapper;\nimport io.swagger.annotations.Api;\nimport io.swagger.annotations.ApiOperation;\nimport org.apache.commons.lang.StringUtils;\nimport org.springframework.http.HttpHeaders;\nimport org.springframework.http.MediaType;\nimport org.springframework.security.oauth2.common.exceptions.UnapprovedClientAuthenticationException;\nimport org.springframework.security.oauth2.provider.ClientDetails;\nimport org.springframework.security.oauth2.provider.ClientDetailsService;\nimport org.springframework.web.bind.annotation.*;\n\nimport javax.annotation.Resource;\nimport javax.servlet.http.HttpServletRequest;\n\n\n/**\n * 登录相关.\n *\n * @author paascloud.net @gmail.com\n */\n@RestController\n@RequestMapping(value = \"\", produces = MediaType.APPLICATION_JSON_UTF8_VALUE)\n@Api(value = \"Web - UacUserLoginController\", produces = MediaType.APPLICATION_JSON_UTF8_VALUE)\npublic class UacUserLoginController extends BaseController {\n\n\t@Resource\n\tprivate UacLoginService uacLoginService;\n\t@Resource\n\tprivate UacUserTokenService uacUserTokenService;\n\t@Resource\n\tprivate ClientDetailsService clientDetailsService;\n\tprivate static final String BEARER_TOKEN_TYPE = \"Basic \";\n\n\n\t/**\n\t * 登录成功获取菜单信息和用户信息.\n\t *\n\t * @param applicationId the application id\n\t *\n\t * @return the wrapper\n\t */\n\t@PostMapping(value = \"/user/loginAfter/{applicationId}\")\n\t@ApiOperation(httpMethod = \"POST\", value = \"登录成功获取用户菜单\")\n\tpublic Wrapper<LoginRespDto> loginAfter(@PathVariable Long applicationId) {\n\t\tlogger.info(\"登录成功获取用户菜单. applicationId={}\", applicationId);\n\t\tLoginRespDto result = uacLoginService.loginAfter(applicationId);\n\t\treturn WrapMapper.ok(result);\n\t}\n\n\t/**\n\t * 登出.\n\t *\n\t * @param accessToken the access token\n\t *\n\t * @return the wrapper\n\t */\n\t@PostMapping(value = \"/user/logout\")\n\t@ApiOperation(httpMethod = \"POST\", value = \"登出\")\n\tpublic Wrapper loginAfter(String accessToken) {\n\t\tif (!StringUtils.isEmpty(accessToken)) {\n\t\t\t// 修改用户在线状态\n\t\t\tUserTokenDto userTokenDto = uacUserTokenService.getByAccessToken(accessToken);\n\t\t\tuserTokenDto.setStatus(UacUserTokenStatusEnum.OFF_LINE.getStatus());\n\t\t\tuacUserTokenService.updateUacUserToken(userTokenDto, getLoginAuthDto());\n\t\t}\n\t\treturn WrapMapper.ok();\n\t}\n\n\t/**\n\t * 刷新token.\n\t *\n\t * @param request      the request\n\t * @param refreshToken the refresh token\n\t * @param accessToken  the access token\n\t *\n\t * @return the wrapper\n\t */\n\t@GetMapping(value = \"/auth/user/refreshToken\")\n\t@ApiOperation(httpMethod = \"POST\", value = \"刷新token\")\n\tpublic Wrapper<String> refreshToken(HttpServletRequest request, @RequestParam(value = \"refreshToken\") String refreshToken, @RequestParam(value = \"accessToken\") String accessToken) {\n\t\tString token;\n\t\ttry {\n\t\t\tPreconditions.checkArgument(org.apache.commons.lang3.StringUtils.isNotEmpty(accessToken), \"accessToken is null\");\n\t\t\tPreconditions.checkArgument(org.apache.commons.lang3.StringUtils.isNotEmpty(refreshToken), \"refreshToken is null\");\n\t\t\tString header = request.getHeader(HttpHeaders.AUTHORIZATION);\n\t\t\tif (header == null || !header.startsWith(BEARER_TOKEN_TYPE)) {\n\t\t\t\tthrow new UnapprovedClientAuthenticationException(\"请求头中无client信息\");\n\t\t\t}\n\t\t\tString[] tokens = RequestUtil.extractAndDecodeHeader(header);\n\t\t\tassert tokens.length == 2;\n\n\t\t\tString clientId = tokens[0];\n\t\t\tString clientSecret = tokens[1];\n\n\t\t\tClientDetails clientDetails = clientDetailsService.loadClientByClientId(clientId);\n\n\t\t\tif (clientDetails == null) {\n\t\t\t\tthrow new UnapprovedClientAuthenticationException(\"clientId对应的配置信息不存在:\" + clientId);\n\t\t\t} else if (!StringUtils.equals(clientDetails.getClientSecret(), clientSecret)) {\n\t\t\t\tthrow new UnapprovedClientAuthenticationException(\"clientSecret不匹配:\" + clientId);\n\t\t\t}\n\n\t\t\ttoken = uacUserTokenService.refreshToken(accessToken, refreshToken, request);\n\t\t} catch (Exception e) {\n\t\t\tlogger.error(\"refreshToken={}\", e.getMessage(), e);\n\t\t\treturn WrapMapper.error();\n\t\t}\n\t\treturn WrapMapper.ok(token);\n\t}\n\n}"
  },
  {
    "path": "paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/web/admin/UacUserMainController.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：UacUserMainController.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.web.admin;\n\nimport com.github.pagehelper.PageHelper;\nimport com.github.pagehelper.PageInfo;\nimport com.paascloud.base.dto.LoginAuthDto;\nimport com.paascloud.base.enums.ErrorCodeEnum;\nimport com.paascloud.core.annotation.LogAnnotation;\nimport com.paascloud.core.support.BaseController;\nimport com.paascloud.provider.model.domain.UacLog;\nimport com.paascloud.provider.model.domain.UacUser;\nimport com.paascloud.provider.model.dto.menu.UserMenuDto;\nimport com.paascloud.provider.model.dto.user.BindUserMenusDto;\nimport com.paascloud.provider.model.dto.user.BindUserRolesDto;\nimport com.paascloud.provider.model.dto.user.ModifyUserStatusDto;\nimport com.paascloud.provider.model.exceptions.UacBizException;\nimport com.paascloud.provider.model.vo.UserBindRoleVo;\nimport com.paascloud.provider.security.SecurityUtils;\nimport com.paascloud.provider.service.UacUserService;\nimport com.paascloud.security.core.SecurityUser;\nimport com.paascloud.wrapper.WrapMapper;\nimport com.paascloud.wrapper.Wrapper;\nimport io.swagger.annotations.Api;\nimport io.swagger.annotations.ApiOperation;\nimport io.swagger.annotations.ApiParam;\nimport org.springframework.http.MediaType;\nimport org.springframework.web.bind.annotation.*;\n\nimport javax.annotation.Resource;\nimport java.util.List;\nimport java.util.Objects;\n\n/**\n * 用户管理主页面.\n *\n * @author paascloud.net @gmail.com\n */\n@RestController\n@RequestMapping(value = \"/user\", produces = MediaType.APPLICATION_JSON_UTF8_VALUE)\n@Api(value = \"Web - UacUserMainController\", produces = MediaType.APPLICATION_JSON_UTF8_VALUE)\npublic class UacUserMainController extends BaseController {\n\t@Resource\n\tprivate UacUserService uacUserService;\n\n\t/**\n\t * 查询角色列表.\n\t *\n\t * @param uacUser the uac user\n\t *\n\t * @return the wrapper\n\t */\n\t@PostMapping(value = \"/queryListWithPage\")\n\t@ApiOperation(httpMethod = \"POST\", value = \"查询角色列表\")\n\tpublic Wrapper<PageInfo> queryUserListWithPage(@ApiParam(name = \"role\", value = \"角色信息\") @RequestBody UacUser uacUser) {\n\n\t\tlogger.info(\"查询用户列表uacUser={}\", uacUser);\n\t\tPageInfo pageInfo = uacUserService.queryUserListWithPage(uacUser);\n\t\treturn WrapMapper.ok(pageInfo);\n\t}\n\n\t/**\n\t * 新增用户\n\t *\n\t * @param user the user\n\t *\n\t * @return the wrapper\n\t */\n\t@LogAnnotation\n\t@PostMapping(value = \"/save\")\n\t@ApiOperation(httpMethod = \"POST\", value = \"新增用户\")\n\tpublic Wrapper<Integer> addUacUser(@ApiParam(name = \"user\", value = \"新增用户Dto\") @RequestBody UacUser user) {\n\t\tlogger.info(\" 新增用户 user={}\", user);\n\t\tLoginAuthDto loginAuthDto = getLoginAuthDto();\n\t\tuacUserService.saveUacUser(user, loginAuthDto);\n\t\treturn WrapMapper.ok();\n\t}\n\n\t/**\n\t * 分页查询用户操作日志列表.\n\t *\n\t * @param log the log\n\t *\n\t * @return the wrapper\n\t */\n\t@PostMapping(value = \"/queryUserLogListWithPage\")\n\t@ApiOperation(httpMethod = \"POST\", value = \"分页查询用户操作日志列表\")\n\tpublic Wrapper<PageInfo<UacLog>> queryUserLogListWithPage(@ApiParam(name = \"user\", value = \"用户信息\") @RequestBody UacLog log) {\n\n\t\tlogger.info(\"分页查询用户操作日志列表\");\n\t\tPageHelper.startPage(log.getPageNum(), log.getPageSize());\n\t\tList<UacLog> list = uacUserService.queryUserLogListWithUserId(getLoginAuthDto().getUserId());\n\t\tPageInfo<UacLog> pageInfo = new PageInfo<>(list);\n\t\treturn WrapMapper.ok(pageInfo);\n\t}\n\n\t/**\n\t * 根据Id修改用户状态.\n\t *\n\t * @param modifyUserStatusDto the modify user status dto\n\t *\n\t * @return the wrapper\n\t */\n\t@PostMapping(value = \"/modifyUserStatusById\")\n\t@LogAnnotation\n\t@ApiOperation(httpMethod = \"POST\", value = \"根据Id修改用户状态\")\n\tpublic Wrapper<Integer> modifyUserStatusById(@ApiParam(name = \"modifyUserStatusDto\", value = \"用户禁用/启用Dto\") @RequestBody ModifyUserStatusDto modifyUserStatusDto) {\n\t\tlogger.info(\" 根据Id修改用户状态 modifyUserStatusDto={}\", modifyUserStatusDto);\n\t\tLoginAuthDto loginAuthDto = getLoginAuthDto();\n\t\tUacUser uacUser = new UacUser();\n\t\tuacUser.setId(modifyUserStatusDto.getUserId());\n\t\tuacUser.setStatus(modifyUserStatusDto.getStatus());\n\n\t\tint result = uacUserService.modifyUserStatusById(uacUser, loginAuthDto);\n\t\treturn handleResult(result);\n\t}\n\n\t/**\n\t * 通过Id删除用户.\n\t *\n\t * @param userId the user id\n\t *\n\t * @return the wrapper\n\t */\n\t@LogAnnotation\n\t@PostMapping(value = \"/deleteUserById/{userId}\")\n\t@ApiOperation(httpMethod = \"POST\", value = \"通过Id删除用户\")\n\tpublic Wrapper<Integer> deleteUserById(@ApiParam(name = \"userId\", value = \"用户ID\") @PathVariable Long userId) {\n\t\tlogger.info(\" 通过Id删除用户 userId={}\", userId);\n\t\tint result = uacUserService.deleteUserById(userId);\n\t\treturn handleResult(result);\n\t}\n\n\t/**\n\t * 获取用户绑定角色页面数据.\n\t *\n\t * @param userId the user id\n\t *\n\t * @return the bind role\n\t */\n\t@PostMapping(value = \"/getBindRole/{userId}\")\n\t@ApiOperation(httpMethod = \"POST\", value = \"获取用户绑定角色页面数据\")\n\tpublic Wrapper<UserBindRoleVo> getBindRole(@ApiParam(name = \"userId\", value = \"角色id\") @PathVariable Long userId) {\n\t\tlogger.info(\"获取用户绑定角色页面数据. userId={}\", userId);\n\t\tLoginAuthDto loginAuthDto = super.getLoginAuthDto();\n\t\tLong currentUserId = loginAuthDto.getUserId();\n\t\tif (Objects.equals(userId, currentUserId)) {\n\t\t\tthrow new UacBizException(ErrorCodeEnum.UAC10011023);\n\t\t}\n\n\t\tUserBindRoleVo bindUserDto = uacUserService.getUserBindRoleDto(userId);\n\t\treturn WrapMapper.ok(bindUserDto);\n\t}\n\n\t/**\n\t * 用户绑定角色.\n\t *\n\t * @param bindUserRolesDto the bind user roles dto\n\t *\n\t * @return the wrapper\n\t */\n\t@PostMapping(value = \"/bindRole\")\n\t@LogAnnotation\n\t@ApiOperation(httpMethod = \"POST\", value = \"用户绑定角色\")\n\tpublic Wrapper<Integer> bindUserRoles(@ApiParam(name = \"bindUserRolesDto\", value = \"用户绑定角色Dto\") @RequestBody BindUserRolesDto bindUserRolesDto) {\n\t\tlogger.info(\"用户绑定角色 bindUserRolesDto={}\", bindUserRolesDto);\n\t\tLoginAuthDto loginAuthDto = getLoginAuthDto();\n\t\tuacUserService.bindUserRoles(bindUserRolesDto, loginAuthDto);\n\t\treturn WrapMapper.ok();\n\t}\n\n\t/**\n\t * 查询用户常用功能数据.\n\t *\n\t * @return the wrapper\n\t */\n\t@PostMapping(value = \"/queryUserMenuDtoData\")\n\t@ApiOperation(httpMethod = \"POST\", value = \"查询用户常用功能数据\")\n\tpublic Wrapper<List<UserMenuDto>> queryUserMenuDtoData() {\n\t\tlogger.info(\"查询用户常用功能数据\");\n\n\t\tLoginAuthDto loginAuthDto = getLoginAuthDto();\n\t\tList<UserMenuDto> userMenuDtoList = uacUserService.queryUserMenuDtoData(loginAuthDto);\n\t\treturn WrapMapper.ok(userMenuDtoList);\n\t}\n\n\t/**\n\t * 绑定用户常用菜单.\n\t *\n\t * @param bindUserMenusDto the bind user menus dto\n\t *\n\t * @return the wrapper\n\t */\n\t@LogAnnotation\n\t@PostMapping(value = \"/bindUserMenus\")\n\t@ApiOperation(httpMethod = \"POST\", value = \"绑定用户常用菜单\")\n\tpublic Wrapper<Integer> bindUserMenus(@ApiParam(name = \"bindUserMenusDto\", value = \"绑定用户常用菜单Dto\") @RequestBody BindUserMenusDto bindUserMenusDto) {\n\t\tlogger.info(\"绑定用户常用菜单\");\n\t\tList<Long> menuIdList = bindUserMenusDto.getMenuIdList();\n\t\tlogger.info(\"menuIdList = {}\", menuIdList);\n\n\t\tint result = uacUserService.bindUserMenus(menuIdList, getLoginAuthDto());\n\n\t\treturn handleResult(result);\n\n\t}\n\n\t/**\n\t * 根据用户Id查询用户信息.\n\t *\n\t * @param userId the user id\n\t *\n\t * @return the uac user by id\n\t */\n\t@PostMapping(value = \"/getUacUserById/{userId}\")\n\t@ApiOperation(httpMethod = \"POST\", value = \"根据用户Id查询用户信息\")\n\tpublic Wrapper<UacUser> getUacUserById(@ApiParam(name = \"userId\", value = \"用户ID\") @PathVariable Long userId) {\n\t\tlogger.info(\"getUacUserById - 根据用户Id查询用户信息. userId={}\", userId);\n\t\tUacUser uacUser = uacUserService.queryByUserId(userId);\n\t\tlogger.info(\"getUacUserById - 根据用户Id查询用户信息. [OK] uacUser={}\", uacUser);\n\t\treturn WrapMapper.ok(uacUser);\n\t}\n\n\t/**\n\t * 根据用户Id重置密码.\n\t *\n\t * @param userId the user id\n\t *\n\t * @return the wrapper\n\t */\n\t@LogAnnotation\n\t@PostMapping(value = \"/resetLoginPwd/{userId}\")\n\t@ApiOperation(httpMethod = \"POST\", value = \"根据用户Id重置密码\")\n\tpublic Wrapper<UacUser> resetLoginPwd(@ApiParam(name = \"userId\", value = \"用户ID\") @PathVariable Long userId) {\n\t\tlogger.info(\"resetLoginPwd - 根据用户Id重置密码. userId={}\", userId);\n\t\tuacUserService.resetLoginPwd(userId, getLoginAuthDto());\n\t\treturn WrapMapper.ok();\n\t}\n\n\t/**\n\t * User security user.\n\t *\n\t * @return the security user\n\t */\n\t@GetMapping(\"/user\")\n\tpublic SecurityUser user() {\n\t\tString loginName = SecurityUtils.getCurrentLoginName();\n\t\tlogger.info(\"{}\", loginName);\n\t\tUacUser user = uacUserService.findByLoginName(loginName);\n\t\treturn user == null ? null : new SecurityUser(user.getId(), user.getLoginName(), user.getLoginPwd(), user.getUserName(), user.getGroupId(), user.getGroupName());\n\t}\n\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/web/admin/UacUserPasswordController.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：UacUserPasswordController.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.web.admin;\n\n\nimport com.paascloud.base.dto.LoginAuthDto;\nimport com.paascloud.core.annotation.LogAnnotation;\nimport com.paascloud.core.support.BaseController;\nimport com.paascloud.provider.model.dto.user.UserModifyPwdDto;\nimport com.paascloud.provider.model.dto.user.UserRegisterDto;\nimport com.paascloud.provider.service.UacUserService;\nimport com.paascloud.wrapper.WrapMapper;\nimport com.paascloud.wrapper.Wrapper;\nimport io.swagger.annotations.Api;\nimport io.swagger.annotations.ApiOperation;\nimport io.swagger.annotations.ApiParam;\nimport org.springframework.http.MediaType;\nimport org.springframework.web.bind.annotation.PostMapping;\nimport org.springframework.web.bind.annotation.RequestBody;\nimport org.springframework.web.bind.annotation.RequestMapping;\nimport org.springframework.web.bind.annotation.RestController;\n\nimport javax.annotation.Resource;\n\n\n/**\n * 用户密码.\n *\n * @author paascloud.net@gmail.com\n */\n@RestController\n@RequestMapping(value = \"/user\", produces = {\"application/json;charset=UTF-8\"})\n@Api(value = \"Web - UacUserPasswordController\", produces = MediaType.APPLICATION_JSON_UTF8_VALUE)\npublic class UacUserPasswordController extends BaseController {\n\t@Resource\n\tprivate UacUserService uacUserService;\n\n\t/**\n\t * 用户修改密码\n\t *\n\t * @param userModifyPwdDto the user modify pwd dto\n\t *\n\t * @return the wrapper\n\t */\n\t@PostMapping(value = \"/modifyUserPwd\")\n\t@LogAnnotation\n\t@ApiOperation(httpMethod = \"POST\", value = \"用户修改密码\")\n\tpublic Wrapper<Integer> modifyUserPwd(@ApiParam(name = \"userModifyPwdDto\", value = \"用户修改密码Dto\") @RequestBody UserModifyPwdDto userModifyPwdDto) {\n\t\tlogger.info(\"==》vue用户修改密码, userModifyPwdDto={}\", userModifyPwdDto);\n\n\t\tlogger.info(\"旧密码 oldPassword = {}\", userModifyPwdDto.getOldPassword());\n\t\tlogger.info(\"新密码 newPassword = {}\", userModifyPwdDto.getNewPassword());\n\t\tlogger.info(\"登录名 loginName = {}\", userModifyPwdDto.getLoginName());\n\n\t\tLoginAuthDto loginAuthDto = getLoginAuthDto();\n\n\t\tint result = uacUserService.userModifyPwd(userModifyPwdDto, loginAuthDto);\n\t\treturn handleResult(result);\n\t}\n\n\n\t/**\n\t * 注册\n\t *\n\t * @param registerDto the register dto\n\t *\n\t * @return the wrapper\n\t */\n\t@PostMapping(value = \"/registerUser\")\n\t@ApiOperation(httpMethod = \"POST\", value = \"注册新用户\")\n\tpublic Wrapper registerUser(@ApiParam(name = \"registerDto\", value = \"用户注册Dto\") @RequestBody UserRegisterDto registerDto) {\n\t\tlogger.info(\"vue注册开始。注册参数：{}\", registerDto);\n\t\tuacUserService.register(registerDto);\n\t\treturn WrapMapper.ok(\"注册成功\");\n\t}\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/web/mall/EmailController.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：EmailController.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.web.mall;\n\nimport com.paascloud.base.dto.LoginAuthDto;\nimport com.paascloud.core.support.BaseController;\nimport com.paascloud.provider.model.dto.email.SendEmailMessage;\nimport com.paascloud.provider.service.EmailService;\nimport com.paascloud.wrapper.WrapMapper;\nimport com.paascloud.wrapper.Wrapper;\nimport io.swagger.annotations.Api;\nimport io.swagger.annotations.ApiOperation;\nimport io.swagger.annotations.ApiParam;\nimport org.springframework.http.MediaType;\nimport org.springframework.web.bind.annotation.PostMapping;\nimport org.springframework.web.bind.annotation.RequestBody;\nimport org.springframework.web.bind.annotation.RequestMapping;\nimport org.springframework.web.bind.annotation.RestController;\n\nimport javax.annotation.Resource;\n\n\n/**\n * The class Email controller.\n *\n * @author paascloud.net @gmail.com\n */\n@RestController\n@RequestMapping(value = \"/email\", produces = MediaType.APPLICATION_JSON_UTF8_VALUE)\n@Api(value = \"WEB - EmailController\", produces = MediaType.APPLICATION_JSON_UTF8_VALUE)\npublic class EmailController extends BaseController {\n\n\t@Resource\n\tprivate EmailService emailService;\n\n\t/**\n\t * 发送短信验证码.\n\t *\n\t * @param sendEmailMessage the send email message\n\t *\n\t * @return the wrapper\n\t */\n\t@PostMapping(value = \"/sendRestEmailCode\")\n\t@ApiOperation(httpMethod = \"POST\", value = \"发送注册短信验证码\")\n\tpublic Wrapper<String> sendRestEmailCode(@RequestBody SendEmailMessage sendEmailMessage) {\n\t\tLoginAuthDto loginAuthDto = this.getLoginAuthDto();\n\t\temailService.sendEmailCode(sendEmailMessage, loginAuthDto.getLoginName());\n\t\treturn WrapMapper.ok();\n\t}\n\n\t/**\n\t * 校验短信验证码.\n\t *\n\t * @param sendEmailMessage the send email message\n\t *\n\t * @return the wrapper\n\t */\n\t@PostMapping(value = \"/checkRestEmailCode\")\n\t@ApiOperation(httpMethod = \"POST\", value = \"校验充值密码邮件验证码\")\n\tpublic Wrapper checkRestEmailCode(@ApiParam(value = \"验证信息\") @RequestBody SendEmailMessage sendEmailMessage) {\n\t\tlogger.info(\"校验短信验证码, checkRestEmailCode={}\", sendEmailMessage);\n\t\tLoginAuthDto loginAuthDto = this.getLoginAuthDto();\n\t\temailService.checkEmailCode(sendEmailMessage, loginAuthDto.getLoginName());\n\t\treturn WrapMapper.ok();\n\t}\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/web/mall/MallAuthRestController.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：MallAuthRestController.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.web.mall;\n\nimport com.github.pagehelper.PageInfo;\nimport com.paascloud.core.support.BaseController;\nimport com.paascloud.provider.model.dto.ProductCategoryDto;\nimport com.paascloud.provider.model.dto.ProductReqDto;\nimport com.paascloud.provider.model.vo.ProductDetailVo;\nimport com.paascloud.provider.service.MdcProductCategoryQueryFeignApi;\nimport com.paascloud.provider.service.MdcProductQueryFeignApi;\nimport com.paascloud.wrapper.Wrapper;\nimport io.swagger.annotations.Api;\nimport io.swagger.annotations.ApiOperation;\nimport org.springframework.http.MediaType;\nimport org.springframework.web.bind.annotation.*;\n\nimport javax.annotation.Resource;\nimport java.util.List;\n\n\n/**\n * The class Mall auth rest controller.\n *\n * @author paascloud.net @gmail.com\n */\n@RestController\n@RequestMapping(value = \"/auth\", produces = MediaType.APPLICATION_JSON_UTF8_VALUE)\n@Api(value = \"WEB - MallAuthRestController\", produces = MediaType.APPLICATION_JSON_UTF8_VALUE)\npublic class MallAuthRestController extends BaseController {\n\n\t@Resource\n\tprivate MdcProductQueryFeignApi mdcProductQueryFeignApi;\n\n\t@Resource\n\tprivate MdcProductCategoryQueryFeignApi mdcProductCategoryQueryFeignApi;\n\n\t/**\n\t * 查询商品列表.\n\t *\n\t * @param productReqDto the product req dto\n\t *\n\t * @return the product category dto by pid\n\t */\n\t@PostMapping(value = \"/product/queryProductList\")\n\t@ApiOperation(httpMethod = \"POST\", value = \"查询商品列表\")\n\tpublic Wrapper<PageInfo> queryProductList(@RequestBody ProductReqDto productReqDto) {\n\t\tlogger.info(\"getProductCategoryDtoByPid - 查询分类信息 productReqDto={}\", productReqDto);\n\t\treturn mdcProductCategoryQueryFeignApi.getProductList(productReqDto);\n\t}\n\n\t/**\n\t * 查询商品详情信息.\n\t *\n\t * @param productId the product id\n\t *\n\t * @return the wrapper\n\t */\n\t@GetMapping(value = \"/product/queryProductDetail/{productId}\")\n\t@ApiOperation(httpMethod = \"POST\", value = \"查询商品详情信息\")\n\tpublic Wrapper<ProductDetailVo> queryProductDetail(@PathVariable Long productId) {\n\t\tlogger.info(\"getProductCategoryDtoByPid - 查询商品详情信息 productId={}\", productId);\n\t\treturn mdcProductQueryFeignApi.getProductDetail(productId);\n\t}\n\n\t/**\n\t * 查询分类信息.\n\t *\n\t * @param pid the pid\n\t *\n\t * @return the product category dto by pid\n\t */\n\t@GetMapping(value = \"/category/getProductCategoryDtoByPid/{pid}\")\n\tpublic Wrapper<List<ProductCategoryDto>> getProductCategoryDtoByPid(@PathVariable Long pid) {\n\t\tlogger.info(\"getProductCategoryDtoByPid - 查询分类信息 pid={}\", pid);\n\t\tWrapper<List<ProductCategoryDto>> productCategoryData = mdcProductCategoryQueryFeignApi.getProductCategoryData(pid);\n\t\tlogger.info(\"productCategoryData={}\", productCategoryData);\n\t\treturn productCategoryData;\n\t}\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/web/mall/MallCartController.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：MallCartController.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.web.mall;\n\nimport com.paascloud.PublicUtil;\nimport com.paascloud.base.dto.LoginAuthDto;\nimport com.paascloud.core.support.BaseController;\nimport com.paascloud.provider.model.constant.OmcApiConstant;\nimport com.paascloud.provider.model.dto.omc.CartListQuery;\nimport com.paascloud.provider.model.vo.CartProductVo;\nimport com.paascloud.provider.model.vo.CartVo;\nimport com.paascloud.provider.service.OmcCartFeignApi;\nimport com.paascloud.provider.service.OmcCartQueryFeignApi;\nimport com.paascloud.wrapper.Wrapper;\nimport io.swagger.annotations.Api;\nimport io.swagger.annotations.ApiOperation;\nimport org.springframework.http.MediaType;\nimport org.springframework.web.bind.annotation.*;\n\nimport javax.annotation.Resource;\nimport java.util.List;\n\n/**\n * 购物车管理.\n *\n * @author paascloud.net @gmail.com\n */\n@RestController\n@RequestMapping(value = \"/cart\", produces = MediaType.APPLICATION_JSON_UTF8_VALUE)\n@Api(value = \"WEB - MallCartController\", produces = MediaType.APPLICATION_JSON_UTF8_VALUE)\npublic class MallCartController extends BaseController {\n\n\t@Resource\n\tprivate OmcCartQueryFeignApi mallCartQueryFeignApi;\n\t@Resource\n\tprivate OmcCartFeignApi mallCartFeignApi;\n\n\n\t/**\n\t * 登录成功合并购物车.\n\t *\n\t * @param cartListQuery the cart list query\n\t *\n\t * @return the wrapper\n\t */\n\t@PostMapping(value = \"mergeUserCart\")\n\t@ApiOperation(httpMethod = \"POST\", value = \"登录成功合并购物车\")\n\tpublic Wrapper<CartVo> mergeUserCart(@RequestBody CartListQuery cartListQuery) {\n\t\tList<CartProductVo> cartProductVoList = cartListQuery.getCartProductVoList();\n\t\tLoginAuthDto loginAuthDto = getLoginAuthDto();\n\t\t// 1.更新购物车数据\n\t\tif (PublicUtil.isNotEmpty(cartProductVoList)) {\n\t\t\tfor (CartProductVo cartProductVo : cartProductVoList) {\n\t\t\t\tcartProductVo.setUserId(loginAuthDto.getUserId());\n\t\t\t}\n\t\t\tmallCartFeignApi.updateCartList(cartProductVoList);\n\t\t}\n\t\treturn mallCartQueryFeignApi.getCartVo(loginAuthDto.getUserId());\n\t}\n\n\t/**\n\t * 购物车添加商品.\n\t *\n\t * @param productId the product id\n\t * @param count     the count\n\t *\n\t * @return the wrapper\n\t */\n\t@PostMapping(\"addProduct/{productId}/{count}\")\n\t@ApiOperation(httpMethod = \"POST\", value = \"购物车添加商品\")\n\tpublic Wrapper addProduct(@PathVariable Long productId, @PathVariable Integer count) {\n\t\tLoginAuthDto loginAuthDto = getLoginAuthDto();\n\t\tLong userId = loginAuthDto.getUserId();\n\t\treturn mallCartFeignApi.addProduct(userId, productId, count);\n\t}\n\n\n\t/**\n\t * 购物车更新商品.\n\t *\n\t * @param productId the product id\n\t * @param count     the count\n\t *\n\t * @return the wrapper\n\t */\n\t@ApiOperation(httpMethod = \"POST\", value = \"购物车更新商品\")\n\t@PostMapping(\"updateProduct/{productId}/{count}\")\n\tpublic Wrapper updateProduct(@PathVariable Long productId, @PathVariable Integer count) {\n\t\tLoginAuthDto loginAuthDto = getLoginAuthDto();\n\t\tLong userId = loginAuthDto.getUserId();\n\t\treturn mallCartFeignApi.updateProduct(userId, productId, count);\n\t}\n\n\t/**\n\t * 购物车删除商品.\n\t *\n\t * @param productIds the product ids\n\t *\n\t * @return the wrapper\n\t */\n\t@ApiOperation(httpMethod = \"POST\", value = \"购物车删除商品\")\n\t@PostMapping(\"deleteProduct/{productIds}\")\n\tpublic Wrapper deleteProduct(@PathVariable String productIds) {\n\t\tLoginAuthDto loginAuthDto = getLoginAuthDto();\n\t\tLong userId = loginAuthDto.getUserId();\n\t\treturn mallCartFeignApi.deleteProduct(userId, productIds);\n\t}\n\n\n\t/**\n\t * 购物车全选商品.\n\t *\n\t * @return the wrapper\n\t */\n\t@PostMapping(\"selectAllProduct\")\n\t@ApiOperation(httpMethod = \"POST\", value = \"购物车全选商品\")\n\tpublic Wrapper selectAll() {\n\t\tLoginAuthDto loginAuthDto = getLoginAuthDto();\n\t\tLong userId = loginAuthDto.getUserId();\n\t\treturn mallCartFeignApi.selectOrUnSelect(userId, null, OmcApiConstant.Cart.CHECKED);\n\t}\n\n\t/**\n\t * 购物车反选全部商品.\n\t *\n\t * @return the wrapper\n\t */\n\t@PostMapping(\"unSelectAllProduct\")\n\t@ApiOperation(httpMethod = \"POST\", value = \"购物车反选全部商品\")\n\tpublic Wrapper unSelectAll() {\n\t\tLoginAuthDto loginAuthDto = getLoginAuthDto();\n\t\tLong userId = loginAuthDto.getUserId();\n\t\treturn mallCartFeignApi.selectOrUnSelect(userId, null, OmcApiConstant.Cart.UN_CHECKED);\n\t}\n\n\n\t/**\n\t * 选中商品.\n\t *\n\t * @param productId the product id\n\t *\n\t * @return the wrapper\n\t */\n\t@PostMapping(\"selectProduct/{productId}\")\n\t@ApiOperation(httpMethod = \"POST\", value = \"选中商品\")\n\tpublic Wrapper select(@PathVariable Long productId) {\n\t\tLoginAuthDto loginAuthDto = getLoginAuthDto();\n\t\tLong userId = loginAuthDto.getUserId();\n\t\treturn mallCartFeignApi.selectOrUnSelect(userId, productId, OmcApiConstant.Cart.CHECKED);\n\t}\n\n\t/**\n\t * 反选商品.\n\t *\n\t * @param productId the product id\n\t *\n\t * @return the wrapper\n\t */\n\t@PostMapping(\"unSelectProduct/{productId}\")\n\t@ApiOperation(httpMethod = \"POST\", value = \"反选商品\")\n\tpublic Wrapper unSelect(@PathVariable Long productId) {\n\t\tLoginAuthDto loginAuthDto = getLoginAuthDto();\n\t\tLong userId = loginAuthDto.getUserId();\n\t\treturn mallCartFeignApi.selectOrUnSelect(userId, productId, OmcApiConstant.Cart.UN_CHECKED);\n\t}\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/web/mall/MallUserController.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：MallUserController.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.web.mall;\n\nimport com.paascloud.base.dto.LoginAuthDto;\nimport com.paascloud.core.support.BaseController;\nimport com.paascloud.provider.model.domain.UacUser;\nimport com.paascloud.provider.model.dto.user.UserInfoDto;\nimport com.paascloud.provider.service.UacUserService;\nimport com.paascloud.wrapper.WrapMapper;\nimport com.paascloud.wrapper.Wrapper;\nimport io.swagger.annotations.Api;\nimport io.swagger.annotations.ApiOperation;\nimport org.modelmapper.ModelMapper;\nimport org.springframework.beans.BeanUtils;\nimport org.springframework.http.MediaType;\nimport org.springframework.web.bind.annotation.PostMapping;\nimport org.springframework.web.bind.annotation.RequestBody;\nimport org.springframework.web.bind.annotation.RequestMapping;\nimport org.springframework.web.bind.annotation.RestController;\n\nimport javax.annotation.Resource;\n\n/**\n * The class Mall user controller.\n *\n * @author paascloud.net@gmail.com\n */\n@RestController\n@RequestMapping(value = \"/user\", produces = MediaType.APPLICATION_JSON_UTF8_VALUE)\n@Api(value = \"WEB - MallUserController\", produces = MediaType.APPLICATION_JSON_UTF8_VALUE)\npublic class MallUserController extends BaseController {\n\t@Resource\n\tprivate UacUserService uacUserService;\n\n\t/**\n\t * 更新用户信息.\n\t *\n\t * @param userInfoDto the user info dto\n\t *\n\t * @return the wrapper\n\t */\n\t@PostMapping(value = \"/updateInformation\")\n\t@ApiOperation(httpMethod = \"POST\", value = \"更新用户信息\")\n\tpublic Wrapper<UserInfoDto> updateInformation(@RequestBody UserInfoDto userInfoDto) {\n\t\tlogger.info(\"updateInformation - 更新用户基本信息 userInfoDto={}\", userInfoDto);\n\t\tUacUser uacUser = new ModelMapper().map(userInfoDto, UacUser.class);\n\t\tuacUserService.updateUser(uacUser);\n\t\treturn WrapMapper.ok();\n\t}\n\n\t/**\n\t * 获取用户信息.\n\t *\n\t * @return the information\n\t */\n\t@PostMapping(value = \"/getInformation\")\n\t@ApiOperation(httpMethod = \"POST\", value = \"获取用户信息\")\n\tpublic Wrapper<UserInfoDto> getInformation() {\n\t\tLoginAuthDto loginAuthDto = getLoginAuthDto();\n\t\tLong userId = loginAuthDto.getUserId();\n\t\tlogger.info(\"queryUserInfo - 查询用户基本信息 userId={}\", userId);\n\t\tUacUser uacUser = uacUserService.queryByUserId(userId);\n\t\tif (uacUser == null) {\n\t\t\treturn WrapMapper.error(\"找不到当前用户\");\n\t\t}\n\t\tUserInfoDto userInfoDto = new UserInfoDto();\n\t\tBeanUtils.copyProperties(uacUser, userInfoDto);\n\n\t\treturn WrapMapper.ok(userInfoDto);\n\t}\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/web/rpc/UacMqMessageFeignClient.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：UacMqMessageFeignClient.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.web.rpc;\n\n\nimport com.github.pagehelper.PageInfo;\nimport com.paascloud.base.dto.MessageQueryDto;\nimport com.paascloud.base.dto.MqMessageVo;\nimport com.paascloud.core.support.BaseController;\nimport com.paascloud.provider.model.service.UacMqMessageFeignApi;\nimport com.paascloud.provider.service.MqMessageService;\nimport com.paascloud.wrapper.WrapMapper;\nimport com.paascloud.wrapper.Wrapper;\nimport io.swagger.annotations.Api;\nimport io.swagger.annotations.ApiOperation;\nimport org.springframework.http.MediaType;\nimport org.springframework.web.bind.annotation.RequestBody;\nimport org.springframework.web.bind.annotation.RequestParam;\nimport org.springframework.web.bind.annotation.RestController;\n\nimport javax.annotation.Resource;\nimport java.util.List;\n\n/**\n * Mq 消息.\n *\n * @author paascloud.net @gmail.com\n */\n@RestController\n@Api(value = \"API - UacMqMessageFeignClient\", produces = MediaType.APPLICATION_JSON_UTF8_VALUE)\npublic class UacMqMessageFeignClient extends BaseController implements UacMqMessageFeignApi {\n\t@Resource\n\tprivate MqMessageService mqMessageService;\n\n\t@Override\n\t@ApiOperation(httpMethod = \"POST\", value = \"查询含有的messageKey\")\n\tpublic Wrapper<List<String>> queryMessageKeyList(@RequestParam(\"messageKeyList\") List<String> messageKeyList) {\n\t\tlogger.info(\"查询消息KEY. messageKeyList={}\", messageKeyList);\n\t\treturn WrapMapper.ok(mqMessageService.queryMessageKeyList(messageKeyList));\n\t}\n\n\t@Override\n\tpublic Wrapper<PageInfo<MqMessageVo>> queryMessageListWithPage(@RequestBody MessageQueryDto messageQueryDto) {\n\t\treturn mqMessageService.queryMessageListWithPage(messageQueryDto);\n\t}\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/web/rpc/UacUserTokenFeignClient.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：UacUserTokenFeignClient.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.web.rpc;\n\nimport com.paascloud.core.support.BaseController;\nimport com.paascloud.provider.model.service.UacUserTokenFeignApi;\nimport com.paascloud.provider.service.UacUserTokenService;\nimport com.paascloud.wrapper.Wrapper;\nimport io.swagger.annotations.Api;\nimport io.swagger.annotations.ApiOperation;\nimport org.springframework.http.MediaType;\nimport org.springframework.web.bind.annotation.RestController;\n\nimport javax.annotation.Resource;\n\n\n/**\n * 用户token.\n *\n * @author paascloud.net @gmail.com\n */\n@RestController\n@Api(value = \"API - UacUserTokenFeignClient\", produces = MediaType.APPLICATION_JSON_UTF8_VALUE)\npublic class UacUserTokenFeignClient extends BaseController implements UacUserTokenFeignApi {\n\t@Resource\n\tprivate UacUserTokenService uacUserTokenService;\n\n\t@Override\n\t@ApiOperation(httpMethod = \"POST\", value = \"更新token离线状态\")\n\tpublic Wrapper<Integer> updateTokenOffLine() {\n\t\tint result = uacUserTokenService.batchUpdateTokenOffLine();\n\t\treturn handleResult(result);\n\t}\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-uac/src/main/resources/META-INF/spring-devtools.properties",
    "content": "restart.include.mapper=/mapper-[\\\\w-\\\\.]+jar\nrestart.include.pagehelper=/pagehelper-[\\\\w-\\\\.]+jar"
  },
  {
    "path": "paascloud-provider/paascloud-provider-uac/src/main/resources/ValidationMessages.properties",
    "content": "role.roleCode.length=\\u89D2\\u8272\\u7F16\\u7801\\u957F\\u5EA6\\u4E0D\\u6B63\\u786E\nrole.roleCode.pattern=\\u89D2\\u8272\\u7F16\\u7801\\u53EA\\u80FD\\u8F93\\u5165\\u6570\\u5B57\\u548C\\u5B57\\u6BCD\nrole.roleName.length=\\u89D2\\u8272\\u540D\\u79F0\\u957F\\u5EA6\\u4E0D\\u6B63\\u786E\nrole.roleName.pattern=\\u89D2\\u8272\\u540D\\u79F0\\u53EA\\u80FD\\u8F93\\u5165\\u6C49\\u5B57\nrole.remark.length=\\u89D2\\u8272\\u8BF4\\u660E\\u957F\\u5EA6\\u4E0D\\u80FD\\u5927\\u4E8E150"
  },
  {
    "path": "paascloud-provider/paascloud-provider-uac/src/main/resources/application.yml",
    "content": "server:\n  port: 8000\n\nspring:\n  application:\n    name: @pom.artifactId@\n  datasource:\n    username: root\n    password: 123456"
  },
  {
    "path": "paascloud-provider/paascloud-provider-uac/src/main/resources/banner.txt",
    "content": "${AnsiColor.BRIGHT_CYAN}\n                                  .__                   .___                  __\n___________  _____    ______ ____ |  |   ____  __ __  __| _/     ____   _____/  |_\n\\____ \\__  \\ \\__  \\  /  ___// ___\\|  |  /  _ \\|  |  \\/ __ |     /    \\_/ __ \\   __\\\n|  |_> > __ \\_/ __ \\_\\___ \\\\  \\___|  |_(  <_> )  |  / /_/ |    |   |  \\  ___/|  |\n|   __(____  (____  /____  >\\___  >____/\\____/|____/\\____ | /\\ |___|  /\\___  >__|\n|__|       \\/     \\/     \\/     \\/ Powered by liuzhaoming\\/ \\/      \\/     \\/"
  },
  {
    "path": "paascloud-provider/paascloud-provider-uac/src/main/resources/bootstrap.yml",
    "content": "spring:\n  profiles:\n    active: dev\n  cloud:\n    config:\n      fail-fast: true\n      discovery:\n        service-id: paascloud-discovery\n        enabled: true\n      label: ${spring.profiles.active}\n      profile: ${spring.profiles.active}\n      username: admin\n      password: admin\n\neureka:\n  client:\n    serviceUrl:\n      defaultZone: http://root:root@paascloud-eureka:8761/eureka/\n  instance:\n    instance-id: ${spring.application.name}:${spring.cloud.client.ipAddress}:${server.port}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-uac/src/main/resources/conf/liquibase.properties",
    "content": "spring.datasource.driver-class-name= com.mysql.jdbc.Driver\nspring.datasource.url=jdbc:mysql://paascloud-db-mysql:3306/paascloud_uac?characterEncoding=utf8&useSSL=false\nspring.datasource.username= root\nspring.datasource.password= 123456"
  },
  {
    "path": "paascloud-provider/paascloud-provider-uac/src/main/resources/liquibase/change_log/2017-06-10-init-schema.xml",
    "content": "<databaseChangeLog\n        xmlns=\"http://www.liquibase.org/xml/ns/dbchangelog\"\n        xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n        xsi:schemaLocation=\"http://www.liquibase.org/xml/ns/dbchangelog\n        http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.4.xsd\">\n  <property name=\"autoIncrement\" value=\"true\" dbms=\"mysql\"/>\n  <changeSet id=\"init-schema\" author=\"paascloud.net@gmail.com\" >\n    <comment>init schema</comment>\n    <createTable tableName=\"user\">\n      <column name=\"id\" type=\"bigint\" autoIncrement=\"${autoIncrement}\">\n        <constraints primaryKey=\"true\" nullable=\"false\"/>\n      </column>\n    </createTable>\n    <modifySql dbms=\"mysql\">\n      <append value=\"ENGINE=INNODB DEFAULT CHARSET utf8mb4 COLLATE utf8mb4_general_ci\"/>\n    </modifySql>\n  </changeSet>\n</databaseChangeLog>"
  },
  {
    "path": "paascloud-provider/paascloud-provider-uac/src/main/resources/liquibase/index.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<databaseChangeLog\n        xmlns=\"http://www.liquibase.org/xml/ns/dbchangelog\"\n        xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n        xsi:schemaLocation=\"http://www.liquibase.org/xml/ns/dbchangelog\n         http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.1.xsd\">\n  <include file=\"classpath:liquibase/change_log/2017-06-10-init-schema.xml\" relativeToChangelogFile=\"false\"/>\n</databaseChangeLog>"
  },
  {
    "path": "paascloud-provider/paascloud-provider-uac/src/main/resources/logback-spring.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<configuration>\n    <include resource=\"org/springframework/boot/logging/logback/defaults.xml\"/>\n    ​\n    <springProperty scope=\"context\" name=\"springAppName\" source=\"spring.application.name\"/>\n\n    <!-- Example for logging into the build folder of your project -->\n    <property name=\"LOG_FILE\" value=\"/data/logs/paascloud/${springAppName}/${springAppName}\"/>\n    ​\n    <property name=\"CONSOLE_LOG_PATTERN\" value=\"%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr([${springAppName:-},%X{X-B3-TraceId:-},%X{X-B3-SpanId:-},%X{X-B3-ParentSpanId:-},%X{X-Span-Export:-}]){yellow} %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}\"/>\n\n    <!-- Appender to log to console -->\n    <appender name=\"console\" class=\"ch.qos.logback.core.ConsoleAppender\">\n        <filter class=\"ch.qos.logback.classic.filter.ThresholdFilter\">\n            <!-- Minimum logging level to be presented in the console logs -->\n            <level>INFO</level>\n        </filter>\n        <encoder>\n            <pattern>${CONSOLE_LOG_PATTERN}</pattern>\n            <charset>utf8</charset>\n        </encoder>\n    </appender>\n\n    <!-- Appender to log to file -->\n    <appender name=\"flatfile\" class=\"ch.qos.logback.core.rolling.RollingFileAppender\">\n        <file>${LOG_FILE}</file>\n        <rollingPolicy class=\"ch.qos.logback.core.rolling.TimeBasedRollingPolicy\">\n            <fileNamePattern>${LOG_FILE}.%d{yyyy-MM-dd}.gz</fileNamePattern>\n            <maxHistory>7</maxHistory>\n        </rollingPolicy>\n        <encoder>\n            <pattern>${CONSOLE_LOG_PATTERN}</pattern>\n            <charset>utf8</charset>\n        </encoder>\n    </appender>\n    ​\n    <!-- Appender to log to file in a JSON format -->\n    <appender name=\"logstash\" class=\"ch.qos.logback.core.rolling.RollingFileAppender\">\n        <file>${LOG_FILE}.json</file>\n        <rollingPolicy class=\"ch.qos.logback.core.rolling.TimeBasedRollingPolicy\">\n            <fileNamePattern>${LOG_FILE}.json.%d{yyyy-MM-dd}.gz</fileNamePattern>\n            <maxHistory>7</maxHistory>\n        </rollingPolicy>\n        <encoder class=\"net.logstash.logback.encoder.LoggingEventCompositeJsonEncoder\">\n            <providers>\n                <timestamp>\n                    <timeZone>UTC</timeZone>\n                </timestamp>\n                <pattern>\n                    <pattern>\n                        {\n                        \"severity\": \"%level\",\n                        \"service\": \"${springAppName:-}\",\n                        \"trace\": \"%X{X-B3-TraceId:-}\",\n                        \"span\": \"%X{X-B3-SpanId:-}\",\n                        \"parent\": \"%X{X-B3-ParentSpanId:-}\",\n                        \"exportable\": \"%X{X-Span-Export:-}\",\n                        \"pid\": \"${PID:-}\",\n                        \"thread\": \"%thread\",\n                        \"class\": \"%logger{40}\",\n                        \"rest\": \"%message\"\n                        }\n                    </pattern>\n                </pattern>\n            </providers>\n        </encoder>\n    </appender>\n\n    <appender name=\"MyBatisStatistics\" class=\"ch.qos.logback.core.rolling.RollingFileAppender\">\n        <rollingPolicy class=\"ch.qos.logback.core.rolling.TimeBasedRollingPolicy\">\n            <fileNamePattern>${LOG_FILE}.sql.%d{yyyy-MM-dd}.gz</fileNamePattern>\n            <maxHistory>10</maxHistory>\n        </rollingPolicy>\n        <encoder>\n            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36}-%msg%n</pattern>\n        </encoder>\n    </appender>\n\n    <logger name=\"com.paascloud.provider.mapper\" level=\"DEBUG\">\n        <appender-ref ref=\"MyBatisStatistics\" />\n    </logger>\n    ​\n    <root level=\"INFO\">\n        <appender-ref ref=\"console\"/>\n        <appender-ref ref=\"logstash\"/>\n        <appender-ref ref=\"flatfile\"/>\n    </root>\n</configuration>"
  },
  {
    "path": "paascloud-provider/paascloud-provider-uac/src/main/resources/mapper/UacActionMapper.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE mapper PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\" \"http://mybatis.org/dtd/mybatis-3-mapper.dtd\">\n<mapper namespace=\"com.paascloud.provider.mapper.UacActionMapper\">\n    <resultMap id=\"BaseResultMap\" type=\"com.paascloud.provider.model.domain.UacAction\">\n        <id column=\"id\" jdbcType=\"BIGINT\" property=\"id\"/>\n        <result column=\"version\" jdbcType=\"INTEGER\" property=\"version\"/>\n        <result column=\"url\" jdbcType=\"VARCHAR\" property=\"url\"/>\n        <result column=\"action_name\" jdbcType=\"VARCHAR\" property=\"actionName\"/>\n        <result column=\"action_code\" jdbcType=\"VARCHAR\" property=\"actionCode\"/>\n        <result column=\"status\" jdbcType=\"VARCHAR\" property=\"status\"/>\n        <result column=\"remark\" jdbcType=\"VARCHAR\" property=\"remark\"/>\n        <result column=\"menu_id\" jdbcType=\"BIGINT\" property=\"menuId\"/>\n        <result column=\"creator\" jdbcType=\"VARCHAR\" property=\"creator\"/>\n        <result column=\"creator_id\" jdbcType=\"BIGINT\" property=\"creatorId\"/>\n        <result column=\"created_time\" jdbcType=\"TIMESTAMP\" property=\"createdTime\"/>\n        <result column=\"last_operator\" jdbcType=\"VARCHAR\" property=\"lastOperator\"/>\n        <result column=\"last_operator_id\" jdbcType=\"BIGINT\" property=\"lastOperatorId\"/>\n        <result column=\"update_time\" jdbcType=\"TIMESTAMP\" property=\"updateTime\"/>\n    </resultMap>\n    <sql id=\"Base_Column_List\" >\n        ${alias}.id, ${alias}.version, ${alias}.url, ${alias}.action_name, ${alias}.action_code, ${alias}.status, ${alias}.remark,\n        ${alias}.menu_id, ${alias}.creator, ${alias}.creator_id, ${alias}.created_time, ${alias}.last_operator, ${alias}.last_operator_id, ${alias}.update_time\n    </sql>\n    <sql id=\"Base_Where_Condition\">\n        <if test=\"_parameter != null\" >\n            <where >\n                <if test=\"id != null\" >\n                    AND ${alias}.id = #{id,jdbcType=BIGINT}\n                </if>\n                <if test=\"version != null\" >\n                    AND ${alias}.version = #{version,jdbcType=INTEGER}\n                </if>\n                <if test=\"url != null and url !=''\" >\n                    AND ${alias}.url = #{url,jdbcType=VARCHAR}\n                </if>\n                <if test=\"actionName != null and actionName !=''\" >\n                    AND ${alias}.action_name = #{actionName,jdbcType=VARCHAR}\n                </if>\n                <if test=\"actionCode != null and actionCode !=''\" >\n                    AND ${alias}.action_code = #{actionCode,jdbcType=VARCHAR}\n                </if>\n                <if test=\"status != null and status !=''\" >\n                    AND ${alias}.status = #{status,jdbcType=VARCHAR}\n                </if>\n                <if test=\"remark != null and remark !=''\" >\n                    AND ${alias}.remark = #{remark,jdbcType=VARCHAR}\n                </if>\n                <if test=\"menuId != null\" >\n                    AND ${alias}.menu_id = #{menuId,jdbcType=BIGINT}\n                </if>\n                <if test=\"creator != null and creator !=''\" >\n                    AND ${alias}.creator = #{creator,jdbcType=VARCHAR}\n                </if>\n                <if test=\"creatorId != null\" >\n                    AND ${alias}.creator_id = #{creatorId,jdbcType=BIGINT}\n                </if>\n                <if test=\"createdTime != null\" >\n                    AND ${alias}.created_time = #{createdTime,jdbcType=TIMESTAMP}\n                </if>\n                <if test=\"lastOperator != null and lastOperator !=''\" >\n                    AND ${alias}.last_operator = #{lastOperator,jdbcType=VARCHAR}\n                </if>\n                <if test=\"lastOperatorId != null\" >\n                    AND ${alias}.last_operator_id = #{lastOperatorId,jdbcType=BIGINT}\n                </if>\n                <if test=\"updateTime != null\" >\n                    AND ${alias}.update_time = #{updateTime,jdbcType=TIMESTAMP}\n                </if>\n            </where>\n        </if>\n    </sql>\n\n    <sql id =\"Base_OrderBy_Condition\">\n        <if test=\"orderBy != null and orderBy !=''\">\n            ORDER BY ${orderBy}\n        </if>\n    </sql>\n\n    <sql id =\"Base_Set_Condition\">\n        <set >\n            <if test=\"version != null\" >\n                version = #{version,jdbcType=INTEGER},\n            </if>\n            <if test=\"url != null and url !=''\">\n                url = #{url,jdbcType=VARCHAR},\n            </if>\n            <if test=\"actionName != null and actionName !=''\" >\n                action_name = #{actionName,jdbcType=VARCHAR},\n            </if>\n            <if test=\"actionCode != null and actionCode !=''\" >\n                action_code = #{actionCode,jdbcType=VARCHAR},\n            </if>\n            <if test=\"status != null and status !=''\" >\n                status = #{status,jdbcType=VARCHAR},\n            </if>\n            <if test=\"remark != null and remark !=''\" >\n                remark = #{remark,jdbcType=VARCHAR},\n            </if>\n            <if test=\"menuId != null\" >\n                menu_id = #{menuId,jdbcType=BIGINT},\n            </if>\n            <if test=\"creator != null and creator !=''\" >\n                creator = #{creator,jdbcType=VARCHAR},\n            </if>\n            <if test=\"creatorId != null\" >\n                creator_id = #{creatorId,jdbcType=BIGINT},\n            </if>\n            <if test=\"createdTime != null\" >\n                created_time = #{createdTime,jdbcType=TIMESTAMP},\n            </if>\n            <if test=\"lastOperator != null and lastOperator !=''\" >\n                last_operator = #{lastOperator,jdbcType=VARCHAR},\n            </if>\n            <if test=\"lastOperatorId != null\" >\n                last_operator_id = #{lastOperatorId,jdbcType=BIGINT},\n            </if>\n            <if test=\"updateTime != null\" >\n                update_time = #{updateTime,jdbcType=TIMESTAMP},\n            </if>\n        </set>\n    </sql>\n    <delete id=\"batchDeleteByIdList\" parameterType=\"list\">\n        delete from pc_uac_action\n        where id in\n        <foreach collection=\"idList\" item=\"item\" index=\"index\" open=\"(\" separator=\",\" close=\")\">\n            #{item}\n        </foreach>\n    </delete>\n    <delete id=\"deleteByMenuId\">\n        delete from pc_uac_action\n        where menu_id = #{menuId}\n    </delete>\n    <select id=\"findAllPerms\" resultType=\"com.paascloud.provider.model.dto.user.Perm\">\n        select url as resource, actionCode as perm from UacAction\n    </select>\n    <select id=\"findActionCodeListByUserId\" resultType=\"java.lang.String\">\n        SELECT\n        ua.url as url\n        FROM\n        pc_uac_action ua , pc_uac_role ur, pc_uac_role_action ura,\n        pc_uac_user uu , pc_uac_role_user uru, pc_uac_menu tum\n        where\n        1=1\n        and ua.id = ura.action_id\n        and ur.id = ura.role_id\n        and uu.id = uru.user_id\n        and ur.id = uru.role_id\n        and ua.menu_id = tum.id\n        and uu.id = #{userId,jdbcType=BIGINT}\n    </select>\n    <select id=\"queryActionListWithPage\" resultType=\"com.paascloud.provider.model.vo.ActionVo\">\n        SELECT\n        <include refid=\"Base_Column_List\">\n            <property name=\"alias\" value=\"action\"></property>\n        </include>\n        ,menu.menu_name as menuName\n        FROM\n          pc_uac_action action LEFT JOIN pc_uac_menu menu\n        ON\n          action.menu_id = menu.id\n        WHERE 1=1\n        <if test=\"status != null and status != ''\">\n            AND action.status = #{status}\n        </if>\n        <if test=\"actionCode != null and actionCode != ''\">\n            AND action.action_code LIKE concat('%',#{actionCode},'%')\n        </if>\n        <if test=\"actionName != null and actionName != ''\">\n            AND action.action_name LIKE concat('%',#{actionName},'%')\n        </if>\n        <if test=\"url != null and url != ''\">\n            AND action.url LIKE concat('%',#{url},'%')\n        </if>\n        <if test=\"menuId != null and menuId != ''\">\n            AND action.menu_id LIKE concat('%',#{menuId},'%')\n        </if>\n        <include refid=\"Base_OrderBy_Condition\"></include>\n    </select>\n    <select id=\"getCheckedActionList\" parameterType=\"long\" resultType=\"java.lang.Long\">\n        select action_id as menu_id from pc_uac_role_action ra where ra.role_id = #{roleId}\n    </select>\n    <select id=\"getOwnAuthList\" resultType=\"com.paascloud.provider.model.vo.MenuVo\">\n        select m.id as id, m.pid as pid, m.menu_code as menuCode, m.menu_name as menuName from pc_uac_role_menu rm INNER JOIN pc_uac_role r on rm.role_id = r.id\n            INNER JOIN pc_uac_role_user ru on ru.role_id = r.id\n            INNER JOIN pc_uac_user u on ru.user_id = u.id\n            INNER JOIN pc_uac_menu m on rm.menu_id = m.id\n        where u.id = #{userId}\n        UNION\n        select a.id as id, a.menu_id as pid, a.action_code as menuCode, a.action_name as menuName from pc_uac_role_action ra INNER JOIN pc_uac_role r on ra.role_id = r.id\n            INNER JOIN pc_uac_role_user ru on ru.role_id = r.id\n            INNER JOIN pc_uac_user u on ru.user_id = u.id\n            INNER JOIN pc_uac_action a on ra.action_id = a.id\n        where u.id = #{userId}\n    </select>\n    <select id=\"getCheckedMenuList\" resultType=\"java.lang.Long\">\n        SELECT menu_id from pc_uac_role_menu rm where rm.role_id = #{roleId}\n    </select>\n    <select id=\"getOwnUacActionListByUserId\" resultType=\"com.paascloud.provider.model.domain.UacAction\">\n        select\n            <include refid=\"Base_Column_List\">\n                <property name=\"alias\" value=\"a\"></property>\n            </include>\n        from pc_uac_role_action ra INNER JOIN pc_uac_role r on ra.role_id = r.id\n            INNER JOIN pc_uac_role_user ru on ru.role_id = r.id\n            INNER JOIN pc_uac_user u on ru.user_id = u.id\n            INNER JOIN pc_uac_action a on ra.action_id = a.id\n        where u.id = #{userId}\n    </select>\n    <select id=\"listActionListByRoleId\" resultType=\"com.paascloud.provider.model.domain.UacAction\">\n        SELECT\n        <include refid=\"Base_Column_List\">\n            <property name=\"alias\" value=\"a\"></property>\n        </include>\n        FROM\n            pc_uac_action a\n            LEFT JOIN pc_uac_role_action ra ON a.id = ra.action_id\n            LEFT JOIN pc_uac_role r ON r.id = ra.role_id\n        WHERE\n            r.id = #{roleId, jdbcType=BIGINT}\n    </select>\n    <select id=\"listActionList\" resultType=\"com.paascloud.provider.model.domain.UacAction\">\n        SELECT\n        <include refid=\"Base_Column_List\">\n            <property name=\"alias\" value=\"a\"></property>\n        </include>\n        FROM pc_uac_action a\n        where a.menu_id in\n        <foreach collection=\"menuList\" item=\"item\" index=\"index\" open=\"(\" separator=\",\" close=\")\">\n            #{item.id}\n        </foreach>\n    </select>\n</mapper>"
  },
  {
    "path": "paascloud-provider/paascloud-provider-uac/src/main/resources/mapper/UacGroupMapper.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE mapper PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\" \"http://mybatis.org/dtd/mybatis-3-mapper.dtd\">\n<mapper namespace=\"com.paascloud.provider.mapper.UacGroupMapper\">\n    <resultMap id=\"BaseResultMap\" type=\"com.paascloud.provider.model.domain.UacGroup\">\n        <id column=\"id\" jdbcType=\"BIGINT\" property=\"id\"/>\n        <result column=\"version\" jdbcType=\"INTEGER\" property=\"version\"/>\n        <result column=\"group_code\" jdbcType=\"VARCHAR\" property=\"groupCode\"/>\n        <result column=\"group_name\" jdbcType=\"VARCHAR\" property=\"groupName\"/>\n        <result column=\"status\" jdbcType=\"INTEGER\" property=\"status\"/>\n        <result column=\"type\" jdbcType=\"VARCHAR\" property=\"type\"/>\n        <result column=\"pid\" jdbcType=\"BIGINT\" property=\"pid\"/>\n        <result column=\"level\" jdbcType=\"INTEGER\" property=\"level\"/>\n        <result column=\"leaf\" jdbcType=\"INTEGER\" property=\"leaf\"/>\n        <result column=\"contact\" jdbcType=\"VARCHAR\" property=\"contact\"/>\n        <result column=\"group_address\" jdbcType=\"VARCHAR\" property=\"groupAddress\"/>\n        <result column=\"province_name\" jdbcType=\"VARCHAR\" property=\"provinceName\"/>\n        <result column=\"province_id\" jdbcType=\"BIGINT\" property=\"provinceId\"/>\n        <result column=\"city_name\" jdbcType=\"VARCHAR\" property=\"cityName\"/>\n        <result column=\"city_id\" jdbcType=\"BIGINT\" property=\"cityId\"/>\n        <result column=\"area_name\" jdbcType=\"VARCHAR\" property=\"areaName\"/>\n        <result column=\"area_id\" jdbcType=\"BIGINT\" property=\"areaId\"/>\n        <result column=\"street_name\" jdbcType=\"VARCHAR\" property=\"streetName\"/>\n        <result column=\"detail_address\" jdbcType=\"VARCHAR\" property=\"detailAddress\"/>\n        <result column=\"street_id\" jdbcType=\"BIGINT\" property=\"streetId\"/>\n        <result column=\"contact_phone\" jdbcType=\"VARCHAR\" property=\"contactPhone\"/>\n        <result column=\"remark\" jdbcType=\"VARCHAR\" property=\"remark\"/>\n        <result column=\"creator\" jdbcType=\"VARCHAR\" property=\"creator\"/>\n        <result column=\"creator_id\" jdbcType=\"BIGINT\" property=\"creatorId\"/>\n        <result column=\"created_time\" jdbcType=\"TIMESTAMP\" property=\"createdTime\"/>\n        <result column=\"last_operator\" jdbcType=\"VARCHAR\" property=\"lastOperator\"/>\n        <result column=\"last_operator_id\" jdbcType=\"BIGINT\" property=\"lastOperatorId\"/>\n        <result column=\"update_time\" jdbcType=\"TIMESTAMP\" property=\"updateTime\"/>\n        <result column=\"number\" jdbcType=\"INTEGER\" property=\"number\"/>\n    </resultMap>\n    <sql id =\"Base_OrderBy_Condition\">\n        <if test=\"orderBy != null and orderBy !=''\">\n            ORDER BY ${orderBy}\n        </if>\n    </sql>\n    <sql id=\"Base_Column_List\">\n        g.id                 AS id                 ,\n        g.version            AS version            ,\n        g.group_code         AS group_code         ,\n        g.group_name         AS group_name         ,\n        g.status             AS status             ,\n        g.type               AS type               ,\n        g.pid                AS pid                ,\n        g.level              AS level              ,\n        g.leaf               AS leaf               ,\n        g.contact            AS contact            ,\n        g.group_address      AS group_address      ,\n        g.province_name      AS province_name      ,\n        g.province_id        AS provinceId         ,\n        g.city_name          AS city_name          ,\n        g.city_id            AS cityId             ,\n        g.area_name          AS areaName           ,\n        g.area_id            AS areaId             ,\n        g.street_name        AS street_name        ,\n        g.detail_address     AS detailDddress      ,\n        g.street_id          AS streetId           ,\n        g.contact_phone      AS contactPhone       ,\n        g.remark             AS remark             ,\n        g.creator            AS creator            ,\n        g.creator_id         AS creatorId          ,\n        g.created_time       AS createdTime        ,\n        g.last_operator      AS lastOperator       ,\n        g.last_operator_id   AS lastOperatorId     ,\n        g.update_time number AS updateTime number  ,\n    </sql>\n    <sql id=\"Base_Where_Condition\">\n        <if test=\"id != null and id !=''\" >\n            AND id = #{id,jdbcType=BIGINT}\n        </if>\n        <if test=\"version != null\" >\n            AND version = #{version,jdbcType=INTEGER}\n        </if>\n        <if test=\"groupCode != null and groupCode !=''\" >\n            AND group_code = #{groupCode,jdbcType=VARCHAR}\n        </if>\n        <if test=\"groupName != null and groupName !=''\" >\n            AND group_name = #{groupName,jdbcType=VARCHAR}\n        </if>\n        <if test=\"status != null\" >\n            AND status = #{status,jdbcType=TINYINT}\n        </if>\n        <if test=\"type != null and type !=''\" >\n            AND type = #{type,jdbcType=VARCHAR}\n        </if>\n        <if test=\"pid != null and pid !=''\" >\n            AND pid = #{pid,jdbcType=BIGINT}\n        </if>\n        <if test=\"level != null\" >\n            AND level = #{level,jdbcType=INTEGER}\n        </if>\n        <if test=\"leaf != null\" >\n            AND leaf = #{leaf,jdbcType=INTEGER}\n        </if>\n        <if test=\"contact != null and contact !=''\" >\n            AND contact = #{contact,jdbcType=VARCHAR}\n        </if>\n        <if test=\"groupAddress != null and groupAddress !=''\" >\n            AND group_address = #{groupAddress,jdbcType=VARCHAR}\n        </if>\n        <if test=\"provinceName != null and provinceName !=''\" >\n            AND province_name = #{provinceName,jdbcType=VARCHAR}\n        </if>\n        <if test=\"provinceId != null and provinceId !=''\" >\n            AND province_id = #{provinceId,jdbcType=BIGINT}\n        </if>\n        <if test=\"cityName != null and cityName !=''\" >\n            AND city_name = #{cityName,jdbcType=VARCHAR}\n        </if>\n        <if test=\"cityId != null and cityId !=''\" >\n            AND city_id = #{cityId,jdbcType=BIGINT}\n        </if>\n        <if test=\"areaName != null and areaName !=''\" >\n            AND area_name = #{areaName,jdbcType=VARCHAR}\n        </if>\n        <if test=\"areaId != null and areaId !=''\" >\n            AND area_id = #{areaId,jdbcType=BIGINT}\n        </if>\n        <if test=\"streetName != null and streetName !=''\" >\n            AND street_name = #{streetName,jdbcType=VARCHAR}\n        </if>\n        <if test=\"detailAddress != null and detailAddress !=''\" >\n            AND detail_address = #{detailAddress,jdbcType=VARCHAR}\n        </if>\n        <if test=\"streetId != null and streetId !=''\" >\n            AND street_id = #{streetId,jdbcType=BIGINT}\n        </if>\n        <if test=\"contactPhone != null and contactPhone !=''\" >\n            AND contact_phone = #{contactPhone,jdbcType=VARCHAR}\n        </if>\n        <if test=\"remark != null and remark !=''\" >\n            AND remark = #{remark,jdbcType=VARCHAR}\n        </if>\n        <if test=\"creator != null and creator !=''\" >\n            AND creator = #{creator,jdbcType=VARCHAR}\n        </if>\n        <if test=\"creatorId != null and creatorId !=''\" >\n            AND creator_id = #{creatorId,jdbcType=BIGINT}\n        </if>\n        <if test=\"createdTime != null\" >\n            AND created_time = #{createdTime,jdbcType=TIMESTAMP}\n        </if>\n        <if test=\"lastOperator != null and lastOperator !=''\" >\n            AND last_operator = #{lastOperator,jdbcType=VARCHAR}\n        </if>\n        <if test=\"lastOperatorId != null and lastOperatorId !=''\" >\n            AND last_operator_id = #{lastOperatorId,jdbcType=BIGINT}\n        </if>\n        <if test=\"updateTime != null\" >\n            AND update_time = #{updateTime,jdbcType=TIMESTAMP}\n        </if>\n        <if test=\"number != null\" >\n            AND number = #{number,jdbcType=INTEGER}\n        </if>\n    </sql>\n    <sql id =\"Base_Set_Condition\">\n        <set>\n            <if test=\"version != null\">\n                version = #{version,jdbcType=INTEGER},\n            </if>\n            <if test=\"groupCode != null\">\n                group_code = #{groupCode,jdbcType=VARCHAR},\n            </if>\n            <if test=\"groupName != null\">\n                group_name = #{groupName,jdbcType=VARCHAR},\n            </if>\n            <if test=\"status != null\">\n                status = #{status,jdbcType=TINYINT},\n            </if>\n            <if test=\"type != null\">\n                type = #{type,jdbcType=VARCHAR},\n            </if>\n            <if test=\"pid != null\">\n                pid = #{pid,jdbcType=BIGINT},\n            </if>\n            <if test=\"level != null\">\n                level = #{level,jdbcType=INTEGER},\n            </if>\n            <if test=\"leaf != null\">\n                leaf = #{leaf,jdbcType=INTEGER},\n            </if>\n            <if test=\"contact != null\">\n                contact = #{contact,jdbcType=VARCHAR},\n            </if>\n            <if test=\"groupAddress != null\">\n                group_address = #{groupAddress,jdbcType=VARCHAR},\n            </if>\n            <if test=\"provinceName != null\">\n                province_name = #{provinceName,jdbcType=VARCHAR},\n            </if>\n            <if test=\"provinceId != null\">\n                province_id = #{provinceId,jdbcType=BIGINT},\n            </if>\n            <if test=\"cityName != null\">\n                city_name = #{cityName,jdbcType=VARCHAR},\n            </if>\n            <if test=\"cityId != null\">\n                city_id = #{cityId,jdbcType=BIGINT},\n            </if>\n            <if test=\"areaName != null\">\n                area_name = #{areaName,jdbcType=VARCHAR},\n            </if>\n            <if test=\"areaId != null\">\n                area_id = #{areaId,jdbcType=BIGINT},\n            </if>\n            <if test=\"streetName != null\">\n                street_name = #{streetName,jdbcType=VARCHAR},\n            </if>\n            <if test=\"detailAddress != null\">\n                detail_address = #{detailAddress,jdbcType=VARCHAR},\n            </if>\n            <if test=\"streetId != null\">\n                street_id = #{streetId,jdbcType=BIGINT},\n            </if>\n            <if test=\"contactPhone != null\">\n                contact_phone = #{contactPhone,jdbcType=VARCHAR},\n            </if>\n            <if test=\"remark != null\">\n                remark = #{remark,jdbcType=VARCHAR},\n            </if>\n            <if test=\"creator != null\">\n                creator = #{creator,jdbcType=VARCHAR},\n            </if>\n            <if test=\"creatorId != null\">\n                creator_id = #{creatorId,jdbcType=BIGINT},\n            </if>\n            <if test=\"createdTime != null\">\n                created_time = #{createdTime,jdbcType=TIMESTAMP},\n            </if>\n            <if test=\"lastOperator != null\">\n                last_operator = #{lastOperator,jdbcType=VARCHAR},\n            </if>\n            <if test=\"lastOperatorId != null\">\n                last_operator_id = #{lastOperatorId,jdbcType=BIGINT},\n            </if>\n            <if test=\"updateTime != null\">\n                update_time = #{updateTime,jdbcType=TIMESTAMP},\n            </if>\n            <if test=\"number != null\">\n                number = #{number,jdbcType=INTEGER},\n            </if>\n        </set>\n    </sql>\n</mapper>"
  },
  {
    "path": "paascloud-provider/paascloud-provider-uac/src/main/resources/mapper/UacGroupUserMapper.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE mapper PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\" \"http://mybatis.org/dtd/mybatis-3-mapper.dtd\">\n<mapper namespace=\"com.paascloud.provider.mapper.UacGroupUserMapper\">\n    <resultMap id=\"BaseResultMap\" type=\"com.paascloud.provider.model.domain.UacGroupUser\">\n        <result column=\"group_id\" jdbcType=\"BIGINT\" property=\"groupId\"/>\n        <result column=\"user_id\" jdbcType=\"BIGINT\" property=\"userId\"/>\n    </resultMap>\n\n    <sql id=\"Base_Column_List\">\n        gu.group_id,\n        gu.user_id\n    </sql>\n\n    <update id=\"updateByUserId\" parameterType=\"uacGroupUser\">\n        update\n            pc_uac_group_user\n        set\n            group_id=#{groupId}\n        where\n            user_id=#{userId}\n    </update>\n    <delete id=\"deleteExcludeSuperMng\" parameterType=\"map\">\n        DELETE\n        FROM\n            pc_uac_group_user\n        WHERE\n            user_id IN (\n                SELECT\n                    temp.user_id\n                FROM\n                    (\n                        SELECT\n                            gu.user_id\n                        FROM\n                            `pc_uac_group_user` gu\n                            LEFT JOIN pc_uac_user u ON gu.user_id = u.id\n                        WHERE\n                            gu.group_id = #{currentGroupId}\n                            AND gu.user_id NOT IN (\n                                SELECT\n                                    ru.user_id\n                                FROM\n                                    `pc_uac_role_user` ru\n                                    LEFT JOIN pc_uac_user u ON ru.user_id = u.id\n                                WHERE\n                                    ru.role_id = #{superManagerRoleId}\n                            )\n                    ) temp\n            )\n    </delete>\n    <select id=\"getByUserId\" resultMap=\"BaseResultMap\">\n        SELECT\n        <include refid=\"Base_Column_List\"/>\n        FROM pc_uac_group_user gu\n        WHERE gu.user_id = #{userId, jdbcType=BIGINT}\n    </select>\n    <select id=\"selectGroupListByUserId\" resultType=\"uacGroup\">\n        SELECT\n        <include refid=\"Base_Column_List\"/>\n        FROM\n            pc_uac_group g, pc_uac_user u , pc_uac_group_user gu\n        where\n            1=1\n            and g.id = gu.group_id\n            and u.id = gu.user_id\n            and u.id = #{userId,jdbcType=BIGINT}\n    </select>\n    <select id=\"listByGroupId\" resultMap=\"BaseResultMap\">\n        SELECT\n        <include refid=\"Base_Column_List\"/>\n        FROM pc_uac_group_user gu\n        WHERE gu.group_id = #{groupId, jdbcType=BIGINT}\n    </select>\n</mapper>"
  },
  {
    "path": "paascloud-provider/paascloud-provider-uac/src/main/resources/mapper/UacLogMapper.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n<!DOCTYPE mapper PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\" \"http://mybatis.org/dtd/mybatis-3-mapper.dtd\" >\n<mapper namespace=\"com.paascloud.provider.mapper.UacLogMapper\">\n    <resultMap id=\"BaseResultMap\" type=\"com.paascloud.provider.model.domain.UacLog\">\n        <id column=\"id\" property=\"id\" jdbcType=\"BIGINT\"/>\n        <result column=\"group_id\" property=\"groupId\" jdbcType=\"BIGINT\"/>\n        <result column=\"group_name\" property=\"groupName\" jdbcType=\"VARCHAR\"/>\n        <result column=\"log_type\" property=\"logType\" jdbcType=\"VARCHAR\"/>\n        <result column=\"log_name\" property=\"logName\" jdbcType=\"VARCHAR\"/>\n        <result column=\"action_id\" property=\"actionId\" jdbcType=\"BIGINT\"/>\n        <result column=\"action_code\" property=\"actionCode\" jdbcType=\"VARCHAR\"/>\n        <result column=\"action_name\" property=\"actionName\" jdbcType=\"VARCHAR\"/>\n        <result column=\"os\" property=\"os\" jdbcType=\"VARCHAR\"/>\n        <result column=\"browser\" property=\"browser\" jdbcType=\"VARCHAR\"/>\n        <result column=\"ip\" property=\"ip\" jdbcType=\"VARCHAR\"/>\n        <result column=\"location\" property=\"location\" jdbcType=\"VARCHAR\"/>\n        <result column=\"mac\" property=\"mac\" jdbcType=\"VARCHAR\"/>\n        <result column=\"description\" property=\"description\" jdbcType=\"VARCHAR\"/>\n        <result column=\"request_data\" property=\"requestData\" jdbcType=\"VARCHAR\"/>\n        <result column=\"request_url\" property=\"requestUrl\" jdbcType=\"VARCHAR\"/>\n        <result column=\"response_data\" property=\"responseData\" jdbcType=\"VARCHAR\"/>\n        <result column=\"class_name\" property=\"className\" jdbcType=\"VARCHAR\"/>\n        <result column=\"method_name\" property=\"methodName\" jdbcType=\"VARCHAR\"/>\n        <result column=\"start_time\" property=\"startTime\" jdbcType=\"TIMESTAMP\"/>\n        <result column=\"end_time\" property=\"endTime\" jdbcType=\"TIMESTAMP\"/>\n        <result column=\"excute_time\" property=\"excuteTime\" jdbcType=\"BIGINT\"/>\n        <result column=\"group_id\" property=\"groupId\" jdbcType=\"BIGINT\"/>\n        <result column=\"group_name\" property=\"groupName\" jdbcType=\"VARCHAR\"/>\n        <result column=\"creator\" property=\"creator\" jdbcType=\"VARCHAR\"/>\n        <result column=\"creator_id\" property=\"creatorId\" jdbcType=\"BIGINT\"/>\n        <result column=\"created_time\" property=\"createdTime\" jdbcType=\"TIMESTAMP\"/>\n        <result column=\"last_operator\" property=\"lastOperator\" jdbcType=\"VARCHAR\"/>\n        <result column=\"last_operator_id\" property=\"lastOperatorId\" jdbcType=\"BIGINT\"/>\n        <result column=\"update_time\" property=\"updateTime\" jdbcType=\"TIMESTAMP\"/>\n    </resultMap>\n    <sql id =\"Base_OrderBy_Condition\">\n        <if test=\"orderBy != null and orderBy !=''\">\n            ORDER BY ${orderBy}\n        </if>\n    </sql>\n    <sql id=\"Base_Column_List\">\n        log.id                   AS id               ,\n        log.group_id             AS groupId          ,\n        log.group_name           AS groupName        ,\n        log.log_type             AS logType          ,\n        log.log_name             AS logName          ,\n        log.action_id            AS actionId         ,\n        log.action_code          AS actionCode       ,\n        log.action_name          AS actionName       ,\n        log.os                   AS os               ,\n        log.browser              AS browser          ,\n        log.ip                   AS ip               ,\n        log.location             AS location         ,\n        log.mac                  AS mac              ,\n        log.description          AS description      ,\n        log.request_data         AS requestData      ,\n        log.request_url          AS requestUrl       ,\n        log.response_data        AS responseData     ,\n        log.class_name           AS className        ,\n        log.method_name          AS methodName       ,\n        log.start_time           AS startTime        ,\n        log.end_time             AS endTime          ,\n        log.excute_time          AS excuteTime       ,\n        log.creator              AS creator          ,\n        log.creator_id           AS creatorId        ,\n        log.created_time         AS createdTime      ,\n        log.last_operator        AS lastOperator     ,\n        log.last_operator_id     AS lastOperatorId   ,\n        log.update_time          AS updateTime\n    </sql>\n    <sql id=\"Base_Where_Condition\">\n        <if test=\"id != null and id != ''\">\n            AND id = #{id,jdbcType=BIGINT}\n        </if>\n        <if test=\"groupId != null and groupId != ''\">\n            AND group_id = #{groupId,jdbcType=BIGINT}\n        </if>\n        <if test=\"actionId != null and actionId != ''\">\n            AND action_id = #{actionId,jdbcType=BIGINT}\n        </if>\n        <if test=\"groupName != null and groupName != ''\">\n            AND group_name = #{groupName,jdbcType=VARCHAR}\n        </if>\n        <if test=\"logType != null and logType != ''\">\n            AND log_type = #{logType,jdbcType=VARCHAR}\n        </if>\n        <if test=\"logName != null and logName != ''\">\n            AND log_name = #{logName,jdbcType=VARCHAR}\n        </if>\n        <if test=\"actionCode != null and actionCode != ''\">\n            AND action_code = #{actionCode,jdbcType=VARCHAR}\n        </if>\n        <if test=\"actionName != null and actionName != ''\">\n            AND action_name = #{actionName,jdbcType=VARCHAR}\n        </if>\n        <if test=\"os != null and os != ''\">\n            AND os = #{os,jdbcType=VARCHAR}\n        </if>\n        <if test=\"browser != null and browser != ''\">\n            AND browser = #{browser,jdbcType=VARCHAR}\n        </if>\n        <if test=\"ip != null and ip != ''\">\n            AND ip = #{ip,jdbcType=VARCHAR}\n        </if>\n        <if test=\"mac != null and mac != ''\">\n            AND mac = #{mac,jdbcType=VARCHAR}\n        </if>\n        <if test=\"description != null and description != ''\">\n            AND description = #{description,jdbcType=VARCHAR}\n        </if>\n        <if test=\"requestData != null and requestData != ''\">\n            AND request_data = #{requestData,jdbcType=VARCHAR}\n        </if>\n        <if test=\"requestUrl != null and requestUrl != ''\">\n            AND request_url = #{requestUrl,jdbcType=VARCHAR}\n        </if>\n        <if test=\"responseData != null and responseData != ''\">\n            AND response_data = #{responseData,jdbcType=VARCHAR}\n        </if>\n        <if test=\"className != null and className != ''\">\n            AND class_name = #{className,jdbcType=VARCHAR}\n        </if>\n        <if test=\"methodName != null and methodName != ''\">\n            AND method_name = #{methodName,jdbcType=VARCHAR}\n        </if>\n        <if test=\"startTime != null\">\n            AND start_time = #{startTime,jdbcType=TIMESTAMP}\n        </if>\n        <if test=\"endTime != null\">\n            AND end_time = #{endTime,jdbcType=TIMESTAMP}\n        </if>\n        <if test=\"excuteTime != null\">\n            AND excute_time = #{excuteTime,jdbcType=INTEGER}\n        </if>\n        <if test=\"creator != null and creator != ''\">\n            AND creator = #{creator,jdbcType=VARCHAR}\n        </if>\n        <if test=\"creatorId != null and creatorId != ''\">\n            AND creator_id = #{creatorId,jdbcType=BIGINT}\n        </if>\n        <if test=\"createdTime != null\">\n            AND created_time = #{createdTime,jdbcType=TIMESTAMP}\n        </if>\n        <if test=\"lastOperator != null and lastOperator != ''\">\n            AND last_operator = #{lastOperator,jdbcType=VARCHAR}\n        </if>\n        <if test=\"lastOperatorId != null and lastOperatorId != ''\">\n            AND last_operator_id = #{lastOperatorId,jdbcType=BIGINT}\n        </if>\n        <if test=\"updateTime != null\">\n            AND update_time = #{updateTime,jdbcType=TIMESTAMP}\n        </if>\n    </sql>\n    <sql id =\"Base_Set_Condition\">\n        <set>\n            <if test=\"groupId != null\">\n                group_id = #{groupId,jdbcType=BIGINT},\n            </if>\n            <if test=\"actionId != null\">\n                action_id = #{actionId,jdbcType=BIGINT},\n            </if>\n            <if test=\"groupName != null\">\n                group_name = #{groupName,jdbcType=VARCHAR},\n            </if>\n            <if test=\"logType != null\">\n                log_type = #{logType,jdbcType=VARCHAR},\n            </if>\n            <if test=\"logName != null\">\n                log_name = #{logName,jdbcType=VARCHAR},\n            </if>\n            <if test=\"actionCode != null\">\n                action_code = #{actionCode,jdbcType=VARCHAR},\n            </if>\n            <if test=\"actionName != null\">\n                action_name = #{actionName,jdbcType=VARCHAR},\n            </if>\n            <if test=\"os != null\">\n                os = #{os,jdbcType=VARCHAR},\n            </if>\n            <if test=\"browser != null\">\n                browser = #{browser,jdbcType=VARCHAR},\n            </if>\n            <if test=\"ip != null\">\n                ip = #{ip,jdbcType=VARCHAR},\n            </if>\n            <if test=\"mac != null\">\n                mac = #{mac,jdbcType=VARCHAR},\n            </if>\n            <if test=\"description != null\">\n                description = #{description,jdbcType=VARCHAR},\n            </if>\n            <if test=\"requestData != null\">\n                request_data = #{requestData,jdbcType=VARCHAR},\n            </if>\n            <if test=\"requestUrl != null\">\n                request_url = #{requestUrl,jdbcType=VARCHAR},\n            </if>\n            <if test=\"responseData != null\">\n                response_data = #{responseData,jdbcType=VARCHAR},\n            </if>\n            <if test=\"className != null\">\n                class_name = #{className,jdbcType=VARCHAR},\n            </if>\n            <if test=\"methodName != null\">\n                method_name = #{methodName,jdbcType=VARCHAR},\n            </if>\n            <if test=\"startTime != null\">\n                start_time = #{startTime,jdbcType=TIMESTAMP},\n            </if>\n            <if test=\"endTime != null\">\n                end_time = #{endTime,jdbcType=TIMESTAMP},\n            </if>\n            <if test=\"excuteTime != null\">\n                excute_time = #{excuteTime,jdbcType=INTEGER},\n            </if>\n            <if test=\"creator != null\">\n                creator = #{creator,jdbcType=VARCHAR},\n            </if>\n            <if test=\"creatorId != null\">\n                creator_id = #{creatorId,jdbcType=BIGINT},\n            </if>\n            <if test=\"createdTime != null\">\n                created_time = #{createdTime,jdbcType=TIMESTAMP},\n            </if>\n            <if test=\"lastOperator != null\">\n                last_operator = #{lastOperator,jdbcType=VARCHAR},\n            </if>\n            <if test=\"lastOperatorId != null\">\n                last_operator_id = #{lastOperatorId,jdbcType=BIGINT},\n            </if>\n            <if test=\"updateTime != null\">\n                update_time = #{updateTime,jdbcType=TIMESTAMP},\n            </if>\n        </set>\n    </sql>\n    <select id=\"selectUserLogListByUserId\" parameterType=\"long\" resultMap=\"BaseResultMap\">\n        SELECT\n            <include refid=\"Base_Column_List\"/>\n        FROM\n            pc_uac_log log\n        WHERE\n            log.creator_id = #{userId}\n        ORDER BY log.created_time desc\n    </select>\n    <select id=\"queryLogListWithPage\" resultType=\"com.paascloud.provider.model.domain.UacLog\">\n        SELECT\n        <include refid=\"Base_Column_List\"/>\n        FROM\n        pc_uac_log log\n        WHERE 1 = 1\n        <if test=\"menuId != null and menuId != ''\">\n            AND action_id in (SELECT id from pc_uac_action action where action.menu_id = #{menuId})\n        </if>\n        <if test=\"logType != null and logType != ''\">\n            AND log_type LIKE concat(#{logType}, '%')\n        </if>\n        <if test=\"actionCode != null and actionCode != ''\">\n            AND action_code LIKE concat(#{actionCode}, '%')\n        </if>\n        <if test=\"actionName != null and actionName != ''\">\n            AND action_name LIKE concat(#{actionName}, '%')\n        </if>\n        <if test=\"creator != null and creator != ''\">\n            AND creator LIKE concat(#{creator}, '%')\n        </if>\n        <if test=\"ip != null and ip != ''\">\n            AND ip LIKE concat(#{ip}, '%')\n        </if>\n        <if test=\"location != null and location != ''\">\n            AND location LIKE concat(#{location}, '%')\n        </if>\n        <if test=\"startQueryTime != null and endQueryTime != null\">\n            AND created_time BETWEEN #{startQueryTime} AND #{endQueryTime}\n        </if>\n        ORDER BY log.created_time desc\n    </select>\n</mapper>"
  },
  {
    "path": "paascloud-provider/paascloud-provider-uac/src/main/resources/mapper/UacMenuMapper.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE mapper PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\" \"http://mybatis.org/dtd/mybatis-3-mapper.dtd\">\n<mapper namespace=\"com.paascloud.provider.mapper.UacMenuMapper\">\n    <resultMap id=\"BaseResultMap\" type=\"com.paascloud.provider.model.domain.UacMenu\">\n        <id column=\"id\" jdbcType=\"BIGINT\" property=\"id\"/>\n        <result column=\"version\" jdbcType=\"INTEGER\" property=\"version\"/>\n        <result column=\"menu_code\" jdbcType=\"VARCHAR\" property=\"menuCode\"/>\n        <result column=\"menu_name\" jdbcType=\"VARCHAR\" property=\"menuName\"/>\n        <result column=\"status\" jdbcType=\"VARCHAR\" property=\"status\"/>\n        <result column=\"url\" jdbcType=\"VARCHAR\" property=\"url\"/>\n        <result column=\"icon\" jdbcType=\"VARCHAR\" property=\"icon\"/>\n        <result column=\"pid\" jdbcType=\"BIGINT\" property=\"pid\"/>\n        <result column=\"level\" jdbcType=\"INTEGER\" property=\"level\"/>\n        <result column=\"leaf\" jdbcType=\"INTEGER\" property=\"leaf\"/>\n        <result column=\"number\" jdbcType=\"INTEGER\" property=\"number\"/>\n        <result column=\"remark\" jdbcType=\"VARCHAR\" property=\"remark\"/>\n        <result column=\"application_id\" jdbcType=\"BIGINT\" property=\"applicationId\"/>\n        <result column=\"creator\" jdbcType=\"VARCHAR\" property=\"creator\"/>\n        <result column=\"creator_id\" jdbcType=\"BIGINT\" property=\"creatorId\"/>\n        <result column=\"created_time\" jdbcType=\"TIMESTAMP\" property=\"createdTime\"/>\n        <result column=\"last_operator\" jdbcType=\"VARCHAR\" property=\"lastOperator\"/>\n        <result column=\"last_operator_id\" jdbcType=\"BIGINT\" property=\"lastOperatorId\"/>\n        <result column=\"update_time\" jdbcType=\"TIMESTAMP\" property=\"updateTime\"/>\n    </resultMap>\n    <sql id =\"Base_OrderBy_Condition\">\n        <if test=\"orderBy != null and orderBy !=''\">\n            ORDER BY ${orderBy}\n        </if>\n    </sql>\n    <sql id=\"Base_Column_List\">\n        m.id as id,\n        m.version as version,\n        m.menu_code as menuCode,\n        m.menu_name as menuName,\n        m.status as status,\n        m.url as url,\n        m.icon as icon,\n        m.pid as pid,\n        m.application_id as applicationId,\n        m.level as level,\n        m.leaf as leaf,\n        m.number as number,\n        m.remark as remark,\n        m.creator as creator,\n        m.creator_id as creatorId,\n        m.created_time as createdTime,\n        m.last_operator as lastOperator,\n        m.last_operator_id as lastOpetator,\n        m.update_time as updateTime\n    </sql>\n    <sql id=\"Base_Where_Condition\">\n        <if test=\"id != null and id !=''\">\n            AND id = #{id,jdbcType=BIGINT}\n        </if>\n        <if test=\"version != null\">\n            AND version = #{version,jdbcType=INTEGER}\n        </if>\n        <if test=\"menuCode != null and menuCode !=''\">\n            AND menu_code = #{menuCode,jdbcType=VARCHAR}\n        </if>\n        <if test=\"menuName != null and menuName !=''\">\n            AND menu_name = #{menuName,jdbcType=VARCHAR}\n        </if>\n        <if test=\"status != null and status !=''\">\n            AND status = #{status,jdbcType=VARCHAR}\n        </if>\n        <if test=\"url != null and url !=''\">\n            AND url = #{url,jdbcType=VARCHAR}\n        </if>\n        <if test=\"icon != null and icon !=''\">\n            AND icon = #{icon,jdbcType=VARCHAR}\n        </if>\n        <if test=\"pid != null\">\n            AND pid = #{pid,jdbcType=BIGINT}\n        </if>\n        <if test=\"applicationId != null\">\n            AND application_id = #{applicationId,jdbcType=BIGINT}\n        </if>\n\n        <if test=\"level != null \">\n            AND level = #{level,jdbcType=INTEGER}\n        </if>\n        <if test=\"leaf != null\">\n            AND leaf = #{leaf,jdbcType=INTEGER}\n        </if>\n        <if test=\"number != null\">\n            AND number = #{number,jdbcType=INTEGER}\n        </if>\n        <if test=\"remark != null and remark !=''\">\n            AND remark = #{remark,jdbcType=VARCHAR}\n        </if>\n        <if test=\"creator != null and creator !=''\">\n            AND creator = #{creator,jdbcType=VARCHAR}\n        </if>\n        <if test=\"creatorId != null and creatorId !=''\">\n            AND creator_id = #{creatorId,jdbcType=BIGINT}\n        </if>\n        <if test=\"createdTime != null\">\n            AND created_time = #{createdTime,jdbcType=TIMESTAMP}\n        </if>\n        <if test=\"lastOperator != null and lastOperator !=''\">\n            AND last_operator = #{lastOperator,jdbcType=VARCHAR}\n        </if>\n        <if test=\"lastOperatorId != null and lastOperatorId !=''\">\n            AND last_operator_id = #{lastOperatorId,jdbcType=BIGINT}\n        </if>\n        <if test=\"updateTime != null\">\n            AND update_time = #{updateTime,jdbcType=TIMESTAMP}\n        </if>\n    </sql>\n    <sql id =\"Base_Set_Condition\">\n        <set>\n            <if test=\"version != null\">\n                version = version + 1,\n            </if>\n            <if test=\"menuCode != null\">\n                menu_code = #{menuCode,jdbcType=VARCHAR},\n            </if>\n            <if test=\"menuName != null\">\n                menu_name = #{menuName,jdbcType=VARCHAR},\n            </if>\n            <if test=\"status != null\">\n                status = #{status,jdbcType=VARCHAR},\n            </if>\n            <if test=\"url != null\">\n                url = #{url,jdbcType=VARCHAR},\n            </if>\n            <if test=\"icon != null\">\n                icon = #{icon,jdbcType=VARCHAR},\n            </if>\n            <if test=\"pid != null\">\n                pid = #{pid,jdbcType=BIGINT},\n            </if>\n            <if test=\"applicationId != null\">\n                application_id = #{applicationId,jdbcType=BIGINT},\n            </if>\n            <if test=\"level != null\">\n                level = #{level,jdbcType=INTEGER},\n            </if>\n            <if test=\"leaf != null\">\n                leaf = #{leaf,jdbcType=INTEGER},\n            </if>\n            <if test=\"number != null\">\n                number = #{number,jdbcType=INTEGER},\n            </if>\n            <if test=\"remark != null\">\n                remark = #{remark,jdbcType=VARCHAR},\n            </if>\n            <if test=\"creator != null\">\n                creator = #{creator,jdbcType=VARCHAR},\n            </if>\n            <if test=\"creatorId != null\">\n                creator_id = #{creatorId,jdbcType=BIGINT},\n            </if>\n            <if test=\"createdTime != null\">\n                created_time = #{createdTime,jdbcType=TIMESTAMP},\n            </if>\n            <if test=\"lastOperator != null\">\n                last_operator = #{lastOperator,jdbcType=VARCHAR},\n            </if>\n            <if test=\"lastOperatorId != null\">\n                last_operator_id = #{lastOperatorId,jdbcType=BIGINT},\n            </if>\n            <if test=\"updateTime != null\">\n                update_time = #{updateTime,jdbcType=TIMESTAMP},\n            </if>\n        </set>\n    </sql>\n    <select id=\"findMenuCodeListByUserId\" resultType=\"java.lang.String\">\n        SELECT DISTINCT\n        m.url as url\n        FROM\n        pc_uac_role r,  pc_uac_role_menu rm, pc_uac_menu m, pc_uac_user u , pc_uac_role_user ur\n        WHERE\n        1=1\n        and\tr.id = rm.role_id\n        and rm.menu_id = m.id\n        and u.id = ur.user_id\n        and ur.role_id = r.id\n        and u.id = #{userId,jdbcType=BIGINT}\n        order by m.id asc\n    </select>\n    <select id=\"findMenuVoListByUserId\" resultType=\"com.paascloud.provider.model.vo.MenuVo\">\n        SELECT\n        m.menu_code as menuCode,\n        m.menu_name as menuName,\n        m.url as url,\n        m.pid as pid,\n        m.id as id,\n        m.icon as icon\n        FROM\n        pc_uac_role r,  pc_uac_role_menu rm, pc_uac_menu m, pc_uac_user u , pc_uac_role_user ur\n        WHERE\n        1=1\n        and\tr.id = rm.role_id\n        and rm.menu_id = m.id\n        and u.id = ur.user_id\n        and ur.role_id = r.id\n        and u.id = #{userId,jdbcType=BIGINT}\n        and m.status='ENABLE'\n        order by  m.level asc, m.number asc\n    </select>\n    <select id=\"selectMenuList\" resultMap=\"BaseResultMap\" parameterType=\"uacUser\">\n        SELECT\n            <include refid=\"Base_Column_List\" />\n        From\n            pc_uac_menu m\n        WHERE\n            1 =1 <include refid=\"Base_Where_Condition\" />\n        <if test=\"orderBy != null and orderBy != ''\">\n            ORDER BY ${orderBy}\n        </if>\n    </select>\n    <update id=\"updateMenu\" parameterType=\"uacMenu\">\n        update pc_uac_menu\n          <include refid=\"Base_Set_Condition\"/>\n        where 1 =1\n          <include refid=\"Base_Where_Condition\"/>\n    </update>\n    <select id=\"selectMenuChildCountByPid\" resultType=\"java.lang.Integer\">\n        SELECT\n            count(1)\n        FROM\n          pc_uac_menu mp\n        INNER JOIN\n            pc_uac_menu mc ON mp.id = mc.pid\n        where\n             mp.id=#{pid,jdbcType=BIGINT}\n    </select>\n    <select id=\"selectByUrl\" resultMap=\"BaseResultMap\">\n        SELECT\n            <include refid=\"Base_Column_List\"/>\n        FROM\n            pc_uac_menu m\n        WHERE\n            m.url = #{url, jdbcType=VARCHAR}\n    </select>\n    <select id=\"listMenuListByRoleId\" resultType=\"com.paascloud.provider.model.domain.UacMenu\">\n        SELECT\n          <include refid=\"Base_Column_List\"/>\n        FROM pc_uac_menu m LEFT JOIN pc_uac_role_menu rm on m.id = rm.menu_id\n        LEFT JOIN pc_uac_role r on r.id = rm.role_id\n        where r.id = #{roleId, jdbcType=BIGINT}\n    </select>\n  <select id=\"listMenu\" resultType=\"com.paascloud.provider.model.domain.UacMenu\">\n    SELECT\n    <include refid=\"Base_Column_List\" />\n    From\n    pc_uac_menu m\n    WHERE m.id IN\n    <foreach collection=\"menuIdList\" item=\"item\" index=\"index\" open=\"(\" close=\")\" separator=\",\">\n      #{item}\n    </foreach>\n  </select>\n</mapper>"
  },
  {
    "path": "paascloud-provider/paascloud-provider-uac/src/main/resources/mapper/UacRoleActionMapper.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE mapper PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\" \"http://mybatis.org/dtd/mybatis-3-mapper.dtd\">\n<mapper namespace=\"com.paascloud.provider.mapper.UacRoleActionMapper\">\n    <resultMap id=\"BaseResultMap\" type=\"com.paascloud.provider.model.domain.UacRoleAction\">\n        <id column=\"role_id\" jdbcType=\"BIGINT\" property=\"roleId\"/>\n        <id column=\"action_id\" jdbcType=\"BIGINT\" property=\"actionId\"/>\n    </resultMap>\n    <sql id=\"Base_Column_List\">\n    </sql>\n    <sql id=\"Base_Where_Condition\">\n    </sql>\n    <sql id =\"Base_Set_Condition\">\n    </sql>\n    <delete id=\"deleteByActionId\"  parameterType=\"long\">\n        delete from pc_uac_role_action\n        where action_id = #{actionId}\n    </delete>\n  <delete id=\"deleteByRoleIdList\">\n    delete from pc_uac_role_action\n    where role_id in\n    <foreach collection=\"roleIdList\" item=\"item\" index=\"index\" open=\"(\" separator=\",\" close=\")\">\n      #{item}\n    </foreach>\n  </delete>\n</mapper>"
  },
  {
    "path": "paascloud-provider/paascloud-provider-uac/src/main/resources/mapper/UacRoleMapper.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE mapper PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\" \"http://mybatis.org/dtd/mybatis-3-mapper.dtd\">\n<mapper namespace=\"com.paascloud.provider.mapper.UacRoleMapper\">\n    <resultMap id=\"BaseResultMap\" type=\"com.paascloud.provider.model.domain.UacRole\">\n        <id column=\"id\" jdbcType=\"BIGINT\" property=\"id\"/>\n        <result column=\"version\" jdbcType=\"INTEGER\" property=\"version\"/>\n        <result column=\"role_code\" jdbcType=\"VARCHAR\" property=\"roleCode\"/>\n        <result column=\"role_name\" jdbcType=\"VARCHAR\" property=\"roleName\"/>\n        <result column=\"status\" jdbcType=\"VARCHAR\" property=\"status\"/>\n        <result column=\"remark\" jdbcType=\"VARCHAR\" property=\"remark\"/>\n        <result column=\"creator\" jdbcType=\"VARCHAR\" property=\"creator\"/>\n        <result column=\"creator_id\" jdbcType=\"BIGINT\" property=\"creatorId\"/>\n        <result column=\"created_time\" jdbcType=\"TIMESTAMP\" property=\"createdTime\"/>\n        <result column=\"last_operator\" jdbcType=\"VARCHAR\" property=\"lastOperator\"/>\n        <result column=\"last_operator_id\" jdbcType=\"BIGINT\" property=\"lastOperatorId\"/>\n        <result column=\"update_time\" jdbcType=\"TIMESTAMP\" property=\"updateTime\"/>\n    </resultMap>\n    <sql id=\"Base_Column_List\">\n        r.id AS id,\n        r.version as version,\n        r.role_code as roleCode,\n        r.role_name as roleName,\n        r.status as status,\n        r.remark as remark,\n        r.creator as creator,\n        r.creator_id as creatorId,\n        r.created_time as createdTime,\n        r.last_operator as lastOperator,\n        r.last_operator_id as lastOperatorId,\n        r.update_time as updateTime\n    </sql>\n    <sql id=\"Base_Where_Condition\">\n        <if test=\"id != null and id != ''\">\n            AND id = #{id,jdbcType=BIGINT}\n        </if>\n        <if test=\"version != null \">\n            AND version = #{version,jdbcType=INTEGER}\n        </if>\n        <if test=\"roleCode != null and roleCode != ''\">\n            AND role_code = #{roleCode,jdbcType=VARCHAR}\n        </if>\n        <if test=\"roleName != null and roleName != ''\">\n            AND role_name = #{roleName,jdbcType=VARCHAR}\n        </if>\n        <if test=\"status != null and status != ''\">\n            AND status = #{status,jdbcType=VARCHAR}\n        </if>\n        <if test=\"remark != null and remark != ''\">\n            AND remark = #{remark,jdbcType=VARCHAR}\n        </if>\n        <if test=\"creator != null and creator != ''\">\n            AND creator = #{creator,jdbcType=VARCHAR}\n        </if>\n        <if test=\"creatorId != null and creatorId != ''\">\n            AND creator_id = #{creatorId,jdbcType=BIGINT}\n        </if>\n        <if test=\"createdTime != null\">\n            AND created_time = #{createdTime,jdbcType=TIMESTAMP}\n        </if>\n        <if test=\"lastOperator != null and lastOperator != ''\">\n            AND last_operator = #{lastOperator,jdbcType=VARCHAR}\n        </if>\n        <if test=\"lastOperatorId != null and lastOperatorId != ''\">\n            AND last_operator_id = #{lastOperatorId,jdbcType=BIGINT}\n        </if>\n        <if test=\"updateTime != null\">\n            AND update_time = #{updateTime,jdbcType=TIMESTAMP}\n        </if>\n    </sql>\n    <sql id =\"Base_OrderBy_Condition\">\n        <if test=\"orderBy != null and orderBy !=''\">\n            ORDER BY ${orderBy}\n        </if>\n    </sql>\n    <sql id =\"Base_Set_Condition\">\n        <set>\n            <if test=\"version != null\">\n                version = version + 1,\n            </if>\n            <if test=\"roleCode != null\">\n                role_code = #{roleCode,jdbcType=VARCHAR},\n            </if>\n            <if test=\"roleName != null\">\n                role_name = #{roleName,jdbcType=VARCHAR},\n            </if>\n            <if test=\"status != null\">\n                status = #{status,jdbcType=VARCHAR},\n            </if>\n            <if test=\"remark != null\">\n                remark = #{remark,jdbcType=VARCHAR},\n            </if>\n            <if test=\"creator != null\">\n                creator = #{creator,jdbcType=VARCHAR},\n            </if>\n            <if test=\"creatorId != null\">\n                creator_id = #{creatorId,jdbcType=BIGINT},\n            </if>\n            <if test=\"createdTime != null\">\n                created_time = #{createdTime,jdbcType=TIMESTAMP},\n            </if>\n            <if test=\"lastOperator != null\">\n                last_operator = #{lastOperator,jdbcType=VARCHAR},\n            </if>\n            <if test=\"lastOperatorId != null\">\n                last_operator_id = #{lastOperatorId,jdbcType=BIGINT},\n            </if>\n            <if test=\"updateTime != null\">\n                update_time = #{updateTime,jdbcType=TIMESTAMP},\n            </if>\n        </set>\n    </sql>\n    <select id=\"findByRoleCode\" resultType=\"com.paascloud.provider.model.domain.UacRole\">\n        SELECT * from pc_uac_role WHERE role_code=#{roleCode,jdbcType=VARCHAR}\n    </select>\n    <select id=\"queryRoleListWithPage\" resultType=\"com.paascloud.provider.model.vo.RoleVo\">\n        SELECT\n        tur.id AS id,\n        tur.version AS version,\n        tur.role_code AS roleCode,\n        tur.role_name AS roleName,\n        tur.status AS status,\n        tur.remark AS remark,\n        tur.creator AS creator,\n        tur.creator_id AS creatorId,\n        tur.created_time AS createdTime,\n        tur.last_operator AS lastOperator,\n        tur.last_operator_id AS lastOperatorId,\n        tur.update_time AS updateTime\n        FROM pc_uac_role tur\n        WHERE 1 = 1\n        <if test=\"status != null and status != ''\">\n            AND tur.status = #{status}\n        </if>\n        <if test=\"roleCode != null and roleCode != ''\">\n            AND tur.role_code LIKE concat('%',#{roleCode},'%')\n        </if>\n        <if test=\"roleName != null and roleName != ''\">\n            AND tur.role_name LIKE concat('%',#{roleName},'%')\n        </if>\n        <include refid=\"Base_OrderBy_Condition\"></include>\n    </select>\n    <select id=\"selectAllRoleInfoByUserId\" resultMap=\"BaseResultMap\">\n        SELECT\n            r.id,\n            r.role_name,\n            r.role_code,\n            r.remark,\n            r.status\n        FROM\n            pc_uac_role r\n            LEFT JOIN pc_uac_role_user ru ON ru.role_id = r.id\n        WHERE ru.user_id = #{userId}\n    </select>\n    <select id=\"selectRoleList\" resultMap=\"BaseResultMap\" parameterType=\"uacRole\">\n        SELECT\n            <include refid=\"Base_Column_List\"/>\n        FROM\n            pc_uac_role r\n        WHERE\n            1=1 <include refid=\"Base_Where_Condition\"/>\n        <if test=\"orderBy != null and orderBy !=''\">\n            ORDER BY ${orderBy}\n        </if>\n    </select>\n    <select id=\"selectAllNeedBindUser\" parameterType=\"map\" resultType=\"com.paascloud.provider.model.dto.role.BindUserDto\">\n        SELECT\n            a.id as userId,\n            a.mobile_no as mobileNo,\n            a.user_name as userName,\n            (a.id = b.id) OR (a.id = #{currentUserId}) AS disabled\n        FROM\n            (\n                SELECT\n                    u.id,\n                    u.mobile_no,\n                    u.user_name\n                FROM pc_uac_user u) a\n            LEFT JOIN\n            (\n                SELECT\n                    u.id,\n                    u.mobile_no,\n                    u.user_name\n                FROM pc_uac_user u INNER JOIN pc_uac_role_user ru ON u.id = ru.user_id\n                    INNER JOIN pc_uac_role role ON role.id = ru.role_id\n                WHERE role.id = #{superManagerRoleId}) b\n        ON a.id = b.id\n    </select>\n    <delete id=\"batchDeleteByIdList\" parameterType=\"list\">\n        delete from pc_uac_role\n        where id in\n        <foreach collection=\"idList\" item=\"item\" index=\"index\" open=\"(\" separator=\",\" close=\")\">\n            #{item}\n        </foreach>\n    </delete>\n</mapper>"
  },
  {
    "path": "paascloud-provider/paascloud-provider-uac/src/main/resources/mapper/UacRoleMenuMapper.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE mapper PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\" \"http://mybatis.org/dtd/mybatis-3-mapper.dtd\">\n<mapper namespace=\"com.paascloud.provider.mapper.UacRoleMenuMapper\">\n    <resultMap id=\"BaseResultMap\" type=\"com.paascloud.provider.model.domain.UacRoleMenu\">\n        <id column=\"role_id\" jdbcType=\"BIGINT\" property=\"roleId\"/>\n        <id column=\"menu_id\" jdbcType=\"BIGINT\" property=\"menuId\"/>\n    </resultMap>\n    <sql id=\"Base_Column_List\">\n    </sql>\n    <sql id=\"Base_Where_Condition\">\n    </sql>\n    <sql id=\"Base_Set_Condition\">\n    </sql>\n    <insert id=\"addRoleMenuList\" parameterType=\"java.util.List\" >\n        INSERT INTO pc_uac_role_menu(role_id,menu_id) VALUES\n        <foreach collection=\"list\" item = \"rolemenu\"  separator=\",\">\n            (#{rolemenu.roleId},#{rolemenu.menuId})\n        </foreach>\n    </insert>\n  <delete id=\"deleteByRoleIdList\">\n    delete from pc_uac_role_menu\n    where role_id in\n    <foreach collection=\"roleIdList\" item=\"item\" index=\"index\" open=\"(\" separator=\",\" close=\")\">\n      #{item}\n    </foreach>\n  </delete>\n  <select id=\"countChildMenuNum\" parameterType=\"java.lang.String\" resultType=\"com.paascloud.provider.model.vo.role.MenuCountVo\">\n        SELECT\n            tum.id,\n            tum.menu_name AS menuName,\n            1             AS childNum\n        FROM\n            pc_uac_role_menu turm\n            INNER JOIN pc_uac_menu tum ON tum.id = turm.menu_id\n        WHERE\n            turm.role_id = #{roleId}\n            AND tum.LEVEL = '1'\n            AND tum.id NOT IN (\n                SELECT tum2.pid\n                FROM\n                    pc_uac_role_menu turm\n                    INNER JOIN pc_uac_menu tum ON tum.id = turm.menu_id\n                    LEFT JOIN pc_uac_menu tum2 ON tum2.pid = tum.id\n                    RIGHT JOIN pc_uac_role_menu turm2 ON turm2.menu_id = tum2.id\n                                                          AND turm2.role_id = #{roleId}\n                WHERE\n                    1 = 1\n                    AND tum.LEVEL = 1\n                    AND turm.role_id = #{roleId}\n                GROUP BY\n                    tum2.pid)\n    </select>\n</mapper>"
  },
  {
    "path": "paascloud-provider/paascloud-provider-uac/src/main/resources/mapper/UacRoleUserMapper.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE mapper PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\" \"http://mybatis.org/dtd/mybatis-3-mapper.dtd\">\n<mapper namespace=\"com.paascloud.provider.mapper.UacRoleUserMapper\">\n    <resultMap id=\"BaseResultMap\" type=\"com.paascloud.provider.model.domain.UacRoleUser\">\n        <id column=\"role_id\" jdbcType=\"BIGINT\" property=\"roleId\"/>\n        <id column=\"user_id\" jdbcType=\"BIGINT\" property=\"userId\"/>\n    </resultMap>\n    <sql id=\"Base_Column_List\">\n        role_id, user_id\n    </sql>\n    <sql id=\"Base_Where_Condition\">\n    </sql>\n    <sql id =\"Base_Set_Condition\">\n    </sql>\n\n    <delete id=\"deleteExcludeSuperMng\" parameterType=\"map\">\n        DELETE\n        FROM\n            pc_uac_role_user\n        WHERE\n            user_id IN (SELECT temp.user_id\n                        FROM (\n                                 SELECT ru.user_id\n                                 FROM\n                                     `pc_uac_role_user` ru\n                                     LEFT JOIN pc_uac_user u ON ru.user_id = u.id\n                                 WHERE\n                                     ru.role_id = #{currentRoleId}\n                                     AND ru.user_id NOT IN (\n                                         SELECT ru.user_id\n                                         FROM\n                                             `pc_uac_role_user` ru\n                                             LEFT JOIN pc_uac_user u ON ru.user_id = u.id\n                                         WHERE\n                                             ru.role_id = #{superRoleId}\n                                     )) temp\n            )\n    </delete>\n    <delete id=\"deleteByRoleId\">\n        delete from pc_uac_role_user\n        where role_id=#{roleId}\n    </delete>\n    <delete id=\"deleteByRoleIdList\">\n        delete from pc_uac_role_user\n        where role_id in\n        <foreach collection=\"roleIdList\" item=\"item\" index=\"index\" open=\"(\" separator=\",\" close=\")\">\n            #{item}\n        </foreach>\n    </delete>\n    <select id=\"getByUserIdAndRoleId\" resultMap=\"BaseResultMap\">\n        SELECT role_id, user_id from pc_uac_role_user WHERE user_id = #{userId} and role_id = #{roleId}\n    </select>\n    <select id=\"listByUserId\" resultMap=\"BaseResultMap\">\n        SELECT role_id, user_id from pc_uac_role_user WHERE user_id = #{userId}\n    </select>\n    <select id=\"listByRoleId\" resultMap=\"BaseResultMap\">\n        SELECT role_id, user_id from pc_uac_role_user WHERE role_id = #{roleId}\n    </select>\n    <select id=\"listSuperUser\" parameterType=\"long\" resultType=\"java.lang.Long\">\n        SELECT\n            ru.user_id\n        FROM\n            `pc_uac_role_user` ru\n            LEFT JOIN pc_uac_user u ON ru.user_id = u.id\n        WHERE\n            ru.role_id = #{roleId}\n    </select>\n    <select id=\"listByRoleIdList\" resultType=\"uacRoleUser\">\n        SELECT\n        <include refid=\"Base_Column_List\"/>\n        from pc_uac_role_user\n        where role_id in\n        <foreach collection=\"roleIds\" item=\"item\" index=\"index\" open=\"(\" separator=\",\" close=\")\">\n            #{item}\n        </foreach>\n    </select>\n</mapper>"
  },
  {
    "path": "paascloud-provider/paascloud-provider-uac/src/main/resources/mapper/UacUserMapper.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE mapper PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\" \"http://mybatis.org/dtd/mybatis-3-mapper.dtd\">\n<mapper namespace=\"com.paascloud.provider.mapper.UacUserMapper\">\n    <resultMap id=\"BaseResultMap\" type=\"uacUser\">\n        <id column=\"id\" jdbcType=\"BIGINT\" property=\"id\"/>\n        <result column=\"version\" jdbcType=\"INTEGER\" property=\"version\"/>\n        <result column=\"login_name\" jdbcType=\"VARCHAR\" property=\"loginName\"/>\n        <result column=\"login_pwd\" jdbcType=\"VARCHAR\" property=\"loginPwd\"/>\n        <result column=\"salt\" jdbcType=\"VARCHAR\" property=\"salt\"/>\n        <result column=\"user_code\" jdbcType=\"VARCHAR\" property=\"userCode\"/>\n        <result column=\"user_name\" jdbcType=\"VARCHAR\" property=\"userName\"/>\n        <result column=\"mobile_no\" jdbcType=\"VARCHAR\" property=\"mobileNo\"/>\n        <result column=\"email\" jdbcType=\"VARCHAR\" property=\"email\"/>\n        <result column=\"status\" jdbcType=\"VARCHAR\" property=\"status\"/>\n        <result column=\"user_source\" jdbcType=\"VARCHAR\" property=\"userSource\"/>\n        <result column=\"type\" jdbcType=\"VARCHAR\" property=\"type\"/>\n        <result column=\"last_login_ip\" jdbcType=\"VARCHAR\" property=\"lastLoginIp\"/>\n        <result column=\"last_login_location\" jdbcType=\"VARCHAR\" property=\"lastLoginLocation\"/>\n        <result column=\"remark\" jdbcType=\"VARCHAR\" property=\"remark\"/>\n        <result column=\"last_login_time\" jdbcType=\"TIMESTAMP\" property=\"lastLoginTime\"/>\n        <result column=\"is_changed_pwd\" jdbcType=\"SMALLINT\" property=\"isChangedPwd\"/>\n        <result column=\"pwd_error_count\" jdbcType=\"SMALLINT\" property=\"pwdErrorCount\"/>\n        <result column=\"pwd_error_time\" jdbcType=\"TIMESTAMP\" property=\"pwdErrorTime\"/>\n        <result column=\"creator\" jdbcType=\"VARCHAR\" property=\"creator\"/>\n        <result column=\"creator_id\" jdbcType=\"BIGINT\" property=\"creatorId\"/>\n        <result column=\"created_time\" jdbcType=\"TIMESTAMP\" property=\"createdTime\"/>\n        <result column=\"last_operator\" jdbcType=\"VARCHAR\" property=\"lastOperator\"/>\n        <result column=\"last_operator_id\" jdbcType=\"BIGINT\" property=\"lastOperatorId\"/>\n        <result column=\"update_time\" jdbcType=\"TIMESTAMP\" property=\"updateTime\"/>\n    </resultMap>\n    <sql id =\"Base_OrderBy_Condition\">\n        <if test=\"orderBy != null and orderBy !=''\">\n            ORDER BY ${orderBy}\n        </if>\n    </sql>\n    <sql id=\"Base_Column_List\">\n        u.id as id,\n        u.version as version,\n        u.login_name as loginName,\n        u.login_pwd as loginPwd,\n        u.salt as salt,\n        u.user_code as userCode,\n        u.user_name as userName,\n        u.mobile_no as mobileNo,\n        u.email as email,\n        u.status as status,\n        u.user_source as userSource,\n        u.type as type,\n        u.last_login_ip as lastLoginIp,\n        u.remark as remark,\n        u.last_login_time as lastLoginTime,\n        u.is_changed_pwd as isChangedPwd,\n        u.pwd_error_count as pwdErrorCount,\n        u.pwd_error_time as pwdErrorTime,\n        u.creator as creator,\n        u.creator_id as creatorId,\n        u.created_time as createdTime,\n        u.last_operator as lastOperator,\n        u.last_operator_id as lastOperatorId,\n        u.update_time as updateTime,\n        u.last_login_location as lastLoginLocation\n    </sql>\n    <sql id=\"Base_Set_Condition\" >\n        <set >\n            <if test=\"version != null\" >\n                version = version + 1,\n            </if>\n            <if test=\"loginName != null\" >\n                login_name = #{loginName,jdbcType=VARCHAR},\n            </if>\n            <if test=\"loginPwd != null\" >\n                login_pwd = #{loginPwd,jdbcType=VARCHAR},\n            </if>\n            <if test=\"salt != null\" >\n                salt = #{salt,jdbcType=VARCHAR},\n            </if>\n            <if test=\"userCode != null\" >\n                user_code = #{userCode,jdbcType=VARCHAR},\n            </if>\n            <if test=\"userName != null\" >\n                user_name = #{userName,jdbcType=VARCHAR},\n            </if>\n            <if test=\"mobileNo != null\" >\n                mobile_no = #{mobileNo,jdbcType=VARCHAR},\n            </if>\n            <if test=\"email != null\" >\n                email = #{email,jdbcType=VARCHAR},\n            </if>\n            <if test=\"status != null\" >\n                status = #{status,jdbcType=VARCHAR},\n            </if>\n            <if test=\"userSource != null\" >\n                user_source = #{userSource,jdbcType=VARCHAR},\n            </if>\n            <if test=\"type != null\" >\n                type = #{type,jdbcType=VARCHAR},\n            </if>\n            <if test=\"lastLoginIp != null\" >\n                last_login_ip = #{lastLoginIp,jdbcType=VARCHAR},\n            </if>\n            <if test=\"lastLoginLocation != null\" >\n                last_login_location = #{lastLoginLocation,jdbcType=VARCHAR},\n            </if>\n            <if test=\"remark != null\" >\n                remark = #{remark,jdbcType=VARCHAR},\n            </if>\n            <if test=\"lastLoginTime != null\" >\n                last_login_time = #{lastLoginTime,jdbcType=TIMESTAMP},\n            </if>\n            <if test=\"isChangedPwd != null\" >\n                is_changed_pwd = #{isChangedPwd,jdbcType=SMALLINT},\n            </if>\n            <if test=\"pwdErrorCount != null\" >\n                pwd_error_count = #{pwdErrorCount,jdbcType=SMALLINT},\n            </if>\n            <if test=\"pwdErrorTime != null\" >\n                pwd_error_time = #{pwdErrorTime,jdbcType=TIMESTAMP},\n            </if>\n            <if test=\"creator != null\" >\n                creator = #{creator,jdbcType=VARCHAR},\n            </if>\n            <if test=\"creatorId != null\" >\n                creator_id = #{creatorId,jdbcType=BIGINT},\n            </if>\n            <if test=\"createdTime != null\" >\n                created_time = #{createdTime,jdbcType=TIMESTAMP},\n            </if>\n            <if test=\"lastOperator != null\" >\n                last_operator = #{lastOperator,jdbcType=VARCHAR},\n            </if>\n            <if test=\"lastOperatorId != null\" >\n                last_operator_id = #{lastOperatorId,jdbcType=BIGINT},\n            </if>\n            <if test=\"updateTime != null\" >\n                update_time = #{updateTime,jdbcType=TIMESTAMP},\n            </if>\n        </set>\n    </sql>\n    <sql id=\"Base_Where_Condition\" >\n        <if test=\"id != null and id != ''\" >\n            AND ${alias}.id = #{id,jdbcType=BIGINT}\n        </if>\n        <if test=\"version != null\" >\n            AND ${alias}.version = #{version,jdbcType=INTEGER}\n        </if>\n        <if test=\"loginName != null and loginName != ''\" >\n            AND ${alias}.login_name = #{loginName,jdbcType=VARCHAR}\n        </if>\n        <if test=\"loginPwd != null and loginPwd != ''\" >\n            AND ${alias}.login_pwd = #{loginPwd,jdbcType=VARCHAR}\n        </if>\n        <if test=\"salt != null and salt != ''\" >\n            AND ${alias}.salt = #{salt,jdbcType=VARCHAR}\n        </if>\n        <if test=\"userCode != null and userCode != ''\" >\n            AND ${alias}.user_code = #{userCode,jdbcType=VARCHAR}\n        </if>\n        <if test=\"userName != null and userName != ''\" >\n            AND ${alias}.user_name = #{userName,jdbcType=VARCHAR}\n        </if>\n        <if test=\"mobileNo != null and mobileNo != ''\" >\n            AND ${alias}.mobile_no = #{mobileNo,jdbcType=VARCHAR}\n        </if>\n        <if test=\"email != null and email != ''\" >\n            AND ${alias}.email = #{email,jdbcType=VARCHAR}\n        </if>\n        <if test=\"status != null and status != ''\" >\n            AND ${alias}.status = #{status,jdbcType=VARCHAR}\n        </if>\n        <if test=\"userSource != null and userSource != ''\" >\n            AND ${alias}.user_source = #{userSource,jdbcType=VARCHAR}\n        </if>\n        <if test=\"type != null and type != ''\" >\n            AND ${alias}.type = #{type,jdbcType=VARCHAR}\n        </if>\n        <if test=\"lastLoginIp != null and lastLoginIp != ''\" >\n            AND ${alias}.last_login_ip = #{lastLoginIp,jdbcType=VARCHAR}\n        </if>\n        <if test=\"lastLoginLocation != null and lastLoginLocation != ''\" >\n            AND ${alias}.last_login_location = #{lastLoginLocation,jdbcType=VARCHAR}\n        </if>\n        <if test=\"remark != null and remark != ''\" >\n            AND ${alias}.remark = #{remark,jdbcType=VARCHAR}\n        </if>\n        <if test=\"lastLoginTime != null\" >\n            AND ${alias}.last_login_time = #{lastLoginTime,jdbcType=TIMESTAMP}\n        </if>\n        <if test=\"isChangedPwd != null\" >\n            AND ${alias}.is_changed_pwd = #{isChangedPwd,jdbcType=SMALLINT}\n        </if>\n        <if test=\"pwdErrorCount != null\" >\n            AND ${alias}.pwd_error_count = #{pwdErrorCount,jdbcType=SMALLINT}\n        </if>\n        <if test=\"pwdErrorTime != null\" >\n            AND ${alias}.pwd_error_time = #{pwdErrorTime,jdbcType=TIMESTAMP}\n        </if>\n        <if test=\"creator != null and creator != ''\" >\n            AND ${alias}.creator = #{creator,jdbcType=VARCHAR}\n        </if>\n        <if test=\"creatorId != null and creatorId != ''\" >\n            AND ${alias}.creator_id = #{creatorId,jdbcType=BIGINT}\n        </if>\n        <if test=\"createdTime != null\" >\n            AND ${alias}.created_time = #{createdTime,jdbcType=TIMESTAMP}\n        </if>\n        <if test=\"lastOperator != null and lastOperator != ''\" >\n            AND ${alias}.last_operator = #{lastOperator,jdbcType=VARCHAR}\n        </if>\n        <if test=\"lastOperatorId != null and lastOperatorId != ''\" >\n            AND ${alias}.last_operator_id = #{lastOperatorId,jdbcType=BIGINT}\n        </if>\n        <if test=\"updateTime != null\" >\n            AND ${alias}.update_time = #{updateTime,jdbcType=TIMESTAMP}\n        </if>\n    </sql>\n    <update id=\"updateUacUser\" parameterType=\"uacUser\">\n        update pc_uac_user\n        <include refid=\"Base_Set_Condition\"/>\n        where  id = #{id,jdbcType=BIGINT}\n    </update>\n\n    <select id=\"findByLoginName\" resultMap=\"BaseResultMap\">\n        SELECT\n          <include refid=\"Base_Column_List\"/>\n        from\n          pc_uac_user u\n        WHERE\n          u.login_name=#{loginName,jdbcType=VARCHAR}\n    </select>\n\n    <select id=\"findByMobileNo\" resultMap=\"BaseResultMap\">\n        SELECT\n          <include refid=\"Base_Column_List\"/>\n        from\n          pc_uac_user u\n        WHERE\n          u.mobile_no=#{mobileNo,jdbcType=VARCHAR}\n    </select>\n\n    <select id=\"findByLoginNameAndLoginPwd\" parameterType=\"java.util.Map\" resultMap=\"BaseResultMap\">\n        SELECT\n          <include refid=\"Base_Column_List\"/>\n        FROM\n            pc_uac_user u\n        WHERE\n          u.login_name = #{loginName,jdbcType=VARCHAR} AND u.login_pwd = #{loginPwd,jdbcType=VARCHAR}\n    </select>\n    <select id=\"selectUserList\" parameterType=\"uacUser\" resultType=\"uacUser\">\n        SELECT\n        <include refid=\"Base_Column_List\"/>, g.id as groupId, g.group_name as groupName\n        FROM\n          pc_uac_user u\n        LEFT JOIN pc_uac_group_user gu ON gu.user_id = u.id\n        LEFT JOIN pc_uac_group g ON g.id = gu.group_id\n        WHERE 1 = 1\n        <include refid=\"Base_Where_Condition\">\n            <property name=\"alias\" value=\"u\"></property>\n        </include>\n        <include refid=\"Base_OrderBy_Condition\">\n            <property name=\"alias\" value=\"u\"></property>\n        </include>\n    </select>\n    <select id=\"selectUserInfoByUserId\" resultType=\"uacUser\">\n        SELECT\n        <include refid=\"Base_Column_List\"/>,\n        g.id as groupId,\n        g.group_name as groupName\n        FROM\n            pc_uac_user u\n            LEFT JOIN pc_uac_group_user gu on u.id = gu.user_id\n            LEFT JOIN pc_uac_group g on gu.group_id = g.id\n        WHERE u.id = #{userId}\n    </select>\n    <select id=\"selectAllNeedBindRole\" parameterType=\"long\" resultType=\"com.paascloud.provider.model.dto.user.BindRoleDto\">\n        SELECT\n            r.id as roleId,\n            r.role_code as roleCode,\n            r.role_name as roleName,\n            (r.id = #{superManagerRoleId}) AS disabled\n        FROM pc_uac_role r\n    </select>\n  <select id=\"findUserInfoByLoginName\" resultType=\"com.paascloud.provider.model.domain.UacUser\">\n    SELECT\n    <include refid=\"Base_Column_List\"/>,\n    g.id as groupId,\n    g.group_name as groupName\n    FROM\n    pc_uac_user u\n    LEFT JOIN pc_uac_group_user gu on u.id = gu.user_id\n    LEFT JOIN pc_uac_group g on gu.group_id = g.id\n    WHERE u.login_name = #{loginName}\n  </select>\n</mapper>"
  },
  {
    "path": "paascloud-provider/paascloud-provider-uac/src/main/resources/mapper/UacUserMenuMapper.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n<!DOCTYPE mapper PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\" \"http://mybatis.org/dtd/mybatis-3-mapper.dtd\" >\n<mapper namespace=\"com.paascloud.provider.mapper.UacUserMenuMapper\">\n    <resultMap id=\"BaseResultMap\" type=\"com.paascloud.provider.model.domain.UacUserMenu\">\n        <result column=\"user_id\" property=\"userId\" jdbcType=\"BIGINT\"/>\n        <result column=\"menu_id\" property=\"menuId\" jdbcType=\"VARCHAR\"/>\n        <result column=\"number\" property=\"number\" jdbcType=\"INTEGER\"/>\n    </resultMap>\n</mapper>"
  },
  {
    "path": "paascloud-provider/paascloud-provider-uac/src/main/resources/mapper/UacUserTokenMapper.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE mapper PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\" \"http://mybatis.org/dtd/mybatis-3-mapper.dtd\">\n<mapper namespace=\"com.paascloud.provider.mapper.UacUserTokenMapper\">\n    <resultMap id=\"BaseResultMap\" type=\"com.paascloud.provider.model.domain.UacUserToken\">\n        <id column=\"id\" jdbcType=\"BIGINT\" property=\"id\"/>\n        <result column=\"version\" jdbcType=\"INTEGER\" property=\"version\"/>\n        <result column=\"pid\" jdbcType=\"BIGINT\" property=\"pid\"/>\n        <result column=\"login_name\" jdbcType=\"VARCHAR\" property=\"loginName\"/>\n        <result column=\"user_name\" jdbcType=\"VARCHAR\" property=\"userName\"/>\n        <result column=\"user_id\" jdbcType=\"BIGINT\" property=\"userId\"/>\n        <result column=\"os\" property=\"os\" jdbcType=\"VARCHAR\"/>\n        <result column=\"browser\" property=\"browser\" jdbcType=\"VARCHAR\"/>\n        <result column=\"login_ip\" jdbcType=\"VARCHAR\" property=\"loginIp\"/>\n        <result column=\"login_location\" jdbcType=\"VARCHAR\" property=\"loginLocation\"/>\n        <result column=\"access_token\" jdbcType=\"VARCHAR\" property=\"accessToken\"/>\n        <result column=\"refresh_token\" jdbcType=\"VARCHAR\" property=\"refreshToken\"/>\n        <result column=\"access_token_validity\" jdbcType=\"INTEGER\" property=\"accessTokenValidity\"/>\n        <result column=\"refresh_token_validity\" jdbcType=\"INTEGER\" property=\"refreshTokenValidity\"/>\n        <result column=\"status\" jdbcType=\"INTEGER\" property=\"status\"/>\n        <result column=\"creator\" jdbcType=\"VARCHAR\" property=\"creator\"/>\n        <result column=\"creator_id\" jdbcType=\"BIGINT\" property=\"creatorId\"/>\n        <result column=\"created_time\" jdbcType=\"TIMESTAMP\" property=\"createdTime\"/>\n        <result column=\"last_operator\" jdbcType=\"VARCHAR\" property=\"lastOperator\"/>\n        <result column=\"last_operator_id\" jdbcType=\"BIGINT\" property=\"lastOperatorId\"/>\n        <result column=\"update_time\" jdbcType=\"TIMESTAMP\" property=\"updateTime\"/>\n        <result column=\"login_time\" jdbcType=\"TIMESTAMP\" property=\"loginTime\"/>\n        <result column=\"group_id\" property=\"groupId\" jdbcType=\"BIGINT\"/>\n        <result column=\"group_name\" property=\"groupName\" jdbcType=\"VARCHAR\"/>\n    </resultMap>\n    <sql id=\"Base_Column_List\">\n        id, version, pid, login_name, user_name, user_id, login_ip, login_location, access_token,\n        refresh_token, access_token_validity, refresh_token_validity, status, creator, creator_id,\n        created_time, last_operator, last_operator_id, update_time, os, browser, login_time, group_id, group_name\n    </sql>\n    <select id=\"selectTokenList\" resultType=\"com.paascloud.provider.model.domain.UacUserToken\">\n\n        SELECT\n        <include refid=\"Base_Column_List\"/>,\n        (access_token_validity - TIMESTAMPDIFF(SECOND, created_time, NOW())) as expiresIn\n        from\n        pc_uac_user_token\n        where\n        1 = 1\n        <if test=\"status != null\">\n            and status = #{status,jdbcType=INTEGER}\n        </if>\n        <if test=\"status != null and status == 0\">\n            and TIMESTAMPDIFF(SECOND, created_time, NOW()) &lt; access_token_validity\n        </if>\n        <if test=\"loginName != null and loginName != ''\">\n            and login_name LIKE concat(#{loginName}, '%')\n        </if>\n        <if test=\"userName != null and userName != ''\">\n            and user_name LIKE concat(#{userName}, '%')\n        </if>\n    </select>\n  <select id=\"listOffLineTokenId\" resultType=\"java.lang.Long\">\n    SELECT id FROM pc_uac_user_token WHERE TIMESTAMPDIFF(SECOND, created_time, NOW()) > access_token_validity AND status in (0,10);\n  </select>\n\n  <update id=\"batchUpdateTokenOffLine\">\n    UPDATE pc_uac_user_token SET `status` = #{status}\n    WHERE id IN\n    <foreach collection=\"tokenIdList\" item=\"item\" index=\"index\" open=\"(\" close=\")\" separator=\",\">\n      #{item}\n    </foreach>\n  </update>\n</mapper>"
  },
  {
    "path": "paascloud-provider/paascloud-provider-uac/src/main/resources/org/springframework/security/messages_zh_CN.properties",
    "content": "AbstractAccessDecisionManager.accessDenied=\\u4E0D\\u5141\\u8BB8\\u8BBF\\u95EE\nAbstractLdapAuthenticationProvider.emptyPassword=\\u5BC6\\u7801\\u4E0D\\u80FD\\u4E3A\\u7A7A\nAbstractSecurityInterceptor.authenticationNotFound=\\u672A\\u5728SecurityContext\\u4E2D\\u67E5\\u627E\\u5230\\u8BA4\\u8BC1\\u5BF9\\u8C61\nAbstractUserDetailsAuthenticationProvider.badCredentials=\\u7528\\u6237\\u540D\\u4E0D\\u5B58\\u5728\\u6216\\u8005\\u5BC6\\u7801\\u9519\\u8BEF\nAbstractUserDetailsAuthenticationProvider.credentialsExpired=\\u7528\\u6237\\u51ED\\u8BC1\\u5DF2\\u8FC7\\u671F\nAbstractUserDetailsAuthenticationProvider.disabled=\\u7528\\u6237\\u672A\\u6FC0\\u6D3B\nAbstractUserDetailsAuthenticationProvider.expired=\\u7528\\u6237\\u5E10\\u53F7\\u5DF2\\u8FC7\\u671F\nAbstractUserDetailsAuthenticationProvider.locked=\\u7528\\u6237\\u5E10\\u53F7\\u5DF2\\u88AB\\u9501\\u5B9A\nAbstractUserDetailsAuthenticationProvider.onlySupports=\\u4EC5\\u4EC5\\u652F\\u6301UsernamePasswordAuthenticationToken\nAccountStatusUserDetailsChecker.credentialsExpired=\\u7528\\u6237\\u51ED\\u8BC1\\u5DF2\\u8FC7\\u671F\nAccountStatusUserDetailsChecker.disabled=\\u7528\\u6237\\u672A\\u6FC0\\u6D3B\nAccountStatusUserDetailsChecker.expired=\\u7528\\u6237\\u5E10\\u53F7\\u5DF2\\u8FC7\\u671F\nAccountStatusUserDetailsChecker.locked=\\u7528\\u6237\\u5E10\\u53F7\\u5DF2\\u88AB\\u9501\\u5B9A\nAclEntryAfterInvocationProvider.noPermission=\\u7ED9\\u5B9A\\u7684Authentication\\u5BF9\\u8C61({0})\\u6839\\u672C\\u65E0\\u6743\\u64CD\\u63A7\\u9886\\u57DF\\u5BF9\\u8C61({1})\nAnonymousAuthenticationProvider.incorrectKey=\\u5C55\\u793A\\u7684AnonymousAuthenticationToken\\u4E0D\\u542B\\u6709\\u9884\\u671F\\u7684key\nBindAuthenticator.badCredentials=\\u574F\\u7684\\u51ED\\u8BC1\nBindAuthenticator.emptyPassword=\\u5BC6\\u7801\\u4E0D\\u80FD\\u4E3A\\u7A7A\nCasAuthenticationProvider.incorrectKey=\\u5C55\\u793A\\u7684CasAuthenticationToken\\u4E0D\\u542B\\u6709\\u9884\\u671F\\u7684key\nCasAuthenticationProvider.noServiceTicket=\\u672A\\u80FD\\u591F\\u6B63\\u786E\\u63D0\\u4F9B\\u5F85\\u9A8C\\u8BC1\\u7684CAS\\u670D\\u52A1\\u7968\\u6839\nConcurrentSessionControlAuthenticationStrategy.exceededAllowed=\\u5DF2\\u7ECF\\u8D85\\u8FC7\\u4E86\\u5F53\\u524D\\u4E3B\\u4F53({0})\\u88AB\\u5141\\u8BB8\\u7684\\u6700\\u5927\\u4F1A\\u8BDD\\u6570\\u91CF\nDigestAuthenticationFilter.incorrectRealm=\\u54CD\\u5E94\\u7ED3\\u679C\\u4E2D\\u7684Realm\\u540D\\u5B57({0})\\u540C\\u7CFB\\u7EDF\\u6307\\u5B9A\\u7684Realm\\u540D\\u5B57({1})\\u4E0D\\u543B\\u5408\nDigestAuthenticationFilter.incorrectResponse=\\u9519\\u8BEF\\u7684\\u54CD\\u5E94\\u7ED3\\u679C\nDigestAuthenticationFilter.missingAuth=\\u9057\\u6F0F\\u4E86\\u9488\\u5BF9'auth' QOP\\u7684\\u3001\\u5FC5\\u987B\\u7ED9\\u5B9A\\u7684\\u6458\\u8981\\u53D6\\u503C; \\u63A5\\u6536\\u5230\\u7684\\u5934\\u4FE1\\u606F\\u4E3A{0}\nDigestAuthenticationFilter.missingMandatory=\\u9057\\u6F0F\\u4E86\\u5FC5\\u987B\\u7ED9\\u5B9A\\u7684\\u6458\\u8981\\u53D6\\u503C; \\u63A5\\u6536\\u5230\\u7684\\u5934\\u4FE1\\u606F\\u4E3A{0}\nDigestAuthenticationFilter.nonceCompromised=Nonce\\u4EE4\\u724C\\u5DF2\\u7ECF\\u5B58\\u5728\\u95EE\\u9898\\u4E86\\uFF0C{0}\nDigestAuthenticationFilter.nonceEncoding=Nonce\\u672A\\u7ECF\\u8FC7Base64\\u7F16\\u7801; \\u76F8\\u5E94\\u7684nonce\\u53D6\\u503C\\u4E3A {0}\nDigestAuthenticationFilter.nonceExpired=Nonce\\u5DF2\\u7ECF\\u8FC7\\u671F/\\u8D85\\u65F6\nDigestAuthenticationFilter.nonceNotNumeric=Nonce\\u4EE4\\u724C\\u7684\\u7B2C1\\u90E8\\u5206\\u5E94\\u8BE5\\u662F\\u6570\\u5B57\\uFF0C\\u4F46\\u7ED3\\u679C\\u5374\\u662F{0}\nDigestAuthenticationFilter.nonceNotTwoTokens=Nonce\\u5E94\\u8BE5\\u7531\\u4E24\\u90E8\\u5206\\u53D6\\u503C\\u6784\\u6210\\uFF0C\\u4F46\\u7ED3\\u679C\\u5374\\u662F{0}\nDigestAuthenticationFilter.usernameNotFound=\\u7528\\u6237\\u540D{0}\\u672A\\u627E\\u5230\nJdbcDaoImpl.noAuthority=\\u6CA1\\u6709\\u4E3A\\u7528\\u6237{0}\\u6307\\u5B9A\\u89D2\\u8272\nJdbcDaoImpl.notFound=\\u672A\\u627E\\u5230\\u7528\\u6237{0}\nLdapAuthenticationProvider.badCredentials=\\u574F\\u7684\\u51ED\\u8BC1\nLdapAuthenticationProvider.credentialsExpired=\\u7528\\u6237\\u51ED\\u8BC1\\u5DF2\\u8FC7\\u671F\nLdapAuthenticationProvider.disabled=\\u7528\\u6237\\u672A\\u6FC0\\u6D3B\nLdapAuthenticationProvider.expired=\\u7528\\u6237\\u5E10\\u53F7\\u5DF2\\u8FC7\\u671F\nLdapAuthenticationProvider.locked=\\u7528\\u6237\\u5E10\\u53F7\\u5DF2\\u88AB\\u9501\\u5B9A\nLdapAuthenticationProvider.emptyUsername=\\u7528\\u6237\\u540D\\u4E0D\\u5141\\u8BB8\\u4E3A\\u7A7A\nLdapAuthenticationProvider.onlySupports=\\u4EC5\\u4EC5\\u652F\\u6301UsernamePasswordAuthenticationToken\nPasswordComparisonAuthenticator.badCredentials=\\u574F\\u7684\\u51ED\\u8BC1\n#PersistentTokenBasedRememberMeServices.cookieStolen=Invalid remember-me token (Series/token) mismatch. Implies previous cookie theft attack.\nProviderManager.providerNotFound=\\u672A\\u67E5\\u627E\\u5230\\u9488\\u5BF9{0}\\u7684AuthenticationProvider\nRememberMeAuthenticationProvider.incorrectKey=\\u5C55\\u793ARememberMeAuthenticationToken\\u4E0D\\u542B\\u6709\\u9884\\u671F\\u7684key\nRunAsImplAuthenticationProvider.incorrectKey=\\u5C55\\u793A\\u7684RunAsUserToken\\u4E0D\\u542B\\u6709\\u9884\\u671F\\u7684key\nSubjectDnX509PrincipalExtractor.noMatching=\\u672A\\u5728subjectDN\\: {0}\\u4E2D\\u627E\\u5230\\u5339\\u914D\\u7684\\u6A21\\u5F0F\nSwitchUserFilter.noCurrentUser=\\u4E0D\\u5B58\\u5728\\u5F53\\u524D\\u7528\\u6237\nSwitchUserFilter.noOriginalAuthentication=\\u4E0D\\u80FD\\u591F\\u67E5\\u627E\\u5230\\u539F\\u5148\\u7684\\u5DF2\\u8BA4\\u8BC1\\u5BF9\\u8C61\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-uac/src/main/resources/static/index.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n<meta charset=\"UTF-8\">\n<title>SSO Client1</title>\n</head>\n<body>\n\t<h1>SSO Demo Client1</h1>\n\t<a href=\"http://127.0.0.1:7979/browser/index.html\">访问Browser</a>\n</body>\n</html>"
  },
  {
    "path": "paascloud-provider/paascloud-provider-uac/src/main/resources/templates/email/activeUserSuccessTemplate.ftl",
    "content": "<html>\n<body>\n<h3>尊敬的,  ${loginName}, 您好!</h3>\n\n欢迎加入快乐学习网！\n\n您在快乐学习网注册用户已激活成功。\n\n欢迎您使用paascloud快乐学习网, 祝您生活愉快.\n\n如果您有任何问题或建议, 请发送邮件到：paascloud.net@gmail.com\n\npaascloud.net\n${dateTime}\n\n</body>\n</html>"
  },
  {
    "path": "paascloud-provider/paascloud-provider-uac/src/main/resources/templates/email/activeUserTemplate.ftl",
    "content": "<html>\n<body>\n<h3>尊敬的,  ${loginName}, 您好!</h3>\n\n感谢您注册快乐学习网，点击下面按钮以验证你的电子邮箱\n\n<a href=\"${activeUserUrl}\">验证电子邮箱</a>\n\n如果你无法通过上面按钮验证电子邮箱，请点击下面的链接或者把它复制到浏览器地址栏。\n\n${activeUserUrl}\n\n\n欢迎您使用paascloud快乐学习网, 祝您生活愉快.\n\n如果您有任何问题或建议, 请发送邮件到：paascloud.net@gmail.com\n\npaascloud.net\n${dateTime}\n\n</body>\n</html>"
  },
  {
    "path": "paascloud-provider/paascloud-provider-uac/src/main/resources/templates/email/sendRestLoginPwdSuccessTemplate.ftl",
    "content": "<html>\n<body>\n    <h3>尊敬的,  ${loginName}, 您好!</h3>\n\n    重置密码成功新密码是${newLoginPwd}。\n\n    欢迎您使用paascloud快乐学习网, 祝您生活愉快。\n\n    如果您有任何问题或建议, 请发送邮件到：paascloud.net@gmail.com\n\n    paascloud.net\n    ${dateTime}\n</body>\n</html>"
  },
  {
    "path": "paascloud-provider/paascloud-provider-uac/src/main/resources/templates/email/sendRestLoginPwdTemplate.ftl",
    "content": "<html>\n<body>\n    <h3>尊敬的,  ${loginName}, 您好!</h3>\n\n    点击下面按钮以验证你的电子邮箱\n\n    <a href=\"${resetPwdUrl}\">重置密码</a>\n\n    如果你无法通过上面按钮验证电子邮箱，请点击下面的链接或者把它复制到浏览器地址栏。\n\n    ${resetPwdUrl}\n\n\n    如果你没有请求重置密码，请忽略这封邮件.\n\n    在你点击上面链接修改密码之前，你的密码将会保持不变.\n\n    欢迎您使用paascloud快乐学习网, 祝您生活愉快.\n\n    如果您有任何问题或建议, 请发送邮件到：paascloud.net@gmail.com\n\n    paascloud.net\n    ${dateTime}\n\n</body>\n</html>"
  },
  {
    "path": "paascloud-provider/paascloud-provider-uac/src/main/resources/templates/email/sendRestPwdCodeTemplate.ftl",
    "content": "<html>\n<body>\n    <h3>尊敬的,  ${loginName}, 您好!</h3>\n\n    您正在利用邮箱 ${email} 进行用户认证。此操作的验证码是${emailCode}, 请将该验证码回填到验证页面, 完成身份验证, 10分钟内有效。\n\n\n    欢迎您使用paascloud快乐学习网, 祝您生活愉快。\n\n    如果您有任何问题或建议, 请发送邮件到：paascloud.net@gmail.com\n\n    paascloud.net\n    ${dateTime}\n</body>\n</html>"
  },
  {
    "path": "paascloud-provider/paascloud-provider-uac/src/main/resources/templates/email/sendRestUserEmailTemplate.ftl",
    "content": "<html>\n<body>\n    <h3>尊敬的， ${loginName}, 您好!</h3>\n\n    您正在利用邮箱 ${email} 进行修改用户信息操作。此操作的验证码是${emailCode}，请将该验证码回填到验证页面，完成身份验证, 10分钟内有效。\n\n\n    欢迎您使用paascloud快乐学习网，祝您生活愉快。\n\n    如果您有任何问题或建议，请发送邮件到：paascloud.net@gmail.com\n\n    paascloud.net\n    ${dateTime}\n</body>\n</html>"
  },
  {
    "path": "paascloud-provider/paascloud-provider-uac/src/test/java/com/paascloud/provider/MD5Test.java",
    "content": "package com.paascloud.provider;\n\nimport com.paascloud.provider.utils.Md5Util;\nimport lombok.extern.slf4j.Slf4j;\nimport org.springframework.security.authentication.encoding.Md5PasswordEncoder;\nimport org.springframework.security.authentication.encoding.ShaPasswordEncoder;\nimport org.springframework.security.crypto.keygen.KeyGenerators;\n\n\n/**\n * The class Md 5 test.\n * @author paascloud.net@gmail.com\n */\n@Slf4j\npublic class MD5Test {\n\t/**\n\t * Md 5.\n\t */\n\tprivate static void md5() {\n\t\tMd5PasswordEncoder md5 = new Md5PasswordEncoder();\n\t\t// false 表示：生成32位的Hex版, 这也是encodeHashAsBase64的, Acegi 默认配置; true  表示：生成24位的Base64版     \n\t\tmd5.setEncodeHashAsBase64(false);\n\t\tString pwd = md5.encodePassword(\"123456\", null);\n\t\tlog.info(\"MD5: \" + pwd + \" len=\" + pwd.length());\n\t}\n\n\t/**\n\t * Sha 256.\n\t *\n\t */\n\tprivate static void sha_256() {\n\t\tShaPasswordEncoder sha = new ShaPasswordEncoder(256);\n\t\tsha.setEncodeHashAsBase64(true);\n\t\tString pwd = sha.encodePassword(\"123456\", null);\n\t\tlog.info(\"哈希算法 256: \" + pwd + \" len=\" + pwd.length());\n\t}\n\n\n\t/**\n\t * Sha sha 256.\n\t */\n\tprivate static void sha_SHA_256() {\n\t\tShaPasswordEncoder sha = new ShaPasswordEncoder();\n\t\tsha.setEncodeHashAsBase64(false);\n\t\tString pwd = sha.encodePassword(\"123456\", null);\n\t\tlog.info(\"哈希算法 SHA-256: \" + pwd + \" len=\" + pwd.length());\n\t}\n\n\n\t/**\n\t * Md 5 system wide salt source.\n\t */\n\tprivate static void md5_SystemWideSaltSource() {\n\t\tMd5PasswordEncoder md5 = new Md5PasswordEncoder();\n\t\tmd5.setEncodeHashAsBase64(false);\n\n\t\t// 使用动态加密盐的只需要在注册用户的时候将第二个参数换成用户名即可     \n\t\tString pwd = md5.encodePassword(\"123456\", \"acegisalt\");\n\t\tlog.info(\"MD5 SystemWideSaltSource: \" + pwd + \" len=\" + pwd.length());\n\t}\n\n\t/**\n\t * The entry point of application.\n\t *\n\t * @param args the input arguments\n\t *\n\t */\n\tpublic static void main(String[] args) {\n\t\tmd5(); // 使用简单的MD5加密方式     \n\n\t\tsha_256(); // 使用256的哈希算法(SHA)加密     \n\n\t\tsha_SHA_256(); // 使用SHA-256的哈希算法(SHA)加密     \n\n\t\tmd5_SystemWideSaltSource(); // 使用MD5再加全局加密盐加密的方式加密\n\t\tString salt = KeyGenerators.string().generateKey();\n\t\tlog.info(salt);\n\t\tlog.info(\"salt.length={}\", salt.length());\n\t\tString encrypt = Md5Util.encrypt(\"123456\");\n\t\tlog.info(encrypt);\n\t}\n\n}  "
  },
  {
    "path": "paascloud-provider/paascloud-provider-uac/src/test/java/com/paascloud/provider/MybatisGenerator.java",
    "content": "package com.paascloud.provider;\n\nimport com.sun.tools.corba.se.idl.Generator;\nimport org.mybatis.generator.api.MyBatisGenerator;\nimport org.mybatis.generator.config.Configuration;\nimport org.mybatis.generator.config.xml.ConfigurationParser;\nimport org.mybatis.generator.internal.DefaultShellCallback;\n\nimport java.util.ArrayList;\nimport java.util.List;\n\n\n/**\n * The class Mybatis generator.\n * @author paascloud.net@gmail.com\n */\npublic class MybatisGenerator {\n\n\t/**\n\t * The entry point of application.\n\t *\n\t * @param args the input arguments\n\t *\n\t * @throws Exception the exception\n\t */\n\tpublic static void main(String[] args) throws Exception {\n\t\tList<String> warnings = new ArrayList<>();\n\t\tConfigurationParser cp = new ConfigurationParser(warnings);\n\t\tConfiguration config = cp.parseConfiguration(\n\t\t\t\tGenerator.class.getResourceAsStream(\"/generator/generatorConfig.xml\"));\n\t\tDefaultShellCallback callback = new DefaultShellCallback(true);\n\t\tMyBatisGenerator myBatisGenerator = new MyBatisGenerator(config, callback, warnings);\n\t\tmyBatisGenerator.generate(null);\n\t}\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-uac/src/test/java/com/paascloud/provider/PaasCloudUacApplicationTests.java",
    "content": "package com.paascloud.provider;\n\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\nimport org.springframework.boot.test.context.SpringBootTest;\nimport org.springframework.test.context.junit4.SpringRunner;\n\n@RunWith(SpringRunner.class)\n@SpringBootTest\npublic class PaasCloudUacApplicationTests {\n\tprotected final Logger logger = LoggerFactory.getLogger(this.getClass());\n\t@Test\n\tpublic void contextLoads() {\n\n\t}\n\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-uac/src/test/java/com/paascloud/provider/UacMenuServiceTest.java",
    "content": "package com.paascloud.provider;\n\nimport com.paascloud.provider.model.vo.MenuVo;\nimport com.paascloud.provider.service.UacMenuService;\nimport org.junit.Test;\n\nimport javax.annotation.Resource;\nimport java.util.List;\n\npublic class UacMenuServiceTest extends PaasCloudUacApplicationTests {\n\t@Resource\n\tprivate UacMenuService uacMenuService;\n\n\t@Test\n\tpublic void findMenuListByUserIdTest() {\n\t\tList<MenuVo> menuVoListByUserId = uacMenuService.getMenuVoList(1L, 1L);\n\t\tlogger.info(\"findByLoginNameTest = {}\", menuVoListByUserId);\n\t}\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-uac/src/test/java/com/paascloud/provider/UacRoleServiceTest.java",
    "content": "package com.paascloud.provider;\n\nimport com.paascloud.base.constant.GlobalConstant;\nimport com.paascloud.provider.model.domain.UacRole;\nimport com.paascloud.provider.service.UacRoleService;\nimport org.junit.Test;\n\nimport javax.annotation.Resource;\n\n\n/**\n * The class Uac role service test.\n * @author paascloud.net@gmail.com\n */\npublic class UacRoleServiceTest extends PaasCloudUacApplicationTests {\n\t@Resource\n\tprivate UacRoleService uacRoleService;\n\n\t/**\n\t * Find by login name test.\n\t */\n\t@Test\n\tpublic void findByLoginNameTest() {\n\t\tUacRole admin = uacRoleService.findByRoleCode(GlobalConstant.Sys.SUPER_MANAGER_LOGIN_NAME);\n\t\tlogger.info(\"findByLoginNameTest = {}\", admin);\n\t}\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-uac/src/test/java/com/paascloud/provider/UacUserServiceTest.java",
    "content": "package com.paascloud.provider;\n\nimport com.github.pagehelper.PageInfo;\nimport com.paascloud.provider.model.domain.UacUser;\nimport com.paascloud.provider.service.UacUserService;\nimport org.junit.Test;\n\nimport javax.annotation.Resource;\nimport java.util.List;\n\n\n/**\n * The class Uac user service test.\n * @author paascloud.net@gmail.com\n */\npublic class UacUserServiceTest extends PaasCloudUacApplicationTests {\n\t@Resource\n\tprivate UacUserService uacUserService;\n\n\t/**\n\t * Find by login name test.\n\t */\n\t@Test\n\tpublic void findByLoginNameTest() {\n\t\tList<UacUser> uacUsers = uacUserService.selectAll();\n\t\tlogger.info(\"findByLoginNameTest = {}\", uacUsers);\n\t}\n\n\t/**\n\t * Query user list with page test.\n\t */\n\t@Test\n\tpublic void queryUserListWithPageTest() {\n\t\tPageInfo pageInfo = uacUserService.queryUserListWithPage(new UacUser());\n\t\tlogger.info(\"queryUserListWithPage = {}\", pageInfo);\n\t}\n\n\n}\n"
  },
  {
    "path": "paascloud-provider/paascloud-provider-uac/src/test/resources/.gitkeep",
    "content": ""
  },
  {
    "path": "paascloud-provider/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\"\n         xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n         xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n    <parent>\n        <groupId>com.liuzm.paascloud</groupId>\n        <artifactId>paascloud-master</artifactId>\n        <version>1.0</version>\n    </parent>\n\n    <modelVersion>4.0.0</modelVersion>\n    <packaging>pom</packaging>\n    <groupId>com.liuzm.paascloud.provider</groupId>\n    <artifactId>paascloud-provider</artifactId>\n    <name>paascloud-provider</name>\n    <description>User authentication center</description>\n    <properties>\n        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>\n    </properties>\n\n    <modules>\n        <module>paascloud-provider-uac</module>\n        <module>paascloud-provider-mdc</module>\n        <module>paascloud-provider-omc</module>\n        <module>paascloud-provider-opc</module>\n        <module>paascloud-provider-tpc</module>\n    </modules>\n\n    <dependencies>\n        <dependency>\n            <groupId>org.springframework.cloud</groupId>\n            <artifactId>spring-cloud-starter-config</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.springframework.cloud</groupId>\n            <artifactId>spring-cloud-starter-sleuth</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.springframework.cloud</groupId>\n            <artifactId>spring-cloud-sleuth-zipkin</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>com.liuzm.paascloud.common</groupId>\n            <artifactId>paascloud-common-util</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>com.liuzm.paascloud.common</groupId>\n            <artifactId>paascloud-common-core</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.springframework.boot</groupId>\n            <artifactId>spring-boot-starter-actuator</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.springframework.cloud</groupId>\n            <artifactId>spring-cloud-starter-hystrix</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.springframework.boot</groupId>\n            <artifactId>spring-boot-starter-web</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>net.logstash.logback</groupId>\n            <artifactId>logstash-logback-encoder</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>com.google.guava</groupId>\n            <artifactId>guava</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.springframework.boot</groupId>\n            <artifactId>spring-boot-starter-validation</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>io.springfox</groupId>\n            <artifactId>springfox-swagger-ui</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>io.springfox</groupId>\n            <artifactId>springfox-swagger2</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>commons-codec</groupId>\n            <artifactId>commons-codec</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.springframework.boot</groupId>\n            <artifactId>spring-boot-starter-test</artifactId>\n            <scope>test</scope>\n        </dependency>\n\n        <dependency>\n            <groupId>com.alibaba</groupId>\n            <artifactId>druid</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.mybatis.generator</groupId>\n            <artifactId>mybatis-generator-core</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.springframework.boot</groupId>\n            <artifactId>spring-boot-configuration-processor</artifactId>\n            <optional>true</optional>\n        </dependency>\n        <dependency>\n            <groupId>org.springframework.boot</groupId>\n            <artifactId>spring-boot-devtools</artifactId>\n            <optional>true</optional>\n        </dependency>\n        <dependency>\n            <groupId>org.springframework.boot</groupId>\n            <artifactId>spring-boot-starter-aop</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.modelmapper</groupId>\n            <artifactId>modelmapper</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.jolokia</groupId>\n            <artifactId>jolokia-core</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.springframework.security</groupId>\n            <artifactId>spring-security-jwt</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.liquibase</groupId>\n            <artifactId>liquibase-core</artifactId>\n            <version>3.5.3</version>\n        </dependency>\n        <dependency>\n            <groupId>org.springframework.cloud</groupId>\n            <artifactId>spring-cloud-starter-zipkin</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.springframework.amqp</groupId>\n            <artifactId>spring-rabbit</artifactId>\n        </dependency>\n    </dependencies>\n    <profiles>\n        <profile>\n            <id>dev</id>\n            <properties>\n                <profileActive>dev</profileActive>\n            </properties>\n            <activation>\n                <activeByDefault>true</activeByDefault>\n            </activation>\n        </profile>\n        <profile>\n            <id>pro</id>\n            <properties>\n                <profileActive>pro</profileActive>\n            </properties>\n        </profile>\n    </profiles>\n    <build>\n        <finalName>${project.artifactId}</finalName>\n        <plugins>\n            <plugin>\n                <groupId>org.springframework.boot</groupId>\n                <artifactId>spring-boot-maven-plugin</artifactId>\n                <configuration>\n                  <jvmArguments>-Dfile.encoding=UTF-8</jvmArguments>\n                </configuration>\n                <executions>\n                    <execution>\n                        <goals>\n                            <goal>build-info</goal>\n                        </goals>\n                    </execution>\n                </executions>\n                <dependencies>\n                    <dependency>\n                        <groupId>org.springframework</groupId>\n                        <artifactId>springloaded</artifactId>\n                        <version>1.2.5.RELEASE</version>\n                    </dependency>\n                </dependencies>\n            </plugin>\n            <!-- 添加docker-maven插件 -->\n            <plugin>\n                <groupId>com.spotify</groupId>\n                <artifactId>docker-maven-plugin</artifactId>\n                <version>0.4.13</version>\n                <configuration>\n                    <imageName>${project.artifactId}:${project.version}</imageName>\n                    <baseImage>java</baseImage>\n                    <entryPoint>[\"java\", \"-jar\", \"/${project.build.finalName}.jar\"]</entryPoint>\n                    <resources>\n                        <resource>\n                            <targetPath>/</targetPath>\n                            <directory>${project.build.directory}</directory>\n                            <include>${project.build.finalName}.jar</include>\n                        </resource>\n                    </resources>\n                </configuration>\n            </plugin>\n        </plugins>\n    </build>\n</project>"
  },
  {
    "path": "paascloud-provider-api/paascloud-provider-mdc-api/.gitignore",
    "content": "target/\n!.mvn/wrapper/maven-wrapper.jar\n\n### STS ###\n.apt_generated\n.classpath\n.factorypath\n.project\n.settings\n.springBeans\n\n### IntelliJ IDEA ###\n.idea\n*.iws\n*.iml\n*.ipr\n\n### NetBeans ###\nnbproject/private/\nbuild/\nnbbuild/\ndist/\nnbdist/\n.nb-gradle/"
  },
  {
    "path": "paascloud-provider-api/paascloud-provider-mdc-api/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n\txsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n\t<modelVersion>4.0.0</modelVersion>\n\n\t<artifactId>paascloud-provider-mdc-api</artifactId>\n\t<version>1.0</version>\n\t<packaging>jar</packaging>\n\n\t<name>paascloud-provider-mdc-api</name>\n\t<description>Demo project for Spring Boot</description>\n\n    <parent>\n        <groupId>com.liuzm.paascloud.provider.api</groupId>\n        <artifactId>paascloud-provider-api</artifactId>\n        <version>1.0</version>\n    </parent>\n\n\t<properties>\n\t\t<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>\n\t\t<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>\n\t\t<java.version>1.8</java.version>\n\t</properties>\n\n\t<dependencies>\n\t\t<dependency>\n\t\t\t<groupId>org.springframework.cloud</groupId>\n\t\t\t<artifactId>spring-cloud-starter-hystrix</artifactId>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t<artifactId>spring-boot-starter-web</artifactId>\n\t\t</dependency>\n        <dependency>\n            <groupId>com.liuzm.paascloud.common</groupId>\n            <artifactId>paascloud-common-util</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>com.github.pagehelper</groupId>\n            <artifactId>pagehelper</artifactId>\n            <version>5.0.3</version>\n        </dependency>\n    </dependencies>\n\n</project>\n"
  },
  {
    "path": "paascloud-provider-api/paascloud-provider-mdc-api/src/main/java/com/paascloud/provider/exceptions/MdcBizException.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：MdcBizException.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.exceptions;\n\nimport com.paascloud.base.enums.ErrorCodeEnum;\nimport com.paascloud.base.exception.BusinessException;\nimport lombok.extern.slf4j.Slf4j;\n\n\n/**\n * The class Mdc biz exception.\n *\n * @author paascloud.net @gmail.com\n */\n@Slf4j\npublic class MdcBizException extends BusinessException {\n\n\tprivate static final long serialVersionUID = -6552248511084911254L;\n\n\t/**\n\t * Instantiates a new Uac rpc exception.\n\t */\n\tpublic MdcBizException() {\n\t}\n\n\t/**\n\t * Instantiates a new Uac rpc exception.\n\t *\n\t * @param code      the code\n\t * @param msgFormat the msg format\n\t * @param args      the args\n\t */\n\tpublic MdcBizException(int code, String msgFormat, Object... args) {\n\t\tsuper(code, msgFormat, args);\n\t\tlog.info(\"<== MdcRpcException, code:{}, message:{}\", this.code, super.getMessage());\n\t}\n\n\t/**\n\t * Instantiates a new Uac rpc exception.\n\t *\n\t * @param code the code\n\t * @param msg  the msg\n\t */\n\tpublic MdcBizException(int code, String msg) {\n\t\tsuper(code, msg);\n\t\tlog.info(\"<== MdcRpcException, code:{}, message:{}\", this.code, super.getMessage());\n\t}\n\n\t/**\n\t * Instantiates a new Mdc rpc exception.\n\t *\n\t * @param codeEnum the code enum\n\t */\n\tpublic MdcBizException(ErrorCodeEnum codeEnum) {\n\t\tsuper(codeEnum.code(), codeEnum.msg());\n\t\tlog.info(\"<== MdcRpcException, code:{}, message:{}\", this.code, super.getMessage());\n\t}\n\n\t/**\n\t * Instantiates a new Mdc rpc exception.\n\t *\n\t * @param codeEnum the code enum\n\t * @param args     the args\n\t */\n\tpublic MdcBizException(ErrorCodeEnum codeEnum, Object... args) {\n\t\tsuper(codeEnum, args);\n\t\tlog.info(\"<== MdcRpcException, code:{}, message:{}\", this.code, super.getMessage());\n\t}\n}\n"
  },
  {
    "path": "paascloud-provider-api/paascloud-provider-mdc-api/src/main/java/com/paascloud/provider/model/constant/MdcApiConstant.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：MdcApiConstant.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.model.constant;\n\nimport lombok.AccessLevel;\nimport lombok.NoArgsConstructor;\n\n/**\n * The class Mdc api constant.\n *\n * @author paascloud.net@gmail.com\n */\n@NoArgsConstructor(access = AccessLevel.PRIVATE)\npublic class MdcApiConstant {\n\n\t/**\n\t * The enum Product status enum.\n\t *\n\t * @author paascloud.net@gmail.com\n\t */\n\tpublic enum ProductStatusEnum {\n\t\t/**\n\t\t * On sale product status enum.\n\t\t */\n\t\tON_SALE(1, \"在线\"),\n\t\t/**\n\t\t * Off sale product status enum.\n\t\t */\n\t\tOFF_SALE(2, \"下架\"),\n\t\t/**\n\t\t * Delete product status enum.\n\t\t */\n\t\tDELETE(3, \"删除\");\n\t\tprivate String value;\n\t\tprivate int code;\n\n\t\tProductStatusEnum(int code, String value) {\n\t\t\tthis.code = code;\n\t\t\tthis.value = value;\n\t\t}\n\n\t\t/**\n\t\t * Gets value.\n\t\t *\n\t\t * @return the value\n\t\t */\n\t\tpublic String getValue() {\n\t\t\treturn value;\n\t\t}\n\n\t\t/**\n\t\t * Gets code.\n\t\t *\n\t\t * @return the code\n\t\t */\n\t\tpublic int getCode() {\n\t\t\treturn code;\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "paascloud-provider-api/paascloud-provider-mdc-api/src/main/java/com/paascloud/provider/model/dto/AddressDTO.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：AddressDTO.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.model.dto;\n\nimport io.swagger.annotations.ApiModel;\nimport io.swagger.annotations.ApiModelProperty;\nimport lombok.Data;\nimport org.codehaus.jackson.map.annotate.JsonSerialize;\n\nimport java.io.Serializable;\n\n/**\n * The class Address dto.\n *\n * @author paascloud.net@gmail.com\n */\n@Data\n@ApiModel\n@JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL)\npublic class AddressDTO implements Serializable {\n\tprivate static final long serialVersionUID = -154171216711236047L;\n\t/**\n\t * ID\n\t */\n\t@ApiModelProperty(value = \"ID\")\n\tprivate Long id;\n\n\t/**\n\t * 地址名称\n\t */\n\t@ApiModelProperty(value = \"地址名称\")\n\tprivate String name;\n\n\t/**\n\t * 父ID\n\t */\n\t@ApiModelProperty(value = \"父ID\")\n\tprivate Long pid;\n\n\t/**\n\t * 城市编码\n\t */\n\t@ApiModelProperty(value = \"城市编码\")\n\tprivate String cityCode;\n\n\t/**\n\t * 级别（省市区县）\n\t */\n\t@ApiModelProperty(value = \"级别（省市区县）\")\n\tprivate Integer level;\n\n\t/**\n\t * 区域编码\n\t */\n\t@ApiModelProperty(value = \"区域编码\")\n\tprivate String adCode;\n\n\t/**\n\t * 行政区边界坐标点\n\t */\n\t@ApiModelProperty(value = \"行政区边界坐标点\")\n\tprivate String polyline;\n\n\t/**\n\t * 城市中心点\n\t */\n\t@ApiModelProperty(value = \"城市中心点\")\n\tprivate String center;\n}\n"
  },
  {
    "path": "paascloud-provider-api/paascloud-provider-mdc-api/src/main/java/com/paascloud/provider/model/dto/GlobalExceptionLogDto.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：GlobalExceptionLogDto.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.model.dto;\n\nimport com.fasterxml.jackson.annotation.JsonFormat;\nimport com.paascloud.ThreadLocalMap;\nimport com.paascloud.base.constant.GlobalConstant;\nimport com.paascloud.base.dto.LoginAuthDto;\nimport lombok.Data;\nimport lombok.NoArgsConstructor;\nimport lombok.extern.slf4j.Slf4j;\nimport org.apache.commons.lang3.StringUtils;\nimport org.springframework.format.annotation.DateTimeFormat;\n\nimport java.util.Arrays;\nimport java.util.Date;\n\n/**\n * The class Global exception log dto.\n *\n * @author paascloud.net @gmail.com\n */\n@Data\n@NoArgsConstructor\n@Slf4j\npublic class GlobalExceptionLogDto {\n\n\t/**\n\t * 运行环境\n\t */\n\tprivate String profile;\n\n\t/**\n\t * 应用名称\n\t */\n\tprivate String applicationName;\n\n\t/**\n\t * 异常信息(通过exception.getMessage()获取到的内容)\n\t */\n\tprivate String exceptionMessage;\n\n\t/**\n\t * 异常原因(通过exception.getCause()获取到的内容)\n\t */\n\tprivate String exceptionCause;\n\n\t/**\n\t * 异常类型\n\t */\n\tprivate String exceptionSimpleName;\n\n\t/**\n\t * 异常堆栈信息\n\t */\n\tprivate String exceptionStack;\n\n\t/**\n\t * 创建人\n\t */\n\tprivate String creator;\n\n\t/**\n\t * 创建人ID\n\t */\n\tprivate Long creatorId;\n\n\t/**\n\t * 创建时间\n\t */\n\t@DateTimeFormat(pattern = \"yyyy-MM-dd HH:mm:ss\")\n\t@JsonFormat(pattern = \"yyyy-MM-dd HH:mm:ss\", timezone = \"GMT+8\")\n\tprivate Date createdTime;\n\n\t/**\n\t * Gets global exception log dto.\n\t *\n\t * @param ex the ex\n\t *\n\t * @return the global exception log dto\n\t */\n\tpublic GlobalExceptionLogDto getGlobalExceptionLogDto(Exception ex, String profile, String applicationName) {\n\t\tString message = ex.getMessage();\n\t\tif (StringUtils.isNotBlank(message) && message.length() > GlobalConstant.EXCEPTION_MESSAGE_MAX_LENGTH) {\n\t\t\tthis.exceptionMessage = StringUtils.substring(message, 0, GlobalConstant.EXCEPTION_MESSAGE_MAX_LENGTH) + \"...\";\n\t\t}\n\t\tthis.exceptionSimpleName = ex.getClass().getSimpleName();\n\t\tString cause = ex.getCause() == null ? null : ex.getCause().toString();\n\t\tif (StringUtils.isNotBlank(cause) && cause.length() > GlobalConstant.EXCEPTION_CAUSE_MAX_LENGTH) {\n\t\t\tthis.exceptionCause = StringUtils.substring(cause, 0, GlobalConstant.EXCEPTION_CAUSE_MAX_LENGTH) + \"...\";\n\t\t}\n\t\tthis.exceptionStack = Arrays.toString(ex.getStackTrace());\n\n\t\tthis.profile = profile;\n\t\tLoginAuthDto loginAuthDto = null;\n\n\t\ttry {\n\t\t\tloginAuthDto = (LoginAuthDto) ThreadLocalMap.get(GlobalConstant.Sys.TOKEN_AUTH_DTO);\n\t\t} catch (Exception e) {\n\t\t\tlog.error(\"获取登陆人信息, 出现异常={}\", e.getMessage(), e);\n\t\t}\n\n\t\tif (loginAuthDto == null) {\n\t\t\tloginAuthDto = new LoginAuthDto(-1L, \"SYSTEM_TASK\", \"系统任务\");\n\t\t}\n\t\tthis.creatorId = loginAuthDto.getUserId();\n\t\tthis.creator = loginAuthDto.getUserName();\n\t\tthis.applicationName = applicationName;\n\t\treturn this;\n\t}\n}"
  },
  {
    "path": "paascloud-provider-api/paascloud-provider-mdc-api/src/main/java/com/paascloud/provider/model/dto/ProductCategoryDto.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：ProductCategoryDto.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.model.dto;\n\nimport io.swagger.annotations.ApiModel;\nimport io.swagger.annotations.ApiModelProperty;\nimport lombok.Data;\nimport org.codehaus.jackson.map.annotate.JsonSerialize;\n\nimport java.io.Serializable;\nimport java.util.List;\n\n/**\n * The class Product category dto.\n *\n * @author paascloud.net@gmail.com\n */\n@Data\n@ApiModel\n@JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL)\npublic class ProductCategoryDto implements Serializable {\n\tprivate static final long serialVersionUID = -5217129132596232253L;\n\t@ApiModelProperty(value = \"类别ID\")\n\tprivate Long categoryId;\n\t@ApiModelProperty(value = \"类别名称\")\n\tprivate String categoryName;\n\t@ApiModelProperty(value = \"首图URL\")\n\tprivate String imgUrl;\n\n\tprivate List<ProductCategoryDto> categoryList;\n\n}\n"
  },
  {
    "path": "paascloud-provider-api/paascloud-provider-mdc-api/src/main/java/com/paascloud/provider/model/dto/ProductDto.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：ProductDto.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.model.dto;\n\nimport io.swagger.annotations.ApiModel;\nimport io.swagger.annotations.ApiModelProperty;\nimport lombok.Data;\n\nimport java.io.Serializable;\nimport java.math.BigDecimal;\n\n/**\n * The class Product dto.\n *\n * @author paascloud.net@gmail.com\n */\n@Data\n@ApiModel\npublic class ProductDto implements Serializable {\n\tprivate static final long serialVersionUID = 6932649538854879183L;\n\t@ApiModelProperty(\"货品ID\")\n\tprivate Long id;\n\t@ApiModelProperty(\"分类ID\")\n\tprivate Long categoryId;\n\tprivate String name;\n\t@ApiModelProperty(\"子标题\")\n\tprivate String subtitle;\n\t@ApiModelProperty(\"首图\")\n\tprivate String mainImage;\n\t@ApiModelProperty(\"价格\")\n\tprivate BigDecimal price;\n\t@ApiModelProperty(\"状态\")\n\tprivate Integer status;\n\t@ApiModelProperty(\"图片服务器前缀\")\n\tprivate String imageHost;\n\t@ApiModelProperty(\"库存数量\")\n\tprivate Integer stock;\n\t@ApiModelProperty(\"商品序列号\")\n\tprivate String productCode;\n\t@ApiModelProperty(\"变化的库存数量\")\n\tprivate Integer changeStock;\n}\n"
  },
  {
    "path": "paascloud-provider-api/paascloud-provider-mdc-api/src/main/java/com/paascloud/provider/model/dto/ProductReqDto.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：ProductReqDto.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.model.dto;\n\n\nimport com.paascloud.base.dto.BaseQuery;\nimport io.swagger.annotations.ApiModel;\nimport io.swagger.annotations.ApiModelProperty;\nimport lombok.Data;\nimport lombok.EqualsAndHashCode;\n\n/**\n * The class Product req dto.\n *\n * @author paascloud.net@gmail.com\n */\n@EqualsAndHashCode(callSuper = true)\n@Data\n@ApiModel\npublic class ProductReqDto extends BaseQuery {\n\tprivate static final long serialVersionUID = -9070173642901418263L;\n\t@ApiModelProperty(value = \"分类ID\")\n\tprivate Long categoryId;\n\t@ApiModelProperty(value = \"关键词\")\n\tprivate String keyword;\n}\n"
  },
  {
    "path": "paascloud-provider-api/paascloud-provider-mdc-api/src/main/java/com/paascloud/provider/model/vo/ProductDetailVo.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：ProductDetailVo.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.model.vo;\n\nimport io.swagger.annotations.ApiModel;\nimport lombok.Data;\n\nimport java.io.Serializable;\nimport java.math.BigDecimal;\n\n/**\n * The class Product detail vo.\n *\n * @author paascloud.net@gmail.com\n */\n@Data\n@ApiModel\npublic class ProductDetailVo implements Serializable {\n\tprivate static final long serialVersionUID = 4852861985938951261L;\n\tprivate Long id;\n\tprivate String name;\n\tprivate String subtitle;\n\tprivate String mainImage;\n\tprivate String subImages;\n\tprivate String detail;\n\tprivate BigDecimal price;\n\tprivate Integer stock;\n\tprivate Integer status;\n\tprivate String imageHost;\n\tprivate Long pid;\n}\n"
  },
  {
    "path": "paascloud-provider-api/paascloud-provider-mdc-api/src/main/java/com/paascloud/provider/service/MdcAddressQueryFeignApi.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：MdcAddressQueryFeignApi.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.service;\n\nimport com.paascloud.provider.model.dto.AddressDTO;\nimport com.paascloud.provider.service.hystrix.MdcAddressQueryFeignHystrix;\nimport com.paascloud.security.feign.OAuth2FeignAutoConfiguration;\nimport com.paascloud.wrapper.Wrapper;\nimport org.springframework.cloud.netflix.feign.FeignClient;\nimport org.springframework.web.bind.annotation.PathVariable;\nimport org.springframework.web.bind.annotation.PostMapping;\n\n/**\n * The interface Mdc product query feign api.\n *\n * @author paascloud.net @gmail.com\n */\n@FeignClient(value = \"paascloud-provider-mdc\", configuration = OAuth2FeignAutoConfiguration.class, fallback = MdcAddressQueryFeignHystrix.class)\npublic interface MdcAddressQueryFeignApi {\n\n\t/**\n\t * Select by id wrapper.\n\t *\n\t * @param addressId the address id\n\t *\n\t * @return the wrapper\n\t */\n\t@PostMapping(value = \"/api/address/getById/{addressId}\")\n\tWrapper<AddressDTO> getById(@PathVariable(\"addressId\") Long addressId);\n}\n"
  },
  {
    "path": "paascloud-provider-api/paascloud-provider-mdc-api/src/main/java/com/paascloud/provider/service/MdcExceptionLogFeignApi.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：MdcExceptionLogFeignApi.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.service;\n\nimport com.paascloud.provider.model.dto.GlobalExceptionLogDto;\nimport com.paascloud.provider.service.hystrix.MdcExceptionLogFeignHystrix;\nimport com.paascloud.security.feign.OAuth2FeignAutoConfiguration;\nimport com.paascloud.wrapper.Wrapper;\nimport org.springframework.cloud.netflix.feign.FeignClient;\nimport org.springframework.web.bind.annotation.PostMapping;\nimport org.springframework.web.bind.annotation.RequestBody;\n\n/**\n * The interface Mdc product feign api.\n *\n * @author paascloud.net @gmail.com\n */\n@FeignClient(value = \"paascloud-provider-mdc\", configuration = OAuth2FeignAutoConfiguration.class, fallback = MdcExceptionLogFeignHystrix.class)\npublic interface MdcExceptionLogFeignApi {\n\n\t/**\n\t * Update product stock by id int.\n\t *\n\t * @param exceptionLogDto the exception log dto\n\t *\n\t * @return the int\n\t */\n\t@PostMapping(value = \"/api/exception/saveAndSendExceptionLog\")\n\tWrapper saveAndSendExceptionLog(@RequestBody GlobalExceptionLogDto exceptionLogDto);\n}\n"
  },
  {
    "path": "paascloud-provider-api/paascloud-provider-mdc-api/src/main/java/com/paascloud/provider/service/MdcMqMessageFeignApi.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：MdcMqMessageFeignApi.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.service;\n\n\nimport com.github.pagehelper.PageInfo;\nimport com.paascloud.base.dto.MessageQueryDto;\nimport com.paascloud.base.dto.MqMessageVo;\nimport com.paascloud.provider.service.hystrix.MdcMqMessageApiHystrix;\nimport com.paascloud.security.feign.OAuth2FeignAutoConfiguration;\nimport com.paascloud.wrapper.Wrapper;\nimport org.springframework.cloud.netflix.feign.FeignClient;\nimport org.springframework.web.bind.annotation.PostMapping;\nimport org.springframework.web.bind.annotation.RequestBody;\nimport org.springframework.web.bind.annotation.RequestParam;\n\nimport java.util.List;\n\n/**\n * The interface Mdc mq message feign api.\n *\n * @author paascloud.net @gmail.com\n */\n@FeignClient(value = \"paascloud-provider-mdc\", configuration = OAuth2FeignAutoConfiguration.class, fallback = MdcMqMessageApiHystrix.class)\npublic interface MdcMqMessageFeignApi {\n\n\n\t/**\n\t * Query waiting confirm message list wrapper.\n\t *\n\t * @param messageKeyList the message key list\n\t *\n\t * @return the wrapper\n\t */\n\t@PostMapping(value = \"/api/mdc/message/queryMessageKeyList\")\n\tWrapper<List<String>> queryMessageKeyList(@RequestParam(\"messageKeyList\") List<String> messageKeyList);\n\n\t/**\n\t * Query message list with page wrapper.\n\t *\n\t * @param messageQueryDto the message query dto\n\t *\n\t * @return the wrapper\n\t */\n\t@PostMapping(value = \"/api/mdc/message/queryMessageListWithPage\")\n\tWrapper<PageInfo<MqMessageVo>> queryMessageListWithPage(@RequestBody MessageQueryDto messageQueryDto);\n}\n"
  },
  {
    "path": "paascloud-provider-api/paascloud-provider-mdc-api/src/main/java/com/paascloud/provider/service/MdcProductCategoryFeignApi.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：MdcProductCategoryFeignApi.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.service;\n\nimport com.paascloud.provider.service.hystrix.MdcProductCategoryFeignHystrix;\nimport com.paascloud.security.feign.OAuth2FeignAutoConfiguration;\nimport org.springframework.cloud.netflix.feign.FeignClient;\n\n/**\n * The interface Mdc product category feign api.\n *\n * @author paascloud.net@gmail.com\n */\n@FeignClient(value = \"paascloud-provider-mdc\", configuration = OAuth2FeignAutoConfiguration.class, fallback = MdcProductCategoryFeignHystrix.class)\npublic interface MdcProductCategoryFeignApi {\n\n}\n"
  },
  {
    "path": "paascloud-provider-api/paascloud-provider-mdc-api/src/main/java/com/paascloud/provider/service/MdcProductCategoryQueryFeignApi.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：MdcProductCategoryQueryFeignApi.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.service;\n\nimport com.github.pagehelper.PageInfo;\nimport com.paascloud.annotation.NoNeedAccessAuthentication;\nimport com.paascloud.provider.model.dto.ProductCategoryDto;\nimport com.paascloud.provider.model.dto.ProductReqDto;\nimport com.paascloud.provider.service.hystrix.MdcProductCategoryQueryFeignHystrix;\nimport com.paascloud.security.feign.OAuth2FeignAutoConfiguration;\nimport com.paascloud.wrapper.Wrapper;\nimport org.springframework.cloud.netflix.feign.FeignClient;\nimport org.springframework.web.bind.annotation.PathVariable;\nimport org.springframework.web.bind.annotation.PostMapping;\nimport org.springframework.web.bind.annotation.RequestBody;\n\nimport java.util.List;\n\n/**\n * The interface Mdc product category query feign api.\n *\n * @author paascloud.net @gmail.com\n */\n@FeignClient(value = \"paascloud-provider-mdc\", configuration = OAuth2FeignAutoConfiguration.class, fallback = MdcProductCategoryQueryFeignHystrix.class)\npublic interface MdcProductCategoryQueryFeignApi {\n\n\t/**\n\t * 查询分类信息.\n\t *\n\t * @param pid the pid\n\t *\n\t * @return the product category data\n\t */\n\t@PostMapping(value = \"/api/productCategory/getProductCategoryDtoByPid/{pid}\")\n\t@NoNeedAccessAuthentication\n\tWrapper<List<ProductCategoryDto>> getProductCategoryData(@PathVariable(\"pid\") Long pid);\n\n\t/**\n\t * 查询商品列表.\n\t *\n\t * @param productReqDto the product req dto\n\t *\n\t * @return the product list\n\t */\n\t@PostMapping(value = \"/api/product/getProductList\")\n\t@NoNeedAccessAuthentication\n\tWrapper<PageInfo> getProductList(@RequestBody ProductReqDto productReqDto);\n\n}\n"
  },
  {
    "path": "paascloud-provider-api/paascloud-provider-mdc-api/src/main/java/com/paascloud/provider/service/MdcProductFeignApi.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：MdcProductFeignApi.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.service;\n\nimport com.paascloud.provider.model.dto.ProductDto;\nimport com.paascloud.provider.service.hystrix.MdcProductFeignHystrix;\nimport com.paascloud.security.feign.OAuth2FeignAutoConfiguration;\nimport com.paascloud.wrapper.Wrapper;\nimport org.springframework.cloud.netflix.feign.FeignClient;\nimport org.springframework.web.bind.annotation.PostMapping;\nimport org.springframework.web.bind.annotation.RequestBody;\nimport org.springframework.web.bind.annotation.RequestParam;\n\n/**\n * The interface Mdc product feign api.\n *\n * @author paascloud.net @gmail.com\n */\n@FeignClient(value = \"paascloud-provider-mdc\", configuration = OAuth2FeignAutoConfiguration.class, fallback = MdcProductFeignHystrix.class)\npublic interface MdcProductFeignApi {\n\n\t/**\n\t * Update product stock by id int.\n\t *\n\t * @param productDto the product dto\n\t *\n\t * @return the int\n\t */\n\t@PostMapping(value = \"/api/product/updateProductStockById\")\n\tWrapper<Integer> updateProductStockById(@RequestBody ProductDto productDto);\n\n\t/**\n\t * Gets main image.\n\t *\n\t * @param productId the product\n\t *                  id\n\t *\n\t * @return the main image\n\t */\n\t@PostMapping(value = \"/api/product/getMainImage\")\n\tWrapper<String> getMainImage(@RequestParam(\"productId\") Long productId);\n}\n"
  },
  {
    "path": "paascloud-provider-api/paascloud-provider-mdc-api/src/main/java/com/paascloud/provider/service/MdcProductQueryFeignApi.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：MdcProductQueryFeignApi.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.service;\n\nimport com.paascloud.annotation.NoNeedAccessAuthentication;\nimport com.paascloud.provider.model.dto.ProductDto;\nimport com.paascloud.provider.model.vo.ProductDetailVo;\nimport com.paascloud.provider.service.hystrix.MdcProductQueryFeignHystrix;\nimport com.paascloud.security.feign.OAuth2FeignAutoConfiguration;\nimport com.paascloud.wrapper.Wrapper;\nimport org.springframework.cloud.netflix.feign.FeignClient;\nimport org.springframework.web.bind.annotation.PathVariable;\nimport org.springframework.web.bind.annotation.PostMapping;\n\n/**\n * The interface Mdc product query feign api.\n *\n * @author paascloud.net @gmail.com\n */\n@FeignClient(value = \"paascloud-provider-mdc\", configuration = OAuth2FeignAutoConfiguration.class, fallback = MdcProductQueryFeignHystrix.class)\npublic interface MdcProductQueryFeignApi {\n\n\t/**\n\t * 查询商品详情信息.\n\t *\n\t * @param productId the product id\n\t *\n\t * @return the product detail\n\t */\n\t@PostMapping(value = \"/api/product/getProductDetail/{productId}\")\n\t@NoNeedAccessAuthentication\n\tWrapper<ProductDetailVo> getProductDetail(@PathVariable(\"productId\") Long productId);\n\n\t/**\n\t * Select by id wrapper.\n\t *\n\t * @param productId the product id\n\t *\n\t * @return the wrapper\n\t */\n\t@PostMapping(value = \"/api/product/selectById/{productId}\")\n\t@NoNeedAccessAuthentication\n\tWrapper<ProductDto> selectById(@PathVariable(\"productId\") Long productId);\n}\n"
  },
  {
    "path": "paascloud-provider-api/paascloud-provider-mdc-api/src/main/java/com/paascloud/provider/service/hystrix/MdcAddressQueryFeignHystrix.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：MdcAddressQueryFeignHystrix.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.service.hystrix;\n\nimport com.paascloud.provider.model.dto.AddressDTO;\nimport com.paascloud.provider.service.MdcAddressQueryFeignApi;\nimport com.paascloud.wrapper.Wrapper;\nimport org.springframework.stereotype.Component;\n\n/**\n * The class Mdc product query feign hystrix.\n *\n * @author paascloud.net@gmail.com\n */\n@Component\npublic class MdcAddressQueryFeignHystrix implements MdcAddressQueryFeignApi {\n\n\t@Override\n\tpublic Wrapper<AddressDTO> getById(final Long addressId) {\n\t\treturn null;\n\t}\n}\n"
  },
  {
    "path": "paascloud-provider-api/paascloud-provider-mdc-api/src/main/java/com/paascloud/provider/service/hystrix/MdcExceptionLogFeignHystrix.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：MdcExceptionLogFeignHystrix.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.service.hystrix;\n\nimport com.paascloud.provider.model.dto.GlobalExceptionLogDto;\nimport com.paascloud.provider.service.MdcExceptionLogFeignApi;\nimport com.paascloud.wrapper.Wrapper;\nimport org.springframework.stereotype.Component;\n\n\n/**\n * The class Mdc exception log feign hystrix.\n *\n * @author paascloud.net @gmail.com\n */\n@Component\npublic class MdcExceptionLogFeignHystrix implements MdcExceptionLogFeignApi {\n\n\t@Override\n\tpublic Wrapper saveAndSendExceptionLog(final GlobalExceptionLogDto exceptionLogDto) {\n\t\treturn null;\n\t}\n}\n"
  },
  {
    "path": "paascloud-provider-api/paascloud-provider-mdc-api/src/main/java/com/paascloud/provider/service/hystrix/MdcMqMessageApiHystrix.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：MdcMqMessageApiHystrix.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.service.hystrix;\n\n\nimport com.github.pagehelper.PageInfo;\nimport com.paascloud.base.dto.MessageQueryDto;\nimport com.paascloud.base.dto.MqMessageVo;\nimport com.paascloud.provider.service.MdcMqMessageFeignApi;\nimport com.paascloud.wrapper.Wrapper;\nimport org.springframework.stereotype.Component;\n\nimport java.util.List;\n\n/**\n * The class Mdc mq message api hystrix.\n *\n * @author paascloud.net @gmail.com\n */\n@Component\npublic class MdcMqMessageApiHystrix implements MdcMqMessageFeignApi {\n\t@Override\n\tpublic Wrapper<List<String>> queryMessageKeyList(final List<String> messageKeyList) {\n\t\treturn null;\n\t}\n\n\t@Override\n\tpublic Wrapper<PageInfo<MqMessageVo>> queryMessageListWithPage(final MessageQueryDto messageQueryDto) {\n\t\treturn null;\n\t}\n}\n"
  },
  {
    "path": "paascloud-provider-api/paascloud-provider-mdc-api/src/main/java/com/paascloud/provider/service/hystrix/MdcProductCategoryFeignHystrix.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：MdcProductCategoryFeignHystrix.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.service.hystrix;\n\nimport com.paascloud.provider.service.MdcProductCategoryFeignApi;\nimport org.springframework.stereotype.Component;\n\n/**\n * The class Mdc product category feign hystrix.\n *\n * @author paascloud.net@gmail.com\n */\n@Component\npublic class MdcProductCategoryFeignHystrix implements MdcProductCategoryFeignApi {\n}\n"
  },
  {
    "path": "paascloud-provider-api/paascloud-provider-mdc-api/src/main/java/com/paascloud/provider/service/hystrix/MdcProductCategoryQueryFeignHystrix.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：MdcProductCategoryQueryFeignHystrix.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.service.hystrix;\n\nimport com.github.pagehelper.PageInfo;\nimport com.paascloud.provider.model.dto.ProductCategoryDto;\nimport com.paascloud.provider.model.dto.ProductReqDto;\nimport com.paascloud.provider.service.MdcProductCategoryQueryFeignApi;\nimport com.paascloud.wrapper.Wrapper;\nimport org.springframework.stereotype.Component;\n\nimport java.util.List;\n\n/**\n * The class Mdc product category query feign hystrix.\n *\n * @author paascloud.net@gmail.com\n */\n@Component\npublic class MdcProductCategoryQueryFeignHystrix implements MdcProductCategoryQueryFeignApi {\n\t@Override\n\tpublic Wrapper<List<ProductCategoryDto>> getProductCategoryData(final Long pid) {\n\t\treturn null;\n\t}\n\n\t@Override\n\tpublic Wrapper<PageInfo> getProductList(final ProductReqDto productReqDto) {\n\t\treturn null;\n\t}\n}\n"
  },
  {
    "path": "paascloud-provider-api/paascloud-provider-mdc-api/src/main/java/com/paascloud/provider/service/hystrix/MdcProductFeignHystrix.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：MdcProductFeignHystrix.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.service.hystrix;\n\nimport com.paascloud.provider.model.dto.ProductDto;\nimport com.paascloud.provider.service.MdcProductFeignApi;\nimport com.paascloud.wrapper.Wrapper;\nimport org.springframework.stereotype.Component;\n\n/**\n * The class Mdc product feign hystrix.\n *\n * @author paascloud.net@gmail.com\n */\n@Component\npublic class MdcProductFeignHystrix implements MdcProductFeignApi {\n\n\t@Override\n\tpublic Wrapper<Integer> updateProductStockById(final ProductDto productDto) {\n\t\treturn null;\n\t}\n\n\t@Override\n\tpublic Wrapper<String> getMainImage(final Long productId) {\n\t\treturn null;\n\t}\n}\n"
  },
  {
    "path": "paascloud-provider-api/paascloud-provider-mdc-api/src/main/java/com/paascloud/provider/service/hystrix/MdcProductQueryFeignHystrix.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：MdcProductQueryFeignHystrix.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.service.hystrix;\n\nimport com.paascloud.provider.model.dto.ProductDto;\nimport com.paascloud.provider.model.vo.ProductDetailVo;\nimport com.paascloud.provider.service.MdcProductQueryFeignApi;\nimport com.paascloud.wrapper.Wrapper;\nimport org.springframework.stereotype.Component;\n\n/**\n * The class Mdc product query feign hystrix.\n *\n * @author paascloud.net@gmail.com\n */\n@Component\npublic class MdcProductQueryFeignHystrix implements MdcProductQueryFeignApi {\n\n\t@Override\n\tpublic Wrapper<ProductDetailVo> getProductDetail(final Long productId) {\n\t\treturn null;\n\t}\n\n\t@Override\n\tpublic Wrapper<ProductDto> selectById(final Long productId) {\n\t\treturn null;\n\t}\n}\n"
  },
  {
    "path": "paascloud-provider-api/paascloud-provider-omc-api/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n\txsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n\t<modelVersion>4.0.0</modelVersion>\n\n\t<artifactId>paascloud-provider-omc-api</artifactId>\n\t<version>1.0</version>\n\t<packaging>jar</packaging>\n\n\t<name>paascloud-provider-omc-api</name>\n\t<description>Demo project for Spring Boot</description>\n\n    <parent>\n        <groupId>com.liuzm.paascloud.provider.api</groupId>\n        <artifactId>paascloud-provider-api</artifactId>\n        <version>1.0</version>\n    </parent>\n\n\t<properties>\n\t\t<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>\n\t\t<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>\n\t\t<java.version>1.8</java.version>\n\t</properties>\n\n\t<dependencies>\n\t\t<dependency>\n\t\t\t<groupId>org.springframework.cloud</groupId>\n\t\t\t<artifactId>spring-cloud-starter-hystrix</artifactId>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t<artifactId>spring-boot-starter-web</artifactId>\n\t\t</dependency>\n        <dependency>\n            <groupId>com.liuzm.paascloud.common</groupId>\n            <artifactId>paascloud-common-util</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>com.github.pagehelper</groupId>\n            <artifactId>pagehelper</artifactId>\n            <version>5.0.3</version>\n        </dependency>\n    </dependencies>\n\n</project>\n"
  },
  {
    "path": "paascloud-provider-api/paascloud-provider-omc-api/src/main/java/com/paascloud/provider/exceptions/OmcBizException.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：OmcBizException.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.exceptions;\n\nimport com.paascloud.base.enums.ErrorCodeEnum;\nimport com.paascloud.base.exception.BusinessException;\nimport lombok.extern.slf4j.Slf4j;\n\n\n/**\n * The class Omc biz exception.\n *\n * @author paascloud.net @gmail.com\n */\n@Slf4j\npublic class OmcBizException extends BusinessException {\n\n\tprivate static final long serialVersionUID = -6552248511084911254L;\n\n\t/**\n\t * Instantiates a new Uac rpc exception.\n\t */\n\tpublic OmcBizException() {\n\t}\n\n\t/**\n\t * Instantiates a new Uac rpc exception.\n\t *\n\t * @param code      the code\n\t * @param msgFormat the msg format\n\t * @param args      the args\n\t */\n\tpublic OmcBizException(int code, String msgFormat, Object... args) {\n\t\tsuper(code, msgFormat, args);\n\t\tlog.info(\"<== OmcRpcException, code:{}, message:{}\", this.code, super.getMessage());\n\t}\n\n\t/**\n\t * Instantiates a new Uac rpc exception.\n\t *\n\t * @param code the code\n\t * @param msg  the msg\n\t */\n\tpublic OmcBizException(int code, String msg) {\n\t\tsuper(code, msg);\n\t\tlog.info(\"<== OmcRpcException, code:{}, message:{}\", this.code, super.getMessage());\n\t}\n\n\t/**\n\t * Instantiates a new Omc rpc exception.\n\t *\n\t * @param codeEnum the code enum\n\t */\n\tpublic OmcBizException(ErrorCodeEnum codeEnum) {\n\t\tsuper(codeEnum.code(), codeEnum.msg());\n\t\tlog.info(\"<== OmcRpcException, code:{}, message:{}\", this.code, super.getMessage());\n\t}\n\n\t/**\n\t * Instantiates a new Omc rpc exception.\n\t *\n\t * @param codeEnum the code enum\n\t * @param args     the args\n\t */\n\tpublic OmcBizException(ErrorCodeEnum codeEnum, Object... args) {\n\t\tsuper(codeEnum, args);\n\t\tlog.info(\"<== OmcRpcException, code:{}, message:{}\", this.code, super.getMessage());\n\t}\n}\n"
  },
  {
    "path": "paascloud-provider-api/paascloud-provider-omc-api/src/main/java/com/paascloud/provider/model/constant/OmcApiConstant.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：OmcApiConstant.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.model.constant;\n\nimport lombok.AccessLevel;\nimport lombok.NoArgsConstructor;\n\n/**\n * The class Omc api constant.\n *\n * @author paascloud.net@gmail.com\n */\n@NoArgsConstructor(access = AccessLevel.PRIVATE)\npublic class OmcApiConstant {\n\n\t/**\n\t * The interface Cart.\n\t */\n\tpublic interface Cart {\n\t\t/**\n\t\t * 即购物车选中状态\n\t\t */\n\t\tint CHECKED = 1;\n\n\t\t/**\n\t\t * 购物车中未选中状态\n\t\t */\n\t\tint UN_CHECKED = 0;\n\t\t/**\n\t\t * The constant LIMIT_NUM_FAIL.\n\t\t */\n\t\tString LIMIT_NUM_FAIL = \"LIMIT_NUM_FAIL\";\n\t\t/**\n\t\t * The constant LIMIT_NUM_SUCCESS.\n\t\t */\n\t\tString LIMIT_NUM_SUCCESS = \"LIMIT_NUM_SUCCESS\";\n\t}\n\n\t/**\n\t * The interface Shipping.\n\t */\n\tpublic interface Shipping {\n\t\t/**\n\t\t * The constant DEFAULT.\n\t\t */\n\t\tint DEFAULT = 1;\n\t\t/**\n\t\t * The constant NOT_DEFAULT.\n\t\t */\n\t\tint NOT_DEFAULT = 0;\n\t}\n\n\t/**\n\t * The enum Order status enum.\n\t */\n\tpublic enum OrderStatusEnum {\n\t\t/**\n\t\t * Canceled order status enum.\n\t\t */\n\t\tCANCELED(0, \"已取消\"),\n\t\t/**\n\t\t * No pay order status enum.\n\t\t */\n\t\tNO_PAY(10, \"未支付\"),\n\t\t/**\n\t\t * Paid order status enum.\n\t\t */\n\t\tPAID(20, \"已付款\"),\n\t\t/**\n\t\t * Shipped order status enum.\n\t\t */\n\t\tSHIPPED(40, \"已发货\"),\n\t\t/**\n\t\t * Order success order status enum.\n\t\t */\n\t\tORDER_SUCCESS(50, \"订单完成\"),\n\t\t/**\n\t\t * Order close order status enum.\n\t\t */\n\t\tORDER_CLOSE(60, \"订单关闭\");\n\n\n\t\tOrderStatusEnum(int code, String value) {\n\t\t\tthis.code = code;\n\t\t\tthis.value = value;\n\t\t}\n\n\t\tprivate String value;\n\t\tprivate int code;\n\n\t\t/**\n\t\t * Gets value.\n\t\t *\n\t\t * @return the value\n\t\t */\n\t\tpublic String getValue() {\n\t\t\treturn value;\n\t\t}\n\n\t\t/**\n\t\t * Gets code.\n\t\t *\n\t\t * @return the code\n\t\t */\n\t\tpublic int getCode() {\n\t\t\treturn code;\n\t\t}\n\n\t\t/**\n\t\t * Code of order status enum.\n\t\t *\n\t\t * @param code the code\n\t\t *\n\t\t * @return the order status enum\n\t\t */\n\t\tpublic static OrderStatusEnum codeOf(int code) {\n\t\t\tOrderStatusEnum result = null;\n\t\t\tfor (OrderStatusEnum paymentTypeEnum : values()) {\n\t\t\t\tif (paymentTypeEnum.getCode() == code) {\n\t\t\t\t\tresult = paymentTypeEnum;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn result;\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "paascloud-provider-api/paascloud-provider-omc-api/src/main/java/com/paascloud/provider/model/constant/PtcApiConstant.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：PtcApiConstant.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.model.constant;\n\nimport lombok.AccessLevel;\nimport lombok.NoArgsConstructor;\n\n/**\n * The class Ptc api constant.\n *\n * @author paascloud.net@gmail.com\n */\n@NoArgsConstructor(access = AccessLevel.PRIVATE)\npublic class PtcApiConstant {\n\n\n\t/**\n\t * The interface Alipay callback.\n\t *\n\t * @author paascloud.net@gmail.com\n\t */\n\tpublic interface AlipayCallback {\n\t\t/**\n\t\t * The constant TRADE_STATUS_WAIT_BUYER_PAY.\n\t\t */\n\t\tString TRADE_STATUS_WAIT_BUYER_PAY = \"WAIT_BUYER_PAY\";\n\t\t/**\n\t\t * The constant TRADE_STATUS_TRADE_SUCCESS.\n\t\t */\n\t\tString TRADE_STATUS_TRADE_SUCCESS = \"TRADE_SUCCESS\";\n\n\t\t/**\n\t\t * The constant RESPONSE_SUCCESS.\n\t\t */\n\t\tString RESPONSE_SUCCESS = \"success\";\n\t\t/**\n\t\t * The constant RESPONSE_FAILED.\n\t\t */\n\t\tString RESPONSE_FAILED = \"failed\";\n\t}\n\n\t/**\n\t * The enum Pay platform enum.\n\t *\n\t * @author paascloud.net@gmail.com\n\t */\n\tpublic enum PayPlatformEnum {\n\t\t/**\n\t\t * Alipay pay platform enum.\n\t\t */\n\t\tALIPAY(1, \"支付宝\");\n\n\t\tPayPlatformEnum(int code, String value) {\n\t\t\tthis.code = code;\n\t\t\tthis.value = value;\n\t\t}\n\n\t\tprivate String value;\n\t\tprivate int code;\n\n\t\t/**\n\t\t * Gets value.\n\t\t *\n\t\t * @return the value\n\t\t */\n\t\tpublic String getValue() {\n\t\t\treturn value;\n\t\t}\n\n\t\t/**\n\t\t * Gets code.\n\t\t *\n\t\t * @return the code\n\t\t */\n\t\tpublic int getCode() {\n\t\t\treturn code;\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "paascloud-provider-api/paascloud-provider-omc-api/src/main/java/com/paascloud/provider/model/dto/OrderDetailDto.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：OrderDetailDto.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.model.dto;\n\nimport lombok.Data;\n\nimport java.io.Serializable;\nimport java.math.BigDecimal;\n\n/**\n * The class Order detail dto.\n *\n * @author paascloud.net@gmail.com\n */\n@Data\npublic class OrderDetailDto implements Serializable {\n\n\tprivate static final long serialVersionUID = 4423448618530228839L;\n\tprivate Long id;\n\t/**\n\t * 订单明细序列号\n\t */\n\tprivate String detailNo;\n\n\tprivate Long userId;\n\n\tprivate String orderNo;\n\n\tprivate Long productId;\n\n\t/**\n\t * 商品名称\n\t */\n\tprivate String productName;\n\n\t/**\n\t * 商品图片地址\n\t */\n\tprivate String productImage;\n\n\t/**\n\t * 生成订单时的商品单价, 单位是元,保留两位小数\n\t */\n\tprivate BigDecimal currentUnitPrice;\n\n\t/**\n\t * 商品数量\n\t */\n\tprivate Integer quantity;\n\n\t/**\n\t * 商品总价,单位是元,保留两位小数\n\t */\n\tprivate BigDecimal totalPrice;\n}\n"
  },
  {
    "path": "paascloud-provider-api/paascloud-provider-omc-api/src/main/java/com/paascloud/provider/model/dto/OrderDto.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：OrderDto.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.model.dto;\n\nimport lombok.Data;\n\nimport java.io.Serializable;\nimport java.math.BigDecimal;\nimport java.util.Date;\n\n/**\n * The class Order dto.\n *\n * @author paascloud.net@gmail.com\n */\n@Data\npublic class OrderDto implements Serializable {\n\n\tprivate static final long serialVersionUID = 529837303004214782L;\n\tprivate Long id;\n\n\t/**\n\t * 版本号\n\t */\n\tprivate Integer version;\n\n\t/**\n\t * 订单号\n\t */\n\tprivate String orderNo;\n\n\t/**\n\t * 用户id\n\t */\n\tprivate Long userId;\n\n\tprivate Long shippingId;\n\n\t/**\n\t * 实际付款金额,单位是元,保留两位小数\n\t */\n\tprivate BigDecimal payment;\n\n\t/**\n\t * 支付类型,1-在线支付\n\t */\n\tprivate Integer paymentType;\n\n\t/**\n\t * 运费,单位是元\n\t */\n\tprivate Integer postage;\n\n\t/**\n\t * 订单状态:0-已取消-10-未付款, 20-已付款, 40-已发货, 50-交易成功, 60-交易关闭\n\t */\n\tprivate Integer status;\n\n\t/**\n\t * 支付时间\n\t */\n\tprivate Date paymentTime;\n\n\t/**\n\t * 发货时间\n\t */\n\tprivate Date sendTime;\n\n\t/**\n\t * 交易完成时间\n\t */\n\tprivate Date endTime;\n\n\t/**\n\t * 交易关闭时间\n\t */\n\tprivate Date closeTime;\n\n\t/**\n\t * 创建人\n\t */\n\tprivate String creator;\n\n\t/**\n\t * 创建人ID\n\t */\n\tprivate Long creatorId;\n\n\t/**\n\t * 创建时间\n\t */\n\tprivate Date createdTime;\n\n\t/**\n\t * 最近操作人\n\t */\n\tprivate String lastOperator;\n\n\t/**\n\t * 最后操作人ID\n\t */\n\tprivate Long lastOperatorId;\n\n\t/**\n\t * 更新时间\n\t */\n\tprivate Date updateTime;\n}\n"
  },
  {
    "path": "paascloud-provider-api/paascloud-provider-omc-api/src/main/java/com/paascloud/provider/model/dto/OrderPageQuery.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：OrderPageQuery.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.model.dto;\n\nimport com.paascloud.base.dto.BaseQuery;\nimport lombok.Data;\nimport lombok.EqualsAndHashCode;\n\n/**\n * The class Order page query.\n *\n * @author paascloud.net @gmail.com\n */\n@EqualsAndHashCode(callSuper = true)\n@Data\npublic class OrderPageQuery extends BaseQuery {\n\tprivate static final long serialVersionUID = -7997684399705866704L;\n\n\t/**\n\t * 状态\n\t */\n\tprivate String status;\n\n\t/**\n\t * 订单号\n\t */\n\tprivate String orderNo;\n}\n"
  },
  {
    "path": "paascloud-provider-api/paascloud-provider-omc-api/src/main/java/com/paascloud/provider/model/vo/CartProductVo.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：CartProductVo.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.model.vo;\n\nimport lombok.Data;\n\nimport java.io.Serializable;\nimport java.math.BigDecimal;\n\n/**\n * The class Cart product vo.\n *\n * @author paascloud.net@gmail.com\n */\n@Data\npublic class CartProductVo implements Serializable {\n\n\tprivate static final long serialVersionUID = 975884590599516501L;\n\tprivate Long id;\n\tprivate Long userId;\n\tprivate Long productId;\n\t/**\n\t * 购物车中此商品的数量\n\t */\n\tprivate Integer quantity;\n\tprivate String productName;\n\tprivate String productSubtitle;\n\tprivate String productMainImage;\n\tprivate BigDecimal productPrice;\n\tprivate Integer productStatus;\n\tprivate BigDecimal productTotalPrice;\n\tprivate Integer productStock;\n\t/**\n\t * 此商品是否勾选\n\t */\n\tprivate Integer checked;\n\t/**\n\t * 限制数量的一个返回结果\n\t */\n\tprivate String limitQuantity;\n\n}\n"
  },
  {
    "path": "paascloud-provider-api/paascloud-provider-omc-api/src/main/java/com/paascloud/provider/model/vo/CartVo.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：CartVo.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.model.vo;\n\nimport lombok.Data;\n\nimport java.io.Serializable;\nimport java.math.BigDecimal;\nimport java.util.List;\n\n/**\n * The class Cart vo.\n *\n * @author paascloud.net@gmail.com\n */\n@Data\npublic class CartVo implements Serializable {\n\n\tprivate static final long serialVersionUID = -7852680577412931768L;\n\tprivate List<CartProductVo> cartProductVoList;\n\tprivate BigDecimal cartTotalPrice;\n\t/**\n\t * 是否已经都勾选\n\t */\n\tprivate Boolean allChecked;\n\tprivate String imageHost;\n}\n"
  },
  {
    "path": "paascloud-provider-api/paascloud-provider-omc-api/src/main/java/com/paascloud/provider/model/vo/OrderDocVo.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：OrderDocVo.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.model.vo;\n\nimport com.paascloud.base.dto.BaseVo;\nimport lombok.Data;\nimport lombok.EqualsAndHashCode;\n\nimport java.math.BigDecimal;\nimport java.util.Date;\n\n/**\n * The class Order doc vo.\n *\n * @author paascloud.net @gmail.com\n */\n@EqualsAndHashCode(callSuper = true)\n@Data\npublic class OrderDocVo extends BaseVo {\n\n\tprivate static final long serialVersionUID = 4282588127249930700L;\n\t/**\n\t * 订单号\n\t */\n\tprivate String orderNo;\n\n\t/**\n\t * 收货人\n\t */\n\tprivate String receiverName;\n\n\t/**\n\t * 实际付款金额,单位是元,保留两位小数\n\t */\n\tprivate BigDecimal payment;\n\n\t/**\n\t * 支付类型,1-在线支付\n\t */\n\tprivate Integer paymentType;\n\n\t/**\n\t * 订单状态:0-已取消-10-未付款, 20-已付款, 40-已发货, 50-交易成功, 60-交易关闭\n\t */\n\tprivate Integer status;\n\n\t/**\n\t * 支付时间\n\t */\n\tprivate Date paymentTime;\n\n\t/**\n\t * 发货时间\n\t */\n\tprivate Date sendTime;\n\n\t/**\n\t * 交易完成时间\n\t */\n\tprivate Date endTime;\n\n\t/**\n\t * 交易关闭时间\n\t */\n\tprivate Date closeTime;\n}\n"
  },
  {
    "path": "paascloud-provider-api/paascloud-provider-omc-api/src/main/java/com/paascloud/provider/model/vo/OrderItemVo.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：OrderItemVo.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.model.vo;\n\nimport com.fasterxml.jackson.annotation.JsonFormat;\nimport lombok.Data;\nimport org.springframework.format.annotation.DateTimeFormat;\n\nimport java.io.Serializable;\nimport java.math.BigDecimal;\nimport java.util.Date;\n\n/**\n * The class Order item vo.\n *\n * @author paascloud.net@gmail.com\n */\n@Data\npublic class OrderItemVo implements Serializable {\n\n\tprivate static final long serialVersionUID = -8309014197153665106L;\n\tprivate String orderNo;\n\n\tprivate Long productId;\n\n\tprivate String productName;\n\tprivate String productImage;\n\n\tprivate BigDecimal currentUnitPrice;\n\n\tprivate Integer quantity;\n\n\tprivate BigDecimal totalPrice;\n\t@DateTimeFormat(pattern = \"yyyy-MM-dd HH:mm:ss\")\n\t@JsonFormat(pattern = \"yyyy-MM-dd HH:mm:ss\", timezone = \"GMT+8\")\n\tprivate Date createTime;\n}\n"
  },
  {
    "path": "paascloud-provider-api/paascloud-provider-omc-api/src/main/java/com/paascloud/provider/model/vo/OrderProductVo.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：OrderProductVo.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.model.vo;\n\nimport lombok.Data;\n\nimport java.io.Serializable;\nimport java.math.BigDecimal;\nimport java.util.List;\n\n/**\n * The class Order product vo.\n *\n * @author paascloud.net@gmail.com\n */\n@Data\npublic class OrderProductVo implements Serializable {\n\tprivate static final long serialVersionUID = 9200251296138955758L;\n\tprivate List<OrderItemVo> orderItemVoList;\n\tprivate BigDecimal productTotalPrice;\n\tprivate String imageHost;\n}\n"
  },
  {
    "path": "paascloud-provider-api/paascloud-provider-omc-api/src/main/java/com/paascloud/provider/model/vo/OrderVo.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：OrderVo.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.model.vo;\n\nimport com.fasterxml.jackson.annotation.JsonFormat;\nimport lombok.Data;\nimport org.springframework.format.annotation.DateTimeFormat;\n\nimport java.io.Serializable;\nimport java.math.BigDecimal;\nimport java.util.Date;\nimport java.util.List;\n\n/**\n * The class Order vo.\n *\n * @author paascloud.net@gmail.com\n */\n@Data\npublic class OrderVo implements Serializable {\n\n\tprivate static final long serialVersionUID = 5829292780030349525L;\n\tprivate String orderNo;\n\n\tprivate BigDecimal payment;\n\n\tprivate Integer paymentType;\n\n\tprivate String paymentTypeDesc;\n\tprivate Integer postage;\n\n\tprivate Integer status;\n\n\n\tprivate String statusDesc;\n\t@DateTimeFormat(pattern = \"yyyy-MM-dd HH:mm:ss\")\n\t@JsonFormat(pattern = \"yyyy-MM-dd HH:mm:ss\", timezone = \"GMT+8\")\n\tprivate Date paymentTime;\n\t@DateTimeFormat(pattern = \"yyyy-MM-dd HH:mm:ss\")\n\t@JsonFormat(pattern = \"yyyy-MM-dd HH:mm:ss\", timezone = \"GMT+8\")\n\tprivate Date sendTime;\n\t@DateTimeFormat(pattern = \"yyyy-MM-dd HH:mm:ss\")\n\t@JsonFormat(pattern = \"yyyy-MM-dd HH:mm:ss\", timezone = \"GMT+8\")\n\tprivate Date endTime;\n\t@DateTimeFormat(pattern = \"yyyy-MM-dd HH:mm:ss\")\n\t@JsonFormat(pattern = \"yyyy-MM-dd HH:mm:ss\", timezone = \"GMT+8\")\n\tprivate Date closeTime;\n\t@DateTimeFormat(pattern = \"yyyy-MM-dd HH:mm:ss\")\n\t@JsonFormat(pattern = \"yyyy-MM-dd HH:mm:ss\", timezone = \"GMT+8\")\n\tprivate Date createTime;\n\n\tprivate String creator;\n\n\t/**\n\t * 订单的明细\n\t */\n\tprivate List<OrderItemVo> orderItemVoList;\n\n\tprivate String imageHost;\n\tprivate Long shippingId;\n\tprivate String receiverName;\n\n\tprivate ShippingVo shippingVo;\n}\n"
  },
  {
    "path": "paascloud-provider-api/paascloud-provider-omc-api/src/main/java/com/paascloud/provider/model/vo/ShippingVo.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：ShippingVo.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.model.vo;\n\nimport lombok.Data;\n\nimport java.io.Serializable;\n\n/**\n * The class Shipping vo.\n *\n * @author paascloud.net@gmail.com\n */\n@Data\npublic class ShippingVo implements Serializable {\n\tprivate static final long serialVersionUID = 1650395734521093800L;\n\tprivate String receiverName;\n\n\tprivate String receiverPhone;\n\n\tprivate String receiverMobile;\n\n\tprivate String receiverProvince;\n\n\tprivate String receiverCity;\n\n\tprivate String receiverDistrict;\n\n\tprivate String receiverAddress;\n\n\tprivate String receiverZip;\n}\n"
  },
  {
    "path": "paascloud-provider-api/paascloud-provider-omc-api/src/main/java/com/paascloud/provider/service/OmcCartFeignApi.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：OmcCartFeignApi.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.service;\n\nimport com.paascloud.provider.model.vo.CartProductVo;\nimport com.paascloud.provider.service.hystrix.OmcCartFeignHystrix;\nimport com.paascloud.security.feign.OAuth2FeignAutoConfiguration;\nimport com.paascloud.wrapper.Wrapper;\nimport org.springframework.cloud.netflix.feign.FeignClient;\nimport org.springframework.web.bind.annotation.PostMapping;\nimport org.springframework.web.bind.annotation.RequestBody;\nimport org.springframework.web.bind.annotation.RequestParam;\n\nimport java.util.List;\n\n/**\n * The interface Omc cart feign api.\n *\n * @author paascloud.net @gmail.com\n */\n@FeignClient(value = \"paascloud-provider-omc\", configuration = OAuth2FeignAutoConfiguration.class, fallback = OmcCartFeignHystrix.class)\npublic interface OmcCartFeignApi {\n\t/**\n\t * 更新购物车.\n\t *\n\t * @param cartProductVoList the cart product vo list\n\t *\n\t * @return the wrapper\n\t */\n\t@PostMapping(value = \"/api/cart/updateCartList\")\n\tWrapper updateCartList(@RequestBody List<CartProductVo> cartProductVoList);\n\n\t/**\n\t * 添加购物车.\n\t *\n\t * @param userId    the user id\n\t * @param productId the product id\n\t * @param count     the count\n\t *\n\t * @return the wrapper\n\t */\n\t@PostMapping(value = \"/api/cart/addProduct\")\n\tWrapper addProduct(@RequestParam(\"userId\") Long userId, @RequestParam(\"productId\") Long productId, @RequestParam(\"count\") Integer count);\n\n\t/**\n\t * 更新商品信息.\n\t *\n\t * @param userId    the user id\n\t * @param productId the product id\n\t * @param count     the count\n\t *\n\t * @return the wrapper\n\t */\n\t@PostMapping(value = \"/api/cart/updateProduct\")\n\tWrapper updateProduct(@RequestParam(\"userId\") Long userId, @RequestParam(\"productId\") Long productId, @RequestParam(\"count\") Integer count);\n\n\t/**\n\t * 删除商品信息.\n\t *\n\t * @param userId     the user id\n\t * @param productIds the product ids\n\t *\n\t * @return the wrapper\n\t */\n\t@PostMapping(value = \"/api/cart/deleteProduct\")\n\tWrapper deleteProduct(@RequestParam(\"userId\") Long userId, @RequestParam(\"productIds\") String productIds);\n\n\t/**\n\t * 选中和反选商品.\n\t *\n\t * @param userId    the user id\n\t * @param productId the product id\n\t * @param checked   the checked\n\t *\n\t * @return the wrapper\n\t */\n\t@PostMapping(value = \"/api/cart/selectOrUnSelect\")\n\tWrapper selectOrUnSelect(@RequestParam(name = \"userId\") Long userId, @RequestParam(name = \"productId\", required = false) Long productId, @RequestParam(name = \"checked\") Integer checked);\n}\n\n"
  },
  {
    "path": "paascloud-provider-api/paascloud-provider-omc-api/src/main/java/com/paascloud/provider/service/OmcCartQueryFeignApi.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：OmcCartQueryFeignApi.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.service;\n\nimport com.paascloud.provider.model.vo.CartVo;\nimport com.paascloud.provider.service.hystrix.OmcCartQueryFeignHystrix;\nimport com.paascloud.security.feign.OAuth2FeignAutoConfiguration;\nimport com.paascloud.wrapper.Wrapper;\nimport org.springframework.cloud.netflix.feign.FeignClient;\nimport org.springframework.web.bind.annotation.PostMapping;\nimport org.springframework.web.bind.annotation.RequestParam;\n\n/**\n * The interface Omc cart query feign api.\n *\n * @author paascloud.net @gmail.com\n */\n@FeignClient(value = \"paascloud-provider-omc\", configuration = OAuth2FeignAutoConfiguration.class, fallback = OmcCartQueryFeignHystrix.class)\npublic interface OmcCartQueryFeignApi {\n\n\t/**\n\t * Gets cart vo.\n\t *\n\t * @param userId the user id\n\t *\n\t * @return the cart vo\n\t */\n\t@PostMapping(value = \"/api/cart/getCarVo\")\n\tWrapper<CartVo> getCartVo(@RequestParam(\"userId\") Long userId);\n}\n"
  },
  {
    "path": "paascloud-provider-api/paascloud-provider-omc-api/src/main/java/com/paascloud/provider/service/OmcOrderDetailFeignApi.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：OmcOrderDetailFeignApi.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.service;\n\nimport com.paascloud.provider.service.hystrix.OmcOrderDetailFeignHystrix;\nimport com.paascloud.security.feign.OAuth2FeignAutoConfiguration;\nimport org.springframework.cloud.netflix.feign.FeignClient;\n\n/**\n * The interface Omc order detail feign api.\n *\n * @author paascloud.net@gmail.com\n */\n@FeignClient(value = \"paascloud-provider-omc\", configuration = OAuth2FeignAutoConfiguration.class, fallback = OmcOrderDetailFeignHystrix.class)\npublic interface OmcOrderDetailFeignApi {\n}\n"
  },
  {
    "path": "paascloud-provider-api/paascloud-provider-omc-api/src/main/java/com/paascloud/provider/service/OmcOrderDetailQueryFeignApi.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：OmcOrderDetailQueryFeignApi.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.service;\n\nimport com.paascloud.provider.model.dto.OrderDetailDto;\nimport com.paascloud.provider.service.hystrix.OmcOrderDetailQueryFeignHystrix;\nimport com.paascloud.security.feign.OAuth2FeignAutoConfiguration;\nimport com.paascloud.wrapper.Wrapper;\nimport org.springframework.cloud.netflix.feign.FeignClient;\nimport org.springframework.web.bind.annotation.PathVariable;\nimport org.springframework.web.bind.annotation.PostMapping;\n\nimport java.util.List;\n\n/**\n * The interface Omc order detail query feign api.\n *\n * @author paascloud.net @gmail.com\n */\n@FeignClient(value = \"paascloud-provider-omc\", configuration = OAuth2FeignAutoConfiguration.class, fallback = OmcOrderDetailQueryFeignHystrix.class)\npublic interface OmcOrderDetailQueryFeignApi {\n\t/**\n\t * Gets list by order no user id.\n\t *\n\t * @param orderNo the order no\n\t * @param userId  the user id\n\t *\n\t * @return the list by order no user id\n\t */\n\t@PostMapping(value = \"/api/orderDetail/getListByOrderNoUserId/{userId}/{orderNo}\")\n\tWrapper<List<OrderDetailDto>> getListByOrderNoUserId(@PathVariable(\"orderNo\") String orderNo, @PathVariable(\"userId\") Long userId);\n}\n"
  },
  {
    "path": "paascloud-provider-api/paascloud-provider-omc-api/src/main/java/com/paascloud/provider/service/OmcOrderFeignApi.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：OmcOrderFeignApi.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.service;\n\nimport com.paascloud.provider.model.dto.OrderDto;\nimport com.paascloud.provider.service.hystrix.OmcOrderFeignHystrix;\nimport com.paascloud.security.feign.OAuth2FeignAutoConfiguration;\nimport com.paascloud.wrapper.Wrapper;\nimport org.springframework.cloud.netflix.feign.FeignClient;\nimport org.springframework.web.bind.annotation.PostMapping;\nimport org.springframework.web.bind.annotation.RequestBody;\n\n/**\n * The interface Omc order feign api.\n *\n * @author paascloud.net @gmail.com\n */\n@FeignClient(value = \"paascloud-provider-omc\", configuration = OAuth2FeignAutoConfiguration.class, fallback = OmcOrderFeignHystrix.class)\npublic interface OmcOrderFeignApi {\n\t/**\n\t * Update order by id wrapper.\n\t *\n\t * @param order the order\n\t *\n\t * @return the wrapper\n\t */\n\t@PostMapping(value = \"/api/order/updateOrderById\")\n\tWrapper updateOrderById(@RequestBody OrderDto order);\n}\n"
  },
  {
    "path": "paascloud-provider-api/paascloud-provider-omc-api/src/main/java/com/paascloud/provider/service/OmcOrderQueryFeignApi.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：OmcOrderQueryFeignApi.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.service;\n\nimport com.paascloud.provider.model.dto.OrderDto;\nimport com.paascloud.provider.service.hystrix.OmcOrderQueryFeignHystrix;\nimport com.paascloud.security.feign.OAuth2FeignAutoConfiguration;\nimport com.paascloud.wrapper.Wrapper;\nimport org.springframework.cloud.netflix.feign.FeignClient;\nimport org.springframework.web.bind.annotation.PathVariable;\nimport org.springframework.web.bind.annotation.PostMapping;\n\n/**\n * The interface Omc order query feign api.\n *\n * @author paascloud.net @gmail.com\n */\n@FeignClient(value = \"paascloud-provider-omc\", configuration = OAuth2FeignAutoConfiguration.class, fallback = OmcOrderQueryFeignHystrix.class)\npublic interface OmcOrderQueryFeignApi {\n\t/**\n\t * Query by order no wrapper.\n\t *\n\t * @param orderNo the order no\n\t *\n\t * @return the wrapper\n\t */\n\t@PostMapping(value = \"/api/order/queryByOrderNo/{orderNo}\")\n\tWrapper<OrderDto> queryByOrderNo(@PathVariable(\"orderNo\") String orderNo);\n\n\t/**\n\t * Query by user id and order no wrapper.\n\t *\n\t * @param userId  the user id\n\t * @param orderNo the order no\n\t *\n\t * @return the wrapper\n\t */\n\t@PostMapping(value = \"/api/order/queryByUserIdAndOrderNo/{userId}/{orderNo}\")\n\tWrapper<OrderDto> queryByUserIdAndOrderNo(@PathVariable(\"userId\") Long userId, @PathVariable(\"orderNo\") String orderNo);\n}\n"
  },
  {
    "path": "paascloud-provider-api/paascloud-provider-omc-api/src/main/java/com/paascloud/provider/service/hystrix/OmcCartFeignHystrix.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：OmcCartFeignHystrix.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.service.hystrix;\n\nimport com.paascloud.provider.model.vo.CartProductVo;\nimport com.paascloud.provider.service.OmcCartFeignApi;\nimport com.paascloud.wrapper.Wrapper;\nimport org.springframework.stereotype.Component;\n\nimport java.util.List;\n\n/**\n * The class Omc cart feign hystrix.\n *\n * @author paascloud.net@gmail.com\n */\n@Component\npublic class OmcCartFeignHystrix implements OmcCartFeignApi {\n\t@Override\n\tpublic Wrapper updateCartList(final List<CartProductVo> cartProductVoList) {\n\t\treturn null;\n\t}\n\n\t@Override\n\tpublic Wrapper addProduct(final Long userId, final Long productId, final Integer count) {\n\t\treturn null;\n\t}\n\n\t@Override\n\tpublic Wrapper updateProduct(final Long userId, final Long productId, final Integer count) {\n\t\treturn null;\n\t}\n\n\t@Override\n\tpublic Wrapper deleteProduct(final Long userId, final String productIds) {\n\t\treturn null;\n\t}\n\n\t@Override\n\tpublic Wrapper selectOrUnSelect(final Long userId, final Long productId, final Integer checked) {\n\t\treturn null;\n\t}\n}\n"
  },
  {
    "path": "paascloud-provider-api/paascloud-provider-omc-api/src/main/java/com/paascloud/provider/service/hystrix/OmcCartQueryFeignHystrix.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：OmcCartQueryFeignHystrix.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.service.hystrix;\n\nimport com.paascloud.provider.model.vo.CartVo;\nimport com.paascloud.provider.service.OmcCartQueryFeignApi;\nimport com.paascloud.wrapper.Wrapper;\nimport org.springframework.stereotype.Component;\n\n/**\n * The class Omc cart query feign hystrix.\n *\n * @author paascloud.net@gmail.com\n */\n@Component\npublic class OmcCartQueryFeignHystrix implements OmcCartQueryFeignApi {\n\n\t@Override\n\tpublic Wrapper<CartVo> getCartVo(final Long userId) {\n\t\treturn null;\n\t}\n}\n"
  },
  {
    "path": "paascloud-provider-api/paascloud-provider-omc-api/src/main/java/com/paascloud/provider/service/hystrix/OmcOrderDetailFeignHystrix.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：OmcOrderDetailFeignHystrix.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.service.hystrix;\n\nimport com.paascloud.provider.service.OmcOrderDetailFeignApi;\n\nimport org.springframework.stereotype.Component;\n\n/**\n * The class Omc order detail feign hystrix.\n *\n * @author paascloud.net@gmail.com\n */\n@Component\npublic class OmcOrderDetailFeignHystrix implements OmcOrderDetailFeignApi {\n}\n"
  },
  {
    "path": "paascloud-provider-api/paascloud-provider-omc-api/src/main/java/com/paascloud/provider/service/hystrix/OmcOrderDetailQueryFeignHystrix.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：OmcOrderDetailQueryFeignHystrix.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.service.hystrix;\n\nimport com.paascloud.provider.model.dto.OrderDetailDto;\nimport com.paascloud.provider.service.OmcOrderDetailQueryFeignApi;\nimport com.paascloud.wrapper.Wrapper;\nimport org.springframework.stereotype.Component;\n\nimport java.util.List;\n\n/**\n * The class Omc order detail query feign hystrix.\n *\n * @author paascloud.net@gmail.com\n */\n@Component\npublic class OmcOrderDetailQueryFeignHystrix implements OmcOrderDetailQueryFeignApi {\n\n\t@Override\n\tpublic Wrapper<List<OrderDetailDto>> getListByOrderNoUserId(final String orderNo, final Long userId) {\n\t\treturn null;\n\t}\n}\n"
  },
  {
    "path": "paascloud-provider-api/paascloud-provider-omc-api/src/main/java/com/paascloud/provider/service/hystrix/OmcOrderFeignHystrix.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：OmcOrderFeignHystrix.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.service.hystrix;\n\nimport com.paascloud.provider.model.dto.OrderDto;\nimport com.paascloud.provider.service.OmcOrderFeignApi;\nimport com.paascloud.wrapper.Wrapper;\nimport org.springframework.stereotype.Component;\n\n/**\n * The class Omc order feign hystrix.\n *\n * @author paascloud.net@gmail.com\n */\n@Component\npublic class OmcOrderFeignHystrix implements OmcOrderFeignApi {\n\n\t@Override\n\tpublic Wrapper updateOrderById(final OrderDto order) {\n\t\treturn null;\n\t}\n}\n"
  },
  {
    "path": "paascloud-provider-api/paascloud-provider-omc-api/src/main/java/com/paascloud/provider/service/hystrix/OmcOrderQueryFeignHystrix.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：OmcOrderQueryFeignHystrix.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.service.hystrix;\n\nimport com.paascloud.provider.model.dto.OrderDto;\nimport com.paascloud.provider.service.OmcOrderQueryFeignApi;\nimport com.paascloud.wrapper.Wrapper;\nimport org.springframework.stereotype.Component;\n\n/**\n * The class Omc order query feign hystrix.\n *\n * @author paascloud.net@gmail.com\n */\n@Component\npublic class OmcOrderQueryFeignHystrix implements OmcOrderQueryFeignApi {\n\n\n\t@Override\n\tpublic Wrapper<OrderDto> queryByOrderNo(final String orderNo) {\n\t\treturn null;\n\t}\n\n\t@Override\n\tpublic Wrapper<OrderDto> queryByUserIdAndOrderNo(final Long userId, final String orderNo) {\n\t\treturn null;\n\t}\n}\n"
  },
  {
    "path": "paascloud-provider-api/paascloud-provider-opc-api/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n\txsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n\t<modelVersion>4.0.0</modelVersion>\n\n\t<artifactId>paascloud-provider-opc-api</artifactId>\n\t<packaging>jar</packaging>\n\n\t<name>paascloud-provider-opc-api</name>\n\t<description>Demo project for Spring Boot</description>\n\n\t<parent>\n\t\t<groupId>com.liuzm.paascloud.provider.api</groupId>\n\t\t<artifactId>paascloud-provider-api</artifactId>\n\t\t<version>1.0</version>\n\t</parent>\n\n\t<properties>\n\t\t<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>\n\t\t<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>\n\t\t<java.version>1.8</java.version>\n\t</properties>\n\n\t<dependencies>\n\t\t<dependency>\n\t\t\t<groupId>org.springframework.cloud</groupId>\n\t\t\t<artifactId>spring-cloud-starter-hystrix</artifactId>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t<artifactId>spring-boot-starter-web</artifactId>\n\t\t</dependency>\n        <dependency>\n            <groupId>com.liuzm.paascloud.common</groupId>\n            <artifactId>paascloud-common-util</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>com.github.pagehelper</groupId>\n            <artifactId>pagehelper</artifactId>\n            <version>5.0.3</version>\n        </dependency>\n        <dependency>\n            <groupId>io.github.openfeign.form</groupId>\n            <artifactId>feign-form</artifactId>\n          <version>3.0.3</version>\n        </dependency>\n        <dependency>\n            <groupId>io.github.openfeign.form</groupId>\n            <artifactId>feign-form-spring</artifactId>\n            <version>3.0.3</version>\n        </dependency>\n    </dependencies>\n\n</project>\n"
  },
  {
    "path": "paascloud-provider-api/paascloud-provider-opc-api/src/main/java/com/paascloud/provider/exceptions/OpcBizException.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：OpcBizException.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.exceptions;\n\nimport com.paascloud.base.enums.ErrorCodeEnum;\nimport com.paascloud.base.exception.BusinessException;\nimport lombok.extern.slf4j.Slf4j;\n\n\n/**\n * The class Opc biz exception.\n *\n * @author paascloud.net @gmail.com\n */\n@Slf4j\npublic class OpcBizException extends BusinessException {\n\n\tprivate static final long serialVersionUID = -6552248511084911254L;\n\n\t/**\n\t * Instantiates a new Uac rpc exception.\n\t */\n\tpublic OpcBizException() {\n\t}\n\n\t/**\n\t * Instantiates a new Uac rpc exception.\n\t *\n\t * @param code      the code\n\t * @param msgFormat the msg format\n\t * @param args      the args\n\t */\n\tpublic OpcBizException(int code, String msgFormat, Object... args) {\n\t\tsuper(code, msgFormat, args);\n\t\tlog.info(\"<== OpcBizException, code:{}, message:{}\", this.code, super.getMessage());\n\t}\n\n\t/**\n\t * Instantiates a new Uac rpc exception.\n\t *\n\t * @param code the code\n\t * @param msg  the msg\n\t */\n\tpublic OpcBizException(int code, String msg) {\n\t\tsuper(code, msg);\n\t\tlog.info(\"<== OpcBizException, code:{}, message:{}\", this.code, super.getMessage());\n\t}\n\n\t/**\n\t * Instantiates a new Opc rpc exception.\n\t *\n\t * @param codeEnum the code enum\n\t */\n\tpublic OpcBizException(ErrorCodeEnum codeEnum) {\n\t\tsuper(codeEnum.code(), codeEnum.msg());\n\t\tlog.info(\"<== OpcBizException, code:{}, message:{}\", this.code, super.getMessage());\n\t}\n\n\t/**\n\t * Instantiates a new Opc rpc exception.\n\t *\n\t * @param codeEnum the code enum\n\t * @param args     the args\n\t */\n\tpublic OpcBizException(ErrorCodeEnum codeEnum, Object... args) {\n\t\tsuper(codeEnum, args);\n\t\tlog.info(\"<== OpcBizException, code:{}, message:{}\", this.code, super.getMessage());\n\t}\n}\n"
  },
  {
    "path": "paascloud-provider-api/paascloud-provider-opc-api/src/main/java/com/paascloud/provider/model/constant/OpcApiConstant.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：OpcApiConstant.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.model.constant;\n\nimport lombok.AccessLevel;\nimport lombok.NoArgsConstructor;\n\n\n/**\n * The class Opc api constant.\n *\n * @author paascloud.net @gmail.com\n */\n@NoArgsConstructor(access = AccessLevel.PRIVATE)\npublic class OpcApiConstant {\n}\n"
  },
  {
    "path": "paascloud-provider-api/paascloud-provider-opc-api/src/main/java/com/paascloud/provider/model/dto/PcSendEmailRequest.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：PcSendEmailRequest.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.model.dto;\n\nimport lombok.Data;\n\nimport java.io.Serializable;\nimport java.util.Set;\n\n/**\n * The class Pc send email request.\n *\n * @author paascloud.net@gmail.com\n */\n@Data\npublic class PcSendEmailRequest implements Serializable {\n\n\tprivate static final long serialVersionUID = 8391763073747981998L;\n\tprivate String text;\n\tprivate String subject;\n\tprivate Set<String> to;\n}\n"
  },
  {
    "path": "paascloud-provider-api/paascloud-provider-opc-api/src/main/java/com/paascloud/provider/model/dto/PcSendSmsRequest.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：PcSendSmsRequest.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.model.dto;\n\nimport lombok.Data;\n\nimport java.io.Serializable;\n\n/**\n * The class Pc send sms request.\n *\n * @author paascloud.net@gmail.com\n */\n@Data\npublic class PcSendSmsRequest implements Serializable {\n\n\tprivate static final long serialVersionUID = 8391763073747981998L;\n\n\tprivate String phoneNumbers;\n\tprivate String templateCode;\n\tprivate String templateParam;\n\tprivate String outId;\n}\n"
  },
  {
    "path": "paascloud-provider-api/paascloud-provider-opc-api/src/main/java/com/paascloud/provider/model/dto/attachment/OptAttachmentDeleteReqDto.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：OptAttachmentDeleteReqDto.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.model.dto.attachment;\n\nimport lombok.Data;\n\nimport java.io.Serializable;\n\n/**\n * The class Opt attachment delete req dto.\n *\n * @author paascloud.net@gmail.com\n */\n@Data\npublic class OptAttachmentDeleteReqDto implements Serializable {\n\n\n\tprivate static final long serialVersionUID = 731160897713227519L;\n\tprivate String[] serialNos;\n}\n"
  },
  {
    "path": "paascloud-provider-api/paascloud-provider-opc-api/src/main/java/com/paascloud/provider/model/dto/attachment/OptAttachmentQueryReqDto.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：OptAttachmentQueryReqDto.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.model.dto.attachment;\n\nimport lombok.Data;\n\nimport java.io.Serializable;\n\n/**\n * The class Opt attachment query req dto.\n *\n * @author paascloud.net@gmail.com\n */\n@Data\npublic class OptAttachmentQueryReqDto implements Serializable {\n\n\tprivate static final long serialVersionUID = 4781783608243094328L;\n\tprivate Long id;\n\n\t/**\n\t * 附件流水号\n\t */\n\tprivate String serialNo;\n\n\t/**\n\t * 上传附件的相关业务流水号\n\t */\n\tprivate String refNo;\n}\n"
  },
  {
    "path": "paascloud-provider-api/paascloud-provider-opc-api/src/main/java/com/paascloud/provider/model/dto/attachment/OptAttachmentRespDto.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：OptAttachmentRespDto.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.model.dto.attachment;\n\nimport lombok.Data;\n\nimport java.io.Serializable;\n\n/**\n * The class Opt attachment resp dto.\n *\n * @author paascloud.net@gmail.com\n */\n@Data\npublic class OptAttachmentRespDto implements Serializable {\n\tprivate static final long serialVersionUID = 7156713126848745258L;\n\tprivate Long id;\n\tprivate String serialNo;\n\tprivate String refNo;\n\tprivate String name;\n\tprivate String path;\n\tprivate String type;\n\tprivate String format;\n\tprivate String description;\n\t/**\n\t * 文件服务器根目录\n\t */\n\tprivate String bucketName;\n\n}\n"
  },
  {
    "path": "paascloud-provider-api/paascloud-provider-opc-api/src/main/java/com/paascloud/provider/model/dto/attachment/OptUpdateAttachmentReqDto.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：OptUpdateAttachmentReqDto.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.model.dto.attachment;\n\nimport lombok.Data;\n\nimport java.io.Serializable;\n\n/**\n * The class Opt update attachment req dto.\n *\n * @author paascloud.net@gmail.com\n */\n@Data\npublic class OptUpdateAttachmentReqDto implements Serializable {\n\n\tprivate static final long serialVersionUID = -1727131719075160349L;\n\n\t/**\n\t * 附件流水号\n\t */\n\tprivate String serialNo;\n\n\t/**\n\t * 上传附件的相关业务流水号\n\t */\n\tprivate String refNo;\n\n\tprivate Long userId;\n\n\tprivate String userName;\n\n}\n"
  },
  {
    "path": "paascloud-provider-api/paascloud-provider-opc-api/src/main/java/com/paascloud/provider/model/dto/attachment/OptUploadFileByteInfoReqDto.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：OptUploadFileByteInfoReqDto.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.model.dto.attachment;\n\nimport lombok.Data;\n\nimport java.io.Serializable;\n\n/**\n * The class Opt upload file byte info req dto.\n *\n * @author paascloud.net@gmail.com\n */\n@Data\npublic class OptUploadFileByteInfoReqDto implements Serializable {\n\tprivate static final long serialVersionUID = 4695223041316258658L;\n\n\t/**\n\t * 文件字节码\n\t */\n\tprivate byte[] fileByteArray;\n\n\t/**\n\t * 文件名\n\t */\n\tprivate String fileName;\n\n\t/**\n\t * 文件类型\n\t */\n\tprivate String fileType;\n}\n"
  },
  {
    "path": "paascloud-provider-api/paascloud-provider-opc-api/src/main/java/com/paascloud/provider/model/dto/gaode/GaodeLocation.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：GaodeLocation.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.model.dto.gaode;\n\nimport com.paascloud.base.dto.GaodeBaseDto;\nimport lombok.Data;\nimport lombok.EqualsAndHashCode;\n\n/**\n * The class Gaode location.\n *\n * @author paascloud.net @gmail.com\n */\n@EqualsAndHashCode(callSuper = true)\n@Data\npublic class GaodeLocation extends GaodeBaseDto {\n\tprivate String province;\n\tprivate String city;\n\tprivate String adcode;\n\tprivate String rectangle;\n}\n"
  },
  {
    "path": "paascloud-provider-api/paascloud-provider-opc-api/src/main/java/com/paascloud/provider/model/dto/oss/ElementImgUrlDto.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：ElementImgUrlDto.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.model.dto.oss;\n\nimport lombok.AllArgsConstructor;\nimport lombok.Data;\n\nimport java.io.Serializable;\n\n/**\n * The class Element img url dto.\n *\n * @author paascloud.net @gmail.com\n */\n@Data\n@AllArgsConstructor\npublic class ElementImgUrlDto implements Serializable {\n\tpublic ElementImgUrlDto() {\n\t}\n\n\tprivate static final long serialVersionUID = -5800852605728871320L;\n\t/**\n\t * 图片完整地址\n\t */\n\tprivate String url;\n\t/**\n\t * 图片名称\n\t */\n\tprivate String name;\n\t/**\n\t * 图片关联的附件ID\n\t */\n\tprivate Long attachmentId;\n}\n"
  },
  {
    "path": "paascloud-provider-api/paascloud-provider-opc-api/src/main/java/com/paascloud/provider/model/dto/oss/OptBatchGetUrlRequest.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：OptBatchGetUrlRequest.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.model.dto.oss;\n\nimport io.swagger.annotations.ApiModel;\nimport io.swagger.annotations.ApiModelProperty;\nimport lombok.Data;\nimport lombok.NoArgsConstructor;\n\n\n/**\n * The class Opt batch get url request.\n *\n * @author paascloud.net @gmail.com\n */\n@Data\n@ApiModel\n@NoArgsConstructor\npublic class OptBatchGetUrlRequest {\n\n\tpublic OptBatchGetUrlRequest(String refNo) {\n\t\tthis.refNo = refNo;\n\t}\n\n\t@ApiModelProperty(value = \"文件流水号\")\n\tprivate String refNo;\n\n\t@ApiModelProperty(value = \"超时时间\")\n\tprivate Long expires;\n\n\t@ApiModelProperty(value = \"是否需要解密\")\n\tprivate boolean encrypt;\n\n}\n"
  },
  {
    "path": "paascloud-provider-api/paascloud-provider-opc-api/src/main/java/com/paascloud/provider/model/dto/oss/OptGetUrlRequest.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：OptGetUrlRequest.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.model.dto.oss;\n\nimport io.swagger.annotations.ApiModel;\nimport io.swagger.annotations.ApiModelProperty;\nimport lombok.Data;\n\nimport java.util.List;\n\n/**\n * The class Opt get url request.\n *\n * @author paascloud.net@gmail.com\n */\n@Data\n@ApiModel\npublic class OptGetUrlRequest {\n\t@ApiModelProperty(value = \"附件ID\")\n\tprivate Long attachmentId;\n\n\t@ApiModelProperty(value = \"超时时间\")\n\tprivate Long expires;\n\n\t@ApiModelProperty(value = \"是否需要解密\")\n\tprivate boolean encrypt;\n\n\t@ApiModelProperty(value = \"附件ID集合\")\n\tprivate List<Long> attachmentIdList;\n\n}\n"
  },
  {
    "path": "paascloud-provider-api/paascloud-provider-opc-api/src/main/java/com/paascloud/provider/model/dto/oss/OptUploadFileReqDto.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：OptUploadFileReqDto.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.model.dto.oss;\n\nimport com.paascloud.provider.model.dto.attachment.OptUploadFileByteInfoReqDto;\nimport io.swagger.annotations.ApiModel;\nimport io.swagger.annotations.ApiModelProperty;\nimport lombok.Data;\n\nimport java.io.Serializable;\n\n/**\n * The class Opt upload file req dto.\n *\n * @author paascloud.net @gmail.com\n */\n@Data\n@ApiModel(value = \"OptUploadFileReqDto\")\npublic class OptUploadFileReqDto implements Serializable {\n\n\tprivate static final long serialVersionUID = -8008720269972450739L;\n\t/**\n\t * 文件类型\n\t */\n\t@ApiModelProperty(value = \"文件类型\")\n\tprivate String fileType;\n\t/**\n\t * 文件路径\n\t */\n\t@ApiModelProperty(value = \"文件路径\")\n\tprivate String filePath;\n\t/**\n\t * 文件服务器根目录\n\t */\n\t@ApiModelProperty(value = \"文件服务器根目录\")\n\tprivate String bucketName;\n\t@ApiModelProperty(value = \"用户ID\")\n\tprivate Long userId;\n\t@ApiModelProperty(value = \"用户名\")\n\tprivate String userName;\n\tprivate OptUploadFileByteInfoReqDto uploadFileByteInfoReqDto;\n}\n"
  },
  {
    "path": "paascloud-provider-api/paascloud-provider-opc-api/src/main/java/com/paascloud/provider/model/dto/oss/OptUploadFileRespDto.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：OptUploadFileRespDto.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.model.dto.oss;\n\nimport io.swagger.annotations.ApiModel;\nimport io.swagger.annotations.ApiModelProperty;\nimport lombok.Data;\n\nimport java.io.Serializable;\n\n/**\n * The class Opt upload file resp dto.\n *\n * @author paascloud.net@gmail.com\n */\n@Data\n@ApiModel(value = \"OptUploadFileReqDto\")\npublic class OptUploadFileRespDto implements Serializable {\n\n\tprivate static final long serialVersionUID = -8008720269972450739L;\n\n\t@ApiModelProperty(value = \"附件ID\")\n\tprivate Long attachmentId;\n\t@ApiModelProperty(value = \"文件完整url\")\n\tprivate String attachmentUrl;\n\t@ApiModelProperty(value = \"文件名\")\n\tprivate String attachmentName;\n\t@ApiModelProperty(value = \"文件路径(等于七牛文件名)\")\n\tprivate String attachmentPath;\n\t@ApiModelProperty(value = \"文件类型\")\n\tprivate String fileType;\n\t@ApiModelProperty(value = \"关联业务单号\")\n\tprivate String refNo;\n\n}\n"
  },
  {
    "path": "paascloud-provider-api/paascloud-provider-opc-api/src/main/java/com/paascloud/provider/model/dto/robot/AtDto.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：AtDto.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.model.dto.robot;\n\nimport io.swagger.annotations.ApiModel;\nimport io.swagger.annotations.ApiModelProperty;\nimport lombok.Data;\n\nimport java.io.Serializable;\n\n\n/**\n * The class At dto.\n *\n * @author paascloud.net @gmail.com\n */\n@Data\n@ApiModel(value = \"AtDto\")\npublic class AtDto implements Serializable {\n\tprivate static final long serialVersionUID = 2344037651462081640L;\n\t/**\n\t * 被@人的手机号\n\t */\n\t@ApiModelProperty(value = \"被@人的手机号\")\n\tprivate String[] atMobiles;\n\t/**\n\t * \\@所有人时:true,否则为:false\n\t */\n\t@ApiModelProperty(value = \"@所有人时:true,否则为:false\")\n\tprivate boolean isAtAll;\n}\n"
  },
  {
    "path": "paascloud-provider-api/paascloud-provider-opc-api/src/main/java/com/paascloud/provider/model/dto/robot/ChatRobotMsgDto.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：ChatRobotMsgDto.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.model.dto.robot;\n\nimport com.fasterxml.jackson.annotation.JsonProperty;\nimport io.swagger.annotations.ApiModel;\nimport io.swagger.annotations.ApiModelProperty;\nimport lombok.Data;\n\nimport java.io.Serializable;\n\n\n/**\n * 自定义机器人消息.\n *\n * @author paascloud.net @gmail.com\n */\n@Data\n@ApiModel(value = \"自定义机器人消息体\")\npublic class ChatRobotMsgDto implements Serializable {\n\n\tprivate static final long serialVersionUID = -9132398786027223009L;\n\n\t/**\n\t * 机器人URL\n\t */\n\t@ApiModelProperty(value = \"机器人URL\")\n\tprivate String webhookToken;\n\n\t/**\n\t * 此消息类型为固定markdown\n\t * {@link com.paascloud.provider.model.enums.RobotMsgTypeEnum}\n\t */\n\t@ApiModelProperty(value = \"首屏会话透出的展示内容\", required = true)\n\t@JsonProperty(value = \"msgtype\")\n\tprivate String msgType;\n\n\t/**\n\t * markdown消息体\n\t */\n\t@ApiModelProperty(value = \"markdown消息体\")\n\tprivate MarkdownDto markdown;\n\n\t/**\n\t * link类型\n\t */\n\t@ApiModelProperty(value = \"link类型\")\n\tprivate LinkDto link;\n\t/**\n\t * link类型\n\t */\n\t@ApiModelProperty(value = \"link类型\")\n\tprivate TextDto text;\n\t/**\n\t * link类型\n\t */\n\t@ApiModelProperty(value = \"link类型\")\n\tprivate AtDto at;\n\n}\n"
  },
  {
    "path": "paascloud-provider-api/paascloud-provider-opc-api/src/main/java/com/paascloud/provider/model/dto/robot/LinkDto.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：LinkDto.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.model.dto.robot;\n\nimport io.swagger.annotations.ApiModel;\nimport io.swagger.annotations.ApiModelProperty;\nimport lombok.Data;\n\nimport java.io.Serializable;\n\n/**\n * The class Link dto.\n *\n * @author paascloud.net @gmail.com\n */\n@Data\n@ApiModel(value = \"link类型\")\npublic class LinkDto implements Serializable {\n\tprivate static final long serialVersionUID = 414254079011512757L;\n\t@ApiModelProperty(value = \"消息标题\", required = true)\n\tprivate String title;\n\t@ApiModelProperty(value = \"消息内容。如果太长只会部分展示\", required = true)\n\tprivate String text;\n\t@ApiModelProperty(value = \"点击消息跳转的URL\", required = true)\n\tprivate String messageUrl;\n\t@ApiModelProperty(value = \"图片URL\")\n\tprivate String picUrl;\n}\n"
  },
  {
    "path": "paascloud-provider-api/paascloud-provider-opc-api/src/main/java/com/paascloud/provider/model/dto/robot/MarkdownDto.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：MarkdownDto.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.model.dto.robot;\n\nimport io.swagger.annotations.ApiModel;\nimport io.swagger.annotations.ApiModelProperty;\nimport lombok.Data;\n\nimport java.io.Serializable;\n\n\n/**\n * The class Markdown dto.\n *\n * @author paascloud.net @gmail.com\n */\n@Data\n@ApiModel(value = \"link类型\")\npublic class MarkdownDto implements Serializable {\n\tprivate static final long serialVersionUID = 5169795915361197484L;\n\t/**\n\t * 首屏会话透出的展示内容\n\t */\n\t@ApiModelProperty(value = \"首屏会话透出的展示内容\", required = true)\n\tprivate String title;\n\t/**\n\t * markdown格式的消息\n\t */\n\t@ApiModelProperty(value = \"markdown格式的消息\", required = true)\n\tprivate String text;\n}\n"
  },
  {
    "path": "paascloud-provider-api/paascloud-provider-opc-api/src/main/java/com/paascloud/provider/model/dto/robot/TextDto.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：TextDto.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.model.dto.robot;\n\nimport io.swagger.annotations.ApiModel;\nimport io.swagger.annotations.ApiModelProperty;\nimport lombok.Data;\n\nimport java.io.Serializable;\n\n\n/**\n * The class Text dto.\n *\n * @author paascloud.net @gmail.com\n */\n@Data\n@ApiModel(value = \"text类型\")\npublic class TextDto implements Serializable {\n\tprivate static final long serialVersionUID = 8825625125019746717L;\n\t@ApiModelProperty(value = \"消息内容\", required = true)\n\tprivate String content;\n}\n"
  },
  {
    "path": "paascloud-provider-api/paascloud-provider-opc-api/src/main/java/com/paascloud/provider/model/enums/RobotMsgTypeEnum.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：RobotMsgTypeEnum.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.model.enums;\n\n/**\n * The enum Robot msg type enum.\n *\n * @author paascloud.net @gmail.com\n */\npublic enum RobotMsgTypeEnum {\n\t/**\n\t * 操作日志\n\t */\n\tMARKDOWN(\"markdown\", \"markdown\"),\n\t/**\n\t * Link robot msg type enum.\n\t */\n\tLINK(\"link\", \"link\"),\n\t/**\n\t * Text robot msg type enum.\n\t */\n\tTEXT(\"text\", \"text\"),;\n\n\t/**\n\t * The Type.\n\t */\n\tString type;\n\t/**\n\t * The Name.\n\t */\n\tString name;\n\n\tRobotMsgTypeEnum(String type, String name) {\n\t\tthis.type = type;\n\t\tthis.name = name;\n\t}\n\n\t/**\n\t * Gets type.\n\t *\n\t * @return the type\n\t */\n\tpublic String getType() {\n\t\treturn type;\n\t}\n\n\t/**\n\t * Gets name.\n\t *\n\t * @return the name\n\t */\n\tpublic String getName() {\n\t\treturn name;\n\t}\n\n\t/**\n\t * Gets name.\n\t *\n\t * @param type the type\n\t *\n\t * @return the name\n\t */\n\tpublic static String getName(String type) {\n\t\tfor (RobotMsgTypeEnum ele : RobotMsgTypeEnum.values()) {\n\t\t\tif (ele.getType().equals(type)) {\n\t\t\t\treturn ele.getName();\n\t\t\t}\n\t\t}\n\t\treturn null;\n\t}\n\n}\n"
  },
  {
    "path": "paascloud-provider-api/paascloud-provider-opc-api/src/main/java/com/paascloud/provider/model/factory/ChatRobotMsgFactory.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：ChatRobotMsgFactory.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.model.factory;\n\n\nimport com.paascloud.provider.model.dto.robot.*;\nimport com.paascloud.provider.model.enums.RobotMsgTypeEnum;\nimport lombok.AccessLevel;\nimport lombok.NoArgsConstructor;\n\n\n/**\n * 钉钉消息对象创建工厂.\n *\n * @author paascloud.net @gmail.com\n */\n@NoArgsConstructor(access = AccessLevel.PRIVATE)\npublic class ChatRobotMsgFactory {\n\n\t/**\n\t * 创建钉钉机器人Markdown消息\n\t *\n\t * @param webhookToken token\n\t * @param text         消息内容\n\t * @param title        标题\n\t * @param isAtAll      是否@所有人:true,否则为:false\n\t * @param atMobiles    被@人的手机号(在text内容里要有@手机号)\n\t *\n\t * @return chat robot msg dto\n\t */\n\tpublic static ChatRobotMsgDto createChatRobotMarkdownMsg(String webhookToken, String text, String title,\n\t                                                         boolean isAtAll, String[] atMobiles) {\n\t\tChatRobotMsgDto entity = new ChatRobotMsgDto();\n\t\tentity.setMsgType(RobotMsgTypeEnum.MARKDOWN.getType());\n\t\tentity.setWebhookToken(webhookToken);\n\n\t\tMarkdownDto markdownDto = new MarkdownDto();\n\t\tmarkdownDto.setTitle(title);\n\t\tmarkdownDto.setText(text);\n\t\tentity.setMarkdown(markdownDto);\n\n\t\tAtDto atDto = new AtDto();\n\t\tatDto.setAtAll(isAtAll);\n\t\tif (atMobiles != null && atMobiles.length > 0) {\n\t\t\tatDto.setAtMobiles(atMobiles);\n\t\t}\n\t\tentity.setAt(atDto);\n\t\treturn entity;\n\t}\n\n\t/**\n\t * 创建钉钉机器人Link消息\n\t *\n\t * @param webhookToken token\n\t * @param text         消息内容。如果太长只会部分展示\n\t * @param title        消息标题\n\t * @param messageUrl   点击消息跳转的URL\n\t * @param picUrl       图片URL\n\t *\n\t * @return chat robot msg dto\n\t */\n\tpublic static ChatRobotMsgDto createChatRobotLinkMsg(String webhookToken, String text, String title,\n\t                                                     String messageUrl, String picUrl) {\n\t\tChatRobotMsgDto entity = new ChatRobotMsgDto();\n\t\tentity.setMsgType(RobotMsgTypeEnum.LINK.getType());\n\t\tentity.setWebhookToken(webhookToken);\n\t\tLinkDto linkDto = new LinkDto();\n\t\tlinkDto.setText(text);\n\t\tlinkDto.setTitle(title);\n\t\tlinkDto.setPicUrl(picUrl);\n\t\tlinkDto.setMessageUrl(messageUrl);\n\t\tentity.setLink(linkDto);\n\t\treturn entity;\n\t}\n\n\t/**\n\t * 创建钉钉机器人文本消息\n\t *\n\t * @param webhookToken token\n\t * @param text         消息内容\n\t * @param isAtAll      是否@所有人:true,否则为:false\n\t * @param atMobiles    被@人的手机号(在text内容里要有@手机号)\n\t *\n\t * @return chat robot msg dto\n\t */\n\tpublic static ChatRobotMsgDto createChatRobotTextMsg(String webhookToken, String text,\n\t                                                     boolean isAtAll, String[] atMobiles) {\n\t\tChatRobotMsgDto entity = new ChatRobotMsgDto();\n\t\tentity.setMsgType(RobotMsgTypeEnum.TEXT.getType());\n\t\tentity.setWebhookToken(webhookToken);\n\n\t\tTextDto textDto = new TextDto();\n\t\ttextDto.setContent(text);\n\t\tentity.setText(textDto);\n\n\t\tAtDto atDto = new AtDto();\n\t\tatDto.setAtAll(isAtAll);\n\t\tif (atMobiles != null && atMobiles.length > 0) {\n\t\t\tatDto.setAtMobiles(atMobiles);\n\t\t}\n\t\tentity.setAt(atDto);\n\t\treturn entity;\n\t}\n\n}\n"
  },
  {
    "path": "paascloud-provider-api/paascloud-provider-opc-api/src/main/java/com/paascloud/provider/service/DingtalkFeignApi.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：DingtalkFeignApi.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.service;\n\n\nimport com.paascloud.annotation.NoNeedAccessAuthentication;\nimport com.paascloud.provider.model.dto.robot.ChatRobotMsgDto;\nimport com.paascloud.provider.service.hystrix.DingtalkFeignApiHystrix;\nimport com.paascloud.security.feign.OAuth2FeignAutoConfiguration;\nimport com.paascloud.wrapper.Wrapper;\nimport org.springframework.cloud.netflix.feign.FeignClient;\nimport org.springframework.web.bind.annotation.PostMapping;\nimport org.springframework.web.bind.annotation.RequestBody;\n\n/**\n * The interface Dingtalk feign api.\n *\n * @author paascloud.net @gmail.com\n */\n@FeignClient(value = \"paascloud-provider-opc\", configuration = OAuth2FeignAutoConfiguration.class, fallback = DingtalkFeignApiHystrix.class)\npublic interface DingtalkFeignApi {\n\n\t/**\n\t * 钉钉机器人推送消息.\n\t *\n\t * @param uacUserReqDto the uac user req dto\n\t *\n\t * @return the wrapper\n\t */\n\t@PostMapping(value = \"/api/opc/dingtalk/sendChatRobotMsg\")\n\t@NoNeedAccessAuthentication\n\tWrapper<Boolean> sendChatRobotMsg(@RequestBody ChatRobotMsgDto uacUserReqDto);\n}\n"
  },
  {
    "path": "paascloud-provider-api/paascloud-provider-opc-api/src/main/java/com/paascloud/provider/service/OpcGaodeFeignApi.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：OpcGaodeFeignApi.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.service;\n\nimport com.paascloud.provider.model.dto.gaode.GaodeLocation;\nimport com.paascloud.provider.service.hystrix.OpcGaodeFeignApiHystrix;\nimport com.paascloud.security.feign.OAuth2FeignAutoConfiguration;\nimport com.paascloud.wrapper.Wrapper;\nimport org.springframework.cloud.netflix.feign.FeignClient;\nimport org.springframework.web.bind.annotation.PostMapping;\nimport org.springframework.web.bind.annotation.RequestParam;\n\n/**\n * The interface Opc gao feign api.\n *\n * @author paascloud.net @gmail.com\n */\n@FeignClient(value = \"paascloud-provider-opc\", configuration = OAuth2FeignAutoConfiguration.class, fallback = OpcGaodeFeignApiHystrix.class)\npublic interface OpcGaodeFeignApi {\n\n\t/**\n\t * IP定位.\n\t *\n\t * @param ipAddr the ip addr\n\t *\n\t * @return the location by ip addr\n\t */\n\t@PostMapping(value = \"/api/auth/getLocationByIpAddr\")\n\tWrapper<GaodeLocation> getLocationByIpAddr(@RequestParam(\"ipAddr\") String ipAddr);\n}\n"
  },
  {
    "path": "paascloud-provider-api/paascloud-provider-opc-api/src/main/java/com/paascloud/provider/service/OpcMqMessageFeignApi.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：OpcMqMessageFeignApi.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.service;\n\n\nimport com.github.pagehelper.PageInfo;\nimport com.paascloud.base.dto.MessageQueryDto;\nimport com.paascloud.base.dto.MqMessageVo;\nimport com.paascloud.provider.service.hystrix.OpcMqMessageFeignApiHystrix;\nimport com.paascloud.security.feign.OAuth2FeignAutoConfiguration;\nimport com.paascloud.wrapper.Wrapper;\nimport org.springframework.cloud.netflix.feign.FeignClient;\nimport org.springframework.web.bind.annotation.PostMapping;\nimport org.springframework.web.bind.annotation.RequestBody;\nimport org.springframework.web.bind.annotation.RequestParam;\n\nimport java.util.List;\n\n\n/**\n * The interface Opc mq message feign api.\n *\n * @author paascloud.net @gmail.com\n */\n@FeignClient(value = \"paascloud-provider-opc\", configuration = OAuth2FeignAutoConfiguration.class, fallback = OpcMqMessageFeignApiHystrix.class)\npublic interface OpcMqMessageFeignApi {\n\n\t/**\n\t * Query waiting confirm message list wrapper.\n\t *\n\t * @param messageKeyList the message key list\n\t *\n\t * @return the wrapper\n\t */\n\t@PostMapping(value = \"/api/opc/message/queryMessageKeyList\")\n\tWrapper<List<String>> queryMessageKeyList(@RequestParam(\"messageKeyList\") List<String> messageKeyList);\n\n\t/**\n\t * Query message list with page wrapper.\n\t *\n\t * @param messageQueryDto the message query dto\n\t *\n\t * @return the wrapper\n\t */\n\t@PostMapping(value = \"/api/opc/message/queryMessageListWithPage\")\n\tWrapper<PageInfo<MqMessageVo>> queryMessageListWithPage(@RequestBody MessageQueryDto messageQueryDto);\n}\n"
  },
  {
    "path": "paascloud-provider-api/paascloud-provider-opc-api/src/main/java/com/paascloud/provider/service/OpcOssFeignApi.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：OpcOssFeignApi.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.service;\n\nimport com.paascloud.provider.model.dto.oss.*;\nimport com.paascloud.provider.service.hystrix.OpcOssFeignApiHystrix;\nimport com.paascloud.security.feign.OAuth2FeignAutoConfiguration;\nimport com.paascloud.wrapper.Wrapper;\nimport feign.codec.Encoder;\nimport feign.form.spring.SpringFormEncoder;\nimport org.springframework.cloud.netflix.feign.FeignClient;\nimport org.springframework.context.annotation.Bean;\nimport org.springframework.web.bind.annotation.PostMapping;\nimport org.springframework.web.bind.annotation.RequestBody;\nimport org.springframework.web.bind.annotation.RequestPart;\nimport org.springframework.web.multipart.MultipartFile;\n\nimport java.util.List;\n\n/**\n * The interface Opc oss feign api.\n *\n * @author paascloud.net @gmail.com\n */\n@FeignClient(value = \"paascloud-provider-opc\", configuration = OAuth2FeignAutoConfiguration.class, fallback = OpcOssFeignApiHystrix.class)\npublic interface OpcOssFeignApi {\n\n\t/**\n\t * 上传文件.\n\t *\n\t * @param optUploadFileReqDto the opt upload file req dto\n\t *\n\t * @return the wrapper\n\t */\n\t@PostMapping(value = \"/api/opc/oss/uploadFile\")\n\tWrapper<OptUploadFileRespDto> uploadFile(@RequestBody OptUploadFileReqDto optUploadFileReqDto);\n\n\t/**\n\t * 获取附件完整路径.\n\t *\n\t * @param optGetUrlRequest the opt get url request\n\t *\n\t * @return the file url\n\t */\n\t@PostMapping(value = \"/api/opc/oss/getFileUrl\")\n\tWrapper<String> getFileUrl(@RequestBody OptGetUrlRequest optGetUrlRequest);\n\n\t/**\n\t * List file url wrapper.\n\t *\n\t * @param urlRequest the url request\n\t *\n\t * @return the wrapper\n\t */\n\t@PostMapping(value = \"/api/opc/oss/listFileUrl\")\n\tWrapper<List<ElementImgUrlDto>> listFileUrl(@RequestBody OptBatchGetUrlRequest urlRequest);\n\n\t/**\n\t * Upload file with feign wrapper.\n\t *\n\t * @param file the file\n\t *\n\t * @return the wrapper\n\t */\n\t@PostMapping(value = \"/api/opc/oss/handleFileUpload\")\n\tWrapper<OptUploadFileRespDto> handleFileUpload(@RequestPart(value = \"file\") MultipartFile file);\n\n\t/**\n\t * 删除过期的文件.\n\t */\n\t@PostMapping(value = \"/api/opc/oss/deleteExpireFile\")\n\tvoid deleteExpireFile();\n\n\t/**\n\t * The class Multipart support config.\n\t *\n\t * @author paascloud.net @gmail.com\n\t */\n\tclass MultipartSupportConfig {\n\t\t/**\n\t\t * Feign form encoder encoder.\n\t\t *\n\t\t * @return the encoder\n\t\t */\n\t\t@Bean\n\t\tpublic Encoder feignFormEncoder() {\n\t\t\treturn new SpringFormEncoder();\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "paascloud-provider-api/paascloud-provider-opc-api/src/main/java/com/paascloud/provider/service/hystrix/DingtalkFeignApiHystrix.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：DingtalkFeignApiHystrix.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.service.hystrix;\n\n\nimport com.paascloud.provider.model.dto.robot.ChatRobotMsgDto;\nimport com.paascloud.provider.service.DingtalkFeignApi;\nimport com.paascloud.wrapper.Wrapper;\nimport org.springframework.stereotype.Component;\n\n\n/**\n * The class Chat robot feign api hystrix.\n *\n * @author paascloud.net @gmail.com\n */\n@Component\npublic class DingtalkFeignApiHystrix implements DingtalkFeignApi {\n\n\t@Override\n\tpublic Wrapper<Boolean> sendChatRobotMsg(final ChatRobotMsgDto uacUserReqDto) {\n\t\treturn null;\n\t}\n}\n"
  },
  {
    "path": "paascloud-provider-api/paascloud-provider-opc-api/src/main/java/com/paascloud/provider/service/hystrix/OpcGaodeFeignApiHystrix.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：OpcGaodeFeignApiHystrix.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.service.hystrix;\n\nimport com.paascloud.provider.model.dto.gaode.GaodeLocation;\nimport com.paascloud.provider.service.OpcGaodeFeignApi;\nimport com.paascloud.wrapper.Wrapper;\nimport org.springframework.stereotype.Component;\n\n/**\n * The class Opc oss feign api hystrix.\n *\n * @author paascloud.net@gmail.com\n */\n@Component\npublic class OpcGaodeFeignApiHystrix implements OpcGaodeFeignApi {\n\n\t@Override\n\tpublic Wrapper<GaodeLocation> getLocationByIpAddr(final String ipAddr) {\n\t\treturn null;\n\t}\n}\n"
  },
  {
    "path": "paascloud-provider-api/paascloud-provider-opc-api/src/main/java/com/paascloud/provider/service/hystrix/OpcMqMessageFeignApiHystrix.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：OpcMqMessageFeignApiHystrix.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.service.hystrix;\n\n\nimport com.github.pagehelper.PageInfo;\nimport com.paascloud.base.dto.MessageQueryDto;\nimport com.paascloud.base.dto.MqMessageVo;\nimport com.paascloud.provider.service.OpcMqMessageFeignApi;\nimport com.paascloud.wrapper.Wrapper;\nimport org.springframework.stereotype.Component;\n\nimport java.util.List;\n\n/**\n * The class Opc mq message feign api hystrix.\n *\n * @author paascloud.net @gmail.com\n */\n@Component\npublic class OpcMqMessageFeignApiHystrix implements OpcMqMessageFeignApi {\n\n\t@Override\n\tpublic Wrapper<List<String>> queryMessageKeyList(final List<String> messageKeyList) {\n\t\treturn null;\n\t}\n\n\t@Override\n\tpublic Wrapper<PageInfo<MqMessageVo>> queryMessageListWithPage(final MessageQueryDto messageQueryDto) {\n\t\treturn null;\n\t}\n}\n"
  },
  {
    "path": "paascloud-provider-api/paascloud-provider-opc-api/src/main/java/com/paascloud/provider/service/hystrix/OpcOssFeignApiHystrix.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：OpcOssFeignApiHystrix.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.service.hystrix;\n\nimport com.paascloud.provider.model.dto.oss.*;\nimport com.paascloud.provider.service.OpcOssFeignApi;\nimport com.paascloud.wrapper.Wrapper;\nimport org.springframework.stereotype.Component;\nimport org.springframework.web.multipart.MultipartFile;\n\nimport java.util.List;\n\n/**\n * The class Opc oss feign api hystrix.\n *\n * @author paascloud.net@gmail.com\n */\n@Component\npublic class OpcOssFeignApiHystrix implements OpcOssFeignApi {\n\t@Override\n\tpublic Wrapper<OptUploadFileRespDto> uploadFile(final OptUploadFileReqDto optUploadFileReqDto) {\n\t\treturn null;\n\t}\n\n\t@Override\n\tpublic Wrapper<String> getFileUrl(final OptGetUrlRequest optGetUrlRequest) {\n\t\treturn null;\n\t}\n\n\t@Override\n\tpublic Wrapper<List<ElementImgUrlDto>> listFileUrl(final OptBatchGetUrlRequest urlRequest) {\n\t\treturn null;\n\t}\n\n\t@Override\n\tpublic Wrapper<OptUploadFileRespDto> handleFileUpload(final MultipartFile file) {\n\t\treturn null;\n\t}\n\n\t@Override\n\tpublic void deleteExpireFile() {\n\n\t}\n}\n"
  },
  {
    "path": "paascloud-provider-api/paascloud-provider-sdk-api/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\"\n         xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n         xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n  <parent>\n\t<groupId>com.liuzm.paascloud.provider.api</groupId>\n\t<artifactId>paascloud-provider-api</artifactId>\n\t<version>1.0</version>\n\t</parent>\n  <modelVersion>4.0.0</modelVersion>\n\n  <artifactId>paascloud-provider-sdk-api</artifactId>\n\n  <dependencies>\n    <dependency>\n      <groupId>org.springframework.boot</groupId>\n      <artifactId>spring-boot</artifactId>\n      <scope>provided</scope>\n    </dependency>\n    <dependency>\n      <groupId>org.springframework.boot</groupId>\n      <artifactId>spring-boot-autoconfigure</artifactId>\n      <scope>provided</scope>\n    </dependency>\n    <dependency>\n      <groupId>org.springframework.boot</groupId>\n      <artifactId>spring-boot-configuration-processor</artifactId>\n      <optional>true</optional>\n    </dependency>\n    <dependency>\n      <groupId>org.projectlombok</groupId>\n      <artifactId>lombok</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.modelmapper</groupId>\n      <artifactId>modelmapper</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>com.liuzm.paascloud.provider.api</groupId>\n      <artifactId>paascloud-provider-tpc-api</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>com.liuzm.paascloud.common</groupId>\n      <artifactId>paascloud-common-zk</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.mybatis</groupId>\n      <artifactId>mybatis</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>tk.mybatis</groupId>\n      <artifactId>mapper</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.aspectj</groupId>\n      <artifactId>aspectjweaver</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.springframework</groupId>\n      <artifactId>spring-tx</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.apache.rocketmq</groupId>\n      <artifactId>rocketmq-client</artifactId>\n    </dependency>\n  </dependencies>\n  <build>\n    <plugins>\n      <plugin>\n        <groupId>org.apache.maven.plugins</groupId>\n        <artifactId>maven-compiler-plugin</artifactId>\n        <version>${maven-compiler-plugin.version}</version>\n        <configuration>\n          <source>${java.version}</source>\n          <target>${java.version}</target>\n          <testSource>${java.version}</testSource>\n          <testTarget>${java.version}</testTarget>\n        </configuration>\n      </plugin>\n      <!--配置生成Javadoc包-->\n      <plugin>\n        <groupId>org.apache.maven.plugins</groupId>\n        <artifactId>maven-javadoc-plugin</artifactId>\n        <version>${maven-javadoc-plugin.version}</version>\n        <configuration>\n          <encoding>UTF-8</encoding>\n          <aggregate>true</aggregate>\n          <charset>UTF-8</charset>\n          <docencoding>UTF-8</docencoding>\n        </configuration>\n        <executions>\n          <execution>\n            <id>attach-javadocs</id>\n            <goals>\n              <goal>jar</goal>\n            </goals>\n          </execution>\n        </executions>\n      </plugin>\n      <!--配置生成源码包-->\n      <plugin>\n        <groupId>org.apache.maven.plugins</groupId>\n        <artifactId>maven-source-plugin</artifactId>\n        <version>${maven-source-plugin.version}</version>\n        <executions>\n          <execution>\n            <id>attach-sources</id>\n            <goals>\n              <goal>jar</goal>\n            </goals>\n          </execution>\n        </executions>\n      </plugin>\n    </plugins>\n  </build>\n</project>"
  },
  {
    "path": "paascloud-provider-api/paascloud-provider-sdk-api/src/main/java/com/paascloud/provider/annotation/MqConsumerStore.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：MqConsumerStore.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.annotation;\n\nimport java.lang.annotation.*;\n\n\n/**\n * 保存消费者消息.\n *\n * @author paascloud.net @gmail.com\n */\n@Target({ElementType.METHOD, ElementType.TYPE})\n@Retention(RetentionPolicy.RUNTIME)\n@Inherited\n@Documented\npublic @interface MqConsumerStore {\n\n\tboolean storePreStatus() default true;\n}\n"
  },
  {
    "path": "paascloud-provider-api/paascloud-provider-sdk-api/src/main/java/com/paascloud/provider/annotation/MqProducerStore.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：MqProducerStore.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.annotation;\n\nimport com.paascloud.provider.model.enums.DelayLevelEnum;\nimport com.paascloud.provider.model.enums.MqOrderTypeEnum;\nimport com.paascloud.provider.model.enums.MqSendTypeEnum;\n\nimport java.lang.annotation.*;\n\n\n/**\n * 保存生产者消息.\n *\n * @author paascloud.net @gmail.com\n */\n@Target({ElementType.METHOD, ElementType.TYPE})\n@Retention(RetentionPolicy.RUNTIME)\n@Inherited\n@Documented\npublic @interface MqProducerStore {\n\tMqSendTypeEnum sendType() default MqSendTypeEnum.WAIT_CONFIRM;\n\n\tMqOrderTypeEnum orderType() default MqOrderTypeEnum.ORDER;\n\n\tDelayLevelEnum delayLevel() default DelayLevelEnum.ZERO;\n}\n"
  },
  {
    "path": "paascloud-provider-api/paascloud-provider-sdk-api/src/main/java/com/paascloud/provider/aspect/MqConsumerStoreAspect.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：MqConsumerStoreAspect.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.aspect;\n\nimport com.paascloud.base.enums.ErrorCodeEnum;\nimport com.paascloud.provider.annotation.MqConsumerStore;\nimport com.paascloud.provider.exceptions.TpcBizException;\nimport com.paascloud.provider.model.domain.MqMessageData;\nimport com.paascloud.provider.model.enums.MqMessageTypeEnum;\nimport com.paascloud.provider.service.MqMessageService;\nimport lombok.extern.slf4j.Slf4j;\nimport org.apache.rocketmq.common.message.MessageExt;\nimport org.aspectj.lang.JoinPoint;\nimport org.aspectj.lang.ProceedingJoinPoint;\nimport org.aspectj.lang.annotation.Around;\nimport org.aspectj.lang.annotation.Aspect;\nimport org.aspectj.lang.annotation.Pointcut;\nimport org.aspectj.lang.reflect.MethodSignature;\nimport org.springframework.beans.factory.annotation.Value;\n\nimport javax.annotation.Resource;\nimport java.lang.reflect.Method;\nimport java.util.List;\n\n\n/**\n * The class Mq consumer store aspect.\n *\n * @author paascloud.net @gmail.com\n */\n@Slf4j\n@Aspect\npublic class MqConsumerStoreAspect {\n\n\t@Resource\n\tprivate MqMessageService mqMessageService;\n\t@Value(\"${paascloud.aliyun.rocketMq.consumerGroup}\")\n\tprivate String consumerGroup;\n\n\tprivate static final String CONSUME_SUCCESS = \"CONSUME_SUCCESS\";\n\n\t/**\n\t * Add exe time annotation pointcut.\n\t */\n\t@Pointcut(\"@annotation(com.paascloud.provider.annotation.MqConsumerStore)\")\n\tpublic void mqConsumerStoreAnnotationPointcut() {\n\n\t}\n\n\t/**\n\t * Add exe time method object.\n\t *\n\t * @param joinPoint the join point\n\t *\n\t * @return the object\n\t *\n\t * @throws Throwable the throwable\n\t */\n\t@Around(value = \"mqConsumerStoreAnnotationPointcut()\")\n\tpublic Object processMqConsumerStoreJoinPoint(ProceedingJoinPoint joinPoint) throws Throwable {\n\n\t\tlog.info(\"processMqConsumerStoreJoinPoint - 线程id={}\", Thread.currentThread().getId());\n\t\tObject result;\n\t\tlong startTime = System.currentTimeMillis();\n\t\tObject[] args = joinPoint.getArgs();\n\t\tMqConsumerStore annotation = getAnnotation(joinPoint);\n\t\tboolean isStorePreStatus = annotation.storePreStatus();\n\t\tList<MessageExt> messageExtList;\n\t\tif (args == null || args.length == 0) {\n\t\t\tthrow new TpcBizException(ErrorCodeEnum.TPC10050005);\n\t\t}\n\n\t\tif (!(args[0] instanceof List)) {\n\t\t\tthrow new TpcBizException(ErrorCodeEnum.GL99990001);\n\t\t}\n\n\t\ttry {\n\t\t\tmessageExtList = (List<MessageExt>) args[0];\n\t\t} catch (Exception e) {\n\t\t\tlog.error(\"processMqConsumerStoreJoinPoint={}\", e.getMessage(), e);\n\t\t\tthrow new TpcBizException(ErrorCodeEnum.GL99990001);\n\t\t}\n\n\t\tMqMessageData dto = this.getTpcMqMessageDto(messageExtList.get(0));\n\t\tfinal String messageKey = dto.getMessageKey();\n\t\tif (isStorePreStatus) {\n\t\t\tmqMessageService.confirmReceiveMessage(consumerGroup, dto);\n\t\t}\n\t\tString methodName = joinPoint.getSignature().getName();\n\t\ttry {\n\t\t\tresult = joinPoint.proceed();\n\t\t\tlog.info(\"result={}\", result);\n\t\t\tif (CONSUME_SUCCESS.equals(result.toString())) {\n\t\t\t\tmqMessageService.saveAndConfirmFinishMessage(consumerGroup, messageKey);\n\t\t\t}\n\t\t} catch (Exception e) {\n\t\t\tlog.error(\"发送可靠消息, 目标方法[{}], 出现异常={}\", methodName, e.getMessage(), e);\n\t\t\tthrow e;\n\t\t} finally {\n\t\t\tlog.info(\"发送可靠消息 目标方法[{}], 总耗时={}\", methodName, System.currentTimeMillis() - startTime);\n\t\t}\n\t\treturn result;\n\t}\n\n\tprivate MqConsumerStore getAnnotation(JoinPoint joinPoint) {\n\t\tMethodSignature methodSignature = (MethodSignature) joinPoint.getSignature();\n\t\tMethod method = methodSignature.getMethod();\n\t\treturn method.getAnnotation(MqConsumerStore.class);\n\t}\n\n\tprivate MqMessageData getTpcMqMessageDto(MessageExt messageExt) {\n\t\tMqMessageData data = new MqMessageData();\n\t\tdata.setMessageBody(new String(messageExt.getBody()));\n\t\tdata.setMessageKey(messageExt.getKeys());\n\t\tdata.setMessageTag(messageExt.getTags());\n\t\tdata.setMessageTopic(messageExt.getTopic());\n\t\tdata.setMessageType(MqMessageTypeEnum.CONSUMER_MESSAGE.messageType());\n\t\treturn data;\n\t}\n}\n"
  },
  {
    "path": "paascloud-provider-api/paascloud-provider-sdk-api/src/main/java/com/paascloud/provider/aspect/MqProducerStoreAspect.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：MqProducerStoreAspect.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.aspect;\n\nimport com.paascloud.base.enums.ErrorCodeEnum;\nimport com.paascloud.provider.annotation.MqProducerStore;\nimport com.paascloud.provider.exceptions.TpcBizException;\nimport com.paascloud.provider.model.domain.MqMessageData;\nimport com.paascloud.provider.model.enums.DelayLevelEnum;\nimport com.paascloud.provider.model.enums.MqSendTypeEnum;\nimport com.paascloud.provider.service.MqMessageService;\nimport lombok.extern.slf4j.Slf4j;\nimport org.aspectj.lang.JoinPoint;\nimport org.aspectj.lang.ProceedingJoinPoint;\nimport org.aspectj.lang.annotation.Around;\nimport org.aspectj.lang.annotation.Aspect;\nimport org.aspectj.lang.annotation.Pointcut;\nimport org.aspectj.lang.reflect.MethodSignature;\nimport org.springframework.beans.factory.annotation.Value;\nimport org.springframework.core.task.TaskExecutor;\n\nimport javax.annotation.Resource;\nimport java.lang.reflect.Method;\n\n\n/**\n * The class Mq producer store aspect.\n *\n * @author paascloud.net @gmail.com\n */\n@Slf4j\n@Aspect\npublic class MqProducerStoreAspect {\n\t@Resource\n\tprivate MqMessageService mqMessageService;\n\n\t@Value(\"${paascloud.aliyun.rocketMq.producerGroup}\")\n\tprivate String producerGroup;\n\n\t@Resource\n\tprivate TaskExecutor taskExecutor;\n\n\t/**\n\t * Add exe time annotation pointcut.\n\t */\n\t@Pointcut(\"@annotation(com.paascloud.provider.annotation.MqProducerStore)\")\n\tpublic void mqProducerStoreAnnotationPointcut() {\n\n\t}\n\n\t/**\n\t * Add exe time method object.\n\t *\n\t * @param joinPoint the join point\n\t *\n\t * @return the object\n\t */\n\t@Around(value = \"mqProducerStoreAnnotationPointcut()\")\n\tpublic Object processMqProducerStoreJoinPoint(ProceedingJoinPoint joinPoint) throws Throwable {\n\t\tlog.info(\"processMqProducerStoreJoinPoint - 线程id={}\", Thread.currentThread().getId());\n\t\tObject result;\n\t\tObject[] args = joinPoint.getArgs();\n\t\tMqProducerStore annotation = getAnnotation(joinPoint);\n\t\tMqSendTypeEnum type = annotation.sendType();\n\t\tint orderType = annotation.orderType().orderType();\n\t\tDelayLevelEnum delayLevelEnum = annotation.delayLevel();\n\t\tif (args.length == 0) {\n\t\t\tthrow new TpcBizException(ErrorCodeEnum.TPC10050005);\n\t\t}\n\t\tMqMessageData domain = null;\n\t\tfor (Object object : args) {\n\t\t\tif (object instanceof MqMessageData) {\n\t\t\t\tdomain = (MqMessageData) object;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tif (domain == null) {\n\t\t\tthrow new TpcBizException(ErrorCodeEnum.TPC10050005);\n\t\t}\n\n\t\tdomain.setOrderType(orderType);\n\t\tdomain.setProducerGroup(producerGroup);\n\t\tif (type == MqSendTypeEnum.WAIT_CONFIRM) {\n\t\t\tif (delayLevelEnum != DelayLevelEnum.ZERO) {\n\t\t\t\tdomain.setDelayLevel(delayLevelEnum.delayLevel());\n\t\t\t}\n\t\t\tmqMessageService.saveWaitConfirmMessage(domain);\n\t\t}\n\t\tresult = joinPoint.proceed();\n\t\tif (type == MqSendTypeEnum.SAVE_AND_SEND) {\n\t\t\tmqMessageService.saveAndSendMessage(domain);\n\t\t} else if (type == MqSendTypeEnum.DIRECT_SEND) {\n\t\t\tmqMessageService.directSendMessage(domain);\n\t\t} else {\n\t\t\tfinal MqMessageData finalDomain = domain;\n\t\t\ttaskExecutor.execute(() -> mqMessageService.confirmAndSendMessage(finalDomain.getMessageKey()));\n\t\t}\n\t\treturn result;\n\t}\n\n\tprivate static MqProducerStore getAnnotation(JoinPoint joinPoint) {\n\t\tMethodSignature methodSignature = (MethodSignature) joinPoint.getSignature();\n\t\tMethod method = methodSignature.getMethod();\n\t\treturn method.getAnnotation(MqProducerStore.class);\n\t}\n}\n"
  },
  {
    "path": "paascloud-provider-api/paascloud-provider-sdk-api/src/main/java/com/paascloud/provider/autoconfigure/MessageAutoConfiguration.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：MessageAutoConfiguration.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.autoconfigure;\n\nimport org.springframework.context.annotation.Configuration;\n\n/**\n * The class Elastic job auto configuration.\n *\n * @author paascloud.net @gmail.com\n */\n@Configuration\npublic class MessageAutoConfiguration {\n\n}\n"
  },
  {
    "path": "paascloud-provider-api/paascloud-provider-sdk-api/src/main/java/com/paascloud/provider/autoconfigure/MessageBeanConfiguration.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：MessageBeanConfiguration.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.autoconfigure;\n\nimport com.paascloud.provider.aspect.MqConsumerStoreAspect;\nimport com.paascloud.provider.aspect.MqProducerStoreAspect;\nimport org.springframework.boot.autoconfigure.condition.ConditionalOnExpression;\nimport org.springframework.context.annotation.Bean;\nimport org.springframework.context.annotation.Configuration;\n\n/**\n * The class Elastic job auto configuration.\n *\n * @author paascloud.net @gmail.com\n */\n@Configuration\npublic class MessageBeanConfiguration {\n\t@Bean\n\t@ConditionalOnExpression(\"${paascloud.aliyun.rocketMq.reliableMessageConsumer:true}\")\n\tpublic MqConsumerStoreAspect mqConsumerStoreAspect() {\n\t\treturn new MqConsumerStoreAspect();\n\t}\n\n\t@Bean\n\t@ConditionalOnExpression(\"${paascloud.aliyun.rocketMq.reliableMessageProducer:true}\")\n\tpublic MqProducerStoreAspect mqProducerStoreAspect() {\n\t\treturn new MqProducerStoreAspect();\n\t}\n}\n"
  },
  {
    "path": "paascloud-provider-api/paascloud-provider-sdk-api/src/main/java/com/paascloud/provider/mapper/MqMessageDataMapper.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：MqMessageDataMapper.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.mapper;\n\nimport com.paascloud.base.dto.MessageQueryDto;\nimport com.paascloud.base.dto.MqMessageVo;\nimport com.paascloud.provider.model.domain.MqMessageData;\nimport org.apache.ibatis.annotations.Mapper;\nimport org.apache.ibatis.annotations.Param;\nimport org.springframework.stereotype.Component;\n\nimport java.util.List;\n\n/**\n * The interface Mq message data mapper.\n *\n * @author paascloud.net @gmail.com\n */\n@Component\n@Mapper\npublic interface MqMessageDataMapper extends tk.mybatis.mapper.common.Mapper<MqMessageData> {\n\t/**\n\t * 获取7天前消息总数.\n\t *\n\t * @param shardingTotalCount the sharding total count\n\t * @param shardingItem       the sharding item\n\t * @param messageType        the message type\n\t *\n\t * @return the delete total count\n\t */\n\tint getBefore7DayTotalCount(@Param(\"shardingTotalCount\") int shardingTotalCount, @Param(\"shardingItem\") int shardingItem, @Param(\"messageType\") int messageType);\n\n\t/**\n\t * Gets id list before 7 day.\n\t *\n\t * @param shardingTotalCount the sharding total count\n\t * @param shardingItem       the sharding item\n\t * @param messageType        the message type\n\t * @param currentPage        the current page\n\t * @param pageSize           the page size\n\t *\n\t * @return the id list before 7 day\n\t */\n\tList<Long> getIdListBefore7Day(@Param(\"shardingTotalCount\") int shardingTotalCount, @Param(\"shardingItem\") int shardingItem, @Param(\"messageType\") int messageType, @Param(\"currentPage\") int currentPage, @Param(\"pageSize\") int pageSize);\n\n\t/**\n\t * Batch delete by id list.\n\t *\n\t * @param idList the id list\n\t *\n\t * @return the int\n\t */\n\tint batchDeleteByIdList(@Param(\"idList\") List<Long> idList);\n\n\t/**\n\t * Query message key list list.\n\t *\n\t * @param messageKeyList the message key list\n\t *\n\t * @return the list\n\t */\n\tList<String> queryMessageKeyList(@Param(\"messageKeyList\") List<String> messageKeyList);\n\n\t/**\n\t * Query message list with page list.\n\t *\n\t * @param messageQueryDto the message query dto\n\t *\n\t * @return the list\n\t */\n\tList<MqMessageVo> queryMessageListWithPage(MessageQueryDto messageQueryDto);\n}"
  },
  {
    "path": "paascloud-provider-api/paascloud-provider-sdk-api/src/main/java/com/paascloud/provider/model/domain/MqMessageData.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：MqMessageData.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.model.domain;\n\nimport com.paascloud.provider.model.dto.TpcMqMessageDto;\nimport lombok.Data;\nimport lombok.NoArgsConstructor;\n\nimport javax.persistence.*;\nimport java.util.Date;\n\n/**\n * The class Mq message data.\n *\n * @author paascloud.net @gmail.com\n */\n@Table(name = \"pc_mq_message_data\")\n@Data\n@NoArgsConstructor\npublic class MqMessageData {\n\t/**\n\t * ID\n\t */\n\t@Id\n\t@GeneratedValue(strategy = GenerationType.IDENTITY)\n\tprivate Long id;\n\n\t/**\n\t * 版本号\n\t */\n\tprivate Integer version;\n\n\t/**\n\t * 消息key\n\t */\n\t@Column(name = \"message_key\")\n\tprivate String messageKey;\n\n\t/**\n\t * topic\n\t */\n\t@Column(name = \"message_topic\")\n\tprivate String messageTopic;\n\n\t/**\n\t * tag\n\t */\n\t@Column(name = \"message_tag\")\n\tprivate String messageTag;\n\n\t/**\n\t * 消息内容\n\t */\n\t@Column(name = \"message_body\")\n\tprivate String messageBody;\n\n\t/**\n\t * 消息类型: 10 - 生产者 ; 20 - 消费者\n\t */\n\t@Column(name = \"message_type\")\n\tprivate Integer messageType;\n\n\t/**\n\t * 顺序类型, 0有序 1无序\n\t */\n\tprivate int orderType;\n\n\t/**\n\t * 消息状态\n\t */\n\tprivate Integer status;\n\n\t/**\n\t * 延时级别\n\t */\n\t@Column(name = \"delay_level\")\n\tprivate int delayLevel;\n\n\t/**\n\t * 创建人\n\t */\n\tprivate String creator;\n\n\t/**\n\t * 创建人ID\n\t */\n\t@Column(name = \"creator_id\")\n\tprivate Long creatorId;\n\n\t/**\n\t * 创建时间\n\t */\n\t@Column(name = \"created_time\")\n\tprivate Date createdTime;\n\n\t/**\n\t * 最近操作人\n\t */\n\t@Column(name = \"last_operator\")\n\tprivate String lastOperator;\n\n\t/**\n\t * 最后操作人ID\n\t */\n\t@Column(name = \"last_operator_id\")\n\tprivate Long lastOperatorId;\n\n\t/**\n\t * 更新时间\n\t */\n\t@Column(name = \"update_time\")\n\tprivate Date updateTime;\n\n\t/**\n\t * 是否删除 -0 未删除 -1 已删除\n\t */\n\tprivate Integer yn;\n\n\t/**\n\t * producer group name\n\t */\n\t@Transient\n\tprivate String producerGroup;\n\n\tpublic MqMessageData(final String msgBody, final String topic, final String tag, final String key) {\n\t\tthis.messageBody = msgBody;\n\t\tthis.messageTopic = topic;\n\t\tthis.messageTag = tag;\n\t\tthis.messageKey = key;\n\t}\n\n\t/**\n\t * Gets tpc mq message dto.\n\t *\n\t * @return the tpc mq message dto\n\t */\n\t@Transient\n\tpublic TpcMqMessageDto getTpcMqMessageDto() {\n\t\tTpcMqMessageDto tpcMqMessageDto = new TpcMqMessageDto();\n\t\ttpcMqMessageDto.setMessageBody(this.messageBody);\n\t\ttpcMqMessageDto.setMessageKey(this.messageKey);\n\t\ttpcMqMessageDto.setMessageTag(this.messageTag);\n\t\ttpcMqMessageDto.setMessageTopic(this.messageTopic);\n\t\ttpcMqMessageDto.setMessageType(this.messageType);\n\t\ttpcMqMessageDto.setRefNo(this.messageKey);\n\t\ttpcMqMessageDto.setDelayLevel(this.delayLevel);\n\t\ttpcMqMessageDto.setOrderType(this.orderType);\n\t\ttpcMqMessageDto.setProducerGroup(this.producerGroup);\n\t\treturn tpcMqMessageDto;\n\t}\n}"
  },
  {
    "path": "paascloud-provider-api/paascloud-provider-sdk-api/src/main/java/com/paascloud/provider/model/dto/UpdateAttachmentDto.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：UpdateAttachmentDto.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.model.dto;\n\n\nimport com.paascloud.base.dto.LoginAuthDto;\nimport lombok.AllArgsConstructor;\nimport lombok.Data;\n\nimport java.io.Serializable;\nimport java.util.List;\n\n/**\n * 更新福建表.\n *\n * @author paascloud.net @gmail.com\n */\n@Data\n@AllArgsConstructor\npublic class UpdateAttachmentDto implements Serializable {\n\tprivate static final long serialVersionUID = -768471033009336091L;\n\n\tpublic UpdateAttachmentDto() {\n\n\t}\n\n\tprivate String refNo;\n\t/**\n\t * 商品图片流水号集合\n\t */\n\tprivate List<Long> attachmentIdList;\n\n\t/**\n\t * 操作人信息\n\t */\n\tprivate LoginAuthDto loginAuthDto;\n}\n"
  },
  {
    "path": "paascloud-provider-api/paascloud-provider-sdk-api/src/main/java/com/paascloud/provider/model/enums/DelayLevelEnum.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：DelayLevelEnum.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.model.enums;\n\n/**\n * Rocketmq默认延时级别.\n *\n * @author paascloud.net @gmail.com\n */\npublic enum DelayLevelEnum {\n\t/**\n\t * Zero delay level enum.\n\t */\n\tZERO(0, \"不延时\"),\n\t/**\n\t * One delay level enum.\n\t */\n\tONE(1, \"1秒\"),\n\t/**\n\t * Two delay level enum.\n\t */\n\tTWO(2, \"5秒\"),\n\t/**\n\t * Three delay level enum.\n\t */\n\tTHREE(3, \"10秒\"),\n\t/**\n\t * Four delay level enum.\n\t */\n\tFOUR(4, \"30秒\"),\n\t/**\n\t * Five delay level enum.\n\t */\n\tFIVE(5, \"1分钟\"),\n\t/**\n\t * Six delay level enum.\n\t */\n\tSIX(6, \"2分钟\"),\n\t/**\n\t * Seven delay level enum.\n\t */\n\tSEVEN(7, \"3分钟\"),\n\t/**\n\t * Eight delay level enum.\n\t */\n\tEIGHT(8, \"4分钟\"),\n\t/**\n\t * Nine delay level enum.\n\t */\n\tNINE(9, \"5分钟\"),\n\t/**\n\t * Ten delay level enum.\n\t */\n\tTEN(10, \"6分钟\"),\n\t/**\n\t * Eleven delay level enum.\n\t */\n\tELEVEN(11, \"7分钟\"),\n\t/**\n\t * Twelve delay level enum.\n\t */\n\tTWELVE(12, \"8分钟\"),\n\t/**\n\t * Thirteen delay level enum.\n\t */\n\tTHIRTEEN(13, \"9分钟\"),\n\t/**\n\t * Fourteen delay level enum.\n\t */\n\tFOURTEEN(14, \"10分钟\"),\n\t/**\n\t * Fifteen delay level enum.\n\t */\n\tFIFTEEN(15, \"20分钟\"),\n\t/**\n\t * Sixteen delay level enum.\n\t */\n\tSIXTEEN(16, \"30分钟\"),\n\t/**\n\t * Seventeen delay level enum.\n\t */\n\tSEVENTEEN(17, \"1小时\"),\n\t/**\n\t * Eighteen delay level enum.\n\t */\n\tEIGHTEEN(18, \"2小时\");\n\n\tDelayLevelEnum(int delayLevel, String value) {\n\t\tthis.delayLevel = delayLevel;\n\t\tthis.value = value;\n\t}\n\n\tprivate int delayLevel;\n\tprivate String value;\n\n\t/**\n\t * Delay level int.\n\t *\n\t * @return the int\n\t */\n\tpublic int delayLevel() {\n\t\treturn delayLevel;\n\t}\n\n\t/**\n\t * Value string.\n\t *\n\t * @return the string\n\t */\n\tpublic String value() {\n\t\treturn value;\n\t}\n}\n"
  },
  {
    "path": "paascloud-provider-api/paascloud-provider-sdk-api/src/main/java/com/paascloud/provider/model/enums/MqMessageTypeEnum.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：MqMessageTypeEnum.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.model.enums;\n\n/**\n * The enum Mq message type enum.\n *\n * @author paascloud.net @gmail.com\n */\npublic enum MqMessageTypeEnum {\n\t/**\n\t * 生产者.\n\t */\n\tPRODUCER_MESSAGE(10, \"生产者\"),\n\t/**\n\t * 消费者.\n\t */\n\tCONSUMER_MESSAGE(20, \"消费者\");\n\n\tprivate int messageType;\n\n\tprivate String value;\n\n\tMqMessageTypeEnum(int messageType, String value) {\n\t\tthis.messageType = messageType;\n\t\tthis.value = value;\n\t}\n\n\t/**\n\t * Message type int.\n\t *\n\t * @return the int\n\t */\n\tpublic int messageType() {\n\t\treturn messageType;\n\t}\n\n\t/**\n\t * Value string.\n\t *\n\t * @return the string\n\t */\n\tpublic String value() {\n\t\treturn value;\n\t}\n\n}\n"
  },
  {
    "path": "paascloud-provider-api/paascloud-provider-sdk-api/src/main/java/com/paascloud/provider/model/enums/MqOrderTypeEnum.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：MqOrderTypeEnum.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.model.enums;\n\n/**\n * The enum Mq send type enum.\n *\n * @author paascloud.net @gmail.com\n */\npublic enum MqOrderTypeEnum {\n\t/**\n\t * 有序.\n\t */\n\tORDER(1),\n\t/**\n\t * 无序.\n\t */\n\tDIS_ORDER(0);\n\n\t/**\n\t * The Order type.\n\t */\n\tint orderType;\n\n\tMqOrderTypeEnum(final int orderType) {\n\t\tthis.orderType = orderType;\n\t}\n\n\t/**\n\t * Order type int.\n\t *\n\t * @return the int\n\t */\n\tpublic int orderType() {\n\t\treturn orderType;\n\t}\n}\n"
  },
  {
    "path": "paascloud-provider-api/paascloud-provider-sdk-api/src/main/java/com/paascloud/provider/model/enums/MqSendTypeEnum.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：MqSendTypeEnum.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.model.enums;\n\n/**\n * The enum Mq send type enum.\n *\n * @author paascloud.net @gmail.com\n */\npublic enum MqSendTypeEnum {\n\t/**\n\t * 等待确认.\n\t */\n\tWAIT_CONFIRM,\n\n\t/**\n\t * 直接发送.\n\t */\n\tSAVE_AND_SEND,\n\n\t/**\n\t * 直接发送\n\t */\n\t//TODO 消费切口 有问题, 日后修复 暂时不可用\n\t@Deprecated\n\tDIRECT_SEND\n}\n"
  },
  {
    "path": "paascloud-provider-api/paascloud-provider-sdk-api/src/main/java/com/paascloud/provider/service/MqMessageService.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：MqMessageService.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.service;\n\nimport com.github.pagehelper.PageInfo;\nimport com.paascloud.base.dto.MessageQueryDto;\nimport com.paascloud.base.dto.MqMessageVo;\nimport com.paascloud.provider.model.domain.MqMessageData;\nimport com.paascloud.provider.model.enums.MqSendTypeEnum;\nimport com.paascloud.wrapper.Wrapper;\n\nimport java.util.List;\n\n/**\n * The interface Tpc mq message feign api.\n *\n * @author paascloud.net @gmail.com\n */\npublic interface MqMessageService {\n\n\t/**\n\t * 保存生产者信息.\n\t *\n\t * @param mqMessageData the mq message data\n\t */\n\tvoid saveMqProducerMessage(MqMessageData mqMessageData);\n\n\t/**\n\t * Confirm and send message.\n\t *\n\t * @param messageKey the message key\n\t */\n\tvoid confirmAndSendMessage(String messageKey);\n\n\t/**\n\t * 保存消费者信息.\n\t *\n\t * @param mqMessageData the mq message data\n\t */\n\tvoid saveMqConsumerMessage(MqMessageData mqMessageData);\n\n\t/**\n\t * 根据messageKey删除消息记录.\n\t *\n\t * @param messageKey the message key\n\t * @param type       the type\n\t */\n\tvoid deleteMessageByMessageKey(String messageKey, MqSendTypeEnum type);\n\n\t/**\n\t * Confirm receive message.\n\t *\n\t * @param cid 消费者分组id\n\t * @param dto the dto\n\t */\n\tvoid confirmReceiveMessage(String cid, MqMessageData dto);\n\n\t/**\n\t * Save and confirm finish message.\n\t *\n\t * @param cid        消费者分组id\n\t * @param messageKey the message key\n\t */\n\tvoid saveAndConfirmFinishMessage(String cid, String messageKey);\n\n\t/**\n\t * Delete mq producer message.\n\t *\n\t * @param shardingTotalCount the sharding total count\n\t * @param shardingItem       the sharding item\n\t * @param tags               the tags\n\t */\n\tvoid deleteMqMessage(int shardingTotalCount, int shardingItem, String tags);\n\n\t/**\n\t * Delete message topic.\n\t *\n\t * @param body the body\n\t * @param tags the tags\n\t */\n\tvoid deleteMessageTopic(String body, String tags);\n\n\t/**\n\t * 查询含有的messageKey.\n\t *\n\t * @param messageKeyList the message key list\n\t *\n\t * @return the wrapper\n\t */\n\tList<String> queryMessageKeyList(List<String> messageKeyList);\n\n\t/**\n\t * 保存等待确认的消息(前置拦截器).\n\t *\n\t * @param mqMessageData the mq message data\n\t */\n\tvoid saveWaitConfirmMessage(MqMessageData mqMessageData);\n\n\n\t/**\n\t * 保存并发送消息(后置拦截器).\n\t *\n\t * @param mqMessageData the mq message data\n\t */\n\tvoid saveAndSendMessage(MqMessageData mqMessageData);\n\n\t/**\n\t * 直接发送消息(后置拦截器).\n\t *\n\t * @param mqMessageData the mq message data\n\t */\n\tvoid directSendMessage(MqMessageData mqMessageData);\n\n\t/**\n\t * Query message list with page wrapper.\n\t *\n\t * @param messageQueryDto the message query dto\n\t *\n\t * @return the wrapper\n\t */\n\tWrapper<PageInfo<MqMessageVo>> queryMessageListWithPage(MessageQueryDto messageQueryDto);\n}\n"
  },
  {
    "path": "paascloud-provider-api/paascloud-provider-sdk-api/src/main/java/com/paascloud/provider/service/impl/MqMessageServiceImpl.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：MqMessageServiceImpl.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.service.impl;\n\nimport com.alibaba.fastjson.JSON;\nimport com.github.pagehelper.PageHelper;\nimport com.github.pagehelper.PageInfo;\nimport com.google.common.collect.Lists;\nimport com.paascloud.PublicUtil;\nimport com.paascloud.base.constant.AliyunMqTopicConstants;\nimport com.paascloud.base.dto.MessageQueryDto;\nimport com.paascloud.base.dto.MqMessageVo;\nimport com.paascloud.base.dto.ShardingContextDto;\nimport com.paascloud.base.enums.ErrorCodeEnum;\nimport com.paascloud.core.generator.UniqueIdGenerator;\nimport com.paascloud.provider.exceptions.TpcBizException;\nimport com.paascloud.provider.mapper.MqMessageDataMapper;\nimport com.paascloud.provider.model.domain.MqMessageData;\nimport com.paascloud.provider.model.dto.TpcMqMessageDto;\nimport com.paascloud.provider.model.enums.MqMessageTypeEnum;\nimport com.paascloud.provider.model.enums.MqSendTypeEnum;\nimport com.paascloud.provider.service.MqMessageService;\nimport com.paascloud.provider.service.TpcMqMessageFeignApi;\nimport com.paascloud.wrapper.WrapMapper;\nimport com.paascloud.wrapper.Wrapper;\nimport lombok.extern.slf4j.Slf4j;\nimport org.apache.commons.lang.StringUtils;\nimport org.springframework.beans.factory.annotation.Value;\nimport org.springframework.core.task.TaskExecutor;\nimport org.springframework.stereotype.Service;\nimport org.springframework.transaction.annotation.Transactional;\n\nimport javax.annotation.Resource;\nimport java.util.List;\n\n/**\n * The class Mq message service.\n *\n * @author paascloud.net @gmail.com\n */\n@Slf4j\n@Service\npublic class MqMessageServiceImpl implements MqMessageService {\n\t@Resource\n\tprivate MqMessageDataMapper mqMessageDataMapper;\n\t@Resource\n\tprivate TpcMqMessageFeignApi tpcMqMessageFeignApi;\n\t@Resource\n\tprivate TaskExecutor taskExecutor;\n\n\t@Value(\"${spring.profiles.active}\")\n\tString profile;\n\t@Value(\"${spring.application.name}\")\n\tString applicationName;\n\n\t@Override\n\tpublic void saveMqProducerMessage(MqMessageData mqMessageData) {\n\t\t// 校验消息数据\n\t\tthis.checkMessage(mqMessageData);\n\t\t// 先保存消息\n\t\tmqMessageData.setMessageType(MqMessageTypeEnum.PRODUCER_MESSAGE.messageType());\n\t\tmqMessageData.setId(UniqueIdGenerator.generateId());\n\t\tmqMessageDataMapper.insertSelective(mqMessageData);\n\t}\n\n\tprivate void checkMessage(MqMessageData mqMessageData) {\n\t\tif (null == mqMessageData) {\n\t\t\tthrow new TpcBizException(ErrorCodeEnum.TPC10050007);\n\t\t}\n\t\tString messageTopic = mqMessageData.getMessageTopic();\n\t\tString messageBody = mqMessageData.getMessageBody();\n\t\tString messageKey = mqMessageData.getMessageKey();\n\t\tString producerGroup = mqMessageData.getProducerGroup();\n\t\tif (StringUtils.isEmpty(messageKey)) {\n\t\t\tthrow new TpcBizException(ErrorCodeEnum.TPC10050009);\n\t\t}\n\t\tif (StringUtils.isEmpty(messageTopic)) {\n\t\t\tthrow new TpcBizException(ErrorCodeEnum.TPC10050001);\n\t\t}\n\t\tif (StringUtils.isEmpty(messageBody)) {\n\t\t\tthrow new TpcBizException(ErrorCodeEnum.TPC10050008, mqMessageData.getMessageKey());\n\t\t}\n\n\t\tif (StringUtils.isEmpty(producerGroup)) {\n\t\t\tthrow new TpcBizException(ErrorCodeEnum.TPC100500015, mqMessageData.getMessageKey());\n\t\t}\n\t}\n\n\t@Override\n\tpublic void confirmAndSendMessage(String messageKey) {\n\t\t// 发送确认消息给消息中心\n\t\ttry {\n\t\t\tWrapper wrapper = tpcMqMessageFeignApi.confirmAndSendMessage(messageKey);\n\t\t\tif (wrapper == null) {\n\t\t\t\tthrow new TpcBizException(ErrorCodeEnum.GL99990002);\n\t\t\t}\n\t\t\tif (wrapper.error()) {\n\t\t\t\tthrow new TpcBizException(ErrorCodeEnum.TPC10050004, wrapper.getMessage(), messageKey);\n\t\t\t}\n\t\t\tlog.info(\"<== saveMqProducerMessage - 存储并发送消息给消息中心成功. messageKey={}\", messageKey);\n\t\t} catch (Exception e) {\n\t\t\tlog.error(\"<== saveMqProducerMessage - 存储并发送消息给消息中心失败. messageKey={}\", messageKey, e);\n\t\t}\n\n\t}\n\n\t@Override\n\tpublic void saveMqConsumerMessage(MqMessageData mqMessageData) {\n\n\t}\n\n\t@Override\n\tpublic void deleteMessageByMessageKey(String messageKey, MqSendTypeEnum type) {\n\t\tlog.info(\"删除预发送消息. messageKey={}, type={}\", messageKey, type);\n\t\tif (type == MqSendTypeEnum.WAIT_CONFIRM) {\n\t\t\ttaskExecutor.execute(() -> tpcMqMessageFeignApi.deleteMessageByMessageKey(messageKey));\n\t\t}\n\t}\n\n\t@Override\n\t@Transactional(rollbackFor = Exception.class)\n\tpublic void confirmReceiveMessage(String cid, MqMessageData messageData) {\n\t\tfinal String messageKey = messageData.getMessageKey();\n\t\tlog.info(\"confirmReceiveMessage - 消费者={}, 确认收到key={}的消息\", cid, messageKey);\n\t\t// 先保存消息\n\t\tmessageData.setMessageType(MqMessageTypeEnum.CONSUMER_MESSAGE.messageType());\n\t\tmessageData.setId(UniqueIdGenerator.generateId());\n\t\tmqMessageDataMapper.insertSelective(messageData);\n\n\t\tWrapper wrapper = tpcMqMessageFeignApi.confirmReceiveMessage(cid, messageKey);\n\t\tlog.info(\"tpcMqMessageFeignApi.confirmReceiveMessage result={}\", wrapper);\n\t\tif (wrapper == null) {\n\t\t\tthrow new TpcBizException(ErrorCodeEnum.GL99990002);\n\t\t}\n\t\tif (wrapper.error()) {\n\t\t\tthrow new TpcBizException(ErrorCodeEnum.TPC10050004, wrapper.getMessage(), messageKey);\n\t\t}\n\t}\n\n\t@Override\n\tpublic void saveAndConfirmFinishMessage(String cid, String messageKey) {\n\t\tWrapper wrapper = tpcMqMessageFeignApi.confirmConsumedMessage(cid, messageKey);\n\t\tlog.info(\"tpcMqMessageFeignApi.confirmReceiveMessage result={}\", wrapper);\n\t\tif (wrapper == null) {\n\t\t\tthrow new TpcBizException(ErrorCodeEnum.GL99990002);\n\t\t}\n\t\tif (wrapper.error()) {\n\t\t\tthrow new TpcBizException(ErrorCodeEnum.TPC10050004, wrapper.getMessage(), messageKey);\n\t\t}\n\t}\n\n\t@Override\n\t@Transactional(rollbackFor = Exception.class)\n\tpublic void deleteMqMessage(final int shardingTotalCount, final int shardingItem, final String tags) {\n\t\t// 分页参数每页5000条\n\t\tint pageSize = 1000;\n\t\tint messageType;\n\t\tif (AliyunMqTopicConstants.MqTagEnum.DELETE_PRODUCER_MESSAGE.getTag().equals(tags)) {\n\t\t\tmessageType = MqMessageTypeEnum.PRODUCER_MESSAGE.messageType();\n\t\t} else {\n\t\t\tmessageType = MqMessageTypeEnum.CONSUMER_MESSAGE.messageType();\n\t\t}\n\n\t\tint totalCount = mqMessageDataMapper.getBefore7DayTotalCount(shardingTotalCount, shardingItem, messageType);\n\t\tif (totalCount == 0) {\n\t\t\treturn;\n\t\t}\n\t\t// 分页参数, 总页数\n\t\tint pageNum = (totalCount - 1) / pageSize + 1;\n\n\t\tfor (int currentPage = 1; currentPage < pageNum; currentPage++) {\n\t\t\tList<Long> idList = mqMessageDataMapper.getIdListBefore7Day(shardingTotalCount, shardingItem, messageType, currentPage, pageSize);\n\t\t\tmqMessageDataMapper.batchDeleteByIdList(idList);\n\t\t}\n\t}\n\n\t@Override\n\tpublic void deleteMessageTopic(final String body, final String tags) {\n\t\tShardingContextDto shardingContextDto = JSON.parseObject(body, ShardingContextDto.class);\n\t\tint shardingTotalCount = shardingContextDto.getShardingTotalCount();\n\t\tint shardingItem = shardingContextDto.getShardingItem();\n\n\t\tthis.deleteMqMessage(shardingTotalCount, shardingItem, tags);\n\t}\n\n\t@Override\n\tpublic List<String> queryMessageKeyList(final List<String> messageKeyList) {\n\t\treturn mqMessageDataMapper.queryMessageKeyList(messageKeyList);\n\t}\n\n\t@Override\n\t@Transactional(rollbackFor = Exception.class)\n\tpublic void saveWaitConfirmMessage(final MqMessageData mqMessageData) {\n\t\tthis.saveMqProducerMessage(mqMessageData);\n\t\t// 发送预发送状态的消息给消息中心\n\t\tTpcMqMessageDto tpcMqMessageDto = mqMessageData.getTpcMqMessageDto();\n\t\ttpcMqMessageFeignApi.saveMessageWaitingConfirm(tpcMqMessageDto);\n\t\tlog.info(\"<== saveWaitConfirmMessage - 存储预发送消息成功. messageKey={}\", mqMessageData.getMessageKey());\n\t}\n\n\t@Override\n\tpublic void saveAndSendMessage(final MqMessageData mqMessageData) {\n\t\tthis.saveMqProducerMessage(mqMessageData);\n\t\t// 发送预发送状态的消息给消息中心\n\t\tTpcMqMessageDto tpcMqMessageDto = mqMessageData.getTpcMqMessageDto();\n\t\ttpcMqMessageFeignApi.saveAndSendMessage(tpcMqMessageDto);\n\t\tlog.info(\"<== saveAndSendMessage - 保存并送消息成功. messageKey={}\", mqMessageData.getMessageKey());\n\t}\n\n\t@Override\n\tpublic void directSendMessage(final MqMessageData mqMessageData) {\n\t\t// 发送预发送状态的消息给消息中心\n\t\tTpcMqMessageDto tpcMqMessageDto = mqMessageData.getTpcMqMessageDto();\n\t\ttpcMqMessageFeignApi.directSendMessage(tpcMqMessageDto);\n\t\tlog.info(\"<== directSendMessage - 直接送消息成功. messageKey={}\", mqMessageData.getMessageKey());\n\t}\n\n\t@Override\n\tpublic Wrapper<PageInfo<MqMessageVo>> queryMessageListWithPage(final MessageQueryDto messageQueryDto) {\n\t\tPageHelper.startPage(messageQueryDto.getPageNum(), messageQueryDto.getPageSize());\n\t\tList<MqMessageVo> list = mqMessageDataMapper.queryMessageListWithPage(messageQueryDto);\n\n\t\tif (PublicUtil.isEmpty(list)) {\n\t\t\tlist = Lists.newArrayList();\n\t\t}\n\t\treturn WrapMapper.ok(new PageInfo<>(list));\n\t}\n}\n"
  },
  {
    "path": "paascloud-provider-api/paascloud-provider-sdk-api/src/main/resources/META-INF/spring.factories",
    "content": "# Auto Configure\norg.springframework.boot.autoconfigure.EnableAutoConfiguration=\\\n  com.paascloud.provider.autoconfigure.MessageAutoConfiguration"
  },
  {
    "path": "paascloud-provider-api/paascloud-provider-sdk-api/src/main/resources/sdk/mapper/MqMessageDataMapper.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n<!DOCTYPE mapper PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\" \"http://mybatis.org/dtd/mybatis-3-mapper.dtd\" >\n<mapper namespace=\"com.paascloud.provider.mapper.MqMessageDataMapper\">\n  <resultMap id=\"BaseResultMap\" type=\"com.paascloud.provider.model.domain.MqMessageData\">\n    <id column=\"id\" property=\"id\" jdbcType=\"BIGINT\"/>\n    <result column=\"version\" property=\"version\" jdbcType=\"INTEGER\"/>\n    <result column=\"message_key\" property=\"messageKey\" jdbcType=\"VARCHAR\"/>\n    <result column=\"message_topic\" property=\"messageTopic\" jdbcType=\"VARCHAR\"/>\n    <result column=\"message_tag\" property=\"messageTag\" jdbcType=\"VARCHAR\"/>\n    <result column=\"message_type\" property=\"messageType\" jdbcType=\"INTEGER\"/>\n    <result column=\"status\" property=\"status\" jdbcType=\"INTEGER\"/>\n    <result column=\"delay_level\" property=\"delayLevel\" jdbcType=\"INTEGER\"/>\n    <result column=\"order_type\" property=\"orderType\" jdbcType=\"INTEGER\"/>\n    <result column=\"creator\" property=\"creator\" jdbcType=\"VARCHAR\"/>\n    <result column=\"creator_id\" property=\"creatorId\" jdbcType=\"BIGINT\"/>\n    <result column=\"created_time\" property=\"createdTime\" jdbcType=\"TIMESTAMP\"/>\n    <result column=\"last_operator\" property=\"lastOperator\" jdbcType=\"VARCHAR\"/>\n    <result column=\"last_operator_id\" property=\"lastOperatorId\" jdbcType=\"BIGINT\"/>\n    <result column=\"update_time\" property=\"updateTime\" jdbcType=\"TIMESTAMP\"/>\n    <result column=\"yn\" property=\"yn\" jdbcType=\"INTEGER\"/>\n  </resultMap>\n  <resultMap id=\"ResultMapWithBLOBs\" type=\"com.paascloud.provider.model.domain.MqMessageData\" extends=\"BaseResultMap\">\n    <result column=\"message_body\" property=\"messageBody\" jdbcType=\"LONGVARCHAR\"/>\n  </resultMap>\n  <sql id=\"Base_Column_List\">\n    ${alias}.id,\n    ${alias}.version,\n    ${alias}.message_key,\n    ${alias}.message_topic,\n    ${alias}.message_tag,\n    ${alias}.message_type,\n    ${alias}.delay_level,\n    ${alias}.order_type,\n    ${alias}.status,\n    ${alias}.creator,\n    ${alias}.creator_id,\n    ${alias}.created_time,\n    ${alias}.last_operator,\n    ${alias}.last_operator_id,\n    ${alias}.update_time,\n    ${alias}.yn\n  </sql>\n  <sql id=\"Blob_Column_List\">\n    message_body\n  </sql>\n  <delete id=\"batchDeleteByIdList\">\n    delete from pc_mq_message_data\n    where id IN\n    <foreach collection=\"idList\" item=\"item\" index=\"index\" open=\"(\" close=\")\" separator=\",\">\n      #{item}\n    </foreach>\n  </delete>\n  <select id=\"getIdListBefore7Day\" resultType=\"java.lang.Long\">\n    SELECT id\n    FROM\n      pc_mq_message_data\n    WHERE\n      message_type = #{messageType}\n      AND mod(id, #{shardingTotalCount}) = #{shardingItem}\n      AND DATE_SUB(CURDATE(), INTERVAL 7 DAY) &gt; date(update_time)\n    ORDER BY id\n    LIMIT ${currentPage}, ${pageSize}\n  </select>\n  <select id=\"getBefore7DayTotalCount\" resultType=\"java.lang.Integer\">\n    SELECT count(0)\n    FROM\n      pc_mq_message_data\n    WHERE\n      message_type = #{messageType}\n      AND mod(id, #{shardingTotalCount}) = #{shardingItem}\n      AND DATE_SUB(CURDATE(), INTERVAL 7 DAY) &gt; date(update_time)\n  </select>\n  <select id=\"queryMessageKeyList\" resultType=\"java.lang.String\">\n    SELECT message_key from pc_mq_message_data\n    where message_key IN\n    <foreach collection=\"messageKeyList\" item=\"item\" index=\"index\" open=\"(\" close=\")\" separator=\",\">\n      #{item}\n    </foreach>\n  </select>\n  <select id=\"queryMessageListWithPage\" resultType=\"com.paascloud.base.dto.MqMessageVo\">\n    SELECT\n    <include refid=\"Base_Column_List\">\n      <property name=\"alias\" value=\"message\"/>\n    </include>\n    ,\n    <include refid=\"Blob_Column_List\">\n      <property name=\"alias\" value=\"message\"/>\n    </include>\n    FROM\n    pc_mq_message_data message\n    WHERE 1 = 1\n    <if test=\"messageTopic != null and messageTopic !=''\">\n      AND message.message_topic = #{messageTopic,jdbcType=VARCHAR}\n    </if>\n    <if test=\"messageType != null and messageType !=''\">\n      AND message.message_type = #{messageType,jdbcType=VARCHAR}\n    </if>\n    <if test=\"messageKey != null and messageKey !=''\">\n      AND message.message_key = #{messageKey,jdbcType=INTEGER}\n    </if>\n    <if test=\"startQueryTime != null and endQueryTime != null\">\n      AND message.created_time BETWEEN #{startQueryTime} AND #{endQueryTime}\n    </if>\n    ORDER BY created_time desc\n  </select>\n</mapper>"
  },
  {
    "path": "paascloud-provider-api/paascloud-provider-tpc-api/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n\txsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n\t<modelVersion>4.0.0</modelVersion>\n\n\t<artifactId>paascloud-provider-tpc-api</artifactId>\n\t<packaging>jar</packaging>\n\n\t<name>paascloud-provider-tpc-api</name>\n\t<description>Demo project for Spring Boot</description>\n\n\t<parent>\n\t\t<groupId>com.liuzm.paascloud.provider.api</groupId>\n\t\t<artifactId>paascloud-provider-api</artifactId>\n\t\t<version>1.0</version>\n\t</parent>\n\n\t<properties>\n\t\t<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>\n\t\t<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>\n\t\t<java.version>1.8</java.version>\n\t</properties>\n\n\t<dependencies>\n      <dependency>\n          <groupId>com.liuzm.paascloud.common</groupId>\n          <artifactId>paascloud-common-util</artifactId>\n      </dependency>\n      <dependency>\n          <groupId>com.github.pagehelper</groupId>\n          <artifactId>pagehelper</artifactId>\n          <version>5.0.3</version>\n      </dependency>\n    </dependencies>\n\n</project>\n"
  },
  {
    "path": "paascloud-provider-api/paascloud-provider-tpc-api/src/main/java/com/paascloud/provider/exceptions/TpcBizException.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：TpcBizException.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.exceptions;\n\nimport com.paascloud.base.enums.ErrorCodeEnum;\nimport com.paascloud.base.exception.BusinessException;\nimport lombok.extern.slf4j.Slf4j;\n\n\n/**\n * The class Opc biz exception.\n *\n * @author paascloud.net @gmail.com\n */\n@Slf4j\npublic class TpcBizException extends BusinessException {\n\n\tprivate static final long serialVersionUID = -6552248511084911254L;\n\n\t/**\n\t * Instantiates a new Uac rpc exception.\n\t */\n\tpublic TpcBizException() {\n\t}\n\n\t/**\n\t * Instantiates a new Uac rpc exception.\n\t *\n\t * @param code      the code\n\t * @param msgFormat the msg format\n\t * @param args      the args\n\t */\n\tpublic TpcBizException(int code, String msgFormat, Object... args) {\n\t\tsuper(code, msgFormat, args);\n\t\tlog.info(\"<== TpcBizException, code:{}, message:{}\", this.code, super.getMessage());\n\t}\n\n\t/**\n\t * Instantiates a new Uac rpc exception.\n\t *\n\t * @param code the code\n\t * @param msg  the msg\n\t */\n\tpublic TpcBizException(int code, String msg) {\n\t\tsuper(code, msg);\n\t\tlog.info(\"<== TpcBizException, code:{}, message:{}\", this.code, super.getMessage());\n\t}\n\n\t/**\n\t * Instantiates a new Opc rpc exception.\n\t *\n\t * @param codeEnum the code enum\n\t */\n\tpublic TpcBizException(ErrorCodeEnum codeEnum) {\n\t\tsuper(codeEnum.code(), codeEnum.msg());\n\t\tlog.info(\"<== TpcBizException, code:{}, message:{}\", this.code, super.getMessage());\n\t}\n\n\t/**\n\t * Instantiates a new Opc rpc exception.\n\t *\n\t * @param codeEnum the code enum\n\t * @param args     the args\n\t */\n\tpublic TpcBizException(ErrorCodeEnum codeEnum, Object... args) {\n\t\tsuper(codeEnum, args);\n\t\tlog.info(\"<== TpcBizException, code:{}, message:{}\", this.code, super.getMessage());\n\t}\n}\n"
  },
  {
    "path": "paascloud-provider-api/paascloud-provider-tpc-api/src/main/java/com/paascloud/provider/model/dto/PcJobTask.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：PcJobTask.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.model.dto;\n\nimport lombok.Data;\n\nimport java.io.Serializable;\nimport java.util.List;\n\n\n/**\n * The class Pc job task.\n *\n * @author paascloud.net @gmail.com\n */\n@Data\npublic class PcJobTask implements Serializable {\n\n\tprivate static final long serialVersionUID = -1689940882253489536L;\n\n\t/**\n\t * 自增ID\n\t */\n\tprivate String id;\n\n\t/**\n\t * 版本号\n\t */\n\tprivate String version;\n\n\t/**\n\t * 关联单号\n\t */\n\tprivate String refNo;\n\n\t/**\n\t * Worker任务类型\n\t */\n\tprivate String taskType;\n\n\t/**\n\t * 业务json数据\n\t */\n\tprivate String taskData;\n\n\t/**\n\t * 执行次数\n\t */\n\tprivate Integer taskExeCount;\n\n\t/**\n\t * 执行实例IP\n\t */\n\tprivate String exeInstanceIp;\n\n\t/**\n\t * 任务运行状态\n\t */\n\tprivate Integer taskStatus;\n\n\t/**\n\t * 前置状态\n\t */\n\tprivate List<Integer> preStatusList;\n}"
  },
  {
    "path": "paascloud-provider-api/paascloud-provider-tpc-api/src/main/java/com/paascloud/provider/model/dto/PcMessageJobTask.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：PcMessageJobTask.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.model.dto;\n\nimport lombok.Data;\n\nimport java.io.Serializable;\n\n\n/**\n * The class Pc message job task.\n *\n * @author paascloud.net @gmail.com\n */\n@Data\npublic class PcMessageJobTask implements Serializable {\n\n\tprivate static final long serialVersionUID = -1689940882253489536L;\n\n\t/**\n\t * 自增ID\n\t */\n\tprivate String id;\n\n\t/**\n\t * 版本号\n\t */\n\tprivate String version;\n\n\t/**\n\t * 消息key\n\t */\n\tprivate Long messageKey;\n\n\t/**\n\t * topic\n\t */\n\tprivate String messageTopic;\n\n\t/**\n\t * tag\n\t */\n\tprivate String messageTag;\n}"
  },
  {
    "path": "paascloud-provider-api/paascloud-provider-tpc-api/src/main/java/com/paascloud/provider/model/dto/TpcMqMessageDto.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：TpcMqMessageDto.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.model.dto;\n\nimport lombok.Data;\n\nimport java.io.Serializable;\n\n/**\n * The class Tpc mq message dto.\n *\n * @author paascloud.net @gmail.com\n */\n@Data\npublic class TpcMqMessageDto implements Serializable {\n\n\tprivate static final long serialVersionUID = -6980935654952282538L;\n\n\t/**\n\t * 生产者组\n\t */\n\tprivate String producerGroup;\n\n\t/**\n\t * 业务单据号\n\t */\n\tprivate String refNo;\n\n\t/**\n\t * 消息key\n\t */\n\tprivate String messageKey;\n\n\t/**\n\t * topic\n\t */\n\tprivate String messageTopic;\n\n\t/**\n\t * tag\n\t */\n\tprivate String messageTag;\n\n\t/**\n\t * 消息类型\n\t */\n\tprivate Integer messageType;\n\n\t/**\n\t * 消息内容\n\t */\n\tprivate String messageBody;\n\n\t/**\n\t * 延时消息的延时级别\n\t */\n\tprivate int delayLevel;\n\n\t/**\n\t * 顺序类型, 0有序 1无序\n\t */\n\tprivate int orderType;\n}"
  },
  {
    "path": "paascloud-provider-api/paascloud-provider-tpc-api/src/main/java/com/paascloud/provider/model/enums/JobTaskStatusEnum.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：JobTaskStatusEnum.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.model.enums;\n\nimport com.google.common.collect.Lists;\n\nimport java.util.List;\n\n/**\n * The enum Job task status enum.\n *\n * @author paascloud.net @gmail.com\n */\npublic enum JobTaskStatusEnum {\n\n\t/**\n\t * 创建任务数据  状态码0\n\t */\n\tTASK_CREATE(0, \"创建任务数据\"),\n\n\t/**\n\t * 等待处理 状态码1\n\t */\n\tTASK_WAITING(1, \"等待处理\"),\n\n\t/**\n\t * 正在处理中  状态码2\n\t */\n\tTASK_EXETING(2, \"正在处理中\"),\n\n\t/**\n\t * 处理成功\n\t */\n\tTASK_SUCCESS(3, \"处理成功\"),\n\n\t/**\n\t * 任务异常\n\t */\n\tTASK_FAIL(4, \"处理失败\"),;\n\n\t/**\n\t * The Status.\n\t */\n\tint status;\n\t/**\n\t * The Value.\n\t */\n\tString value;\n\n\tJobTaskStatusEnum(int status, String value) {\n\t\tthis.status = status;\n\t\tthis.value = value;\n\t}\n\n\t/**\n\t * Gets status.\n\t *\n\t * @return the status\n\t */\n\tpublic int status() {\n\t\treturn status;\n\t}\n\n\t/**\n\t * Gets value.\n\t *\n\t * @return the value\n\t */\n\tpublic String value() {\n\t\treturn value;\n\t}\n\n\tprivate static List<Integer> getStatusList() {\n\t\tList<Integer> list = Lists.newArrayList();\n\t\tfor (JobTaskStatusEnum ele : JobTaskStatusEnum.values()) {\n\t\t\tlist.add(ele.status());\n\t\t}\n\t\treturn list;\n\t}\n\n\t/**\n\t * Contains boolean.\n\t *\n\t * @param status the status\n\t *\n\t * @return the boolean\n\t */\n\tpublic static boolean contains(Integer status) {\n\t\tList<Integer> statusList = getStatusList();\n\t\treturn statusList.contains(status);\n\t}\n\n}\n"
  },
  {
    "path": "paascloud-provider-api/paascloud-provider-tpc-api/src/main/java/com/paascloud/provider/service/TpcMqMessageFeignApi.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：TpcMqMessageFeignApi.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.service;\n\nimport com.paascloud.provider.model.dto.TpcMqMessageDto;\nimport com.paascloud.provider.service.hystrix.TpcMqMessageFeignApiHystrix;\nimport com.paascloud.security.feign.OAuth2FeignAutoConfiguration;\nimport com.paascloud.wrapper.Wrapper;\nimport org.springframework.cloud.netflix.feign.FeignClient;\nimport org.springframework.web.bind.annotation.PostMapping;\nimport org.springframework.web.bind.annotation.RequestBody;\nimport org.springframework.web.bind.annotation.RequestParam;\n\n\n/**\n * The interface Tpc mq message feign api.\n *\n * @author paascloud.net @gmail.com\n */\n@FeignClient(value = \"paascloud-provider-tpc\", configuration = OAuth2FeignAutoConfiguration.class, fallback = TpcMqMessageFeignApiHystrix.class)\npublic interface TpcMqMessageFeignApi {\n\n\t/**\n\t * 预存储消息.\n\t *\n\t * @param mqMessageDto the mq message dto\n\t *\n\t * @return the wrapper\n\t */\n\t@PostMapping(value = \"/api/tpc/saveMessageWaitingConfirm\")\n\tWrapper saveMessageWaitingConfirm(@RequestBody TpcMqMessageDto mqMessageDto);\n\n\t/**\n\t * 确认并发送消息.\n\t *\n\t * @param messageKey the message key\n\t *\n\t * @return the wrapper\n\t */\n\t@PostMapping(value = \"/api/tpc/confirmAndSendMessage\")\n\tWrapper confirmAndSendMessage(@RequestParam(\"messageKey\") String messageKey);\n\n\t/**\n\t * 存储并发送消息.\n\t *\n\t * @param mqMessageDto the mq message dto\n\t *\n\t * @return the wrapper\n\t */\n\t@PostMapping(value = \"/api/tpc/saveAndSendMessage\")\n\tWrapper saveAndSendMessage(@RequestBody TpcMqMessageDto mqMessageDto);\n\n\t/**\n\t * 直接发送消息.\n\t *\n\t * @param mqMessageDto the mq message dto\n\t *\n\t * @return the wrapper\n\t */\n\t@PostMapping(value = \"/api/tpc/directSendMessage\")\n\tWrapper directSendMessage(@RequestBody TpcMqMessageDto mqMessageDto);\n\n\t/**\n\t * 根据messageKey删除消息记录.\n\t *\n\t * @param messageKey the message key\n\t *\n\t * @return the wrapper\n\t */\n\t@PostMapping(value = \"/api/tpc/deleteMessageByMessageKey\")\n\tWrapper deleteMessageByMessageKey(@RequestParam(\"messageKey\") String messageKey);\n\n\t/**\n\t * Confirm receive message wrapper.\n\t *\n\t * @param cid        the cid\n\t * @param messageKey the message key\n\t *\n\t * @return the wrapper\n\t */\n\t@PostMapping(value = \"/api/tpc/confirmReceiveMessage\")\n\tWrapper confirmReceiveMessage(@RequestParam(\"cid\") final String cid, @RequestParam(\"messageKey\") final String messageKey);\n\n\t/**\n\t * Save and confirm finish message wrapper.\n\t *\n\t * @param cid        the cid\n\t * @param messageKey the message key\n\t *\n\t * @return the wrapper\n\t */\n\t@PostMapping(value = \"/api/tpc/saveAndConfirmFinishMessage\")\n\tWrapper confirmConsumedMessage(@RequestParam(\"cid\") final String cid, @RequestParam(\"messageKey\") final String messageKey);\n}\n"
  },
  {
    "path": "paascloud-provider-api/paascloud-provider-tpc-api/src/main/java/com/paascloud/provider/service/hystrix/TpcMqMessageFeignApiHystrix.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：TpcMqMessageFeignApiHystrix.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.service.hystrix;\n\nimport com.paascloud.provider.model.dto.TpcMqMessageDto;\nimport com.paascloud.provider.service.TpcMqMessageFeignApi;\nimport com.paascloud.wrapper.Wrapper;\nimport lombok.extern.slf4j.Slf4j;\nimport org.springframework.stereotype.Component;\n\n\n/**\n * The class Tpc mq message feign api hystrix.\n *\n * @author paascloud.net @gmail.com\n */\n@Component\n@Slf4j\npublic class TpcMqMessageFeignApiHystrix implements TpcMqMessageFeignApi {\n\n\t@Override\n\tpublic Wrapper saveMessageWaitingConfirm(final TpcMqMessageDto mqMessageDto) {\n\t\tlog.error(\"saveMessageWaitingConfirm - 服务降级. mqMessageDto={}\", mqMessageDto);\n\t\treturn null;\n\t}\n\n\t@Override\n\tpublic Wrapper confirmAndSendMessage(final String messageKey) {\n\t\treturn null;\n\t}\n\n\t@Override\n\tpublic Wrapper saveAndSendMessage(final TpcMqMessageDto mqMessageDto) {\n\t\treturn null;\n\t}\n\n\t@Override\n\tpublic Wrapper directSendMessage(final TpcMqMessageDto mqMessageDto) {\n\t\treturn null;\n\t}\n\n\t@Override\n\tpublic Wrapper deleteMessageByMessageKey(final String messageKey) {\n\t\treturn null;\n\t}\n\n\t@Override\n\tpublic Wrapper confirmReceiveMessage(final String cid, final String messageKey) {\n\t\treturn null;\n\t}\n\n\t@Override\n\tpublic Wrapper confirmConsumedMessage(final String cid, final String messageKey) {\n\t\treturn null;\n\t}\n}\n"
  },
  {
    "path": "paascloud-provider-api/paascloud-provider-uac-api/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n\txsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n\t<modelVersion>4.0.0</modelVersion>\n\n\t<artifactId>paascloud-provider-uac-api</artifactId>\n\t<version>1.0</version>\n\t<packaging>jar</packaging>\n\n\t<name>paascloud-provider-uac-api</name>\n\t<description>Demo project for Spring Boot</description>\n\n\t<parent>\n\t\t<groupId>com.liuzm.paascloud.provider.api</groupId>\n\t\t<artifactId>paascloud-provider-api</artifactId>\n\t\t<version>1.0</version>\n\t</parent>\n\n\t<properties>\n\t\t<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>\n\t\t<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>\n\t\t<java.version>1.8</java.version>\n\t</properties>\n\n\t<dependencies>\n        <dependency>\n            <groupId>com.liuzm.paascloud.common</groupId>\n            <artifactId>paascloud-common-util</artifactId>\n        </dependency>\n    <dependency>\n      <groupId>com.github.pagehelper</groupId>\n      <artifactId>pagehelper</artifactId>\n      <version>5.0.3</version>\n    </dependency>\n  </dependencies>\n\n</project>\n"
  },
  {
    "path": "paascloud-provider-api/paascloud-provider-uac-api/src/main/java/com/paascloud/provider/model/constant/UacApiConstant.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：UacApiConstant.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.model.constant;\n\n\nimport lombok.AccessLevel;\nimport lombok.NoArgsConstructor;\n\n/**\n * The class Uac api constant.\n *\n * @author paascloud.net@gmail.com\n */\n@NoArgsConstructor(access = AccessLevel.PRIVATE)\npublic class UacApiConstant {\n\t/**\n\t * token变量\n\t */\n\t@NoArgsConstructor(access = AccessLevel.PRIVATE)\n\tpublic static final class Valid {\n\t\t/**\n\t\t * The constant EMAIL.\n\t\t */\n\t\tpublic static final String EMAIL = \"email\";\n\t\t/**\n\t\t * The constant LOGIN_NAME.\n\t\t */\n\t\tpublic static final String LOGIN_NAME = \"loginName\";\n\t\t/**\n\t\t * The constant MOBILE_NO.\n\t\t */\n\t\tpublic static final String MOBILE_NO = \"mobileNo\";\n\t}\n}\n"
  },
  {
    "path": "paascloud-provider-api/paascloud-provider-uac-api/src/main/java/com/paascloud/provider/model/constant/UacConstant.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：UacConstant.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.model.constant;\n\n/**\n * The class Uac constant.\n *\n * @author paascloud.net @gmail.com\n */\npublic class UacConstant {\n\n\t/**\n\t * The constant MENU_ROOT.\n\t */\n\tpublic static final String MENU_ROOT = \"root\";\n\n\t/**\n\t * token变量\n\t *\n\t * @author paascloud.net @gmail.com\n\t */\n\tpublic static final class Token {\n\t\t/**\n\t\t * 用户名密码加密秘钥\n\t\t */\n\t\tpublic static final String SEC_TOKEN = \"SEC_TOKEN\";\n\t\t/**\n\t\t * 验证码\n\t\t */\n\t\tpublic static final String KAPTCHA = \"KAPTCHA\";\n\n\t\t/**\n\t\t * The constant SMS_TOKEN.\n\t\t */\n\t\tpublic static final String SMS_TOKEN = \"SMS_TOKEN\";\n\t\t/**\n\t\t * The constant AUTH_TOKEN_KEY.\n\t\t */\n\t\tpublic static final String AUTH_TOKEN_KEY = \"PAAS_TOKEN_KEY\";\n\t\t/**\n\t\t * The constant REGISTER_TOKEN_KEY.\n\t\t */\n\t\tpublic static final String REGISTER_TOKEN_KEY = \"REGISTER_TOKEN_KEY\";\n\t\t/**\n\t\t * The constant RESET_PWD_TOKEN_KEY.\n\t\t */\n\t\tpublic static final String RESET_PWD_TOKEN_KEY = \"RESET_PWD_TOKEN_KEY\";\n\n\t\t/**\n\t\t * 登录人信息\n\t\t */\n\t\tpublic static final String TOKEN_AUTH_DTO = \"TOKEN_AUTH_DTO\";\n\n\t\t/**\n\t\t * The class Jwt.\n\t\t *\n\t\t * @author paascloud.net @gmail.com\n\t\t */\n\t\tpublic static final class Jwt {\n\t\t\t/**\n\t\t\t * The constant VIEW.\n\t\t\t */\n\t\t\tpublic static final String VIEW = \"JWT_VIEW_PRIVATE\";\n\t\t\t/**\n\t\t\t * The constant API.\n\t\t\t */\n\t\t\tpublic static final String API = \"JWT_API_PRIVATE\";\n\t\t}\n\t}\n\n\t/**\n\t * The class User.\n\t *\n\t * @author paascloud.net @gmail.com\n\t */\n\tpublic static final class User {\n\t\t/**\n\t\t * The constant LOGIN_NAME.\n\t\t */\n\t\tpublic static final String LOGIN_NAME = \"LOGIN_NAME\";\n\t}\n\n\t/**\n\t * The class Cookie.\n\t *\n\t * @author paascloud.net @gmail.com\n\t */\n\tpublic static final class Cookie {\n\t\t/**\n\t\t * 用户名密码加密秘钥\n\t\t */\n\t\tpublic static final String PAASCLOUD_DOMAIN = \"paascloud.com\";\n\t\t/**\n\t\t * token 前缀\n\t\t */\n\t\tpublic static final String PAASCLOUD_PATH = \"/ \";\n\n\t}\n}\n"
  },
  {
    "path": "paascloud-provider-api/paascloud-provider-uac-api/src/main/java/com/paascloud/provider/model/dto/user/ForgetCheckAnswerDto.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：ForgetCheckAnswerDto.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.model.dto.user;\n\nimport io.swagger.annotations.ApiModel;\nimport io.swagger.annotations.ApiModelProperty;\nimport lombok.Data;\n\nimport java.io.Serializable;\n\n/**\n * The class Forget check answer dto.\n *\n * @author paascloud.net@gmail.com\n */\n@Data\n@ApiModel\npublic class ForgetCheckAnswerDto implements Serializable {\n\tprivate static final long serialVersionUID = -4611532562847293450L;\n\t@ApiModelProperty(value = \"登录名\")\n\tprivate String loginName;\n\t@ApiModelProperty(value = \"问题\")\n\tprivate String email;\n\t@ApiModelProperty(value = \"答案\")\n\tprivate String answer;\n}\n"
  },
  {
    "path": "paascloud-provider-api/paascloud-provider-uac-api/src/main/java/com/paascloud/provider/model/dto/user/ForgetResetPasswordDto.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：ForgetResetPasswordDto.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.model.dto.user;\n\nimport io.swagger.annotations.ApiModel;\nimport io.swagger.annotations.ApiModelProperty;\nimport lombok.Data;\n\nimport java.io.Serializable;\n\n/**\n * 忘记密码.\n *\n * @author paascloud.net@gmail.com\n */\n@Data\n@ApiModel\npublic class ForgetResetPasswordDto implements Serializable {\n\tprivate static final long serialVersionUID = 5478700873789068921L;\n\t@ApiModelProperty(value = \"登录名\")\n\tprivate String loginName;\n\t@ApiModelProperty(value = \"密码\")\n\tprivate String loginPwd;\n\t@ApiModelProperty(value = \"邮箱\")\n\tprivate String email;\n\t@ApiModelProperty(value = \"验证码\")\n\tprivate String emailCode;\n\t@ApiModelProperty(value = \"token\")\n\tprivate String forgetToken;\n}\n"
  },
  {
    "path": "paascloud-provider-api/paascloud-provider-uac-api/src/main/java/com/paascloud/provider/model/dto/user/IdStatusDto.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：IdStatusDto.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.model.dto.user;\n\nimport io.swagger.annotations.ApiModel;\nimport io.swagger.annotations.ApiModelProperty;\nimport lombok.Data;\n\nimport java.io.Serializable;\n\n/**\n * The class Id status dto.\n *\n * @author paascloud.net@gmail.com\n */\n@Data\n@ApiModel\npublic class IdStatusDto implements Serializable {\n\tprivate static final long serialVersionUID = -1976690893998068416L;\n\n\t@ApiModelProperty(value = \"用户ID\", required = true)\n\tprivate Long id;\n\t@ApiModelProperty(value = \"推送状态\", required = true)\n\tprivate Integer status;\n}\n"
  },
  {
    "path": "paascloud-provider-api/paascloud-provider-uac-api/src/main/java/com/paascloud/provider/model/dto/user/LoginReqDto.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：LoginReqDto.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.model.dto.user;\n\nimport io.swagger.annotations.ApiModel;\nimport io.swagger.annotations.ApiModelProperty;\nimport lombok.Data;\n\nimport java.io.Serializable;\n\n/**\n * The class Login req dto.\n *\n * @author paascloud.net@gmail.com\n */\n@Data\n@ApiModel(value = \"登录参数\")\npublic class LoginReqDto implements Serializable {\n\tprivate static final long serialVersionUID = -3455057005375331843L;\n\t/**\n\t * 登录名\n\t */\n\t@ApiModelProperty(value = \"登录名\")\n\tprivate String loginName;\n\t/**\n\t * 密码\n\t */\n\t@ApiModelProperty(value = \"密码\")\n\tprivate String loginPwd;\n\t/**\n\t * 登录IP地址\n\t */\n\t@ApiModelProperty(value = \"ip\")\n\tprivate String ip;\n\t/**\n\t * 登录秘钥\n\t */\n\t@ApiModelProperty(value = \"登录秘钥\")\n\tprivate String secToken;\n\n\t@ApiModelProperty(value = \"系统ID\")\n\tprivate Long applicationId;\n\n}\n  "
  },
  {
    "path": "paascloud-provider-api/paascloud-provider-uac-api/src/main/java/com/paascloud/provider/model/dto/user/Perm.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：Perm.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.model.dto.user;\n\nimport lombok.Data;\n\nimport java.io.Serializable;\n\n/**\n * The class Perm.\n *\n * @author paascloud.net@gmail.com\n */\n@Data\npublic class Perm implements Serializable {\n\n\tprivate static final long serialVersionUID = 6578617729619284277L;\n\tprivate String resource;\n\tprivate String perm;\n\n}\n"
  },
  {
    "path": "paascloud-provider-api/paascloud-provider-uac-api/src/main/java/com/paascloud/provider/model/dto/user/ResetPasswordDto.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：ResetPasswordDto.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.model.dto.user;\n\nimport io.swagger.annotations.ApiModel;\nimport io.swagger.annotations.ApiModelProperty;\nimport lombok.Data;\n\nimport java.io.Serializable;\n\n/**\n * 重置密码.\n *\n * @author paascloud.net@gmail.com\n */\n@Data\n@ApiModel\npublic class ResetPasswordDto implements Serializable {\n\tprivate static final long serialVersionUID = 4762153981220090958L;\n\t@ApiModelProperty(\"登录名\")\n\tprivate String loginName;\n\t@ApiModelProperty(value = \"旧密码\")\n\tprivate String passwordOld;\n\t@ApiModelProperty(value = \"新密码\")\n\tprivate String passwordNew;\n}\n"
  },
  {
    "path": "paascloud-provider-api/paascloud-provider-uac-api/src/main/java/com/paascloud/provider/model/dto/user/UserInfoDto.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：UserInfoDto.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.model.dto.user;\n\nimport io.swagger.annotations.ApiModel;\nimport io.swagger.annotations.ApiModelProperty;\nimport lombok.Data;\n\nimport java.io.Serializable;\nimport java.util.Date;\n\n/**\n * The class User info dto.\n *\n * @author paascloud.net@gmail.com\n */\n@Data\n@ApiModel(value = \"用户注册Dto\")\npublic class UserInfoDto implements Serializable {\n\n\tprivate static final long serialVersionUID = -889913964833331690L;\n\tprivate Long id;\n\n\tprivate String userId;\n\n\t/**\n\t * 登录名\n\t */\n\tprivate String loginName;\n\n\t/**\n\t * 盐,用于shiro加密, 字段停用\n\t */\n\tprivate String salt;\n\n\t/**\n\t * 工号\n\t */\n\tprivate String userCode;\n\n\t/**\n\t * 姓名\n\t */\n\tprivate String userName;\n\n\t/**\n\t * 手机号\n\t */\n\tprivate String mobileNo;\n\n\t/**\n\t * 状态\n\t */\n\tprivate String status;\n\n\t/**\n\t * 用户来源\n\t */\n\tprivate String userSource;\n\n\t/**\n\t * 操作员类型（）\n\t */\n\tprivate String type;\n\n\t/**\n\t * 最后登录IP地址\n\t */\n\tprivate String lastLoginIp;\n\n\t/**\n\t * 描述\n\t */\n\tprivate String remark;\n\n\t/**\n\t * 最后登录时间\n\t */\n\tprivate Date lastLoginTime;\n\n\t/**\n\t * 邮箱\n\t */\n\tprivate String email;\n\n\t/**\n\t * 用户所属的组织ID\n\t */\n\t@ApiModelProperty(value = \"用户所属的组织ID\")\n\tprivate Long groupId;\n\n\t@ApiModelProperty(value = \"用户所属的组织名称\")\n\tprivate String groupName;\n}\n"
  },
  {
    "path": "paascloud-provider-api/paascloud-provider-uac-api/src/main/java/com/paascloud/provider/model/dto/user/UserRegisterDto.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：UserRegisterDto.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.model.dto.user;\n\nimport io.swagger.annotations.ApiModel;\nimport io.swagger.annotations.ApiModelProperty;\nimport lombok.Data;\n\nimport java.io.Serializable;\n\n/**\n * The class User register dto.\n *\n * @author paascloud.net@gmail.com\n */\n@Data\n@ApiModel(value = \"用户注册Dto\")\npublic class UserRegisterDto implements Serializable {\n\n\tprivate static final long serialVersionUID = -8019925037057525804L;\n\t/**\n\t * 用户名\n\t */\n\t@ApiModelProperty(value = \"登录名\")\n\tprivate String loginName;\n\t/**\n\t * 手机号\n\t */\n\t@ApiModelProperty(value = \"手机号\")\n\tprivate String mobileNo;\n\n\t/**\n\t * 密码\n\t */\n\t@ApiModelProperty(value = \"密码\")\n\tprivate String loginPwd;\n\n\t/**\n\t * 确认密码\n\t */\n\t@ApiModelProperty(value = \"确认密码\")\n\tprivate String confirmPwd;\n\n\t/**\n\t * 邮箱\n\t */\n\t@ApiModelProperty(value = \"邮箱\")\n\tprivate String email;\n\n\t/**\n\t * 注册token\n\t */\n\t@ApiModelProperty(value = \"注册渠道\")\n\tprivate String registerSource;\n}\n"
  },
  {
    "path": "paascloud-provider-api/paascloud-provider-uac-api/src/main/java/com/paascloud/provider/model/enums/UacGroupTypeEnum.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：UacGroupTypeEnum.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.model.enums;\n\nimport com.google.common.collect.Lists;\nimport com.google.common.collect.Maps;\n\nimport java.util.Arrays;\nimport java.util.List;\nimport java.util.Map;\n\n/**\n * The enum Uac group type enum.\n *\n * @author paascloud.net@gmail.com\n */\npublic enum UacGroupTypeEnum {\n\n\n\t/**\n\t * Group area uac group type enum.\n\t */\n\tGROUP_AREA(\"1\", \"大区\"),\n\t/**\n\t * Group warehouse uac group type enum.\n\t */\n\tGROUP_WAREHOUSE(\"2\", \"仓库\"),\n\t/**\n\t * Group base uac group type enum.\n\t */\n\tGROUP_BASE(\"3\", \"基地\"),\n\t/**\n\t * Group franchisee uac group type enum.\n\t */\n\tGROUP_FRANCHISEE(\"5\", \"加盟商\"),\n\t/**\n\t * Group other uac group type enum.\n\t */\n\tGROUP_OTHER(\"4\", \"其它\"),;\n\n\t/**\n\t * The Key.\n\t */\n\tString key;\n\t/**\n\t * The Value.\n\t */\n\tString value;\n\n\tUacGroupTypeEnum(String key, String value) {\n\t\tthis.key = key;\n\t\tthis.value = value;\n\t}\n\n\t/**\n\t * Gets key.\n\t *\n\t * @return the key\n\t */\n\tpublic String getKey() {\n\t\treturn key;\n\t}\n\n\t/**\n\t * Sets key.\n\t *\n\t * @param key the key\n\t */\n\tpublic void setKey(String key) {\n\t\tthis.key = key;\n\t}\n\n\t/**\n\t * Gets value.\n\t *\n\t * @return the value\n\t */\n\tpublic String getValue() {\n\t\treturn value;\n\t}\n\n\t/**\n\t * Sets value.\n\t *\n\t * @param value the value\n\t */\n\tpublic void setValue(String value) {\n\t\tthis.value = value;\n\t}\n\n\t/**\n\t * 获取key获取value\n\t *\n\t * @param key key\n\t *\n\t * @return value value\n\t */\n\tpublic static String getValue(String key) {\n\t\tfor (UacGroupTypeEnum ele : UacGroupTypeEnum.values()) {\n\t\t\tif (key.equals(ele.getKey())) {\n\t\t\t\treturn ele.getValue();\n\t\t\t}\n\t\t}\n\t\treturn null;\n\t}\n\n\t/**\n\t * 根据key获取该对象\n\t *\n\t * @param key key\n\t *\n\t * @return this enum\n\t */\n\tpublic static UacGroupTypeEnum getEnum(String key) {\n\t\tfor (UacGroupTypeEnum ele : UacGroupTypeEnum.values()) {\n\t\t\tif (key.equals(ele.getKey())) {\n\t\t\t\treturn ele;\n\t\t\t}\n\t\t}\n\t\treturn null;\n\t}\n\n\t/**\n\t * 获取List集合\n\t *\n\t * @return List list\n\t */\n\tpublic static List<UacGroupTypeEnum> getList() {\n\t\treturn Arrays.asList(UacGroupTypeEnum.values());\n\t}\n\n\n\t/**\n\t * 获取map类型集合\n\t *\n\t * @return Map类型List集合 map 2 list\n\t */\n\tpublic static List<Map<String, String>> getMap2List() {\n\t\tList<Map<String, String>> list = Lists.newArrayList();\n\t\tfor (UacGroupTypeEnum ele : UacGroupTypeEnum.values()) {\n\t\t\tMap<String, String> map = Maps.newHashMap();\n\t\t\tmap.put(\"key\", ele.getKey());\n\t\t\tmap.put(\"value\", ele.getValue());\n\t\t\tlist.add(map);\n\t\t}\n\t\treturn list;\n\t}\n}\n"
  },
  {
    "path": "paascloud-provider-api/paascloud-provider-uac-api/src/main/java/com/paascloud/provider/model/exceptions/UacBizException.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：UacBizException.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.model.exceptions;\n\nimport com.paascloud.base.enums.ErrorCodeEnum;\nimport com.paascloud.base.exception.BusinessException;\nimport lombok.extern.slf4j.Slf4j;\n\n/**\n * The class Uac biz exception.\n *\n * @author paascloud.net @gmail.com\n */\n@Slf4j\npublic class UacBizException extends BusinessException {\n\n\tprivate static final long serialVersionUID = -6552248511084911254L;\n\n\t/**\n\t * Instantiates a new Uac rpc exception.\n\t */\n\tpublic UacBizException() {\n\t}\n\n\t/**\n\t * Instantiates a new Uac rpc exception.\n\t *\n\t * @param code      the code\n\t * @param msgFormat the msg format\n\t * @param args      the args\n\t */\n\tpublic UacBizException(int code, String msgFormat, Object... args) {\n\t\tsuper(code, msgFormat, args);\n\t\tlog.info(\"<== UacRpcException, code:\" + this.code + \", message:\" + super.getMessage());\n\n\t}\n\n\t/**\n\t * Instantiates a new Uac rpc exception.\n\t *\n\t * @param code the code\n\t * @param msg  the msg\n\t */\n\tpublic UacBizException(int code, String msg) {\n\t\tsuper(code, msg);\n\t\tlog.info(\"<== UacRpcException, code:\" + this.code + \", message:\" + super.getMessage());\n\t}\n\n\t/**\n\t * Instantiates a new Uac rpc exception.\n\t *\n\t * @param codeEnum the code enum\n\t */\n\tpublic UacBizException(ErrorCodeEnum codeEnum) {\n\t\tsuper(codeEnum.code(), codeEnum.msg());\n\t\tlog.info(\"<== UacRpcException, code:\" + this.code + \", message:\" + super.getMessage());\n\t}\n\n\t/**\n\t * Instantiates a new Uac rpc exception.\n\t *\n\t * @param codeEnum the code enum\n\t * @param args     the args\n\t */\n\tpublic UacBizException(ErrorCodeEnum codeEnum, Object... args) {\n\t\tsuper(codeEnum, args);\n\t\tlog.info(\"<== OpcRpcException, code:\" + this.code + \", message:\" + super.getMessage());\n\t}\n}\n"
  },
  {
    "path": "paascloud-provider-api/paascloud-provider-uac-api/src/main/java/com/paascloud/provider/model/service/UacMqMessageFeignApi.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：UacMqMessageFeignApi.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.model.service;\n\n\nimport com.github.pagehelper.PageInfo;\nimport com.paascloud.base.dto.MessageQueryDto;\nimport com.paascloud.base.dto.MqMessageVo;\nimport com.paascloud.provider.model.service.hystrix.UacMqMessageApiHystrix;\nimport com.paascloud.security.feign.OAuth2FeignAutoConfiguration;\nimport com.paascloud.wrapper.Wrapper;\nimport org.springframework.cloud.netflix.feign.FeignClient;\nimport org.springframework.web.bind.annotation.PostMapping;\nimport org.springframework.web.bind.annotation.RequestBody;\nimport org.springframework.web.bind.annotation.RequestParam;\n\nimport java.util.List;\n\n/**\n * The interface Uac user token feign api.\n *\n * @author paascloud.net @gmail.com\n */\n@FeignClient(value = \"paascloud-provider-uac\", configuration = OAuth2FeignAutoConfiguration.class, fallback = UacMqMessageApiHystrix.class)\npublic interface UacMqMessageFeignApi {\n\n\n\t/**\n\t * Query waiting confirm message list wrapper.\n\t *\n\t * @param messageKeyList the message key list\n\t *\n\t * @return the wrapper\n\t */\n\t@PostMapping(value = \"/api/uac/message/queryMessageKeyList\")\n\tWrapper<List<String>> queryMessageKeyList(@RequestParam(\"messageKeyList\") List<String> messageKeyList);\n\n\t/**\n\t * Query message list with page wrapper.\n\t *\n\t * @param messageQueryDto the message query dto\n\t *\n\t * @return the wrapper\n\t */\n\t@PostMapping(value = \"/api/uac/message/queryMessageListWithPage\")\n\tWrapper<PageInfo<MqMessageVo>> queryMessageListWithPage(@RequestBody MessageQueryDto messageQueryDto);\n}\n"
  },
  {
    "path": "paascloud-provider-api/paascloud-provider-uac-api/src/main/java/com/paascloud/provider/model/service/UacUserTokenFeignApi.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：UacUserTokenFeignApi.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.model.service;\n\n\nimport com.paascloud.provider.model.service.hystrix.UacUserTokenFeignApiHystrix;\nimport com.paascloud.security.feign.OAuth2FeignAutoConfiguration;\nimport com.paascloud.wrapper.Wrapper;\nimport org.springframework.cloud.netflix.feign.FeignClient;\nimport org.springframework.web.bind.annotation.PostMapping;\n\n/**\n * The interface Uac user token feign api.\n *\n * @author paascloud.net @gmail.com\n */\n@FeignClient(value = \"paascloud-provider-uac\", configuration = OAuth2FeignAutoConfiguration.class, fallback = UacUserTokenFeignApiHystrix.class)\npublic interface UacUserTokenFeignApi {\n\n\t/**\n\t * 超时token更新为离线.\n\t *\n\t * @return the wrapper\n\t */\n\t@PostMapping(value = \"/api/uac/token/updateTokenOffLine\")\n\tWrapper<Integer> updateTokenOffLine();\n}\n"
  },
  {
    "path": "paascloud-provider-api/paascloud-provider-uac-api/src/main/java/com/paascloud/provider/model/service/hystrix/UacMqMessageApiHystrix.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：UacMqMessageApiHystrix.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.model.service.hystrix;\n\n\nimport com.github.pagehelper.PageInfo;\nimport com.paascloud.base.dto.MessageQueryDto;\nimport com.paascloud.base.dto.MqMessageVo;\nimport com.paascloud.provider.model.service.UacMqMessageFeignApi;\nimport com.paascloud.wrapper.Wrapper;\nimport org.springframework.stereotype.Component;\n\nimport java.util.List;\n\n\n/**\n * The class Uac mq message api hystrix.\n *\n * @author paascloud.net @gmail.com\n */\n@Component\npublic class UacMqMessageApiHystrix implements UacMqMessageFeignApi {\n\n\t@Override\n\tpublic Wrapper<List<String>> queryMessageKeyList(final List<String> messageKeyList) {\n\t\treturn null;\n\t}\n\n\t@Override\n\tpublic Wrapper<PageInfo<MqMessageVo>> queryMessageListWithPage(final MessageQueryDto messageQueryDto) {\n\t\treturn null;\n\t}\n\n}\n"
  },
  {
    "path": "paascloud-provider-api/paascloud-provider-uac-api/src/main/java/com/paascloud/provider/model/service/hystrix/UacUserTokenFeignApiHystrix.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：UacUserTokenFeignApiHystrix.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.model.service.hystrix;\n\n\nimport com.paascloud.provider.model.service.UacUserTokenFeignApi;\nimport com.paascloud.wrapper.Wrapper;\nimport org.springframework.stereotype.Component;\n\n/**\n * The class Uac user token feign api hystrix.\n *\n * @author paascloud.net @gmail.com\n */\n@Component\npublic class UacUserTokenFeignApiHystrix implements UacUserTokenFeignApi {\n\n\t@Override\n\tpublic Wrapper<Integer> updateTokenOffLine() {\n\t\treturn null;\n\t}\n}\n"
  },
  {
    "path": "paascloud-provider-api/paascloud-provider-uac-api/src/main/java/com/paascloud/provider/model/vo/MenuVo.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：MenuVo.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.provider.model.vo;\n\nimport io.swagger.annotations.ApiModel;\nimport io.swagger.annotations.ApiModelProperty;\nimport lombok.Data;\n\nimport java.io.Serializable;\nimport java.util.List;\n\n/**\n * The class Menu vo.\n *\n * @author paascloud.net@gmail.com\n */\n@Data\n@ApiModel(\"菜单\")\npublic class MenuVo implements Serializable {\n\t/**\n\t * serialVersionUID:用一句话描述这个变量表示什么.\n\t *\n\t * @since JDK 1.7\n\t */\n\tprivate static final long serialVersionUID = -2099147126084213856L;\n\n\t/**\n\t * menu.id;\n\t */\n\t@ApiModelProperty(\"菜单编号\")\n\tprivate Long id;\n\n\t/**\n\t * 父id\n\t */\n\t@ApiModelProperty(\"父id\")\n\tprivate Long pid;\n\n\t/**\n\t * 菜单编码\n\t */\n\t@ApiModelProperty(\"菜单编码\")\n\tprivate String menuCode;\n\n\t/**\n\t * 菜单名称\n\t */\n\t@ApiModelProperty(\"菜单名称\")\n\tprivate String menuName;\n\n\t/**\n\t * 菜单URL\n\t */\n\t@ApiModelProperty(\"菜单URL\")\n\tprivate String url;\n\t/**\n\t * 图标\n\t */\n\t@ApiModelProperty(\"图标\")\n\tprivate String icon;\n\n\t/**\n\t * 序号\n\t */\n\t@ApiModelProperty(\"序号\")\n\tprivate String number;\n\n\t/**\n\t * 备注(研发中心)\n\t */\n\t@ApiModelProperty(\"备注(研发中心)\")\n\tprivate String remark;\n\n\t/**\n\t * 删除标识\n\t */\n\t@ApiModelProperty(\"删除标识\")\n\tprivate Short yn;\n\tprivate MenuVo parentMenu;\n\n\tprivate List<MenuVo> subMenu;\n\n\tprivate boolean hasMenu = false;\n\n}"
  },
  {
    "path": "paascloud-provider-api/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\"\n         xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n         xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n  <parent>\n    <artifactId>paascloud-master</artifactId>\n    <groupId>com.liuzm.paascloud</groupId>\n    <version>1.0</version>\n  </parent>\n  <groupId>com.liuzm.paascloud.provider.api</groupId>\n  <modelVersion>4.0.0</modelVersion>\n  <packaging>pom</packaging>\n\n  <artifactId>paascloud-provider-api</artifactId>\n\n  <modules>\n    <module>paascloud-provider-uac-api</module>\n    <module>paascloud-provider-mdc-api</module>\n    <module>paascloud-provider-omc-api</module>\n    <module>paascloud-provider-opc-api</module>\n    <module>paascloud-provider-tpc-api</module>\n    <module>paascloud-provider-sdk-api</module>\n  </modules>\n\n  <dependencies>\n    <dependency>\n      <groupId>com.liuzm.paascloud.common</groupId>\n      <artifactId>paascloud-common-base</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>com.liuzm.paascloud.common</groupId>\n      <artifactId>paascloud-security-feign</artifactId>\n      <version>1.0</version>\n    </dependency>\n  </dependencies>\n\n  <build>\n    <plugins>\n      <plugin>\n        <groupId>org.apache.maven.plugins</groupId>\n        <artifactId>maven-compiler-plugin</artifactId>\n        <version>${maven-compiler-plugin.version}</version>\n        <configuration>\n          <source>${java.version}</source>\n          <target>${java.version}</target>\n          <testSource>${java.version}</testSource>\n          <testTarget>${java.version}</testTarget>\n        </configuration>\n      </plugin>\n      <!--配置生成Javadoc包-->\n      <plugin>\n        <groupId>org.apache.maven.plugins</groupId>\n        <artifactId>maven-javadoc-plugin</artifactId>\n        <version>${maven-javadoc-plugin.version}</version>\n        <configuration>\n          <encoding>UTF-8</encoding>\n          <aggregate>true</aggregate>\n          <charset>UTF-8</charset>\n          <docencoding>UTF-8</docencoding>\n        </configuration>\n        <executions>\n          <execution>\n            <id>attach-javadocs</id>\n            <goals>\n              <goal>jar</goal>\n            </goals>\n          </execution>\n        </executions>\n      </plugin>\n      <!--配置生成源码包-->\n      <plugin>\n        <groupId>org.apache.maven.plugins</groupId>\n        <artifactId>maven-source-plugin</artifactId>\n        <version>${maven-source-plugin.version}</version>\n        <executions>\n          <execution>\n            <id>attach-sources</id>\n            <goals>\n              <goal>jar</goal>\n            </goals>\n          </execution>\n        </executions>\n      </plugin>\n    </plugins>\n  </build>\n</project>"
  },
  {
    "path": "paascloud-zipkin/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n\txsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n\t<modelVersion>4.0.0</modelVersion>\n\n    <groupId>com.liuzm.paascloud.zipkin</groupId>\n\t<artifactId>paascloud-zipkin</artifactId>\n\t<packaging>jar</packaging>\n\n\t<name>paascloud-zipkin</name>\n\t<description>微服务链路追踪</description>\n\n    <parent>\n        <groupId>com.liuzm.paascloud</groupId>\n        <artifactId>paascloud-master</artifactId>\n        <version>1.0</version>\n    </parent>\n\n\t<properties>\n\t\t<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>\n\t\t<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>\n\t\t<java.version>1.8</java.version>\n\t</properties>\n\n\t<dependencies>\n      <dependency>\n        <groupId>org.springframework.cloud</groupId>\n        <artifactId>spring-cloud-starter-config</artifactId>\n     </dependency>\n        <dependency>\n            <groupId>io.zipkin.java</groupId>\n            <artifactId>zipkin-autoconfigure-ui</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>io.zipkin.java</groupId>\n            <artifactId>zipkin-server</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.jooq</groupId>\n            <artifactId>jooq</artifactId>\n            <version>3.8.0</version>\n        </dependency>\n        <dependency>\n            <groupId>org.springframework.boot</groupId>\n            <artifactId>spring-boot-starter-jdbc</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>com.alibaba</groupId>\n            <artifactId>druid-spring-boot-starter</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>com.alibaba</groupId>\n            <artifactId>druid</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>mysql</groupId>\n            <artifactId>mysql-connector-java</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.springframework.cloud</groupId>\n            <artifactId>spring-cloud-sleuth-zipkin-stream</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.springframework.cloud</groupId>\n            <artifactId>spring-cloud-starter-sleuth</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.springframework.cloud</groupId>\n            <artifactId>spring-cloud-stream-binder-rabbit</artifactId>\n        </dependency>\n        <dependency>\n          <groupId>org.springframework.cloud</groupId>\n          <artifactId>spring-cloud-sleuth-stream</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.springframework.boot</groupId>\n            <artifactId>spring-boot-starter-actuator</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>de.codecentric</groupId>\n            <artifactId>spring-boot-admin-starter-client</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>io.zipkin.java</groupId>\n            <artifactId>zipkin-autoconfigure-collector-rabbitmq</artifactId>\n        </dependency>\n\t</dependencies>\n\n    <build>\n        <finalName>${project.artifactId}</finalName>\n        <plugins>\n            <plugin>\n                <groupId>org.springframework.boot</groupId>\n                <artifactId>spring-boot-maven-plugin</artifactId>\n                <executions>\n                    <execution>\n                        <goals>\n                            <goal>build-info</goal>\n                        </goals>\n                    </execution>\n                </executions>\n            </plugin>\n            <plugin>\n                <groupId>com.spotify</groupId>\n                <artifactId>docker-maven-plugin</artifactId>\n                <version>0.4.13</version>\n                <configuration>\n                    <imageName>${project.artifactId}:${project.version}</imageName>\n                    <baseImage>java</baseImage>\n                    <entryPoint>[\"java\", \"-jar\", \"/${project.build.finalName}.jar\"]</entryPoint>\n                    <resources>\n                        <resource>\n                            <targetPath>/</targetPath>\n                            <directory>${project.build.directory}</directory>\n                            <include>${project.build.finalName}.jar</include>\n                        </resource>\n                    </resources>\n                </configuration>\n            </plugin>\n        </plugins>\n    </build>\n\n\n</project>\n"
  },
  {
    "path": "paascloud-zipkin/src/main/java/com/paascloud/discovery/CustomPollerConfiguration.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：CustomPollerConfiguration.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.discovery;\n\nimport org.springframework.cloud.sleuth.Sampler;\nimport org.springframework.cloud.sleuth.sampler.AlwaysSampler;\nimport org.springframework.cloud.sleuth.stream.StreamSpanReporter;\nimport org.springframework.context.annotation.Bean;\nimport org.springframework.context.annotation.Configuration;\nimport org.springframework.integration.scheduling.PollerMetadata;\nimport org.springframework.scheduling.support.PeriodicTrigger;\n\n/**\n * The class Custom poller configuration.\n *\n * @author paascloud.net@gmail.com\n */\n@Configuration\npublic class CustomPollerConfiguration {\n\t/**\n\t * Custom poller poller metadata.\n\t *\n\t * @return the poller metadata\n\t */\n\t@Bean(name = StreamSpanReporter.POLLER)\n\tPollerMetadata customPoller() {\n\t\tPollerMetadata poller = new PollerMetadata();\n\t\tpoller.setMaxMessagesPerPoll(500);\n\t\tpoller.setTrigger(new PeriodicTrigger(5000L));\n\t\treturn poller;\n\t}\n\n\t@Bean\n\tpublic Sampler defaultSampler() {\n\t\treturn  new AlwaysSampler();\n\t}\n}\n"
  },
  {
    "path": "paascloud-zipkin/src/main/java/com/paascloud/discovery/PaasCloudZipkinApplication.java",
    "content": "/*\n * Copyright (c) 2018. paascloud.net All Rights Reserved.\n * 项目名称：paascloud快速搭建企业级分布式微服务平台\n * 类名称：PaasCloudZipkinApplication.java\n * 创建人：刘兆明\n * 联系方式：paascloud.net@gmail.com\n * 开源地址: https://github.com/paascloud\n * 博客地址: http://blog.paascloud.net\n * 项目官网: http://paascloud.net\n */\n\npackage com.paascloud.discovery;\n\nimport org.springframework.boot.SpringApplication;\nimport org.springframework.boot.autoconfigure.SpringBootApplication;\nimport org.springframework.cloud.client.discovery.EnableDiscoveryClient;\nimport zipkin.server.EnableZipkinServer;\n\n/**\n * The class Paas cloud zipkin application.\n *\n * @author paascloud.net@gmail.com\n */\n@EnableDiscoveryClient\n@SpringBootApplication\n@EnableZipkinServer\npublic class PaasCloudZipkinApplication {\n\n\t/**\n\t * The entry point of application.\n\t *\n\t * @param args the input arguments\n\t */\n\tpublic static void main(String[] args) {\n\t\tSpringApplication.run(PaasCloudZipkinApplication.class, args);\n\t}\n}\n"
  },
  {
    "path": "paascloud-zipkin/src/main/resources/application.yml",
    "content": "server:\n  port: 8020\n\nspring:\n  profiles:\n    active: dev\n  application:\n    name: @pom.artifactId@\n  datasource:\n    username: root\n    password: 123456"
  },
  {
    "path": "paascloud-zipkin/src/main/resources/banner.txt",
    "content": "${AnsiColor.BRIGHT_CYAN}\n                                  .__                   .___                  __\n___________  _____    ______ ____ |  |   ____  __ __  __| _/     ____   _____/  |_\n\\____ \\__  \\ \\__  \\  /  ___// ___\\|  |  /  _ \\|  |  \\/ __ |     /    \\_/ __ \\   __\\\n|  |_> > __ \\_/ __ \\_\\___ \\\\  \\___|  |_(  <_> )  |  / /_/ |    |   |  \\  ___/|  |\n|   __(____  (____  /____  >\\___  >____/\\____/|____/\\____ | /\\ |___|  /\\___  >__|\n|__|       \\/     \\/     \\/     \\/ Powered by liuzhaoming\\/ \\/      \\/     \\/"
  },
  {
    "path": "paascloud-zipkin/src/main/resources/bootstrap.yml",
    "content": "spring:\n  cloud:\n    config:\n      fail-fast: true\n      discovery:\n        service-id: paascloud-discovery\n        enabled: true\n      label: ${spring.profiles.active}\n      profile: ${spring.profiles.active}\n      username: admin\n      password: admin\n\neureka:\n  client:\n    serviceUrl:\n      defaultZone: http://root:root@paascloud-eureka:8761/eureka/\n  instance:\n    instance-id: ${spring.application.name}:${spring.cloud.client.ipAddress}:${server.port}"
  },
  {
    "path": "paascloud-zipkin/src/main/resources/logback-spring.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<configuration>\n\n  <!-- 此xml在spring-boot-1.5.3.RELEASE.jar里 -->\n  <include resource=\"org/springframework/boot/logging/logback/defaults.xml\" />\n  <include resource=\"org/springframework/boot/logging/logback/console-appender.xml\" />\n  <!-- 开启后可以通过jmx动态控制日志级别(springboot Admin的功能) -->\n  <!--<jmxConfigurator/>-->\n\n  <appender name=\"FILE\" class=\"ch.qos.logback.core.rolling.RollingFileAppender\">\n    <File>${LOG_PATH}${LOG_FILE}</File>\n    <encoder>\n      <pattern>%date [%level] [%thread] %logger{60} [%file : %line] %msg%n</pattern>\n    </encoder>\n    <rollingPolicy class=\"ch.qos.logback.core.rolling.TimeBasedRollingPolicy\">\n      <!-- 添加.gz 历史日志会启用压缩 大大缩小日志文件所占空间 -->\n      <fileNamePattern>${LOG_PATH}daily/${LOG_FILE}.%d{yyyy-MM-dd}.gz</fileNamePattern>\n      <maxHistory>30</maxHistory><!--  保留30天日志 -->\n    </rollingPolicy>\n  </appender>\n\n  <!--<logger name=\"org.springframework\" level=\"error\"/>-->\n  <!--<logger name=\"jdbc.connection\" level=\"OFF\"/>-->\n  <!--<logger name=\"org.apache\" level=\"error\"/>-->\n  <!--<logger name=\"com.alibaba\" level=\"error\"/>-->\n  <!--<logger name=\"org.apache.kafka.clients.producer.ProducerConfig\" level=\"warn\"/>-->\n\n  <root level=\"INFO\">\n    <appender-ref ref=\"CONSOLE\"/>\n    <appender-ref ref=\"FILE\"/>\n  </root>\n</configuration>"
  },
  {
    "path": "paascloud-zipkin/src/main/resources/mysql.sql",
    "content": "CREATE TABLE IF NOT EXISTS zipkin_spans (\n  `trace_id_high` BIGINT NOT NULL DEFAULT 0 COMMENT 'If non zero, this means the trace uses 128 bit traceIds instead of 64 bit',\n  `trace_id` BIGINT NOT NULL,\n  `id` BIGINT NOT NULL,\n  `name` VARCHAR(255) NOT NULL,\n  `parent_id` BIGINT,\n  `debug` BIT(1),\n  `start_ts` BIGINT COMMENT 'Span.timestamp(): epoch micros used for endTs query and to implement TTL',\n  `duration` BIGINT COMMENT 'Span.duration(): micros used for minDuration and maxDuration query'\n) ENGINE=InnoDB ROW_FORMAT=COMPRESSED CHARACTER SET=utf8 COLLATE utf8_general_ci;\n\nALTER TABLE zipkin_spans ADD UNIQUE KEY(`trace_id_high`, `trace_id`, `id`) COMMENT 'ignore insert on duplicate';\nALTER TABLE zipkin_spans ADD INDEX(`trace_id_high`, `trace_id`, `id`) COMMENT 'for joining with zipkin_annotations';\nALTER TABLE zipkin_spans ADD INDEX(`trace_id_high`, `trace_id`) COMMENT 'for getTracesByIds';\nALTER TABLE zipkin_spans ADD INDEX(`name`) COMMENT 'for getTraces and getSpanNames';\nALTER TABLE zipkin_spans ADD INDEX(`start_ts`) COMMENT 'for getTraces ordering and range';\n\nCREATE TABLE IF NOT EXISTS zipkin_annotations (\n  `trace_id_high` BIGINT NOT NULL DEFAULT 0 COMMENT 'If non zero, this means the trace uses 128 bit traceIds instead of 64 bit',\n  `trace_id` BIGINT NOT NULL COMMENT 'coincides with zipkin_spans.trace_id',\n  `span_id` BIGINT NOT NULL COMMENT 'coincides with zipkin_spans.id',\n  `a_key` VARCHAR(255) NOT NULL COMMENT 'BinaryAnnotation.key or Annotation.value if type == -1',\n  `a_value` BLOB COMMENT 'BinaryAnnotation.value(), which must be smaller than 64KB',\n  `a_type` INT NOT NULL COMMENT 'BinaryAnnotation.type() or -1 if Annotation',\n  `a_timestamp` BIGINT COMMENT 'Used to implement TTL; Annotation.timestamp or zipkin_spans.timestamp',\n  `endpoint_ipv4` INT COMMENT 'Null when Binary/Annotation.endpoint is null',\n  `endpoint_ipv6` BINARY(16) COMMENT 'Null when Binary/Annotation.endpoint is null, or no IPv6 address',\n  `endpoint_port` SMALLINT COMMENT 'Null when Binary/Annotation.endpoint is null',\n  `endpoint_service_name` VARCHAR(255) COMMENT 'Null when Binary/Annotation.endpoint is null'\n) ENGINE=InnoDB ROW_FORMAT=COMPRESSED CHARACTER SET=utf8 COLLATE utf8_general_ci;\n\nALTER TABLE zipkin_annotations ADD UNIQUE KEY(`trace_id_high`, `trace_id`, `span_id`, `a_key`, `a_timestamp`) COMMENT 'Ignore insert on duplicate';\nALTER TABLE zipkin_annotations ADD INDEX(`trace_id_high`, `trace_id`, `span_id`) COMMENT 'for joining with zipkin_spans';\nALTER TABLE zipkin_annotations ADD INDEX(`trace_id_high`, `trace_id`) COMMENT 'for getTraces/ByIds';\nALTER TABLE zipkin_annotations ADD INDEX(`endpoint_service_name`) COMMENT 'for getTraces and getServiceNames';\nALTER TABLE zipkin_annotations ADD INDEX(`a_type`) COMMENT 'for getTraces';\nALTER TABLE zipkin_annotations ADD INDEX(`a_key`) COMMENT 'for getTraces';\nALTER TABLE zipkin_annotations ADD INDEX(`trace_id`, `span_id`, `a_key`) COMMENT 'for dependencies job';\n\nCREATE TABLE IF NOT EXISTS zipkin_dependencies (\n  `day` DATE NOT NULL,\n  `parent` VARCHAR(255) NOT NULL,\n  `child` VARCHAR(255) NOT NULL,\n  `call_count` BIGINT\n) ENGINE=InnoDB ROW_FORMAT=COMPRESSED CHARACTER SET=utf8 COLLATE utf8_general_ci;\n\nALTER TABLE zipkin_dependencies ADD UNIQUE KEY(`day`, `parent`, `child`);\n"
  },
  {
    "path": "pom.xml",
    "content": "<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n         xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n  <modelVersion>4.0.0</modelVersion>\n\n  <groupId>com.liuzm.paascloud</groupId>\n  <artifactId>paascloud-master</artifactId>\n  <version>1.0</version>\n  <packaging>pom</packaging>\n\n  <parent>\n    <groupId>org.springframework.boot</groupId>\n    <artifactId>spring-boot-starter-parent</artifactId>\n    <version>1.5.13.RELEASE</version>\n  </parent>\n\n  <modules>\n    <module>paascloud-eureka</module>\n    <module>paascloud-discovery</module>\n    <module>paascloud-monitor</module>\n    <module>paascloud-zipkin</module>\n    <module>paascloud-gateway</module>\n    <module>paascloud-provider-api</module>\n    <module>paascloud-common</module>\n    <module>paascloud-provider</module>\n    <module>paascloud-generator</module>\n  </modules>\n\n  <developers>\n    <developer>\n      <name>刘兆明</name>\n      <url>https://paascloud.net</url>\n      <email>paascloud.net@gmail.com</email>\n    </developer>\n  </developers>\n\n  <properties>\n    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>\n    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>\n    <java.version>1.8</java.version>\n    <springfox.version>2.6.1</springfox.version>\n    <commons-codec.version>1.10</commons-codec.version>\n    <jjwt.version>0.7.0</jjwt.version>\n    <codehaus-jackson.version>1.9.13</codehaus-jackson.version>\n    <mybatis-starter-version>1.2.0</mybatis-starter-version>\n    <mybatis.plus.version>2.0.7</mybatis.plus.version>\n    <druid.version>1.0.29</druid.version>\n    <mapper.version>3.4.0</mapper.version>\n    <springframework.version>4.3.8.RELEASE</springframework.version>\n    <paascloud.security.version>1.0</paascloud.security.version>\n    <paascloud.version>1.0</paascloud.version>\n    <elastic-job.version>2.1.5</elastic-job.version>\n    <curator.version>2.10.0</curator.version>\n    <mysql.version>5.1.39</mysql.version>\n    <maven-compiler-plugin.version>3.5.1</maven-compiler-plugin.version>\n    <maven-javadoc-plugin.version>2.10.4</maven-javadoc-plugin.version>\n    <maven-source-plugin.version>3.0.1</maven-source-plugin.version>\n    <guava.version>17.0</guava.version>\n    <boot.admin.version>1.5.7</boot.admin.version>\n    <httpclientutil.version>1.0</httpclientutil.version>\n    <feign.form.spring.version>3.0.3</feign.form.spring.version>\n    <spring.version>4.3.11.RELEASE</spring.version>\n    <fastjson.version>1.2.29</fastjson.version>\n    <modelmapper.version>1.1.2</modelmapper.version>\n    <rocketmq.version>4.1.0-incubating</rocketmq.version>\n  </properties>\n\n  <dependencies>\n    <dependency>\n      <groupId>org.springframework.cloud</groupId>\n      <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>\n    </dependency>\n  </dependencies>\n\n  <distributionManagement>\n    <repository>\n      <id>paascloud-lib-rep</id>\n      <url>http://139.199.125.217:8081/content/repositories/paascloud-lib-rep/</url>\n    </repository>\n    <snapshotRepository>\n      <id>nexus-snapshots</id>\n      <name>User Project Snapshot</name>\n      <url>http://139.199.125.217:8081/content/repositories/snapshots/</url>\n      <uniqueVersion>true</uniqueVersion>\n    </snapshotRepository>\n  </distributionManagement>\n\n  <dependencyManagement>\n    <dependencies>\n      <dependency>\n        <groupId>io.spring.platform</groupId>\n        <artifactId>platform-bom</artifactId>\n        <version>Brussels-SR10</version>\n        <type>pom</type>\n        <scope>import</scope>\n      </dependency>\n      <dependency>\n        <groupId>org.springframework.cloud</groupId>\n        <artifactId>spring-cloud-dependencies</artifactId>\n        <version>Edgware.SR3</version>\n        <type>pom</type>\n        <scope>import</scope>\n      </dependency>\n      <!-- google java lib -->\n      <dependency>\n        <groupId>com.google.guava</groupId>\n        <artifactId>guava</artifactId>\n        <version>${guava.version}</version>\n      </dependency>\n      <!-- paas cloud start -->\n      <dependency>\n        <groupId>com.liuzm.paascloud.common</groupId>\n        <artifactId>paascloud-common-base</artifactId>\n        <version>${paascloud.version}</version>\n      </dependency>\n      <dependency>\n        <groupId>com.liuzm.paascloud.common</groupId>\n        <artifactId>paascloud-common-core</artifactId>\n        <version>${paascloud.version}</version>\n      </dependency>\n      <dependency>\n        <groupId>com.liuzm.paascloud.common</groupId>\n        <artifactId>paascloud-common-util</artifactId>\n        <version>${paascloud.version}</version>\n      </dependency>\n      <dependency>\n        <groupId>com.liuzm.paascloud.common</groupId>\n        <artifactId>paascloud-common-zk</artifactId>\n        <version>${paascloud.version}</version>\n      </dependency>\n      <dependency>\n        <groupId>com.liuzm.paascloud.common</groupId>\n        <artifactId>paascloud-security-app</artifactId>\n        <version>${paascloud.version}</version>\n      </dependency>\n      <!-- paas cloud end -->\n      <!-- swagger cloud start -->\n      <dependency>\n        <groupId>io.springfox</groupId>\n        <artifactId>springfox-swagger2</artifactId>\n        <version>${springfox.version}</version>\n      </dependency>\n      <dependency>\n        <groupId>io.springfox</groupId>\n        <artifactId>springfox-swagger-ui</artifactId>\n        <version>${springfox.version}</version>\n      </dependency>\n      <!-- swagger cloud end -->\n      <!--lombok-->\n      <dependency>\n        <groupId>org.projectlombok</groupId>\n        <artifactId>lombok</artifactId>\n        <version>1.16.14</version>\n      </dependency>\n      <dependency>\n        <groupId>commons-codec</groupId>\n        <artifactId>commons-codec</artifactId>\n        <version>${commons-codec.version}</version>\n      </dependency>\n      <dependency>\n        <groupId>org.apache.commons</groupId>\n        <artifactId>commons-lang3</artifactId>\n        <version>3.5</version>\n      </dependency>\n      <dependency>\n        <groupId>io.jsonwebtoken</groupId>\n        <artifactId>jjwt</artifactId>\n        <version>${jjwt.version}</version>\n      </dependency>\n      <dependency>\n        <groupId>org.codehaus.jackson</groupId>\n        <artifactId>jackson-jaxrs</artifactId>\n        <version>${codehaus-jackson.version}</version>\n      </dependency>\n      <dependency>\n        <groupId>org.codehaus.jackson</groupId>\n        <artifactId>jackson-smile</artifactId>\n        <version>${codehaus-jackson.version}</version>\n      </dependency>\n      <dependency>\n        <groupId>org.codehaus.jackson</groupId>\n        <artifactId>jackson-core-asl</artifactId>\n        <version>${codehaus-jackson.version}</version>\n      </dependency>\n      <dependency>\n        <groupId>org.codehaus.jackson</groupId>\n        <artifactId>jackson-mapper-asl</artifactId>\n        <version>${codehaus-jackson.version}</version>\n      </dependency>\n      <dependency>\n        <groupId>com.fasterxml.jackson.core</groupId>\n        <artifactId>jackson-databind</artifactId>\n        <version>2.8.4</version>\n      </dependency>\n      <!--mybatis-->\n      <dependency>\n        <groupId>org.mybatis.spring.boot</groupId>\n        <artifactId>mybatis-spring-boot-starter</artifactId>\n        <version>${mybatis-starter-version}</version>\n      </dependency>\n      <dependency>\n        <groupId>tk.mybatis</groupId>\n        <artifactId>mapper</artifactId>\n        <version>${mapper.version}</version>\n      </dependency>\n      <!--mapper-->\n      <dependency>\n        <groupId>tk.mybatis</groupId>\n        <artifactId>mapper-spring-boot-starter</artifactId>\n        <version>1.1.1</version>\n      </dependency>\n      <!--pagehelper-->\n      <dependency>\n        <groupId>com.github.pagehelper</groupId>\n        <artifactId>pagehelper-spring-boot-starter</artifactId>\n        <version>1.1.2</version>\n      </dependency>\n      <dependency>\n        <groupId>com.alibaba</groupId>\n        <artifactId>druid</artifactId>\n        <version>${druid.version}</version>\n      </dependency>\n      <dependency>\n        <groupId>com.alibaba</groupId>\n        <artifactId>druid-spring-boot-starter</artifactId>\n        <version>1.1.0</version>\n      </dependency>\n      <dependency>\n        <groupId>org.mybatis.generator</groupId>\n        <artifactId>mybatis-generator-core</artifactId>\n        <version>1.3.5</version>\n        <scope>test</scope>\n      </dependency>\n      <dependency>\n        <groupId>joda-time</groupId>\n        <artifactId>joda-time</artifactId>\n        <version>2.9.6</version>\n      </dependency>\n      <dependency>\n        <groupId>org.springframework</groupId>\n        <artifactId>spring-context</artifactId>\n        <version>${springframework.version}</version>\n      </dependency>\n      <dependency>\n        <groupId>org.springframework</groupId>\n        <artifactId>spring-web</artifactId>\n        <version>${springframework.version}</version>\n      </dependency>\n      <dependency>\n        <groupId>eu.bitwalker</groupId>\n        <artifactId>UserAgentUtils</artifactId>\n        <version>1.20</version>\n      </dependency>\n      <!-- http://www.hutool.cn/ -->\n      <dependency>\n        <groupId>com.xiaoleilu</groupId>\n        <artifactId>hutool-all</artifactId>\n        <version>3.0.7</version>\n      </dependency>\n      <dependency>\n        <groupId>com.liuzm.paascloud.provider.api</groupId>\n        <artifactId>paascloud-provider-uac-api</artifactId>\n        <version>${paascloud.version}</version>\n      </dependency>\n      <dependency>\n        <groupId>com.liuzm.paascloud.provider.api</groupId>\n        <artifactId>paascloud-provider-mdc-api</artifactId>\n        <version>${paascloud.version}</version>\n      </dependency>\n      <dependency>\n        <groupId>com.liuzm.paascloud.provider.api</groupId>\n        <artifactId>paascloud-provider-omc-api</artifactId>\n        <version>${paascloud.version}</version>\n      </dependency>\n      <dependency>\n        <groupId>com.liuzm.paascloud.provider.api</groupId>\n        <artifactId>paascloud-provider-tpc-api</artifactId>\n        <version>${paascloud.version}</version>\n      </dependency>\n      <dependency>\n        <groupId>com.liuzm.paascloud.provider.api</groupId>\n        <artifactId>paascloud-provider-opc-api</artifactId>\n        <version>${paascloud.version}</version>\n      </dependency>\n      <dependency>\n        <groupId>com.liuzm.paascloud.provider.api</groupId>\n        <artifactId>paascloud-provider-sdk-api</artifactId>\n        <version>${paascloud.version}</version>\n      </dependency>\n      <dependency>\n        <groupId>org.mybatis</groupId>\n        <artifactId>mybatis</artifactId>\n        <version>3.4.2</version>\n      </dependency>\n\n      <dependency>\n        <groupId>com.aliyun</groupId>\n        <artifactId>aliyun-java-sdk-core</artifactId>\n        <version>3.2.2</version>\n      </dependency>\n      <dependency>\n        <groupId>com.aliyun</groupId>\n        <artifactId>aliyun-java-sdk-dysmsapi</artifactId>\n        <version>1.1.0</version>\n      </dependency>\n      <!-- https://mvnrepository.com/artifact/com.aliyun.mns/aliyun-sdk-mns -->\n      <dependency>\n        <groupId>com.aliyun.mns</groupId>\n        <artifactId>aliyun-sdk-mns</artifactId>\n        <version>1.1.8.4</version>\n      </dependency>\n      <dependency>\n        <groupId>com.aliyun.mns</groupId>\n        <artifactId>alicom-mns-receive-sdk</artifactId>\n        <version>1.0</version>\n      </dependency>\n\n      <dependency>\n        <groupId>org.apache.rocketmq</groupId>\n        <artifactId>rocketmq-client</artifactId>\n        <version>${rocketmq.version}</version>\n      </dependency>\n      <dependency>\n        <groupId>com.qiniu</groupId>\n        <artifactId>qiniu-java-sdk</artifactId>\n        <version>[7.0.0, 7.2.99]</version>\n      </dependency>\n      <!-- alipay start-->\n      <dependency>\n        <groupId>com.alipay</groupId>\n        <artifactId>alipay-sdk-java</artifactId>\n        <version>20170725114550</version>\n      </dependency>\n      <dependency>\n        <groupId>com.alipay</groupId>\n        <artifactId>alipay-trade-sdk</artifactId>\n        <version>20161215</version>\n      </dependency>\n      <!-- alipay end-->\n      <dependency>\n        <groupId>org.modelmapper</groupId>\n        <artifactId>modelmapper</artifactId>\n        <version>${modelmapper.version}</version>\n      </dependency>\n      <dependency>\n        <groupId>de.codecentric</groupId>\n        <artifactId>spring-boot-admin-server-ui-login</artifactId>\n        <version>${boot.admin.version}</version>\n      </dependency>\n      <dependency>\n        <groupId>de.codecentric</groupId>\n        <artifactId>spring-boot-admin-server</artifactId>\n        <version>${boot.admin.version}</version>\n      </dependency>\n      <dependency>\n        <groupId>de.codecentric</groupId>\n        <artifactId>spring-boot-admin-server-ui</artifactId>\n        <version>${boot.admin.version}</version>\n      </dependency>\n      <dependency>\n        <groupId>de.codecentric</groupId>\n        <artifactId>spring-boot-admin-starter-client</artifactId>\n        <version>${boot.admin.version}</version>\n      </dependency>\n      <dependency>\n        <groupId>de.codecentric</groupId>\n        <artifactId>spring-boot-admin-server-ui-hystrix</artifactId>\n        <version>${boot.admin.version}</version>\n      </dependency>\n      <dependency>\n        <groupId>de.codecentric</groupId>\n        <artifactId>spring-boot-admin-server-ui-activiti</artifactId>\n        <version>${boot.admin.version}</version>\n      </dependency>\n      <dependency>\n        <groupId>de.codecentric</groupId>\n        <artifactId>spring-boot-admin-server-ui-turbine</artifactId>\n        <version>${boot.admin.version}</version>\n      </dependency>\n      <dependency>\n        <groupId>com.github.penggle</groupId>\n        <artifactId>kaptcha</artifactId>\n        <version>2.3.2</version>\n        <exclusions>\n          <exclusion>\n            <artifactId>javax.servlet-api</artifactId>\n            <groupId>javax.servlet</groupId>\n          </exclusion>\n        </exclusions>\n      </dependency>\n\n      <dependency>\n        <groupId>com.liuzm.paascloud</groupId>\n        <artifactId>elastic-job-lite-starter</artifactId>\n        <version>1.0</version>\n      </dependency>\n      <dependency>\n        <groupId>mysql</groupId>\n        <artifactId>mysql-connector-java</artifactId>\n        <version>${mysql.version}</version>\n      </dependency>\n      <dependency>\n        <groupId>com.arronlong.httpclientutil</groupId>\n        <artifactId>httpclientutil</artifactId>\n        <version>${httpclientutil.version}</version>\n      </dependency>\n      <dependency>\n        <groupId>org.apache.curator</groupId>\n        <artifactId>curator-client</artifactId>\n        <version>${curator.version}</version>\n      </dependency>\n      <dependency>\n        <groupId>org.apache.curator</groupId>\n        <artifactId>curator-recipes</artifactId>\n        <version>${curator.version}</version>\n      </dependency>\n      <dependency>\n        <groupId>org.apache.curator</groupId>\n        <artifactId>curator-framework</artifactId>\n        <version>${curator.version}</version>\n      </dependency>\n      <dependency>\n        <groupId>io.github.openfeign.form</groupId>\n        <artifactId>feign-form</artifactId>\n        <version>${feign.form.spring.version}</version>\n      </dependency>\n      <dependency>\n        <groupId>io.github.openfeign.form</groupId>\n        <artifactId>feign-form-spring</artifactId>\n        <version>${feign.form.spring.version}</version>\n      </dependency>\n      <dependency>\n        <groupId>org.springframework</groupId>\n        <artifactId>spring-tx</artifactId>\n        <version>${spring.version}</version>\n      </dependency>\n      <!-- https://mvnrepository.com/artifact/com.alibaba/fastjson -->\n      <dependency>\n        <groupId>com.alibaba</groupId>\n        <artifactId>fastjson</artifactId>\n        <version>${fastjson.version}</version>\n      </dependency>\n      <dependency>\n        <groupId>io.zipkin.java</groupId>\n        <artifactId>zipkin-autoconfigure-collector-rabbitmq</artifactId>\n        <version>2.3.1</version>\n      </dependency>\n      <dependency>\n        <groupId>net.logstash.logback</groupId>\n        <artifactId>logstash-logback-encoder</artifactId>\n        <version>4.6</version>\n      </dependency>\n    </dependencies>\n  </dependencyManagement>\n\n  <build>\n    <plugins>\n      <plugin>\n        <groupId>org.apache.maven.plugins</groupId>\n        <artifactId>maven-compiler-plugin</artifactId>\n        <version>2.3.2</version>\n        <configuration>\n          <source>1.8</source>\n          <target>1.8</target>\n          <encoding>UTF-8</encoding>\n        </configuration>\n      </plugin>\n    </plugins>\n  </build>\n\n  <profiles>\n    <profile>\n      <id>dev</id>\n      <properties>\n        <profileActive>dev</profileActive>\n      </properties>\n      <activation>\n        <activeByDefault>true</activeByDefault>\n      </activation>\n    </profile>\n    <profile>\n      <id>pro</id>\n      <properties>\n        <profileActive>pro</profileActive>\n      </properties>\n    </profile>\n  </profiles>\n</project>\n"
  }
]