Ver Fonte

store-api 中添加一个 StoreInfo 对象, 并在 StoreService 中添加一个 getStoreInfo 方法, 每次查看 StoreNode 的详细信息时直接调用 RPC 服务中的 getStoreInfo 方法

reghao há 2 anos atrás
pai
commit
84b92632fe

+ 5 - 4
oss-console/src/main/java/cn/reghao/oss/console/app/controller/page/StoreNodePageController.java

@@ -1,6 +1,7 @@
 package cn.reghao.oss.console.app.controller.page;
 
 import cn.reghao.oss.console.app.model.po.StoreNode;
+import cn.reghao.oss.console.app.model.vo.StoreNodeVO;
 import cn.reghao.oss.console.app.service.StoreNodeService;
 import cn.reghao.oss.console.util.DefaultSetting;
 import cn.reghao.oss.console.util.db.PageSort;
@@ -31,7 +32,7 @@ public class StoreNodePageController {
 
     @ApiOperation(value = "存储节点列表页面")
     @GetMapping("/list")
-    public String appConfigPage(@RequestParam(value = "env", required = false) String env,
+    public String storeNodePage(@RequestParam(value = "env", required = false) String env,
                                 @RequestParam(value = "type", required = false) String type,
                                 @RequestParam(value = "appName", required = false) String appName,
                                 Model model) {
@@ -69,7 +70,7 @@ public class StoreNodePageController {
 
     @ApiOperation(value = "存储节点域名设置页面")
     @GetMapping("/config/{id}")
-    public String editAppConfigPage(@PathVariable("id") Integer id, Model model) {
+    public String editStoreNodePage(@PathVariable("id") Integer id, Model model) {
         StoreNode storeNode = storeNodeService.getById(id);
         model.addAttribute("storeNode", storeNode);
         return "/node/edit";
@@ -77,8 +78,8 @@ public class StoreNodePageController {
 
     @ApiOperation(value = "存储节点详情页面")
     @GetMapping("/detail/{id}")
-    public String appConfigPage(@PathVariable("id") Integer id, Model model) {
-        StoreNode storeNode = storeNodeService.getById(id);
+    public String storeNodePage(@PathVariable("id") Integer id, Model model) {
+        StoreNodeVO storeNode = storeNodeService.getDetail(id);
         model.addAttribute("storeNode", storeNode);
         return "/node/detail";
     }

+ 16 - 0
oss-console/src/main/java/cn/reghao/oss/console/app/model/vo/StoreDiskVO.java

@@ -0,0 +1,16 @@
+package cn.reghao.oss.console.app.model.vo;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+/**
+ * @author reghao
+ * @date 2024-03-07 14:25:07
+ */
+@AllArgsConstructor
+@Getter
+public class StoreDiskVO {
+    private String diskDir;
+    private String total;
+    private String avail;
+}

+ 36 - 0
oss-console/src/main/java/cn/reghao/oss/console/app/model/vo/StoreNodeVO.java

@@ -0,0 +1,36 @@
+package cn.reghao.oss.console.app.model.vo;
+
+import cn.reghao.oss.console.app.model.po.StoreDisk;
+import cn.reghao.oss.console.app.model.po.StoreNode;
+import cn.reghao.oss.store.api.dto.ObjectChannel;
+import cn.reghao.oss.store.api.dto.StoreInfo;
+import lombok.Getter;
+
+import java.util.List;
+
+/**
+ * @author reghao
+ * @date 2024-03-07 14:18:14
+ */
+@Getter
+public class StoreNodeVO {
+    private String nodeAddr;
+    private Integer httpPort;
+    private Integer rpcPort;
+    private List<StoreDiskVO> storeDisks;
+    private String domain;
+    private String referer;
+    private String secretKey;
+    private List<ObjectChannel> objectChannels;
+
+    public StoreNodeVO(StoreNode storeNode, List<StoreDiskVO> storeDisks, StoreInfo storeInfo) {
+        this.nodeAddr = storeNode.getNodeAddr();
+        this.httpPort = storeNode.getHttpPort();
+        this.rpcPort = storeNode.getRpcPort();
+        this.storeDisks = storeDisks;
+        this.domain = storeInfo.getStoreProperties().getDomain();
+        this.referer = storeInfo.getStoreProperties().getReferer();
+        this.secretKey = storeInfo.getStoreProperties().getSecretKey();
+        this.objectChannels = storeInfo.getObjectChannels();
+    }
+}

+ 35 - 0
oss-console/src/main/java/cn/reghao/oss/console/app/service/StoreNodeService.java

@@ -1,5 +1,7 @@
 package cn.reghao.oss.console.app.service;
 
+import cn.reghao.jutil.jdk.converter.ByteConverter;
+import cn.reghao.jutil.jdk.converter.ByteType;
 import cn.reghao.jutil.jdk.result.Result;
 import cn.reghao.oss.console.app.db.repository.StoreNodeRepository;
 import cn.reghao.oss.console.app.db.repository.UserNodeRepository;
@@ -7,7 +9,11 @@ import cn.reghao.oss.console.app.model.dto.NodeUpdateDto;
 import cn.reghao.oss.console.app.model.po.StoreDisk;
 import cn.reghao.oss.console.app.model.po.StoreNode;
 import cn.reghao.oss.console.app.model.vo.KeyValue;
+import cn.reghao.oss.console.app.model.vo.StoreDiskVO;
+import cn.reghao.oss.console.app.model.vo.StoreNodeVO;
 import cn.reghao.oss.console.app.rpc.RpcService;
+import cn.reghao.oss.store.api.dto.StoreDiskDto;
+import cn.reghao.oss.store.api.dto.StoreInfo;
 import cn.reghao.oss.store.api.dto.StoreNodeDto;
 import cn.reghao.oss.store.api.dto.StoreProperties;
 import cn.reghao.oss.store.api.iface.StoreService;
@@ -28,6 +34,7 @@ public class StoreNodeService {
     private final StoreNodeRepository storeNodeRepository;
     private final RpcService rpcService;
     private final UserNodeRepository userNodeRepository;
+    private ByteConverter byteConverter = new ByteConverter();
 
     public StoreNodeService(StoreNodeRepository storeNodeRepository, RpcService rpcService,
                             UserNodeRepository userNodeRepository) {
@@ -126,4 +133,32 @@ public class StoreNodeService {
                     return new KeyValue(nodeId+"", domain);
                 }).collect(Collectors.toList());
     }
+
+    public StoreNodeVO getDetail(int nodeId) {
+        StoreNode storeNode = storeNodeRepository.findById(nodeId).orElse(null);
+        if (storeNode == null) {
+            return null;
+        }
+
+        StoreService storeService = rpcService.getStoreService(storeNode);
+        StoreInfo storeInfo = storeService.getStoreInfo();
+        List<StoreDiskDto> storeDiskDtos = storeInfo.getStoreDisks();
+        /*List<StoreDisk> list = storeDiskDtos.stream()
+                .map(StoreDisk::new)
+                .collect(Collectors.toList());
+        storeNode.setStoreDisks(list);
+        storeNodeRepository.save(storeNode);*/
+
+        List<StoreDiskVO> storeDisks = storeDiskDtos.stream()
+                .map(storeDisk -> {
+                    String diskDir = storeDisk.getDiskDir();
+                    long total = storeDisk.getTotal();
+                    String totalStr = byteConverter.convert(ByteType.Bytes, total);
+                    long avail = storeDisk.getAvail();
+                    String availStr = byteConverter.convert(ByteType.Bytes, avail);
+                    return new StoreDiskVO(diskDir, totalStr, availStr);
+                }).collect(Collectors.toList());
+
+        return new StoreNodeVO(storeNode, storeDisks, storeInfo);
+    }
 }

+ 15 - 0
oss-console/src/main/resources/templates/node/detail.html

@@ -50,6 +50,21 @@
             </tr>
             </tbody>
         </table>
+        <div class="timo-detail-title">节点通道</div>
+        <table class="layui-table timo-detail-table">
+            <thead>
+            <tr>
+                <th class="sortable" data-field="appName">Channel ID</th>
+                <th class="sortable" data-field="appName">Prefix</th>
+            </tr>
+            </thead>
+            <tbody>
+            <tr th:each="item:${storeNode.objectChannels}">
+                <td th:text="${item.channelId}"></td>
+                <td th:text="${item.prefix}"></td>
+            </tr>
+            </tbody>
+        </table>
     </div>
 <script th:replace="/common/template :: script"></script>
 </body>

+ 1 - 1
oss-console/src/main/resources/templates/node/index.html

@@ -48,7 +48,7 @@
                         <a class="open-popup" data-title="设置存储节点属性" th:attr="data-url=@{'/store/node/config/'+${item.id}}"
                            data-size="640,480" href="#">设置</a>
                         <a class="open-popup" data-title="存储节点详细信息" th:attr="data-url=@{'/store/node/detail/'+${item.id}}"
-                           data-size="640,540" href="#">详细</a>
+                           data-size="720,540" href="#">详细</a>
                         <a class="ajax-delete" th:attr="data-msg='确定要删除节点 '+ ${item.nodeAddr}"
                            th:href="@{'/api/store/node/' + ${item.id}}">删除</a>
                     </td>

+ 1 - 1
oss-console/src/main/resources/templates/usernode/index1.html

@@ -47,7 +47,7 @@
                     <td th:text="${item.domain}">节点域名</td>
                     <td th:text="${item.nodeAddr}">节点地址</td>
                     <td>
-                        <a class="open-popup" data-title="存储节点详细信息" th:attr="data-url=@{'/app/config/app/detail/'+${item.id}}"
+                        <a class="open-popup" data-title="我的节点详细信息" th:attr="data-url=@{'/app/config/app/detail/'+${item.id}}"
                            data-size="640,480" href="#">详细</a>
                         <a class="ajax-delete" th:attr="data-msg='确定要删除 '+ ${item.domain}"
                            th:href="@{'/api/store/my/delete/' + ${item.id}}">删除</a>

+ 1 - 10
oss-store/src/main/java/cn/reghao/oss/store/config/spring/AppLifecycle.java

@@ -2,7 +2,6 @@ package cn.reghao.oss.store.config.spring;
 
 import cn.reghao.jutil.jdk.machine.id.MachineId;
 import cn.reghao.jutil.jdk.serializer.JsonConverter;
-import cn.reghao.jutil.jdk.store.LocalStore;
 import cn.reghao.jutil.jdk.store.LocalStores;
 import cn.reghao.jutil.jdk.store.SubDirCount;
 import cn.reghao.oss.sdk.OssConsoleClient;
@@ -22,7 +21,6 @@ import org.springframework.stereotype.Component;
 
 import java.io.File;
 import java.io.IOException;
-import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -90,14 +88,7 @@ public class AppLifecycle implements ApplicationRunner, DisposableBean {
 
     private void initStoreNode() throws Exception {
         log.info("初始化 StoreNode...");
-        List<StoreDiskDto> list = new ArrayList<>();
-        for (LocalStore localStore : LocalStores.getLocalStores()) {
-            String diskDir = localStore.getDiskDir();
-            long total = localStore.getTotal();
-            long avail = localStore.getAvailable();
-            list.add(new StoreDiskDto(diskDir, total, avail));
-        }
-
+        List<StoreDiskDto> list = storeLocalCache.getStoreDisks();
         String nodeAddr = machineId.ipv4();
         int httpPort = springProperties.getHttpPort();
         int rpcPort = springProperties.getRpcPort();

+ 11 - 3
oss-store/src/main/java/cn/reghao/oss/store/rpc/StoreServiceImpl.java

@@ -1,18 +1,18 @@
 package cn.reghao.oss.store.rpc;
 
 import cn.reghao.oss.store.api.constant.ObjectScope;
-import cn.reghao.oss.store.api.dto.ObjectChannel;
-import cn.reghao.oss.store.api.dto.StoreProperties;
+import cn.reghao.oss.store.api.dto.*;
 import cn.reghao.oss.store.service.ObjectNameService;
 import cn.reghao.oss.store.service.StoreLocalCache;
 import cn.reghao.oss.store.util.JwtUtil;
 import cn.reghao.oss.store.api.constant.ChannelAction;
-import cn.reghao.oss.store.api.dto.OssPayload;
 import cn.reghao.oss.store.api.iface.StoreService;
 import cn.reghao.oss.store.util.UserContext;
 import org.apache.dubbo.config.annotation.DubboService;
 import org.springframework.stereotype.Service;
 
+import java.util.List;
+
 /**
  * @author reghao
  * @date 2023-08-01 14:54:23
@@ -48,4 +48,12 @@ public class StoreServiceImpl implements StoreService {
     public void updateStoreProperties(StoreProperties storeProperties) {
         storeLocalCache.updateStoreProperties(storeProperties);
     }
+
+    @Override
+    public StoreInfo getStoreInfo() {
+        StoreProperties storeProperties = storeLocalCache.getStoreProperties();
+        List<ObjectChannel> objectChannels = storeLocalCache.getObjectChannels();
+        List<StoreDiskDto> list = storeLocalCache.getStoreDisks();
+        return new StoreInfo(storeProperties, objectChannels, list);
+    }
 }

+ 24 - 0
oss-store/src/main/java/cn/reghao/oss/store/service/StoreLocalCache.java

@@ -1,10 +1,14 @@
 package cn.reghao.oss.store.service;
 
+import cn.reghao.jutil.jdk.store.LocalStore;
+import cn.reghao.jutil.jdk.store.LocalStores;
 import cn.reghao.oss.store.api.dto.ObjectChannel;
+import cn.reghao.oss.store.api.dto.StoreDiskDto;
 import cn.reghao.oss.store.api.dto.StoreProperties;
 import cn.reghao.oss.store.config.SpringProperties;
 import org.springframework.stereotype.Service;
 
+import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -78,4 +82,24 @@ public class StoreLocalCache {
 
         return null;
     }
+
+    public List<ObjectChannel> getObjectChannels() {
+        return new ArrayList<>(prefixMap.values());
+    }
+
+    public StoreProperties getStoreProperties() {
+        return storeProperties;
+    }
+
+    public List<StoreDiskDto> getStoreDisks() {
+        List<StoreDiskDto> list = new ArrayList<>();
+        for (LocalStore localStore : LocalStores.getLocalStores()) {
+            String diskDir = localStore.getDiskDir();
+            long total = localStore.getTotal();
+            long avail = localStore.getAvailable();
+            list.add(new StoreDiskDto(diskDir, total, avail));
+        }
+
+        return list;
+    }
 }

+ 21 - 0
store-api/src/main/java/cn/reghao/oss/store/api/dto/StoreInfo.java

@@ -0,0 +1,21 @@
+package cn.reghao.oss.store.api.dto;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * @author reghao
+ * @date 2024-03-07 14:00:22
+ */
+@AllArgsConstructor
+@Getter
+public class StoreInfo implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    private StoreProperties storeProperties;
+    private List<ObjectChannel> objectChannels;
+    private List<StoreDiskDto> storeDisks;
+}

+ 4 - 0
store-api/src/main/java/cn/reghao/oss/store/api/iface/StoreService.java

@@ -1,8 +1,11 @@
 package cn.reghao.oss.store.api.iface;
 
 import cn.reghao.oss.store.api.dto.ObjectChannel;
+import cn.reghao.oss.store.api.dto.StoreInfo;
 import cn.reghao.oss.store.api.dto.StoreProperties;
 
+import java.util.List;
+
 /**
  * @author reghao
  * @date 2023-08-01 14:51:50
@@ -11,4 +14,5 @@ public interface StoreService {
     String getUploadToken(int userId, int channelId);
     void createChannel(int userId, ObjectChannel channel);
     void updateStoreProperties(StoreProperties storeProperties);
+    StoreInfo getStoreInfo();
 }