网页版
This commit is contained in:
		| @ -41,7 +41,7 @@ import java.util.List; | |||||||
| import java.util.Map; | import java.util.Map; | ||||||
| import java.util.stream.Collectors; | import java.util.stream.Collectors; | ||||||
|  |  | ||||||
| @Tag(name = "图标库管理") | @Tag(name = "图标数据管理") | ||||||
| @CheckAuth | @CheckAuth | ||||||
| @RestController | @RestController | ||||||
| @RequestMapping("/iconLibrary") | @RequestMapping("/iconLibrary") | ||||||
|  | |||||||
| @ -41,7 +41,7 @@ import java.util.List; | |||||||
| import java.util.Map; | import java.util.Map; | ||||||
| import java.util.stream.Collectors; | import java.util.stream.Collectors; | ||||||
|  |  | ||||||
| @Tag(name = "军标库管理") | @Tag(name = "军标数据管理") | ||||||
| @CheckAuth | @CheckAuth | ||||||
| @RestController | @RestController | ||||||
| @RequestMapping("/militaryLibrary") | @RequestMapping("/militaryLibrary") | ||||||
|  | |||||||
| @ -41,7 +41,7 @@ import java.time.LocalDateTime; | |||||||
| import java.util.*; | import java.util.*; | ||||||
| import java.util.stream.Collectors; | import java.util.stream.Collectors; | ||||||
|  |  | ||||||
| @Tag(name = "模型库管理") | @Tag(name = "模型数据管理") | ||||||
| @CheckAuth | @CheckAuth | ||||||
| @RestController | @RestController | ||||||
| @RequestMapping("/modelLibrary") | @RequestMapping("/modelLibrary") | ||||||
|  | |||||||
| @ -5,6 +5,7 @@ import cn.hutool.core.lang.UUID; | |||||||
| import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; | import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; | ||||||
| import com.yj.earth.annotation.RoleAccess; | import com.yj.earth.annotation.RoleAccess; | ||||||
| import com.yj.earth.business.domain.WebSource; | import com.yj.earth.business.domain.WebSource; | ||||||
|  | import com.yj.earth.business.service.ModelLibraryService; | ||||||
| import com.yj.earth.business.service.SourceService; | import com.yj.earth.business.service.SourceService; | ||||||
| import com.yj.earth.business.service.WebSourceService; | import com.yj.earth.business.service.WebSourceService; | ||||||
| import com.yj.earth.common.util.ApiResponse; | import com.yj.earth.common.util.ApiResponse; | ||||||
| @ -25,7 +26,7 @@ import java.util.List; | |||||||
| import java.util.stream.Collectors; | import java.util.stream.Collectors; | ||||||
| import java.util.stream.Stream; | import java.util.stream.Stream; | ||||||
|  |  | ||||||
| @Tag(name = "网页版独有接口") | @Tag(name = "网页独有接口") | ||||||
| @RestController | @RestController | ||||||
| @RequestMapping("/webSource") | @RequestMapping("/webSource") | ||||||
| public class WebSourceController { | public class WebSourceController { | ||||||
| @ -35,6 +36,8 @@ public class WebSourceController { | |||||||
|     @Resource |     @Resource | ||||||
|     private WebSourceService webSourceService; |     private WebSourceService webSourceService; | ||||||
|     @Resource |     @Resource | ||||||
|  |     private ModelLibraryController modelLibraryController; | ||||||
|  |     @Resource | ||||||
|     private SourceService sourceService; |     private SourceService sourceService; | ||||||
|     private static final List<String> SUPPORT_EXTENSIONS = Arrays.asList("clt", "mbtiles", "pak", "pbf", "model"); |     private static final List<String> SUPPORT_EXTENSIONS = Arrays.asList("clt", "mbtiles", "pak", "pbf", "model"); | ||||||
|  |  | ||||||
| @ -60,7 +63,7 @@ public class WebSourceController { | |||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     @Operation(summary = "获取所有文件") |     @Operation(summary = "获取资源") | ||||||
|     @GetMapping("/list") |     @GetMapping("/list") | ||||||
|     public ApiResponse list(@RequestParam(required = false) @Parameter(description = "文件类型") String type) { |     public ApiResponse list(@RequestParam(required = false) @Parameter(description = "文件类型") String type) { | ||||||
|         if (type != null) { |         if (type != null) { | ||||||
| @ -94,6 +97,11 @@ public class WebSourceController { | |||||||
|         if (!webSource.getType().equals("pbf") && !webSource.getType().equals("model")) { |         if (!webSource.getType().equals("pbf") && !webSource.getType().equals("model")) { | ||||||
|             addModelSourceIfNotExists(filePath); |             addModelSourceIfNotExists(filePath); | ||||||
|         } |         } | ||||||
|  |  | ||||||
|  |         // 如果是模型文件则直接调用导入 | ||||||
|  |         if (webSource.getType().equals("model")) { | ||||||
|  |             modelLibraryController.importModelLibrary(filePath); | ||||||
|  |         } | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     /** |     /** | ||||||
|  | |||||||
| @ -3,14 +3,6 @@ package com.yj.earth.business.service; | |||||||
| import com.yj.earth.business.domain.ModelLibrary; | import com.yj.earth.business.domain.ModelLibrary; | ||||||
| import com.baomidou.mybatisplus.extension.service.IService; | import com.baomidou.mybatisplus.extension.service.IService; | ||||||
|  |  | ||||||
| /** |  | ||||||
|  * <p> |  | ||||||
|  *  服务类 |  | ||||||
|  * </p> |  | ||||||
|  * |  | ||||||
|  * @author 周志雄 |  | ||||||
|  * @since 2025-09-17 |  | ||||||
|  */ |  | ||||||
| public interface ModelLibraryService extends IService<ModelLibrary> { | public interface ModelLibraryService extends IService<ModelLibrary> { | ||||||
|  |  | ||||||
| } | } | ||||||
|  | |||||||
| @ -28,7 +28,6 @@ public class SaTokenConfig implements WebMvcConfigurer { | |||||||
|         excludePathPatterns.add("/data/mbtiles/**"); |         excludePathPatterns.add("/data/mbtiles/**"); | ||||||
|         excludePathPatterns.add("/data/pak/**"); |         excludePathPatterns.add("/data/pak/**"); | ||||||
|         excludePathPatterns.add("/systemService/**"); |         excludePathPatterns.add("/systemService/**"); | ||||||
|         excludePathPatterns.add("/**"); |  | ||||||
|  |  | ||||||
|         // 注册 Sa-Token 拦截器 |         // 注册 Sa-Token 拦截器 | ||||||
|         registry.addInterceptor(new SaInterceptor(handle -> { |         registry.addInterceptor(new SaInterceptor(handle -> { | ||||||
|  | |||||||
| @ -1,152 +0,0 @@ | |||||||
| package com.yj.earth.common.util; |  | ||||||
|  |  | ||||||
| import okhttp3.OkHttpClient; |  | ||||||
| import okhttp3.Request; |  | ||||||
| import okhttp3.Response; |  | ||||||
| import java.io.IOException; |  | ||||||
| import java.util.concurrent.*; |  | ||||||
| import java.util.concurrent.atomic.AtomicInteger; |  | ||||||
|  |  | ||||||
| /** |  | ||||||
|  * 并发HTTP请求测试工具 |  | ||||||
|  * 目标地址:192.168.110.25:8848/modelLibrary/data/model/1066/glb |  | ||||||
|  */ |  | ||||||
| public class ConcurrentHttpRequestTest { |  | ||||||
|  |  | ||||||
|     // ====================== 测试参数配置(可根据需求调整)====================== |  | ||||||
|     // 目标请求URL |  | ||||||
|     private static final String TARGET_URL = "http://192.168.110.25:8848/modelLibrary/data/model/1066/glb"; |  | ||||||
|     // 并发线程数(如模拟100个并发,设置为100) |  | ||||||
|     private static final int CONCURRENT_THREADS = 50; |  | ||||||
|     // 每个线程发送的请求次数(如每个线程发10次,总请求数=50*10=500) |  | ||||||
|     private static final int REQUESTS_PER_THREAD = 10; |  | ||||||
|     // HTTP请求超时时间(毫秒) |  | ||||||
|     private static final int HTTP_CONNECT_TIMEOUT = 3000; |  | ||||||
|     private static final int HTTP_READ_TIMEOUT = 5000; |  | ||||||
|  |  | ||||||
|     // ====================== 统计指标(线程安全)====================== |  | ||||||
|     // 成功请求数 |  | ||||||
|     private static final AtomicInteger SUCCESS_COUNT = new AtomicInteger(0); |  | ||||||
|     // 失败请求数 |  | ||||||
|     private static final AtomicInteger FAIL_COUNT = new AtomicInteger(0); |  | ||||||
|     // 总耗时(毫秒) |  | ||||||
|     private static long TOTAL_TIME = 0; |  | ||||||
|  |  | ||||||
|  |  | ||||||
|     public static void main(String[] args) { |  | ||||||
|         System.out.println("===================== 并发请求测试开始 ====================="); |  | ||||||
|         System.out.printf("测试配置:并发线程数=%d,单线程请求数=%d,总请求数=%d%n", |  | ||||||
|                 CONCURRENT_THREADS, REQUESTS_PER_THREAD, CONCURRENT_THREADS * REQUESTS_PER_THREAD); |  | ||||||
|         System.out.printf("目标URL:%s%n", TARGET_URL); |  | ||||||
|         System.out.println("----------------------------------------------------------"); |  | ||||||
|  |  | ||||||
|         // 1. 初始化OkHttp客户端(复用连接池,减少连接创建开销) |  | ||||||
|         OkHttpClient okHttpClient = new OkHttpClient.Builder() |  | ||||||
|                 .connectTimeout(HTTP_CONNECT_TIMEOUT, TimeUnit.MILLISECONDS) |  | ||||||
|                 .readTimeout(HTTP_READ_TIMEOUT, TimeUnit.MILLISECONDS) |  | ||||||
|                 .connectionPool(new okhttp3.ConnectionPool( |  | ||||||
|                         50, // 最大空闲连接数(建议不小于并发线程数) |  | ||||||
|                         5, TimeUnit.MINUTES // 连接空闲超时 |  | ||||||
|                 )) |  | ||||||
|                 .build(); |  | ||||||
|  |  | ||||||
|         // 2. 初始化线程池(固定线程数,匹配并发需求) |  | ||||||
|         ExecutorService executorService = Executors.newFixedThreadPool(CONCURRENT_THREADS); |  | ||||||
|         // 倒计时锁:等待所有线程执行完成 |  | ||||||
|         CountDownLatch countDownLatch = new CountDownLatch(CONCURRENT_THREADS); |  | ||||||
|  |  | ||||||
|         // 3. 记录测试开始时间 |  | ||||||
|         long startTime = System.currentTimeMillis(); |  | ||||||
|  |  | ||||||
|         // 4. 提交并发任务(每个任务对应一个线程) |  | ||||||
|         for (int i = 0; i < CONCURRENT_THREADS; i++) { |  | ||||||
|             int threadIndex = i + 1; // 线程编号(方便日志区分) |  | ||||||
|             executorService.submit(() -> { |  | ||||||
|                 try { |  | ||||||
|                     // 单个线程执行指定次数的请求 |  | ||||||
|                     for (int j = 0; j < REQUESTS_PER_THREAD; j++) { |  | ||||||
|                         int requestIndex = j + 1; // 请求编号 |  | ||||||
|                         sendRequest(okHttpClient, threadIndex, requestIndex); |  | ||||||
|                     } |  | ||||||
|                 } finally { |  | ||||||
|                     // 线程任务完成,倒计时减1 |  | ||||||
|                     countDownLatch.countDown(); |  | ||||||
|                 } |  | ||||||
|             }); |  | ||||||
|         } |  | ||||||
|  |  | ||||||
|         // 5. 等待所有线程完成(阻塞直到所有任务结束) |  | ||||||
|         try { |  | ||||||
|             countDownLatch.await(); |  | ||||||
|         } catch (InterruptedException e) { |  | ||||||
|             Thread.currentThread().interrupt(); |  | ||||||
|             System.err.println("测试被中断:" + e.getMessage()); |  | ||||||
|         } |  | ||||||
|  |  | ||||||
|         // 6. 计算测试结果 |  | ||||||
|         long endTime = System.currentTimeMillis(); |  | ||||||
|         TOTAL_TIME = endTime - startTime; |  | ||||||
|         printTestResult(); |  | ||||||
|  |  | ||||||
|         // 7. 释放资源 |  | ||||||
|         executorService.shutdown(); |  | ||||||
|         okHttpClient.connectionPool().evictAll(); // 清空连接池 |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     /** |  | ||||||
|      * 发送单个HTTP GET请求 |  | ||||||
|      * @param okHttpClient OkHttp客户端(复用) |  | ||||||
|      * @param threadIndex 线程编号 |  | ||||||
|      * @param requestIndex 该线程内的请求编号 |  | ||||||
|      */ |  | ||||||
|     private static void sendRequest(OkHttpClient okHttpClient, int threadIndex, int requestIndex) { |  | ||||||
|         // 构建请求(若需要Headers,可在此处添加,如Token、Cookie等) |  | ||||||
|         Request request = new Request.Builder() |  | ||||||
|                 .url(TARGET_URL) |  | ||||||
|                 .get() // GET请求(目标接口是GET,无需Body) |  | ||||||
|                 .build(); |  | ||||||
|  |  | ||||||
|         long requestStartTime = System.currentTimeMillis(); |  | ||||||
|         try (Response response = okHttpClient.newCall(request).execute()) { |  | ||||||
|             // 判定请求成功:响应码200-299,且响应体非空(根据你的接口实际情况调整) |  | ||||||
|             if (response.isSuccessful() && response.body() != null) { |  | ||||||
|                 // 读取响应体(避免连接泄漏,即使不需要内容也建议读取后关闭) |  | ||||||
|                 byte[] responseBody = response.body().bytes(); |  | ||||||
|                 long requestCostTime = System.currentTimeMillis() - requestStartTime; |  | ||||||
|                 SUCCESS_COUNT.incrementAndGet(); |  | ||||||
|                 System.out.printf("[线程%d-请求%d] 成功 | 响应码:%d | 响应体大小:%dB | 耗时:%dms%n", |  | ||||||
|                         threadIndex, requestIndex, response.code(), responseBody.length, requestCostTime); |  | ||||||
|             } else { |  | ||||||
|                 // 响应码非成功(如404、500) |  | ||||||
|                 FAIL_COUNT.incrementAndGet(); |  | ||||||
|                 System.err.printf("[线程%d-请求%d] 失败 | 响应码:%d | 原因:%s%n", |  | ||||||
|                         threadIndex, requestIndex, response.code(), response.message()); |  | ||||||
|             } |  | ||||||
|         } catch (Exception e) { |  | ||||||
|             // 网络异常(超时、连接拒绝、IO错误等) |  | ||||||
|             FAIL_COUNT.incrementAndGet(); |  | ||||||
|             System.err.printf("[线程%d-请求%d] 异常 | 原因:%s%n", |  | ||||||
|                     threadIndex, requestIndex, e.getMessage()); |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     /** |  | ||||||
|      * 打印测试结果(核心指标统计) |  | ||||||
|      */ |  | ||||||
|     private static void printTestResult() { |  | ||||||
|         System.out.println("=========================================================="); |  | ||||||
|         System.out.println("===================== 测试结果汇总 ====================="); |  | ||||||
|         int totalRequests = SUCCESS_COUNT.get() + FAIL_COUNT.get(); |  | ||||||
|         double successRate = totalRequests == 0 ? 0 : (SUCCESS_COUNT.get() * 100.0) / totalRequests; |  | ||||||
|         double avgTimePerRequest = totalRequests == 0 ? 0 : (TOTAL_TIME * 1.0) / totalRequests; |  | ||||||
|         double qps = totalRequests == 0 ? 0 : (totalRequests * 1000.0) / TOTAL_TIME; // 每秒请求数 |  | ||||||
|  |  | ||||||
|         System.out.printf("总请求数:%d%n", totalRequests); |  | ||||||
|         System.out.printf("成功请求数:%d | 失败请求数:%d%n", SUCCESS_COUNT.get(), FAIL_COUNT.get()); |  | ||||||
|         System.out.printf("成功率:%.2f%%%n", successRate); |  | ||||||
|         System.out.printf("总耗时:%dms%n", TOTAL_TIME); |  | ||||||
|         System.out.printf("平均请求耗时:%.2fms%n", avgTimePerRequest); |  | ||||||
|         System.out.printf("QPS(每秒请求数):%.2f%n", qps); |  | ||||||
|         System.out.println("=========================================================="); |  | ||||||
|     } |  | ||||||
| } |  | ||||||
		Reference in New Issue
	
	Block a user
	 ZZX9599
					ZZX9599