diff --git a/backend/logs/agricultural-stock-platform.log b/backend/logs/agricultural-stock-platform.log new file mode 100644 index 0000000..18a6b80 --- /dev/null +++ b/backend/logs/agricultural-stock-platform.log @@ -0,0 +1,19 @@ +2025-06-21 15:10:59 [main] INFO c.a.s.AgriculturalStockPlatformApplication - Starting AgriculturalStockPlatformApplication using Java 17.0.10 on WIN11 with PID 11416 (D:\VScodeProject\work_4\backend\target\classes started by shenjianZ in D:\VScodeProject\work_4\backend) +2025-06-21 15:10:59 [main] INFO c.a.s.AgriculturalStockPlatformApplication - No active profile set, falling back to 1 default profile: "default" +2025-06-21 15:11:00 [main] INFO o.a.catalina.core.StandardService - Starting service [Tomcat] +2025-06-21 15:11:00 [main] INFO o.a.catalina.core.StandardEngine - Starting Servlet engine: [Apache Tomcat/9.0.63] +2025-06-21 15:11:00 [main] INFO o.a.c.c.C.[Tomcat].[localhost].[/] - Initializing Spring embedded WebApplicationContext +2025-06-21 15:11:01 [main] INFO o.h.jpa.internal.util.LogHelper - HHH000204: Processing PersistenceUnitInfo [name: default] +2025-06-21 15:11:01 [main] INFO org.hibernate.Version - HHH000412: Hibernate ORM core version 5.6.9.Final +2025-06-21 15:11:01 [main] INFO o.h.annotations.common.Version - HCANN000001: Hibernate Commons Annotations {5.1.2.Final} +2025-06-21 15:11:01 [main] INFO com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Starting... +2025-06-21 15:11:01 [main] INFO com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Start completed. +2025-06-21 15:11:01 [main] INFO org.hibernate.dialect.Dialect - HHH000400: Using dialect: org.hibernate.dialect.MySQL8Dialect +2025-06-21 15:11:02 [main] INFO o.h.e.t.j.p.i.JtaPlatformInitiator - HHH000490: Using JtaPlatform implementation: [org.hibernate.engine.transaction.jta.platform.internal.NoJtaPlatform] +2025-06-21 15:11:03 [main] WARN o.s.b.a.o.j.JpaBaseConfiguration$JpaWebConfiguration - spring.jpa.open-in-view is enabled by default. Therefore, database queries may be performed during view rendering. Explicitly configure spring.jpa.open-in-view to disable this warning +2025-06-21 15:11:04 [main] WARN c.b.m.core.metadata.TableInfoHelper - Can not find table primary key in Class: "com.agricultural.stock.entity.TechnicalIndicator". +2025-06-21 15:11:04 [main] WARN c.b.m.c.injector.DefaultSqlInjector - class com.agricultural.stock.entity.TechnicalIndicator ,Not found @TableId annotation, Cannot use Mybatis-Plus 'xxById' Method. +2025-06-21 15:11:04 [main] INFO c.a.s.AgriculturalStockPlatformApplication - Started AgriculturalStockPlatformApplication in 5.394 seconds (JVM running for 5.767) +2025-06-21 15:11:08 [http-nio-8080-exec-1] INFO o.a.c.c.C.[Tomcat].[localhost].[/] - Initializing Spring DispatcherServlet 'dispatcherServlet' +2025-06-21 15:14:01 [SpringApplicationShutdownHook] INFO com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Shutdown initiated... +2025-06-21 15:14:01 [SpringApplicationShutdownHook] INFO com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Shutdown completed. diff --git a/backend/src/main/java/com/agricultural/stock/config/OpenApiConfig.java b/backend/src/main/java/com/agricultural/stock/config/OpenApiConfig.java index 3027b03..a6cae93 100644 --- a/backend/src/main/java/com/agricultural/stock/config/OpenApiConfig.java +++ b/backend/src/main/java/com/agricultural/stock/config/OpenApiConfig.java @@ -7,7 +7,9 @@ import io.swagger.v3.oas.models.info.License; import io.swagger.v3.oas.models.servers.Server; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import org.springdoc.core.GroupedOpenApi; +import java.util.Arrays; import java.util.List; /** @@ -40,7 +42,7 @@ public class OpenApiConfig { .license(new License() .name("MIT License") .url("https://opensource.org/licenses/MIT"))) - .servers(List.of( + .servers(Arrays.asList( new Server() .url("http://localhost:8080") .description("本地开发环境"), @@ -49,4 +51,28 @@ public class OpenApiConfig { .description("生产环境") )); } + + @Bean + public GroupedOpenApi allApi() { + return GroupedOpenApi.builder() + .group("all-apis") + .pathsToMatch("/**") + .build(); + } + + @Bean + public GroupedOpenApi stockApi() { + return GroupedOpenApi.builder() + .group("stock-apis") + .pathsToMatch("/api/stock/**") + .build(); + } + + @Bean + public GroupedOpenApi marketApi() { + return GroupedOpenApi.builder() + .group("market-apis") + .pathsToMatch("/api/market/**") + .build(); + } } \ No newline at end of file diff --git a/backend/src/main/java/com/agricultural/stock/controller/StockController.java b/backend/src/main/java/com/agricultural/stock/controller/StockController.java index 36ea2a0..7af32b2 100644 --- a/backend/src/main/java/com/agricultural/stock/controller/StockController.java +++ b/backend/src/main/java/com/agricultural/stock/controller/StockController.java @@ -167,6 +167,26 @@ public class StockController { } } + /** + * 获取股票详情 + */ + @GetMapping("/detail/{stockCode}") + @Operation(summary = "获取股票详情") + public Result getStockDetail( + @Parameter(description = "股票代码") @PathVariable String stockCode) { + try { + StockData stockDetail = stockService.getStockDetail(stockCode); + if (stockDetail != null) { + return Result.success(stockDetail); + } else { + return Result.error("未找到该股票的详情数据"); + } + } catch (Exception e) { + log.error("获取股票{}详情失败", stockCode, e); + return Result.error("获取股票详情失败: " + e.getMessage()); + } + } + /** * 搜索股票 */ diff --git a/backend/src/main/java/com/agricultural/stock/service/StockService.java b/backend/src/main/java/com/agricultural/stock/service/StockService.java index ac2eecd..07827fd 100644 --- a/backend/src/main/java/com/agricultural/stock/service/StockService.java +++ b/backend/src/main/java/com/agricultural/stock/service/StockService.java @@ -79,6 +79,14 @@ public interface StockService { * @return 预测数据列表 */ List getStockPrediction(String stockCode, Integer days); + + /** + * 获取股票详情 + * + * @param stockCode 股票代码 + * @return 股票详情 + */ + StockData getStockDetail(String stockCode); /** * 搜索股票 diff --git a/backend/src/main/java/com/agricultural/stock/service/impl/StockServiceImpl.java b/backend/src/main/java/com/agricultural/stock/service/impl/StockServiceImpl.java index 37c1f0f..c20d18c 100644 --- a/backend/src/main/java/com/agricultural/stock/service/impl/StockServiceImpl.java +++ b/backend/src/main/java/com/agricultural/stock/service/impl/StockServiceImpl.java @@ -251,9 +251,174 @@ public class StockServiceImpl implements StockService { @Override public List getStockPrediction(String stockCode, Integer days) { - // 这里应该调用预测模型,暂时返回空列表 - log.info("股票预测功能暂未实现,股票代码: {}, 预测天数: {}", stockCode, days); - return new ArrayList<>(); + try { + log.info("生成股票预测数据,股票代码: {}, 预测天数: {}", stockCode, days); + + // 获取历史数据用于预测 + List historyData = stockDataMapper.getStockHistoryData(stockCode, 30); + + if (historyData.isEmpty()) { + log.warn("未找到股票{}的历史数据,无法生成预测", stockCode); + return new ArrayList<>(); + } + + // 获取最新数据作为预测基础 + StockData latestData = historyData.get(0); // getStockHistoryData返回的是按时间降序排列 + + // 计算历史价格变化趋势 + BigDecimal avgChange = calculateAverageChange(historyData); + BigDecimal volatility = calculateVolatility(historyData); + + List predictionList = new ArrayList<>(); + + // 生成预测数据 + BigDecimal currentPrice = latestData.getClosePrice(); + LocalDateTime currentDate = LocalDateTime.now(); + + for (int i = 1; i <= days; i++) { + StockData prediction = new StockData(); + + // 基本信息 + prediction.setStockCode(stockCode); + prediction.setStockName(latestData.getStockName()); + prediction.setTradeDate(currentDate.plusDays(i)); + + // 简单预测模型:基于历史平均变化和随机波动 + BigDecimal randomFactor = BigDecimal.valueOf((Math.random() - 0.5) * 2 * volatility.doubleValue()); + BigDecimal predictedChange = avgChange.add(randomFactor); + + // 计算预测价格 + BigDecimal predictedPrice = currentPrice.multiply( + BigDecimal.ONE.add(predictedChange.divide(BigDecimal.valueOf(100), 4, RoundingMode.HALF_UP)) + ); + + prediction.setOpenPrice(currentPrice); + prediction.setHighPrice(predictedPrice.multiply(BigDecimal.valueOf(1.05))); + prediction.setLowPrice(predictedPrice.multiply(BigDecimal.valueOf(0.95))); + prediction.setClosePrice(predictedPrice); + + // 计算涨跌幅 + BigDecimal changeAmount = predictedPrice.subtract(currentPrice); + BigDecimal changePercent = changeAmount.divide(currentPrice, 4, RoundingMode.HALF_UP) + .multiply(BigDecimal.valueOf(100)); + + prediction.setChangeAmount(changeAmount); + prediction.setChangePercent(changePercent); + + // 预测成交量(基于历史平均值) + double avgVolume = historyData.stream() + .map(StockData::getVolume) + .filter(Objects::nonNull) + .mapToLong(Long::longValue) + .average() + .orElse(100000L); + + prediction.setVolume(Math.round(avgVolume * (0.8 + Math.random() * 0.4))); + + // 预测成交额 + if (prediction.getVolume() != null) { + prediction.setTurnover(predictedPrice.multiply(BigDecimal.valueOf(prediction.getVolume()))); + } + + // 市值 + if (latestData.getMarketCap() != null && latestData.getClosePrice() != null && latestData.getClosePrice().compareTo(BigDecimal.ZERO) != 0) { + prediction.setMarketCap(latestData.getMarketCap() + .multiply(predictedPrice) + .divide(latestData.getClosePrice(), 2, RoundingMode.HALF_UP)); + } + + predictionList.add(prediction); + currentPrice = predictedPrice; // 更新当前价格为下一天的基础 + } + + return predictionList; + + } catch (Exception e) { + log.error("生成股票{}预测数据失败", stockCode, e); + return new ArrayList<>(); + } + } + + /** + * 计算历史价格平均变化率 + */ + private BigDecimal calculateAverageChange(List historyData) { + if (historyData.size() < 2) { + return BigDecimal.ZERO; + } + + BigDecimal totalChange = BigDecimal.ZERO; + int count = 0; + + // 数据是按时间降序排列的,所以要反过来计算 + for (int i = historyData.size() - 1; i > 0; i--) { + StockData current = historyData.get(i - 1); // 更新的数据 + StockData previous = historyData.get(i); // 更早的数据 + + if (current.getClosePrice() != null && previous.getClosePrice() != null && previous.getClosePrice().compareTo(BigDecimal.ZERO) != 0) { + BigDecimal change = current.getClosePrice().subtract(previous.getClosePrice()) + .divide(previous.getClosePrice(), 4, RoundingMode.HALF_UP) + .multiply(BigDecimal.valueOf(100)); + totalChange = totalChange.add(change); + count++; + } + } + + return count > 0 ? totalChange.divide(BigDecimal.valueOf(count), 4, RoundingMode.HALF_UP) : BigDecimal.ZERO; + } + + /** + * 计算价格波动率 + */ + private BigDecimal calculateVolatility(List historyData) { + if (historyData.size() < 2) { + return BigDecimal.valueOf(2.0); // 默认波动率 + } + + List changes = new ArrayList<>(); + + // 数据是按时间降序排列的,所以要反过来计算 + for (int i = historyData.size() - 1; i > 0; i--) { + StockData current = historyData.get(i - 1); // 更新的数据 + StockData previous = historyData.get(i); // 更早的数据 + + if (current.getClosePrice() != null && previous.getClosePrice() != null && previous.getClosePrice().compareTo(BigDecimal.ZERO) != 0) { + BigDecimal change = current.getClosePrice().subtract(previous.getClosePrice()) + .divide(previous.getClosePrice(), 4, RoundingMode.HALF_UP) + .multiply(BigDecimal.valueOf(100)); + changes.add(change); + } + } + + if (changes.isEmpty()) { + return BigDecimal.valueOf(2.0); + } + + // 计算标准差 + BigDecimal mean = changes.stream() + .reduce(BigDecimal.ZERO, BigDecimal::add) + .divide(BigDecimal.valueOf(changes.size()), 4, RoundingMode.HALF_UP); + + BigDecimal variance = changes.stream() + .map(change -> change.subtract(mean).pow(2)) + .reduce(BigDecimal.ZERO, BigDecimal::add) + .divide(BigDecimal.valueOf(changes.size()), 4, RoundingMode.HALF_UP); + + return BigDecimal.valueOf(Math.sqrt(variance.doubleValue())); + } + + @Override + public StockData getStockDetail(String stockCode) { + try { + List stockList = stockDataMapper.getLatestStockData(); + return stockList.stream() + .filter(stock -> stock.getStockCode().equals(stockCode)) + .findFirst() + .orElse(null); + } catch (Exception e) { + log.error("获取股票{}详情失败", stockCode, e); + return null; + } } @Override diff --git a/backend/src/main/resources/application.yml b/backend/src/main/resources/application.yml index 295854b..fce24e5 100644 --- a/backend/src/main/resources/application.yml +++ b/backend/src/main/resources/application.yml @@ -71,7 +71,9 @@ springdoc: path: /swagger-ui enabled: true config-url: /v3/api-docs/swagger-config - urls-primary-name: default + disable-swagger-default-url: true + url: /v3/api-docs + urls-primary-name: all-apis packages-to-scan: com.agricultural.stock.controller paths-to-match: /api/** diff --git a/data-collector/stock_crawler.log b/data-collector/stock_crawler.log index 0434bf5..a16790c 100644 --- a/data-collector/stock_crawler.log +++ b/data-collector/stock_crawler.log @@ -355,3 +355,284 @@ 2025-06-18 08:54:04,912 - INFO - 数据采集完成,共处理 67 只股票 2025-06-18 08:54:30,695 - INFO - 收到停止信号,正在关闭... 2025-06-18 08:54:30,696 - INFO - 股票数据采集器已停止 +2025-06-21 15:36:01,487 - INFO - 数据库连接成功 +2025-06-21 15:36:01,488 - INFO - 股票数据采集器启动 +2025-06-21 15:36:01,488 - INFO - 定时任务已启动,每 5 分钟采集一次 +2025-06-21 15:36:01,488 - INFO - 开始执行股票数据采集... +2025-06-21 15:36:01,721 - INFO - 成功获取股票 sz300189 数据: 神农种业 +2025-06-21 15:36:02,357 - INFO - 成功获取股票 sz000713 数据: 丰乐种业 +2025-06-21 15:36:03,005 - INFO - 成功获取股票 sh600313 数据: 农发种业 +2025-06-21 15:36:03,631 - INFO - 成功获取股票 bj837403 数据: 康农种业 +2025-06-21 15:36:04,272 - INFO - 成功获取股票 sz200505 数据: 京粮B +2025-06-21 15:36:04,876 - INFO - 成功获取股票 sz300268 数据: *ST佳沃 +2025-06-21 15:36:05,501 - INFO - 成功获取股票 sz000930 数据: 中粮科技 +2025-06-21 15:36:06,140 - INFO - 成功获取股票 sz002299 数据: 圣农发展 +2025-06-21 15:36:06,756 - INFO - 成功获取股票 sh600371 数据: 万向德农 +2025-06-21 15:36:07,372 - INFO - 成功获取股票 sh600598 数据: 北大荒 +2025-06-21 15:36:08,017 - INFO - 成功获取股票 sh603609 数据: 禾丰股份 +2025-06-21 15:36:08,628 - INFO - 成功获取股票 bj831087 数据: 秋乐种业 +2025-06-21 15:36:09,256 - INFO - 成功获取股票 sh603363 数据: 傲农生物 +2025-06-21 15:36:09,902 - INFO - 成功获取股票 sh603336 数据: 宏辉果蔬 +2025-06-21 15:36:10,522 - INFO - 成功获取股票 sh600354 数据: 敦煌种业 +2025-06-21 15:36:11,151 - INFO - 成功获取股票 sz002385 数据: 大北农 +2025-06-21 15:36:11,778 - INFO - 成功获取股票 sz000048 数据: 京基智农 +2025-06-21 15:36:12,405 - INFO - 成功获取股票 sh600251 数据: 冠农股份 +2025-06-21 15:36:13,051 - INFO - 成功获取股票 sz002321 数据: 华英农业 +2025-06-21 15:36:13,691 - INFO - 成功获取股票 sz000505 数据: 京粮控股 +2025-06-21 15:36:14,339 - INFO - 成功获取股票 sz001366 数据: 播恩集团 +2025-06-21 15:36:14,982 - INFO - 成功获取股票 sz002772 数据: 众兴菌业 +2025-06-21 15:36:15,609 - INFO - 成功获取股票 sz002041 数据: 登海种业 +2025-06-21 15:36:16,230 - INFO - 成功获取股票 sh600127 数据: 金健米业 +2025-06-21 15:36:16,868 - INFO - 成功获取股票 sz002548 数据: 金新农 +2025-06-21 15:36:17,535 - INFO - 成功获取股票 sh605296 数据: 神农集团 +2025-06-21 15:36:18,165 - INFO - 成功获取股票 sh600359 数据: 新农开发 +2025-06-21 15:36:18,800 - INFO - 成功获取股票 sh601952 数据: 苏垦农发 +2025-06-21 15:36:19,420 - INFO - 成功获取股票 sh600975 数据: 新五丰 +2025-06-21 15:36:20,048 - INFO - 成功获取股票 sz300505 数据: 川金诺 +2025-06-21 15:36:20,656 - INFO - 成功获取股票 sh600141 数据: XD兴发集 +2025-06-21 15:36:21,293 - INFO - 成功获取股票 sz000893 数据: 亚钾国际 +2025-06-21 15:36:21,929 - INFO - 成功获取股票 sh600691 数据: 阳煤化工 +2025-06-21 15:36:22,552 - INFO - 成功获取股票 sh600470 数据: 六国化工 +2025-06-21 15:36:23,163 - INFO - 成功获取股票 sh000912 数据: 300消费 +2025-06-21 15:36:23,785 - INFO - 成功获取股票 sz000408 数据: 藏格矿业 +2025-06-21 15:36:24,410 - INFO - 成功获取股票 sz000902 数据: 新洋丰 +2025-06-21 15:36:25,040 - INFO - 成功获取股票 sz002539 数据: 云图控股 +2025-06-21 15:36:25,662 - INFO - 成功获取股票 sz002599 数据: 盛通股份 +2025-06-21 15:36:26,277 - INFO - 成功获取股票 sz002545 数据: 东方铁塔 +2025-06-21 15:36:26,919 - INFO - 成功获取股票 sz300387 数据: 富邦科技 +2025-06-21 15:36:27,548 - INFO - 成功获取股票 sz002274 数据: 华昌化工 +2025-06-21 15:36:28,226 - INFO - 成功获取股票 sz002470 数据: 金正大 +2025-06-21 15:36:28,895 - INFO - 成功获取股票 sz002538 数据: 司尔特 +2025-06-21 15:36:29,536 - INFO - 成功获取股票 sz000731 数据: 四川美丰 +2025-06-21 15:36:30,195 - INFO - 成功获取股票 sh600078 数据: 澄星股份 +2025-06-21 15:36:30,841 - INFO - 成功获取股票 sh600227 数据: 赤天化 +2025-06-21 15:36:31,481 - INFO - 成功获取股票 sh603395 数据: 红四方 +2025-06-21 15:36:32,103 - INFO - 成功获取股票 sz002588 数据: 史丹利 +2025-06-21 15:36:32,718 - INFO - 成功获取股票 sz000422 数据: 湖北宜化 +2025-06-21 15:36:33,345 - INFO - 成功获取股票 sz002556 数据: 辉隆股份 +2025-06-21 15:36:33,987 - INFO - 成功获取股票 sz002312 数据: 川发龙蟒 +2025-06-21 15:36:34,620 - INFO - 成功获取股票 sz002170 数据: 芭田股份 +2025-06-21 15:36:35,398 - INFO - 成功获取股票 sz000792 数据: 盐湖股份 +2025-06-21 15:36:36,082 - INFO - 成功获取股票 sh600096 数据: 云天化 +2025-06-21 15:36:36,825 - INFO - 成功获取股票 sz001231 数据: 农心科技 +2025-06-21 15:36:37,477 - INFO - 成功获取股票 sz002731 数据: 萃华珠宝 +2025-06-21 15:36:38,171 - INFO - 成功获取股票 sz200553 数据: 安道麦B +2025-06-21 15:36:38,800 - INFO - 成功获取股票 sh603810 数据: 丰山集团 +2025-06-21 15:36:39,426 - INFO - 成功获取股票 sh603970 数据: 中农立华 +2025-06-21 15:36:40,052 - INFO - 成功获取股票 sz301035 数据: 润丰股份 +2025-06-21 15:36:40,695 - INFO - 成功获取股票 sz002868 数据: *ST绿康 +2025-06-21 15:36:41,349 - INFO - 成功获取股票 sz003042 数据: 中农联合 +2025-06-21 15:36:42,004 - INFO - 成功获取股票 sz002391 数据: 长青股份 +2025-06-21 15:36:42,614 - INFO - 成功获取股票 bj870866 数据: 绿亨科技 +2025-06-21 15:36:43,269 - INFO - 成功获取股票 sz301665 数据: 泰禾股份 +2025-06-21 15:36:43,934 - INFO - 成功获取股票 sh600486 数据: 扬农化工 +2025-06-21 15:36:44,435 - INFO - 本次采集完成,共获取 67 只股票数据 +2025-06-21 15:36:44,441 - INFO - 插入股票 sz300189 数据 +2025-06-21 15:36:44,444 - INFO - 插入股票 sz000713 数据 +2025-06-21 15:36:44,445 - INFO - 插入股票 sh600313 数据 +2025-06-21 15:36:44,447 - INFO - 插入股票 bj837403 数据 +2025-06-21 15:36:44,449 - INFO - 插入股票 sz200505 数据 +2025-06-21 15:36:44,450 - INFO - 插入股票 sz300268 数据 +2025-06-21 15:36:44,452 - INFO - 插入股票 sz000930 数据 +2025-06-21 15:36:44,454 - INFO - 插入股票 sz002299 数据 +2025-06-21 15:36:44,455 - INFO - 插入股票 sh600371 数据 +2025-06-21 15:36:44,458 - INFO - 插入股票 sh600598 数据 +2025-06-21 15:36:44,460 - INFO - 插入股票 sh603609 数据 +2025-06-21 15:36:44,462 - INFO - 插入股票 bj831087 数据 +2025-06-21 15:36:44,463 - INFO - 插入股票 sh603363 数据 +2025-06-21 15:36:44,465 - INFO - 插入股票 sh603336 数据 +2025-06-21 15:36:44,467 - INFO - 插入股票 sh600354 数据 +2025-06-21 15:36:44,468 - INFO - 插入股票 sz002385 数据 +2025-06-21 15:36:44,470 - INFO - 插入股票 sz000048 数据 +2025-06-21 15:36:44,471 - INFO - 插入股票 sh600251 数据 +2025-06-21 15:36:44,473 - INFO - 插入股票 sz002321 数据 +2025-06-21 15:36:44,475 - INFO - 插入股票 sz000505 数据 +2025-06-21 15:36:44,477 - INFO - 插入股票 sz001366 数据 +2025-06-21 15:36:44,478 - INFO - 插入股票 sz002772 数据 +2025-06-21 15:36:44,479 - INFO - 插入股票 sz002041 数据 +2025-06-21 15:36:44,481 - INFO - 插入股票 sh600127 数据 +2025-06-21 15:36:44,482 - INFO - 插入股票 sz002548 数据 +2025-06-21 15:36:44,484 - INFO - 插入股票 sh605296 数据 +2025-06-21 15:36:44,485 - INFO - 插入股票 sh600359 数据 +2025-06-21 15:36:44,487 - INFO - 插入股票 sh601952 数据 +2025-06-21 15:36:44,489 - INFO - 插入股票 sh600975 数据 +2025-06-21 15:36:44,492 - INFO - 插入股票 sz300505 数据 +2025-06-21 15:36:44,493 - INFO - 插入股票 sh600141 数据 +2025-06-21 15:36:44,495 - INFO - 插入股票 sz000893 数据 +2025-06-21 15:36:44,497 - INFO - 插入股票 sh600691 数据 +2025-06-21 15:36:44,498 - INFO - 插入股票 sh600470 数据 +2025-06-21 15:36:44,500 - INFO - 插入股票 sh000912 数据 +2025-06-21 15:36:44,501 - INFO - 插入股票 sz000408 数据 +2025-06-21 15:36:44,503 - INFO - 插入股票 sz000902 数据 +2025-06-21 15:36:44,505 - INFO - 插入股票 sz002539 数据 +2025-06-21 15:36:44,508 - INFO - 插入股票 sz002599 数据 +2025-06-21 15:36:44,510 - INFO - 插入股票 sz002545 数据 +2025-06-21 15:36:44,511 - INFO - 插入股票 sz300387 数据 +2025-06-21 15:36:44,512 - INFO - 插入股票 sz002274 数据 +2025-06-21 15:36:44,514 - INFO - 插入股票 sz002470 数据 +2025-06-21 15:36:44,515 - INFO - 插入股票 sz002538 数据 +2025-06-21 15:36:44,516 - INFO - 插入股票 sz000731 数据 +2025-06-21 15:36:44,518 - INFO - 插入股票 sh600078 数据 +2025-06-21 15:36:44,519 - INFO - 插入股票 sh600227 数据 +2025-06-21 15:36:44,521 - INFO - 插入股票 sh603395 数据 +2025-06-21 15:36:44,525 - INFO - 插入股票 sz002588 数据 +2025-06-21 15:36:44,527 - INFO - 插入股票 sz000422 数据 +2025-06-21 15:36:44,528 - INFO - 插入股票 sz002556 数据 +2025-06-21 15:36:44,529 - INFO - 插入股票 sz002312 数据 +2025-06-21 15:36:44,531 - INFO - 插入股票 sz002170 数据 +2025-06-21 15:36:44,532 - INFO - 插入股票 sz000792 数据 +2025-06-21 15:36:44,533 - INFO - 插入股票 sh600096 数据 +2025-06-21 15:36:44,535 - INFO - 插入股票 sz001231 数据 +2025-06-21 15:36:44,536 - INFO - 插入股票 sz002731 数据 +2025-06-21 15:36:44,538 - INFO - 插入股票 sz200553 数据 +2025-06-21 15:36:44,539 - INFO - 插入股票 sh603810 数据 +2025-06-21 15:36:44,542 - INFO - 插入股票 sh603970 数据 +2025-06-21 15:36:44,543 - INFO - 插入股票 sz301035 数据 +2025-06-21 15:36:44,544 - INFO - 插入股票 sz002868 数据 +2025-06-21 15:36:44,546 - INFO - 插入股票 sz003042 数据 +2025-06-21 15:36:44,548 - INFO - 插入股票 sz002391 数据 +2025-06-21 15:36:44,549 - INFO - 插入股票 bj870866 数据 +2025-06-21 15:36:44,551 - INFO - 插入股票 sz301665 数据 +2025-06-21 15:36:44,552 - INFO - 插入股票 sh600486 数据 +2025-06-21 15:36:44,560 - INFO - 成功处理 67 条股票数据到数据库 +2025-06-21 15:36:44,561 - INFO - 数据采集完成,共处理 67 只股票 +2025-06-21 15:41:01,678 - INFO - 开始执行股票数据采集... +2025-06-21 15:41:01,809 - INFO - 成功获取股票 sz300189 数据: 神农种业 +2025-06-21 15:41:02,450 - INFO - 成功获取股票 sz000713 数据: 丰乐种业 +2025-06-21 15:41:03,074 - INFO - 成功获取股票 sh600313 数据: 农发种业 +2025-06-21 15:41:03,715 - INFO - 成功获取股票 bj837403 数据: 康农种业 +2025-06-21 15:41:04,319 - INFO - 成功获取股票 sz200505 数据: 京粮B +2025-06-21 15:41:04,974 - INFO - 成功获取股票 sz300268 数据: *ST佳沃 +2025-06-21 15:41:05,643 - INFO - 成功获取股票 sz000930 数据: 中粮科技 +2025-06-21 15:41:06,253 - INFO - 成功获取股票 sz002299 数据: 圣农发展 +2025-06-21 15:41:06,890 - INFO - 成功获取股票 sh600371 数据: 万向德农 +2025-06-21 15:41:07,544 - INFO - 成功获取股票 sh600598 数据: 北大荒 +2025-06-21 15:41:08,146 - INFO - 成功获取股票 sh603609 数据: 禾丰股份 +2025-06-21 15:41:08,770 - INFO - 成功获取股票 bj831087 数据: 秋乐种业 +2025-06-21 15:41:09,463 - INFO - 成功获取股票 sh603363 数据: 傲农生物 +2025-06-21 15:41:10,093 - INFO - 成功获取股票 sh603336 数据: 宏辉果蔬 +2025-06-21 15:41:10,706 - INFO - 成功获取股票 sh600354 数据: 敦煌种业 +2025-06-21 15:41:11,321 - INFO - 成功获取股票 sz002385 数据: 大北农 +2025-06-21 15:41:11,942 - INFO - 成功获取股票 sz000048 数据: 京基智农 +2025-06-21 15:41:12,568 - INFO - 成功获取股票 sh600251 数据: 冠农股份 +2025-06-21 15:41:13,209 - INFO - 成功获取股票 sz002321 数据: 华英农业 +2025-06-21 15:41:13,856 - INFO - 成功获取股票 sz000505 数据: 京粮控股 +2025-06-21 15:41:14,498 - INFO - 成功获取股票 sz001366 数据: 播恩集团 +2025-06-21 15:41:15,142 - INFO - 成功获取股票 sz002772 数据: 众兴菌业 +2025-06-21 15:41:15,772 - INFO - 成功获取股票 sz002041 数据: 登海种业 +2025-06-21 15:41:16,397 - INFO - 成功获取股票 sh600127 数据: 金健米业 +2025-06-21 15:41:17,021 - INFO - 成功获取股票 sz002548 数据: 金新农 +2025-06-21 15:41:17,690 - INFO - 成功获取股票 sh605296 数据: 神农集团 +2025-06-21 15:41:18,303 - INFO - 成功获取股票 sh600359 数据: 新农开发 +2025-06-21 15:41:18,982 - INFO - 成功获取股票 sh601952 数据: 苏垦农发 +2025-06-21 15:41:19,628 - INFO - 成功获取股票 sh600975 数据: 新五丰 +2025-06-21 15:41:20,376 - INFO - 成功获取股票 sz300505 数据: 川金诺 +2025-06-21 15:41:21,043 - INFO - 成功获取股票 sh600141 数据: XD兴发集 +2025-06-21 15:41:21,717 - INFO - 成功获取股票 sz000893 数据: 亚钾国际 +2025-06-21 15:41:22,348 - INFO - 成功获取股票 sh600691 数据: 阳煤化工 +2025-06-21 15:41:22,966 - INFO - 成功获取股票 sh600470 数据: 六国化工 +2025-06-21 15:41:23,560 - INFO - 成功获取股票 sh000912 数据: 300消费 +2025-06-21 15:41:24,163 - INFO - 成功获取股票 sz000408 数据: 藏格矿业 +2025-06-21 15:41:24,808 - INFO - 成功获取股票 sz000902 数据: 新洋丰 +2025-06-21 15:41:25,419 - INFO - 成功获取股票 sz002539 数据: 云图控股 +2025-06-21 15:41:26,020 - INFO - 成功获取股票 sz002599 数据: 盛通股份 +2025-06-21 15:41:26,659 - INFO - 成功获取股票 sz002545 数据: 东方铁塔 +2025-06-21 15:41:27,268 - INFO - 成功获取股票 sz300387 数据: 富邦科技 +2025-06-21 15:41:27,895 - INFO - 成功获取股票 sz002274 数据: 华昌化工 +2025-06-21 15:41:28,586 - INFO - 成功获取股票 sz002470 数据: 金正大 +2025-06-21 15:41:29,220 - INFO - 成功获取股票 sz002538 数据: 司尔特 +2025-06-21 15:41:29,827 - INFO - 成功获取股票 sz000731 数据: 四川美丰 +2025-06-21 15:41:30,450 - INFO - 成功获取股票 sh600078 数据: 澄星股份 +2025-06-21 15:41:31,072 - INFO - 成功获取股票 sh600227 数据: 赤天化 +2025-06-21 15:41:31,702 - INFO - 成功获取股票 sh603395 数据: 红四方 +2025-06-21 15:41:32,314 - INFO - 成功获取股票 sz002588 数据: 史丹利 +2025-06-21 15:41:32,932 - INFO - 成功获取股票 sz000422 数据: 湖北宜化 +2025-06-21 15:41:33,617 - INFO - 成功获取股票 sz002556 数据: 辉隆股份 +2025-06-21 15:41:34,222 - INFO - 成功获取股票 sz002312 数据: 川发龙蟒 +2025-06-21 15:41:34,849 - INFO - 成功获取股票 sz002170 数据: 芭田股份 +2025-06-21 15:41:35,524 - INFO - 成功获取股票 sz000792 数据: 盐湖股份 +2025-06-21 15:41:36,171 - INFO - 成功获取股票 sh600096 数据: 云天化 +2025-06-21 15:41:36,830 - INFO - 成功获取股票 sz001231 数据: 农心科技 +2025-06-21 15:41:37,517 - INFO - 成功获取股票 sz002731 数据: 萃华珠宝 +2025-06-21 15:41:38,138 - INFO - 成功获取股票 sz200553 数据: 安道麦B +2025-06-21 15:41:38,815 - INFO - 成功获取股票 sh603810 数据: 丰山集团 +2025-06-21 15:41:39,439 - INFO - 成功获取股票 sh603970 数据: 中农立华 +2025-06-21 15:41:40,102 - INFO - 成功获取股票 sz301035 数据: 润丰股份 +2025-06-21 15:41:40,710 - INFO - 成功获取股票 sz002868 数据: *ST绿康 +2025-06-21 15:41:41,316 - INFO - 成功获取股票 sz003042 数据: 中农联合 +2025-06-21 15:41:41,943 - INFO - 成功获取股票 sz002391 数据: 长青股份 +2025-06-21 15:41:42,554 - INFO - 成功获取股票 bj870866 数据: 绿亨科技 +2025-06-21 15:41:43,174 - INFO - 成功获取股票 sz301665 数据: 泰禾股份 +2025-06-21 15:41:43,774 - INFO - 成功获取股票 sh600486 数据: 扬农化工 +2025-06-21 15:41:44,275 - INFO - 本次采集完成,共获取 67 只股票数据 +2025-06-21 15:41:44,279 - INFO - 更新股票 sz300189 数据 +2025-06-21 15:41:44,282 - INFO - 更新股票 sz000713 数据 +2025-06-21 15:41:44,284 - INFO - 更新股票 sh600313 数据 +2025-06-21 15:41:44,286 - INFO - 更新股票 bj837403 数据 +2025-06-21 15:41:44,289 - INFO - 更新股票 sz200505 数据 +2025-06-21 15:41:44,291 - INFO - 更新股票 sz300268 数据 +2025-06-21 15:41:44,293 - INFO - 更新股票 sz000930 数据 +2025-06-21 15:41:44,295 - INFO - 更新股票 sz002299 数据 +2025-06-21 15:41:44,298 - INFO - 更新股票 sh600371 数据 +2025-06-21 15:41:44,300 - INFO - 更新股票 sh600598 数据 +2025-06-21 15:41:44,302 - INFO - 更新股票 sh603609 数据 +2025-06-21 15:41:44,306 - INFO - 更新股票 bj831087 数据 +2025-06-21 15:41:44,308 - INFO - 更新股票 sh603363 数据 +2025-06-21 15:41:44,310 - INFO - 更新股票 sh603336 数据 +2025-06-21 15:41:44,313 - INFO - 更新股票 sh600354 数据 +2025-06-21 15:41:44,315 - INFO - 更新股票 sz002385 数据 +2025-06-21 15:41:44,318 - INFO - 更新股票 sz000048 数据 +2025-06-21 15:41:44,321 - INFO - 更新股票 sh600251 数据 +2025-06-21 15:41:44,323 - INFO - 更新股票 sz002321 数据 +2025-06-21 15:41:44,324 - INFO - 更新股票 sz000505 数据 +2025-06-21 15:41:44,326 - INFO - 更新股票 sz001366 数据 +2025-06-21 15:41:44,330 - INFO - 更新股票 sz002772 数据 +2025-06-21 15:41:44,332 - INFO - 更新股票 sz002041 数据 +2025-06-21 15:41:44,333 - INFO - 更新股票 sh600127 数据 +2025-06-21 15:41:44,336 - INFO - 更新股票 sz002548 数据 +2025-06-21 15:41:44,337 - INFO - 更新股票 sh605296 数据 +2025-06-21 15:41:44,339 - INFO - 更新股票 sh600359 数据 +2025-06-21 15:41:44,341 - INFO - 更新股票 sh601952 数据 +2025-06-21 15:41:44,343 - INFO - 更新股票 sh600975 数据 +2025-06-21 15:41:44,346 - INFO - 更新股票 sz300505 数据 +2025-06-21 15:41:44,348 - INFO - 更新股票 sh600141 数据 +2025-06-21 15:41:44,351 - INFO - 更新股票 sz000893 数据 +2025-06-21 15:41:44,353 - INFO - 更新股票 sh600691 数据 +2025-06-21 15:41:44,355 - INFO - 更新股票 sh600470 数据 +2025-06-21 15:41:44,357 - INFO - 更新股票 sh000912 数据 +2025-06-21 15:41:44,359 - INFO - 更新股票 sz000408 数据 +2025-06-21 15:41:44,362 - INFO - 更新股票 sz000902 数据 +2025-06-21 15:41:44,364 - INFO - 更新股票 sz002539 数据 +2025-06-21 15:41:44,366 - INFO - 更新股票 sz002599 数据 +2025-06-21 15:41:44,369 - INFO - 更新股票 sz002545 数据 +2025-06-21 15:41:44,371 - INFO - 更新股票 sz300387 数据 +2025-06-21 15:41:44,373 - INFO - 更新股票 sz002274 数据 +2025-06-21 15:41:44,375 - INFO - 更新股票 sz002470 数据 +2025-06-21 15:41:44,377 - INFO - 更新股票 sz002538 数据 +2025-06-21 15:41:44,379 - INFO - 更新股票 sz000731 数据 +2025-06-21 15:41:44,382 - INFO - 更新股票 sh600078 数据 +2025-06-21 15:41:44,385 - INFO - 更新股票 sh600227 数据 +2025-06-21 15:41:44,388 - INFO - 更新股票 sh603395 数据 +2025-06-21 15:41:44,390 - INFO - 更新股票 sz002588 数据 +2025-06-21 15:41:44,393 - INFO - 更新股票 sz000422 数据 +2025-06-21 15:41:44,396 - INFO - 更新股票 sz002556 数据 +2025-06-21 15:41:44,399 - INFO - 更新股票 sz002312 数据 +2025-06-21 15:41:44,401 - INFO - 更新股票 sz002170 数据 +2025-06-21 15:41:44,404 - INFO - 更新股票 sz000792 数据 +2025-06-21 15:41:44,406 - INFO - 更新股票 sh600096 数据 +2025-06-21 15:41:44,408 - INFO - 更新股票 sz001231 数据 +2025-06-21 15:41:44,410 - INFO - 更新股票 sz002731 数据 +2025-06-21 15:41:44,413 - INFO - 更新股票 sz200553 数据 +2025-06-21 15:41:44,415 - INFO - 更新股票 sh603810 数据 +2025-06-21 15:41:44,418 - INFO - 更新股票 sh603970 数据 +2025-06-21 15:41:44,420 - INFO - 更新股票 sz301035 数据 +2025-06-21 15:41:44,421 - INFO - 更新股票 sz002868 数据 +2025-06-21 15:41:44,423 - INFO - 更新股票 sz003042 数据 +2025-06-21 15:41:44,424 - INFO - 更新股票 sz002391 数据 +2025-06-21 15:41:44,426 - INFO - 更新股票 bj870866 数据 +2025-06-21 15:41:44,429 - INFO - 更新股票 sz301665 数据 +2025-06-21 15:41:44,432 - INFO - 更新股票 sh600486 数据 +2025-06-21 15:41:44,438 - INFO - 成功处理 67 条股票数据到数据库 +2025-06-21 15:41:44,439 - INFO - 数据采集完成,共处理 67 只股票 +2025-06-21 15:43:59,960 - INFO - 收到停止信号,正在关闭... +2025-06-21 15:43:59,961 - INFO - 股票数据采集器已停止 diff --git a/frontend/src/App.vue b/frontend/src/App.vue index 5cf05c1..9687d79 100644 --- a/frontend/src/App.vue +++ b/frontend/src/App.vue @@ -34,14 +34,9 @@ - + 市场分析 - - - - 系统监控 - diff --git a/frontend/src/api/stock.js b/frontend/src/api/stock.js index 6e2e2a2..c83eec1 100644 --- a/frontend/src/api/stock.js +++ b/frontend/src/api/stock.js @@ -77,6 +77,14 @@ export function getStockPrediction(stockCode, days = 7) { }) } +// 获取股票详情 +export function getStockDetail(stockCode) { + return request({ + url: `/api/stock/detail/${stockCode}`, + method: 'get' + }) +} + // 搜索股票 export function searchStocks(keyword) { return request({ diff --git a/frontend/src/router/index.js b/frontend/src/router/index.js index 35f37bd..c438cf5 100644 --- a/frontend/src/router/index.js +++ b/frontend/src/router/index.js @@ -1,10 +1,12 @@ import { createRouter, createWebHistory } from 'vue-router' import Dashboard from '@/views/Dashboard.vue' -import HealthCheck from '@/views/HealthCheck.vue' import Rankings from '@/views/Rankings.vue' import StockSearch from '@/views/StockSearch.vue' import StockDetail from '@/views/StockDetail.vue' import MarketAnalysis from '@/views/MarketAnalysis.vue' +import StockDetailView from '@/views/StockDetailView.vue' +import StockTrendView from '@/views/StockTrendView.vue' +import StockPredictionView from '@/views/StockPredictionView.vue' const routes = [ { @@ -31,29 +33,29 @@ const routes = [ component: StockDetail, meta: { title: '股票详情' } }, + { + path: '/stock/:stockCode/detail', + name: 'StockDetailView', + component: StockDetailView, + meta: { title: '股票详情分析' } + }, { path: '/stock/:stockCode/trend', - name: 'StockTrend', - component: StockDetail, - meta: { title: '股票趋势' } + name: 'StockTrendView', + component: StockTrendView, + meta: { title: '股票趋势分析' } }, { path: '/stock/:stockCode/prediction', - name: 'StockPrediction', - component: StockDetail, - meta: { title: '股票预测' } + name: 'StockPredictionView', + component: StockPredictionView, + meta: { title: '股票预测分析' } }, { path: '/market-analysis', name: 'MarketAnalysis', component: MarketAnalysis, meta: { title: '市场分析' } - }, - { - path: '/health', - name: 'HealthCheck', - component: HealthCheck, - meta: { title: '健康检查' } } ] diff --git a/frontend/src/views/Dashboard.vue b/frontend/src/views/Dashboard.vue index 11cc925..4477014 100644 --- a/frontend/src/views/Dashboard.vue +++ b/frontend/src/views/Dashboard.vue @@ -94,7 +94,7 @@ - +