Commit 97c98e6f by zhangxingmin

Initial commit

parents
# Default ignored files
/shelf/
/workspace.xml
# Datasource local storage ignored files
/../../../../../../:\soft\ideaproject\v2\yd-scrm-cloud\.idea/dataSources/
/dataSources.local.xml
# Editor-based HTTP Client requests
/httpRequests/
<component name="ProjectCodeStyleConfiguration">
<state>
<option name="PREFERRED_PROJECT_CODE_STYLE" value="Default" />
</state>
</component>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="CompilerConfiguration">
<annotationProcessing>
<profile name="Maven default annotation processors profile" enabled="true">
<sourceOutputDir name="target/generated-sources/annotations" />
<sourceTestOutputDir name="target/generated-test-sources/test-annotations" />
<outputRelativeToContentRoot value="true" />
<module name="yd-gateway" />
<module name="yd-fileservice" />
<module name="yd-order-service" />
<module name="yd-scrm-api" />
<module name="yd-sms" />
<module name="yd-sfp-service" />
<module name="yd-common" />
<module name="yd-cffp-service" />
<module name="yd-sfp-api" />
<module name="yd-cffp-api" />
<module name="yd-email" />
<module name="yd-auth" />
<module name="yd-order-api" />
<module name="yd-pay-api" />
<module name="yd-scheduler" />
<module name="yd-scrm-service" />
<module name="yd-feign" />
<module name="yd-pay-service" />
<module name="yd-framework" />
</profile>
</annotationProcessing>
<bytecodeTargetLevel>
<module name="yd-ai" target="1.8" />
<module name="yd-user-api" target="1.5" />
<module name="yd-user-service" target="1.5" />
<module name="yd-wecom" target="1.8" />
<module name="yd-wx-api" target="1.8" />
</bytecodeTargetLevel>
</component>
</project>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="RemoteRepositoriesConfiguration">
<remote-repository>
<option name="id" value="central" />
<option name="name" value="Central Repository" />
<option name="url" value="https://repo.maven.apache.org/maven2" />
</remote-repository>
<remote-repository>
<option name="id" value="public" />
<option name="name" value="aliyun nexus" />
<option name="url" value="http://maven.aliyun.com/nexus/content/groups/public/" />
</remote-repository>
<remote-repository>
<option name="id" value="central" />
<option name="name" value="Maven Central repository" />
<option name="url" value="https://repo1.maven.org/maven2" />
</remote-repository>
<remote-repository>
<option name="id" value="jboss.community" />
<option name="name" value="JBoss Community repository" />
<option name="url" value="https://repository.jboss.org/nexus/content/repositories/public/" />
</remote-repository>
<remote-repository>
<option name="id" value="central" />
<option name="name" value="Central Repository" />
<option name="url" value="https://repo1.maven.org/maven2/" />
</remote-repository>
</component>
</project>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ExternalStorageConfigurationManager" enabled="true" />
<component name="MavenProjectsManager">
<option name="originalFiles">
<list>
<option value="$PROJECT_DIR$/pom.xml" />
<option value="$PROJECT_DIR$/yd-scrm-service/pom.xml" />
</list>
</option>
<option name="ignoredFiles">
<set>
<option value="$PROJECT_DIR$/yd-ai/pom.xml" />
<option value="$PROJECT_DIR$/yd-user-api/pom.xml" />
<option value="$PROJECT_DIR$/yd-user-service/pom.xml" />
<option value="$PROJECT_DIR$/yd-wecom/pom.xml" />
</set>
</option>
</component>
<component name="ProjectRootManager" version="2" languageLevel="JDK_1_8" default="false" project-jdk-name="1.8" project-jdk-type="JavaSDK">
<output url="file://$PROJECT_DIR$/out" />
</component>
</project>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="Palette2">
<group name="Swing">
<item class="com.intellij.uiDesigner.HSpacer" tooltip-text="Horizontal Spacer" icon="/com/intellij/uiDesigner/icons/hspacer.png" removable="false" auto-create-binding="false" can-attach-label="false">
<default-constraints vsize-policy="1" hsize-policy="6" anchor="0" fill="1" />
</item>
<item class="com.intellij.uiDesigner.VSpacer" tooltip-text="Vertical Spacer" icon="/com/intellij/uiDesigner/icons/vspacer.png" removable="false" auto-create-binding="false" can-attach-label="false">
<default-constraints vsize-policy="6" hsize-policy="1" anchor="0" fill="2" />
</item>
<item class="javax.swing.JPanel" icon="/com/intellij/uiDesigner/icons/panel.png" removable="false" auto-create-binding="false" can-attach-label="false">
<default-constraints vsize-policy="3" hsize-policy="3" anchor="0" fill="3" />
</item>
<item class="javax.swing.JScrollPane" icon="/com/intellij/uiDesigner/icons/scrollPane.png" removable="false" auto-create-binding="false" can-attach-label="true">
<default-constraints vsize-policy="7" hsize-policy="7" anchor="0" fill="3" />
</item>
<item class="javax.swing.JButton" icon="/com/intellij/uiDesigner/icons/button.png" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="0" hsize-policy="3" anchor="0" fill="1" />
<initial-values>
<property name="text" value="Button" />
</initial-values>
</item>
<item class="javax.swing.JRadioButton" icon="/com/intellij/uiDesigner/icons/radioButton.png" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="0" hsize-policy="3" anchor="8" fill="0" />
<initial-values>
<property name="text" value="RadioButton" />
</initial-values>
</item>
<item class="javax.swing.JCheckBox" icon="/com/intellij/uiDesigner/icons/checkBox.png" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="0" hsize-policy="3" anchor="8" fill="0" />
<initial-values>
<property name="text" value="CheckBox" />
</initial-values>
</item>
<item class="javax.swing.JLabel" icon="/com/intellij/uiDesigner/icons/label.png" removable="false" auto-create-binding="false" can-attach-label="false">
<default-constraints vsize-policy="0" hsize-policy="0" anchor="8" fill="0" />
<initial-values>
<property name="text" value="Label" />
</initial-values>
</item>
<item class="javax.swing.JTextField" icon="/com/intellij/uiDesigner/icons/textField.png" removable="false" auto-create-binding="true" can-attach-label="true">
<default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1">
<preferred-size width="150" height="-1" />
</default-constraints>
</item>
<item class="javax.swing.JPasswordField" icon="/com/intellij/uiDesigner/icons/passwordField.png" removable="false" auto-create-binding="true" can-attach-label="true">
<default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1">
<preferred-size width="150" height="-1" />
</default-constraints>
</item>
<item class="javax.swing.JFormattedTextField" icon="/com/intellij/uiDesigner/icons/formattedTextField.png" removable="false" auto-create-binding="true" can-attach-label="true">
<default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1">
<preferred-size width="150" height="-1" />
</default-constraints>
</item>
<item class="javax.swing.JTextArea" icon="/com/intellij/uiDesigner/icons/textArea.png" removable="false" auto-create-binding="true" can-attach-label="true">
<default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
<preferred-size width="150" height="50" />
</default-constraints>
</item>
<item class="javax.swing.JTextPane" icon="/com/intellij/uiDesigner/icons/textPane.png" removable="false" auto-create-binding="true" can-attach-label="true">
<default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
<preferred-size width="150" height="50" />
</default-constraints>
</item>
<item class="javax.swing.JEditorPane" icon="/com/intellij/uiDesigner/icons/editorPane.png" removable="false" auto-create-binding="true" can-attach-label="true">
<default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
<preferred-size width="150" height="50" />
</default-constraints>
</item>
<item class="javax.swing.JComboBox" icon="/com/intellij/uiDesigner/icons/comboBox.png" removable="false" auto-create-binding="true" can-attach-label="true">
<default-constraints vsize-policy="0" hsize-policy="2" anchor="8" fill="1" />
</item>
<item class="javax.swing.JTable" icon="/com/intellij/uiDesigner/icons/table.png" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
<preferred-size width="150" height="50" />
</default-constraints>
</item>
<item class="javax.swing.JList" icon="/com/intellij/uiDesigner/icons/list.png" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="6" hsize-policy="2" anchor="0" fill="3">
<preferred-size width="150" height="50" />
</default-constraints>
</item>
<item class="javax.swing.JTree" icon="/com/intellij/uiDesigner/icons/tree.png" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
<preferred-size width="150" height="50" />
</default-constraints>
</item>
<item class="javax.swing.JTabbedPane" icon="/com/intellij/uiDesigner/icons/tabbedPane.png" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="3" hsize-policy="3" anchor="0" fill="3">
<preferred-size width="200" height="200" />
</default-constraints>
</item>
<item class="javax.swing.JSplitPane" icon="/com/intellij/uiDesigner/icons/splitPane.png" removable="false" auto-create-binding="false" can-attach-label="false">
<default-constraints vsize-policy="3" hsize-policy="3" anchor="0" fill="3">
<preferred-size width="200" height="200" />
</default-constraints>
</item>
<item class="javax.swing.JSpinner" icon="/com/intellij/uiDesigner/icons/spinner.png" removable="false" auto-create-binding="true" can-attach-label="true">
<default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1" />
</item>
<item class="javax.swing.JSlider" icon="/com/intellij/uiDesigner/icons/slider.png" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1" />
</item>
<item class="javax.swing.JSeparator" icon="/com/intellij/uiDesigner/icons/separator.png" removable="false" auto-create-binding="false" can-attach-label="false">
<default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3" />
</item>
<item class="javax.swing.JProgressBar" icon="/com/intellij/uiDesigner/icons/progressbar.png" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="0" hsize-policy="6" anchor="0" fill="1" />
</item>
<item class="javax.swing.JToolBar" icon="/com/intellij/uiDesigner/icons/toolbar.png" removable="false" auto-create-binding="false" can-attach-label="false">
<default-constraints vsize-policy="0" hsize-policy="6" anchor="0" fill="1">
<preferred-size width="-1" height="20" />
</default-constraints>
</item>
<item class="javax.swing.JToolBar$Separator" icon="/com/intellij/uiDesigner/icons/toolbarSeparator.png" removable="false" auto-create-binding="false" can-attach-label="false">
<default-constraints vsize-policy="0" hsize-policy="0" anchor="0" fill="1" />
</item>
<item class="javax.swing.JScrollBar" icon="/com/intellij/uiDesigner/icons/scrollbar.png" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="6" hsize-policy="0" anchor="0" fill="2" />
</item>
</group>
</component>
</project>
\ No newline at end of file
spring:
profiles:
active: test
# active: '@spring.profiles.active@'
---
spring:
profiles: dev
main:
allow-bean-definition-overriding: true
allow-circular-references: true
cloud:
nacos:
# 配置中心
config:
# 命名空间id(此处不用public,因public初始化的空间, id为空) 4e237601-cea8-414d-b7b9-d7adc8cbcf95
namespace: 22f9d61e-9011-4d45-88cb-24f9857e3eec
# nacos的ip地址和端口 120.79.64.17:10848
server-addr: 127.0.0.1:8848
# 这个就表示 在我们nacos命名空间id为 dev中 有一个data-id 为 demo-service.yml 的配置文件 读取这个里面的配置
file-extension: yml
config-retry-time: 300000
# 共享配置, 可以把公共配置放在同个命名空间下,然后创建一个 common.yml 文件 ,里面可以放共用的配置
shared-configs[0]:
dataId: linkwe-common.yml
refresh: true
# 发布到注册中心 (如果没有使用可以不配)
discovery:
# 命名空间id(此处不用public,因public初始化的空间, id为空)
namespace: ${spring.cloud.nacos.config.namespace}
# nacos的ip地址和端口
server-addr: ${spring.cloud.nacos.config.server-addr}
---
spring:
profiles: test
main:
allow-bean-definition-overriding: true
allow-circular-references: true
cloud:
nacos:
# 配置中心
config:
# 命名空间id(此处不用public,因public初始化的空间, id为空)
namespace: d2446fdc-2683-4c82-aa86-61242c61b5cd
# nacos的ip地址和端口
server-addr: 139.224.145.34:8848
# 这个就表示 在我们nacos命名空间id为 dev中 有一个data-id 为 demo-service.yml 的配置文件 读取这个里面的配置
file-extension: yml
config-retry-time: 300000
# 共享配置, 可以把公共配置放在同个命名空间下,然后创建一个 common.yml 文件 ,里面可以放共用的配置
shared-configs[0]:
dataId: linkwe-common.yml
refresh: true
# 发布到注册中心 (如果没有使用可以不配)
discovery:
# 命名空间id(此处不用public,因public初始化的空间, id为空)
namespace: ${spring.cloud.nacos.config.namespace}
# nacos的ip地址和端口
server-addr: ${spring.cloud.nacos.config.server-addr}
---
spring:
profiles: prod
main:
allow-bean-definition-overriding: true
allow-circular-references: true
cloud:
nacos:
# 配置中心
config:
# 命名空间id(此处不用public,因public初始化的空间, id为空)
namespace: ewscrm
# nacos的ip地址和端口
server-addr: 127.0.0.1:8848
# 这个就表示 在我们nacos命名空间id为 dev中 有一个data-id 为 demo-service.yml 的配置文件 读取这个里面的配置
file-extension: yml
config-retry-time: 300000
# 共享配置, 可以把公共配置放在同个命名空间下,然后创建一个 common.yml 文件 ,里面可以放共用的配置
shared-configs[0]:
dataId: linkwe-common.yml
refresh: true
# 发布到注册中心 (如果没有使用可以不配)
discovery:
# 命名空间id(此处不用public,因public初始化的空间, id为空)
namespace: ${spring.cloud.nacos.config.namespace}
# nacos的ip地址和端口
server-addr: ${spring.cloud.nacos.config.server-addr}
\ No newline at end of file
This diff is collapsed. Click to expand it.
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>yd-cloud</artifactId>
<groupId>com.yd</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>yd-auth</artifactId>
<description>角色权限部门用户认证等模块</description>
<properties>
<java.version>1.8</java.version>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<maven.build.timestamp.format>yyyyMMddHHmmss</maven.build.timestamp.format>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- 阿里数据库连接池 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
</dependency>
<!-- spring-boot-devtools -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional> <!-- 表示依赖不会传递 -->
</dependency>
<!-- 参数校验 -->
<dependency>
<groupId>org.hibernate.validator</groupId>
<artifactId>hibernate-validator</artifactId>
</dependency>
<!-- swagger2-->
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
</dependency>
<!-- Mysql驱动包 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!-- SpringCloud Alibaba Nacos Config -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
<!-- <version>2021.1</version>-->
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<finalName>yd-auth</finalName>
<plugins>
<!-- 引用Spring Boot Maven插件 -->
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>${springboot.maven.version}</version>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
package com.yd.auth;
import com.github.pagehelper.autoconfigure.PageHelperAutoConfiguration;
import com.yd.common.config.fegin.FeginConfig;
import com.yd.common.constant.WeServerNameConstants;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.cloud.openfeign.EnableFeignClients;
import org.springframework.scheduling.annotation.EnableAsync;
/**
* 启动程序
*
*/
@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class, PageHelperAutoConfiguration.class})
@MapperScan("com.yd.**.mapper")
@EnableAsync
@EnableFeignClients(defaultConfiguration = FeginConfig.class)
public class AuthApplication {
public static void main(String[] args) {
new SpringApplicationBuilder(AuthApplication.class)
.properties("spring.config.name:bootstrap", "config/bootstrap.yml")
.properties("spring.application.name="+ WeServerNameConstants.ydAuth)
.build().run(args);
System.out.println("(♥◠‿◠)ノ゙ yd-auth启动成功 ლ(´ڡ`ლ)゙ ");
}
}
${AnsiColor.GREEN}
_ _ _ __ __ ____ _ _ _ _ _
| | (_)_ __ | | _\ \ / /__ / ___| |__ __ _| |_ / \ _ _| |_| |__
| | | | '_ \| |/ /\ \ /\ / / _ \ | | '_ \ / _` | __| / _ \| | | | __| '_ \
| |___| | | | | < \ V V / __/ |___| | | | (_| | |_ / ___ \ |_| | |_| | | |
|_____|_|_| |_|_|\_\ \_/\_/ \___|\____|_| |_|\__,_|\__/_/ \_\__,_|\__|_| |_|
${AnsiColor.BRIGHT_WHITE}
Spring Boot Version: ${spring-boot.version}
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>yd-cloud</artifactId>
<groupId>com.yd</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>yd-cffp-api</artifactId>
<description>cffp接口模块(cffp项目个性化定制接口及实现的能力,不和数据库直接交互,需要调用对应service模块和数据库交互)</description>
<properties>
<java.version>1.8</java.version>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<maven.build.timestamp.format>yyyyMMddHHmmss</maven.build.timestamp.format>
</properties>
<dependencies>
<!-- feign组件模块依赖 -->
<dependency>
<groupId>com.yd</groupId>
<artifactId>yd-feign</artifactId>
</dependency>
<!-- cffp基础数据交互实现模块依赖 -->
<dependency>
<groupId>com.yd</groupId>
<artifactId>yd-cffp-service</artifactId>
</dependency>
</dependencies>
<build>
<finalName>yd-cffp-api</finalName>
<plugins>
<!-- 引用Spring Boot Maven插件 -->
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>${springboot.maven.version}</version>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>yd-cloud</artifactId>
<groupId>com.yd</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>yd-cffp-service</artifactId>
<description>cffp实现模块(数据库直接交互,提供基础服务实现的能力)</description>
<properties>
<java.version>1.8</java.version>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<maven.build.timestamp.format>yyyyMMddHHmmss</maven.build.timestamp.format>
</properties>
<dependencies>
<!-- 公共组件模块 -->
<dependency>
<groupId>com.yd</groupId>
<artifactId>yd-common</artifactId>
</dependency>
</dependencies>
<build>
<finalName>yd-cffp-service</finalName>
<plugins>
<!-- 引用Spring Boot Maven插件 -->
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>${springboot.maven.version}</version>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
<?xml version="1.0" encoding="UTF-8"?>
<module type="JAVA_MODULE" version="4" />
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>yd-cloud</artifactId>
<groupId>com.yd</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>yd-common</artifactId>
<description>公共组件模块</description>
<dependencies>
<!-- pagehelper 分页插件 -->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
</dependency>
<!-- 自定义验证注解 -->
<dependency>
<groupId>javax.validation</groupId>
<artifactId>validation-api</artifactId>
</dependency>
<!-- JSON工具类 -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
</dependency>
<!-- 阿里JSON解析器 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
</dependency>
<!-- yml解析器 -->
<dependency>
<groupId>org.yaml</groupId>
<artifactId>snakeyaml</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<scope>compile</scope>
</dependency>
<!--防止进入swagger页面报类型转换错误,排除2.9.2中的引用,手动增加1.5.21版本-->
<dependency>
<groupId>io.swagger</groupId>
<artifactId>swagger-annotations</artifactId>
</dependency>
<dependency>
<groupId>io.swagger</groupId>
<artifactId>swagger-models</artifactId>
</dependency>
<!-- swagger2-UI-->
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
</dependency>
<!-- spring cloud -->
<!-- SpringCloud Openfeign -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
</dependency>
<!-- servlet包 -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
</dependency>
<dependency>
<groupId>com.dtflys.forest</groupId>
<artifactId>forest-spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>transmittable-thread-local</artifactId>
</dependency>
<dependency>
<groupId>io.minio</groupId>
<artifactId>minio</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
</dependency>
<!-- redis 缓存操作 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<!--Token生成与解析-->
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
</dependency>
</dependencies>
</project>
package com.yd.common.annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import java.math.BigDecimal;
/**
* 自定义导出Excel数据注解
*/
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface Excel
{
/**
* 导出时在excel中排序
*/
public int sort() default Integer.MAX_VALUE;
/**
* 导出到Excel中的名字.
*/
public String name() default "";
/**
* 日期格式, 如: yyyy-MM-dd
*/
public String dateFormat() default "";
/**
* 如果是字典类型,请设置字典的type值 (如: sys_user_sex)
*/
public String dictType() default "";
/**
* 读取内容转表达式 (如: 0=男,1=女,2=未知)
*/
public String readConverterExp() default "";
/**
* 分隔符,读取字符串组内容
*/
public String separator() default ",";
/**
* BigDecimal 精度 默认:-1(默认不开启BigDecimal格式化)
*/
public int scale() default -1;
/**
* BigDecimal 舍入规则 默认:BigDecimal.ROUND_HALF_EVEN
*/
public int roundingMode() default BigDecimal.ROUND_HALF_EVEN;
/**
* 导出类型(0数字 1字符串)
*/
public ColumnType cellType() default ColumnType.STRING;
/**
* 导出时在excel中每个列的高度 单位为字符
*/
public double height() default 14;
/**
* 导出时在excel中每个列的宽 单位为字符
*/
public double width() default 16;
/**
* 文字后缀,如% 90 变成90%
*/
public String suffix() default "";
/**
* 当值为空时,字段的默认值
*/
public String defaultValue() default "";
/**
* 提示信息
*/
public String prompt() default "";
/**
* 设置只能选择不能输入的列内容.
*/
public String[] combo() default {};
/**
* 是否导出数据,应对需求:有时我们需要导出一份模板,这是标题需要但内容需要用户手工填写.
*/
public boolean isExport() default true;
/**
* 另一个类中的属性名称,支持多级获取,以小数点隔开
*/
public String targetAttr() default "";
/**
* 字段类型(0:导出导入;1:仅导出;2:仅导入)
*/
Type type() default Type.ALL;
public enum Type
{
ALL(0), EXPORT(1), IMPORT(2);
private final int value;
Type(int value)
{
this.value = value;
}
public int value()
{
return this.value;
}
}
public enum ColumnType
{
NUMERIC(0), STRING(1);
private final int value;
ColumnType(int value)
{
this.value = value;
}
public int value()
{
return this.value;
}
}
}
package com.yd.common.config.fegin;
import com.yd.common.interceptor.FeignRequestInterceptor;
import feign.Logger;
import feign.RequestInterceptor;
import feign.Retryer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* fegin配置
*/
@Configuration
public class FeginConfig {
@Bean
public Logger.Level feignLoggerLevel() {
return Logger.Level.BASIC;
}
@Bean
Logger feignLogger() {
return new FeginLogger(); // 你的继承类
}
@Bean
public Retryer.Default retryerDefault(){
return new Retryer.Default();
}
@Bean
public RequestInterceptor requestInterceptor()
{
return new FeignRequestInterceptor();
}
}
package com.yd.common.config.fegin;
import feign.Request;
import feign.Response;
import feign.Util;
import lombok.extern.slf4j.Slf4j;
import java.io.IOException;
import static feign.Util.decodeOrDefault;
import static java.nio.charset.StandardCharsets.UTF_8;
/**
* fegin日志统一输出
*/
@Slf4j
public class FeginLogger extends feign.Logger {
@Override
protected Response logAndRebufferResponse(String configKey,
Level logLevel,
Response response,
long elapsedTime) throws IOException {
Request request = response.request();
String requestMsg = request.httpMethod().name() + " " + request.url() + " HTTP/1.1";
boolean hasReqBody = request.body() != null;
String bodyMsg = hasReqBody ? new String(request.body()) : "";
if(requestMsg.contains("/file/upload")){
bodyMsg = "";
}
String responseMsg = "";
int status = response.status();
boolean hasResBody = response.body() != null && !(status == 204 || status == 205);
if (hasResBody) {
byte[] bodyData = Util.toByteArray(response.body().asInputStream());
response = response.toBuilder().body(bodyData).build();
responseMsg = decodeOrDefault(bodyData, UTF_8, "");
}
log(configKey, "request【%s】, body【%s】, response【%s】", requestMsg, bodyMsg, responseMsg);
return response;
}
@Override
protected IOException logIOException(String configKey, Level logLevel, IOException ioe, long elapsedTime) {
log(configKey, "<--- ERROR %s: %s (%sms)", ioe.getClass().getSimpleName(), ioe.getMessage(),
elapsedTime);
return ioe;
}
@Override
protected void log(String configKey, String format, Object... args) {
if (log.isInfoEnabled()) {
log.info(String.format(methodTag(configKey) + format, args));
}
}
}
package com.yd.common.constant;
import com.yd.common.utils.StringUtils;
/**
* 权限通用常量
*/
public class AuthorityConstants {
/** 公共企业Id */
public static final Long COMMON_ENTERPRISE = 0L;
/** 公共企业Id */
public static final Long COMMON_USER = 0L;
/** 控制参数 */
public static final Long DELETE_PARAM = 0L;
/** 模块&菜单树 - 顶级节点Id */
public static final Long SYSTEM_TOP_NODE = -1L;
/** 菜单树 - 顶级节点Id */
public static final Long MENU_TOP_NODE = 0L;
/** 用户类型 */
public enum UserType {
ORDINARY("01", "普通用户"), ADMIN("00", "超管用户");
private final String code;
private final String info;
UserType(String code, String info) {
this.code = code;
this.info = info;
}
public String getCode() {
return code;
}
public String getInfo() {
return info;
}
}
/** 租户类型 */
public enum TenantType {
ORDINARY("N", "普通租户"), ADMIN("Y", "租管租户");
private final String code;
private final String info;
TenantType(String code, String info) {
this.code = code;
this.info = info;
}
public String getCode() {
return code;
}
public String getInfo() {
return info;
}
}
/** 角色类型 */
public enum RoleType {
NORMAL("0", "常规"),
DERIVE_TENANT("1", "租户衍生"),
DERIVE_ENTERPRISE("2", "企业衍生"),
DERIVE_DEPT("3", "部门衍生"),
DERIVE_POST("4", "岗位衍生"),
DERIVE_USER("5", "用户衍生");
private final String code;
private final String info;
RoleType(String code, String info) {
this.code = code;
this.info = info;
}
public String getCode() {
return code;
}
public String getInfo() {
return info;
}
public static RoleType getValue(String code){
for(RoleType roleType : values()){
if(StringUtils.equals(code, roleType.getCode())){
return roleType;
}
}
return null;
}
}
/** 公共数据 */
public enum IsCommon {
YES("Y", "是"), NO("N", "否");
private final String code;
private final String info;
IsCommon(String code, String info) {
this.code = code;
this.info = info;
}
public String getCode() {
return code;
}
public String getInfo() {
return info;
}
}
/** 数据范围 */
public enum DataScope {
ALL("1","全部数据权限"),
CUSTOM("2","自定义数据权限"),
DEPT("3","本部门数据权限"),
DEPT_AND_CHILD("4","本部门及以下数据权限"),
POST("5","本岗位数据权限"),
SELF("6","仅本人数据权限");
private final String code;
private final String info;
DataScope(String code, String info) {
this.code = code;
this.info = info;
}
public String getCode() {
return code;
}
public String getInfo() {
return info;
}
public static DataScope getValue(String code){
for(DataScope scope : values()){
if(StringUtils.equals(code, scope.getCode())){
return scope;
}
}
return null;
}
}
/** 菜单状态 */
public enum Visible {
YES("Y", "显示"), NO("N", "隐藏");
private final String code;
private final String info;
Visible(String code, String info) {
this.code = code;
this.info = info;
}
public String getCode() {
return code;
}
public String getInfo() {
return info;
}
}
/** 是否缓存 */
public enum Cache {
YES("Y", "是"), NO("N", "否");
private final String code;
private final String info;
Cache(String code, String info) {
this.code = code;
this.info = info;
}
public String getCode() {
return code;
}
public String getInfo() {
return info;
}
}
/** 是否菜单外链 */
public enum Frame {
YES("Y", "是"), NO("N", "否");
private final String code;
private final String info;
Frame(String code, String info) {
this.code = code;
this.info = info;
}
public String getCode() {
return code;
}
public String getInfo() {
return info;
}
}
/** 菜单类型 */
public enum MenuType {
DIR("M", "目录"), MENU("C", "菜单"), BUTTON("F", "按钮");
private final String code;
private final String info;
MenuType(String code, String info) {
this.code = code;
this.info = info;
}
public String getCode() {
return code;
}
public String getInfo() {
return info;
}
}
/** 组件标识 */
public enum ComponentType {
LAYOUT("Layout", "Layout"), PARENT_VIEW("ParentView", "ParentView"), INNER_LINK("InnerLink", "InnerLink");
private final String code;
private final String info;
ComponentType(String code, String info) {
this.code = code;
this.info = info;
}
public String getCode() {
return code;
}
public String getInfo() {
return info;
}
}
}
package com.yd.common.constant;
/**
* 缓存的key 常量
*/
public class CacheConstants {
/**
* 缓存有效期,默认720(分钟)
*/
public final static Integer EXPIRATION = 720;
/**
* 缓存刷新时间,默认120(分钟)
*/
public final static Integer REFRESH_TIME = 120;
/**
* 权限缓存前缀
*/
public final static String LOGIN_TOKEN_KEY = "login_tokens:";
/** 字典管理 cache key */
public static final String SYS_DICT_KEY = "sys_dict:";
/**路由key*/
public static final String GATEWAY_ROUTES="gateway_dynamic_routes";
/**
* 防重提交 redis key
*/
public static final String REPEAT_SUBMIT_KEY = "repeat_submit:";
}
package com.yd.common.constant;
/**
* 通用常量信息
*
*/
public class Constants
{
/**
* UTF-8 字符集
*/
public static final String UTF8 = "UTF-8";
/**
* GBK 字符集
*/
public static final String GBK = "GBK";
/**
* http请求
*/
public static final String HTTP = "http://";
/**
* https请求
*/
public static final String HTTPS = "https://";
/**
* 通用成功标识
*/
public static final String SUCCESS = "0";
/**
* 通用失败标识
*/
public static final String FAIL = "1";
/**
* 登录成功
*/
public static final String LOGIN_SUCCESS = "Success";
/**
* 注销
*/
public static final String LOGOUT = "Logout";
/**
* 登录失败
*/
public static final String LOGIN_FAIL = "Error";
/**
* 验证码 redis key
*/
public static final String CAPTCHA_CODE_KEY = "captcha_codes:";
/**
* 登录用户 redis key
*/
public static final String LOGIN_TOKEN_KEY = "login_tokens:";
/**
* 防重提交 redis key
*/
public static final String REPEAT_SUBMIT_KEY = "repeat_submit:";
/**
* 验证码有效期(分钟)
*/
public static final Integer CAPTCHA_EXPIRATION = 2;
/**
* 令牌
*/
public static final String TOKEN = "token";
/**
* 令牌前缀
*/
public static final String TOKEN_PREFIX = "Bearer ";
/**
* 令牌前缀
*/
public static final String LOGIN_USER_KEY = "login_user_key";
/**
* 用户ID
*/
public static final String JWT_USERID = "userid";
/**
* 用户名称
*/
public static final String JWT_USERNAME = "sub";
/**
* 用户头像
*/
public static final String JWT_AVATAR = "avatar";
/**
* 创建时间
*/
public static final String JWT_CREATED = "created";
/**
* 用户权限
*/
public static final String JWT_AUTHORITIES = "authorities";
/**
* 参数管理 cache key
*/
public static final String SYS_CONFIG_KEY = "sys_config:";
/**
* 字典管理 cache key
*/
public static final String SYS_DICT_KEY = "sys_dict:";
/**
* 资源映射路径 前缀
*/
public static final String RESOURCE_PREFIX = "/profile";
/** 是否为系统默认(是) */
public static final int SERVICE_STATUS_ERROR = -1;
/** 启用状态 */
public static final String NORMAL_CODE=new String("0");
/** 删除状态 */
public static final String DELETE_CODE=new String("2");
/** 业务判断成功状态 */
public static final Integer SERVICE_RETURN_SUCCESS_CODE=0;
/** 系统用户 */
public static final String USER_TYPE_SYS="00";
/** 企业微信用户 */
public static final String USER_TYPE_WECOME="11";
/** 企业管理 */
public static final String USER_TYOE_CORP_ADMIN="22";
/** 企业微信用户系统中默认用户 */
public static final String DEFAULT_WECOME_ROLE_KEY="WeCome";
/** 企业微信用户系统中默认用户 */
public static final String DEFAULT_WECOME_CORP_ADMIN="CROP_ADMIN_ROLE";
/**完成待办*/
public static final String HANDLE_SUCCESS="3";
/**
* 正常状态(未删除)
*/
public static final Integer COMMON_STATE = 0;
/**
* 删除状态
*/
public static final Integer DELETE_STATE = 1;
/**
* 员工活码 redis key
*/
public static final String USER_CODE_KEY = "user_code:";
/**
* 企业信息管理 cache key
*/
public static final String CORP_ACCOUNT_KEY = "corp_account_key";
}
package com.yd.common.constant;
/**
* 网络协议通用常量
*/
public class HttpConstants {
/** ws请求匹配头 */
public static final String DEFAULT_FILTER_PATH = "/ws/";
/** ws请求端口偏移 */
public static final int WS_PORT = 10;
/** 字符集 */
public enum Character {
UTF8("UTF-8", "UTF-8"), GBK("GBK", "GBK");
private final String code;
private final String info;
Character(String code, String info) {
this.code = code;
this.info = info;
}
public String getCode() {
return code;
}
public String getInfo() {
return info;
}
}
/** 请求类型 */
public enum Type {
LOOKUP_RMI("rmi:", "RMI 远程方法调用"),
LOOKUP_LDAP("ldap:", "LDAP 远程方法调用"),
LOOKUP_LDAPS("ldaps:", "LDAPS 远程方法调用"),
HTTP("http://", "http请求"),
HTTPS("https://", "https请求"),
WS("ws://", "ws请求"),
WSS("wss://", "wss请求");
private final String code;
private final String info;
Type(String code, String info) {
this.code = code;
this.info = info;
}
public String getCode() {
return code;
}
public String getInfo() {
return info;
}
}
/** 返回状态码 */
public enum Status {
SUCCESS(200, "操作成功"),
CREATED(201, "对象创建成功"),
ACCEPTED(202, "请求已经被接受"),
NO_CONTENT(204, "操作已经执行成功,但是没有返回数据"),
MOVED_PERM(301, "资源已被移除"),
SEE_OTHER(303, "重定向"),
NOT_MODIFIED(304, "资源没有被修改"),
BAD_REQUEST(400, "参数列表错误(缺少,格式不匹配)"),
UNAUTHORIZED(401, "未授权"),
FORBIDDEN(403, "访问受限,授权过期"),
NOT_FOUND(404, "资源,服务未找到"),
BAD_METHOD(405, "不允许的http方法"),
CONFLICT(409, "资源冲突,或者资源被锁"),
UNSUPPORTED_TYPE(415, "不支持的数据,媒体类型"),
ERROR(500, "系统内部错误"),
NOT_IMPLEMENTED(501, "接口未实现");
private final int code;
private final String info;
Status(int code, String info) {
this.code = code;
this.info = info;
}
public int getCode() {
return code;
}
public String getInfo() {
return info;
}
}
}
package com.yd.common.constant;
/**
* 返回状态码
*/
public class HttpStatus
{
/**
* 操作成功
*/
public static final int SUCCESS = 200;
/**
* 对象创建成功
*/
public static final int CREATED = 201;
/**
* 请求已经被接受
*/
public static final int ACCEPTED = 202;
/**
* 操作已经执行成功,但是没有返回数据
*/
public static final int NO_CONTENT = 204;
/**
* 资源已被移除
*/
public static final int MOVED_PERM = 301;
/**
* 重定向
*/
public static final int SEE_OTHER = 303;
/**
* 资源没有被修改
*/
public static final int NOT_MODIFIED = 304;
/**
* 参数列表错误(缺少,格式不匹配)
*/
public static final int BAD_REQUEST = 400;
/**
* 未授权
*/
public static final int UNAUTHORIZED = 401;
/**
* 访问受限,授权过期
*/
public static final int FORBIDDEN = 403;
/**
* 资源,服务未找到
*/
public static final int NOT_FOUND = 404;
/**
* 不允许的http方法
*/
public static final int BAD_METHOD = 405;
/**
* 资源冲突,或者资源被锁
*/
public static final int CONFLICT = 409;
/**
* 不支持的数据,媒体类型
*/
public static final int UNSUPPORTED_TYPE = 415;
/**
* 系统内部错误
*/
public static final int ERROR = 500;
/**
* 接口未实现
*/
public static final int NOT_IMPLEMENTED = 501;
/**
* 未注册
*/
public static final int NOT_REGISTER=505;
/**
*
*/
public static final int NOT_ORTHER_IMPLEMENTED = 502;
/**
* 字段值不可重复
*/
public static final int NOT_DATA_DUPLICATION=433;
/**
* 参数未配置
*/
public static final int NOT_TO_CONFIG=226;
}
package com.yd.common.constant;
/**
* 安全相关通用常量
*/
public class SecurityConstants {
/** 请求来源 */
public static final String FROM_SOURCE = "from-source";
/** 授权信息 */
public static final String AUTHORIZATION_HEADER = "authorization";
/** 企业Id */
public static final String CORP_ID = "corp_id";
/** 企业账号 */
public static final String CORP_NAME = "corp_name";
/** 租户ID */
public static final String TENANT_ID = "tenant_id";
/** 用户Id */
public static final String USER_ID = "user_id";
/** 用户账号 */
public static final String USER_NAME = "user_name";
/** 用户类型 */
public static final String USER_TYPE = "user_type";
/** 用户标识 */
public static final String USER_KEY = "user_key";
/** 登录用户 */
public static final String LOGIN_USER = "login_user";
/** 登录类型 **/
public static final String LOGIN_TYPE = "login_type";
/** 内部请求 */
public static final String INNER = "inner";
/**公众号id*/
public static final String WE_APP_ID="weAppId";
/**公众号密钥*/
public static final String WE_APP_SECRET="weAppSecret";
/**Feign请求标识*/
public static final String IS_FEGIN="isFeign";
/** 授权字段 */
public enum Details {
CORP_ID("corp_id", "企业Id"),
TENANT_ID("tenant_id", "租户Id"),
CORP_NAME("corp_name", "企业账号"),
IS_LESSOR("is_lessor", "企业类型"),
USER_ID("user_id", "用户Id"),
USER_NAME("user_name", "用户账号"),
USER_TYPE("user_type", "用户类型"),
USER_KEY("user_key", "用户标识"),
LOGIN_USER("login_user", "登录用户");
private final String code;
private final String info;
Details(String code, String info) {
this.code = code;
this.info = info;
}
public String getCode() {
return code;
}
public String getInfo() {
return info;
}
}
}
package com.yd.common.constant;
/**
* Token的Key常量
*
*/
public class TokenConstants {
/**
* 令牌自定义标识
*/
public static final String AUTHENTICATION = "Authorization";
/**
* 令牌前缀
*/
public static final String PREFIX = "Bearer ";
/**
* 令牌秘钥
*/
public final static String SECRET = "a1531c389f0e48a784542a3662f64f22";
}
package com.yd.common.constant;
/**
* 系统服务名称
*/
public class WeServerNameConstants {
/**
* yd-ai服务名称
*/
public static String ydAi="yd-ai";
/**
* yd-scrm-api服务名称
*/
public static String ydApi="yd-scrm-api";
/**
* yd-auth服务名称
*/
public static String ydAuth="yd-auth";
/**
* yd-event-task服务名称
*/
public static String ydEventTask="yd-event-task";
/**
* yd-file服务名称
*/
public static String ydFile="yd-file";
/**
* yd-gateway服务名称
*/
public static String ydGateway="yd-gateway";
/**
* yd-scheduler服务名称
*/
public static String ydScheduler="yd-scheduler";
/**
* yd-wecom服务名称
*/
public static String ydWecom="yd-wecom";
/**
* yd-wx-api服务名称
*/
public static String ydWxApi="yd-wx-api";
}
package com.yd.common.context;
import cn.hutool.core.convert.Convert;
import com.alibaba.ttl.TransmittableThreadLocal;
import com.yd.common.constant.SecurityConstants;
import com.yd.common.utils.StringUtils;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
/**
* 获取当前线程变量中的 企业Id | 企业账号 | 租户类型 | 用户id | 用户账号 | 用户类型 | Token等信息
* 注意: 必须在网关通过请求头的方法传入,同时在HeaderInterceptor拦截器设置值。 否则这里无法获取
*/
public class SecurityContextHolder {
private static final TransmittableThreadLocal<Map<String, Object>> THREAD_LOCAL = new TransmittableThreadLocal<>();
public static void set(String key, Object value) {
Map<String, Object> map = getLocalMap();
map.put(key, value == null ? StringUtils.EMPTY : value);
}
public static void remove(String key) {
Map<String, Object> map = getLocalMap();
map.remove(key);
}
public static String get(String key) {
Map<String, Object> map = getLocalMap();
return Convert.toStr(map.getOrDefault(key, StringUtils.EMPTY));
}
public static <T> T get(String key, Class<T> clazz) {
Map<String, Object> map = getLocalMap();
return StringUtils.cast(map.getOrDefault(key, null));
}
public static Map<String, Object> getLocalMap() {
Map<String, Object> map = THREAD_LOCAL.get();
if (map == null) {
map = new ConcurrentHashMap<String, Object>();
THREAD_LOCAL.set(map);
}
return map;
}
public static void setLocalMap(Map<String, Object> threadLocalMap) {
THREAD_LOCAL.set(threadLocalMap);
}
public static String getCorpId() {
return Convert.toStr(get(SecurityConstants.Details.CORP_ID.getCode()));
}
public static void setCorpId(String corpId) {
set(SecurityConstants.Details.CORP_ID.getCode(), corpId);
}
public static String getCorpName() {
return get(SecurityConstants.Details.CORP_NAME.getCode());
}
public static void setCorpName(String corpName) {
set(SecurityConstants.Details.CORP_NAME.getCode(), corpName);
}
public static Long getUserId() {
return Convert.toLong(get(SecurityConstants.Details.USER_ID.getCode()), 0L);
}
public static void setUserId(String userId) {
set(SecurityConstants.Details.USER_ID.getCode(), userId);
}
public static String getUserName() {
return get(SecurityConstants.Details.USER_NAME.getCode());
}
public static void setUserName(String userName) {
set(SecurityConstants.Details.USER_NAME.getCode(), userName);
}
public static String getUserType() {
return get(SecurityConstants.Details.USER_TYPE.getCode());
}
public static void setUserType(String userType) {
set(SecurityConstants.Details.USER_TYPE.getCode(), userType);
}
public static String getUserKey() {
return get(SecurityConstants.Details.USER_KEY.getCode());
}
public static void setUserKey(String userKey) {
set(SecurityConstants.Details.USER_KEY.getCode(), userKey);
}
public static void remove() {
THREAD_LOCAL.remove();
}
public static void setTenantId(Integer tenantId) {
set(SecurityConstants.Details.TENANT_ID.getCode(), tenantId);
}
public static Integer getTenantId() {
return Convert.toInt(get(SecurityConstants.Details.TENANT_ID.getCode()));
}
}
package com.yd.common.core.domain;
import com.alibaba.excel.annotation.ExcelIgnore;
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.TableField;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.yd.common.utils.DateUtils;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
/**
* Entity基类
*/
@Data
public class BaseEntity implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 搜索值
*/
@TableField(exist = false)
@ApiModelProperty(hidden = true)
@ExcelIgnore
private String searchValue;
/**
* 创建者
*/
@ApiModelProperty(hidden = true)
@TableField(fill = FieldFill.INSERT)
@ExcelIgnore
private String createBy;
/**
* 创建者ID
*/
@ApiModelProperty(hidden = true)
@TableField(fill = FieldFill.INSERT)
@ExcelIgnore
private Long createById;
/**
* 创建时间
*/
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
@ApiModelProperty(hidden = true)
@TableField(fill = FieldFill.INSERT)
@ExcelIgnore
private Date createTime;
/**
* 更新者
*/
@ApiModelProperty(hidden = true)
@TableField(fill = FieldFill.INSERT_UPDATE)
@ExcelIgnore
private String updateBy;
/**
* 更新者ID
*/
@ApiModelProperty(hidden = true)
@TableField(fill = FieldFill.INSERT_UPDATE)
@ExcelIgnore
private Long updateById;
/**
* 更新时间
*/
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
@ApiModelProperty(hidden = true)
@TableField(fill = FieldFill.INSERT_UPDATE)
@ExcelIgnore
private Date updateTime;
/**
* 备注
*/
@TableField(exist = false)
@ApiModelProperty(hidden = true)
@ExcelIgnore
private String remark;
/**
* 开始时间
*/
@JsonIgnore
@TableField(exist = false)
@ApiModelProperty(hidden = true)
@ExcelIgnore
private String beginTime;
/**
* 结束时间
*/
@JsonIgnore
@TableField(exist = false)
@ApiModelProperty(hidden = true)
@ExcelIgnore
private String endTime;
/**
* 请求参数
*/
@TableField(exist = false)
@ApiModelProperty(hidden = true)
@ExcelIgnore
private Map<String, Object> params;
public String getSearchValue() {
return searchValue;
}
public void setSearchValue(String searchValue) {
this.searchValue = searchValue;
}
public String getCreateBy() {
return createBy;
}
public void setCreateBy(String createBy) {
this.createBy = createBy;
}
public Date getCreateTime() {
return createTime;
}
public void setCreateTime(Date createTime) {
if (createTime == null) {
this.createTime = DateUtils.getNowDate();
} else {
this.createTime = createTime;
}
}
public String getUpdateBy() {
return updateBy;
}
public void setUpdateBy(String updateBy) {
this.updateBy = updateBy;
}
public Date getUpdateTime() {
return updateTime;
}
public void setUpdateTime(Date updateTime) {
this.updateTime = updateTime;
}
public String getRemark() {
return remark;
}
public void setRemark(String remark) {
this.remark = remark;
}
public String getBeginTime() {
return beginTime;
}
public void setBeginTime(String beginTime) {
this.beginTime = beginTime;
}
public String getEndTime() {
return endTime;
}
public void setEndTime(String endTime) {
this.endTime = endTime;
}
public Map<String, Object> getParams() {
if (params == null) {
params = new HashMap<>();
}
return params;
}
public void setParams(Map<String, Object> params) {
this.params = params;
}
}
package com.yd.common.core.domain.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.yd.common.core.domain.BaseEntity;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;
import javax.validation.constraints.Email;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.Size;
import java.util.ArrayList;
import java.util.List;
/**
* 部门表 sys_dept
*/
@Data
@TableName(value = "sys_dept")
public class SysDept extends BaseEntity {
private static final long serialVersionUID = 1L;
/**
* 部门ID
*/
@ApiModelProperty(value = "主键id")
@TableId(type = IdType.INPUT)
@TableField("dept_id")
private Long deptId;
/**
* 父部门ID
*/
@ApiModelProperty(value = "父部门id")
@TableField("parent_id")
private Long parentId;
/**
* 祖级列表
*/
@ApiModelProperty(value = "祖级列表")
@TableField("ancestors")
private String ancestors;
/**
* 部门名称
*/
@ApiModelProperty(value = "部门名称")
@TableField("dept_name")
private String deptName;
/**
* 部门英文名称
*/
@ApiModelProperty(value = "部门英文名称")
@TableField("dept_en_name")
private String deptEnName;
/**
* 显示顺序
*/
@ApiModelProperty(value = "显示顺序")
@TableField("order_num")
private Long orderNum;
/**
* 负责人
*/
@ApiModelProperty(value = "负责人")
@TableField("leader")
private String leader;
/**
* 联系电话
*/
@ApiModelProperty(value = "联系电话")
@TableField("phone")
private String phone;
/**
* 邮箱
*/
@ApiModelProperty(value = "邮箱")
@TableField("email")
private String email;
/**
* 部门状态:0正常,1停用
*/
@ApiModelProperty(value = "部门状态:0正常,1停用")
@TableField("status")
private String status;
/**
* 删除标志(0代表存在 2代表删除)
*/
@TableField("del_flag")
private String delFlag;
/**
* 父部门名称
*/
@TableField(exist = false)
private String parentName;
/**
* 子部门
*/
@TableField(exist = false)
private List<SysDept> children = new ArrayList<SysDept>();
@NotBlank(message = "部门名称不能为空")
@Size(min = 0, max = 32, message = "部门名称长度不能超过32个字符")
public String getDeptName() {
return deptName;
}
@Size(min = 0, max = 32, message = "部门英文名称长度不能超过32个字符")
public String getDeptEnName() {
return deptEnName;
}
@NotBlank(message = "显示顺序不能为空")
public Long getOrderNum() {
return orderNum;
}
@Size(min = 0, max = 11, message = "联系电话长度不能超过11个字符")
public String getPhone() {
return phone;
}
@Email(message = "邮箱格式不正确")
@Size(min = 0, max = 50, message = "邮箱长度不能超过50个字符")
public String getEmail() {
return email;
}
@Override
public String toString() {
return new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE).append("deptId", getDeptId())
.append("parentId", getParentId()).append("ancestors", getAncestors()).append("deptName", getDeptName())
.append("orderNum", getOrderNum()).append("leader", getLeader()).append("phone", getPhone())
.append("email", getEmail()).append("status", getStatus()).append("delFlag", getDelFlag())
.append("createBy", getCreateBy()).append("createTime", getCreateTime())
.append("updateBy", getUpdateBy()).append("updateTime", getUpdateTime()).toString();
}
}
package com.yd.common.core.domain.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.yd.common.annotation.Excel;
import com.yd.common.core.domain.BaseEntity;
import lombok.*;
import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.Size;
/**
* 角色表 sys_role
*
*
*/
@EqualsAndHashCode(callSuper = true)
@Builder
@AllArgsConstructor
@NoArgsConstructor
@Data
@TableName("sys_role")
public class SysRole extends BaseEntity {
private static final long serialVersionUID = 1L;
public SysRole(Long roleId) {
this.roleId = roleId;
}
public SysRole(String roleKey) {
this.roleKey = roleKey;
}
/**
* 角色ID
*/
@Excel(name = "角色序号", cellType = Excel.ColumnType.NUMERIC)
@TableId(type = IdType.AUTO)
@TableField("role_id")
private Long roleId;
/**
* 角色名称
*/
@Excel(name = "角色名称")
@TableField("role_name")
private String roleName;
/**
* 角色权限
*/
@Excel(name = "角色权限")
@TableField("role_key")
private String roleKey;
/**
* 角色排序
*/
@Excel(name = "角色排序")
@TableField("role_sort")
private String roleSort;
/**
* 数据范围(1:所有数据权限;2:自定义数据权限;3:本部门数据权限;4:本部门及以下数据权限)
*/
@Excel(name = "数据范围", readConverterExp = "1=所有数据权限,2=自定义数据权限,3=本部门数据权限,4=本部门及以下数据权限")
@TableField("data_scope")
private String dataScope;
/**
* 角色状态(0正常 1停用)
*/
@Excel(name = "角色状态", readConverterExp = "0=正常,1=停用")
@TableField("status")
private String status;
/**
* 删除标志(0代表存在 2代表删除)
*/
@TableField("del_flag")
private String delFlag;
/**
* 菜单组
*/
@TableField(exist = false)
private Long[] menuIds;
/**
* 部门组(数据权限)
*/
@TableField(exist = false)
private Long[] deptIds;
@TableField("base_role")
private Integer baseRole;
@TableField(exist = false)
private Long[] users;
@TableField(exist = false)
private Long oldRoleId;
public boolean isAdmin() {
return isAdmin(this.roleId);
}
public boolean isAdmin(Long roleId) {
return roleId != null && "SUPPER_ADMIN".equals(getRoleKey());
}
@NotBlank(message = "角色名称不能为空")
@Size(min = 0, max = 30, message = "角色名称长度不能超过30个字符")
public String getRoleName() {
return roleName;
}
@NotBlank(message = "权限字符不能为空")
@Size(min = 0, max = 100, message = "权限字符长度不能超过100个字符")
public String getRoleKey() {
return roleKey;
}
@NotBlank(message = "显示顺序不能为空")
public String getRoleSort() {
return roleSort;
}
@Override
public String toString() {
return new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE).append("roleId", getRoleId())
.append("roleName", getRoleName()).append("roleKey", getRoleKey()).append("roleSort", getRoleSort())
.append("dataScope", getDataScope()).append("status", getStatus()).append("delFlag", getDelFlag())
.append("createBy", getCreateBy()).append("createTime", getCreateTime())
.append("updateBy", getUpdateBy()).append("updateTime", getUpdateTime()).append("remark", getRemark())
.append("baseRole", getBaseRole()).toString();
}
}
package com.yd.common.core.domain.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.yd.common.core.domain.BaseEntity;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
/**
* 用户部门关联信息
*/
@EqualsAndHashCode(callSuper = true)
@Data
@TableName("sys_user_dept")
public class SysUserDept extends BaseEntity {
private static final long serialVersionUID = 1L;
/**
* 主键
*/
@ApiModelProperty(value = "主键id")
@TableId(type = IdType.AUTO)
@TableField("user_dept_id")
private Long userDeptId;
/**
* 用户id
*/
@ApiModelProperty(value = "用户主键")
@TableField("user_id")
private Long userId;
/**
* 企微用户id
*/
@ApiModelProperty(value = "企微用户id")
@TableField("we_user_id")
private String weUserId;
/**
* open_userid
*/
@ApiModelProperty(value = "open_userid")
@TableField("open_userid")
private String openUserid;
/**
* 部门id
*/
@ApiModelProperty(value = "部门id")
@TableField("dept_id")
private Long deptId;
/**
* 部门名称
*/
@ApiModelProperty(value = "部门名称")
@TableField(exist = false)
private String deptName;
/**
* 部门英文名称
*/
@ApiModelProperty(value = "部门英文名称")
@TableField(exist = false)
private String deptEnName;
/**
* 部门内的排序值
*/
@ApiModelProperty(value = "部门内的排序值")
@TableField("order_in_dept")
private String orderInDept;
/**
* 在所在的部门内是否为部门负责人,0-否;1-是
*/
@ApiModelProperty(value = "在所在的部门内是否为部门负责人,0-否;1-是")
@TableField("leader_in_dept")
private Integer leaderInDept;
/**
* 删除标志(0代表存在 2代表删除)
*/
@TableField("del_flag")
private String delFlag;
}
package com.yd.common.core.domain.model;
import com.yd.common.core.domain.entity.SysUser;
import lombok.Data;
import java.io.Serializable;
import java.util.List;
import java.util.Set;
/**
* 登录用户身份权限
*
*
*/
@Data
public class LoginUser implements Serializable
{
private static final long serialVersionUID = 1L;
/** 用户唯一标识 */
private String token;
/** 企业账号Id */
private String corpId;
/** 企业账号 */
private String corpName;
/** 租户标识 */
private String isLessor;
/** 用户名Id */
private Long userId;
/** 用户名 */
private String userName;
/** 用户标识 */
private String userType;
/** 登录时间 */
private Long loginTime;
/** 过期时间 */
private Long expireTime;
/** 登录IP地址 */
private String ipaddr;
/** 权限列表 */
private Set<String> permissions;
/** 角色权限列表 */
private Set<String> roles;
/** 角色列表 */
private Set<Long> roleIds;
/** 主数据源 */
private String mainSource;
/** 用户信息 */
private SysUser sysUser;
/**朋友圈同步需要的字段*/
private Integer filterType;
/**业务id,多个使用逗号隔开**/
private String businessIds;
/**企业微信员工id集合*/
private List<String> weUserIds;
/**企微客群id集合*/
private List<String> chatIds;
/**客户id集合*/
private List<String> extIds;
}
package com.yd.common.core.domain.model;
import com.alibaba.fastjson.JSONArray;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
/**
* 登录微信用户身份权限
*/
@Data
public class WxLoginUser implements Serializable
{
private static final long serialVersionUID = 1L;
@ApiModelProperty("用户的唯一标识")
private String openId;
@ApiModelProperty("用户昵称")
private String nickName;
@ApiModelProperty("用户的性别,值为1时是男性,值为2时是女性,值为0时是未知")
private Integer sex;
@ApiModelProperty("用户个人资料填写的省份")
private String province;
@ApiModelProperty("普通用户个人资料填写的城市")
private String city;
@ApiModelProperty("国家,如中国为CN")
private String country;
@ApiModelProperty("用户头像")
private String headImgUrl;
@ApiModelProperty("用户特权信息,json 数组,如微信沃卡用户为(chinaunicom)")
private JSONArray privilege;
@ApiModelProperty("只有在用户将公众号绑定到微信开放平台帐号后,才会出现该字段。")
private String unionId;
@ApiModelProperty("企微用户ID")
private String externalUserId;
/** 登录时间 */
private Long loginTime;
/** 过期时间 */
private Long expireTime;
/** 登录IP地址 */
private String ipaddr;
/** 用户唯一标识 */
private String token;
}
package com.yd.common.core.page;
import com.linkwechat.common.utils.StringUtils;
/**
* 分页数据
*
*
*/
public class PageDomain
{
/** 当前记录起始索引 */
private Integer pageNum;
/** 每页显示记录数 */
private Integer pageSize;
/** 排序列 */
private String orderByColumn;
/** 排序的方向desc或者asc */
private String isAsc = "asc";
public String getOrderBy()
{
if (StringUtils.isEmpty(orderByColumn))
{
return "";
}
return StringUtils.toUnderScoreCase(orderByColumn) + " " + isAsc;
}
public Integer getPageNum()
{
return pageNum;
}
public void setPageNum(Integer pageNum)
{
this.pageNum = pageNum;
}
public Integer getPageSize()
{
return pageSize;
}
public void setPageSize(Integer pageSize)
{
this.pageSize = pageSize;
}
public String getOrderByColumn()
{
return orderByColumn;
}
public void setOrderByColumn(String orderByColumn)
{
this.orderByColumn = orderByColumn;
}
public String getIsAsc()
{
return isAsc;
}
public void setIsAsc(String isAsc)
{
this.isAsc = isAsc;
}
}
package com.yd.common.core.text;
import com.yd.common.utils.StringUtils;
import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;
/**
* 字符集工具类
*
*
*/
public class CharsetKit
{
/** ISO-8859-1 */
public static final String ISO_8859_1 = "ISO-8859-1";
/** UTF-8 */
public static final String UTF_8 = "UTF-8";
/** GBK */
public static final String GBK = "GBK";
/** ISO-8859-1 */
public static final Charset CHARSET_ISO_8859_1 = Charset.forName(ISO_8859_1);
/** UTF-8 */
public static final Charset CHARSET_UTF_8 = Charset.forName(UTF_8);
/** GBK */
public static final Charset CHARSET_GBK = Charset.forName(GBK);
/**
* 转换为Charset对象
*
* @param charset 字符集,为空则返回默认字符集
* @return Charset
*/
public static Charset charset(String charset)
{
return StringUtils.isEmpty(charset) ? Charset.defaultCharset() : Charset.forName(charset);
}
/**
* 转换字符串的字符集编码
*
* @param source 字符串
* @param srcCharset 源字符集,默认ISO-8859-1
* @param destCharset 目标字符集,默认UTF-8
* @return 转换后的字符集
*/
public static String convert(String source, String srcCharset, String destCharset)
{
return convert(source, Charset.forName(srcCharset), Charset.forName(destCharset));
}
/**
* 转换字符串的字符集编码
*
* @param source 字符串
* @param srcCharset 源字符集,默认ISO-8859-1
* @param destCharset 目标字符集,默认UTF-8
* @return 转换后的字符集
*/
public static String convert(String source, Charset srcCharset, Charset destCharset)
{
if (null == srcCharset)
{
srcCharset = StandardCharsets.ISO_8859_1;
}
if (null == destCharset)
{
srcCharset = StandardCharsets.UTF_8;
}
if (StringUtils.isEmpty(source) || srcCharset.equals(destCharset))
{
return source;
}
return new String(source.getBytes(srcCharset), destCharset);
}
/**
* @return 系统字符集编码
*/
public static String systemCharset()
{
return Charset.defaultCharset().name();
}
}
package com.yd.common.core.text;
import com.yd.common.utils.StringUtils;
/**
* 字符串格式化
*
*
*/
public class StrFormatter
{
public static final String EMPTY_JSON = "{}";
public static final char C_BACKSLASH = '\\';
public static final char C_DELIM_START = '{';
public static final char C_DELIM_END = '}';
/**
* 格式化字符串<br>
* 此方法只是简单将占位符 {} 按照顺序替换为参数<br>
* 如果想输出 {} 使用 \\转义 { 即可,如果想输出 {} 之前的 \ 使用双转义符 \\\\ 即可<br>
* 例:<br>
* 通常使用:format("this is {} for {}", "a", "b") -> this is a for b<br>
* 转义{}: format("this is \\{} for {}", "a", "b") -> this is \{} for a<br>
* 转义\: format("this is \\\\{} for {}", "a", "b") -> this is \a for b<br>
*
* @param strPattern 字符串模板
* @param argArray 参数列表
* @return 结果
*/
public static String format(final String strPattern, final Object... argArray)
{
if (StringUtils.isEmpty(strPattern) || StringUtils.isEmpty(argArray))
{
return strPattern;
}
final int strPatternLength = strPattern.length();
// 初始化定义好的长度以获得更好的性能
StringBuilder sbuf = new StringBuilder(strPatternLength + 50);
int handledPosition = 0;
int delimIndex;// 占位符所在位置
for (int argIndex = 0; argIndex < argArray.length; argIndex++)
{
delimIndex = strPattern.indexOf(EMPTY_JSON, handledPosition);
if (delimIndex == -1)
{
if (handledPosition == 0)
{
return strPattern;
}
else
{ // 字符串模板剩余部分不再包含占位符,加入剩余部分后返回结果
sbuf.append(strPattern, handledPosition, strPatternLength);
return sbuf.toString();
}
}
else
{
if (delimIndex > 0 && strPattern.charAt(delimIndex - 1) == C_BACKSLASH)
{
if (delimIndex > 1 && strPattern.charAt(delimIndex - 2) == C_BACKSLASH)
{
// 转义符之前还有一个转义符,占位符依旧有效
sbuf.append(strPattern, handledPosition, delimIndex - 1);
sbuf.append(Convert.utf8Str(argArray[argIndex]));
handledPosition = delimIndex + 2;
}
else
{
// 占位符被转义
argIndex--;
sbuf.append(strPattern, handledPosition, delimIndex - 1);
sbuf.append(C_DELIM_START);
handledPosition = delimIndex + 1;
}
}
else
{
// 正常占位符
sbuf.append(strPattern, handledPosition, delimIndex);
sbuf.append(Convert.utf8Str(argArray[argIndex]));
handledPosition = delimIndex + 2;
}
}
}
// 加入最后一个占位符后所有的字符
sbuf.append(strPattern, handledPosition, strPattern.length());
return sbuf.toString();
}
}
package com.yd.common.domain;
import com.yd.common.constant.Constants;
import java.io.Serializable;
/**
* 响应信息主体
*
*/
public class R<T> implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 成功
*/
public static final int SUCCESS = Integer.parseInt(Constants.SUCCESS);
/**
* 失败
*/
public static final int FAIL = Integer.parseInt(Constants.FAIL);
private int code;
private String msg;
private T data;
public static <T> R<T> ok() {
return restResult(null, SUCCESS, null);
}
public static <T> R<T> ok(T data) {
return restResult(data, SUCCESS, null);
}
public static <T> R<T> ok(T data, String msg) {
return restResult(data, SUCCESS, msg);
}
public static <T> R<T> fail() {
return restResult(null, FAIL, null);
}
public static <T> R<T> fail(String msg) {
return restResult(null, FAIL, msg);
}
public static <T> R<T> fail(T data) {
return restResult(data, FAIL, null);
}
public static <T> R<T> fail(T data, String msg) {
return restResult(data, FAIL, msg);
}
public static <T> R<T> fail(int code, String msg) {
return restResult(null, code, msg);
}
private static <T> R<T> restResult(T data, int code, String msg) {
R<T> apiResult = new R<>();
apiResult.setCode(code);
apiResult.setData(data);
apiResult.setMsg(msg);
return apiResult;
}
public int getCode() {
return code;
}
public void setCode(int code) {
this.code = code;
}
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
public T getData() {
return data;
}
public void setData(T data) {
this.data = data;
}
}
package com.yd.common.enums;
/**
* 返回码
*
* @author zxm
*/
public enum ErrorCode {
SUCCESS(200,"ok","") ,
CHECK_ONLY_ERROR(10000,"校验唯一性错误",""),
NULL_ERROR(40001,"请求参数为空",""),
SYSTEM_ERROR(50000,"系统内部异常",""),
;
//返回码
private final int code;
//操作响应信息
private final String message;
//响应信息的详细描述
private final String description;
//构造函数
ErrorCode(int code, String message, String description) {
this.code = code;
this.message = message;
this.description = description;
}
//get方法
public int getCode() {
return code;
}
public String getMessage() {
return message;
}
public String getDescription() {
return description;
}
}
package com.yd.common.exception;
import com.yd.common.enums.ErrorCode;
import lombok.Data;
import java.io.Serializable;
/**
* 通用返回类
*
* @author zxm
* @param <T>
*/
@Data
public class BaseResponse<T> implements Serializable {
private int code;
private T data;
private String message;
private String description;
// 添加无参构造方法
public BaseResponse() {
this(ErrorCode.SUCCESS.getCode(),null,ErrorCode.SUCCESS.getMessage(),ErrorCode.SUCCESS.getDescription());
}
/**
* 构造函数
* @param code 状态码
* @param data 向前端传的数据
* @param message 操作反馈信息:如登录成功、查询成功、查询失败、账号密码错误等提示信息。有利于后续纠错。
* @param description 反馈信息的详细描述
*/
public BaseResponse(int code, T data, String message, String description) {
this.code = code;
this.data = data;
this.message = message;
this.description=description;
}
/**
*定义各种构造函数,有利于灵活的返回各种信息。如下面这个只返回状态码、数据、操作反馈信息,但不返回详细描述。
* 而再下一个只返回code和data,不返回message和description的信息。
*/
public BaseResponse(int code, T data, String message) {
this(code,data,message,"");
}
/**
* 成功默认返回
* @param data
*/
public BaseResponse(T data) {
this(ErrorCode.SUCCESS.getCode(),data,ErrorCode.SUCCESS.getMessage(),ErrorCode.SUCCESS.getDescription());
}
public BaseResponse(int code, T data) {
this(code,data,"","");
}
public BaseResponse(ErrorCode errorCode){
this(errorCode.getCode(),null,errorCode.getMessage(),errorCode.getDescription());
}
public BaseResponse(ErrorCode errorCode, String description){
this(errorCode.getCode(),null,errorCode.getMessage(),description);
}
}
package com.yd.common.exception;
import com.yd.common.enums.ErrorCode;
/**
* 业务异常类
* 继承RuntimeException异常处理类。
*
* @author zxm
*/
public class BusinessException extends RuntimeException{
private int code;
private String description;
/**
* 各种构造函数,供我们灵活的使用
*/
public BusinessException(String message, int code, String description) {
super(message);
this.code = code;
this.description = description;
}
public BusinessException(ErrorCode errorCode) {
super(errorCode.getMessage());
this.code = errorCode.getCode();
this.description = errorCode.getDescription();
}
public BusinessException(ErrorCode errorCode,String description) {
super(errorCode.getMessage());
this.code = errorCode.getCode();
this.description = description;
}
public int getCode() {
return code;
}
public String getDescription() {
return description;
}
}
package com.yd.common.exception;
import com.yd.common.enums.ErrorCode;
import com.yd.common.utils.ResultUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import javax.validation.ConstraintViolationException;
import java.util.stream.Collectors;
/**
* 全局异常处理器
* Slf4j是用来记录日志信息的,lombok中自带的。
*
* @author zxm
*/
@RestControllerAdvice
@Slf4j
public class GlobalExceptionHandler {
/**
* 处理业务返回的异常
* @param e
* @return
*/
@ExceptionHandler(BusinessException.class)
public BaseResponse businessExceptionHandler(BusinessException e){
log.error("BusinessException:{}",e);
return ResultUtils.error(e.getCode(),e.getMessage(),e.getDescription());
// throw new BusinessException(e.getMessage(),e.getCode(),e.getDescription());
}
/**
* 处理系统异常
* @param e
* @return
*/
@ExceptionHandler(Exception.class)
public BaseResponse exceptionHandler(Exception e){
log.error("Exception:{}",e);
//系统异常
return ResultUtils.error(ErrorCode.SYSTEM_ERROR);
}
/**
* @Validated校验器触发的异常 @RequestBody对象校验
* @param e
* @return
*/
@ExceptionHandler(MethodArgumentNotValidException.class)
public BaseResponse methodArgumentNotValidExceptionHandler(MethodArgumentNotValidException e){
BindingResult bindingResult = e.getBindingResult();
// Map<String, String> errors = new HashMap<>();
// for (FieldError fieldError : bindingResult.getFieldErrors()) {
// errors.put(fieldError.getField(), fieldError.getDefaultMessage());
// }
String msg = bindingResult.getFieldErrors().get(0).getDefaultMessage();
//集中处理
//请求参数为空校验
log.error("MethodArgumentNotValidException:{}",e);
return ResultUtils.error(ErrorCode.NULL_ERROR.getCode(),msg,msg);
}
/**
* @Validated校验器触发的异常 RequestParam 参数校验
* @param e
* @return
*/
@ExceptionHandler(ConstraintViolationException.class)
public BaseResponse constraintViolationExceptionHandler(ConstraintViolationException e){
String msg = e.getConstraintViolations().stream().collect(Collectors.toList()).get(0).getMessage();
log.error("ConstraintViolationException:{}",e);
//请求参数为空校验
return ResultUtils.error(ErrorCode.NULL_ERROR.getCode(),msg,msg);
}
}
package com.yd.common.interceptor;
import cn.hutool.core.collection.CollectionUtil;
import com.alibaba.fastjson.JSONObject;
import com.yd.common.constant.TokenConstants;
import com.yd.common.utils.SecurityUtils;
import com.yd.common.utils.StringUtils;
import feign.RequestInterceptor;
import feign.RequestTemplate;
import feign.Util;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import javax.servlet.http.HttpServletRequest;
import java.util.Collection;
import java.util.Enumeration;
/**
* feign 请求拦截器
*/
@Slf4j
@Component
public class FeignRequestInterceptor implements RequestInterceptor {
@Override
public void apply(RequestTemplate requestTemplate) {
ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
if (attributes != null) {
HttpServletRequest request = attributes.getRequest();
Enumeration<String> headerNames = request.getHeaderNames();
String name;
// 将原有请求中的header,数据转移至新的请求中
if (headerNames != null) {
while(headerNames.hasMoreElements()) {
name = (String)headerNames.nextElement();
String values = request.getHeader(name);
if (!name.equalsIgnoreCase("content-length")) {
requestTemplate.header(name, new String[]{values});
}
}
}
}
String corpId = SecurityUtils.getCorpId();
if (StringUtils.isNotEmpty(corpId)) {
String method = requestTemplate.method();
if("GET".equals(method)){
Collection<String> corpidParm = requestTemplate.queries().get("corpid");
if(CollectionUtil.isEmpty(corpidParm)){
requestTemplate.query("corpid", corpId);
}
}
if (requestTemplate.body() != null) {
int length = requestTemplate.body().length;
boolean hasFormData = requestTemplate.headers().get("Content-Type").stream()
.anyMatch(h -> h.contains("form-data"));
if (0 < length && !hasFormData) {
String jsonBody = new String(requestTemplate.body());
if (!StringUtils.isEmpty(jsonBody)) {
JSONObject parse = JSONObject.parseObject(jsonBody);
parse.put("corpid", corpId);
// 替换请求体
byte[] bodyData = parse.toJSONString().getBytes(Util.UTF_8);
requestTemplate.body(bodyData, Util.UTF_8);
}
}
}
} else {
log.warn("url:{} corpId 为null", requestTemplate.url());
}
}
/**
* 获取请求token
*/
private String getToken(String token) {
// 如果前端设置了令牌前缀,则裁剪掉前缀
if (StringUtils.isNotEmpty(token) && token.startsWith(TokenConstants.PREFIX)) {
token = token.replaceFirst(TokenConstants.PREFIX, StringUtils.EMPTY);
}
return token;
}
}
package com.yd.common.typeHandler;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.StrUtil;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.TypeReference;
import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType;
import org.apache.ibatis.type.MappedJdbcTypes;
import org.apache.ibatis.type.MappedTypes;
import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
@MappedJdbcTypes(JdbcType.VARBINARY)
@MappedTypes({List.class})
public abstract class ListTypeHandler<T> extends BaseTypeHandler<List<T>> {
@Override
public void setNonNullParameter(PreparedStatement ps, int i, List<T> parameter, JdbcType jdbcType) throws SQLException {
String content = CollUtil.isEmpty(parameter) ? null : JSON.toJSONString(parameter);
ps.setString(i, content);
}
@Override
public List<T> getNullableResult(ResultSet rs, String columnName) throws SQLException {
return this.getListByJsonArrayString(rs.getString(columnName));
}
@Override
public List<T> getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
return this.getListByJsonArrayString(rs.getString(columnIndex));
}
@Override
public List<T> getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
return this.getListByJsonArrayString(cs.getString(columnIndex));
}
private List<T> getListByJsonArrayString(String content) {
return StrUtil.isBlank(content) ? new ArrayList<>() : JSON.parseObject(content, this.specificType());
}
/**
* 具体类型,由子类提供
*
* @return 具体类型
*/
protected abstract TypeReference<List<T>> specificType();
}
package com.yd.common.utils;
import com.yd.common.constant.SecurityConstants;
import com.yd.common.constant.TokenConstants;
import com.yd.common.core.text.Convert;
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import java.util.Map;
/**
* Jwt工具类
*/
public class JwtUtils {
public static String secret = TokenConstants.SECRET;
/**
* 从数据声明生成令牌
*
* @param claims 数据声明
* @return 令牌
*/
public static String createToken(Map<String, Object> claims) {
return Jwts.builder().setClaims(claims).signWith(SignatureAlgorithm.HS512, secret).compact();
}
/**
* 从令牌中获取数据声明
*
* @param token 令牌
* @return 数据声明
*/
public static Claims parseToken(String token) {
return Jwts.parser().setSigningKey(secret).parseClaimsJws(token).getBody();
}
/**
* 根据令牌获取企业Id
*
* @param token 令牌
* @return 企业Id
*/
public static String getCorpId(String token) {
Claims claims = parseToken(token);
return getValue(claims, SecurityConstants.Details.CORP_ID.getCode());
}
/**
* 根据身份信息获取企业Id
*
* @param claims 身份信息
* @return 企业Id
*/
public static String getCorpId(Claims claims) {
return getValue(claims, SecurityConstants.Details.CORP_ID.getCode());
}
/**
* 根据令牌获取企业账号
*
* @param token 令牌
* @return 企业账号
*/
public static String getCorpName(String token) {
Claims claims = parseToken(token);
return getValue(claims, SecurityConstants.Details.CORP_NAME.getCode());
}
/**
* 根据身份信息获取企业账号
*
* @param claims 身份信息
* @return 企业账号
*/
public static String getCorpName(Claims claims) {
return getValue(claims, SecurityConstants.Details.CORP_NAME.getCode());
}
/**
* 根据令牌获取租户id
*
* @param token 身份信息
* @return 租户ID
*/
public static Integer getTenantId(String token) {
Claims claims = parseToken(token);
Integer tenantId = getIntValue(claims, SecurityConstants.Details.TENANT_ID.getCode());
if(tenantId != null){
return tenantId;
}else {
return null;
}
}
/**
* 根据身份信息获取企业账号
*
* @param claims 身份信息
* @return 企业账号
*/
public static Integer getTenantId(Claims claims) {
Integer tenantId = getIntValue(claims, SecurityConstants.Details.TENANT_ID.getCode());
if(tenantId != null){
return tenantId;
}else {
return null;
}
}
/**
* 根据令牌获取用户Id
*
* @param token 令牌
* @return 用户Id
*/
public static String getUserId(String token) {
Claims claims = parseToken(token);
return getValue(claims, SecurityConstants.Details.USER_ID.getCode());
}
/**
* 根据身份信息获取用户Id
*
* @param claims 身份信息
* @return 用户Id
*/
public static String getUserId(Claims claims) {
return getValue(claims, SecurityConstants.Details.USER_ID.getCode());
}
/**
* 根据令牌获取用户账号
*
* @param token 令牌
* @return 用户账号
*/
public static String getUserName(String token) {
Claims claims = parseToken(token);
return getValue(claims, SecurityConstants.Details.USER_NAME.getCode());
}
/**
* 根据身份信息获取用户账号
*
* @param claims 身份信息
* @return 用户账号
*/
public static String getUserName(Claims claims) {
return getValue(claims, SecurityConstants.Details.USER_NAME.getCode());
}
/**
* 根据令牌获取用户信息
*
* @param token 令牌
* @return 用户账号
*/
public static String getLoginUser(String token) {
Claims claims = parseToken(token);
return getValue(claims, SecurityConstants.Details.LOGIN_USER.getCode());
}
/**
* 根据身份信息获取用户用户信息
*
* @param claims 身份信息
* @return 用户账号
*/
public static String getLoginUser(Claims claims) {
return getValue(claims, SecurityConstants.Details.LOGIN_USER.getCode());
}
/**
* 根据身份信息获取用户类型
*
* @param claims 身份信息
* @return 用户类型
*/
public static String getUserType(Claims claims) {
return getValue(claims, SecurityConstants.Details.USER_TYPE.getCode());
}
/**
* 根据令牌获取用户类型
*
* @param token 令牌
* @return 用户类型
*/
public static String getUserType(String token) {
Claims claims = parseToken(token);
return getValue(claims, SecurityConstants.Details.USER_TYPE.getCode());
}
/**
* 根据令牌获取用户标识
*
* @param token 令牌
* @return 用户Id
*/
public static String getUserKey(String token) {
Claims claims = parseToken(token);
return getValue(claims, SecurityConstants.Details.USER_KEY.getCode());
}
/**
* 根据令牌获取用户标识
*
* @param claims 身份信息
* @return 用户Id
*/
public static String getUserKey(Claims claims) {
return getValue(claims, SecurityConstants.Details.USER_KEY.getCode());
}
/**
* 根据身份信息获取键值
*
* @param claims 身份信息
* @param key 键
* @return 值
*/
public static String getValue(Claims claims, String key) {
return Convert.toStr(claims.get(key), "");
}
/**
* 根据身份信息获取键值
*
* @param claims 身份信息
* @param key 键
* @return 值
*/
public static Integer getIntValue(Claims claims, String key) {
return Convert.toInt(claims.get(key));
}
}
package com.yd.common.utils;
import com.yd.common.enums.ErrorCode;
import com.yd.common.exception.BaseResponse;
/**
* 返回类型工具类
*
* @author zxm
*/
public class ResultUtils {
/**
* 成功
* @param data
* @param <T>
* @return
*/
public static <T> BaseResponse<T> success(T data) {
return new BaseResponse<>(0, data, "ok");
}
/**
* 成功
* @param data
* @return
*/
public static BaseResponse success(int data) {
return new BaseResponse(0, data, "ok");
}
/**
* 失败
* @param errorCode
* @return
*/
public static BaseResponse error(ErrorCode errorCode){
return new BaseResponse<>(errorCode.getCode(),null,errorCode.getMessage(),errorCode.getDescription()) ;
}
/**
* 失败
* @param errorCode
* @return
*/
public static BaseResponse error(ErrorCode errorCode, String message, String description){
return new BaseResponse<>(errorCode.getCode(),description) ;
}
/**
* 失败
* @param code
* @return
*/
public static BaseResponse error(int code,String message,String description){
return new BaseResponse<>(code,null,message,description) ;
}
/**
* 失败
* @param errorCode
* @return
*/
public static BaseResponse error(ErrorCode errorCode,String description){
return new BaseResponse<>(errorCode.getCode(),null,errorCode.getMessage(),description) ;
}
}
package com.yd.common.utils;
import cn.hutool.core.util.ObjectUtil;
import com.yd.common.constant.AuthorityConstants;
import com.yd.common.constant.SecurityConstants;
import com.yd.common.constant.TokenConstants;
import com.yd.common.context.SecurityContextHolder;
import com.yd.common.core.domain.model.LoginUser;
import com.yd.common.core.domain.model.WxLoginUser;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import javax.servlet.http.HttpServletRequest;
/**
* 安全服务工具类
*
*/
public class SecurityUtils
{
/**
* 获取企业Id
* @return
*/
public static String getCorpId() {
return SecurityContextHolder.getCorpId();
}
/**
* 获取企业名称
* @return
*/
public static String getCorpName() {
return SecurityContextHolder.getCorpName();
}
/**
* 获取用户Id
*/
public static Long getUserId() {
return SecurityContextHolder.getUserId();
}
/**
* 获取用户
*/
public static String getUserName() {
return SecurityContextHolder.getUserName();
}
/**
* 获取用户权限标识
*/
public static String getUserType() {
return SecurityContextHolder.getUserType();
}
/**
* 获取用户key
*/
public static String getUserKey() {
return SecurityContextHolder.getUserKey();
}
/**
* 获取登录用户信息
*/
public static LoginUser getLoginUser() {
return SecurityContextHolder.get(SecurityConstants.Details.LOGIN_USER.getCode(), LoginUser.class);
}
public static WxLoginUser getWxLoginUser() {
return SecurityContextHolder.get(SecurityConstants.Details.LOGIN_USER.getCode(), WxLoginUser.class);
}
/**
* 获取请求token
*/
public static String getToken() {
return getToken(ServletUtils.getRequest());
}
/**
* 根据request获取请求token
*/
public static String getToken(HttpServletRequest request) {
// 从header获取token标识
String token = request.getHeader(TokenConstants.AUTHENTICATION);
return replaceTokenPrefix(token);
}
/**
* 裁剪token前缀
*/
public static String replaceTokenPrefix(String token) {
// 如果前端设置了令牌前缀,则裁剪掉前缀
if (StringUtils.isNotEmpty(token) && token.startsWith(TokenConstants.PREFIX)) {
token = token.replaceFirst(TokenConstants.PREFIX, "");
}
return token;
}
/**
* 是否为超管用户
*
* @return 结果
*/
public static boolean isAdminUser() {
return ObjectUtil.equal(AuthorityConstants.UserType.ADMIN.getCode(),getUserType());
//return StringUtils.equals(AuthorityConstants.UserType.ADMIN.getCode(), getUserType());
}
/**
* 是否为超管租户
*
* @return 结果
*/
public static boolean isAdminTenant() {
// return StringUtils.equals(AuthorityConstants.TenantType.ADMIN.getCode(), getIsLessor());
return StringUtils.equals(AuthorityConstants.TenantType.ADMIN.getCode(), null);
}
/**
* 生成BCryptPasswordEncoder密码
*
* @param password 密码
* @return 加密字符串
*/
public static String encryptPassword(String password) {
BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder();
return passwordEncoder.encode(password);
}
/**
* 判断密码是否相同
*
* @param rawPassword 真实密码
* @param encodedPassword 加密后字符
* @return 结果
*/
public static boolean matchesPassword(String rawPassword, String encodedPassword) {
BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder();
return passwordEncoder.matches(rawPassword, encodedPassword);
}
}
package com.yd.common.utils;
import com.alibaba.fastjson.JSONObject;
import com.yd.common.constant.Constants;
import com.yd.common.constant.HttpConstants;
import com.yd.common.core.text.Convert;
import com.yd.common.domain.R;
import org.springframework.core.io.buffer.DataBuffer;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.server.reactive.ServerHttpResponse;
import org.springframework.web.context.request.RequestAttributes;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import reactor.core.publisher.Mono;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
import java.net.URLEncoder;
import java.util.Enumeration;
import java.util.LinkedHashMap;
import java.util.Map;
/**
* 客户端工具类
*
*
*/
public class ServletUtils {
/**
* 获取String参数
*/
public static String getParameter(String name) {
return getRequest().getParameter(name);
}
/**
* 获取String参数
*/
public static String getParameter(String name, String defaultValue) {
return Convert.toStr(getRequest().getParameter(name), defaultValue);
}
/**
* 获取Integer参数
*/
public static Integer getParameterToInt(String name) {
return Convert.toInt(getRequest().getParameter(name));
}
/**
* 获取Integer参数
*/
public static Integer getParameterToInt(String name, Integer defaultValue) {
return Convert.toInt(getRequest().getParameter(name), defaultValue);
}
/**
* 获取request
*/
public static HttpServletRequest getRequest() {
return getRequestAttributes() == null ? null:getRequestAttributes().getRequest();
}
/**
* 获取response
*/
public static HttpServletResponse getResponse() {
return getRequestAttributes().getResponse();
}
/**
* 获取session
*/
public static HttpSession getSession() {
return getRequest().getSession();
}
public static ServletRequestAttributes getRequestAttributes() {
RequestAttributes attributes = RequestContextHolder.getRequestAttributes();
if(attributes == null){
return null;
}
return (ServletRequestAttributes) attributes;
}
/**
* 将字符串渲染到客户端
*
* @param response 渲染对象
* @param string 待渲染的字符串
* @return null
*/
public static String renderString(HttpServletResponse response, String string) {
try {
response.setStatus(200);
response.setContentType("application/json");
response.setCharacterEncoding("utf-8");
response.getWriter().print(string);
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
public static String getHeader(HttpServletRequest request, String name)
{
String value = request.getHeader(name);
if (StringUtils.isEmpty(value))
{
return StringUtils.EMPTY;
}
return urlDecode(value);
}
public static Map<String, String> getHeaders(HttpServletRequest request) {
Map<String, String> map = new LinkedHashMap<>();
Enumeration<String> enumeration = request.getHeaderNames();
if (enumeration != null) {
while (enumeration.hasMoreElements()) {
String key = enumeration.nextElement();
String value = request.getHeader(key);
map.put(key, value);
}
}
return map;
}
/**
* 内容解码
*
* @param str 内容
* @return 解码后的内容
*/
public static String urlDecode(String str) {
try {
return URLDecoder.decode(str, HttpConstants.Character.UTF8.getCode());
} catch (UnsupportedEncodingException e) {
return StringUtils.EMPTY;
}
}
/**
* 是否是Ajax异步请求
*
* @param request
*/
public static boolean isAjaxRequest(HttpServletRequest request) {
String accept = request.getHeader("accept");
if (accept != null && accept.indexOf("application/json") != -1) {
return true;
}
String xRequestedWith = request.getHeader("X-Requested-With");
if (xRequestedWith != null && xRequestedWith.indexOf("XMLHttpRequest") != -1) {
return true;
}
String uri = request.getRequestURI();
if (StringUtils.inStringIgnoreCase(uri, ".json", ".xml")) {
return true;
}
String ajax = request.getParameter("__ajax");
if (StringUtils.inStringIgnoreCase(ajax, "json", "xml")) {
return true;
}
return false;
}
/**
* 设置webflux模型响应
*
* @param response ServerHttpResponse
* @param value 响应内容
* @return Mono<Void>
*/
public static Mono<Void> webFluxResponseWriter(ServerHttpResponse response, Object value) {
return webFluxResponseWriter(response, HttpStatus.OK, value, R.FAIL);
}
/**
* 设置webflux模型响应
*
* @param response ServerHttpResponse
* @param code 响应状态码
* @param value 响应内容
* @return Mono<Void>
*/
public static Mono<Void> webFluxResponseWriter(ServerHttpResponse response, Object value, int code) {
return webFluxResponseWriter(response, HttpStatus.OK, value, code);
}
/**
* 设置webflux模型响应
*
* @param response ServerHttpResponse
* @param status http状态码
* @param code 响应状态码
* @param value 响应内容
* @return Mono<Void>
*/
public static Mono<Void> webFluxResponseWriter(ServerHttpResponse response, HttpStatus status, Object value,
int code) {
return webFluxResponseWriter(response, MediaType.APPLICATION_JSON_VALUE, status, value, code);
}
/**
* 设置webflux模型响应
*
* @param response ServerHttpResponse
* @param contentType content-type
* @param status http状态码
* @param code 响应状态码
* @param value 响应内容
* @return Mono<Void>
*/
public static Mono<Void> webFluxResponseWriter(ServerHttpResponse response, String contentType, HttpStatus status,
Object value, int code) {
response.setStatusCode(status);
response.getHeaders().add(HttpHeaders.CONTENT_TYPE, contentType);
R<?> result = R.fail(code, value.toString());
DataBuffer dataBuffer = response.bufferFactory().wrap(JSONObject.toJSONString(result).getBytes());
return response.writeWith(Mono.just(dataBuffer));
}
/**
* 内容编码
*
* @param str 内容
* @return 编码后的内容
*/
public static String urlEncode(String str) {
try {
return URLEncoder.encode(str, Constants.UTF8);
} catch (UnsupportedEncodingException e) {
return StringUtils.EMPTY;
}
}
}
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>yd-cloud</artifactId>
<groupId>com.yd</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>yd-email</artifactId>
<description>邮箱模块</description>
<properties>
<java.version>1.8</java.version>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<maven.build.timestamp.format>yyyyMMddHHmmss</maven.build.timestamp.format>
</properties>
<dependencies>
<!-- 公共组件模块 -->
<dependency>
<groupId>com.yd</groupId>
<artifactId>yd-common</artifactId>
</dependency>
</dependencies>
<build>
<finalName>yd-email</finalName>
<plugins>
<!-- 引用Spring Boot Maven插件 -->
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>${springboot.maven.version}</version>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>yd-cloud</artifactId>
<groupId>com.yd</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>yd-feign</artifactId>
<description>Feign组件模块</description>
</project>
<?xml version="1.0" encoding="UTF-8"?>
<module type="JAVA_MODULE" version="4" />
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>yd-cloud</artifactId>
<groupId>com.yd</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>yd-fileservice</artifactId>
<description>文件服务模块</description>
<properties>
<java.version>1.8</java.version>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<maven.build.timestamp.format>yyyyMMddHHmmss</maven.build.timestamp.format>
</properties>
<dependencies>
<!-- SpringBoot -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- SpringCloud Alibaba Nacos -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!-- SpringCloud Alibaba Nacos Config -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
<!-- SpringCloud Alibaba Sentinel -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
<!-- Swagger -->
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
</dependency>
<dependency>
<groupId>com.yd</groupId>
<artifactId>yd-common</artifactId>
</dependency>
</dependencies>
<build>
<finalName>yd-fileservice</finalName>
<plugins>
<!-- 引用Spring Boot Maven插件 -->
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>${springboot.maven.version}</version>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
package com.yd.fileservice;
import com.yd.common.constant.WeServerNameConstants;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
import org.springframework.boot.autoconfigure.jdbc.DataSourceTransactionManagerAutoConfiguration;
import org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration;
import org.springframework.boot.builder.SpringApplicationBuilder;
/**
* 文件服务
*
*/
@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class,
DataSourceTransactionManagerAutoConfiguration.class,
HibernateJpaAutoConfiguration.class})
public class FileApplication {
public static void main(String[] args) {
new SpringApplicationBuilder(FileApplication.class)
.properties("spring.config.name:bootstrap", "config/bootstrap.yml")
.properties("spring.application.name="+ WeServerNameConstants.ydFile)
.build().run(args);
System.out.println("(♥◠‿◠)ノ゙ yd-fileservice启动成功 ლ(´ڡ`ლ)゙ ");
}
}
${AnsiColor.GREEN}
_ _ _ __ __ ____ _ _ _____ _ _
| | (_)_ __ | | _\ \ / /__ / ___| |__ __ _| |_| ___(_) | ___
| | | | '_ \| |/ /\ \ /\ / / _ \ | | '_ \ / _` | __| |_ | | |/ _ \
| |___| | | | | < \ V V / __/ |___| | | | (_| | |_| _| | | | __/
|_____|_|_| |_|_|\_\ \_/\_/ \___|\____|_| |_|\__,_|\__|_| |_|_|\___|
${AnsiColor.BRIGHT_WHITE}
Spring Application Name: ${spring.application.name}
Spring Application Name: ${spring.application.name}
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>yd-cloud</artifactId>
<groupId>com.yd</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>yd-framework</artifactId>
<description>框架配置</description>
<properties>
<java.version>1.8</java.version>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<maven.build.timestamp.format>yyyyMMddHHmmss</maven.build.timestamp.format>
</properties>
<dependencies>
<!-- SpringBoot Web容器 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- SpringBoot 拦截器 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
<!-- spring security 安全认证 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
<!-- 公共组件模块 -->
<dependency>
<groupId>com.yd</groupId>
<artifactId>yd-common</artifactId>
</dependency>
</dependencies>
<build>
<finalName>yd-framework</finalName>
<plugins>
<!-- 引用Spring Boot Maven插件 -->
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>${springboot.maven.version}</version>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>yd-cloud</artifactId>
<groupId>com.yd</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>yd-gateway</artifactId>
<description>网关服务</description>
<properties>
<java.version>1.8</java.version>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
<dependencies>
<!-- SpringCloud Gateway -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
<version>3.1.1</version>
</dependency>
<!-- SpringCloud Alibaba Nacos -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
<version>2021.1</version>
</dependency>
<!-- SpringCloud Alibaba Nacos Config -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
<version>2021.1</version>
</dependency>
<!-- SpringCloud Alibaba Sentinel -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
<version>2021.1</version>
</dependency>
<!-- SpringCloud Alibaba Sentinel Gateway -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-sentinel-gateway</artifactId>
<version>2021.1</version>
</dependency>
<!-- Sentinel Datasource Nacos -->
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-datasource-nacos</artifactId>
<version>1.8.0</version>
</dependency>
<!-- SpringBoot Actuator -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<!-- 阿里数据库连接池 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<!-- 公共组件模块 -->
<dependency>
<groupId>com.yd</groupId>
<artifactId>yd-common</artifactId>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-common</artifactId>
<version>2.9.2</version>
<scope>compile</scope>
</dependency>
</dependencies>
<build>
<finalName>yd-gateway</finalName>
<plugins>
<!-- 引用Spring Boot Maven插件 -->
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>${springboot.maven.version}</version>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
This diff is collapsed. Click to expand it.
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment