Selaa lähdekoodia

feat:keycloa统一接口能力处理

wangbo 3 vuotta sitten
sitoutus
3df20da4f0
23 muutettua tiedostoa jossa 812 lisäystä ja 0 poistoa
  1. 35 0
      .gitignore
  2. 26 0
      pom.xml
  3. 42 0
      smsb-customer-manager-adapter/pom.xml
  4. 18 0
      smsb-customer-manager-adapter/src/main/java/com/inspur/customer/web/controller/GlobalControllerAdvice.java
  5. 64 0
      smsb-customer-manager-adapter/src/main/java/com/inspur/customer/web/controller/keyclaok/KeycloakController.java
  6. 44 0
      smsb-customer-manager-aop/pom.xml
  7. 52 0
      smsb-customer-manager-app/pom.xml
  8. 35 0
      smsb-customer-manager-app/src/main/java/com/inspur/customer/config/KeycloakConfiguration.java
  9. 27 0
      smsb-customer-manager-app/src/main/java/com/inspur/customer/config/RestTemplateConfig.java
  10. 68 0
      smsb-customer-manager-app/src/main/java/com/inspur/customer/service/keycloak/KeycloakServiceImpl.java
  11. 41 0
      smsb-customer-manager-app/src/main/java/com/inspur/customer/service/wechat/WeChatServiceImpl.java
  12. 40 0
      smsb-customer-manager-client/pom.xml
  13. 33 0
      smsb-customer-manager-client/src/main/java/com/inspur/customer/service/client/keycloak/KeycloakService.java
  14. 22 0
      smsb-customer-manager-client/src/main/java/com/inspur/customer/service/client/wechat/IWeChatService.java
  15. 12 0
      smsb-customer-manager-client/src/main/java/com/inspur/customer/service/constans/HttpUrlConstant.java
  16. 20 0
      smsb-customer-manager-client/src/main/java/com/inspur/customer/service/dto/SubscribeDto.java
  17. 31 0
      smsb-customer-manager-infrastructure/pom.xml
  18. 57 0
      smsb-customer-manager-start-web/pom.xml
  19. 19 0
      smsb-customer-manager-start-web/src/main/java/com/inspur/customer/SmsbCustomerWebApplication.java
  20. 22 0
      smsb-customer-manager-start-web/src/main/resources/bootstrap.yml
  21. 62 0
      smsb-customer-manager-start/pom.xml
  22. 21 0
      smsb-customer-manager-start/src/main/java/com/inspur/customer/SmsbCustomerApplication.java
  23. 21 0
      smsb-customer-manager-start/src/main/resources/bootstrap.yml

+ 35 - 0
.gitignore

@@ -0,0 +1,35 @@
+target/
+!.mvn/wrapper/maven-wrapper.jar
+
+### STS ###
+.apt_generated
+.classpath
+.factorypath
+.project
+.settings
+.springBeans
+.sts4-cache
+
+### IntelliJ IDEA ###
+.idea
+*.iws
+*.iml
+*.ipr
+
+### NetBeans ###
+nbproject/private/
+build/
+nbbuild/
+dist/
+nbdist/
+.nb-gradle/
+
+### 自动代码生成-ignore ###
+launcher-automatic-code
+
+### 日志文件 ###
+logs/
+*.log
+
+### 上传文件夹 ###
+upload/

+ 26 - 0
pom.xml

@@ -0,0 +1,26 @@
+<?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">
+    <modelVersion>4.0.0</modelVersion>
+
+    <parent>
+        <groupId>com.inspur</groupId>
+        <artifactId>smsb-cloud</artifactId>
+        <version>0.0.1-SNAPSHOT</version>
+    </parent>
+
+    <artifactId>smsb-customer-manager</artifactId>
+    <packaging>pom</packaging>
+
+    <modules>
+        <module>smsb-customer-manager-adapter</module>
+        <module>smsb-customer-manager-aop</module>
+        <module>smsb-customer-manager-app</module>
+        <module>smsb-customer-manager-client</module>
+        <module>smsb-customer-manager-infrastructure</module>
+        <module>smsb-customer-manager-start</module>
+        <module>smsb-customer-manager-start-web</module>
+    </modules>
+
+</project>

+ 42 - 0
smsb-customer-manager-adapter/pom.xml

@@ -0,0 +1,42 @@
+<?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>smsb-customer-manager</artifactId>
+        <groupId>com.inspur</groupId>
+        <version>0.0.1-SNAPSHOT</version>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+
+    <artifactId>smsb-customer-manager-adapter</artifactId>
+
+    <dependencies>
+        <dependency>
+            <groupId>com.inspur</groupId>
+            <artifactId>smsb-customer-manager-client</artifactId>
+            <version>0.0.1-SNAPSHOT</version>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-web</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.alibaba.cloud</groupId>
+            <artifactId>spring-cloud-starter-dubbo</artifactId>
+        </dependency>
+        <!--<dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-security</artifactId>
+        </dependency>-->
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-data-redis</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.projectlombok</groupId>
+            <artifactId>lombok</artifactId>
+        </dependency>
+    </dependencies>
+
+</project>

+ 18 - 0
smsb-customer-manager-adapter/src/main/java/com/inspur/customer/web/controller/GlobalControllerAdvice.java

@@ -0,0 +1,18 @@
+package com.inspur.logging.web.controller;
+
+import org.springframework.core.Ordered;
+import org.springframework.core.annotation.Order;
+import org.springframework.web.bind.WebDataBinder;
+import org.springframework.web.bind.annotation.ControllerAdvice;
+import org.springframework.web.bind.annotation.InitBinder;
+
+@ControllerAdvice
+@Order(Ordered.LOWEST_PRECEDENCE)
+public class GlobalControllerAdvice {
+
+    @InitBinder
+    public void setAllowedFields(WebDataBinder dataBinder) {
+        String[] binderStr = new String[]{"class.*", "Class.*", "class.*", ".Class.*"};
+        dataBinder.setDisallowedFields(binderStr);
+    }
+}

+ 64 - 0
smsb-customer-manager-adapter/src/main/java/com/inspur/customer/web/controller/keyclaok/KeycloakController.java

@@ -0,0 +1,64 @@
+package com.inspur.customer.web.controller.keyclaok;
+
+import com.alibaba.cola.dto.Response;
+import com.alibaba.cola.dto.SingleResponse;
+import com.alibaba.fastjson.JSONObject;
+import com.inspur.customer.service.client.keycloak.KeycloakService;
+import com.inspur.customer.service.client.wechat.IWeChatService;
+import com.inspur.customer.service.dto.SubscribeDto;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.dubbo.config.annotation.DubboReference;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.scheduling.annotation.EnableScheduling;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.web.bind.annotation.*;
+
+/**
+ * 微信模块
+ * @author wangbo13
+ */
+@Slf4j
+@RestController
+@EnableScheduling
+@RequestMapping("/keycloak")
+public class KeycloakController {
+
+    @Value("${system.appKey}")
+    private String appKey;
+
+    @DubboReference
+    private KeycloakService keycloakService;
+
+    @DubboReference
+    private IWeChatService iWeChatService;
+
+    @PostMapping("update/user")
+    public Response updateUser(@RequestBody String json){
+        SubscribeDto subscribe = JSONObject.parseObject(json, SubscribeDto.class);
+        if(StringUtils.isEmpty(subscribe.getUserId())){
+            return Response.buildFailure("404","userId不能为空!");
+        }
+        keycloakService.updateAttribute(subscribe.getUserId(), "wechat" , subscribe.getOppenId());
+        return Response.buildSuccess();
+    }
+
+    @GetMapping("query/ticket/{userId}")
+    public SingleResponse getTicket(@PathVariable("userId") String userId ,
+                                    @RequestHeader("Authorization") String authorization){
+        return SingleResponse.of(iWeChatService.queryTicket(appKey , userId, authorization));
+    }
+
+    @Scheduled(cron = "0/10 * * * * ?")
+    public void askUserOppenId(){
+        for(String userId : keycloakService.getUserMap().keySet()){
+            String oppenId = iWeChatService.askUser(userId);
+            if(!StringUtils.isEmpty(oppenId)){
+                SubscribeDto dto = new SubscribeDto();
+                dto.setUserId(userId);
+                dto.setOppenId(oppenId);
+                this.updateUser(JSONObject.toJSONString(dto));
+            }
+        }
+    }
+}

+ 44 - 0
smsb-customer-manager-aop/pom.xml

@@ -0,0 +1,44 @@
+<?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>smsb-customer-manager</artifactId>
+        <groupId>com.inspur</groupId>
+        <version>0.0.1-SNAPSHOT</version>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+
+    <artifactId>smsb-customer-manager-aop</artifactId>
+
+    <dependencies>
+        <dependency>
+            <groupId>com.inspur</groupId>
+            <artifactId>smsb-customer-manager-client</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-aop</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-json</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.projectlombok</groupId>
+            <artifactId>lombok</artifactId>
+            <scope>compile</scope>
+            <optional>true</optional>
+        </dependency>
+        <dependency>
+            <groupId>com.alibaba.cloud</groupId>
+            <artifactId>spring-cloud-starter-dubbo</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>jakarta.servlet</groupId>
+            <artifactId>jakarta.servlet-api</artifactId>
+        </dependency>
+    </dependencies>
+
+</project>

+ 52 - 0
smsb-customer-manager-app/pom.xml

@@ -0,0 +1,52 @@
+<?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>smsb-customer-manager</artifactId>
+        <groupId>com.inspur</groupId>
+        <version>0.0.1-SNAPSHOT</version>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+
+    <artifactId>smsb-customer-manager-app</artifactId>
+
+    <dependencies>
+        <dependency>
+            <groupId>com.inspur</groupId>
+            <artifactId>smsb-customer-manager-infrastructure</artifactId>
+            <version>0.0.1-SNAPSHOT</version>
+        </dependency>
+        <dependency>
+            <groupId>org.projectlombok</groupId>
+            <artifactId>lombok</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.alibaba.cloud</groupId>
+            <artifactId>spring-cloud-starter-dubbo</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.inspur</groupId>
+            <artifactId>smsb-customer-manager-client</artifactId>
+            <version>0.0.1-SNAPSHOT</version>
+            <scope>compile</scope>
+        </dependency>
+        <!--keycloak-->
+        <dependency>
+            <groupId>org.keycloak</groupId>
+            <artifactId>keycloak-admin-client</artifactId>
+            <version>18.0.0</version>
+        </dependency>
+        <!--HttpClient -->
+        <dependency>
+            <groupId>commons-httpclient</groupId>
+            <artifactId>commons-httpclient</artifactId>
+            <version>3.1</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.httpcomponents</groupId>
+            <artifactId>httpclient</artifactId>
+        </dependency>
+    </dependencies>
+
+</project>

+ 35 - 0
smsb-customer-manager-app/src/main/java/com/inspur/customer/config/KeycloakConfiguration.java

@@ -0,0 +1,35 @@
+package com.inspur.customer.config;
+
+import org.jboss.resteasy.client.jaxrs.ResteasyClientBuilder;
+import org.keycloak.OAuth2Constants;
+import org.keycloak.admin.client.Keycloak;
+import org.keycloak.admin.client.KeycloakBuilder;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+@Configuration
+public class KeycloakConfiguration {
+    @Value("${keycloak.auth-server-url}")
+    private String authServerUrl;
+    @Value("${keycloak.realm}")
+    private String realm;
+    @Value("${keycloak.resource}")
+    private String clientId;
+    @Value("${keycloak.credentials.secret}")
+    private String clientSecret;
+
+    @Bean
+    public Keycloak keycloakClient(){
+        return KeycloakBuilder.builder()
+            .serverUrl(authServerUrl)
+            .grantType(OAuth2Constants.CLIENT_CREDENTIALS)
+            .realm(realm)
+            .clientId(clientId)
+            .clientSecret(clientSecret)
+            .resteasyClient(
+                new ResteasyClientBuilder()
+                    .connectionPoolSize(10).build()
+            ).build();
+    }
+}

+ 27 - 0
smsb-customer-manager-app/src/main/java/com/inspur/customer/config/RestTemplateConfig.java

@@ -0,0 +1,27 @@
+package com.inspur.customer.config;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.http.client.ClientHttpRequestFactory;
+import org.springframework.http.client.SimpleClientHttpRequestFactory;
+import org.springframework.web.client.RestTemplate;
+
+/**
+ * restTemplate配置类
+ */
+@Configuration
+public class RestTemplateConfig {
+
+    @Bean
+    public RestTemplate restTemplate(ClientHttpRequestFactory factory){
+        return new RestTemplate(factory);
+    }
+
+    @Bean
+    public ClientHttpRequestFactory simpleClientHttpRequestFactory(){
+        SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory();
+        factory.setConnectTimeout(15000);
+        factory.setReadTimeout(5000);
+        return factory;
+    }
+}

+ 68 - 0
smsb-customer-manager-app/src/main/java/com/inspur/customer/service/keycloak/KeycloakServiceImpl.java

@@ -0,0 +1,68 @@
+package com.inspur.customer.service.keycloak;
+
+import com.inspur.customer.service.client.keycloak.KeycloakService;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.dubbo.config.annotation.DubboService;
+import org.keycloak.admin.client.Keycloak;
+import org.keycloak.admin.client.resource.UserResource;
+import org.keycloak.representations.idm.RoleRepresentation;
+import org.keycloak.representations.idm.UserRepresentation;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.cache.annotation.Cacheable;
+
+import javax.annotation.Resource;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.atomic.AtomicReference;
+
+@Slf4j
+@DubboService
+public class KeycloakServiceImpl implements KeycloakService {
+
+    @Resource
+    private Keycloak keycloak;
+
+    @Value("${keycloak.realm}")
+    private String realm;
+
+    @Override
+    @Cacheable(value = "smsb:userList")
+    public Map<String, String> getUserMap() {
+        Map<String, String> userMap = new HashMap<>();
+        keycloak.realm(realm).users().list().forEach(user ->{
+            if (user.getFirstName() != null && user.getLastName() != null && !"".equals(user.getLastName())) {
+                user.setUsername(user.getLastName() + user.getFirstName());
+            }
+            userMap.put(user.getId(),user.getUsername());
+        });
+        return userMap;
+    }
+
+    @Override
+    public Boolean checkUserRole(String userId, String role) {
+        AtomicReference<Boolean> result = new AtomicReference<>(false);
+        List<RoleRepresentation> roles = keycloak.realm(realm).users().get(userId).roles().getAll().getRealmMappings();
+        log.info("userId:{},roles:{}",userId , roles);
+        roles.forEach(n ->{
+            if(n.getName().equalsIgnoreCase(role)){
+                result.set(true);
+                return;
+            }
+        });
+        return result.get();
+    }
+
+    @Override
+    public void updateAttribute(String userId ,String property , String value) {
+        UserResource user = keycloak.realm(realm).users().get(userId);
+        UserRepresentation userRepresentation = user.toRepresentation();
+        if (userRepresentation.getAttributes() == null) {
+            userRepresentation.setAttributes(new HashMap<>());
+        }
+        userRepresentation.getAttributes().put(property, Collections.singletonList(value));
+        user.update(userRepresentation);
+    }
+
+}

+ 41 - 0
smsb-customer-manager-app/src/main/java/com/inspur/customer/service/wechat/WeChatServiceImpl.java

@@ -0,0 +1,41 @@
+package com.inspur.customer.service.wechat;
+
+import com.inspur.customer.service.client.wechat.IWeChatService;
+import com.inspur.customer.service.constans.HttpUrlConstant;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.dubbo.config.annotation.DubboService;
+import org.springframework.http.HttpEntity;
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.HttpMethod;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.client.RestTemplate;
+
+import javax.annotation.Resource;
+
+/**
+ * 发送微信
+ *
+ * @author wangbo
+ * @version 1.0
+ * @date 2022/3/9
+ */
+@Slf4j
+@DubboService(interfaceClass = IWeChatService.class)
+public class WeChatServiceImpl implements IWeChatService{
+    @Resource
+    private RestTemplate restTemplate;
+
+    @Override
+    public String queryTicket(String appKey ,String userId ,String authorization) {
+        String url = String.format(HttpUrlConstant.QUERY_TICKET,userId , appKey);
+        HttpHeaders header = new HttpHeaders();
+        header.add("Authorization",authorization);
+        ResponseEntity<String> response = restTemplate.exchange(url , HttpMethod.GET,new HttpEntity<String>(header),String.class);
+        log.info("获取二维码url: {}", url);
+        return response.getBody();
+    }
+    @Override
+    public String askUser(String userId) {
+        return restTemplate.getForObject(String.format(HttpUrlConstant.ASK_USER, userId), String.class);
+    }
+}

+ 40 - 0
smsb-customer-manager-client/pom.xml

@@ -0,0 +1,40 @@
+<?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>smsb-customer-manager</artifactId>
+        <groupId>com.inspur</groupId>
+        <version>0.0.1-SNAPSHOT</version>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+
+    <artifactId>smsb-customer-manager-client</artifactId>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.apache.commons</groupId>
+            <artifactId>commons-lang3</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.projectlombok</groupId>
+            <artifactId>lombok</artifactId>
+            <scope>compile</scope>
+            <optional>true</optional>
+        </dependency>
+        <!-- cola -->
+        <dependency>
+            <groupId>com.alibaba.cola</groupId>
+            <artifactId>cola-component-dto</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.fasterxml.jackson.core</groupId>
+            <artifactId>jackson-annotations</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework</groupId>
+            <artifactId>spring-context</artifactId>
+        </dependency>
+    </dependencies>
+
+</project>

+ 33 - 0
smsb-customer-manager-client/src/main/java/com/inspur/customer/service/client/keycloak/KeycloakService.java

@@ -0,0 +1,33 @@
+package com.inspur.customer.service.client.keycloak;
+import java.util.Map;
+
+/**
+ * keycloak接口能力适配
+ * @author wangbo13
+ */
+public interface KeycloakService {
+    /**
+     * 获取当前releam下用户Map<id,name>
+     *
+     * @return
+     */
+    Map<String, String> getUserMap();
+
+    /**
+     * 检查用户是否具备某角色权限
+     *
+     * @param userId
+     * @param role
+     * @return
+     */
+    Boolean checkUserRole(String userId,String role);
+
+    /**
+     * 更新用户attribute
+     *
+     * @param userId
+     * @param property
+     * @param value
+     */
+    void updateAttribute(String userId ,String property , String value);
+}

+ 22 - 0
smsb-customer-manager-client/src/main/java/com/inspur/customer/service/client/wechat/IWeChatService.java

@@ -0,0 +1,22 @@
+package com.inspur.customer.service.client.wechat;
+
+/**
+ * 微信接口处理
+ * @author wangbo13
+ */
+public interface IWeChatService {
+    /**
+     * 获取二维码信息
+     *
+     * @param url
+     * @param authorization
+     * @return
+     */
+    String queryTicket(String appKey , String url,String authorization);
+
+    /**
+     * 询问用户oppenid
+     */
+    String askUser(String userId);
+
+}

+ 12 - 0
smsb-customer-manager-client/src/main/java/com/inspur/customer/service/constans/HttpUrlConstant.java

@@ -0,0 +1,12 @@
+package com.inspur.customer.service.constans;
+
+/**
+ * url统一管理
+ * @author wangbo13
+ */
+public class HttpUrlConstant {
+
+    public static final String QUERY_TICKET = "https://msr.idms.top/prod-api/notice/ticket/%s/%s";
+
+    public static final String ASK_USER = "https://msr.idms.top/prod-api/notice/ask/%s";
+}

+ 20 - 0
smsb-customer-manager-client/src/main/java/com/inspur/customer/service/dto/SubscribeDto.java

@@ -0,0 +1,20 @@
+package com.inspur.customer.service.dto;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+@Data
+public class SubscribeDto implements Serializable {
+    private static final long serialVersionUID = -6178807949849564770L;
+    private String userId;
+
+    private String oppenId;
+
+    private String weChatName;
+
+    private String email;
+
+    private String telNumber;
+
+}

+ 31 - 0
smsb-customer-manager-infrastructure/pom.xml

@@ -0,0 +1,31 @@
+<?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>smsb-customer-manager</artifactId>
+        <groupId>com.inspur</groupId>
+        <version>0.0.1-SNAPSHOT</version>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+
+    <artifactId>smsb-customer-manager-infrastructure</artifactId>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.projectlombok</groupId>
+            <artifactId>lombok</artifactId>
+            <scope>compile</scope>
+            <optional>true</optional>
+        </dependency>
+        <dependency>
+            <groupId>com.baomidou</groupId>
+            <artifactId>mybatis-plus-boot-starter</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>mysql</groupId>
+            <artifactId>mysql-connector-java</artifactId>
+        </dependency>
+    </dependencies>
+
+</project>

+ 57 - 0
smsb-customer-manager-start-web/pom.xml

@@ -0,0 +1,57 @@
+<?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>smsb-customer-manager</artifactId>
+        <groupId>com.inspur</groupId>
+        <version>0.0.1-SNAPSHOT</version>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+
+    <artifactId>smsb-customer-manager-start-web</artifactId>
+
+    <dependencies>
+        <dependency>
+            <groupId>com.inspur</groupId>
+            <artifactId>smsb-customer-manager-adapter</artifactId>
+            <version>0.0.1-SNAPSHOT</version>
+        </dependency>
+        <!-- dubbo -->
+        <dependency>
+            <groupId>com.alibaba.cloud</groupId>
+            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.alibaba.cloud</groupId>
+            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.cloud</groupId>
+            <artifactId>spring-cloud-starter-bootstrap</artifactId>
+        </dependency>
+    </dependencies>
+
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-maven-plugin</artifactId>
+                <configuration>
+                    <layers>
+                        <enabled>true</enabled>
+                    </layers>
+                    <executable>true</executable>
+                </configuration>
+                <executions>
+                    <execution>
+                        <goals>
+                            <goal>repackage</goal>
+                        </goals>
+                    </execution>
+                </executions>
+            </plugin>
+        </plugins>
+    </build>
+
+</project>

+ 19 - 0
smsb-customer-manager-start-web/src/main/java/com/inspur/customer/SmsbCustomerWebApplication.java

@@ -0,0 +1,19 @@
+package com.inspur.customer;
+
+import org.apache.dubbo.config.spring.context.annotation.EnableDubbo;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+/**
+ * 用户管理模块启动类
+ *
+ * @author wangbo
+ */
+@EnableDubbo
+@SpringBootApplication
+public class SmsbCustomerWebApplication {
+
+    public static void main(String[] args) {
+        SpringApplication.run(SmsbCustomerWebApplication.class, args);
+    }
+}

+ 22 - 0
smsb-customer-manager-start-web/src/main/resources/bootstrap.yml

@@ -0,0 +1,22 @@
+spring:
+  profiles:
+    active: dev
+  main:
+    allow-bean-definition-overriding: true
+    allow-circular-references: true
+  application:
+    name: smsb-customer-manager-web
+  cloud:
+    nacos:
+      server-addr: 10.180.88.84:8060
+      username: nacos
+      password: inspur-nacos
+      config:
+        file-extension: yml
+        refresh-enabled: true
+        group: ${spring.application.name}
+        namespace: 1365e7bc-51b7-44fe-a902-7327e4c9ed4a
+      discovery:
+        namespace: 1365e7bc-51b7-44fe-a902-7327e4c9ed4a
+system:
+  appKey: 10.180.88.71

+ 62 - 0
smsb-customer-manager-start/pom.xml

@@ -0,0 +1,62 @@
+<?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>smsb-customer-manager</artifactId>
+        <groupId>com.inspur</groupId>
+        <version>0.0.1-SNAPSHOT</version>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+
+    <artifactId>smsb-customer-manager-start</artifactId>
+
+    <dependencies>
+        <dependency>
+            <groupId>com.inspur</groupId>
+            <artifactId>smsb-customer-manager-app</artifactId>
+            <version>0.0.1-SNAPSHOT</version>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-test</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <!-- dubbo -->
+        <dependency>
+            <groupId>com.alibaba.cloud</groupId>
+            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.alibaba.cloud</groupId>
+            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.cloud</groupId>
+            <artifactId>spring-cloud-starter-bootstrap</artifactId>
+        </dependency>
+    </dependencies>
+
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-maven-plugin</artifactId>
+                <configuration>
+                    <layers>
+                        <enabled>true</enabled>
+                    </layers>
+                    <executable>true</executable>
+                </configuration>
+                <executions>
+                    <execution>
+                        <goals>
+                            <goal>repackage</goal>
+                        </goals>
+                    </execution>
+                </executions>
+            </plugin>
+        </plugins>
+    </build>
+
+</project>

+ 21 - 0
smsb-customer-manager-start/src/main/java/com/inspur/customer/SmsbCustomerApplication.java

@@ -0,0 +1,21 @@
+package com.inspur.customer;
+
+import lombok.extern.slf4j.Slf4j;
+import org.apache.dubbo.config.spring.context.annotation.EnableDubbo;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.transaction.annotation.EnableTransactionManagement;
+
+/**
+ * 用户管理模块启动类
+ *
+ * @author wangbo
+ */
+@Slf4j
+@EnableDubbo
+@SpringBootApplication
+public class SmsbCustomerApplication {
+    public static void main(String[] args) {
+        SpringApplication.run(SmsbCustomerApplication.class, args);
+    }
+}

+ 21 - 0
smsb-customer-manager-start/src/main/resources/bootstrap.yml

@@ -0,0 +1,21 @@
+spring:
+  profiles:
+    active: dev
+  main:
+    web-application-type: none
+    allow-bean-definition-overriding: true
+    allow-circular-references: true
+  application:
+    name: smsb-customer-manager-service
+  cloud:
+    nacos:
+      server-addr: 10.180.88.84:8060
+      username: nacos
+      password: inspur-nacos
+      config:
+        file-extension: yml
+        refresh-enabled: true
+        group: ${spring.application.name}
+        namespace: 1365e7bc-51b7-44fe-a902-7327e4c9ed4a
+      discovery:
+        namespace: 1365e7bc-51b7-44fe-a902-7327e4c9ed4a