Przeglądaj źródła

订单检查修改

Zhangbw 2 miesięcy temu
rodzic
commit
6538014f2b

+ 7 - 0
.claude/settings.local.json

@@ -0,0 +1,7 @@
+{
+  "permissions": {
+    "allow": [
+      "Bash(ls:*)"
+    ]
+  }
+}

+ 126 - 0
src/main/java/com/yingpai/gupiao/controller/StockHistoryController.java

@@ -0,0 +1,126 @@
+package com.yingpai.gupiao.controller;
+
+import com.yingpai.gupiao.domain.vo.Result;
+import com.yingpai.gupiao.service.StockHistoryService;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.format.annotation.DateTimeFormat;
+import org.springframework.web.bind.annotation.*;
+
+import java.time.LocalDate;
+import java.util.Map;
+
+/**
+ * 股票历史数据控制器(小程序端)
+ */
+@Slf4j
+@RestController
+@RequestMapping("/v1/stock/history")
+@RequiredArgsConstructor
+public class StockHistoryController {
+    
+    private final StockHistoryService stockHistoryService;
+    
+    /**
+     * 分页查询历史数据(带隔日信息)
+     * @param startDate 开始日期 (yyyy-MM-dd)
+     * @param endDate 结束日期 (yyyy-MM-dd)
+     * @param poolType 池类型:1-超短池,2-强势池
+     * @param pageNum 页码(从1开始,默认1)
+     * @param pageSize 每页数量(默认20)
+     * @return 历史数据列表和分页信息
+     */
+    @GetMapping("/list")
+    public Result<Map<String, Object>> getHistoryList(
+            @RequestParam("startDate") @DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate startDate,
+            @RequestParam("endDate") @DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate endDate,
+            @RequestParam("poolType") Integer poolType,
+            @RequestParam(value = "pageNum", defaultValue = "1") int pageNum,
+            @RequestParam(value = "pageSize", defaultValue = "20") int pageSize) {
+        
+        // 参数校验
+        if (startDate == null || endDate == null) {
+            return Result.error(400, "开始日期和结束日期不能为空");
+        }
+        
+        if (startDate.isAfter(endDate)) {
+            return Result.error(400, "开始日期不能晚于结束日期");
+        }
+        
+        if (poolType == null || (poolType != 1 && poolType != 2)) {
+            return Result.error(400, "池类型无效,1=超短池,2=强势池");
+        }
+        
+        if (pageNum < 1) {
+            pageNum = 1;
+        }
+        
+        if (pageSize < 1 || pageSize > 100) {
+            pageSize = 20;
+        }
+        
+        try {
+            Map<String, Object> result = stockHistoryService.queryHistoryPage(startDate, endDate, poolType, pageNum, pageSize);
+            return Result.success(result);
+        } catch (Exception e) {
+            log.error("查询历史数据失败", e);
+            return Result.error(500, "查询失败:" + e.getMessage());
+        }
+    }
+    
+    /**
+     * 查询统计数据(成功率、平均收益、总交易次数)
+     * @param startDate 开始日期 (yyyy-MM-dd)
+     * @param endDate 结束日期 (yyyy-MM-dd)
+     * @param poolType 池类型:1-超短池,2-强势池
+     * @return 统计数据
+     */
+    @GetMapping("/stats")
+    public Result<Map<String, Object>> getHistoryStats(
+            @RequestParam("startDate") @DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate startDate,
+            @RequestParam("endDate") @DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate endDate,
+            @RequestParam("poolType") Integer poolType) {
+        
+        // 参数校验
+        if (startDate == null || endDate == null) {
+            return Result.error(400, "开始日期和结束日期不能为空");
+        }
+        
+        if (startDate.isAfter(endDate)) {
+            return Result.error(400, "开始日期不能晚于结束日期");
+        }
+        
+        if (poolType == null || (poolType != 1 && poolType != 2)) {
+            return Result.error(400, "池类型无效,1=超短池,2=强势池");
+        }
+        
+        try {
+            Map<String, Object> result = stockHistoryService.queryHistoryStats(startDate, endDate, poolType);
+            return Result.success(result);
+        } catch (Exception e) {
+            log.error("查询统计数据失败", e);
+            return Result.error(500, "查询失败:" + e.getMessage());
+        }
+    }
+    
+    /**
+     * 根据股票代码或名称模糊查询最新的历史记录
+     * @param keyword 搜索关键词(股票代码或名称)
+     * @return 最新的历史记录
+     */
+    @GetMapping("/search")
+    public Result<Map<String, Object>> searchLatestHistory(@RequestParam("keyword") String keyword) {
+        
+        if (keyword == null || keyword.trim().isEmpty()) {
+            return Result.error(400, "请输入搜索关键词");
+        }
+        
+        try {
+            Map<String, Object> result = stockHistoryService.queryLatestHistoryByKeyword(keyword.trim());
+            return Result.success(result);
+        } catch (Exception e) {
+            log.error("查询历史数据失败", e);
+            return Result.error(500, "查询失败:" + e.getMessage());
+        }
+    }
+}

+ 114 - 0
src/main/java/com/yingpai/gupiao/domain/vo/StockHistoryVO.java

@@ -0,0 +1,114 @@
+package com.yingpai.gupiao.domain.vo;
+
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.time.LocalDate;
+
+/**
+ * 股票历史数据VO(小程序端)
+ * 包含隔日最高价和隔日最高涨幅
+ */
+@Data
+public class StockHistoryVO {
+    
+    /**
+     * 主键ID
+     */
+    private Long id;
+    
+    /**
+     * 记录日期
+     */
+    private LocalDate recordDate;
+    
+    /**
+     * 股票代码
+     */
+    private String stockCode;
+    
+    /**
+     * 股票名称
+     */
+    private String stockName;
+    
+    /**
+     * 涨幅%
+     */
+    private BigDecimal changePercent;
+    
+    /**
+     * 收盘价
+     */
+    private BigDecimal closePrice;
+    
+    /**
+     * 总金额
+     */
+    private BigDecimal totalAmount;
+    
+    /**
+     * 强度评分
+     */
+    private BigDecimal strengthScore;
+    
+    /**
+     * 流通市值
+     */
+    private BigDecimal circulationMarketValue;
+    
+    /**
+     * 主升周期
+     */
+    private String mainRisePeriod;
+    
+    /**
+     * 近期涨手
+     */
+    private String recentRiseHand;
+    
+    /**
+     * 近期涨停
+     */
+    private String recentLimitUp;
+    
+    /**
+     * 当天最高价
+     */
+    private BigDecimal dayHighestPrice;
+    
+    /**
+     * 当天最低价
+     */
+    private BigDecimal dayLowestPrice;
+    
+    /**
+     * 当天均价
+     */
+    private BigDecimal dayAvgPrice;
+    
+    /**
+     * 当天收盘价
+     */
+    private BigDecimal dayClosePrice;
+    
+    /**
+     * 行情最高涨跌
+     */
+    private BigDecimal highTrend;
+    
+    /**
+     * 隔日最高价(从下一个交易日的历史记录中获取)
+     */
+    private BigDecimal nextDayHighPrice;
+    
+    /**
+     * 隔日最高涨幅(从下一个交易日的历史记录中获取high_trend字段)
+     */
+    private BigDecimal nextDayHighTrend;
+    
+    /**
+     * 状态:success-成功(涨幅>=2%), fail-失败(涨幅<=-3%), null-无状态
+     */
+    private String status;
+}

+ 66 - 0
src/main/java/com/yingpai/gupiao/mapper/StockPoolHistoryMapper.java

@@ -0,0 +1,66 @@
+package com.yingpai.gupiao.mapper;
+
+import com.yingpai.gupiao.domain.vo.StockHistoryVO;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.time.LocalDate;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 股票池历史数据Mapper(小程序端)
+ */
+@Mapper
+public interface StockPoolHistoryMapper {
+    
+    /**
+     * 查询指定日期区间的历史数据(带隔日信息),根据池类型筛选
+     * @param startDate 开始日期
+     * @param endDate 结束日期
+     * @param poolType 池类型:1-超短池,2-强势池
+     * @param offset 偏移量
+     * @param limit 每页数量
+     * @return 历史数据列表
+     */
+    List<StockHistoryVO> selectHistoryWithNextDay(
+        @Param("startDate") LocalDate startDate,
+        @Param("endDate") LocalDate endDate,
+        @Param("poolType") Integer poolType,
+        @Param("offset") int offset,
+        @Param("limit") int limit
+    );
+    
+    /**
+     * 统计指定日期区间的记录总数,根据池类型筛选
+     * @param startDate 开始日期
+     * @param endDate 结束日期
+     * @param poolType 池类型:1-超短池,2-强势池
+     * @return 记录总数
+     */
+    int countHistory(
+        @Param("startDate") LocalDate startDate,
+        @Param("endDate") LocalDate endDate,
+        @Param("poolType") Integer poolType
+    );
+    
+    /**
+     * 查询统计数据(成功率、平均收益、总交易次数)
+     * @param startDate 开始日期
+     * @param endDate 结束日期
+     * @param poolType 池类型:1-超短池,2-强势池
+     * @return 统计数据Map
+     */
+    Map<String, Object> selectHistoryStats(
+        @Param("startDate") LocalDate startDate,
+        @Param("endDate") LocalDate endDate,
+        @Param("poolType") Integer poolType
+    );
+    
+    /**
+     * 根据股票代码或名称模糊查询最新的历史记录
+     * @param keyword 搜索关键词(股票代码或名称)
+     * @return 最新的历史记录
+     */
+    StockHistoryVO selectLatestByKeyword(@Param("keyword") String keyword);
+}

+ 45 - 0
src/main/java/com/yingpai/gupiao/scheduled/OrderScheduledTask.java

@@ -0,0 +1,45 @@
+package com.yingpai.gupiao.scheduled;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.yingpai.gupiao.domain.po.PaymentOrder;
+import com.yingpai.gupiao.mapper.PaymentOrderMapper;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.stereotype.Component;
+
+import java.time.LocalDateTime;
+import java.util.List;
+
+@Slf4j
+@Component
+@RequiredArgsConstructor
+public class OrderScheduledTask {
+
+    private final PaymentOrderMapper orderMapper;
+
+    @Scheduled(cron = "0 */5 * * * ?")
+    public void cancelExpiredOrders() {
+        LocalDateTime expireTime = LocalDateTime.now().minusMinutes(15);
+
+        List<PaymentOrder> expiredOrders = orderMapper.selectList(
+            new LambdaQueryWrapper<PaymentOrder>()
+                .eq(PaymentOrder::getOrderStatus, PaymentOrder.STATUS_PENDING)
+                .lt(PaymentOrder::getCreateTime, expireTime)
+        );
+
+        if (expiredOrders.isEmpty()) {
+            return;
+        }
+
+        for (PaymentOrder order : expiredOrders) {
+            order.setOrderStatus(PaymentOrder.STATUS_CANCELLED);
+            order.setCancelTime(LocalDateTime.now());
+            order.setUpdateTime(LocalDateTime.now());
+            orderMapper.updateById(order);
+            log.info("自动取消超时订单,orderNo: {}", order.getOrderNo());
+        }
+
+        log.info("自动取消超时订单完成,共取消{}个订单", expiredOrders.size());
+    }
+}

+ 37 - 0
src/main/java/com/yingpai/gupiao/service/StockHistoryService.java

@@ -0,0 +1,37 @@
+package com.yingpai.gupiao.service;
+
+import java.time.LocalDate;
+import java.util.Map;
+
+/**
+ * 股票历史数据服务接口(小程序端)
+ */
+public interface StockHistoryService {
+    
+    /**
+     * 分页查询历史数据(带隔日信息)
+     * @param startDate 开始日期
+     * @param endDate 结束日期
+     * @param poolType 池类型:1-超短池,2-强势池
+     * @param pageNum 页码(从1开始)
+     * @param pageSize 每页数量
+     * @return 包含数据列表和分页信息的Map
+     */
+    Map<String, Object> queryHistoryPage(LocalDate startDate, LocalDate endDate, Integer poolType, int pageNum, int pageSize);
+    
+    /**
+     * 查询统计数据(成功率、平均收益、总交易次数)
+     * @param startDate 开始日期
+     * @param endDate 结束日期
+     * @param poolType 池类型:1-超短池,2-强势池
+     * @return 统计数据Map
+     */
+    Map<String, Object> queryHistoryStats(LocalDate startDate, LocalDate endDate, Integer poolType);
+    
+    /**
+     * 根据股票代码或名称模糊查询最新的历史记录
+     * @param keyword 搜索关键词(股票代码或名称)
+     * @return 最新的历史记录,包含评分等信息
+     */
+    Map<String, Object> queryLatestHistoryByKeyword(String keyword);
+}

+ 134 - 0
src/main/java/com/yingpai/gupiao/service/impl/StockHistoryServiceImpl.java

@@ -0,0 +1,134 @@
+package com.yingpai.gupiao.service.impl;
+
+import com.yingpai.gupiao.domain.vo.StockHistoryVO;
+import com.yingpai.gupiao.mapper.StockPoolHistoryMapper;
+import com.yingpai.gupiao.service.StockHistoryService;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+
+import java.math.BigDecimal;
+import java.math.RoundingMode;
+import java.time.LocalDate;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 股票历史数据服务实现类(小程序端)
+ */
+@Slf4j
+@Service
+@RequiredArgsConstructor
+public class StockHistoryServiceImpl implements StockHistoryService {
+    
+    private final StockPoolHistoryMapper stockPoolHistoryMapper;
+    
+    @Override
+    public Map<String, Object> queryHistoryPage(LocalDate startDate, LocalDate endDate, Integer poolType, int pageNum, int pageSize) {
+        // 计算偏移量
+        int offset = (pageNum - 1) * pageSize;
+        
+        // 查询数据
+        List<StockHistoryVO> list = stockPoolHistoryMapper.selectHistoryWithNextDay(
+            startDate, endDate, poolType, offset, pageSize
+        );
+        
+        // 查询总数
+        int total = stockPoolHistoryMapper.countHistory(startDate, endDate, poolType);
+        
+        // 计算总页数
+        int pages = (total + pageSize - 1) / pageSize;
+        
+        // 构建返回结果
+        Map<String, Object> result = new HashMap<>();
+        result.put("list", list);
+        result.put("total", total);
+        result.put("pageNum", pageNum);
+        result.put("pageSize", pageSize);
+        result.put("pages", pages);
+        result.put("hasMore", pageNum < pages);
+        
+        return result;
+    }
+    
+    @Override
+    public Map<String, Object> queryHistoryStats(LocalDate startDate, LocalDate endDate, Integer poolType) {
+        Map<String, Object> stats = stockPoolHistoryMapper.selectHistoryStats(startDate, endDate, poolType);
+        
+        Map<String, Object> result = new HashMap<>();
+        
+        if (stats == null || stats.get("totalCount") == null) {
+            result.put("totalCount", 0);
+            result.put("successCount", 0);
+            result.put("failCount", 0);
+            result.put("successRate", "0%");
+            result.put("avgTrend", "0%");
+            return result;
+        }
+        
+        // 获取统计数据
+        long totalCount = ((Number) stats.get("totalCount")).longValue();
+        long successCount = stats.get("successCount") != null ? ((Number) stats.get("successCount")).longValue() : 0;
+        long failCount = stats.get("failCount") != null ? ((Number) stats.get("failCount")).longValue() : 0;
+        BigDecimal avgTrend = stats.get("avgTrend") != null ? new BigDecimal(stats.get("avgTrend").toString()) : BigDecimal.ZERO;
+        
+        // 计算成功率
+        String successRate = "0%";
+        if (totalCount > 0) {
+            BigDecimal rate = new BigDecimal(successCount * 100).divide(new BigDecimal(totalCount), 1, RoundingMode.HALF_UP);
+            successRate = rate.stripTrailingZeros().toPlainString() + "%";
+        }
+        
+        // 格式化平均收益
+        String avgTrendStr = (avgTrend.compareTo(BigDecimal.ZERO) >= 0 ? "+" : "") + 
+                            avgTrend.setScale(2, RoundingMode.HALF_UP).toPlainString() + "%";
+        
+        result.put("totalCount", totalCount);
+        result.put("successCount", successCount);
+        result.put("failCount", failCount);
+        result.put("successRate", successRate);
+        result.put("avgTrend", avgTrendStr);
+        
+        return result;
+    }
+    
+    @Override
+    public Map<String, Object> queryLatestHistoryByKeyword(String keyword) {
+        Map<String, Object> result = new HashMap<>();
+        
+        if (keyword == null || keyword.trim().isEmpty()) {
+            result.put("found", false);
+            result.put("message", "请输入搜索关键词");
+            return result;
+        }
+        
+        StockHistoryVO history = stockPoolHistoryMapper.selectLatestByKeyword(keyword.trim());
+        
+        if (history == null) {
+            result.put("found", false);
+            result.put("message", "未找到该股票的历史数据");
+            return result;
+        }
+        
+        result.put("found", true);
+        result.put("stockCode", history.getStockCode());
+        result.put("stockName", history.getStockName());
+        result.put("recordDate", history.getRecordDate());
+        result.put("closePrice", history.getClosePrice());
+        result.put("changePercent", history.getChangePercent());
+        result.put("strengthScore", history.getStrengthScore());
+        result.put("totalAmount", history.getTotalAmount());
+        result.put("circulationMarketValue", history.getCirculationMarketValue());
+        result.put("mainRisePeriod", history.getMainRisePeriod());
+        result.put("recentRiseHand", history.getRecentRiseHand());
+        result.put("recentLimitUp", history.getRecentLimitUp());
+        result.put("dayHighestPrice", history.getDayHighestPrice());
+        result.put("dayLowestPrice", history.getDayLowestPrice());
+        result.put("dayAvgPrice", history.getDayAvgPrice());
+        result.put("dayClosePrice", history.getDayClosePrice());
+        result.put("highTrend", history.getHighTrend());
+        
+        return result;
+    }
+}

+ 129 - 0
src/main/resources/mapper/StockPoolHistoryMapper.xml

@@ -0,0 +1,129 @@
+<?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.yingpai.gupiao.mapper.StockPoolHistoryMapper">
+
+    <!-- 查询历史数据(带隔日信息),每只股票只取隔日涨幅最大的一条 -->
+    <select id="selectHistoryWithNextDay" resultType="com.yingpai.gupiao.domain.vo.StockHistoryVO">
+        SELECT 
+            t.id,
+            t.recordDate,
+            t.stockCode,
+            t.stockName,
+            t.closePrice,
+            t.nextDayHighPrice,
+            t.nextDayHighTrend,
+            CASE 
+                WHEN t.nextDayHighTrend IS NOT NULL AND t.nextDayHighTrend >= 2 THEN 'success'
+                WHEN t.nextDayHighTrend IS NOT NULL AND t.nextDayHighTrend &lt;= -3 THEN 'fail'
+                ELSE NULL
+            END AS status
+        FROM (
+            SELECT 
+                h.id,
+                h.record_date AS recordDate,
+                h.stock_code AS stockCode,
+                h.stock_name AS stockName,
+                h.close_price AS closePrice,
+                next_day.day_highest_price AS nextDayHighPrice,
+                next_day.high_trend AS nextDayHighTrend,
+                ROW_NUMBER() OVER (PARTITION BY h.stock_code ORDER BY COALESCE(next_day.high_trend, -9999) DESC) AS rn
+            FROM stock_pool_history h
+            INNER JOIN stock_pool sp ON h.stock_code = sp.stock_code 
+                AND sp.pool_type = #{poolType} 
+                AND sp.status = 1
+            LEFT JOIN (
+                SELECT 
+                    stock_code,
+                    record_date,
+                    day_highest_price,
+                    high_trend
+                FROM stock_pool_history
+            ) next_day ON h.stock_code = next_day.stock_code 
+                AND next_day.record_date = (
+                    SELECT MIN(record_date) 
+                    FROM stock_pool_history 
+                    WHERE stock_code = h.stock_code 
+                    AND record_date > h.record_date
+                )
+            WHERE h.record_date >= #{startDate}
+              AND h.record_date &lt;= #{endDate}
+        ) t
+        WHERE t.rn = 1
+        ORDER BY CASE WHEN t.nextDayHighTrend IS NULL THEN 1 ELSE 0 END, t.nextDayHighTrend DESC
+        LIMIT #{limit} OFFSET #{offset}
+    </select>
+
+    <!-- 统计记录总数(每只股票只算一条) -->
+    <select id="countHistory" resultType="int">
+        SELECT COUNT(DISTINCT h.stock_code)
+        FROM stock_pool_history h
+        INNER JOIN stock_pool sp ON h.stock_code = sp.stock_code 
+            AND sp.pool_type = #{poolType} 
+            AND sp.status = 1
+        WHERE h.record_date >= #{startDate}
+          AND h.record_date &lt;= #{endDate}
+    </select>
+
+    <!-- 查询统计数据(成功率、平均收益、总交易次数) -->
+    <select id="selectHistoryStats" resultType="map">
+        SELECT 
+            COUNT(*) AS totalCount,
+            SUM(CASE WHEN nextDayHighTrend >= 2 THEN 1 ELSE 0 END) AS successCount,
+            SUM(CASE WHEN nextDayHighTrend &lt;= -3 THEN 1 ELSE 0 END) AS failCount,
+            AVG(nextDayHighTrend) AS avgTrend
+        FROM (
+            SELECT 
+                h.stock_code,
+                next_day.high_trend AS nextDayHighTrend,
+                ROW_NUMBER() OVER (PARTITION BY h.stock_code ORDER BY COALESCE(next_day.high_trend, -9999) DESC) AS rn
+            FROM stock_pool_history h
+            INNER JOIN stock_pool sp ON h.stock_code = sp.stock_code 
+                AND sp.pool_type = #{poolType} 
+                AND sp.status = 1
+            LEFT JOIN (
+                SELECT 
+                    stock_code,
+                    record_date,
+                    high_trend
+                FROM stock_pool_history
+            ) next_day ON h.stock_code = next_day.stock_code 
+                AND next_day.record_date = (
+                    SELECT MIN(record_date) 
+                    FROM stock_pool_history 
+                    WHERE stock_code = h.stock_code 
+                    AND record_date > h.record_date
+                )
+            WHERE h.record_date >= #{startDate}
+              AND h.record_date &lt;= #{endDate}
+        ) t
+        WHERE t.rn = 1
+    </select>
+
+    <!-- 根据股票代码或名称模糊查询最新的历史记录 -->
+    <select id="selectLatestByKeyword" resultType="com.yingpai.gupiao.domain.vo.StockHistoryVO">
+        SELECT 
+            h.id,
+            h.record_date AS recordDate,
+            h.stock_code AS stockCode,
+            h.stock_name AS stockName,
+            h.change_percent AS changePercent,
+            h.close_price AS closePrice,
+            h.total_amount AS totalAmount,
+            h.strength_score AS strengthScore,
+            h.circulation_market_value AS circulationMarketValue,
+            h.main_rise_period AS mainRisePeriod,
+            h.recent_rise_hand AS recentRiseHand,
+            h.recent_limit_up AS recentLimitUp,
+            h.day_highest_price AS dayHighestPrice,
+            h.day_lowest_price AS dayLowestPrice,
+            h.day_avg_price AS dayAvgPrice,
+            h.day_close_price AS dayClosePrice,
+            h.high_trend AS highTrend
+        FROM stock_pool_history h
+        WHERE (h.stock_code LIKE CONCAT('%', #{keyword}, '%') 
+               OR h.stock_name LIKE CONCAT('%', #{keyword}, '%'))
+        ORDER BY h.record_date DESC
+        LIMIT 1
+    </select>
+
+</mapper>

+ 56 - 0
src/main/resources/sql/stock_pool_history.sql

@@ -0,0 +1,56 @@
+/*
+ Navicat Premium Dump SQL
+
+ Source Server         : zbw
+ Source Server Type    : MySQL
+ Source Server Version : 80042 (8.0.42)
+ Source Host           : localhost:3306
+ Source Schema         : ry_vue_5.x
+
+ Target Server Type    : MySQL
+ Target Server Version : 80042 (8.0.42)
+ File Encoding         : 65001
+
+ Date: 09/01/2026 18:11:19
+*/
+
+SET NAMES utf8mb4;
+SET FOREIGN_KEY_CHECKS = 0;
+
+-- ----------------------------
+-- Table structure for stock_pool_history
+-- ----------------------------
+DROP TABLE IF EXISTS `stock_pool_history`;
+CREATE TABLE `stock_pool_history`  (
+  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID',
+  `record_date` date NOT NULL COMMENT '记录日期(管理员选择的日期)',
+  `stock_code` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,
+  `stock_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '股票名称',
+  `change_percent` decimal(10, 2) NULL DEFAULT NULL COMMENT '涨幅%',
+  `close_price` decimal(10, 2) NULL DEFAULT NULL COMMENT '收盘价',
+  `total_amount` decimal(20, 2) NULL DEFAULT NULL COMMENT '总金额',
+  `strength_score` decimal(10, 2) NULL DEFAULT NULL COMMENT '强度评分',
+  `circulation_market_value` decimal(20, 2) NULL DEFAULT NULL COMMENT '流通市值',
+  `main_rise_period` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '主升周期',
+  `recent_rise_hand` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '近期涨手',
+  `recent_limit_up` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '近期涨停',
+  `day_highest_price` decimal(10, 2) NULL DEFAULT NULL COMMENT '当天最高价',
+  `day_lowest_price` decimal(10, 2) NULL DEFAULT NULL COMMENT '当天最低价',
+  `day_avg_price` decimal(10, 2) NULL DEFAULT NULL COMMENT '当天均价',
+  `day_close_price` decimal(10, 2) NULL DEFAULT NULL COMMENT '当天收盘价',
+  `high_trend` decimal(10, 2) NULL DEFAULT NULL COMMENT '行情最高涨跌(涨/跌/平)',
+  `admin_id` bigint NULL DEFAULT NULL COMMENT '操作管理员ID',
+  `create_time` datetime NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
+  `update_time` datetime NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
+  PRIMARY KEY (`id`) USING BTREE,
+  UNIQUE INDEX `uk_stock_date`(`stock_code` ASC, `record_date` ASC) USING BTREE,
+  INDEX `idx_record_date`(`record_date` ASC) USING BTREE,
+  INDEX `idx_stock_code`(`stock_code` ASC) USING BTREE,
+  INDEX `idx_stock_date`(`stock_code` ASC, `record_date` ASC) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 9983 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '历史股票池表(用于历史数据查询)' ROW_FORMAT = Dynamic;
+
+-- ----------------------------
+-- Records of stock_pool_history
+-- ----------------------------
+
+SET FOREIGN_KEY_CHECKS = 1;

+ 215 - 0
src/main/resources/sql/sys_menu.sql

@@ -0,0 +1,215 @@
+/*
+ Navicat Premium Dump SQL
+
+ Source Server         : zbw
+ Source Server Type    : MySQL
+ Source Server Version : 80042 (8.0.42)
+ Source Host           : localhost:3306
+ Source Schema         : ry_vue_5.x
+
+ Target Server Type    : MySQL
+ Target Server Version : 80042 (8.0.42)
+ File Encoding         : 65001
+
+ Date: 07/01/2026 10:12:11
+*/
+
+SET NAMES utf8mb4;
+SET FOREIGN_KEY_CHECKS = 0;
+
+-- ----------------------------
+-- Table structure for sys_menu
+-- ----------------------------
+DROP TABLE IF EXISTS `sys_menu`;
+CREATE TABLE `sys_menu`  (
+  `menu_id` bigint NOT NULL COMMENT '菜单ID',
+  `menu_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '菜单名称',
+  `parent_id` bigint NULL DEFAULT 0 COMMENT '父菜单ID',
+  `order_num` int NULL DEFAULT 0 COMMENT '显示顺序',
+  `path` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '路由地址',
+  `component` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '组件路径',
+  `query_param` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '路由参数',
+  `is_frame` int NULL DEFAULT 1 COMMENT '是否为外链(0是 1否)',
+  `is_cache` int NULL DEFAULT 0 COMMENT '是否缓存(0缓存 1不缓存)',
+  `menu_type` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '菜单类型(M目录 C菜单 F按钮)',
+  `visible` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '0' COMMENT '显示状态(0显示 1隐藏)',
+  `status` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '0' COMMENT '菜单状态(0正常 1停用)',
+  `perms` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '权限标识',
+  `icon` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '#' COMMENT '菜单图标',
+  `create_dept` bigint NULL DEFAULT NULL COMMENT '创建部门',
+  `create_by` bigint NULL DEFAULT NULL COMMENT '创建者',
+  `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间',
+  `update_by` bigint NULL DEFAULT NULL COMMENT '更新者',
+  `update_time` datetime NULL DEFAULT NULL COMMENT '更新时间',
+  `remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '备注',
+  PRIMARY KEY (`menu_id`) USING BTREE
+) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '菜单权限表' ROW_FORMAT = Dynamic;
+
+-- ----------------------------
+-- Records of sys_menu
+-- ----------------------------
+INSERT INTO `sys_menu` VALUES (1, '系统管理', 0, 1, 'system', NULL, '', 1, 0, 'M', '0', '0', '', 'system', 103, 1, '2025-12-19 11:57:50', NULL, NULL, '系统管理目录');
+INSERT INTO `sys_menu` VALUES (2, '系统监控', 0, 3, 'monitor', NULL, '', 1, 0, 'M', '1', '0', '', 'monitor', 103, 1, '2025-12-19 11:57:50', 1, '2025-12-24 14:54:25', '系统监控目录');
+INSERT INTO `sys_menu` VALUES (3, '系统工具', 0, 4, 'tool', NULL, '', 1, 0, 'M', '1', '0', '', 'tool', 103, 1, '2025-12-19 11:57:50', 1, '2026-01-04 16:13:54', '系统工具目录');
+INSERT INTO `sys_menu` VALUES (4, 'PLUS官网', 0, 5, 'https://gitee.com/dromara/RuoYi-Vue-Plus', NULL, '', 0, 0, 'M', '1', '0', '', 'guide', 103, 1, '2025-12-19 11:57:50', 1, '2025-12-24 14:54:38', 'RuoYi-Vue-Plus官网地址');
+INSERT INTO `sys_menu` VALUES (5, '测试菜单', 0, 5, 'demo', NULL, '', 1, 0, 'M', '1', '0', '', 'star', 103, 1, '2025-12-19 11:57:50', 1, '2025-12-24 14:54:43', '测试菜单');
+INSERT INTO `sys_menu` VALUES (6, '租户管理', 0, 2, 'tenant', NULL, '', 1, 0, 'M', '1', '0', '', 'chart', 103, 1, '2025-12-19 11:57:50', 1, '2025-12-24 14:54:16', '租户管理目录');
+INSERT INTO `sys_menu` VALUES (100, '用户管理', 1, 1, 'user', 'system/user/index', '', 1, 0, 'C', '0', '0', 'system:user:list', 'user', 103, 1, '2025-12-19 11:57:50', NULL, NULL, '用户管理菜单');
+INSERT INTO `sys_menu` VALUES (101, '角色管理', 1, 2, 'role', 'system/role/index', '', 1, 0, 'C', '0', '0', 'system:role:list', 'peoples', 103, 1, '2025-12-19 11:57:50', NULL, NULL, '角色管理菜单');
+INSERT INTO `sys_menu` VALUES (102, '菜单管理', 1, 3, 'menu', 'system/menu/index', '', 1, 0, 'C', '0', '0', 'system:menu:list', 'tree-table', 103, 1, '2025-12-19 11:57:50', NULL, NULL, '菜单管理菜单');
+INSERT INTO `sys_menu` VALUES (103, '部门管理', 1, 4, 'dept', 'system/dept/index', '', 1, 0, 'C', '0', '0', 'system:dept:list', 'tree', 103, 1, '2025-12-19 11:57:50', NULL, NULL, '部门管理菜单');
+INSERT INTO `sys_menu` VALUES (104, '岗位管理', 1, 5, 'post', 'system/post/index', '', 1, 0, 'C', '0', '0', 'system:post:list', 'post', 103, 1, '2025-12-19 11:57:50', NULL, NULL, '岗位管理菜单');
+INSERT INTO `sys_menu` VALUES (105, '字典管理', 1, 6, 'dict', 'system/dict/index', '', 1, 0, 'C', '0', '0', 'system:dict:list', 'dict', 103, 1, '2025-12-19 11:57:50', NULL, NULL, '字典管理菜单');
+INSERT INTO `sys_menu` VALUES (106, '参数设置', 1, 7, 'config', 'system/config/index', '', 1, 0, 'C', '0', '0', 'system:config:list', 'edit', 103, 1, '2025-12-19 11:57:50', NULL, NULL, '参数设置菜单');
+INSERT INTO `sys_menu` VALUES (107, '通知公告', 1, 8, 'notice', 'system/notice/index', '', 1, 0, 'C', '0', '0', 'system:notice:list', 'message', 103, 1, '2025-12-19 11:57:50', NULL, NULL, '通知公告菜单');
+INSERT INTO `sys_menu` VALUES (108, '日志管理', 1, 9, 'log', '', '', 1, 0, 'M', '0', '0', '', 'log', 103, 1, '2025-12-19 11:57:50', NULL, NULL, '日志管理菜单');
+INSERT INTO `sys_menu` VALUES (109, '在线用户', 2, 1, 'online', 'monitor/online/index', '', 1, 0, 'C', '0', '0', 'monitor:online:list', 'online', 103, 1, '2025-12-19 11:57:50', NULL, NULL, '在线用户菜单');
+INSERT INTO `sys_menu` VALUES (113, '缓存监控', 2, 5, 'cache', 'monitor/cache/index', '', 1, 0, 'C', '0', '0', 'monitor:cache:list', 'redis', 103, 1, '2025-12-19 11:57:50', NULL, NULL, '缓存监控菜单');
+INSERT INTO `sys_menu` VALUES (115, '代码生成', 3, 2, 'gen', 'tool/gen/index', '', 1, 0, 'C', '0', '0', 'tool:gen:list', 'code', 103, 1, '2025-12-19 11:57:50', NULL, NULL, '代码生成菜单');
+INSERT INTO `sys_menu` VALUES (116, '修改生成配置', 3, 2, 'gen-edit/index/:tableId', 'tool/gen/editTable', '', 1, 1, 'C', '1', '0', 'tool:gen:edit', '#', 103, 1, '2025-12-19 11:57:50', NULL, NULL, '/tool/gen');
+INSERT INTO `sys_menu` VALUES (117, 'Admin监控', 2, 5, 'Admin', 'monitor/admin/index', '', 1, 0, 'C', '0', '0', 'monitor:admin:list', 'dashboard', 103, 1, '2025-12-19 11:57:50', NULL, NULL, 'Admin监控菜单');
+INSERT INTO `sys_menu` VALUES (118, '文件管理', 1, 10, 'oss', 'system/oss/index', '', 1, 0, 'C', '0', '0', 'system:oss:list', 'upload', 103, 1, '2025-12-19 11:57:50', NULL, NULL, '文件管理菜单');
+INSERT INTO `sys_menu` VALUES (120, '任务调度中心', 2, 6, 'snailjob', 'monitor/snailjob/index', '', 1, 0, 'C', '0', '0', 'monitor:snailjob:list', 'job', 103, 1, '2025-12-19 11:57:50', NULL, NULL, 'SnailJob控制台菜单');
+INSERT INTO `sys_menu` VALUES (121, '租户管理', 6, 1, 'tenant', 'system/tenant/index', '', 1, 0, 'C', '0', '0', 'system:tenant:list', 'list', 103, 1, '2025-12-19 11:57:50', NULL, NULL, '租户管理菜单');
+INSERT INTO `sys_menu` VALUES (122, '租户套餐管理', 6, 2, 'tenantPackage', 'system/tenantPackage/index', '', 1, 0, 'C', '0', '0', 'system:tenantPackage:list', 'form', 103, 1, '2025-12-19 11:57:50', NULL, NULL, '租户套餐管理菜单');
+INSERT INTO `sys_menu` VALUES (123, '客户端管理', 1, 11, 'client', 'system/client/index', '', 1, 0, 'C', '0', '0', 'system:client:list', 'international', 103, 1, '2025-12-19 11:57:50', NULL, NULL, '客户端管理菜单');
+INSERT INTO `sys_menu` VALUES (130, '分配用户', 1, 2, 'role-auth/user/:roleId', 'system/role/authUser', '', 1, 1, 'C', '1', '0', 'system:role:edit', '#', 103, 1, '2025-12-19 11:57:50', NULL, NULL, '/system/role');
+INSERT INTO `sys_menu` VALUES (131, '分配角色', 1, 1, 'user-auth/role/:userId', 'system/user/authRole', '', 1, 1, 'C', '1', '0', 'system:user:edit', '#', 103, 1, '2025-12-19 11:57:50', NULL, NULL, '/system/user');
+INSERT INTO `sys_menu` VALUES (132, '字典数据', 1, 6, 'dict-data/index/:dictId', 'system/dict/data', '', 1, 1, 'C', '1', '0', 'system:dict:list', '#', 103, 1, '2025-12-19 11:57:50', NULL, NULL, '/system/dict');
+INSERT INTO `sys_menu` VALUES (133, '文件配置管理', 1, 10, 'oss-config/index', 'system/oss/config', '', 1, 1, 'C', '1', '0', 'system:ossConfig:list', '#', 103, 1, '2025-12-19 11:57:50', NULL, NULL, '/system/oss');
+INSERT INTO `sys_menu` VALUES (500, '操作日志', 108, 1, 'operlog', 'monitor/operlog/index', '', 1, 0, 'C', '0', '0', 'monitor:operlog:list', 'form', 103, 1, '2025-12-19 11:57:50', NULL, NULL, '操作日志菜单');
+INSERT INTO `sys_menu` VALUES (501, '登录日志', 108, 2, 'logininfor', 'monitor/logininfor/index', '', 1, 0, 'C', '0', '0', 'monitor:logininfor:list', 'logininfor', 103, 1, '2025-12-19 11:57:50', NULL, NULL, '登录日志菜单');
+INSERT INTO `sys_menu` VALUES (1001, '用户查询', 100, 1, '', '', '', 1, 0, 'F', '0', '0', 'system:user:query', '#', 103, 1, '2025-12-19 11:57:50', NULL, NULL, '');
+INSERT INTO `sys_menu` VALUES (1002, '用户新增', 100, 2, '', '', '', 1, 0, 'F', '0', '0', 'system:user:add', '#', 103, 1, '2025-12-19 11:57:50', NULL, NULL, '');
+INSERT INTO `sys_menu` VALUES (1003, '用户修改', 100, 3, '', '', '', 1, 0, 'F', '0', '0', 'system:user:edit', '#', 103, 1, '2025-12-19 11:57:50', NULL, NULL, '');
+INSERT INTO `sys_menu` VALUES (1004, '用户删除', 100, 4, '', '', '', 1, 0, 'F', '0', '0', 'system:user:remove', '#', 103, 1, '2025-12-19 11:57:50', NULL, NULL, '');
+INSERT INTO `sys_menu` VALUES (1005, '用户导出', 100, 5, '', '', '', 1, 0, 'F', '0', '0', 'system:user:export', '#', 103, 1, '2025-12-19 11:57:50', NULL, NULL, '');
+INSERT INTO `sys_menu` VALUES (1006, '用户导入', 100, 6, '', '', '', 1, 0, 'F', '0', '0', 'system:user:import', '#', 103, 1, '2025-12-19 11:57:50', NULL, NULL, '');
+INSERT INTO `sys_menu` VALUES (1007, '重置密码', 100, 7, '', '', '', 1, 0, 'F', '0', '0', 'system:user:resetPwd', '#', 103, 1, '2025-12-19 11:57:50', NULL, NULL, '');
+INSERT INTO `sys_menu` VALUES (1008, '角色查询', 101, 1, '', '', '', 1, 0, 'F', '0', '0', 'system:role:query', '#', 103, 1, '2025-12-19 11:57:50', NULL, NULL, '');
+INSERT INTO `sys_menu` VALUES (1009, '角色新增', 101, 2, '', '', '', 1, 0, 'F', '0', '0', 'system:role:add', '#', 103, 1, '2025-12-19 11:57:50', NULL, NULL, '');
+INSERT INTO `sys_menu` VALUES (1010, '角色修改', 101, 3, '', '', '', 1, 0, 'F', '0', '0', 'system:role:edit', '#', 103, 1, '2025-12-19 11:57:50', NULL, NULL, '');
+INSERT INTO `sys_menu` VALUES (1011, '角色删除', 101, 4, '', '', '', 1, 0, 'F', '0', '0', 'system:role:remove', '#', 103, 1, '2025-12-19 11:57:50', NULL, NULL, '');
+INSERT INTO `sys_menu` VALUES (1012, '角色导出', 101, 5, '', '', '', 1, 0, 'F', '0', '0', 'system:role:export', '#', 103, 1, '2025-12-19 11:57:50', NULL, NULL, '');
+INSERT INTO `sys_menu` VALUES (1013, '菜单查询', 102, 1, '', '', '', 1, 0, 'F', '0', '0', 'system:menu:query', '#', 103, 1, '2025-12-19 11:57:50', NULL, NULL, '');
+INSERT INTO `sys_menu` VALUES (1014, '菜单新增', 102, 2, '', '', '', 1, 0, 'F', '0', '0', 'system:menu:add', '#', 103, 1, '2025-12-19 11:57:50', NULL, NULL, '');
+INSERT INTO `sys_menu` VALUES (1015, '菜单修改', 102, 3, '', '', '', 1, 0, 'F', '0', '0', 'system:menu:edit', '#', 103, 1, '2025-12-19 11:57:50', NULL, NULL, '');
+INSERT INTO `sys_menu` VALUES (1016, '菜单删除', 102, 4, '', '', '', 1, 0, 'F', '0', '0', 'system:menu:remove', '#', 103, 1, '2025-12-19 11:57:50', NULL, NULL, '');
+INSERT INTO `sys_menu` VALUES (1017, '部门查询', 103, 1, '', '', '', 1, 0, 'F', '0', '0', 'system:dept:query', '#', 103, 1, '2025-12-19 11:57:50', NULL, NULL, '');
+INSERT INTO `sys_menu` VALUES (1018, '部门新增', 103, 2, '', '', '', 1, 0, 'F', '0', '0', 'system:dept:add', '#', 103, 1, '2025-12-19 11:57:50', NULL, NULL, '');
+INSERT INTO `sys_menu` VALUES (1019, '部门修改', 103, 3, '', '', '', 1, 0, 'F', '0', '0', 'system:dept:edit', '#', 103, 1, '2025-12-19 11:57:50', NULL, NULL, '');
+INSERT INTO `sys_menu` VALUES (1020, '部门删除', 103, 4, '', '', '', 1, 0, 'F', '0', '0', 'system:dept:remove', '#', 103, 1, '2025-12-19 11:57:50', NULL, NULL, '');
+INSERT INTO `sys_menu` VALUES (1021, '岗位查询', 104, 1, '', '', '', 1, 0, 'F', '0', '0', 'system:post:query', '#', 103, 1, '2025-12-19 11:57:50', NULL, NULL, '');
+INSERT INTO `sys_menu` VALUES (1022, '岗位新增', 104, 2, '', '', '', 1, 0, 'F', '0', '0', 'system:post:add', '#', 103, 1, '2025-12-19 11:57:50', NULL, NULL, '');
+INSERT INTO `sys_menu` VALUES (1023, '岗位修改', 104, 3, '', '', '', 1, 0, 'F', '0', '0', 'system:post:edit', '#', 103, 1, '2025-12-19 11:57:50', NULL, NULL, '');
+INSERT INTO `sys_menu` VALUES (1024, '岗位删除', 104, 4, '', '', '', 1, 0, 'F', '0', '0', 'system:post:remove', '#', 103, 1, '2025-12-19 11:57:50', NULL, NULL, '');
+INSERT INTO `sys_menu` VALUES (1025, '岗位导出', 104, 5, '', '', '', 1, 0, 'F', '0', '0', 'system:post:export', '#', 103, 1, '2025-12-19 11:57:50', NULL, NULL, '');
+INSERT INTO `sys_menu` VALUES (1026, '字典查询', 105, 1, '#', '', '', 1, 0, 'F', '0', '0', 'system:dict:query', '#', 103, 1, '2025-12-19 11:57:50', NULL, NULL, '');
+INSERT INTO `sys_menu` VALUES (1027, '字典新增', 105, 2, '#', '', '', 1, 0, 'F', '0', '0', 'system:dict:add', '#', 103, 1, '2025-12-19 11:57:50', NULL, NULL, '');
+INSERT INTO `sys_menu` VALUES (1028, '字典修改', 105, 3, '#', '', '', 1, 0, 'F', '0', '0', 'system:dict:edit', '#', 103, 1, '2025-12-19 11:57:50', NULL, NULL, '');
+INSERT INTO `sys_menu` VALUES (1029, '字典删除', 105, 4, '#', '', '', 1, 0, 'F', '0', '0', 'system:dict:remove', '#', 103, 1, '2025-12-19 11:57:50', NULL, NULL, '');
+INSERT INTO `sys_menu` VALUES (1030, '字典导出', 105, 5, '#', '', '', 1, 0, 'F', '0', '0', 'system:dict:export', '#', 103, 1, '2025-12-19 11:57:50', NULL, NULL, '');
+INSERT INTO `sys_menu` VALUES (1031, '参数查询', 106, 1, '#', '', '', 1, 0, 'F', '0', '0', 'system:config:query', '#', 103, 1, '2025-12-19 11:57:50', NULL, NULL, '');
+INSERT INTO `sys_menu` VALUES (1032, '参数新增', 106, 2, '#', '', '', 1, 0, 'F', '0', '0', 'system:config:add', '#', 103, 1, '2025-12-19 11:57:50', NULL, NULL, '');
+INSERT INTO `sys_menu` VALUES (1033, '参数修改', 106, 3, '#', '', '', 1, 0, 'F', '0', '0', 'system:config:edit', '#', 103, 1, '2025-12-19 11:57:50', NULL, NULL, '');
+INSERT INTO `sys_menu` VALUES (1034, '参数删除', 106, 4, '#', '', '', 1, 0, 'F', '0', '0', 'system:config:remove', '#', 103, 1, '2025-12-19 11:57:50', NULL, NULL, '');
+INSERT INTO `sys_menu` VALUES (1035, '参数导出', 106, 5, '#', '', '', 1, 0, 'F', '0', '0', 'system:config:export', '#', 103, 1, '2025-12-19 11:57:50', NULL, NULL, '');
+INSERT INTO `sys_menu` VALUES (1036, '公告查询', 107, 1, '#', '', '', 1, 0, 'F', '0', '0', 'system:notice:query', '#', 103, 1, '2025-12-19 11:57:50', NULL, NULL, '');
+INSERT INTO `sys_menu` VALUES (1037, '公告新增', 107, 2, '#', '', '', 1, 0, 'F', '0', '0', 'system:notice:add', '#', 103, 1, '2025-12-19 11:57:50', NULL, NULL, '');
+INSERT INTO `sys_menu` VALUES (1038, '公告修改', 107, 3, '#', '', '', 1, 0, 'F', '0', '0', 'system:notice:edit', '#', 103, 1, '2025-12-19 11:57:50', NULL, NULL, '');
+INSERT INTO `sys_menu` VALUES (1039, '公告删除', 107, 4, '#', '', '', 1, 0, 'F', '0', '0', 'system:notice:remove', '#', 103, 1, '2025-12-19 11:57:50', NULL, NULL, '');
+INSERT INTO `sys_menu` VALUES (1040, '操作查询', 500, 1, '#', '', '', 1, 0, 'F', '0', '0', 'monitor:operlog:query', '#', 103, 1, '2025-12-19 11:57:50', NULL, NULL, '');
+INSERT INTO `sys_menu` VALUES (1041, '操作删除', 500, 2, '#', '', '', 1, 0, 'F', '0', '0', 'monitor:operlog:remove', '#', 103, 1, '2025-12-19 11:57:50', NULL, NULL, '');
+INSERT INTO `sys_menu` VALUES (1042, '日志导出', 500, 4, '#', '', '', 1, 0, 'F', '0', '0', 'monitor:operlog:export', '#', 103, 1, '2025-12-19 11:57:50', NULL, NULL, '');
+INSERT INTO `sys_menu` VALUES (1043, '登录查询', 501, 1, '#', '', '', 1, 0, 'F', '0', '0', 'monitor:logininfor:query', '#', 103, 1, '2025-12-19 11:57:50', NULL, NULL, '');
+INSERT INTO `sys_menu` VALUES (1044, '登录删除', 501, 2, '#', '', '', 1, 0, 'F', '0', '0', 'monitor:logininfor:remove', '#', 103, 1, '2025-12-19 11:57:50', NULL, NULL, '');
+INSERT INTO `sys_menu` VALUES (1045, '日志导出', 501, 3, '#', '', '', 1, 0, 'F', '0', '0', 'monitor:logininfor:export', '#', 103, 1, '2025-12-19 11:57:50', NULL, NULL, '');
+INSERT INTO `sys_menu` VALUES (1046, '在线查询', 109, 1, '#', '', '', 1, 0, 'F', '0', '0', 'monitor:online:query', '#', 103, 1, '2025-12-19 11:57:50', NULL, NULL, '');
+INSERT INTO `sys_menu` VALUES (1047, '批量强退', 109, 2, '#', '', '', 1, 0, 'F', '0', '0', 'monitor:online:batchLogout', '#', 103, 1, '2025-12-19 11:57:50', NULL, NULL, '');
+INSERT INTO `sys_menu` VALUES (1048, '单条强退', 109, 3, '#', '', '', 1, 0, 'F', '0', '0', 'monitor:online:forceLogout', '#', 103, 1, '2025-12-19 11:57:50', NULL, NULL, '');
+INSERT INTO `sys_menu` VALUES (1050, '账户解锁', 501, 4, '#', '', '', 1, 0, 'F', '0', '0', 'monitor:logininfor:unlock', '#', 103, 1, '2025-12-19 11:57:50', NULL, NULL, '');
+INSERT INTO `sys_menu` VALUES (1055, '生成查询', 115, 1, '#', '', '', 1, 0, 'F', '0', '0', 'tool:gen:query', '#', 103, 1, '2025-12-19 11:57:50', NULL, NULL, '');
+INSERT INTO `sys_menu` VALUES (1056, '生成修改', 115, 2, '#', '', '', 1, 0, 'F', '0', '0', 'tool:gen:edit', '#', 103, 1, '2025-12-19 11:57:50', NULL, NULL, '');
+INSERT INTO `sys_menu` VALUES (1057, '生成删除', 115, 3, '#', '', '', 1, 0, 'F', '0', '0', 'tool:gen:remove', '#', 103, 1, '2025-12-19 11:57:50', NULL, NULL, '');
+INSERT INTO `sys_menu` VALUES (1058, '导入代码', 115, 2, '#', '', '', 1, 0, 'F', '0', '0', 'tool:gen:import', '#', 103, 1, '2025-12-19 11:57:50', NULL, NULL, '');
+INSERT INTO `sys_menu` VALUES (1059, '预览代码', 115, 4, '#', '', '', 1, 0, 'F', '0', '0', 'tool:gen:preview', '#', 103, 1, '2025-12-19 11:57:50', NULL, NULL, '');
+INSERT INTO `sys_menu` VALUES (1060, '生成代码', 115, 5, '#', '', '', 1, 0, 'F', '0', '0', 'tool:gen:code', '#', 103, 1, '2025-12-19 11:57:50', NULL, NULL, '');
+INSERT INTO `sys_menu` VALUES (1061, '客户端管理查询', 123, 1, '#', '', '', 1, 0, 'F', '0', '0', 'system:client:query', '#', 103, 1, '2025-12-19 11:57:50', NULL, NULL, '');
+INSERT INTO `sys_menu` VALUES (1062, '客户端管理新增', 123, 2, '#', '', '', 1, 0, 'F', '0', '0', 'system:client:add', '#', 103, 1, '2025-12-19 11:57:50', NULL, NULL, '');
+INSERT INTO `sys_menu` VALUES (1063, '客户端管理修改', 123, 3, '#', '', '', 1, 0, 'F', '0', '0', 'system:client:edit', '#', 103, 1, '2025-12-19 11:57:50', NULL, NULL, '');
+INSERT INTO `sys_menu` VALUES (1064, '客户端管理删除', 123, 4, '#', '', '', 1, 0, 'F', '0', '0', 'system:client:remove', '#', 103, 1, '2025-12-19 11:57:50', NULL, NULL, '');
+INSERT INTO `sys_menu` VALUES (1065, '客户端管理导出', 123, 5, '#', '', '', 1, 0, 'F', '0', '0', 'system:client:export', '#', 103, 1, '2025-12-19 11:57:50', NULL, NULL, '');
+INSERT INTO `sys_menu` VALUES (1500, '测试单表', 5, 1, 'demo', 'demo/demo/index', '', 1, 0, 'C', '0', '0', 'demo:demo:list', '#', 103, 1, '2025-12-19 11:57:50', NULL, NULL, '测试单表菜单');
+INSERT INTO `sys_menu` VALUES (1501, '测试单表查询', 1500, 1, '#', '', '', 1, 0, 'F', '0', '0', 'demo:demo:query', '#', 103, 1, '2025-12-19 11:57:50', NULL, NULL, '');
+INSERT INTO `sys_menu` VALUES (1502, '测试单表新增', 1500, 2, '#', '', '', 1, 0, 'F', '0', '0', 'demo:demo:add', '#', 103, 1, '2025-12-19 11:57:50', NULL, NULL, '');
+INSERT INTO `sys_menu` VALUES (1503, '测试单表修改', 1500, 3, '#', '', '', 1, 0, 'F', '0', '0', 'demo:demo:edit', '#', 103, 1, '2025-12-19 11:57:50', NULL, NULL, '');
+INSERT INTO `sys_menu` VALUES (1504, '测试单表删除', 1500, 4, '#', '', '', 1, 0, 'F', '0', '0', 'demo:demo:remove', '#', 103, 1, '2025-12-19 11:57:50', NULL, NULL, '');
+INSERT INTO `sys_menu` VALUES (1505, '测试单表导出', 1500, 5, '#', '', '', 1, 0, 'F', '0', '0', 'demo:demo:export', '#', 103, 1, '2025-12-19 11:57:50', NULL, NULL, '');
+INSERT INTO `sys_menu` VALUES (1506, '测试树表', 5, 1, 'tree', 'demo/tree/index', '', 1, 0, 'C', '0', '0', 'demo:tree:list', '#', 103, 1, '2025-12-19 11:57:50', NULL, NULL, '测试树表菜单');
+INSERT INTO `sys_menu` VALUES (1507, '测试树表查询', 1506, 1, '#', '', '', 1, 0, 'F', '0', '0', 'demo:tree:query', '#', 103, 1, '2025-12-19 11:57:50', NULL, NULL, '');
+INSERT INTO `sys_menu` VALUES (1508, '测试树表新增', 1506, 2, '#', '', '', 1, 0, 'F', '0', '0', 'demo:tree:add', '#', 103, 1, '2025-12-19 11:57:50', NULL, NULL, '');
+INSERT INTO `sys_menu` VALUES (1509, '测试树表修改', 1506, 3, '#', '', '', 1, 0, 'F', '0', '0', 'demo:tree:edit', '#', 103, 1, '2025-12-19 11:57:50', NULL, NULL, '');
+INSERT INTO `sys_menu` VALUES (1510, '测试树表删除', 1506, 4, '#', '', '', 1, 0, 'F', '0', '0', 'demo:tree:remove', '#', 103, 1, '2025-12-19 11:57:50', NULL, NULL, '');
+INSERT INTO `sys_menu` VALUES (1511, '测试树表导出', 1506, 5, '#', '', '', 1, 0, 'F', '0', '0', 'demo:tree:export', '#', 103, 1, '2025-12-19 11:57:50', NULL, NULL, '');
+INSERT INTO `sys_menu` VALUES (1600, '文件查询', 118, 1, '#', '', '', 1, 0, 'F', '0', '0', 'system:oss:query', '#', 103, 1, '2025-12-19 11:57:50', NULL, NULL, '');
+INSERT INTO `sys_menu` VALUES (1601, '文件上传', 118, 2, '#', '', '', 1, 0, 'F', '0', '0', 'system:oss:upload', '#', 103, 1, '2025-12-19 11:57:50', NULL, NULL, '');
+INSERT INTO `sys_menu` VALUES (1602, '文件下载', 118, 3, '#', '', '', 1, 0, 'F', '0', '0', 'system:oss:download', '#', 103, 1, '2025-12-19 11:57:50', NULL, NULL, '');
+INSERT INTO `sys_menu` VALUES (1603, '文件删除', 118, 4, '#', '', '', 1, 0, 'F', '0', '0', 'system:oss:remove', '#', 103, 1, '2025-12-19 11:57:50', NULL, NULL, '');
+INSERT INTO `sys_menu` VALUES (1606, '租户查询', 121, 1, '#', '', '', 1, 0, 'F', '0', '0', 'system:tenant:query', '#', 103, 1, '2025-12-19 11:57:50', NULL, NULL, '');
+INSERT INTO `sys_menu` VALUES (1607, '租户新增', 121, 2, '#', '', '', 1, 0, 'F', '0', '0', 'system:tenant:add', '#', 103, 1, '2025-12-19 11:57:50', NULL, NULL, '');
+INSERT INTO `sys_menu` VALUES (1608, '租户修改', 121, 3, '#', '', '', 1, 0, 'F', '0', '0', 'system:tenant:edit', '#', 103, 1, '2025-12-19 11:57:50', NULL, NULL, '');
+INSERT INTO `sys_menu` VALUES (1609, '租户删除', 121, 4, '#', '', '', 1, 0, 'F', '0', '0', 'system:tenant:remove', '#', 103, 1, '2025-12-19 11:57:50', NULL, NULL, '');
+INSERT INTO `sys_menu` VALUES (1610, '租户导出', 121, 5, '#', '', '', 1, 0, 'F', '0', '0', 'system:tenant:export', '#', 103, 1, '2025-12-19 11:57:50', NULL, NULL, '');
+INSERT INTO `sys_menu` VALUES (1611, '租户套餐查询', 122, 1, '#', '', '', 1, 0, 'F', '0', '0', 'system:tenantPackage:query', '#', 103, 1, '2025-12-19 11:57:50', NULL, NULL, '');
+INSERT INTO `sys_menu` VALUES (1612, '租户套餐新增', 122, 2, '#', '', '', 1, 0, 'F', '0', '0', 'system:tenantPackage:add', '#', 103, 1, '2025-12-19 11:57:50', NULL, NULL, '');
+INSERT INTO `sys_menu` VALUES (1613, '租户套餐修改', 122, 3, '#', '', '', 1, 0, 'F', '0', '0', 'system:tenantPackage:edit', '#', 103, 1, '2025-12-19 11:57:50', NULL, NULL, '');
+INSERT INTO `sys_menu` VALUES (1614, '租户套餐删除', 122, 4, '#', '', '', 1, 0, 'F', '0', '0', 'system:tenantPackage:remove', '#', 103, 1, '2025-12-19 11:57:50', NULL, NULL, '');
+INSERT INTO `sys_menu` VALUES (1615, '租户套餐导出', 122, 5, '#', '', '', 1, 0, 'F', '0', '0', 'system:tenantPackage:export', '#', 103, 1, '2025-12-19 11:57:50', NULL, NULL, '');
+INSERT INTO `sys_menu` VALUES (1620, '配置列表', 118, 5, '#', '', '', 1, 0, 'F', '0', '0', 'system:ossConfig:list', '#', 103, 1, '2025-12-19 11:57:50', NULL, NULL, '');
+INSERT INTO `sys_menu` VALUES (1621, '配置添加', 118, 6, '#', '', '', 1, 0, 'F', '0', '0', 'system:ossConfig:add', '#', 103, 1, '2025-12-19 11:57:50', NULL, NULL, '');
+INSERT INTO `sys_menu` VALUES (1622, '配置编辑', 118, 6, '#', '', '', 1, 0, 'F', '0', '0', 'system:ossConfig:edit', '#', 103, 1, '2025-12-19 11:57:50', NULL, NULL, '');
+INSERT INTO `sys_menu` VALUES (1623, '配置删除', 118, 6, '#', '', '', 1, 0, 'F', '0', '0', 'system:ossConfig:remove', '#', 103, 1, '2025-12-19 11:57:50', NULL, NULL, '');
+INSERT INTO `sys_menu` VALUES (2001, '用户查询', 2003723797282275329, 1, '', NULL, NULL, 1, 0, 'F', '0', '0', 'miniapp:user:query', '#', NULL, 1, '2025-12-24 16:14:14', NULL, NULL, '获取小程序用户详细信息');
+INSERT INTO `sys_menu` VALUES (2002, '用户导出', 2003723797282275329, 2, '', NULL, NULL, 1, 0, 'F', '0', '0', 'miniapp:user:export', '#', NULL, 1, '2025-12-24 16:14:14', NULL, NULL, '导出小程序用户列表');
+INSERT INTO `sys_menu` VALUES (2003, '用户修改', 2003723797282275329, 3, '', NULL, NULL, 1, 0, 'F', '0', '0', 'miniapp:user:edit', '#', NULL, 1, '2025-12-24 16:14:14', NULL, NULL, '修改用户状态和积分');
+INSERT INTO `sys_menu` VALUES (2004, '用户删除', 2003723797282275329, 4, '', NULL, NULL, 1, 0, 'F', '0', '0', 'miniapp:user:remove', '#', NULL, 1, '2025-12-29 16:00:00', NULL, NULL, '删除小程序用户');
+INSERT INTO `sys_menu` VALUES (2005310001, '超短池', 2003743180448710658, 2, 'shortPool', 'stock/shortPool/index', '', 1, 0, 'C', '0', '0', 'stock:pool:list', 'monitor', 103, 1, '2025-12-29 00:16:30', 1, '2025-12-29 00:33:08', '超短池菜单');
+INSERT INTO `sys_menu` VALUES (2005310002, '超短池查询', 2005310001, 1, '', '', '', 1, 0, 'F', '0', '0', 'stock:pool:query', '#', 103, 1, '2025-12-29 00:16:30', NULL, NULL, '');
+INSERT INTO `sys_menu` VALUES (2005310003, '超短池新增', 2005310001, 2, '', '', '', 1, 0, 'F', '0', '0', 'stock:pool:add', '#', 103, 1, '2025-12-29 00:16:30', NULL, NULL, '');
+INSERT INTO `sys_menu` VALUES (2005310004, '超短池删除', 2005310001, 3, '', '', '', 1, 0, 'F', '0', '0', 'stock:pool:remove', '#', 103, 1, '2025-12-29 00:16:30', NULL, NULL, '');
+INSERT INTO `sys_menu` VALUES (2005310005, '超短池导出', 2005310001, 4, '', '', '', 1, 0, 'F', '0', '0', 'stock:pool:export', '#', 103, 1, '2025-12-29 00:16:30', NULL, NULL, '');
+INSERT INTO `sys_menu` VALUES (2005310006, '强势池', 2003743180448710658, 3, 'strongPool', 'stock/strongPool/index', '', 1, 0, 'C', '0', '0', 'stock:pool:list', 'chart', 103, 1, '2025-12-29 10:31:03', NULL, NULL, '强势池菜单');
+INSERT INTO `sys_menu` VALUES (2005310007, '强势池查询', 2005310006, 1, '', '', '', 1, 0, 'F', '0', '0', 'stock:pool:query', '#', 103, 1, '2025-12-29 10:31:03', NULL, NULL, '');
+INSERT INTO `sys_menu` VALUES (2005310008, '强势池新增', 2005310006, 2, '', '', '', 1, 0, 'F', '0', '0', 'stock:pool:add', '#', 103, 1, '2025-12-29 10:31:03', NULL, NULL, '');
+INSERT INTO `sys_menu` VALUES (2005310009, '强势池删除', 2005310006, 3, '', '', '', 1, 0, 'F', '0', '0', 'stock:pool:remove', '#', 103, 1, '2025-12-29 10:31:03', NULL, NULL, '');
+INSERT INTO `sys_menu` VALUES (2005310010, '股票信息', 2003743180448710658, 1, 'info', 'stock/info/index', '', 1, 0, 'C', '0', '0', 'stock:info:list', 'list', 103, 1, '2025-12-29 00:16:30', 1, '2025-12-29 00:33:41', '股票信息菜单');
+INSERT INTO `sys_menu` VALUES (2005310011, '股票信息查询', 2005310010, 1, '', '', '', 1, 0, 'F', '0', '0', 'stock:info:query', '#', 103, 1, '2025-12-29 00:16:30', NULL, NULL, '');
+INSERT INTO `sys_menu` VALUES (2005310012, '股票信息新增', 2005310010, 2, '', '', '', 1, 0, 'F', '0', '0', 'stock:info:add', '#', 103, 1, '2025-12-29 00:16:30', NULL, NULL, '');
+INSERT INTO `sys_menu` VALUES (2005310013, '股票信息修改', 2005310010, 3, '', '', '', 1, 0, 'F', '0', '0', 'stock:info:edit', '#', 103, 1, '2025-12-29 00:16:30', NULL, NULL, '');
+INSERT INTO `sys_menu` VALUES (2005310014, '股票信息删除', 2005310010, 4, '', '', '', 1, 0, 'F', '0', '0', 'stock:info:remove', '#', 103, 1, '2025-12-29 00:16:30', NULL, NULL, '');
+INSERT INTO `sys_menu` VALUES (2005310015, '股票信息导出', 2005310010, 5, '', '', '', 1, 0, 'F', '0', '0', 'stock:info:export', '#', 103, 1, '2025-12-29 00:16:30', NULL, NULL, '');
+INSERT INTO `sys_menu` VALUES (2005310016, '股票信息同步', 2005310010, 6, '', '', '', 1, 0, 'F', '0', '0', 'stock:info:sync', '#', 103, 1, '2025-12-29 00:16:30', NULL, NULL, '');
+INSERT INTO `sys_menu` VALUES (2005310017, '强势池导出', 2005310006, 4, '', '', '', 1, 0, 'F', '0', '0', 'stock:pool:export', '#', 103, 1, '2025-12-29 10:31:03', NULL, NULL, '');
+INSERT INTO `sys_menu` VALUES (2005310020, '支付配置', 2004074990147751937, 1, 'paymentConfig', NULL, '', 1, 0, 'M', '0', '0', '', 'money', 103, 1, '2025-12-29 17:00:38', NULL, NULL, '支付配置菜单');
+INSERT INTO `sys_menu` VALUES (2005310021, '支付配置查询', 2005310020, 1, '', '', '', 1, 0, 'F', '0', '0', 'miniapp:paymentConfig:query', '#', 103, 1, '2025-12-29 17:00:38', NULL, NULL, '');
+INSERT INTO `sys_menu` VALUES (2005310022, '支付配置修改', 2005310020, 2, '', '', '', 1, 0, 'F', '0', '0', 'miniapp:paymentConfig:edit', '#', 103, 1, '2025-12-29 17:00:38', NULL, NULL, '');
+INSERT INTO `sys_menu` VALUES (2005310023, '微信支付配置', 2005310020, 1, 'wxpay', 'settings/paymentConfig/wxpay', '', 1, 0, 'C', '0', '0', 'miniapp:paymentConfig:list', 'wechat', 103, 1, '2025-12-30 09:23:59', NULL, NULL, '微信小程序支付配置');
+INSERT INTO `sys_menu` VALUES (2005310024, '订阅价格配置', 2005310020, 2, 'subscription', 'settings/paymentConfig/subscription', '', 1, 0, 'C', '0', '0', 'miniapp:paymentConfig:list', 'money', 103, 1, '2025-12-30 09:24:11', NULL, NULL, '超短池与强势池订阅价格配置');
+INSERT INTO `sys_menu` VALUES (2005310030, '订阅记录', 2004075918359810049, 1, 'subscription', 'miniapp/subscription/index', '', 1, 0, 'C', '0', '0', 'miniapp:subscription:list', 'list', 103, 1, '2025-12-30 11:45:06', NULL, NULL, '订阅记录菜单');
+INSERT INTO `sys_menu` VALUES (2005310031, '订阅查询', 2005310030, 1, '', NULL, NULL, 1, 0, 'F', '0', '0', 'miniapp:subscription:query', '#', 103, 1, '2025-12-30 11:45:06', NULL, NULL, '');
+INSERT INTO `sys_menu` VALUES (2005310032, '订阅编辑', 2005310030, 2, '', NULL, NULL, 1, 0, 'F', '0', '0', 'miniapp:subscription:edit', '#', 103, 1, '2025-12-30 11:45:06', NULL, NULL, '');
+INSERT INTO `sys_menu` VALUES (2005310033, '订阅删除', 2005310030, 3, '', NULL, NULL, 1, 0, 'F', '0', '0', 'miniapp:subscription:remove', '#', 103, 1, '2025-12-30 11:45:06', NULL, NULL, '');
+INSERT INTO `sys_menu` VALUES (2005310034, '订阅导出', 2005310030, 4, '', NULL, NULL, 1, 0, 'F', '0', '0', 'miniapp:subscription:export', '#', 103, 1, '2025-12-30 11:45:06', NULL, NULL, '');
+INSERT INTO `sys_menu` VALUES (2005310035, '订单记录', 2004075918359810049, 2, 'order', 'miniapp/order/index', '', 1, 0, 'C', '0', '0', 'miniapp:order:list', 'documentation', 103, 1, '2025-12-30 11:45:06', NULL, NULL, '订单记录菜单');
+INSERT INTO `sys_menu` VALUES (2005310036, '订单查询', 2005310035, 1, '', NULL, NULL, 1, 0, 'F', '0', '0', 'miniapp:order:query', '#', 103, 1, '2025-12-30 11:45:06', NULL, NULL, '');
+INSERT INTO `sys_menu` VALUES (2005310037, '订单删除', 2005310035, 2, '', NULL, NULL, 1, 0, 'F', '0', '0', 'miniapp:order:remove', '#', 103, 1, '2025-12-30 11:45:06', NULL, NULL, '');
+INSERT INTO `sys_menu` VALUES (2005310038, '订单导出', 2005310035, 3, '', NULL, NULL, 1, 0, 'F', '0', '0', 'miniapp:order:export', '#', 103, 1, '2025-12-30 11:45:06', NULL, NULL, '');
+INSERT INTO `sys_menu` VALUES (2005310040, '协议配置', 2004074990147751937, 2, 'agreement', 'settings/agreement/index', '', 1, 0, 'C', '0', '0', 'miniapp:agreement:list', 'documentation', 103, 1, '2026-01-04 17:06:24', NULL, NULL, '用户协议与隐私政策配置');
+INSERT INTO `sys_menu` VALUES (2005310041, '协议查询', 2005310040, 1, '', '', '', 1, 0, 'F', '0', '0', 'miniapp:agreement:query', '#', 103, 1, '2026-01-04 17:06:24', NULL, NULL, '');
+INSERT INTO `sys_menu` VALUES (2005310042, '协议修改', 2005310040, 2, '', '', '', 1, 0, 'F', '0', '0', 'miniapp:agreement:edit', '#', 103, 1, '2026-01-04 17:06:24', NULL, NULL, '');
+INSERT INTO `sys_menu` VALUES (2003723797282275329, '用户管理', 0, 1, 'miniapp/user', 'miniapp/user/index', '', 1, 0, 'C', '0', '0', 'miniapp:user:list', 'peoples', 103, 1, '2025-12-24 15:05:55', 1, '2025-12-29 11:45:11', '');
+INSERT INTO `sys_menu` VALUES (2003743180448710658, '股票管理', 0, 3, 'stock', NULL, NULL, 1, 0, 'M', '0', '0', '', 'chart', 103, 1, '2025-12-24 16:22:57', 1, '2025-12-29 00:32:32', '');
+INSERT INTO `sys_menu` VALUES (2004074990147751937, '配置管理', 0, 4, 'settings', NULL, NULL, 1, 0, 'M', '0', '0', NULL, 'example', 103, 1, '2025-12-25 14:21:26', 1, '2025-12-29 11:45:37', '');
+INSERT INTO `sys_menu` VALUES (2004075918359810049, '订阅管理', 0, 2, 'miniapp/order', NULL, NULL, 1, 0, 'M', '0', '0', '', 'shopping', 103, 1, '2025-12-25 14:25:08', 1, '2025-12-29 00:45:16', '');
+
+SET FOREIGN_KEY_CHECKS = 1;