Эх сурвалжийг харах

增加易推中台模块
中台字典 用户信息
代理商管理相关接口

marxjaw 3 сар өмнө
parent
commit
0193440219
34 өөрчлөгдсөн 1663 нэмэгдсэн , 18 устгасан
  1. 1 0
      pom.xml
  2. 4 2
      yt-common/src/main/java/com/ytpm/general/RepMessage.java
  3. 44 0
      yt-common/src/main/java/com/ytpm/middle/model/YtMiddleEnterprise.java
  4. 20 0
      yt-common/src/main/java/com/ytpm/middle/param/AgentBaseInfoParam.java
  5. 46 0
      yt-common/src/main/java/com/ytpm/middle/param/AgentForm.java
  6. 53 0
      yt-common/src/main/java/com/ytpm/middle/view/AgentBaseInfoListVo.java
  7. 2 9
      yt-common/src/main/java/com/ytpm/util/IDUtil.java
  8. 64 0
      yt-middle/middle-platform/pom.xml
  9. 19 0
      yt-middle/middle-platform/src/main/java/com/ytpm/middle/MiddleApplication.java
  10. 104 0
      yt-middle/middle-platform/src/main/java/com/ytpm/middle/config/CustomUserAuthenticationConverter.java
  11. 72 0
      yt-middle/middle-platform/src/main/java/com/ytpm/middle/config/ResourceServerConfig.java
  12. 40 0
      yt-middle/middle-platform/src/main/java/com/ytpm/middle/config/swagger/SwaggerConfig.java
  13. 66 0
      yt-middle/middle-platform/src/main/java/com/ytpm/middle/controller/AgentController.java
  14. 40 0
      yt-middle/middle-platform/src/main/java/com/ytpm/middle/controller/MiddleController.java
  15. 23 0
      yt-middle/middle-platform/src/main/java/com/ytpm/middle/dao/AgentMapper.java
  16. 23 0
      yt-middle/middle-platform/src/main/java/com/ytpm/middle/dao/EnterpriseMapper.java
  17. 14 0
      yt-middle/middle-platform/src/main/java/com/ytpm/middle/dao/MiddleDictMapper.java
  18. 10 0
      yt-middle/middle-platform/src/main/java/com/ytpm/middle/dao/MiddleUserMapper.java
  19. 37 0
      yt-middle/middle-platform/src/main/java/com/ytpm/middle/handle/MiddleAuthenticationEntryPoint.java
  20. 23 0
      yt-middle/middle-platform/src/main/java/com/ytpm/middle/oss/OssAttach.java
  21. 54 0
      yt-middle/middle-platform/src/main/java/com/ytpm/middle/oss/OssProperties.java
  22. 76 0
      yt-middle/middle-platform/src/main/java/com/ytpm/middle/oss/OssUtil.java
  23. 14 0
      yt-middle/middle-platform/src/main/java/com/ytpm/middle/oss/StorageFactory.java
  24. 57 0
      yt-middle/middle-platform/src/main/java/com/ytpm/middle/oss/StorageTemplate.java
  25. 113 0
      yt-middle/middle-platform/src/main/java/com/ytpm/middle/oss/minio/MinioStorageTemplate.java
  26. 27 0
      yt-middle/middle-platform/src/main/java/com/ytpm/middle/service/AgentService.java
  27. 126 0
      yt-middle/middle-platform/src/main/java/com/ytpm/middle/service/impl/AgentServiceImpl.java
  28. 267 0
      yt-middle/middle-platform/src/main/java/com/ytpm/middle/util/RedisUtil.java
  29. 36 0
      yt-middle/middle-platform/src/main/resources/mapper/AgentMapper.xml
  30. 78 0
      yt-middle/middle-platform/src/main/resources/mapper/EnterpriseMapper.xml
  31. 10 0
      yt-middle/middle-platform/src/main/resources/mapper/MiddleDictMapper.xml
  32. 11 0
      yt-middle/middle-platform/src/main/resources/mapper/MiddleUserMapper.xml
  33. 87 0
      yt-middle/pom.xml
  34. 2 7
      yt-oauth/oauth-service/src/main/java/com/ytpm/config/WebSecurityConfig.java

+ 1 - 0
pom.xml

@@ -16,6 +16,7 @@
         <module>yt-risk</module>
         <module>yt-app</module>
         <module>yt-advertise</module>
+        <module>yt-middle</module>
     </modules>
 
     <properties>

+ 4 - 2
yt-common/src/main/java/com/ytpm/general/RepMessage.java

@@ -12,19 +12,21 @@ public class RepMessage {
     public static final String DELETE_SUCCESS = "删除成功";
     public static final String RELATIVE_SUCCESS = "关联成功";
     public static final String LOGOUT_SUCCESS = "已退出登录";
+    public static final String LOGIN_SUCCESS = "登录成功";
+    public static final String LOCK_USER_SUCCESS = "用户锁定成功";
+
     public static final String NOT_LOGIN= "当前用户未登录";
     public static final String USER_NAME_EMPTY = "用户名不能为空";
     public static final String USERNAME_OR_PASSWORD_ERROR = "用户名或密码错误";
     public static final String LOGIN_NON_MSG = "请输入验证码";
-    public static final String LOGIN_SUCCESS = "登录成功";
     public static final String METHOD_NOT_ARROW = "请求方式不允许";
     public static final String TOKEN_EXPIRE = "登录超时,请重新登录";
     public static final String TOKEN_INVALID = "登录已失效,请重新登录";
     public static final String LOGOUT_FAIL = "用户注销失败";
     public static final String UUID_EMPTY = "验证码生成失败! UUID:";
+    public static final String OBJECT_ALREADY_EXIST = "查询对象已存在";
 
     public static final String COLLECTION_EMPTY = "集合数据不能为空";
-    public static final String LOCK_USER_SUCCESS = "用户锁定成功";
     public static final String USER_STATUS_MODIFY = "用户状态已改变";
     public static final String ALREADY_RISK_USER = "用户已被风控";
     public static final String RELATIVE_APP_SUCCESS = "关联应用成功";

+ 44 - 0
yt-common/src/main/java/com/ytpm/middle/model/YtMiddleEnterprise.java

@@ -0,0 +1,44 @@
+package com.ytpm.middle.model;
+
+import com.ytpm.general.BaseParam;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+
+@EqualsAndHashCode(callSuper = true)
+@Data
+@ApiModel("易推加盟企业信息表")
+@NoArgsConstructor
+@AllArgsConstructor
+public class YtMiddleEnterprise extends BaseParam {
+    /** 企业ID */
+    @ApiModelProperty("企业ID")
+    private int enterpriseId;
+    /** 用户ID */
+    @ApiModelProperty("用户ID")
+    private String userId;
+    /** 企业名称 */
+    @ApiModelProperty("企业名称")
+    private String enterpriseName;
+    /** 企业信用代码 */
+    @ApiModelProperty("企业信用代码")
+    private String creditCode;
+    /** 营业执照副本 */
+    @ApiModelProperty("营业执照副本")
+    private String businessLicence;
+    /** 法人 */
+    @ApiModelProperty("法人")
+    private String legal;
+    /** 法人证件号 */
+    @ApiModelProperty("法人证件号")
+    private String legalCard;
+    /** 法人联系方式 */
+    @ApiModelProperty("法人联系方式")
+    private String concatPhone;
+    /** 注册地址 */
+    @ApiModelProperty("注册地址")
+    private String registryAddress;
+}

+ 20 - 0
yt-common/src/main/java/com/ytpm/middle/param/AgentBaseInfoParam.java

@@ -0,0 +1,20 @@
+package com.ytpm.middle.param;
+
+import com.ytpm.general.BaseParam;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+
+@EqualsAndHashCode(callSuper = true)
+@Data
+@ApiModel("企业基本信息表单")
+@NoArgsConstructor
+@AllArgsConstructor
+public class AgentBaseInfoParam extends BaseParam {
+    /** 企业名称 */
+    @ApiModelProperty("企业名称")
+    private String enterpriseName;
+}

+ 46 - 0
yt-common/src/main/java/com/ytpm/middle/param/AgentForm.java

@@ -0,0 +1,46 @@
+package com.ytpm.middle.param;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+import org.hibernate.validator.constraints.NotBlank;
+
+@EqualsAndHashCode(callSuper = true)
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+@ApiModel("企业数据表单")
+public class AgentForm extends AgentBaseInfoParam {
+
+    @ApiModelProperty("企业ID")
+    private int enterpriseId;
+    /** 企业信用代码 */
+    @NotBlank(message = "企业信用代码不能为空")
+    @ApiModelProperty(value = "企业信用代码", required = true)
+    private String creditCode;
+    /** 营业执照副本 */
+    @ApiModelProperty(value = "营业执照副本",required = true)
+    private String businessLicence;
+    /** 法人 */
+    @ApiModelProperty(value = "法人",required = true)
+    private String legal;
+    /** 法人证件号 */
+    @ApiModelProperty(value = "法人证件号",required = true)
+    private String legalCard;
+    /** 法人联系方式 */
+    @NotBlank(message = "法人联系方式不能为空")
+    @ApiModelProperty(value = "法人联系方式", required = true)
+    private String concatPhone;
+    /** 注册地址 */
+    @ApiModelProperty("注册地址")
+    private String registryAddress;
+    /** 登录账号 */
+    @ApiModelProperty(value = "登录账号",required = true)
+    private String loginName;
+    /** 账号类型 */
+    @ApiModelProperty("账号类型")
+    private Integer userType;
+}

+ 53 - 0
yt-common/src/main/java/com/ytpm/middle/view/AgentBaseInfoListVo.java

@@ -0,0 +1,53 @@
+package com.ytpm.middle.view;
+
+import com.ytpm.general.BaseParam;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+
+@EqualsAndHashCode(callSuper = true)
+@Data
+@ApiModel("企业信息列表")
+@NoArgsConstructor
+@AllArgsConstructor
+public class AgentBaseInfoListVo extends BaseParam {
+    /** 企业ID */
+    @ApiModelProperty("企业ID")
+    private int enterpriseId;
+    /** 用户ID */
+    @ApiModelProperty("账号")
+    private String userId;
+    /** 企业名称 */
+    @ApiModelProperty("企业名称")
+    private String enterpriseName;
+    /** 企业信用代码 */
+    @ApiModelProperty("企业信用代码")
+    private String creditCode;
+    /** 营业执照副本 */
+    @ApiModelProperty("营业执照副本")
+    private String businessLicence;
+    /** 法人 */
+    @ApiModelProperty("法人")
+    private String legal;
+    /** 法人证件号 */
+    @ApiModelProperty("法人证件号")
+    private String legalCard;
+    /** 法人联系方式 */
+    @ApiModelProperty("法人联系方式")
+    private String concatPhone;
+    /** 注册地址 */
+    @ApiModelProperty("注册地址")
+    private String registryAddress;
+    /** 登录用户名 */
+    @ApiModelProperty("登录用户名")
+    private String loginName;
+    /** 创建人 */
+    @ApiModelProperty("创建人")
+    private String createUserName;
+    /** 用户类型 */
+    @ApiModelProperty("用户类型")
+    private Integer userType;
+}

+ 2 - 9
yt-common/src/main/java/com/ytpm/util/IDUtil.java

@@ -2,19 +2,12 @@ package com.ytpm.util;
 
 import cn.hutool.core.util.IdUtil;
 public class IDUtil {
-    private final static String PREFIX = "ytPlatform_";
 
     /**
      * 雪花算法ID 生成
      * @return
      */
-    public static String generateFlowID(){
-       return PREFIX + IdUtil.getSnowflakeNextIdStr();
-    }
-
-    public static void main(String[] args) {
-        for (int i = 0; i<30;i++){
-            System.err.println(generateFlowID());
-        }
+    public static String generateFlowID(String prefix) {
+       return prefix + IdUtil.getSnowflakeNextIdStr();
     }
 }

+ 64 - 0
yt-middle/middle-platform/pom.xml

@@ -0,0 +1,64 @@
+<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">
+    <modelVersion>4.0.0</modelVersion>
+    <parent>
+        <groupId>com.ytpm</groupId>
+        <artifactId>yt-middle</artifactId>
+        <version>1.0-SNAPSHOT</version>
+    </parent>
+
+    <artifactId>middle-platform</artifactId>
+    <packaging>jar</packaging>
+
+    <name>middle-platform</name>
+    <url>http://maven.apache.org</url>
+
+    <properties>
+        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+    </properties>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.springframework.cloud</groupId>
+            <artifactId>spring-cloud-starter-oauth2</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.google.guava</groupId>
+            <artifactId>guava</artifactId>
+            <version>32.0.1-android</version>
+        </dependency>
+    </dependencies>
+
+    <build>
+        <finalName>yt-middle</finalName>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-compiler-plugin</artifactId>
+                <version>3.8.1</version>
+                <configuration>
+                    <source>8</source>
+                    <target>8</target>
+                    <encoding>utf-8</encoding>
+                </configuration>
+            </plugin>
+            <plugin>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-maven-plugin</artifactId>
+                <version>2.5.3</version>
+                <executions>
+                    <execution>
+                        <phase>package</phase>
+                        <goals>
+                            <goal>repackage</goal>
+                        </goals>
+                    </execution>
+                </executions>
+                <configuration>
+                    <includeSystemScope>true</includeSystemScope>
+                    <mainClass>com.ytpm.middle.MiddleApplication</mainClass>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
+</project>

+ 19 - 0
yt-middle/middle-platform/src/main/java/com/ytpm/middle/MiddleApplication.java

@@ -0,0 +1,19 @@
+package com.ytpm.middle;
+
+import org.mybatis.spring.annotation.MapperScan;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
+import org.springframework.web.bind.annotation.RestController;
+
+@RestController
+@SpringBootApplication
+@EnableDiscoveryClient
+@MapperScan(basePackages = "com.ytpm.middle.dao")
+public class MiddleApplication
+{
+    public static void main( String[] args )
+    {
+        SpringApplication.run(MiddleApplication.class, args);
+    }
+}

+ 104 - 0
yt-middle/middle-platform/src/main/java/com/ytpm/middle/config/CustomUserAuthenticationConverter.java

@@ -0,0 +1,104 @@
+package com.ytpm.middle.config;
+
+import cn.hutool.core.bean.BeanUtil;
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.ytpm.agent.view.AgentUserInfo;
+import com.ytpm.constant.StrConstant;
+import com.ytpm.middle.dao.MiddleUserMapper;
+import com.ytpm.middle.util.RedisUtil;
+import lombok.Data;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
+import org.springframework.security.core.Authentication;
+import org.springframework.security.core.GrantedAuthority;
+import org.springframework.security.core.authority.AuthorityUtils;
+import org.springframework.security.core.userdetails.UserDetailsService;
+import org.springframework.security.oauth2.provider.token.UserAuthenticationConverter;
+import org.springframework.stereotype.Component;
+import org.springframework.util.StringUtils;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.LinkedHashMap;
+import java.util.Map;
+import java.util.Objects;
+
+/**
+ * 自定义Security上下文信息
+ */
+@Data
+@Component
+@Slf4j
+public class CustomUserAuthenticationConverter implements UserAuthenticationConverter {
+    private Collection<? extends GrantedAuthority> defaultAuthorities =
+            new ArrayList<>(AuthorityUtils.commaSeparatedStringToAuthorityList("ROLE_ADMIN"));
+    private UserDetailsService userDetailsService;
+
+    @Autowired
+    private RedisUtil redisService;
+    @Autowired
+    private MiddleUserMapper userMapper;
+
+    @Override
+    public Map<String, ?> convertUserAuthentication(Authentication authentication) {
+        Map<String, Object> response = new LinkedHashMap();
+        response.put("username", authentication.getName());
+        if (authentication.getAuthorities() != null && !authentication.getAuthorities().isEmpty()) {
+            response.put("authorities", AuthorityUtils.authorityListToSet(authentication.getAuthorities()));
+        }
+        return response;
+    }
+
+    @Override
+    public Authentication extractAuthentication(Map<String, ?> map) {
+        if (map.containsKey("user_name")) {
+            String userName = (String) map.get("user_name");
+            Object principal;
+            Collection<? extends GrantedAuthority> authorities = this.getAuthorities(map);
+            AgentUserInfo user = userMapper.getByLoginName(userName);
+            if(Objects.isNull(user)){
+                log.error("当前用户不存在,应该退出登录");
+                return null;
+            }
+            String key = StrConstant.USER_INFO_PRE + userName ;
+            if (redisService.hasKey(key)) {
+                String str = redisService.getStr(key);
+                AgentUserInfo jwtUser = JSONObject.parseObject(str, AgentUserInfo.class);
+                principal = jwtUser;
+                authorities = jwtUser.getAuthorities();
+            } else {
+                AgentUserInfo jwtUser = new AgentUserInfo();
+                BeanUtil.copyProperties(user,jwtUser);
+                authorities = jwtUser.getAuthorities();
+                principal = jwtUser;
+                redisService.setStr(key, JSON.toJSONString(user));
+            }
+            return new UsernamePasswordAuthenticationToken(principal, "N/A", authorities);
+        } else {
+            return null;
+        }
+    }
+
+    /**
+     * 用户资源授权的方法重写  暂时未使用
+     *
+     * @param map
+     * @return
+     */
+    private Collection<? extends GrantedAuthority> getAuthorities(Map<String, ?> map) {
+        if (!map.containsKey("authorities")) {
+            return this.defaultAuthorities;
+        } else {
+            Object authorities = map.get("authorities");
+            if (authorities instanceof String) {
+                return AuthorityUtils.commaSeparatedStringToAuthorityList((String) authorities);
+            } else if (authorities instanceof Collection) {
+                return AuthorityUtils.commaSeparatedStringToAuthorityList(StringUtils.collectionToCommaDelimitedString((Collection) authorities));
+            } else {
+                throw new IllegalArgumentException("Authorities must be either a String or a Collection");
+            }
+        }
+    }
+}

+ 72 - 0
yt-middle/middle-platform/src/main/java/com/ytpm/middle/config/ResourceServerConfig.java

@@ -0,0 +1,72 @@
+package com.ytpm.middle.config;
+
+import com.ytpm.middle.handle.MiddleAuthenticationEntryPoint;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.data.redis.connection.RedisConnectionFactory;
+import org.springframework.security.config.annotation.web.builders.HttpSecurity;
+import org.springframework.security.oauth2.config.annotation.web.configuration.EnableResourceServer;
+import org.springframework.security.oauth2.config.annotation.web.configuration.ResourceServerConfigurerAdapter;
+import org.springframework.security.oauth2.config.annotation.web.configurers.ResourceServerSecurityConfigurer;
+import org.springframework.security.oauth2.provider.token.DefaultAccessTokenConverter;
+import org.springframework.security.oauth2.provider.token.RemoteTokenServices;
+import org.springframework.security.oauth2.provider.token.TokenStore;
+import org.springframework.security.oauth2.provider.token.store.redis.RedisTokenStore;
+
+
+@Configuration
+@EnableResourceServer
+public class ResourceServerConfig extends ResourceServerConfigurerAdapter {
+    @Value("${security.oauth2.client.client-id}")
+    private String clientId;
+
+    @Value("${security.oauth2.client.client-secret}")
+    private String secret;
+
+    @Value("${security.oauth2.authorization.check-token-access}")
+    private String checkTokenEndpointUrl;
+
+    @Autowired
+    private RedisConnectionFactory redisConnectionFactory;
+
+    @Autowired
+    private MiddleAuthenticationEntryPoint middleAuthenticationEntryPoint;
+
+    @Autowired
+    private CustomUserAuthenticationConverter userAuthenticationConverter;
+
+    @Bean
+    public TokenStore redisTokenStore() {
+        return new RedisTokenStore(redisConnectionFactory);
+    }
+
+    @Bean
+    public RemoteTokenServices tokenService() {
+        RemoteTokenServices tokenService = new RemoteTokenServices();
+        tokenService.setClientId(clientId);
+        tokenService.setClientSecret(secret);
+        tokenService.setCheckTokenEndpointUrl(checkTokenEndpointUrl);
+        DefaultAccessTokenConverter defaultAccessTokenConverter = new DefaultAccessTokenConverter();
+        defaultAccessTokenConverter.setUserTokenConverter(userAuthenticationConverter);
+        tokenService.setAccessTokenConverter(defaultAccessTokenConverter);
+        return tokenService;
+    }
+
+    @Override
+    public void configure(ResourceServerSecurityConfigurer resources) {
+        resources.authenticationEntryPoint(middleAuthenticationEntryPoint);
+        resources.resourceId(clientId);
+    }
+
+    @Override
+    public void configure(HttpSecurity http) throws Exception {
+        http.headers().frameOptions().disable()
+                .and()
+                .authorizeRequests().antMatchers("/attach/**","/api/public/**","/doc.html","/api/v2/**","/v2/api-docs", "/configuration/ui", "/swagger-resources", "/configuration/security",
+                        "/swagger-ui.html", "/webjars/**","/swagger-resources/configuration/ui","/swagger-ui.html").permitAll()
+                .anyRequest().authenticated();
+    }
+
+}

+ 40 - 0
yt-middle/middle-platform/src/main/java/com/ytpm/middle/config/swagger/SwaggerConfig.java

@@ -0,0 +1,40 @@
+package com.ytpm.middle.config.swagger;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import springfox.documentation.builders.ApiInfoBuilder;
+import springfox.documentation.builders.PathSelectors;
+import springfox.documentation.builders.RequestHandlerSelectors;
+import springfox.documentation.service.ApiInfo;
+import springfox.documentation.service.Contact;
+import springfox.documentation.spi.DocumentationType;
+import springfox.documentation.spring.web.plugins.Docket;
+import springfox.documentation.swagger2.annotations.EnableSwagger2;
+
+@Configuration
+@EnableSwagger2
+public class SwaggerConfig {
+    private static final String VERSION = "1.0.0";
+
+    @Bean
+    public Docket createApi(){
+        return new Docket(DocumentationType.SWAGGER_2)
+                .apiInfo(apiInfo())
+                .select()
+                .apis(RequestHandlerSelectors.basePackage("com.ytpm.middle.controller"))
+                .paths(PathSelectors.any())
+                .build();
+    }
+
+    private ApiInfo apiInfo() {
+        return new ApiInfoBuilder()
+                .title("")
+                .contact(new Contact("易推网络","http://www.sourcetreasure.com/index.html","marxjaw6466@163.com"))
+                .description("代理商管理系统")
+                .termsOfServiceUrl("https://juejin.cn/user/4310510864972254")
+                .license("The Apache License, Version 2.0")
+                .licenseUrl("http://www.apache.org/licenses/LICENSE-2.0.html")
+                .version(VERSION)
+                .build();
+    }
+}

+ 66 - 0
yt-middle/middle-platform/src/main/java/com/ytpm/middle/controller/AgentController.java

@@ -0,0 +1,66 @@
+package com.ytpm.middle.controller;
+
+import com.ytpm.agent.view.AgentUserInfo;
+import com.ytpm.general.Result;
+import com.ytpm.general.ResultTable;
+import com.ytpm.middle.param.AgentBaseInfoParam;
+import com.ytpm.middle.param.AgentForm;
+import com.ytpm.middle.service.AgentService;
+import com.ytpm.middle.view.AgentBaseInfoListVo;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.security.core.annotation.AuthenticationPrincipal;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+
+@Api(tags = "代理商管理")
+@RestController
+@RequestMapping("/agent")
+public class AgentController {
+
+    @Resource
+    private AgentService agentService;
+
+    /**
+     * 代理商基本信息列表
+     */
+    @ApiOperation("代理商基本信息列表")
+    @PostMapping("/baseInfoList")
+    public ResultTable<AgentBaseInfoListVo> getBaseInfoList(@RequestBody AgentBaseInfoParam param){
+        return agentService.getBaseInfoList(param);
+    }
+
+    /**
+     * 新增代理商
+     */
+    @ApiOperation("新增代理商")
+    @PostMapping("/addOne")
+    public Result<String> addOne(@RequestBody AgentForm form, @AuthenticationPrincipal AgentUserInfo userInfo){
+        form.setCreateUserId(userInfo.getUserId());
+        return agentService.addOne(form);
+    }
+
+    /**
+     * 修改代理商
+     */
+    @ApiOperation("新增代理商")
+    @PostMapping("/updateOne")
+    public Result<String> updateOne(@RequestBody AgentForm form, @AuthenticationPrincipal AgentUserInfo userInfo){
+        form.setUpdateParam(userInfo.getUserId());
+        return agentService.updateOne(form);
+    }
+
+    /**
+     * 启用或禁用
+     */
+    @ApiOperation("启用或禁用")
+    @PostMapping("/changeEnabled")
+    public Result<String> enabled(@RequestParam(name = "creditCode")String creditCode, @AuthenticationPrincipal AgentUserInfo userInfo){
+        return agentService.enabled(creditCode,userInfo.getUserId());
+    }
+}

+ 40 - 0
yt-middle/middle-platform/src/main/java/com/ytpm/middle/controller/MiddleController.java

@@ -0,0 +1,40 @@
+package com.ytpm.middle.controller;
+
+import com.github.pagehelper.PageInfo;
+import com.ytpm.agent.view.AgentDictView;
+import com.ytpm.agent.view.AgentUserInfo;
+import com.ytpm.general.Result;
+import com.ytpm.general.ResultTable;
+import com.ytpm.middle.dao.MiddleDictMapper;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.security.core.annotation.AuthenticationPrincipal;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+
+@Api(tags = "middle公用类")
+@RestController
+@RequestMapping("/middle")
+public class MiddleController {
+
+    @Resource
+    private MiddleDictMapper dictMapper;
+
+    @ApiOperation("获取当前登录的用户信息")
+    @GetMapping("/curUser")
+    public Result<AgentUserInfo> getCurUser(@AuthenticationPrincipal AgentUserInfo agentUserInfo) {
+        return Result.resultObjOk(agentUserInfo);
+    }
+
+    /**
+     * 查询字典数据列表
+     */
+    @ApiOperation(value = "查询字典数据列表")
+    @GetMapping("/dictList")
+    public ResultTable<AgentDictView> dictList(){
+        return ResultTable.resultTableOk(new PageInfo<AgentDictView>(dictMapper.selectDictList()));
+    }
+}

+ 23 - 0
yt-middle/middle-platform/src/main/java/com/ytpm/middle/dao/AgentMapper.java

@@ -0,0 +1,23 @@
+package com.ytpm.middle.dao;
+
+import com.ytpm.middle.model.YtMiddleEnterprise;
+import com.ytpm.middle.param.AgentBaseInfoParam;
+import com.ytpm.middle.view.AgentBaseInfoListVo;
+import com.ytpm.oauth.model.YtPlatformUser;
+import org.apache.ibatis.annotations.Param;
+import org.mapstruct.Mapper;
+
+import java.util.List;
+
+@Mapper
+public interface AgentMapper {
+    /**
+     * 渠道商基本信息列表
+     */
+    List<AgentBaseInfoListVo> getBaseInfoList(AgentBaseInfoParam param);
+
+    /**
+     *
+     */
+    void addOneUser(YtPlatformUser user);
+}

+ 23 - 0
yt-middle/middle-platform/src/main/java/com/ytpm/middle/dao/EnterpriseMapper.java

@@ -0,0 +1,23 @@
+package com.ytpm.middle.dao;
+
+import com.ytpm.middle.model.YtMiddleEnterprise;
+import org.apache.ibatis.annotations.Param;
+import org.mapstruct.Mapper;
+
+@Mapper
+public interface EnterpriseMapper {
+    /**
+     * 新增企业
+     */
+    int insertOne(YtMiddleEnterprise enterprise);
+
+    /**
+     * 企业信用代码查询企业
+     */
+    YtMiddleEnterprise getByCode(@Param("creditCode") String creditCode);
+
+    /**
+     * 修改企业
+     */
+    void updateById(YtMiddleEnterprise enterprise);
+}

+ 14 - 0
yt-middle/middle-platform/src/main/java/com/ytpm/middle/dao/MiddleDictMapper.java

@@ -0,0 +1,14 @@
+package com.ytpm.middle.dao;
+
+import com.ytpm.agent.view.AgentDictView;
+import org.mapstruct.Mapper;
+
+import java.util.List;
+
+@Mapper
+public interface MiddleDictMapper {
+    /**
+     * 查询字典表数据
+     */
+    List<AgentDictView> selectDictList();
+}

+ 10 - 0
yt-middle/middle-platform/src/main/java/com/ytpm/middle/dao/MiddleUserMapper.java

@@ -0,0 +1,10 @@
+package com.ytpm.middle.dao;
+
+import com.ytpm.agent.view.AgentUserInfo;
+import org.mapstruct.Mapper;
+
+@Mapper
+public interface MiddleUserMapper {
+
+    AgentUserInfo getByLoginName(String userName);
+}

+ 37 - 0
yt-middle/middle-platform/src/main/java/com/ytpm/middle/handle/MiddleAuthenticationEntryPoint.java

@@ -0,0 +1,37 @@
+package com.ytpm.middle.handle;
+
+import com.alibaba.fastjson.JSONObject;
+import com.ytpm.general.RepMessage;
+import com.ytpm.general.StatusCode;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.security.core.AuthenticationException;
+import org.springframework.security.oauth2.common.exceptions.InvalidTokenException;
+import org.springframework.security.web.AuthenticationEntryPoint;
+import org.springframework.stereotype.Component;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+
+@Component
+@Slf4j
+public class MiddleAuthenticationEntryPoint implements AuthenticationEntryPoint {
+    @Override
+    public void commence(HttpServletRequest request, HttpServletResponse response,
+                         AuthenticationException authException) {
+        Throwable cause = authException.getCause();
+        response.setHeader("Content-Type", "application/json;charset=UTF-8");
+        try {
+            JSONObject body = new JSONObject();
+            body.put("code", StatusCode.MANAGE_NOT_LOGIN);
+            body.put("message", RepMessage.TOKEN_EXPIRE);
+            if (!(cause instanceof InvalidTokenException)) {
+                body.put("code", StatusCode.MANAGE_NOT_LOGIN);
+                body.put("message", RepMessage.TOKEN_INVALID);
+            }
+            response.getWriter().write(body.toJSONString());
+        } catch (IOException e) {
+            log.error("token认证失败={}", e);
+        }
+    }
+}

+ 23 - 0
yt-middle/middle-platform/src/main/java/com/ytpm/middle/oss/OssAttach.java

@@ -0,0 +1,23 @@
+package com.ytpm.middle.oss;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * Oss 文件类
+ */
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class OssAttach {
+    /**
+     * 附件名称
+     */
+    private String name;
+
+    /**
+     * 附件路径
+     */
+    private String url;
+}

+ 54 - 0
yt-middle/middle-platform/src/main/java/com/ytpm/middle/oss/OssProperties.java

@@ -0,0 +1,54 @@
+package com.ytpm.middle.oss;
+
+import lombok.Data;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Component;
+
+/**
+ * oss配置类
+ */
+@Data
+@Component
+public class OssProperties {
+    /**
+     * 存储类的全称
+     */
+    @Value("${oss.name}")
+    private String name;
+
+    /**
+     * 存储的文件路径
+     */
+    @Value("${oss.path}")
+    private String path;
+
+    /**
+     * 存储文件的访问域
+     */
+    @Value("${oss.domain}")
+    private String domain;
+
+    /**
+     * 密钥
+     */
+    @Value("${oss.accessKey}")
+    private String accessKey;
+
+    /**
+     * 访问密钥
+     */
+    @Value("${oss.secretKey}")
+    private String secretKey;
+
+    /**
+     * 端点名
+     */
+    @Value("${oss.endpoint}")
+    private String endpoint;
+
+    /**
+     * 存储桶名
+     */
+    @Value("${oss.bucket}")
+    private String bucket;
+}

+ 76 - 0
yt-middle/middle-platform/src/main/java/com/ytpm/middle/oss/OssUtil.java

@@ -0,0 +1,76 @@
+package com.ytpm.middle.oss;
+
+import cn.hutool.core.util.StrUtil;
+import com.ytpm.handle.CustomerException;
+import lombok.extern.slf4j.Slf4j;
+
+import java.io.File;
+import java.io.InputStream;
+
+@Slf4j(topic = "oss-util")
+public final class OssUtil {
+    private static StorageTemplate getStorageTemplate(OssProperties ossProperties) {
+        return StorageFactory.createStorageTemplate(ossProperties);
+    }
+
+    /**
+     * 上传文件(本地文件上传)
+     *
+     * @param file          本地文件
+     * @param ossProperties 文件描述信息
+     * @return 生成的文件名
+     */
+    public static String upload(File file, OssProperties ossProperties) {
+        return getStorageTemplate(ossProperties).upload(file);
+    }
+
+    /**
+     * 删除文件
+     *
+     * @param filename
+     */
+    public static boolean deleteFile(String filename, OssProperties ossProperties) {
+        return getStorageTemplate(ossProperties).deleteFile(filename);
+    }
+
+    /**
+     * 转存文件(把原来的文件再重新上传存储一遍)
+     *
+     * @param filename      文件名
+     * @param ossProperties 文件描述
+     * @return 新生成文件名
+     */
+    public static OssAttach restore(String filename, OssProperties ossProperties) {
+        return getStorageTemplate(ossProperties).restore(filename);
+    }
+
+    /**
+     * 获取文件url
+     *
+     * @param ossName       存储的文件名
+     * @param ossProperties 文件描述
+     * @return 文件url
+     */
+    public static String getUrl(String ossName, OssProperties ossProperties) {
+        String url = getStorageTemplate(ossProperties).getUrl(ossName);
+        if (StrUtil.isBlank(url)) {
+            return null;
+        }
+        return url.replace(ossProperties.getEndpoint(), ossProperties.getDomain());
+    }
+
+    /**
+     * 获取文件流
+     *
+     * @param ossName
+     * @param ossProperties
+     * @return
+     */
+    public static InputStream getStream(String ossName, OssProperties ossProperties) {
+        try {
+            return getStorageTemplate(ossProperties).getStream(ossName);
+        } catch (Exception e) {
+            throw new CustomerException(e.getMessage());
+        }
+    }
+}

+ 14 - 0
yt-middle/middle-platform/src/main/java/com/ytpm/middle/oss/StorageFactory.java

@@ -0,0 +1,14 @@
+package com.ytpm.middle.oss;
+
+import cn.hutool.core.util.ReflectUtil;
+
+/**
+ * 存储工厂
+ */
+public class StorageFactory {
+    public static StorageTemplate createStorageTemplate(OssProperties ossProperties) {
+        StorageTemplate storageTemplate = ReflectUtil.newInstance(ossProperties.getName());
+        storageTemplate.init(ossProperties);
+        return storageTemplate;
+    }
+}

+ 57 - 0
yt-middle/middle-platform/src/main/java/com/ytpm/middle/oss/StorageTemplate.java

@@ -0,0 +1,57 @@
+package com.ytpm.middle.oss;
+
+
+import io.minio.errors.ErrorResponseException;
+import io.minio.errors.InsufficientDataException;
+import io.minio.errors.InternalException;
+import io.minio.errors.InvalidBucketNameException;
+import io.minio.errors.InvalidResponseException;
+import io.minio.errors.XmlParserException;
+
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+import java.security.InvalidKeyException;
+import java.security.NoSuchAlgorithmException;
+
+public interface StorageTemplate {
+    /**
+     * 初始化oss属性
+     *
+     * @param ossProperties oss属性
+     */
+    void init(OssProperties ossProperties);
+
+    /**
+     * 上传文件(本地文件上传)
+     *
+     * @param file 本地文件
+     * @return
+     */
+    String upload(File file);
+
+    /**
+     * 删除文件
+     *
+     * @param filename
+     */
+    boolean deleteFile(String filename);
+
+    /**
+     * 转存文件(把原来的文件再重新上传存储一遍)
+     *
+     * @param filename 文件名
+     * @return
+     */
+    OssAttach restore(String filename);
+
+    /**
+     * 获取文件url
+     *
+     * @param filename
+     * @return
+     */
+    String getUrl(String filename);
+
+    InputStream getStream(String filename) throws IOException, InvalidKeyException, InvalidResponseException, InsufficientDataException, NoSuchAlgorithmException, InternalException, XmlParserException, InvalidBucketNameException, ErrorResponseException, InvalidBucketNameException;
+}

+ 113 - 0
yt-middle/middle-platform/src/main/java/com/ytpm/middle/oss/minio/MinioStorageTemplate.java

@@ -0,0 +1,113 @@
+package com.ytpm.middle.oss.minio;
+
+
+import cn.hutool.core.date.DateUtil;
+import cn.hutool.core.io.FileUtil;
+import cn.hutool.core.io.file.FileNameUtil;
+import cn.hutool.core.util.IdUtil;
+import com.ytpm.handle.CustomerException;
+import com.ytpm.middle.oss.OssAttach;
+import com.ytpm.middle.oss.OssProperties;
+import com.ytpm.middle.oss.StorageTemplate;
+import io.minio.MinioClient;
+import io.minio.PutObjectOptions;
+import io.minio.errors.ErrorResponseException;
+import io.minio.errors.InsufficientDataException;
+import io.minio.errors.InternalException;
+import io.minio.errors.InvalidBucketNameException;
+import io.minio.errors.InvalidResponseException;
+import io.minio.errors.XmlParserException;
+
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+import java.security.InvalidKeyException;
+import java.security.NoSuchAlgorithmException;
+import java.util.Date;
+
+public class MinioStorageTemplate implements StorageTemplate {
+    private String bucket;
+
+    private MinioClient minioClient;
+
+    @Override
+    public void init(OssProperties ossProperties) {
+        try {
+
+            this.minioClient = new MinioClient(ossProperties.getEndpoint(), ossProperties.getAccessKey(), ossProperties.getSecretKey());
+            this.bucket = ossProperties.getBucket();
+            boolean isExists = minioClient.bucketExists(bucket);
+            if (!isExists) {
+                minioClient.makeBucket(bucket);
+                minioClient.setBucketPolicy(bucket,"public");
+            }
+        } catch (Exception e) {
+            throw new CustomerException(e.getMessage());
+        }
+    }
+
+    @Override
+    public String upload(File file) {
+        try {
+            String filename = getFileName(file);
+            PutObjectOptions options = new PutObjectOptions(FileUtil.size(file), PutObjectOptions.MIN_MULTIPART_SIZE);
+            minioClient.putObject(bucket, filename, FileUtil.getInputStream(file), options);
+            return filename;
+        } catch (Exception e) {
+            throw new CustomerException(e.getMessage());
+        }
+    }
+
+
+    @Override
+    public boolean deleteFile(String filename) {
+        try {
+            minioClient.removeObject(bucket, filename);
+        } catch (Exception e) {
+            throw new CustomerException(e.getMessage());
+        }
+        return true;
+    }
+
+    @Override
+    public OssAttach restore(String filename) {
+        String newFileName = getFileName(filename);
+        try {
+            minioClient.copyObject(bucket, newFileName, null, null, bucket, filename, null, null);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return new OssAttach(newFileName, getUrl(newFileName));
+    }
+
+    @Override
+    public String getUrl(String filename) {
+        String url;
+        try {
+            url = this.minioClient.getObjectUrl(bucket, filename);
+        } catch (Exception e) {
+            throw new CustomerException(e.getMessage());
+        }
+        return url;
+    }
+
+    @Override
+    public InputStream getStream(String filename) throws IOException, InvalidKeyException, InvalidResponseException,
+            InsufficientDataException, NoSuchAlgorithmException, InternalException, XmlParserException, InvalidBucketNameException, ErrorResponseException {
+        return minioClient.getObject(bucket, filename);
+    }
+
+    private String getFileName(File file) {
+        String ym = DateUtil.format(new Date(), "YYYYMM");
+        String filename = ym + "/" + ym + IdUtil.fastSimpleUUID() + "." + FileNameUtil.getSuffix(file);
+
+        return filename;
+    }
+
+    private String getFileName(String fileName) {
+        String ym = DateUtil.format(new Date(), "YYYYMM");
+        String filename = ym + "/" + ym + IdUtil.fastSimpleUUID() + "." + FileNameUtil.getSuffix(fileName);
+
+        return filename;
+    }
+}

+ 27 - 0
yt-middle/middle-platform/src/main/java/com/ytpm/middle/service/AgentService.java

@@ -0,0 +1,27 @@
+package com.ytpm.middle.service;
+
+import com.ytpm.general.Result;
+import com.ytpm.general.ResultTable;
+import com.ytpm.middle.param.AgentBaseInfoParam;
+import com.ytpm.middle.param.AgentForm;
+import com.ytpm.middle.view.AgentBaseInfoListVo;
+
+public interface AgentService {
+    /**
+     * 渠道商基本信息列表
+     */
+    ResultTable<AgentBaseInfoListVo> getBaseInfoList(AgentBaseInfoParam param);
+    /**
+     * 新增渠道商
+     */
+    Result<String> addOne(AgentForm form);
+
+    /**
+     * 修改代理商
+     */
+    Result<String> updateOne(AgentForm form);
+    /**
+     * 启用或禁用
+     */
+    Result<String> enabled(String creditCode, String userId);
+}

+ 126 - 0
yt-middle/middle-platform/src/main/java/com/ytpm/middle/service/impl/AgentServiceImpl.java

@@ -0,0 +1,126 @@
+package com.ytpm.middle.service.impl;
+
+import cn.hutool.core.bean.BeanUtil;
+import com.github.pagehelper.PageHelper;
+import com.github.pagehelper.PageInfo;
+import com.ytpm.general.RepMessage;
+import com.ytpm.general.Result;
+import com.ytpm.general.ResultTable;
+import com.ytpm.handle.CustomerException;
+import com.ytpm.middle.dao.AgentMapper;
+import com.ytpm.middle.dao.EnterpriseMapper;
+import com.ytpm.middle.model.YtMiddleEnterprise;
+import com.ytpm.middle.param.AgentBaseInfoParam;
+import com.ytpm.middle.param.AgentForm;
+import com.ytpm.middle.service.AgentService;
+import com.ytpm.middle.view.AgentBaseInfoListVo;
+import com.ytpm.oauth.model.YtPlatformUser;
+import com.ytpm.util.IDUtil;
+import com.ytpm.util.RandomPasswordGenerator;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import javax.annotation.Resource;
+import java.util.Date;
+import java.util.Objects;
+
+@Service
+@Slf4j(topic = "代理商业务")
+public class AgentServiceImpl implements AgentService {
+
+    @Resource
+    private AgentMapper agentMapper;
+    @Resource
+    private EnterpriseMapper enterpriseMapper;
+
+    /**
+     * 渠道商基本信息列表
+     */
+    @Override
+    public ResultTable<AgentBaseInfoListVo> getBaseInfoList(AgentBaseInfoParam param) {
+        PageHelper.startPage(param.getPage(), param.getLimit());
+        return ResultTable.resultTableOk(new PageInfo<AgentBaseInfoListVo>(agentMapper.getBaseInfoList(param)));
+    }
+
+    /**
+     * 新增渠道商
+     */
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public Result<String> addOne(AgentForm form) {
+        //根据企业信用代码查询公司是否已存在
+        YtMiddleEnterprise old = enterpriseMapper.getByCode(form.getCreditCode());
+        if(Objects.nonNull(old)) {
+            return Result.resultErr(RepMessage.OBJECT_ALREADY_EXIST);
+        }
+        String accountId = IDUtil.generateFlowID("yt_agent_");
+        generateLoginAccount(form,accountId);
+        addEnterprise(form,accountId);
+        return Result.resultOk(RepMessage.ADD_SUCCESS);
+    }
+
+    /**
+     * 修改代理商
+     */
+    @Override
+    public Result<String> updateOne(AgentForm form) {
+        YtMiddleEnterprise old = enterpriseMapper.getByCode(form.getCreditCode());
+        if(Objects.isNull(old)) {
+            return Result.resultOk(RepMessage.OBJECT_NOT_EXIST);
+        }
+        YtMiddleEnterprise enterprise = new YtMiddleEnterprise();
+        BeanUtil.copyProperties(form, enterprise);
+        enterpriseMapper.updateById(enterprise);
+        return Result.resultOk(RepMessage.MODIFY_SUCCESS);
+    }
+
+    /**
+     * 启用或禁用
+     */
+    @Override
+    public Result<String> enabled(String creditCode, String userId) {
+        YtMiddleEnterprise old = enterpriseMapper.getByCode(creditCode);
+        if(Objects.isNull(old)) {
+            return Result.resultOk(RepMessage.OBJECT_NOT_EXIST);
+        }
+        YtMiddleEnterprise enterprise = new YtMiddleEnterprise();
+        enterprise.setEnterpriseId(old.getEnterpriseId());
+        enterprise.setAvailable(old.getAvailable()==1?0:1);
+        enterprise.setUpdateParam(userId);
+        enterpriseMapper.updateById(enterprise);
+        return Result.resultOk(RepMessage.MODIFY_SUCCESS);
+    }
+
+    /**
+     * 企业信息新增操作
+     */
+    private void addEnterprise(AgentForm form, String accountId) {
+        YtMiddleEnterprise enterprise = new YtMiddleEnterprise();
+        BeanUtil.copyProperties(form, enterprise);
+        enterprise.setUserId(accountId);
+        enterprise.setCreateTime(new Date());
+        enterprise.setCreateUserId(form.getCreateUserId());
+        enterprise.setAvailable(1);
+        enterpriseMapper.insertOne(enterprise);
+    }
+
+    /**
+     * 生成登录账号
+     */
+    private void generateLoginAccount(AgentForm form, String accountId) {
+        //根据登录名生成登录账号
+        YtPlatformUser user = new YtPlatformUser();
+        user.setNickName(form.getEnterpriseName());
+        user.setLoginName(form.getLoginName());
+        String generatedPassword = RandomPasswordGenerator.generatePassword(8);
+        user.setEncryptPwd(new BCryptPasswordEncoder().encode(generatedPassword));
+        user.setPhone(form.getConcatPhone());
+        user.setLastLoginTime(new Date());
+        user.setUserType(form.getUserType());
+        user.setRegistryTime(new Date());
+        user.setUserId(accountId);
+        agentMapper.addOneUser(user);
+    }
+}

+ 267 - 0
yt-middle/middle-platform/src/main/java/com/ytpm/middle/util/RedisUtil.java

@@ -0,0 +1,267 @@
+package com.ytpm.middle.util;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.data.redis.core.StringRedisTemplate;
+import org.springframework.data.redis.core.ValueOperations;
+import org.springframework.data.redis.serializer.RedisSerializer;
+import org.springframework.data.redis.serializer.StringRedisSerializer;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.time.LocalDate;
+import java.time.format.DateTimeFormatter;
+import java.util.Calendar;
+import java.util.Set;
+import java.util.concurrent.TimeUnit;
+
+@Service
+public class RedisUtil {
+    @Autowired
+    StringRedisTemplate stringRedisTemplate;
+
+
+    @Resource(name = "stringRedisTemplate")
+    ValueOperations<String, String> valOpsStr;
+
+    @Autowired
+    RedisTemplate<Object, Object> redisTemplate;
+
+    @Autowired(required = false)
+    public void setRedisTemplate(RedisTemplate redisTemplate) {
+        //序列化key值,防止key值前面乱码
+        RedisSerializer stringSerializer = new StringRedisSerializer();
+        redisTemplate.setKeySerializer(stringSerializer);
+        redisTemplate.setHashKeySerializer(stringSerializer);
+        this.redisTemplate = redisTemplate;
+    }
+
+    @Resource(name = "redisTemplate")
+    ValueOperations<Object, Object> valOpsObj;
+
+    /**
+     * 根据指定key获取String
+     * @param key
+     * @return
+     */
+    public String getStr(String key){
+        return valOpsStr.get(key);
+    }
+
+    /**
+     * 设置Str缓存
+     * @param key
+     * @param val
+     */
+    public void setStr(String key, String val){
+        valOpsStr.set(key,val);
+    }
+
+    /**
+     * 设置Str缓存 timeOut单位  毫秒
+     * @param key
+     * @param val
+     */
+    public void setTimeOutStr(String key, String val ,long timeOut){
+        valOpsStr.set(key,val,timeOut, TimeUnit.MILLISECONDS);
+    }
+
+    /**
+     * 判断是否存在key
+     * @param key
+     * @return
+     */
+    public Boolean hasKey(String key) {
+        return redisTemplate.hasKey(key);
+    }
+
+    /**
+     * 设置Str缓存 timeOut单位  小时
+     * @param key
+     * @param val
+     * @param timeOut
+     */
+    public void setTimeOutHoursStr(String key, String val ,long timeOut){
+        valOpsStr.set(key,val,timeOut, TimeUnit.HOURS);
+    }
+
+    /**
+     * 设置Str缓存 timeOut单位  分钟
+     * @param key
+     * @param val
+     * @param timeOut
+     */
+    public void setTimeOutMinutesStr(String key, String val ,long timeOut){
+        valOpsStr.set(key,val,timeOut, TimeUnit.MINUTES);
+    }
+
+    /**
+     * 删除指定key
+     * @param key
+     */
+    public void del(String key){
+        stringRedisTemplate.delete(key);
+    }
+
+    /**
+     * 设置指定key值的超时时间
+     * @param key
+     */
+    public void expire(String key,long timeOut){
+        TimeUnit timeUnit=TimeUnit.MILLISECONDS;
+        stringRedisTemplate.expire(key,timeOut, timeUnit);
+    }
+
+    /**
+     * 根据前缀批量删除
+     * @param keysPrefix
+     */
+    public void delKeys(String keysPrefix){
+        Set<String> set = stringRedisTemplate.keys(keysPrefix);
+        stringRedisTemplate.delete(set);
+    }
+
+
+
+    /**
+     * 根据指定o获取Object
+     * @param o
+     * @return
+     */
+    public Object getObj(Object o){
+        return valOpsObj.get(o);
+    }
+
+    /**
+     * 设置obj缓存
+     * @param o1
+     * @param o2
+     */
+    public void setObj(Object o1, Object o2){
+        valOpsObj.set(o1, o2);
+    }
+    /**
+     * 设置obj缓存
+     * @param o1
+     * @param o2
+     */
+    public void setObj(Object o1, Object o2,long timeout){
+        valOpsObj.set(o1, o2,timeout);
+    }
+
+
+    /**
+     * 删除Obj缓存
+     * @param o
+     */
+    public void delObj(Object o){
+        redisTemplate.delete(o);
+    }
+
+
+    /**
+     * 自增1
+     * @param key
+     * @return
+     */
+    public long incr(String key){
+        long num = valOpsStr.increment(key,1);
+        return num;
+    }
+    /**
+     * 自增1
+     * @param key
+     * @return
+     */
+    public long incrByExp(String key,long timeout){
+        long num = valOpsStr.increment(key,1);
+        TimeUnit timeUnit=TimeUnit.MILLISECONDS;
+        stringRedisTemplate.expire(key,timeout, timeUnit);
+        return num;
+    }
+    /**
+     * 自增
+     * @param key
+     * @param delta  自增值
+     * @return
+     */
+    public long incrByExp(String key,int delta,long timeout){
+        long num = valOpsStr.increment(key,delta);
+        TimeUnit timeUnit=TimeUnit.MILLISECONDS;
+        stringRedisTemplate.expire(key,timeout, timeUnit);
+        return num;
+    }
+    /**
+     * 自增
+     * @param key
+     * @param delta  自增值
+     * @return
+     */
+    public long incr(String key,long delta){
+        return valOpsStr.increment(key,delta);
+    }
+
+    /**
+     * 获取应用用户ID
+     */
+    public synchronized String getAppUserId() {
+        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyMdd");
+        LocalDate currentDate = LocalDate.now();
+        LocalDate yesterday = currentDate.minusDays(1);
+        String todayKey = currentDate.format(formatter);
+        String yesterdayKey = yesterday.format(formatter);
+        if(this.hasKey(todayKey)){
+            this.incr(todayKey);
+            return this.getStr(todayKey);
+        }
+        this.del(yesterdayKey);
+        this.setStr(todayKey, todayKey+"0001");
+        return this.getStr(todayKey);
+    }
+
+    public Long getDitchId(){
+        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMdd");
+        LocalDate currentDate = LocalDate.now();
+        LocalDate yesterday = currentDate.minusDays(1);
+        String todayKey = currentDate.format(formatter);
+        String yesterdayKey = yesterday.format(formatter);
+        String prefix = "Ditch_";
+        if(this.hasKey(prefix+todayKey)){
+            this.incr(prefix+todayKey);
+            return Long.parseLong(this.getStr(prefix+todayKey));
+        }
+        this.del(yesterdayKey);
+        this.setStr(prefix+todayKey, todayKey+"01");
+        return Long.parseLong(this.getStr(prefix+todayKey));
+    }
+
+    /**
+     *
+     * 生成业务单编号
+     * @return
+     */
+    public String generateOrderNo(String key){
+        Calendar cl = Calendar.getInstance();
+        int year = cl.get(Calendar.YEAR);
+        int month = cl.get(Calendar.MONTH) + 1;
+        int day = cl.get(Calendar.DATE);
+        String orderNoPrefix = getTimeStr(year)+getTimeStr(month)+getTimeStr(day);
+        if(this.hasKey(key)){
+            String old = this.getStr(key);
+            String sub = old.substring(0,8);
+            if(sub.equals(orderNoPrefix)){
+                long incr = this.incr(key);
+                return String.valueOf(incr);
+            }
+        }
+        this.setStr(key,orderNoPrefix+"001");
+        return orderNoPrefix+"001";
+    }
+
+    private String getTimeStr(int num){
+        if(num>9) {
+            return String.valueOf(num);
+        }
+        return "0"+num;
+    }
+}

+ 36 - 0
yt-middle/middle-platform/src/main/resources/mapper/AgentMapper.xml

@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ytpm.middle.dao.AgentMapper">
+    <insert id="addOneUser">
+
+    </insert>
+
+    <select id="getBaseInfoList" resultType="com.ytpm.middle.view.AgentBaseInfoListVo">
+        select
+        me.enterprise_id,
+        me.user_id,
+        me.enterprise_name,
+        me.credit_code,
+        me.legal,
+        me.legal_card,
+        me.concat_phone,
+        me.business_licence,
+        me.registry_address,
+        me.create_time,
+        me.create_user_id,
+        me.update_time,
+        me.update_user_id,
+        me.available,
+        pu.login_name,
+        pu.user_type,
+        pu1.nick_name createUserName
+        from yt_middle_enterprise me
+        join yt_platform_user pu on me.user_id = pu.user_id
+        join yt_platform_user pu1 on me.create_user_id = pu1.user_id
+        <where>
+            <if test="enterpriseName != null and enterpriseName != ''">
+                and me.enterprise_name like concat('%',#{enterpriseName},'%')
+            </if>
+        </where>
+    </select>
+</mapper>

+ 78 - 0
yt-middle/middle-platform/src/main/resources/mapper/EnterpriseMapper.xml

@@ -0,0 +1,78 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ytpm.middle.dao.EnterpriseMapper">
+
+    <insert id="insertOne" useGeneratedKeys="true" keyProperty="enterpriseId">
+        insert into yt_middle_enterprise
+            (
+             user_id,
+             enterprise_name,
+             credit_code,
+             legal,
+             legal_card,
+             concat_phone,
+             business_licence,
+             registry_address,
+             create_time,
+             create_user_id,
+             available
+            )
+            values
+            (
+             #{userId},
+             #{enterpriseName},
+             #{creditCode},
+             #{legal},
+             #{legalCard},
+             #{concatPhone},
+             #{businessLicence},
+             #{registryAddress},
+             #{createTime},
+             #{createUserId},
+             #{available}
+            );
+    </insert>
+    <update id="updateById">
+        update yt_middle_enterprise
+        <set>
+            <if test="enterpriseName != null">
+                enterprise_name = #{enterpriseName},
+            </if>
+            <if test="creditCode != null">
+                credit_code = #{creditCode},
+            </if>
+            <if test="legal != null">
+                legal = #{legal},
+            </if>
+            <if test="legalCard != null">
+                legal_card = #{legalCard},
+            </if>
+            <if test="concatPhone != null">
+                concat_phone = #{concatPhone},
+            </if>
+            <if test="businessLicence != null">
+                business_licence = #{businessLicence},
+            </if>
+            <if test="registryAddress != null">
+                registry_address = #{registryAddress},
+            </if>
+            <if test="updateTime != null">
+                update_time = #{updateTime},
+            </if>
+            <if test="updateUserId != null">
+                update_user_id = #{updateUserId},
+            </if>
+            <if test="available != null">
+                available = #{available}
+            </if>
+        </set>
+        where enterprise_id = #{enterpriseId}
+    </update>
+
+    <select id="getByCode" resultType="com.ytpm.middle.model.YtMiddleEnterprise">
+        select
+            enterprise_id, user_id, enterprise_name, credit_code, legal, legal_card, concat_phone, business_licence, registry_address, create_time, create_user_id, update_time, update_user_id, available
+        from yt_middle_enterprise
+        where credit_code = #{creditCode}
+    </select>
+</mapper>

+ 10 - 0
yt-middle/middle-platform/src/main/resources/mapper/MiddleDictMapper.xml

@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ytpm.middle.dao.MiddleDictMapper">
+    <select id="selectDictList" resultType="com.ytpm.agent.view.AgentDictView">
+        select
+            dictionary_id, type_code, type_name, dictionary_code, dictionary_name, sort, enabled
+        from yt_platform_dict
+        where enabled = 1
+    </select>
+</mapper>

+ 11 - 0
yt-middle/middle-platform/src/main/resources/mapper/MiddleUserMapper.xml

@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ytpm.middle.dao.MiddleUserMapper">
+
+    <select id="getByLoginName" resultType="com.ytpm.agent.view.AgentUserInfo">
+        select
+            user_id, nick_name, head_image, login_name, encrypt_pwd, salt, phone, last_login_time, last_login_ip, phone_brand, phone_model, account_status, channel_id, user_type, login_days, total_income, app_id, registry_time, transfer_amount
+        from yt_platform_user
+        where login_name = #{userName}
+    </select>
+</mapper>

+ 87 - 0
yt-middle/pom.xml

@@ -0,0 +1,87 @@
+<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">
+    <modelVersion>4.0.0</modelVersion>
+    <parent>
+        <groupId>com.ytpm</groupId>
+        <artifactId>yt_platform</artifactId>
+        <version>1.0-SNAPSHOT</version>
+    </parent>
+
+    <artifactId>yt-middle</artifactId>
+    <packaging>pom</packaging>
+
+    <name>yt-middle</name>
+    <description>易推中台</description>
+    <modules>
+        <module>middle-platform</module>
+    </modules>
+
+    <properties>
+        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+    </properties>
+
+    <dependencies>
+        <dependency>
+            <groupId>com.ytpm</groupId>
+            <artifactId>yt-common</artifactId>
+            <version>1.0-SNAPSHOT</version>
+            <exclusions>
+                <exclusion>
+                    <artifactId>guava</artifactId>
+                    <groupId>com.google.guava</groupId>
+                </exclusion>
+                <exclusion>
+                    <artifactId>jsr305</artifactId>
+                    <groupId>com.google.code.findbugs</groupId>
+                </exclusion>
+            </exclusions>
+        </dependency>
+        <dependency>
+            <groupId>org.projectlombok</groupId>
+            <artifactId>lombok</artifactId>
+        </dependency>
+        <!-- nacos -->
+        <dependency>
+            <groupId>org.springframework.cloud</groupId>
+            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.cloud</groupId>
+            <artifactId>spring-cloud-alibaba-nacos-config</artifactId>
+        </dependency>
+
+        <!--Data Access-->
+        <dependency>
+            <groupId>mysql</groupId>
+            <artifactId>mysql-connector-java</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.baomidou</groupId>
+            <artifactId>mybatis-plus-boot-starter</artifactId>
+            <exclusions>
+                <exclusion>
+                    <artifactId>jsqlparser</artifactId>
+                    <groupId>com.github.jsqlparser</groupId>
+                </exclusion>
+            </exclusions>
+        </dependency>
+
+        <!-- web -->
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-web</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-log4j2</artifactId>
+        </dependency>
+        <!-- pagehelper -->
+        <dependency>
+            <groupId>com.github.pagehelper</groupId>
+            <artifactId>pagehelper-spring-boot-starter</artifactId>
+            <version>1.4.0</version>
+        </dependency>
+
+    </dependencies>
+</project>

+ 2 - 7
yt-oauth/oauth-service/src/main/java/com/ytpm/config/WebSecurityConfig.java

@@ -51,13 +51,8 @@ public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
     protected void configure(HttpSecurity http) throws Exception {
         http.csrf().disable()
                 .authorizeRequests()
-                .withObjectPostProcessor(new ObjectPostProcessor<FilterSecurityInterceptor>() {
-                    @Override
-                    public <O extends FilterSecurityInterceptor> O postProcess(O o) {
-                        return o;
-                    }
-                })
-                .antMatchers("/**").permitAll();
+                .antMatchers("/oauth/**").permitAll()
+                .and().httpBasic();
     }
 
     @Bean