From 0fd4d12cddba6be0d46d779142da121c2321044c Mon Sep 17 00:00:00 2001
From: tjx <t2856754968@163.com>
Date: 星期一, 10 十一月 2025 12:43:58 +0800
Subject: [PATCH] 初始化
---
src/main/java/com/gs/simple/domain/BiView.java | 20 +
src/main/resources/mapper/MesSimpleMapper.xml | 7
src/main/java/com/gs/simple/SimpleApplication.java | 15 +
src/main/java/com/gs/simple/common/DatabaseConfig.java | 21 +
CLAUDE.md | 92 ++++++
src/main/java/com/gs/simple/domain/Children.java | 22 +
src/main/java/com/gs/simple/domain/MesSimplesimple.java | 59 +++
src/main/startup.bat | 10
pom.xml | 90 ++++++
README.md | 4
src/main/java/com/gs/simple/mapper/MesSimpleMapper.java | 18 +
src/main/java/com/gs/simple/service/impl/MesSimpleServiceImpl.java | 116 +++++++
src/test/java/com/gs/simple/SimpleApplicationTests.java | 13
src/main/java/com/gs/simple/controller/SimpleController.java | 35 ++
src/main/java/com/gs/simple/domain/TreeView.java | 24 +
src/main/java/com/gs/simple/common/ResultDto.java | 69 ++++
MES_SIMPLE_CREATE_TABLE.sql | 155 ++++++++++
src/main/java/com/gs/simple/service/MesSimpleService.java | 23 +
src/main/resources/application.yml | 70 ++++
19 files changed, 860 insertions(+), 3 deletions(-)
diff --git a/CLAUDE.md b/CLAUDE.md
new file mode 100644
index 0000000..e8a8a4c
--- /dev/null
+++ b/CLAUDE.md
@@ -0,0 +1,92 @@
+# CLAUDE.md
+
+This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
+
+## Project Overview
+
+This is a Spring Boot 3.1.5 application with Java 17 that provides a dynamic menu system with tree structure. The application uses Microsoft SQL Server 2019 database with MyBatis Plus for data access and serves REST APIs for menu management.
+
+## Key Technologies and Dependencies
+
+- **Spring Boot 3.1.5** with Java 17
+- **Microsoft SQL Server 2019** with MSSQL-JDBC driver
+- **MyBatis Plus** for ORM and database operations
+- **Alibaba Druid** for connection pooling
+- **Lombok** for reducing boilerplate code
+- **Alibaba FastJSON** for JSON serialization
+- **Hutool** utility library
+
+## Development Commands
+
+### Build and Package
+```bash
+mvn clean package
+```
+
+### Run Application
+```bash
+mvn spring-boot:run
+```
+
+### Run Tests
+```bash
+mvn test
+```
+
+### Generate JAR with dependencies
+```bash
+mvn clean package -DskipTests
+```
+
+### Run Production JAR
+Use the provided startup script:
+```bash
+# Windows
+src/main/startup.bat
+
+# Or manually with custom SQL Server connection:
+java -jar -Dspring.datasource.url="jdbc:sqlserver://HOST:PORT;databaseName=DATABASE;encrypt=true;trustServerCertificate=true" -Dspring.datasource.username=USERNAME -Dspring.datasource.password=PASSWORD simple.jar
+```
+
+**Note**: Both `encrypt=true` and `encrypt=false` work with `trustServerCertificate=true`. The startup.bat uses `encrypt=true`.
+
+## Application Architecture
+
+### Package Structure
+- `com.gs.simple` - Root package
+ - `common/` - Shared utilities (DatabaseConfig, ResultDto)
+ - `controller/` - REST controllers
+ - `domain/` - Entity classes (MesSimplesimple, TreeView, Children)
+ - `mapper/` - MyBatis mappers for database access
+ - `service/` - Business logic layer with implementation
+
+### Key Components
+
+**SimpleController** (`controller/SimpleController.java:16-35`)
+- Main REST controller with CORS enabled
+- Endpoints: `/simple/getTree` (POST) and `/simple/list` (POST)
+
+**MesSimpleService** (`service/MesSimpleService.java:15-23`)
+- Core business logic for menu operations
+- Methods: `getTree()`, `toTree()`, `getMenuList()`
+
+**TreeView Domain** (`domain/TreeView.java:13-24`)
+- Represents hierarchical menu structure with id, title, field, spread, and children
+
+### Database Configuration
+- **Default**: SQL Server database at 192.168.0.51:1433 (database: TEST_MES)
+- **Schema Initialization**: Use `MES_SIMPLE_CREATE_TABLE.sql` to create the required database table
+- **Runtime Override**: Use system properties or startup.bat for different environments without rebuilding
+- **Connection Pool**: Druid with 5-20 connections, 60s timeout
+- **MyBatis**: XML mappers in `src/main/resources/mapper/`
+
+## Development Notes
+
+- Server runs on port **9091** by default
+- Spring Boot Actuator endpoints available for monitoring
+- MyBatis Plus uses AUTO ID generation strategy
+- SQL logging enabled via StdOutImpl for debugging
+- Camel case mapping enabled for SQL Server database columns
+- JDBC null handling configured for SQL Server compatibility (`jdbc-type-for-null: 'null'`)
+- Application supports runtime database configuration override via JVM properties
+- Druid SQL wall filter enabled for SQL injection protection with multi-statement support
\ No newline at end of file
diff --git a/MES_SIMPLE_CREATE_TABLE.sql b/MES_SIMPLE_CREATE_TABLE.sql
new file mode 100644
index 0000000..2b87226
--- /dev/null
+++ b/MES_SIMPLE_CREATE_TABLE.sql
@@ -0,0 +1,155 @@
+-- SQL Server寤鸿〃鑴氭湰 - 鑿滃崟缁存姢琛�
+-- 瀵瑰簲Java瀹炰綋绫�: com.gs.simple.domain.MesSimplesimple
+
+-- 濡傛灉琛ㄥ凡瀛樺湪鍒欏垹闄�
+IF OBJECT_ID('dbo.MES_SIMPLE', 'U') IS NOT NULL
+ DROP TABLE dbo.MES_SIMPLE;
+
+-- 鍒涘缓鑿滃崟缁存姢琛�
+CREATE TABLE dbo.MES_SIMPLE (
+ -- 鑷鍒楋紝浣跨敤IDENTITY鏇夸唬Oracle搴忓垪
+ id BIGINT IDENTITY(1,1) PRIMARY KEY,
+
+ -- 鏄惁涓烘牴鑺傜偣 (0琛ㄧず涓烘牴鑺傜偣)
+ is_top INT NULL,
+
+ -- 鐖惰妭鐐筰d
+ fid BIGINT NULL,
+
+ -- 鍚嶇О
+ title NVARCHAR(255) NULL,
+
+ -- 鑻辨枃鍚�
+ field NVARCHAR(255) NULL,
+
+ -- 鍦板潃
+ href NVARCHAR(500) NULL,
+
+ -- 鑺傜偣鏄惁鍒濆灞曞紑 (0涓轰笉灞曞紑锛�1涓哄睍寮�)
+ spread INT NULL,
+
+ -- 鑺傜偣鏄惁涓哄睍绀� (0涓哄睍绀猴紝1涓轰笉灞曠ず)
+ disabled INT NULL
+);
+
+-- 娣诲姞琛ㄦ敞閲婏紙SQL Server浣跨敤鎵╁睍灞炴�э級
+EXEC sys.sp_addextendedproperty
+ @name=N'MS_Description',
+ @value=N'鑿滃崟缁存姢琛�',
+ @level0type=N'SCHEMA',
+ @level0name=N'dbo',
+ @level1type=N'TABLE',
+ @level1name=N'MES_SIMPLE';
+
+-- 娣诲姞鍒楁敞閲�
+EXEC sys.sp_addextendedproperty
+ @name=N'MS_Description',
+ @value=N'鑷鍒椾富閿�',
+ @level0type=N'SCHEMA',
+ @level0name=N'dbo',
+ @level1type=N'TABLE',
+ @level1name=N'MES_SIMPLE',
+ @level2type=N'COLUMN',
+ @level2name=N'id';
+
+EXEC sys.sp_addextendedproperty
+ @name=N'MS_Description',
+ @value=N'鏄惁涓烘牴鑺傜偣(0琛ㄧず涓烘牴鑺傜偣)',
+ @level0type=N'SCHEMA',
+ @level0name=N'dbo',
+ @level1type=N'TABLE',
+ @level1name=N'MES_SIMPLE',
+ @level2type=N'COLUMN',
+ @level2name=N'is_top';
+
+EXEC sys.sp_addextendedproperty
+ @name=N'MS_Description',
+ @value=N'鐖惰妭鐐筰d',
+ @level0type=N'SCHEMA',
+ @level0name=N'dbo',
+ @level1type=N'TABLE',
+ @level1name=N'MES_SIMPLE',
+ @level2type=N'COLUMN',
+ @level2name=N'fid';
+
+EXEC sys.sp_addextendedproperty
+ @name=N'MS_Description',
+ @value=N'鍚嶇О',
+ @level0type=N'SCHEMA',
+ @level0name=N'dbo',
+ @level1type=N'TABLE',
+ @level1name=N'MES_SIMPLE',
+ @level2type=N'COLUMN',
+ @level2name=N'title';
+
+EXEC sys.sp_addextendedproperty
+ @name=N'MS_Description',
+ @value=N'鑻辨枃鍚�',
+ @level0type=N'SCHEMA',
+ @level0name=N'dbo',
+ @level1type=N'TABLE',
+ @level1name=N'MES_SIMPLE',
+ @level2type=N'COLUMN',
+ @level2name=N'field';
+
+EXEC sys.sp_addextendedproperty
+ @name=N'MS_Description',
+ @value=N'鍦板潃',
+ @level0type=N'SCHEMA',
+ @level0name=N'dbo',
+ @level1type=N'TABLE',
+ @level1name=N'MES_SIMPLE',
+ @level2type=N'COLUMN',
+ @level2name=N'href';
+
+EXEC sys.sp_addextendedproperty
+ @name=N'MS_Description',
+ @value=N'鑺傜偣鏄惁鍒濆灞曞紑(0涓轰笉灞曞紑锛�1涓哄睍寮�)',
+ @level0type=N'SCHEMA',
+ @level0name=N'dbo',
+ @level1type=N'TABLE',
+ @level1name=N'MES_SIMPLE',
+ @level2type=N'COLUMN',
+ @level2name=N'spread';
+
+EXEC sys.sp_addextendedproperty
+ @name=N'MS_Description',
+ @value=N'鑺傜偣鏄惁涓哄睍绀�(0涓哄睍绀猴紝1涓轰笉灞曠ず)',
+ @level0type=N'SCHEMA',
+ @level0name=N'dbo',
+ @level1type=N'TABLE',
+ @level1name=N'MES_SIMPLE',
+ @level2type=N'COLUMN',
+ @level2name=N'disabled';
+
+-- 鍒涘缓澶栭敭绾︽潫锛堣嚜鍏宠仈锛�
+ALTER TABLE dbo.MES_SIMPLE
+ADD CONSTRAINT FK_MES_SIMPLE_FID
+FOREIGN KEY (fid) REFERENCES dbo.MES_SIMPLE(id);
+
+-- 鍒涘缓绱㈠紩鎻愰珮鏌ヨ鎬ц兘
+CREATE INDEX IX_MES_SIMPLE_FID ON dbo.MES_SIMPLE(fid);
+CREATE INDEX IX_MES_SIMPLE_IS_TOP ON dbo.MES_SIMPLE(is_top);
+CREATE INDEX IX_MES_SIMPLE_DISABLED ON dbo.MES_SIMPLE(disabled);
+
+-- 鎻掑叆绀轰緥鏁版嵁
+INSERT INTO dbo.MES_SIMPLE (is_top, fid, title, field, href, spread, disabled) VALUES
+(0, NULL, '绯荤粺绠$悊', 'system', '#', 1, 0),
+(1, 1, '鑿滃崟绠$悊', 'menu', '/menu/list', 0, 0),
+(1, 1, '鐢ㄦ埛绠$悊', 'user', '/user/list', 0, 0),
+(0, NULL, '鏁版嵁绠$悊', 'data', '#', 0, 0),
+(1, 4, '鏁版嵁瀵煎叆', 'import', '/data/import', 0, 0),
+(1, 4, '鏁版嵁瀵煎嚭', 'export', '/data/export', 0, 0);
+
+-- 鏌ョ湅鍒涘缓缁撴灉
+SELECT
+ id,
+ is_top,
+ fid,
+ title,
+ field,
+ href,
+ spread,
+ disabled
+FROM dbo.MES_SIMPLE
+ORDER BY id;
\ No newline at end of file
diff --git a/README.md b/README.md
index b2f93b7..1950f9b 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,2 @@
-## LBKBSql_Service
-
-杞挱鐪嬫澘鍚庡彴
+# gs-simple
diff --git a/pom.xml b/pom.xml
new file mode 100644
index 0000000..1ff0044
--- /dev/null
+++ b/pom.xml
@@ -0,0 +1,90 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://maven.apache.org/POM/4.0.0"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
+ <modelVersion>4.0.0</modelVersion>
+ <parent>
+ <groupId>org.springframework.boot</groupId>
+ <artifactId>spring-boot-starter-parent</artifactId>
+ <version>3.1.5</version>
+ <relativePath/> <!-- lookup parent from repository -->
+ </parent>
+ <groupId>com.gs</groupId>
+ <artifactId>simple</artifactId>
+ <version>1.0.2-SNAPSHOT</version>
+ <name>simple</name>
+ <description>simple</description>
+ <dependencies>
+ <dependency>
+ <groupId>org.springframework.boot</groupId>
+ <artifactId>spring-boot-starter-web</artifactId>
+ </dependency>
+
+ <dependency>
+ <groupId>com.microsoft.sqlserver</groupId>
+ <artifactId>mssql-jdbc</artifactId>
+ </dependency>
+
+ <dependency>
+ <groupId>org.projectlombok</groupId>
+ <artifactId>lombok</artifactId>
+ <optional>true</optional>
+ </dependency>
+ <dependency>
+ <groupId>org.springframework.boot</groupId>
+ <artifactId>spring-boot-starter-test</artifactId>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
+ <groupId>com.alibaba</groupId>
+ <artifactId>druid-spring-boot-starter</artifactId>
+ <version>1.2.16</version>
+ </dependency>
+
+ <dependency>
+ <groupId>com.alibaba</groupId>
+ <artifactId>fastjson</artifactId>
+ <version>2.0.48</version>
+ </dependency>
+ <dependency>
+ <groupId>com.baomidou</groupId>
+ <artifactId>mybatis-plus-boot-starter</artifactId>
+ <version>3.5.6</version>
+ </dependency>
+
+ <dependency>
+ <groupId>cn.hutool</groupId>
+ <artifactId>hutool-all</artifactId>
+ <version>5.8.22</version>
+ </dependency>
+ <dependency>
+ <groupId>org.springframework.boot</groupId>
+ <artifactId>spring-boot-starter-actuator</artifactId>
+ </dependency>
+ </dependencies>
+
+ <build>
+ <finalName>simple</finalName>
+ <plugins>
+ <plugin>
+ <groupId>org.springframework.boot</groupId>
+ <artifactId>spring-boot-maven-plugin</artifactId>
+ <configuration>
+ <excludes>
+ <exclude>
+ <groupId>org.projectlombok</groupId>
+ <artifactId>lombok</artifactId>
+ </exclude>
+ </excludes>
+ </configuration>
+ </plugin>
+ </plugins>
+ </build>
+ <repositories>
+ <repository>
+ <id>maven_central</id>
+ <name>Maven Central</name>
+ <url>https://repo.maven.apache.org/maven2/</url>
+ </repository>
+ </repositories>
+
+</project>
diff --git a/src/main/java/com/gs/simple/SimpleApplication.java b/src/main/java/com/gs/simple/SimpleApplication.java
new file mode 100644
index 0000000..713c544
--- /dev/null
+++ b/src/main/java/com/gs/simple/SimpleApplication.java
@@ -0,0 +1,15 @@
+package com.gs.simple;
+
+import org.mybatis.spring.annotation.MapperScan;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+@SpringBootApplication
+@MapperScan(value = "com.gs.simple.mapper")
+public class SimpleApplication {
+
+ public static void main(String[] args) {
+ SpringApplication.run(SimpleApplication.class, args);
+ }
+
+}
diff --git a/src/main/java/com/gs/simple/common/DatabaseConfig.java b/src/main/java/com/gs/simple/common/DatabaseConfig.java
new file mode 100644
index 0000000..2dd84dd
--- /dev/null
+++ b/src/main/java/com/gs/simple/common/DatabaseConfig.java
@@ -0,0 +1,21 @@
+package com.gs.simple.common;
+
+import lombok.RequiredArgsConstructor;
+import org.springframework.core.env.ConfigurableEnvironment;
+import org.springframework.core.env.Environment;
+import org.springframework.core.env.MapPropertySource;
+import org.springframework.stereotype.Component;
+
+import java.util.Map;
+
+@Component
+@RequiredArgsConstructor
+public class DatabaseConfig {
+
+ private final Environment env;
+
+ public void updateDatabaseConfig(String newUrl, String newUsername, String newPassword) {
+ // 浣跨敤Environment瀵硅薄鏉ュ姩鎬佷慨鏀瑰睘鎬�
+ ((ConfigurableEnvironment) env).getPropertySources().addFirst(new MapPropertySource("dynamicProperties", Map.of("spring.datasource.url", newUrl, "spring.datasource.username", newUsername, "spring.datasource.password", newPassword)));
+ }
+}
diff --git a/src/main/java/com/gs/simple/common/ResultDto.java b/src/main/java/com/gs/simple/common/ResultDto.java
new file mode 100644
index 0000000..293efa9
--- /dev/null
+++ b/src/main/java/com/gs/simple/common/ResultDto.java
@@ -0,0 +1,69 @@
+package com.gs.simple.common;
+
+import java.io.Serializable;
+
+public class ResultDto<T> implements Serializable {
+
+ private int code;
+
+ private String msg;
+
+ private T data;
+
+ private int count;
+
+ public ResultDto() {
+ }
+
+ public ResultDto(int code, String msg, T data, int count) {
+ this.code = code;
+ this.msg = msg;
+ this.data = data;
+ this.count = count;
+ }
+
+ public ResultDto(int code, String msg) {
+ this.code = code;
+ this.msg = msg;
+ }
+
+ public static <T> ResultDto<T> ok(T data, int count) {
+ return new ResultDto<>(0, "璇锋眰鎴愬姛", data, count);
+ }
+
+ public static <T> ResultDto<T> error(String message) {
+ return new ResultDto<>(500, message, null, 0);
+ }
+
+ public int getCount() {
+ return count;
+ }
+
+ public void setCount(int count) {
+ this.count = count;
+ }
+
+ public int getCode() {
+ return code;
+ }
+
+ public void setCode(int code) {
+ this.code = code;
+ }
+
+ public String getMsg() {
+ return msg;
+ }
+
+ public void setMsg(String msg) {
+ this.msg = msg;
+ }
+
+ public T getData() {
+ return data;
+ }
+
+ public void setData(T data) {
+ this.data = data;
+ }
+}
diff --git a/src/main/java/com/gs/simple/controller/SimpleController.java b/src/main/java/com/gs/simple/controller/SimpleController.java
new file mode 100644
index 0000000..f79689d
--- /dev/null
+++ b/src/main/java/com/gs/simple/controller/SimpleController.java
@@ -0,0 +1,35 @@
+package com.gs.simple.controller;
+
+
+import com.gs.simple.common.ResultDto;
+import com.gs.simple.domain.MesSimplesimple;
+import com.gs.simple.domain.TreeView;
+import com.gs.simple.service.MesSimpleService;
+import lombok.RequiredArgsConstructor;
+import org.springframework.web.bind.annotation.CrossOrigin;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+
+@RestController
+@RequestMapping("simple")
+@RequiredArgsConstructor
+@CrossOrigin(origins = "*") //璺ㄥ煙璇锋眰
+public class SimpleController {
+
+ private final MesSimpleService simpleService;
+
+
+ @PostMapping("/getTree")
+ public ResultDto<List<TreeView>> getTree() {
+ return simpleService.getTree();
+ }
+
+
+ @PostMapping("list")
+ public ResultDto<List<MesSimplesimple>> getList() {
+ return simpleService.getMenuList();
+ }
+}
diff --git a/src/main/java/com/gs/simple/domain/BiView.java b/src/main/java/com/gs/simple/domain/BiView.java
new file mode 100644
index 0000000..d4ee1cb
--- /dev/null
+++ b/src/main/java/com/gs/simple/domain/BiView.java
@@ -0,0 +1,20 @@
+package com.gs.simple.domain;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serializable;
+
+@Data
+@TableName(value = "MES_SIMPLE_CCB")
+@NoArgsConstructor
+@AllArgsConstructor
+public class BiView implements Serializable {
+ private Integer id;
+ private Integer pid;
+ private String name;
+ private String href;
+ private Integer lbtime;
+}
\ No newline at end of file
diff --git a/src/main/java/com/gs/simple/domain/Children.java b/src/main/java/com/gs/simple/domain/Children.java
new file mode 100644
index 0000000..c7abbb1
--- /dev/null
+++ b/src/main/java/com/gs/simple/domain/Children.java
@@ -0,0 +1,22 @@
+package com.gs.simple.domain;
+
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+public class Children {
+
+ private Long id;
+
+ private String title;
+
+ private String field;
+
+ private String href;
+
+ //private List<Children> children;
+}
diff --git a/src/main/java/com/gs/simple/domain/MesSimplesimple.java b/src/main/java/com/gs/simple/domain/MesSimplesimple.java
new file mode 100644
index 0000000..23ada41
--- /dev/null
+++ b/src/main/java/com/gs/simple/domain/MesSimplesimple.java
@@ -0,0 +1,59 @@
+package com.gs.simple.domain;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serial;
+import java.io.Serializable;
+
+/**
+ * 鑿滃崟缁存姢琛�
+ *
+ * @TableName MES_SIMPLE
+ */
+@TableName(value = "MES_SIMPLE")
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+public class MesSimplesimple implements Serializable {
+ @Serial
+ @TableField(exist = false)
+ private static final long serialVersionUID = 1L;
+ /**
+ * 鑷鍒楋紝浣跨敤SQL Server IDENTITY鍒�
+ */
+ @TableId
+ private Long id;
+ /**
+ * 鏄惁涓烘牴鑺傜偣 0琛ㄧず涓烘牴鑺傜偣
+ */
+ private Integer isTop;
+ /**
+ * 鐖惰妭鐐筰d
+ */
+ private Long fid;
+ /**
+ * 鍚嶇О
+ */
+ private String title;
+ /**
+ * 鑻辨枃鍚�
+ */
+ private String field;
+ /**
+ * 鍦板潃
+ */
+ private String href;
+ /**
+ * 鑺傜偣鏄惁鍒濆灞曞紑 0涓轰笉灞曞紑锛�1涓哄睍寮�
+ */
+ private Integer spread;
+ /**
+ * 鑺傜偣鏄惁涓哄睍绀� 0涓哄睍绀猴紝1涓轰笉灞曠ず
+ */
+ private Integer disabled;
+}
\ No newline at end of file
diff --git a/src/main/java/com/gs/simple/domain/TreeView.java b/src/main/java/com/gs/simple/domain/TreeView.java
new file mode 100644
index 0000000..0182a47
--- /dev/null
+++ b/src/main/java/com/gs/simple/domain/TreeView.java
@@ -0,0 +1,24 @@
+package com.gs.simple.domain;
+
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.util.List;
+
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+public class TreeView {
+
+ private Long id;
+
+ private String title;
+
+ private String field;
+
+ private Boolean spread;
+
+ private List<Children> children;
+}
diff --git a/src/main/java/com/gs/simple/mapper/MesSimpleMapper.java b/src/main/java/com/gs/simple/mapper/MesSimpleMapper.java
new file mode 100644
index 0000000..7bb6042
--- /dev/null
+++ b/src/main/java/com/gs/simple/mapper/MesSimpleMapper.java
@@ -0,0 +1,18 @@
+package com.gs.simple.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.gs.simple.domain.MesSimplesimple;
+
+/**
+ * @author 28567
+ * @description 閽堝琛ㄣ�怣ES_SIMPLE(鑿滃崟缁存姢琛�)銆戠殑鏁版嵁搴撴搷浣淢apper
+ * @createDate 2023-11-08 14:19:52
+ * @Entity com.gs.simple.domain.MesSimplesimple
+ */
+public interface MesSimpleMapper extends BaseMapper<MesSimplesimple> {
+
+}
+
+
+
+
diff --git a/src/main/java/com/gs/simple/service/MesSimpleService.java b/src/main/java/com/gs/simple/service/MesSimpleService.java
new file mode 100644
index 0000000..3ff68de
--- /dev/null
+++ b/src/main/java/com/gs/simple/service/MesSimpleService.java
@@ -0,0 +1,23 @@
+package com.gs.simple.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.gs.simple.common.ResultDto;
+import com.gs.simple.domain.MesSimplesimple;
+import com.gs.simple.domain.TreeView;
+
+import java.util.List;
+
+/**
+ * @author 28567
+ * @description 閽堝琛ㄣ�怣ES_SIMPLE(鑿滃崟缁存姢琛�)銆戠殑鏁版嵁搴撴搷浣淪ervice
+ * @createDate 2023-11-08 14:19:52
+ */
+public interface MesSimpleService extends IService<MesSimplesimple> {
+
+
+ ResultDto<List<TreeView>> getTree();
+
+ List<TreeView> toTree();
+
+ ResultDto<List<MesSimplesimple>> getMenuList();
+}
diff --git a/src/main/java/com/gs/simple/service/impl/MesSimpleServiceImpl.java b/src/main/java/com/gs/simple/service/impl/MesSimpleServiceImpl.java
new file mode 100644
index 0000000..e684a20
--- /dev/null
+++ b/src/main/java/com/gs/simple/service/impl/MesSimpleServiceImpl.java
@@ -0,0 +1,116 @@
+package com.gs.simple.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.gs.simple.common.ResultDto;
+import com.gs.simple.domain.Children;
+import com.gs.simple.domain.MesSimplesimple;
+import com.gs.simple.domain.TreeView;
+import com.gs.simple.mapper.MesSimpleMapper;
+import com.gs.simple.service.MesSimpleService;
+import lombok.RequiredArgsConstructor;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.concurrent.CompletableFuture;
+import java.util.concurrent.Executor;
+import java.util.concurrent.Executors;
+import java.util.stream.Collectors;
+
+/**
+ * @author 28567
+ * @description 閽堝琛ㄣ�怣ES_SIMPLE(鑿滃崟缁存姢琛�)銆戠殑鏁版嵁搴撴搷浣淪ervice瀹炵幇
+ * @createDate 2023-11-08 14:19:52
+ */
+@Service
+@Transactional(rollbackFor = Exception.class)
+@RequiredArgsConstructor
+public class MesSimpleServiceImpl extends ServiceImpl<MesSimpleMapper, MesSimplesimple> implements MesSimpleService {
+
+
+ // 鍒涘缓涓�涓寘鍚�10涓嚎绋嬬殑绾跨▼姹狅紝鐢ㄤ簬鏁版嵁搴撴搷浣�
+ private final Executor dbExecutor = Executors.newFixedThreadPool(10);
+
+ @Override
+ public ResultDto<List<TreeView>> getTree() {
+ List<TreeView> tree = toTree();
+ return ResultDto.ok(tree, tree.size());
+ }
+
+ @Override
+ public List<TreeView> toTree() {
+ return convertToTreeViewList(getTopList());
+ }
+
+ @Override
+ public ResultDto<List<MesSimplesimple>> getMenuList() {
+ LambdaQueryWrapper<MesSimplesimple> wrapper = new LambdaQueryWrapper<>();
+ wrapper.eq(MesSimplesimple::getDisabled, 0).gt(MesSimplesimple::getIsTop, 0);
+ List<MesSimplesimple> list = list(wrapper);
+ return ResultDto.ok(list, list.size());
+ }
+
+ /**
+ * <p>
+ * 鑾峰彇鏍硅妭鐐�
+ * </p>
+ *
+ * @return java.util.List<com.gs.simple.domain.MesSimplesimple>
+ * @author tjx
+ * @date 2023/11/8 14:39
+ */
+ private List<MesSimplesimple> getTopList() {
+ LambdaQueryWrapper<MesSimplesimple> queryWrapper = new LambdaQueryWrapper<>();
+ queryWrapper.eq(MesSimplesimple::getIsTop, 0).eq(MesSimplesimple::getDisabled, 0);
+ return list(queryWrapper);
+ }
+
+ // 灏哅esSimplesimple鍒楄〃杞崲涓篢reeView鍒楄〃
+ private List<TreeView> convertToTreeViewList(List<MesSimplesimple> mesSimplesimpleList) {
+ // 浣跨敤CompletableFuture寮傛澶勭悊姣忎釜MesSimplesimple瀵硅薄锛屽苟鏀堕泦涓轰竴涓狢ompletableFuture鍒楄〃
+ List<CompletableFuture<TreeView>> treeViewFutures = mesSimplesimpleList.stream().map(mesSimplesimple -> convertToTreeViewAsync(mesSimplesimple, dbExecutor)).toList();
+
+ // 鍒涘缓涓�涓狢ompletableFuture锛岀瓑寰呮墍鏈夊紓姝ヤ换鍔″畬鎴�
+ CompletableFuture<Void> allFutures = CompletableFuture.allOf(treeViewFutures.toArray(new CompletableFuture[0]));
+
+ // 鍦ㄦ墍鏈夊紓姝ヤ换鍔″畬鎴愬悗锛屽皢缁撴灉鏀堕泦涓轰竴涓猅reeView鍒楄〃
+ return allFutures.thenApply(v -> treeViewFutures.stream().map(CompletableFuture::join).collect(Collectors.toList())).join();
+ }
+
+ // 灏哅esSimplesimple瀵硅薄杞崲涓篢reeView瀵硅薄锛屽苟浣跨敤鑷畾涔夌嚎绋嬫睜鎵ц寮傛浠诲姟
+ private CompletableFuture<TreeView> convertToTreeViewAsync(MesSimplesimple mesSimplesimple, Executor executor) {
+ return CompletableFuture.supplyAsync(() -> convertToTreeView(mesSimplesimple), executor);
+ }
+
+ private TreeView convertToTreeView(MesSimplesimple mesSimplesimple) {
+ TreeView treeView = new TreeView();
+ treeView.setId(mesSimplesimple.getId());
+ treeView.setTitle(mesSimplesimple.getTitle());
+ treeView.setField(mesSimplesimple.getField());
+ treeView.setSpread(mesSimplesimple.getSpread() == 1);
+
+ //鎼滅储瀛愯妭鐐�
+ LambdaQueryWrapper<MesSimplesimple> wrapper = new LambdaQueryWrapper<>();
+ wrapper.eq(MesSimplesimple::getDisabled, 0).eq(MesSimplesimple::getFid, mesSimplesimple.getId());
+ List<MesSimplesimple> list = list(wrapper);
+
+ List<Children> childrenList = new ArrayList<>();
+ list.forEach(s -> {
+ Children children = new Children();
+ children.setId(s.getId());
+ children.setTitle(s.getTitle());
+ children.setField(s.getField());
+ children.setHref(s.getHref());
+ childrenList.add(children);
+ });
+ treeView.setChildren(childrenList);
+
+ return treeView;
+ }
+}
+
+
+
+
diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml
new file mode 100644
index 0000000..20841c2
--- /dev/null
+++ b/src/main/resources/application.yml
@@ -0,0 +1,70 @@
+server:
+ port: 9091
+
+spring:
+ datasource:
+ type: com.alibaba.druid.pool.DruidDataSource
+ driver-class-name: com.microsoft.sqlserver.jdbc.SQLServerDriver
+ #閾炬帴闅忔剰鏇存崲锛岀洰鍓嶄娇鐢ㄧ殑鏄疭QL Server鏁版嵁搴�
+ url: jdbc:sqlserver://192.168.0.51:1433;databaseName=TEST_MES;encrypt=true;trustServerCertificate=true
+ username: sa
+ password: LanBao@2025
+ druid:
+ # 閰嶇疆鍒濆鍖栧ぇ灏忋�佹渶灏忋�佹渶澶х嚎绋嬫暟
+ initialSize: 5
+ minIdle: 5
+ # CPU鏍告暟+1锛屼篃鍙互澶т簺浣嗕笉瑕佽秴杩�20锛屾暟鎹簱鍔犻攣鏃惰繛鎺ヨ繃澶氭�ц兘涓嬮檷
+ maxActive: 20
+ # 鏈�澶х瓑寰呮椂闂达紝鍐呯綉锛�800锛屽缃戯細1200锛堜笁娆℃彙鎵�1s锛�
+ maxWait: 60000
+ timeBetweenEvictionRunsMillis: 60000
+ # 閰嶇疆涓�涓繛鎺ュ湪姹犱腑鏈�澶х┖闂存椂闂达紝鍗曚綅鏄绉�
+ minEvictableIdleTimeMillis: 300000
+ validationQuery: SELECT 1
+ # 鎸囨槑杩炴帴鏄惁琚┖闂茶繛鎺ュ洖鏀跺櫒(濡傛灉鏈�)杩涜妫�楠�.濡傛灉妫�娴嬪け璐�,鍒欒繛鎺ュ皢琚粠姹犱腑鍘婚櫎.
+ test-while-idle: true
+ # 寤鸿閰嶇疆涓篺alse銆傝幏鍙栬繛鎺ユ椂鎵цvalidationQuery妫�娴嬭繛鎺ユ槸鍚︽湁鏁堬紝杩欎釜閰嶇疆浼氶檷浣庢�ц兘銆�
+ test-on-borrow: false
+ # 寤鸿閰嶇疆涓篺alse銆傝幏鍙栬繛鎺ユ椂鎵цvalidationQuery妫�娴嬭繛鎺ユ槸鍚︽湁鏁堬紝杩欎釜閰嶇疆浼氶檷浣庢�ц兘銆�
+ test-on-return: false
+ # 鍙互鏀寔PSCache锛堟彁鍗囧啓鍏ャ�佹煡璇㈡晥鐜囷級
+ poolPreparedStatements: true
+ # 閰嶇疆鐩戞帶缁熻鎷︽埅鐨刦ilters锛屽幓鎺夊悗鐩戞帶鐣岄潰sql鏃犳硶缁熻锛�'wall'鐢ㄤ簬闃茬伀澧�
+ filters: stat,wall,log4j
+ # 淇濇寔闀胯繛鎺�
+ keepAlive: true
+ maxPoolPreparedStatementPerConnectionSize: 20
+ useGlobalDataSourceStat: true
+ connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=500
+ # 闃插尽SQL娉ㄥ叆
+ filter:
+ wall:
+ config:
+ multi-statement-allow: true
+
+custom:
+ datasource:
+ url: '@custom.datasource.url@'
+ username: '@custom.datasource.username@'
+ password: '@custom.datasource.password@'
+
+# mybatis-plus鐩稿叧閰嶇疆
+mybatis-plus:
+ global-config:
+ db-config:
+ # 涓婚敭绫诲瀷 AUTO:"鏁版嵁搴揑D鑷"
+ # INPUT:"鐢ㄦ埛杈撳叆ID",
+ # ID_WORKER:"鍏ㄥ眬鍞竴ID (鏁板瓧绫诲瀷鍞竴ID)",
+ # UUID:"鍏ㄥ眬鍞竴ID UUID";
+ id-type: AUTO
+ configuration:
+ #寮�鍚痵ql鏃ュ織
+ log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
+ # 鏄惁寮�鍚嚜鍔ㄩ┘宄板懡鍚嶈鍒欐槧灏�:浠庢暟鎹簱鍒楀悕鍒癑ava灞炴�ч┘宄板懡鍚嶇殑绫讳技鏄犲皠
+ map-underscore-to-camel-case: true
+ # 瑙e喅SQL Server鏇存柊鏁版嵁涓簄ull鏃舵棤娉曡浆鎹㈡姤閿�
+ jdbc-type-for-null: 'null'
+ #瀹炰綋绫绘墍鍦ㄥ寘
+ type-aliases-package: com.gs.simple.domain.*
+ # xml鎵弿锛屽涓洰褰曠敤閫楀彿鎴栬�呭垎鍙峰垎闅旓紙鍛婅瘔 Mapper 鎵�瀵瑰簲鐨� XML 鏂囦欢浣嶇疆锛�
+ mapper-locations: classpath:mapper/*.xml
\ No newline at end of file
diff --git a/src/main/resources/mapper/MesSimpleMapper.xml b/src/main/resources/mapper/MesSimpleMapper.xml
new file mode 100644
index 0000000..ba9fc9b
--- /dev/null
+++ b/src/main/resources/mapper/MesSimpleMapper.xml
@@ -0,0 +1,7 @@
+<?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.gs.simple.mapper.MesSimpleMapper">
+
+</mapper>
diff --git a/src/main/startup.bat b/src/main/startup.bat
new file mode 100644
index 0000000..bfa3f54
--- /dev/null
+++ b/src/main/startup.bat
@@ -0,0 +1,10 @@
+@echo off
+set JAVA_HOME=C:\Program Files\Java\jdk-17
+set PATH=%JAVA_HOME%\bin;%PATH%
+
+
+java -jar -Dspring.datasource.url="jdbc:sqlserver://192.168.0.51:1433;databaseName=TEST_MES;encrypt=true;trustServerCertificate=true" -Dspring.datasource.username=sa -Dspring.datasource.password="LanBao@2025" simple.jar
+
+pause
+
+attrib +r %0
\ No newline at end of file
diff --git a/src/test/java/com/gs/simple/SimpleApplicationTests.java b/src/test/java/com/gs/simple/SimpleApplicationTests.java
new file mode 100644
index 0000000..78a8361
--- /dev/null
+++ b/src/test/java/com/gs/simple/SimpleApplicationTests.java
@@ -0,0 +1,13 @@
+package com.gs.simple;
+
+import org.junit.jupiter.api.Test;
+import org.springframework.boot.test.context.SpringBootTest;
+
+@SpringBootTest
+class SimpleApplicationTests {
+
+ @Test
+ void contextLoads() {
+ }
+
+}
--
Gitblit v1.9.3