diff --git a/demo/frontend/src/api/analytics.js b/demo/frontend/src/api/analytics.js new file mode 100644 index 0000000..86a421c --- /dev/null +++ b/demo/frontend/src/api/analytics.js @@ -0,0 +1,27 @@ +import request from './request' + +// 获取日活用户趋势数据 +export const getDailyActiveUsersTrend = (year = '2024', granularity = 'monthly') => { + return request({ + url: '/analytics/daily-active-users', + method: 'get', + params: { year, granularity } + }) +} + +// 获取用户活跃度概览 +export const getUserActivityOverview = () => { + return request({ + url: '/analytics/user-activity-overview', + method: 'get' + }) +} + +// 获取用户活跃度热力图数据 +export const getUserActivityHeatmap = (year = '2024') => { + return request({ + url: '/analytics/user-activity-heatmap', + method: 'get', + params: { year } + }) +} diff --git a/demo/frontend/src/components/DailyActiveUsersChart.vue b/demo/frontend/src/components/DailyActiveUsersChart.vue new file mode 100644 index 0000000..f00db85 --- /dev/null +++ b/demo/frontend/src/components/DailyActiveUsersChart.vue @@ -0,0 +1,398 @@ + + + + + diff --git a/demo/frontend/src/views/Home.vue b/demo/frontend/src/views/Home.vue index c3a61c4..c25b748 100644 --- a/demo/frontend/src/views/Home.vue +++ b/demo/frontend/src/views/Home.vue @@ -236,6 +236,7 @@ import { useRouter } from 'vue-router' import { useUserStore } from '@/stores/user' import { ElMessage } from 'element-plus' import * as dashboardAPI from '@/api/dashboard' +import DailyActiveUsersChart from '@/components/DailyActiveUsersChart.vue' const router = useRouter() const userStore = useUserStore() diff --git a/demo/src/main/java/com/example/demo/controller/AnalyticsApiController.java b/demo/src/main/java/com/example/demo/controller/AnalyticsApiController.java new file mode 100644 index 0000000..95f7fc7 --- /dev/null +++ b/demo/src/main/java/com/example/demo/controller/AnalyticsApiController.java @@ -0,0 +1,174 @@ +package com.example.demo.controller; + +import com.example.demo.repository.UserActivityStatsRepository; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; +import java.util.*; +import java.util.stream.Collectors; + +@RestController +@RequestMapping("/api/analytics") +@CrossOrigin(origins = "*") +public class AnalyticsApiController { + + @Autowired + private UserActivityStatsRepository userActivityStatsRepository; + + /** + * 获取日活用户趋势数据 + */ + @GetMapping("/daily-active-users") + public ResponseEntity> getDailyActiveUsersTrend( + @RequestParam(defaultValue = "2024") String year, + @RequestParam(defaultValue = "monthly") String granularity) { + try { + Map response = new HashMap<>(); + + if ("monthly".equals(granularity)) { + // 按月聚合数据 + List> monthlyData = userActivityStatsRepository.findMonthlyActiveUsers(Integer.parseInt(year)); + + // 确保12个月都有数据 + List> completeData = new ArrayList<>(); + for (int month = 1; month <= 12; month++) { + final int currentMonth = month; + Optional> monthData = monthlyData.stream() + .filter(data -> { + Object monthObj = data.get("month"); + if (monthObj instanceof Number) { + return ((Number) monthObj).intValue() == currentMonth; + } + return false; + }) + .findFirst(); + + if (monthData.isPresent()) { + completeData.add(monthData.get()); + } else { + Map emptyMonth = new HashMap<>(); + emptyMonth.put("month", currentMonth); + emptyMonth.put("dailyActiveUsers", 0); + emptyMonth.put("avgDailyActive", 0.0); + completeData.add(emptyMonth); + } + } + + response.put("monthlyData", completeData); + } else { + // 按日返回数据 + List> dailyData = userActivityStatsRepository.findDailyActiveUsersByYear(Integer.parseInt(year)); + response.put("dailyData", dailyData); + } + + response.put("year", year); + response.put("granularity", granularity); + + return ResponseEntity.ok(response); + + } catch (Exception e) { + Map error = new HashMap<>(); + error.put("error", "获取日活用户趋势数据失败"); + error.put("message", e.getMessage()); + return ResponseEntity.status(500).body(error); + } + } + + /** + * 获取用户活跃度概览 + */ + @GetMapping("/user-activity-overview") + public ResponseEntity> getUserActivityOverview() { + try { + Map response = new HashMap<>(); + + // 获取最新数据 + LocalDate today = LocalDate.now(); + LocalDate yesterday = today.minusDays(1); + LocalDate lastMonth = today.minusMonths(1); + LocalDate lastYear = today.minusYears(1); + + // 今日日活 + Integer todayDAU = userActivityStatsRepository.findDailyActiveUsersByDate(today); + response.put("todayDAU", todayDAU != null ? todayDAU : 0); + + // 昨日日活 + Integer yesterdayDAU = userActivityStatsRepository.findDailyActiveUsersByDate(yesterday); + response.put("yesterdayDAU", yesterdayDAU != null ? yesterdayDAU : 0); + + // 本月平均日活 + Double monthlyAvgDAU = userActivityStatsRepository.findAverageDailyActiveUsersByMonth(today.getYear(), today.getMonthValue()); + response.put("monthlyAvgDAU", monthlyAvgDAU != null ? monthlyAvgDAU : 0.0); + + // 上月平均日活 + LocalDate lastMonthDate = today.minusMonths(1); + Double lastMonthAvgDAU = userActivityStatsRepository.findAverageDailyActiveUsersByMonth(lastMonthDate.getYear(), lastMonthDate.getMonthValue()); + response.put("lastMonthAvgDAU", lastMonthAvgDAU != null ? lastMonthAvgDAU : 0.0); + + // 年度平均日活 + Double yearlyAvgDAU = userActivityStatsRepository.findAverageDailyActiveUsersByYear(today.getYear()); + response.put("yearlyAvgDAU", yearlyAvgDAU != null ? yearlyAvgDAU : 0.0); + + // 计算增长率 + if (yesterdayDAU != null && yesterdayDAU > 0) { + double dayGrowthRate = ((todayDAU != null ? todayDAU : 0) - yesterdayDAU) / (double) yesterdayDAU * 100; + response.put("dayGrowthRate", Math.round(dayGrowthRate * 100.0) / 100.0); + } else { + response.put("dayGrowthRate", 0.0); + } + + if (lastMonthAvgDAU != null && lastMonthAvgDAU > 0) { + double monthGrowthRate = ((monthlyAvgDAU != null ? monthlyAvgDAU : 0) - lastMonthAvgDAU) / lastMonthAvgDAU * 100; + response.put("monthGrowthRate", Math.round(monthGrowthRate * 100.0) / 100.0); + } else { + response.put("monthGrowthRate", 0.0); + } + + return ResponseEntity.ok(response); + + } catch (Exception e) { + Map error = new HashMap<>(); + error.put("error", "获取用户活跃度概览失败"); + error.put("message", e.getMessage()); + return ResponseEntity.status(500).body(error); + } + } + + /** + * 获取用户活跃度热力图数据 + */ + @GetMapping("/user-activity-heatmap") + public ResponseEntity> getUserActivityHeatmap( + @RequestParam(defaultValue = "2024") String year) { + try { + Map response = new HashMap<>(); + + // 获取全年每日数据 + List> dailyData = userActivityStatsRepository.findDailyActiveUsersByYear(Integer.parseInt(year)); + + // 转换为热力图格式 + List> heatmapData = new ArrayList<>(); + for (Map data : dailyData) { + List point = new ArrayList<>(); + point.add(data.get("dayOfYear")); // 一年中的第几天 + point.add(data.get("weekOfYear")); // 一年中的第几周 + point.add(data.get("dailyActiveUsers")); // 日活用户数 + heatmapData.add(point); + } + + response.put("heatmapData", heatmapData); + response.put("year", year); + + return ResponseEntity.ok(response); + + } catch (Exception e) { + Map error = new HashMap<>(); + error.put("error", "获取用户活跃度热力图数据失败"); + error.put("message", e.getMessage()); + return ResponseEntity.status(500).body(error); + } + } +} diff --git a/demo/src/main/java/com/example/demo/model/UserActivityStats.java b/demo/src/main/java/com/example/demo/model/UserActivityStats.java new file mode 100644 index 0000000..78f98f2 --- /dev/null +++ b/demo/src/main/java/com/example/demo/model/UserActivityStats.java @@ -0,0 +1,84 @@ +package com.example.demo.model; + +import jakarta.persistence.*; +import java.math.BigDecimal; +import java.time.LocalDate; +import java.time.LocalDateTime; + +@Entity +@Table(name = "user_activity_stats") +public class UserActivityStats { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @Column(name = "stat_date", nullable = false, unique = true) + private LocalDate statDate; + + @Column(name = "daily_active_users", nullable = false) + private Integer dailyActiveUsers = 0; + + @Column(name = "monthly_active_users", nullable = false) + private Integer monthlyActiveUsers = 0; + + @Column(name = "new_users", nullable = false) + private Integer newUsers = 0; + + @Column(name = "returning_users", nullable = false) + private Integer returningUsers = 0; + + @Column(name = "session_count", nullable = false) + private Integer sessionCount = 0; + + @Column(name = "avg_session_duration", precision = 10, scale = 2) + private BigDecimal avgSessionDuration = BigDecimal.ZERO; + + @Column(name = "created_at", nullable = false) + private LocalDateTime createdAt; + + @Column(name = "updated_at") + private LocalDateTime updatedAt; + + @PrePersist + protected void onCreate() { + createdAt = LocalDateTime.now(); + updatedAt = LocalDateTime.now(); + } + + @PreUpdate + protected void onUpdate() { + updatedAt = LocalDateTime.now(); + } + + // Getters and Setters + public Long getId() { return id; } + public void setId(Long id) { this.id = id; } + + public LocalDate getStatDate() { return statDate; } + public void setStatDate(LocalDate statDate) { this.statDate = statDate; } + + public Integer getDailyActiveUsers() { return dailyActiveUsers; } + public void setDailyActiveUsers(Integer dailyActiveUsers) { this.dailyActiveUsers = dailyActiveUsers; } + + public Integer getMonthlyActiveUsers() { return monthlyActiveUsers; } + public void setMonthlyActiveUsers(Integer monthlyActiveUsers) { this.monthlyActiveUsers = monthlyActiveUsers; } + + public Integer getNewUsers() { return newUsers; } + public void setNewUsers(Integer newUsers) { this.newUsers = newUsers; } + + public Integer getReturningUsers() { return returningUsers; } + public void setReturningUsers(Integer returningUsers) { this.returningUsers = returningUsers; } + + public Integer getSessionCount() { return sessionCount; } + public void setSessionCount(Integer sessionCount) { this.sessionCount = sessionCount; } + + public BigDecimal getAvgSessionDuration() { return avgSessionDuration; } + public void setAvgSessionDuration(BigDecimal avgSessionDuration) { this.avgSessionDuration = avgSessionDuration; } + + public LocalDateTime getCreatedAt() { return createdAt; } + public void setCreatedAt(LocalDateTime createdAt) { this.createdAt = createdAt; } + + public LocalDateTime getUpdatedAt() { return updatedAt; } + public void setUpdatedAt(LocalDateTime updatedAt) { this.updatedAt = updatedAt; } +} diff --git a/demo/src/main/java/com/example/demo/repository/UserActivityStatsRepository.java b/demo/src/main/java/com/example/demo/repository/UserActivityStatsRepository.java new file mode 100644 index 0000000..c65649a --- /dev/null +++ b/demo/src/main/java/com/example/demo/repository/UserActivityStatsRepository.java @@ -0,0 +1,76 @@ +package com.example.demo.repository; + +import com.example.demo.model.UserActivityStats; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; +import org.springframework.stereotype.Repository; + +import java.time.LocalDate; +import java.util.List; +import java.util.Map; +import java.util.Optional; + +@Repository +public interface UserActivityStatsRepository extends JpaRepository { + + /** + * 根据日期查找日活用户数 + */ + @Query("SELECT uas.dailyActiveUsers FROM UserActivityStats uas WHERE uas.statDate = :date") + Integer findDailyActiveUsersByDate(@Param("date") LocalDate date); + + /** + * 获取指定年份的月度日活用户数据 + */ + @Query("SELECT MONTH(uas.statDate) as month, " + + "AVG(uas.dailyActiveUsers) as avgDailyActive, " + + "MAX(uas.dailyActiveUsers) as maxDailyActive, " + + "MIN(uas.dailyActiveUsers) as minDailyActive " + + "FROM UserActivityStats uas " + + "WHERE YEAR(uas.statDate) = :year " + + "GROUP BY MONTH(uas.statDate) " + + "ORDER BY MONTH(uas.statDate)") + List> findMonthlyActiveUsers(@Param("year") int year); + + /** + * 获取指定年份的每日日活用户数据 + */ + @Query("SELECT DAYOFYEAR(uas.statDate) as dayOfYear, " + + "WEEK(uas.statDate) as weekOfYear, " + + "uas.dailyActiveUsers as dailyActiveUsers, " + + "uas.statDate as statDate " + + "FROM UserActivityStats uas " + + "WHERE YEAR(uas.statDate) = :year " + + "ORDER BY uas.statDate") + List> findDailyActiveUsersByYear(@Param("year") int year); + + /** + * 获取指定月份的平均日活用户数 + */ + @Query("SELECT AVG(uas.dailyActiveUsers) FROM UserActivityStats uas " + + "WHERE YEAR(uas.statDate) = :year AND MONTH(uas.statDate) = :month") + Double findAverageDailyActiveUsersByMonth(@Param("year") int year, @Param("month") int month); + + /** + * 获取指定年份的平均日活用户数 + */ + @Query("SELECT AVG(uas.dailyActiveUsers) FROM UserActivityStats uas " + + "WHERE YEAR(uas.statDate) = :year") + Double findAverageDailyActiveUsersByYear(@Param("year") int year); + + /** + * 获取最新的统计数据 + */ + Optional findTopByOrderByStatDateDesc(); + + /** + * 获取指定日期范围的统计数据 + */ + List findByStatDateBetween(LocalDate startDate, LocalDate endDate); + + /** + * 获取指定年份的所有统计数据 + */ + List findByStatDateYear(int year); +} diff --git a/demo/src/main/resources/user_activity_stats.sql b/demo/src/main/resources/user_activity_stats.sql new file mode 100644 index 0000000..3990b88 --- /dev/null +++ b/demo/src/main/resources/user_activity_stats.sql @@ -0,0 +1,407 @@ +-- 用户活跃度统计表 +CREATE TABLE IF NOT EXISTS user_activity_stats ( + id BIGINT AUTO_INCREMENT PRIMARY KEY, + stat_date DATE NOT NULL COMMENT '统计日期', + daily_active_users INT NOT NULL DEFAULT 0 COMMENT '日活用户数', + monthly_active_users INT NOT NULL DEFAULT 0 COMMENT '月活用户数', + new_users INT NOT NULL DEFAULT 0 COMMENT '新增用户数', + returning_users INT NOT NULL DEFAULT 0 COMMENT '回访用户数', + session_count INT NOT NULL DEFAULT 0 COMMENT '会话数', + avg_session_duration DECIMAL(10,2) DEFAULT 0 COMMENT '平均会话时长(分钟)', + created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + UNIQUE KEY uk_stat_date (stat_date), + INDEX idx_stat_date (stat_date) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户活跃度统计表'; + +-- 插入2024年全年日活数据(模拟真实趋势) +INSERT IGNORE INTO user_activity_stats (stat_date, daily_active_users, monthly_active_users, new_users, returning_users, session_count, avg_session_duration) VALUES +-- 1月数据 +('2024-01-01', 1200, 15000, 50, 1150, 1800, 25.5), +('2024-01-02', 1350, 15200, 45, 1305, 2000, 28.2), +('2024-01-03', 1100, 15400, 40, 1060, 1650, 24.8), +('2024-01-04', 1250, 15600, 55, 1195, 1900, 26.7), +('2024-01-05', 1400, 15800, 60, 1340, 2100, 29.1), +('2024-01-06', 1300, 16000, 50, 1250, 1950, 27.3), +('2024-01-07', 1150, 16200, 45, 1105, 1725, 25.9), +('2024-01-08', 1200, 16400, 55, 1145, 1800, 26.4), +('2024-01-09', 1350, 16600, 65, 1285, 2025, 28.7), +('2024-01-10', 1450, 16800, 70, 1380, 2175, 30.2), +('2024-01-11', 1300, 17000, 60, 1240, 1950, 27.8), +('2024-01-12', 1250, 17200, 55, 1195, 1875, 27.1), +('2024-01-13', 1400, 17400, 75, 1325, 2100, 29.5), +('2024-01-14', 1500, 17600, 80, 1420, 2250, 31.2), +('2024-01-15', 1350, 17800, 65, 1285, 2025, 28.9), +('2024-01-16', 1200, 18000, 50, 1150, 1800, 26.7), +('2024-01-17', 1100, 18200, 45, 1055, 1650, 25.3), +('2024-01-18', 1250, 18400, 60, 1190, 1875, 27.6), +('2024-01-19', 1400, 18600, 70, 1330, 2100, 29.8), +('2024-01-20', 1450, 18800, 75, 1375, 2175, 30.5), +('2024-01-21', 1300, 19000, 60, 1240, 1950, 28.2), +('2024-01-22', 1200, 19200, 55, 1145, 1800, 27.0), +('2024-01-23', 1150, 19400, 50, 1100, 1725, 26.4), +('2024-01-24', 1250, 19600, 65, 1185, 1875, 28.1), +('2024-01-25', 1350, 19800, 70, 1280, 2025, 29.7), +('2024-01-26', 1400, 20000, 75, 1325, 2100, 30.3), +('2024-01-27', 1300, 20200, 65, 1235, 1950, 28.8), +('2024-01-28', 1250, 20400, 60, 1190, 1875, 28.2), +('2024-01-29', 1200, 20600, 55, 1145, 1800, 27.5), +('2024-01-30', 1150, 20800, 50, 1100, 1725, 26.9), +('2024-01-31', 1100, 21000, 45, 1055, 1650, 26.2), + +-- 2月数据(春节影响,数据波动较大) +('2024-02-01', 1000, 21200, 40, 960, 1500, 24.8), +('2024-02-02', 950, 21400, 35, 915, 1425, 24.1), +('2024-02-03', 900, 21600, 30, 870, 1350, 23.5), +('2024-02-04', 850, 21800, 25, 825, 1275, 22.9), +('2024-02-05', 800, 22000, 20, 780, 1200, 22.2), +('2024-02-06', 750, 22200, 15, 735, 1125, 21.6), +('2024-02-07', 700, 22400, 10, 690, 1050, 21.0), +('2024-02-08', 650, 22600, 8, 642, 975, 20.4), +('2024-02-09', 600, 22800, 5, 595, 900, 19.8), +('2024-02-10', 550, 23000, 3, 547, 825, 19.2), +('2024-02-11', 500, 23200, 2, 498, 750, 18.6), +('2024-02-12', 450, 23400, 1, 449, 675, 18.0), +('2024-02-13', 400, 23600, 1, 399, 600, 17.4), +('2024-02-14', 350, 23800, 1, 349, 525, 16.8), +('2024-02-15', 300, 24000, 1, 299, 450, 16.2), +('2024-02-16', 250, 24200, 1, 249, 375, 15.6), +('2024-02-17', 200, 24400, 1, 199, 300, 15.0), +('2024-02-18', 150, 24600, 1, 149, 225, 14.4), +('2024-02-19', 100, 24800, 1, 99, 150, 13.8), +('2024-02-20', 80, 25000, 1, 79, 120, 13.2), +('2024-02-21', 60, 25200, 1, 59, 90, 12.6), +('2024-02-22', 50, 25400, 1, 49, 75, 12.0), +('2024-02-23', 40, 25600, 1, 39, 60, 11.4), +('2024-02-24', 30, 25800, 1, 29, 45, 10.8), +('2024-02-25', 25, 26000, 1, 24, 37, 10.2), +('2024-02-26', 20, 26200, 1, 19, 30, 9.6), +('2024-02-27', 15, 26400, 1, 14, 22, 9.0), +('2024-02-28', 10, 26600, 1, 9, 15, 8.4), +('2024-02-29', 5, 26800, 1, 4, 7, 7.8), + +-- 3月数据(春节后恢复) +('2024-03-01', 200, 27000, 5, 195, 300, 12.0), +('2024-03-02', 300, 27200, 10, 290, 450, 15.0), +('2024-03-03', 400, 27400, 15, 385, 600, 18.0), +('2024-03-04', 500, 27600, 20, 480, 750, 21.0), +('2024-03-05', 600, 27800, 25, 575, 900, 24.0), +('2024-03-06', 700, 28000, 30, 670, 1050, 27.0), +('2024-03-07', 800, 28200, 35, 765, 1200, 30.0), +('2024-03-08', 900, 28400, 40, 860, 1350, 33.0), +('2024-03-09', 1000, 28600, 45, 955, 1500, 36.0), +('2024-03-10', 1100, 28800, 50, 1050, 1650, 39.0), +('2024-03-11', 1200, 29000, 55, 1145, 1800, 42.0), +('2024-03-12', 1300, 29200, 60, 1240, 1950, 45.0), +('2024-03-13', 1400, 29400, 65, 1335, 2100, 48.0), +('2024-03-14', 1500, 29600, 70, 1430, 2250, 51.0), +('2024-03-15', 1600, 29800, 75, 1525, 2400, 54.0), +('2024-03-16', 1700, 30000, 80, 1620, 2550, 57.0), +('2024-03-17', 1800, 30200, 85, 1715, 2700, 60.0), +('2024-03-18', 1900, 30400, 90, 1810, 2850, 63.0), +('2024-03-19', 2000, 30600, 95, 1905, 3000, 66.0), +('2024-03-20', 2100, 30800, 100, 2000, 3150, 69.0), +('2024-03-21', 2200, 31000, 105, 2095, 3300, 72.0), +('2024-03-22', 2300, 31200, 110, 2190, 3450, 75.0), +('2024-03-23', 2400, 31400, 115, 2285, 3600, 78.0), +('2024-03-24', 2500, 31600, 120, 2380, 3750, 81.0), +('2024-03-25', 2600, 31800, 125, 2475, 3900, 84.0), +('2024-03-26', 2700, 32000, 130, 2570, 4050, 87.0), +('2024-03-27', 2800, 32200, 135, 2665, 4200, 90.0), +('2024-03-28', 2900, 32400, 140, 2760, 4350, 93.0), +('2024-03-29', 3000, 32600, 145, 2855, 4500, 96.0), +('2024-03-30', 3100, 32800, 150, 2950, 4650, 99.0), +('2024-03-31', 3200, 33000, 155, 3045, 4800, 102.0), + +-- 4月数据(春季增长期) +('2024-04-01', 3300, 33200, 160, 3140, 4950, 105.0), +('2024-04-02', 3400, 33400, 165, 3235, 5100, 108.0), +('2024-04-03', 3500, 33600, 170, 3330, 5250, 111.0), +('2024-04-04', 3600, 33800, 175, 3425, 5400, 114.0), +('2024-04-05', 3700, 34000, 180, 3520, 5550, 117.0), +('2024-04-06', 3800, 34200, 185, 3615, 5700, 120.0), +('2024-04-07', 3900, 34400, 190, 3710, 5850, 123.0), +('2024-04-08', 4000, 34600, 195, 3805, 6000, 126.0), +('2024-04-09', 4100, 34800, 200, 3900, 6150, 129.0), +('2024-04-10', 4200, 35000, 205, 3995, 6300, 132.0), +('2024-04-11', 4300, 35200, 210, 4090, 6450, 135.0), +('2024-04-12', 4400, 35400, 215, 4185, 6600, 138.0), +('2024-04-13', 4500, 35600, 220, 4280, 6750, 141.0), +('2024-04-14', 4600, 35800, 225, 4375, 6900, 144.0), +('2024-04-15', 4700, 36000, 230, 4470, 7050, 147.0), +('2024-04-16', 4800, 36200, 235, 4565, 7200, 150.0), +('2024-04-17', 4900, 36400, 240, 4660, 7350, 153.0), +('2024-04-18', 5000, 36600, 245, 4755, 7500, 156.0), +('2024-04-19', 5100, 36800, 250, 4850, 7650, 159.0), +('2024-04-20', 5200, 37000, 255, 4945, 7800, 162.0), +('2024-04-21', 5300, 37200, 260, 5040, 7950, 165.0), +('2024-04-22', 5400, 37400, 265, 5135, 8100, 168.0), +('2024-04-23', 5500, 37600, 270, 5230, 8250, 171.0), +('2024-04-24', 5600, 37800, 275, 5325, 8400, 174.0), +('2024-04-25', 5700, 38000, 280, 5420, 8550, 177.0), +('2024-04-26', 5800, 38200, 285, 5515, 8700, 180.0), +('2024-04-27', 5900, 38400, 290, 5610, 8850, 183.0), +('2024-04-28', 6000, 38600, 295, 5705, 9000, 186.0), +('2024-04-29', 6100, 38800, 300, 5800, 9150, 189.0), +('2024-04-30', 6200, 39000, 305, 5895, 9300, 192.0), + +-- 5月数据(五一假期影响) +('2024-05-01', 5000, 39200, 200, 4800, 7500, 150.0), +('2024-05-02', 4500, 39400, 180, 4320, 6750, 135.0), +('2024-05-03', 4000, 39600, 160, 3840, 6000, 120.0), +('2024-05-04', 3500, 39800, 140, 3360, 5250, 105.0), +('2024-05-05', 3000, 40000, 120, 2880, 4500, 90.0), +('2024-05-06', 2500, 40200, 100, 2400, 3750, 75.0), +('2024-05-07', 2000, 40400, 80, 1920, 3000, 60.0), +('2024-05-08', 1500, 40600, 60, 1440, 2250, 45.0), +('2024-05-09', 1000, 40800, 40, 960, 1500, 30.0), +('2024-05-10', 800, 41000, 30, 770, 1200, 24.0), +('2024-05-11', 600, 41200, 20, 580, 900, 18.0), +('2024-05-12', 500, 41400, 15, 485, 750, 15.0), +('2024-05-13', 400, 41600, 10, 390, 600, 12.0), +('2024-05-14', 300, 41800, 8, 292, 450, 9.0), +('2024-05-15', 250, 42000, 5, 245, 375, 7.5), +('2024-05-16', 200, 42200, 3, 197, 300, 6.0), +('2024-05-17', 150, 42400, 2, 148, 225, 4.5), +('2024-05-18', 100, 42600, 1, 99, 150, 3.0), +('2024-05-19', 80, 42800, 1, 79, 120, 2.4), +('2024-05-20', 60, 43000, 1, 59, 90, 1.8), +('2024-05-21', 50, 43200, 1, 49, 75, 1.5), +('2024-05-22', 40, 43400, 1, 39, 60, 1.2), +('2024-05-23', 30, 43600, 1, 29, 45, 0.9), +('2024-05-24', 25, 43800, 1, 24, 37, 0.75), +('2024-05-25', 20, 44000, 1, 19, 30, 0.6), +('2024-05-26', 15, 44200, 1, 14, 22, 0.45), +('2024-05-27', 10, 44400, 1, 9, 15, 0.3), +('2024-05-28', 8, 44600, 1, 7, 12, 0.24), +('2024-05-29', 5, 44800, 1, 4, 7, 0.15), +('2024-05-30', 3, 45000, 1, 2, 4, 0.09), +('2024-05-31', 2, 45200, 1, 1, 3, 0.06), + +-- 6月数据(夏季恢复期) +('2024-06-01', 100, 45400, 5, 95, 150, 3.0), +('2024-06-02', 200, 45600, 10, 190, 300, 6.0), +('2024-06-03', 300, 45800, 15, 285, 450, 9.0), +('2024-06-04', 400, 46000, 20, 380, 600, 12.0), +('2024-06-05', 500, 46200, 25, 475, 750, 15.0), +('2024-06-06', 600, 46400, 30, 570, 900, 18.0), +('2024-06-07', 700, 46600, 35, 665, 1050, 21.0), +('2024-06-08', 800, 46800, 40, 760, 1200, 24.0), +('2024-06-09', 900, 47000, 45, 855, 1350, 27.0), +('2024-06-10', 1000, 47200, 50, 950, 1500, 30.0), +('2024-06-11', 1100, 47400, 55, 1045, 1650, 33.0), +('2024-06-12', 1200, 47600, 60, 1140, 1800, 36.0), +('2024-06-13', 1300, 47800, 65, 1235, 1950, 39.0), +('2024-06-14', 1400, 48000, 70, 1330, 2100, 42.0), +('2024-06-15', 1500, 48200, 75, 1425, 2250, 45.0), +('2024-06-16', 1600, 48400, 80, 1520, 2400, 48.0), +('2024-06-17', 1700, 48600, 85, 1615, 2550, 51.0), +('2024-06-18', 1800, 48800, 90, 1710, 2700, 54.0), +('2024-06-19', 1900, 49000, 95, 1805, 2850, 57.0), +('2024-06-20', 2000, 49200, 100, 1900, 3000, 60.0), +('2024-06-21', 2100, 49400, 105, 1995, 3150, 63.0), +('2024-06-22', 2200, 49600, 110, 2090, 3300, 66.0), +('2024-06-23', 2300, 49800, 115, 2185, 3450, 69.0), +('2024-06-24', 2400, 50000, 120, 2280, 3600, 72.0), +('2024-06-25', 2500, 50200, 125, 2375, 3750, 75.0), +('2024-06-26', 2600, 50400, 130, 2470, 3900, 78.0), +('2024-06-27', 2700, 50600, 135, 2565, 4050, 81.0), +('2024-06-28', 2800, 50800, 140, 2660, 4200, 84.0), +('2024-06-29', 2900, 51000, 145, 2755, 4350, 87.0), +('2024-06-30', 3000, 51200, 150, 2850, 4500, 90.0), + +-- 7月数据(夏季高峰期) +('2024-07-01', 3100, 51400, 155, 2945, 4650, 93.0), +('2024-07-02', 3200, 51600, 160, 3040, 4800, 96.0), +('2024-07-03', 3300, 51800, 165, 3135, 4950, 99.0), +('2024-07-04', 3400, 52000, 170, 3230, 5100, 102.0), +('2024-07-05', 3500, 52200, 175, 3325, 5250, 105.0), +('2024-07-06', 3600, 52400, 180, 3420, 5400, 108.0), +('2024-07-07', 3700, 52600, 185, 3515, 5550, 111.0), +('2024-07-08', 3800, 52800, 190, 3610, 5700, 114.0), +('2024-07-09', 3900, 53000, 195, 3705, 5850, 117.0), +('2024-07-10', 4000, 53200, 200, 3800, 6000, 120.0), +('2024-07-11', 4100, 53400, 205, 3895, 6150, 123.0), +('2024-07-12', 4200, 53600, 210, 3990, 6300, 126.0), +('2024-07-13', 4300, 53800, 215, 4085, 6450, 129.0), +('2024-07-14', 4400, 54000, 220, 4180, 6600, 132.0), +('2024-07-15', 4500, 54200, 225, 4275, 6750, 135.0), +('2024-07-16', 4600, 54400, 230, 4370, 6900, 138.0), +('2024-07-17', 4700, 54600, 235, 4465, 7050, 141.0), +('2024-07-18', 4800, 54800, 240, 4560, 7200, 144.0), +('2024-07-19', 4900, 55000, 245, 4655, 7350, 147.0), +('2024-07-20', 5000, 55200, 250, 4750, 7500, 150.0), +('2024-07-21', 5100, 55400, 255, 4845, 7650, 153.0), +('2024-07-22', 5200, 55600, 260, 4940, 7800, 156.0), +('2024-07-23', 5300, 55800, 265, 5035, 7950, 159.0), +('2024-07-24', 5400, 56000, 270, 5130, 8100, 162.0), +('2024-07-25', 5500, 56200, 275, 5225, 8250, 165.0), +('2024-07-26', 5600, 56400, 280, 5320, 8400, 168.0), +('2024-07-27', 5700, 56600, 285, 5415, 8550, 171.0), +('2024-07-28', 5800, 56800, 290, 5510, 8700, 174.0), +('2024-07-29', 5900, 57000, 295, 5605, 8850, 177.0), +('2024-07-30', 6000, 57200, 300, 5700, 9000, 180.0), +('2024-07-31', 6100, 57400, 305, 5795, 9150, 183.0), + +-- 8月数据(夏季高峰延续) +('2024-08-01', 6200, 57600, 310, 5890, 9300, 186.0), +('2024-08-02', 6300, 57800, 315, 5985, 9450, 189.0), +('2024-08-03', 6400, 58000, 320, 6080, 9600, 192.0), +('2024-08-04', 6500, 58200, 325, 6175, 9750, 195.0), +('2024-08-05', 6600, 58400, 330, 6270, 9900, 198.0), +('2024-08-06', 6700, 58600, 335, 6365, 10050, 201.0), +('2024-08-07', 6800, 58800, 340, 6460, 10200, 204.0), +('2024-08-08', 6900, 59000, 345, 6555, 10350, 207.0), +('2024-08-09', 7000, 59200, 350, 6650, 10500, 210.0), +('2024-08-10', 7100, 59400, 355, 6745, 10650, 213.0), +('2024-08-11', 7200, 59600, 360, 6840, 10800, 216.0), +('2024-08-12', 7300, 59800, 365, 6935, 10950, 219.0), +('2024-08-13', 7400, 60000, 370, 7030, 11100, 222.0), +('2024-08-14', 7500, 60200, 375, 7125, 11250, 225.0), +('2024-08-15', 7600, 60400, 380, 7220, 11400, 228.0), +('2024-08-16', 7700, 60600, 385, 7315, 11550, 231.0), +('2024-08-17', 7800, 60800, 390, 7410, 11700, 234.0), +('2024-08-18', 7900, 61000, 395, 7505, 11850, 237.0), +('2024-08-19', 8000, 61200, 400, 7600, 12000, 240.0), +('2024-08-20', 8100, 61400, 405, 7695, 12150, 243.0), +('2024-08-21', 8200, 61600, 410, 7790, 12300, 246.0), +('2024-08-22', 8300, 61800, 415, 7885, 12450, 249.0), +('2024-08-23', 8400, 62000, 420, 7980, 12600, 252.0), +('2024-08-24', 8500, 62200, 425, 8075, 12750, 255.0), +('2024-08-25', 8600, 62400, 430, 8170, 12900, 258.0), +('2024-08-26', 8700, 62600, 435, 8265, 13050, 261.0), +('2024-08-27', 8800, 62800, 440, 8360, 13200, 264.0), +('2024-08-28', 8900, 63000, 445, 8455, 13350, 267.0), +('2024-08-29', 9000, 63200, 450, 8550, 13500, 270.0), +('2024-08-30', 9100, 63400, 455, 8645, 13650, 273.0), +('2024-08-31', 9200, 63600, 460, 8740, 13800, 276.0), + +-- 9月数据(秋季开学季) +('2024-09-01', 9300, 63800, 465, 8835, 13950, 279.0), +('2024-09-02', 9400, 64000, 470, 8930, 14100, 282.0), +('2024-09-03', 9500, 64200, 475, 9025, 14250, 285.0), +('2024-09-04', 9600, 64400, 480, 9120, 14400, 288.0), +('2024-09-05', 9700, 64600, 485, 9215, 14550, 291.0), +('2024-09-06', 9800, 64800, 490, 9310, 14700, 294.0), +('2024-09-07', 9900, 65000, 495, 9405, 14850, 297.0), +('2024-09-08', 10000, 65200, 500, 9500, 15000, 300.0), +('2024-09-09', 10100, 65400, 505, 9595, 15150, 303.0), +('2024-09-10', 10200, 65600, 510, 9690, 15300, 306.0), +('2024-09-11', 10300, 65800, 515, 9785, 15450, 309.0), +('2024-09-12', 10400, 66000, 520, 9880, 15600, 312.0), +('2024-09-13', 10500, 66200, 525, 9975, 15750, 315.0), +('2024-09-14', 10600, 66400, 530, 10070, 15900, 318.0), +('2024-09-15', 10700, 66600, 535, 10165, 16050, 321.0), +('2024-09-16', 10800, 66800, 540, 10260, 16200, 324.0), +('2024-09-17', 10900, 67000, 545, 10355, 16350, 327.0), +('2024-09-18', 11000, 67200, 550, 10450, 16500, 330.0), +('2024-09-19', 11100, 67400, 555, 10545, 16650, 333.0), +('2024-09-20', 11200, 67600, 560, 10640, 16800, 336.0), +('2024-09-21', 11300, 67800, 565, 10735, 16950, 339.0), +('2024-09-22', 11400, 68000, 570, 10830, 17100, 342.0), +('2024-09-23', 11500, 68200, 575, 10925, 17250, 345.0), +('2024-09-24', 11600, 68400, 580, 11020, 17400, 348.0), +('2024-09-25', 11700, 68600, 585, 11115, 17550, 351.0), +('2024-09-26', 11800, 68800, 590, 11210, 17700, 354.0), +('2024-09-27', 11900, 69000, 595, 11305, 17850, 357.0), +('2024-09-28', 12000, 69200, 600, 11400, 18000, 360.0), +('2024-09-29', 12100, 69400, 605, 11495, 18150, 363.0), +('2024-09-30', 12200, 69600, 610, 11590, 18300, 366.0), + +-- 10月数据(秋季稳定期) +('2024-10-01', 12000, 69800, 600, 11400, 18000, 360.0), +('2024-10-02', 11800, 70000, 580, 11220, 17700, 354.0), +('2024-10-03', 11600, 70200, 560, 11040, 17400, 348.0), +('2024-10-04', 11400, 70400, 540, 10860, 17100, 342.0), +('2024-10-05', 11200, 70600, 520, 10680, 16800, 336.0), +('2024-10-06', 11000, 70800, 500, 10500, 16500, 330.0), +('2024-10-07', 10800, 71000, 480, 10320, 16200, 324.0), +('2024-10-08', 10600, 71200, 460, 10140, 15900, 318.0), +('2024-10-09', 10400, 71400, 440, 9960, 15600, 312.0), +('2024-10-10', 10200, 71600, 420, 9780, 15300, 306.0), +('2024-10-11', 10000, 71800, 400, 9600, 15000, 300.0), +('2024-10-12', 9800, 72000, 380, 9420, 14700, 294.0), +('2024-10-13', 9600, 72200, 360, 9240, 14400, 288.0), +('2024-10-14', 9400, 72400, 340, 9060, 14100, 282.0), +('2024-10-15', 9200, 72600, 320, 8880, 13800, 276.0), +('2024-10-16', 9000, 72800, 300, 8700, 13500, 270.0), +('2024-10-17', 8800, 73000, 280, 8520, 13200, 264.0), +('2024-10-18', 8600, 73200, 260, 8340, 12900, 258.0), +('2024-10-19', 8400, 73400, 240, 8160, 12600, 252.0), +('2024-10-20', 8200, 73600, 220, 7980, 12300, 246.0), +('2024-10-21', 8000, 73800, 200, 7800, 12000, 240.0), +('2024-10-22', 7800, 74000, 180, 7620, 11700, 234.0), +('2024-10-23', 7600, 74200, 160, 7440, 11400, 228.0), +('2024-10-24', 7400, 74400, 140, 7260, 11100, 222.0), +('2024-10-25', 7200, 74600, 120, 7080, 10800, 216.0), +('2024-10-26', 7000, 74800, 100, 6900, 10500, 210.0), +('2024-10-27', 6800, 75000, 80, 6720, 10200, 204.0), +('2024-10-28', 6600, 75200, 60, 6540, 9900, 198.0), +('2024-10-29', 6400, 75400, 40, 6360, 9600, 192.0), +('2024-10-30', 6200, 75600, 20, 6180, 9300, 186.0), +('2024-10-31', 6000, 75800, 10, 5990, 9000, 180.0), + +-- 11月数据(冬季开始) +('2024-11-01', 5800, 76000, 5, 5795, 8700, 174.0), +('2024-11-02', 5600, 76200, 5, 5595, 8400, 168.0), +('2024-11-03', 5400, 76400, 5, 5395, 8100, 162.0), +('2024-11-04', 5200, 76600, 5, 5195, 7800, 156.0), +('2024-11-05', 5000, 76800, 5, 4995, 7500, 150.0), +('2024-11-06', 4800, 77000, 5, 4795, 7200, 144.0), +('2024-11-07', 4600, 77200, 5, 4595, 6900, 138.0), +('2024-11-08', 4400, 77400, 5, 4395, 6600, 132.0), +('2024-11-09', 4200, 77600, 5, 4195, 6300, 126.0), +('2024-11-10', 4000, 77800, 5, 3995, 6000, 120.0), +('2024-11-11', 3800, 78000, 5, 3795, 5700, 114.0), +('2024-11-12', 3600, 78200, 5, 3595, 5400, 108.0), +('2024-11-13', 3400, 78400, 5, 3395, 5100, 102.0), +('2024-11-14', 3200, 78600, 5, 3195, 4800, 96.0), +('2024-11-15', 3000, 78800, 5, 2995, 4500, 90.0), +('2024-11-16', 2800, 79000, 5, 2795, 4200, 84.0), +('2024-11-17', 2600, 79200, 5, 2595, 3900, 78.0), +('2024-11-18', 2400, 79400, 5, 2395, 3600, 72.0), +('2024-11-19', 2200, 79600, 5, 2195, 3300, 66.0), +('2024-11-20', 2000, 79800, 5, 1995, 3000, 60.0), +('2024-11-21', 1800, 80000, 5, 1795, 2700, 54.0), +('2024-11-22', 1600, 80200, 5, 1595, 2400, 48.0), +('2024-11-23', 1400, 80400, 5, 1395, 2100, 42.0), +('2024-11-24', 1200, 80600, 5, 1195, 1800, 36.0), +('2024-11-25', 1000, 80800, 5, 995, 1500, 30.0), +('2024-11-26', 800, 81000, 5, 795, 1200, 24.0), +('2024-11-27', 600, 81200, 5, 595, 900, 18.0), +('2024-11-28', 400, 81400, 5, 395, 600, 12.0), +('2024-11-29', 200, 81600, 5, 195, 300, 6.0), +('2024-11-30', 100, 81800, 5, 95, 150, 3.0), + +-- 12月数据(年末总结) +('2024-12-01', 500, 82000, 10, 490, 750, 15.0), +('2024-12-02', 600, 82200, 15, 585, 900, 18.0), +('2024-12-03', 700, 82400, 20, 680, 1050, 21.0), +('2024-12-04', 800, 82600, 25, 775, 1200, 24.0), +('2024-12-05', 900, 82800, 30, 870, 1350, 27.0), +('2024-12-06', 1000, 83000, 35, 965, 1500, 30.0), +('2024-12-07', 1100, 83200, 40, 1060, 1650, 33.0), +('2024-12-08', 1200, 83400, 45, 1155, 1800, 36.0), +('2024-12-09', 1300, 83600, 50, 1250, 1950, 39.0), +('2024-12-10', 1400, 83800, 55, 1345, 2100, 42.0), +('2024-12-11', 1500, 84000, 60, 1440, 2250, 45.0), +('2024-12-12', 1600, 84200, 65, 1535, 2400, 48.0), +('2024-12-13', 1700, 84400, 70, 1630, 2550, 51.0), +('2024-12-14', 1800, 84600, 75, 1725, 2700, 54.0), +('2024-12-15', 1900, 84800, 80, 1820, 2850, 57.0), +('2024-12-16', 2000, 85000, 85, 1915, 3000, 60.0), +('2024-12-17', 2100, 85200, 90, 2010, 3150, 63.0), +('2024-12-18', 2200, 85400, 95, 2105, 3300, 66.0), +('2024-12-19', 2300, 85600, 100, 2200, 3450, 69.0), +('2024-12-20', 2400, 85800, 105, 2295, 3600, 72.0), +('2024-12-21', 2500, 86000, 110, 2390, 3750, 75.0), +('2024-12-22', 2600, 86200, 115, 2485, 3900, 78.0), +('2024-12-23', 2700, 86400, 120, 2580, 4050, 81.0), +('2024-12-24', 2800, 86600, 125, 2675, 4200, 84.0), +('2024-12-25', 2900, 86800, 130, 2770, 4350, 87.0), +('2024-12-26', 3000, 87000, 135, 2865, 4500, 90.0), +('2024-12-27', 3100, 87200, 140, 2960, 4650, 93.0), +('2024-12-28', 3200, 87400, 145, 3055, 4800, 96.0), +('2024-12-29', 3300, 87600, 150, 3150, 4950, 99.0), +('2024-12-30', 3400, 87800, 155, 3245, 5100, 102.0), +('2024-12-31', 3500, 88000, 160, 3340, 5250, 105.0);