tjx
2025-11-10 0fd4d12cddba6be0d46d779142da121c2321044c
初始化
已修改1个文件
已添加18个文件
863 ■■■■■ 文件已修改
CLAUDE.md 92 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
MES_SIMPLE_CREATE_TABLE.sql 155 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
README.md 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
pom.xml 90 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/gs/simple/SimpleApplication.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/gs/simple/common/DatabaseConfig.java 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/gs/simple/common/ResultDto.java 69 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/gs/simple/controller/SimpleController.java 35 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/gs/simple/domain/BiView.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/gs/simple/domain/Children.java 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/gs/simple/domain/MesSimplesimple.java 59 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/gs/simple/domain/TreeView.java 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/gs/simple/mapper/MesSimpleMapper.java 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/gs/simple/service/MesSimpleService.java 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/gs/simple/service/impl/MesSimpleServiceImpl.java 116 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/application.yml 70 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/MesSimpleMapper.xml 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/startup.bat 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/test/java/com/gs/simple/SimpleApplicationTests.java 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
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
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,
    -- çˆ¶èŠ‚ç‚¹id
    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'父节点id',
    @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;
README.md
@@ -1,4 +1,2 @@
## LBKBSql_Service
轮播看板后台
# gs-simple
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>
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);
    }
}
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)));
    }
}
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;
    }
}
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();
    }
}
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;
}
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;
}
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;
    /**
     * çˆ¶èŠ‚ç‚¹id
     */
    private Long fid;
    /**
     * åç§°
     */
    private String title;
    /**
     * è‹±æ–‡å
     */
    private String field;
    /**
     * åœ°å€
     */
    private String href;
    /**
     * èŠ‚ç‚¹æ˜¯å¦åˆå§‹å±•å¼€ 0为不展开,1为展开
     */
    private Integer spread;
    /**
     * èŠ‚ç‚¹æ˜¯å¦ä¸ºå±•ç¤º 0为展示,1为不展示
     */
    private Integer disabled;
}
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;
}
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 é’ˆå¯¹è¡¨ã€MES_SIMPLE(菜单维护表)】的数据库操作Mapper
 * @createDate 2023-11-08 14:19:52
 * @Entity com.gs.simple.domain.MesSimplesimple
 */
public interface MesSimpleMapper extends BaseMapper<MesSimplesimple> {
}
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 é’ˆå¯¹è¡¨ã€MES_SIMPLE(菜单维护表)】的数据库操作Service
 * @createDate 2023-11-08 14:19:52
 */
public interface MesSimpleService extends IService<MesSimplesimple> {
    ResultDto<List<TreeView>> getTree();
    List<TreeView> toTree();
    ResultDto<List<MesSimplesimple>> getMenuList();
}
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 é’ˆå¯¹è¡¨ã€MES_SIMPLE(菜单维护表)】的数据库操作Service实现
 * @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);
    }
    // å°†MesSimplesimple列表转换为TreeView列表
    private List<TreeView> convertToTreeViewList(List<MesSimplesimple> mesSimplesimpleList) {
        // ä½¿ç”¨CompletableFuture异步处理每个MesSimplesimple对象,并收集为一个CompletableFuture列表
        List<CompletableFuture<TreeView>> treeViewFutures = mesSimplesimpleList.stream().map(mesSimplesimple -> convertToTreeViewAsync(mesSimplesimple, dbExecutor)).toList();
        // åˆ›å»ºä¸€ä¸ªCompletableFuture,等待所有异步任务完成
        CompletableFuture<Void> allFutures = CompletableFuture.allOf(treeViewFutures.toArray(new CompletableFuture[0]));
        // åœ¨æ‰€æœ‰å¼‚步任务完成后,将结果收集为一个TreeView列表
        return allFutures.thenApply(v -> treeViewFutures.stream().map(CompletableFuture::join).collect(Collectors.toList())).join();
    }
    // å°†MesSimplesimple对象转换为TreeView对象,并使用自定义线程池执行异步任务
    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;
    }
}
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
    #链接随意更换,目前使用的是SQL 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
      # å»ºè®®é…ç½®ä¸ºfalse。获取连接时执行validationQuery检测连接是否有效,这个配置会降低性能。
      test-on-borrow: false
      # å»ºè®®é…ç½®ä¸ºfalse。获取连接时执行validationQuery检测连接是否有效,这个配置会降低性能。
      test-on-return: false
      #     å¯ä»¥æ”¯æŒPSCache(提升写入、查询效率)
      poolPreparedStatements: true
      #   é…ç½®ç›‘控统计拦截的filters,去掉后监控界面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:"数据库ID自增"
      # INPUT:"用户输入ID",
      # ID_WORKER:"全局唯一ID (数字类型唯一ID)",
      # UUID:"全局唯一ID UUID";
      id-type: AUTO
  configuration:
    #开启sql日志
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
    # æ˜¯å¦å¼€å¯è‡ªåŠ¨é©¼å³°å‘½åè§„åˆ™æ˜ å°„:从数据库列名到Java属性驼峰命名的类似映射
    map-underscore-to-camel-case: true
    # è§£å†³SQL Server更新数据为null时无法转换报错
    jdbc-type-for-null: 'null'
  #实体类所在包
  type-aliases-package: com.gs.simple.domain.*
  # xml扫描,多个目录用逗号或者分号分隔(告诉 Mapper æ‰€å¯¹åº”çš„ XML æ–‡ä»¶ä½ç½®ï¼‰
  mapper-locations: classpath:mapper/*.xml
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>
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
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() {
    }
}