luoynagwei 9 hónapja
szülő
commit
97da66201d
26 módosított fájl, 126 hozzáadás és 156 törlés
  1. 0 0
      Makefile
  2. 45 0
      README.md
  3. 1 1
      api-location/src/main/java/com/sikey/wa04/api/location/service/LocationService.java
  4. 17 0
      api-message/src/main/java/com/sikey/wa04/api/message/MessageApplication.java
  5. 25 0
      api-message/src/main/java/com/sikey/wa04/api/message/scheduler/OfflineMessageLoadingScheduler.java
  6. 1 1
      api-user/src/main/java/com/sikey/wa04/api/user/client/rest/AlarmClockController.java
  7. 1 1
      api-user/src/main/java/com/sikey/wa04/api/user/client/rest/ChildController.java
  8. 1 1
      api-user/src/main/java/com/sikey/wa04/api/user/client/rest/ContactController.java
  9. 1 1
      api-user/src/main/java/com/sikey/wa04/api/user/client/rest/DeviceController.java
  10. 1 1
      api-user/src/main/java/com/sikey/wa04/api/user/client/rest/FileController.java
  11. 1 1
      api-user/src/main/java/com/sikey/wa04/api/user/client/rest/SchoolDisableController.java
  12. 1 1
      api-user/src/main/java/com/sikey/wa04/api/user/client/rest/UserController.java
  13. 2 2
      api-user/src/main/java/com/sikey/wa04/api/user/client/wristwatch/AlarmClockWristwatchController.java
  14. 2 2
      api-user/src/main/java/com/sikey/wa04/api/user/client/wristwatch/ContactWristwatchController.java
  15. 1 1
      api-user/src/main/java/com/sikey/wa04/api/user/client/wristwatch/DeviceWristwatchController.java
  16. 1 1
      api-user/src/main/java/com/sikey/wa04/api/user/client/wristwatch/FriendController.java
  17. 2 2
      api-user/src/main/java/com/sikey/wa04/api/user/client/wristwatch/SchoolDisableWristwatchController.java
  18. 0 1
      api-websocket/src/main/java/com/sikey/wa04/api/websocket/scheduler/KeepItAliveScheduler.java
  19. 0 30
      business-application/src/main/java/com/sikey/wa04/business/application/usecase/HeartbeatUsecase.java
  20. 0 26
      business-application/src/main/java/com/sikey/wa04/business/application/usecase/OfflineMessageLoadingUsecase.java
  21. 0 81
      business-application/src/main/java/com/sikey/wa04/business/application/usecase/WebSocketConnectionUsecase.java
  22. 17 1
      business-common/src/main/java/com/sikey/wa04/common/enums/MessageStatus.java
  23. 1 0
      business-infrastructure/src/main/java/com/sikey/wa04/business/infrastructure/adapter/RedisConnectionStateManager.java
  24. 4 0
      business-infrastructure/src/main/java/com/sikey/wa04/business/infrastructure/adapter/RedisMessagingQueueManager.java
  25. 1 1
      business-infrastructure/src/main/java/com/sikey/wa04/business/infrastructure/adapter/amap/RequestParametersBuilder.java
  26. BIN
      img.png

+ 0 - 0
Makefile


+ 45 - 0
README.md

@@ -0,0 +1,45 @@
+# WA04
+
+该项目架构从 COLA 5 的基础上进行了修改,主要修改了以下几个地方:
+
+- 项目布局发生了变化,不再是一个单一的项目,而是一个多模块的项目,每个模块都是一个独立的项目,可以单独运行,也可以作为一个模块被其他模块引用。
+- 项目的依赖管理发生了变化,使用 Gradle 进行依赖管理。
+- 没有使用 COLA 的组件库,我们自己构建了适合的组件库
+
+## 结构变化
+
+### Infrastructure
+
+基础实施层(Infrastructure Layer)
+
+1. Configuration: Springboot 的配置。
+2. DTO: 系统的传输对象,包含请求、响应还有数据库的Model。
+3. Adapter: 整个系统的对外的处理逻辑,里面有具体的技术细节,追求简化和剥离业务逻辑,要求跟逻辑区分。
+4. Repository 数据仓库,写 Mysql 数据的 Mapper,在 Mybatis 里叫 Mapper,在JPA里叫 Repository。
+
+### Api
+
+接口层(Api Layer),负责提供和接受外部的请求比如 Restful,RabbitMQ Messaging
+
+1. api-websocket: 负责 Websocket 长链接的会话保持,处理简单的消息下行。
+2. api-user: 系统的认证和授权,还有用户相关的API提供,比如小孩相关、设备相关的信息CURD的接口。 api-user 拥有整个系统大部分的逻辑。
+3. api-message: 提供消息上行接口和拉取消息接口,消息从客户端HTTP接口产生后在 api-message 里RabbitMQ发送至消息队列。
+4. api-location: 系统定位服务处理定位相关业务逻辑,如电子围栏、IOT 定位。同时也拥有产生定位消息的能力。
+
+## 架构图
+
+![img.png](img.png)
+
+## 路径上下文
+
+![img2.png](http://doc.sikey.com.cn/raiz5jee8eiph0eeFooV/api/v1/projects/4986187/resources/471078/image-preview)
+
+## 启动项目
+
+> TODO
+
+## Reference
+
+- [接口文档](http://doc.sikey.com.cn)
+- [前端项目](#)
+

+ 1 - 1
api-location/src/main/java/com/sikey/wa04/api/location/service/LocationService.java

@@ -5,7 +5,7 @@ import com.fasterxml.jackson.databind.ObjectMapper;
 import com.sikey.wa04.api.location.adapter.excutor.request.IotRequest;
 import com.sikey.wa04.api.location.adapter.excutor.response.AmapResponse;
 import com.sikey.wa04.api.location.adapter.excutor.response.IotResponse;
-import com.sikey.wa04.business.application.usecase.RequestParametersBuilder;
+import com.sikey.wa04.business.infrastructure.adapter.amap.RequestParametersBuilder;
 import com.sikey.wa04.business.domain.entity.Location;
 import com.sikey.wa04.business.infrastructure.configuration.AmapConfig;
 import com.sikey.wa04.common.enums.LocationType;

+ 17 - 0
api-message/src/main/java/com/sikey/wa04/api/message/MessageApplication.java

@@ -0,0 +1,17 @@
+package com.sikey.wa04.api.message;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
+import org.springframework.cloud.context.config.annotation.RefreshScope;
+import org.springframework.scheduling.annotation.EnableScheduling;
+
+@EnableScheduling
+@EnableDiscoveryClient
+@RefreshScope
+@SpringBootApplication(scanBasePackages = {"com.sikey.wa04"})
+public class MessageApplication {
+    public static void main(String[] args) {
+        SpringApplication.run(MessageApplication.class, args);
+    }
+}

+ 25 - 0
api-message/src/main/java/com/sikey/wa04/api/message/scheduler/OfflineMessageLoadingScheduler.java

@@ -0,0 +1,25 @@
+package com.sikey.wa04.api.message.scheduler;
+
+import com.sikey.wa04.business.infrastructure.adapter.RedisConnectionStateManager;
+import jakarta.annotation.Resource;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.stereotype.Component;
+
+/**
+ * 离线消息加载调度器
+ *
+ * @author luoyangwei
+ */
+@Slf4j
+@Component
+public class OfflineMessageLoadingScheduler {
+
+    @Resource
+    private RedisConnectionStateManager redisConnectionStateManager;
+
+    @Scheduled(cron = "0/3 * * * * ?")
+    public void run() {
+    }
+
+}

+ 1 - 1
api-user/src/main/java/com/sikey/wa04/api/user/adapter/rest/AlarmClockController.java → api-user/src/main/java/com/sikey/wa04/api/user/client/rest/AlarmClockController.java

@@ -1,4 +1,4 @@
-package com.sikey.wa04.api.user.adapter.rest;
+package com.sikey.wa04.api.user.client.rest;
 
 import com.sikey.wa04.business.application.service.AlarmClockService;
 import com.sikey.wa04.business.infrastructure.configuration.ProjectContextConstant;

+ 1 - 1
api-user/src/main/java/com/sikey/wa04/api/user/adapter/rest/ChildController.java → api-user/src/main/java/com/sikey/wa04/api/user/client/rest/ChildController.java

@@ -1,4 +1,4 @@
-package com.sikey.wa04.api.user.adapter.rest;
+package com.sikey.wa04.api.user.client.rest;
 
 import com.sikey.wa04.business.application.service.ChildService;
 import com.sikey.wa04.business.infrastructure.configuration.ProjectContextConstant;

+ 1 - 1
api-user/src/main/java/com/sikey/wa04/api/user/adapter/rest/ContactController.java → api-user/src/main/java/com/sikey/wa04/api/user/client/rest/ContactController.java

@@ -1,4 +1,4 @@
-package com.sikey.wa04.api.user.adapter.rest;
+package com.sikey.wa04.api.user.client.rest;
 
 import com.sikey.wa04.business.application.service.ContactsService;
 import com.sikey.wa04.business.infrastructure.configuration.ProjectContextConstant;

+ 1 - 1
api-user/src/main/java/com/sikey/wa04/api/user/adapter/rest/DeviceController.java → api-user/src/main/java/com/sikey/wa04/api/user/client/rest/DeviceController.java

@@ -1,4 +1,4 @@
-package com.sikey.wa04.api.user.adapter.rest;
+package com.sikey.wa04.api.user.client.rest;
 
 import com.sikey.wa04.business.application.service.DeviceService;
 import com.sikey.wa04.business.infrastructure.configuration.ProjectContextConstant;

+ 1 - 1
api-user/src/main/java/com/sikey/wa04/api/user/adapter/rest/FileController.java → api-user/src/main/java/com/sikey/wa04/api/user/client/rest/FileController.java

@@ -1,4 +1,4 @@
-package com.sikey.wa04.api.user.adapter.rest;
+package com.sikey.wa04.api.user.client.rest;
 
 import com.sikey.wa04.business.application.service.AliyunOssService;
 import com.sikey.wa04.business.infrastructure.configuration.ProjectContextConstant;

+ 1 - 1
api-user/src/main/java/com/sikey/wa04/api/user/adapter/rest/SchoolDisableController.java → api-user/src/main/java/com/sikey/wa04/api/user/client/rest/SchoolDisableController.java

@@ -1,4 +1,4 @@
-package com.sikey.wa04.api.user.adapter.rest;
+package com.sikey.wa04.api.user.client.rest;
 
 import com.sikey.wa04.business.application.service.SchoolDisableService;
 import com.sikey.wa04.business.infrastructure.configuration.ProjectContextConstant;

+ 1 - 1
api-user/src/main/java/com/sikey/wa04/api/user/adapter/rest/UserController.java → api-user/src/main/java/com/sikey/wa04/api/user/client/rest/UserController.java

@@ -1,4 +1,4 @@
-package com.sikey.wa04.api.user.adapter.rest;
+package com.sikey.wa04.api.user.client.rest;
 
 import com.sikey.wa04.business.application.service.AuthenticateService;
 import com.sikey.wa04.business.application.service.UcloudService;

+ 2 - 2
api-user/src/main/java/com/sikey/wa04/api/user/adapter/wristwatch/AlarmClockWristwatchController.java → api-user/src/main/java/com/sikey/wa04/api/user/client/wristwatch/AlarmClockWristwatchController.java

@@ -1,4 +1,4 @@
-package com.sikey.wa04.api.user.adapter.wristwatch;
+package com.sikey.wa04.api.user.client.wristwatch;
 
 import com.sikey.wa04.business.application.service.AlarmClockService;
 import com.sikey.wa04.business.infrastructure.configuration.ProjectContextConstant;
@@ -28,7 +28,7 @@ public class AlarmClockWristwatchController {
      * 手表设备查询闹钟
      *
      * @return 响应内容一致
-     * @see com.sikey.wa04.api.user.adapter.rest.AlarmClockController
+     * @see com.sikey.wa04.api.user.client.rest.AlarmClockController
      */
     @Authenticated
     @GetMapping("/getall")

+ 2 - 2
api-user/src/main/java/com/sikey/wa04/api/user/adapter/wristwatch/ContactWristwatchController.java → api-user/src/main/java/com/sikey/wa04/api/user/client/wristwatch/ContactWristwatchController.java

@@ -1,4 +1,4 @@
-package com.sikey.wa04.api.user.adapter.wristwatch;
+package com.sikey.wa04.api.user.client.wristwatch;
 
 import com.sikey.wa04.business.application.service.ContactsService;
 import com.sikey.wa04.business.infrastructure.configuration.ProjectContextConstant;
@@ -29,7 +29,7 @@ public class ContactWristwatchController {
      * 手表获取联系人
      *
      * @return ResponseEntity<GetContactResponse>
-     * @see com.sikey.wa04.api.user.adapter.rest.ContactController#get(GetContactRequest)
+     * @see com.sikey.wa04.api.user.client.rest.ContactController#get(GetContactRequest)
      */
     @Authenticated
     @GetMapping("/get")

+ 1 - 1
api-user/src/main/java/com/sikey/wa04/api/user/adapter/wristwatch/DeviceWristwatchController.java → api-user/src/main/java/com/sikey/wa04/api/user/client/wristwatch/DeviceWristwatchController.java

@@ -1,4 +1,4 @@
-package com.sikey.wa04.api.user.adapter.wristwatch;
+package com.sikey.wa04.api.user.client.wristwatch;
 
 import com.sikey.wa04.business.application.service.DeviceService;
 import com.sikey.wa04.business.infrastructure.configuration.ProjectContextConstant;

+ 1 - 1
api-user/src/main/java/com/sikey/wa04/api/user/adapter/wristwatch/FriendController.java → api-user/src/main/java/com/sikey/wa04/api/user/client/wristwatch/FriendController.java

@@ -1,4 +1,4 @@
-package com.sikey.wa04.api.user.adapter.wristwatch;
+package com.sikey.wa04.api.user.client.wristwatch;
 
 import com.sikey.wa04.business.application.service.FriendService;
 import com.sikey.wa04.business.infrastructure.configuration.ProjectContextConstant;

+ 2 - 2
api-user/src/main/java/com/sikey/wa04/api/user/adapter/wristwatch/SchoolDisableWristwatchController.java → api-user/src/main/java/com/sikey/wa04/api/user/client/wristwatch/SchoolDisableWristwatchController.java

@@ -1,4 +1,4 @@
-package com.sikey.wa04.api.user.adapter.wristwatch;
+package com.sikey.wa04.api.user.client.wristwatch;
 
 import com.sikey.wa04.business.application.service.SchoolDisableService;
 import com.sikey.wa04.business.infrastructure.configuration.ProjectContextConstant;
@@ -28,7 +28,7 @@ public class SchoolDisableWristwatchController {
      * 手表获取上课禁用
      *
      * @return ResponseEntity<GetallSchoolDisableResponse>
-     * @see com.sikey.wa04.api.user.adapter.rest.SchoolDisableController#getall(GetallSchoolDisableRequest)
+     * @see com.sikey.wa04.api.user.client.rest.SchoolDisableController#getall(GetallSchoolDisableRequest)
      */
     @Authenticated
     @GetMapping("/getall")

+ 0 - 1
api-websocket/src/main/java/com/sikey/wa04/api/websocket/scheduler/KeepItAliveScheduler.java

@@ -13,7 +13,6 @@ public class KeepItAliveScheduler {
     @Resource
     private ConnectionManagerService connectionManagerService;
 
-
     /**
      * 检查Session上次活跃时间 <b>10秒检查一次</b>
      */

+ 0 - 30
business-application/src/main/java/com/sikey/wa04/business/application/usecase/HeartbeatUsecase.java

@@ -1,30 +0,0 @@
-package com.sikey.wa04.business.application.usecase;
-
-import lombok.extern.slf4j.Slf4j;
-import org.springframework.stereotype.Component;
-
-@Slf4j
-@Component
-public class HeartbeatUsecase {
-//
-//    /**
-//     * 处理原生的Pong心跳消息
-//     *
-//     * @param session 来心跳的会话
-//     * @param message {@link  PongMessage pong}
-//     * @throws Exception 异常
-//     */
-//    public void handlePongMessage(WebSocketSession session, PongMessage message) throws Exception {
-//        session.sendMessage(new PingMessage());
-//    }
-//
-//    /**
-//     * 处理自定义的心跳消息
-//     *
-//     * @param session 来心跳的会话
-//     * @param message {@link  TextMessage pong}
-//     * @throws Exception 异常
-//     */
-//    public void handleCustomizedMessage(WebSocketSession session, TextMessage message) throws Exception {
-//    }
-}

+ 0 - 26
business-application/src/main/java/com/sikey/wa04/business/application/usecase/OfflineMessageLoadingUsecase.java

@@ -1,26 +0,0 @@
-package com.sikey.wa04.business.application.usecase;
-
-import com.sikey.wa04.business.domain.entity.Session;
-import lombok.extern.slf4j.Slf4j;
-import org.springframework.stereotype.Component;
-
-import java.util.List;
-
-/**
- * 加载离线消息
- *
- * @author luoyangwei
- */
-@Slf4j
-@Component
-public class OfflineMessageLoadingUsecase {
-
-    /**
-     * 加载消息<br/>
-     * 消息发送值 {@link Session session}
-     *
-     * @param session Session
-     */
-    public void loadMessage(Session session) {
-    }
-}

+ 0 - 81
business-application/src/main/java/com/sikey/wa04/business/application/usecase/WebSocketConnectionUsecase.java

@@ -1,81 +0,0 @@
-package com.sikey.wa04.business.application.usecase;
-
-import cn.hutool.core.util.CharsetUtil;
-import cn.hutool.core.util.StrUtil;
-import cn.hutool.http.HttpUtil;
-import com.sikey.wa04.business.domain.entity.Session;
-import com.sikey.wa04.common.exception.BusinessException;
-import lombok.extern.slf4j.Slf4j;
-import org.springframework.http.HttpStatus;
-import org.springframework.stereotype.Component;
-
-import java.time.LocalDateTime;
-import java.util.Map;
-import java.util.Objects;
-import java.util.Optional;
-import java.util.concurrent.ConcurrentHashMap;
-import java.util.concurrent.ConcurrentMap;
-
-/**
- * 连接 Usecase
- *
- * @author luoyangwei
- */
-@Slf4j
-@Component
-public class WebSocketConnectionUsecase {
-//    private static final ConcurrentMap<String, Session> SESSIONS = new ConcurrentHashMap<>();
-//
-//    /**
-//     * 默认语言
-//     */
-//    private static final String DEFAULT_LANGUAGE = "zh";
-//
-//    /**
-//     * 创建会话
-//     *
-//     * @param webSocketSession WebSocketSession
-//     * @return Session
-//     */
-//    private Session createSession(WebSocketSession webSocketSession) {
-//        Objects.requireNonNull(webSocketSession.getUri());
-//        Map<String, String> request = HttpUtil.decodeParamMap(webSocketSession.getUri().getQuery(), CharsetUtil.CHARSET_UTF_8);
-//
-//        String id = request.get("id");
-//        String lang = request.get("lang");
-//
-//        if (StrUtil.isBlank(id)) {
-//            throw new BusinessException(HttpStatus.INTERNAL_SERVER_ERROR.value(), "ID_REQUIRED", "id is required");
-//        }
-//
-//        if (StrUtil.isBlank(lang)) {
-//            lang = DEFAULT_LANGUAGE;
-//        }
-//
-//        return Optional.
-//                ofNullable(SESSIONS.get(id)).
-//                orElse(new Session(id, lang, webSocketSession, LocalDateTime.now()));
-//    }
-//
-//    /**
-//     * 连接建立
-//     *
-//     * @param webSocketSession WebSocketSession
-//     * @return Session
-//     * @throws Exception Exception
-//     */
-//    public Session established(WebSocketSession webSocketSession) throws Exception {
-//        Session session = createSession(webSocketSession);
-//        SESSIONS.put(session.getId(), session);
-//        return session;
-//    }
-//
-//    /**
-//     * 连接建立
-//     *
-//     * @param webSocketSession WebSocketSession
-//     * @throws Exception Exception
-//     */
-//    public void closed(WebSocketSession webSocketSession, CloseStatus closeStatus) throws Exception {
-//    }
-}

+ 17 - 1
business-common/src/main/java/com/sikey/wa04/common/enums/MessageStatus.java

@@ -6,9 +6,25 @@ import lombok.Getter;
 @AllArgsConstructor
 @Getter
 public enum MessageStatus {
+
+    /**
+     * 未读 (初始状态)
+     */
     UNREAD(0),
-//    WAIT_ACK(9),
+
+    /**
+     * 离线队列
+     */
+    OFFLINE_QUEUE(3),
+
+    /**
+     * ACK
+     */
     ACK(9),
+
+    /**
+     * 已读
+     */
     READ(10);
 
     private final Integer value;

+ 1 - 0
business-infrastructure/src/main/java/com/sikey/wa04/business/infrastructure/adapter/RedisConnectionStateManager.java

@@ -9,6 +9,7 @@ import org.springframework.data.redis.core.RedisOperations;
 import org.springframework.stereotype.Component;
 
 import java.time.Duration;
+import java.util.List;
 import java.util.Objects;
 
 /**

+ 4 - 0
business-infrastructure/src/main/java/com/sikey/wa04/business/infrastructure/adapter/RedisMessagingQueueManager.java

@@ -0,0 +1,4 @@
+package com.sikey.wa04.business.infrastructure.adapter;
+
+public class RedisMessagingQueueManager {
+}

+ 1 - 1
business-application/src/main/java/com/sikey/wa04/business/application/usecase/RequestParametersBuilder.java → business-infrastructure/src/main/java/com/sikey/wa04/business/infrastructure/adapter/amap/RequestParametersBuilder.java

@@ -1,4 +1,4 @@
-package com.sikey.wa04.business.application.usecase;
+package com.sikey.wa04.business.infrastructure.adapter.amap;
 
 import java.util.ArrayList;
 import java.util.List;

BIN
img.png