ソースを参照

新增无代码 nocodb 表格相关接口

hubin 3 ヶ月 前
コミット
771565c000

+ 14 - 0
src/main/java/com/aizuda/boot/config/RestTemplateConfig.java

@@ -0,0 +1,14 @@
+package com.aizuda.boot.config;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.web.client.RestTemplate;
+
+@Configuration
+public class RestTemplateConfig {
+
+    @Bean
+    public RestTemplate restTemplate() {
+        return new RestTemplate();
+    }
+}

+ 52 - 0
src/main/java/com/aizuda/boot/modules/noco/controller/NocoTableController.java

@@ -0,0 +1,52 @@
+package com.aizuda.boot.modules.noco.controller;
+
+import com.aizuda.boot.modules.noco.nocodb.*;
+import com.aizuda.boot.modules.noco.service.NocoTableService;
+import com.baomidou.kisso.annotation.Permission;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import lombok.AllArgsConstructor;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+
+@Tag(name = "无代码表格")
+@RestController
+@AllArgsConstructor
+@RequestMapping("/v1/noco-table")
+public class NocoTableController {
+    private NocoTableService nocoTableService;
+
+    @Operation(summary = "获取工作空间分页")
+    @Permission("noco:table")
+    @PostMapping("/bases")
+    public Page<NdBase> getPage() {
+        return nocoTableService.getBases();
+    }
+
+    @Operation(summary = "获取表分页")
+    @Permission("noco:table")
+    @PostMapping("/tables")
+    public List<NdTable> getTables(@RequestParam String baseId) {
+        return nocoTableService.getTables(baseId);
+    }
+
+    @Operation(summary = "获取表结构")
+    @Permission("noco:table")
+    @PostMapping("/table")
+    public NdTableInfo getTable(@RequestParam String tableId) {
+        return nocoTableService.getTable(tableId);
+    }
+
+    @Operation(summary = "获取数据")
+    @Permission("noco:table")
+    @PostMapping("/record")
+    public NdRecord getRecord(@RequestParam String tableId, @RequestParam String recordId) {
+        return nocoTableService.getRecord(tableId, recordId);
+    }
+
+}

+ 16 - 0
src/main/java/com/aizuda/boot/modules/noco/nocodb/NdAutoConfig.java

@@ -0,0 +1,16 @@
+package com.aizuda.boot.modules.noco.nocodb;
+
+import org.springframework.boot.context.properties.EnableConfigurationProperties;
+import org.springframework.context.annotation.Configuration;
+
+/**
+ * Nocodb 初始化配置
+ *
+ * @author hubin
+ * @since 2025-03-19
+ */
+@Configuration
+@EnableConfigurationProperties(NdProperties.class)
+public class NdAutoConfig {
+
+}

+ 12 - 0
src/main/java/com/aizuda/boot/modules/noco/nocodb/NdBase.java

@@ -0,0 +1,12 @@
+package com.aizuda.boot.modules.noco.nocodb;
+
+import lombok.Getter;
+import lombok.Setter;
+
+@Getter
+@Setter
+public class NdBase {
+    private String id;
+    private String title;
+
+}

+ 5 - 0
src/main/java/com/aizuda/boot/modules/noco/nocodb/NdBasesResult.java

@@ -0,0 +1,5 @@
+package com.aizuda.boot.modules.noco.nocodb;
+
+public class NdBasesResult extends NdPage<NdBase> {
+
+}

+ 31 - 0
src/main/java/com/aizuda/boot/modules/noco/nocodb/NdColumn.java

@@ -0,0 +1,31 @@
+package com.aizuda.boot.modules.noco.nocodb;
+
+import com.fasterxml.jackson.annotation.JsonAlias;
+import lombok.Getter;
+import lombok.Setter;
+
+@Getter
+@Setter
+public class NdColumn {
+    private String id;
+    private String title;
+
+    @JsonAlias("column_name")
+    private String columnName;
+
+    // 字段数据类型
+    private String dt;
+
+    // 创建字段类型
+    private String ct;
+
+    // 字符串类型字段长度
+    private String clen;
+
+    // 系统字段 0,否 1,是
+    private Integer system;
+
+    // 只读 0,否 1,是
+    private Integer readonly;
+
+}

+ 14 - 0
src/main/java/com/aizuda/boot/modules/noco/nocodb/NdPage.java

@@ -0,0 +1,14 @@
+package com.aizuda.boot.modules.noco.nocodb;
+
+import lombok.Getter;
+import lombok.Setter;
+
+import java.util.List;
+
+@Getter
+@Setter
+public class NdPage<T> {
+    private List<T> list;
+    private NdPageInfo pageInfo;
+
+}

+ 15 - 0
src/main/java/com/aizuda/boot/modules/noco/nocodb/NdPageInfo.java

@@ -0,0 +1,15 @@
+package com.aizuda.boot.modules.noco.nocodb;
+
+import lombok.Getter;
+import lombok.Setter;
+
+@Getter
+@Setter
+public class NdPageInfo {
+    private Integer totalRows;
+    private Integer page;
+    private Integer pageSize;
+    private Boolean isFirstPage;
+    private Boolean isLastPage;
+
+}

+ 19 - 0
src/main/java/com/aizuda/boot/modules/noco/nocodb/NdProperties.java

@@ -0,0 +1,19 @@
+package com.aizuda.boot.modules.noco.nocodb;
+
+import lombok.Getter;
+import lombok.Setter;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.stereotype.Component;
+
+@Getter
+@Setter
+@Component
+@ConfigurationProperties(prefix = "nocodb")
+public class NdProperties {
+    // api url
+    private String apiUrl;
+
+    // api token
+    private String xcToken;
+
+}

+ 12 - 0
src/main/java/com/aizuda/boot/modules/noco/nocodb/NdRecord.java

@@ -0,0 +1,12 @@
+package com.aizuda.boot.modules.noco.nocodb;
+
+import lombok.Getter;
+import lombok.Setter;
+
+import java.util.HashMap;
+
+@Getter
+@Setter
+public class NdRecord extends HashMap<String, Object> {
+
+}

+ 12 - 0
src/main/java/com/aizuda/boot/modules/noco/nocodb/NdTable.java

@@ -0,0 +1,12 @@
+package com.aizuda.boot.modules.noco.nocodb;
+
+import lombok.Getter;
+import lombok.Setter;
+
+@Getter
+@Setter
+public class NdTable {
+    private String id;
+    private String title;
+    private String description;
+}

+ 15 - 0
src/main/java/com/aizuda/boot/modules/noco/nocodb/NdTableInfo.java

@@ -0,0 +1,15 @@
+package com.aizuda.boot.modules.noco.nocodb;
+
+import lombok.Getter;
+import lombok.Setter;
+
+import java.util.List;
+
+@Getter
+@Setter
+public class NdTableInfo {
+    private String id;
+    private String title;
+    private String description;
+    private List<NdColumn> columns;
+}

+ 13 - 0
src/main/java/com/aizuda/boot/modules/noco/nocodb/NdTablesResult.java

@@ -0,0 +1,13 @@
+package com.aizuda.boot.modules.noco.nocodb;
+
+import lombok.Getter;
+import lombok.Setter;
+
+import java.util.List;
+
+@Getter
+@Setter
+public class NdTablesResult {
+    private List<NdTable> list;
+
+}

+ 43 - 0
src/main/java/com/aizuda/boot/modules/noco/nocodb/NocoDB.java

@@ -0,0 +1,43 @@
+package com.aizuda.boot.modules.noco.nocodb;
+
+import org.springframework.http.HttpEntity;
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.HttpMethod;
+import org.springframework.http.MediaType;
+import org.springframework.stereotype.Service;
+import org.springframework.web.client.RestTemplate;
+
+@Service
+public class NocoDB {
+    private final NdProperties ndProperties;
+    private final RestTemplate restTemplate;
+
+    public NocoDB(RestTemplate restTemplate, NdProperties ndProperties) {
+        this.restTemplate = restTemplate;
+        this.ndProperties = ndProperties;
+    }
+
+    private HttpHeaders getHttpHeaders() {
+        HttpHeaders headers = new HttpHeaders();
+        headers.set("Xc-Token", ndProperties.getXcToken());
+        headers.setContentType(MediaType.APPLICATION_JSON);
+        return headers;
+    }
+
+    private HttpEntity<String> getHttpEntity() {
+        return new HttpEntity<>(getHttpHeaders());
+    }
+
+    public <T> T getForObject(String uri, Class<T> responseType, Object... uriVariables) {
+        return restTemplate.exchange(ndProperties.getApiUrl() + uri, HttpMethod.GET, getHttpEntity(), responseType, uriVariables).getBody();
+    }
+
+    public <T> T postForObject(String uri, Class<T> responseType, Object... uriVariables) {
+        return restTemplate.exchange(ndProperties.getApiUrl() + uri, HttpMethod.POST, getHttpEntity(), responseType, uriVariables).getBody();
+    }
+
+    public <T> T postForObject(String uri, String jsonBody, Class<T> responseType, Object... uriVariables) {
+        HttpEntity<String> entity = new HttpEntity<>(jsonBody, getHttpHeaders());
+        return restTemplate.exchange(ndProperties.getApiUrl() + uri, HttpMethod.POST, entity, responseType, uriVariables).getBody();
+    }
+}

+ 54 - 0
src/main/java/com/aizuda/boot/modules/noco/service/NocoTableService.java

@@ -0,0 +1,54 @@
+package com.aizuda.boot.modules.noco.service;
+
+import com.aizuda.boot.modules.noco.nocodb.*;
+import com.aizuda.common.toolkit.JacksonUtils;
+import com.aizuda.core.api.ApiAssert;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import jakarta.annotation.Resource;
+import lombok.AllArgsConstructor;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+@Service
+@AllArgsConstructor
+public class NocoTableService {
+    @Resource
+    private NocoDB nocoDB;
+
+    /*
+     * 获取工作空间分页
+     */
+    public Page<NdBase> getBases() {
+        NdBasesResult nr = nocoDB.getForObject("/api/v2/meta/bases/", NdBasesResult.class);
+        ApiAssert.fail(null == nr, "获取工作空间分页失败");
+        NdPageInfo npi = nr.getPageInfo();
+        Page<NdBase> page = Page.of(npi.getPage(), npi.getPageSize(), npi.getTotalRows());
+        page.setRecords(nr.getList());
+        return page;
+    }
+
+    /*
+     * 获取表分页
+     */
+    public List<NdTable> getTables(String baseId) {
+        NdTablesResult ntr = nocoDB.getForObject("/api/v2/meta/bases/{baseId}/tables", NdTablesResult.class, baseId);
+        ApiAssert.fail(null == ntr, "获取表分页失败");
+        return ntr.getList();
+    }
+
+    /*
+     * 获取表结构
+     */
+    public NdTableInfo getTable(String tableId) {
+        return nocoDB.getForObject("/api/v2/meta/tables/{tableId}", NdTableInfo.class, tableId);
+    }
+
+    /*
+     * 获取数据
+     */
+    public NdRecord getRecord(String tableId, String recordId) {
+        return nocoDB.getForObject("/api/v2/tables/{tableId}/records/{recordId}", NdRecord.class, tableId, recordId);
+    }
+
+}

+ 5 - 0
src/main/resources/application.yml

@@ -36,6 +36,11 @@ mybatis-plus:
     db-config:
       table-underline: true
 
+# nocodb config
+nocodb:
+  api-url: "nocodb api url"
+  xc-token: "nocodb api token"
+
 # 日志
 logging:
   config: classpath:log4j2.xml