perf(backend+frontend): 列表API响应体积优化 3.1MB→145KB (↓95.4%)
- 后端: JPQL构造器投影排除LONGTEXT大字段(uploadedImages/videoReferenceImages) - 后端: DTO层过滤非分镜图类型的base64内联resultUrl - 前端: 列表缩略图从video改为img loading=lazy,消除172并发请求 - 前端: download函数增加resultUrl懒加载(详情接口兜底) - 文档: 新增性能优化报告 docs/performance-optimization-report.md
This commit is contained in:
84
src/main/java/com/example/demo/model/UserActivityStats.java
Normal file
84
src/main/java/com/example/demo/model/UserActivityStats.java
Normal file
@@ -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 = "activity_date", nullable = false, unique = true)
|
||||
private LocalDate activityDate;
|
||||
|
||||
@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 getActivityDate() { return activityDate; }
|
||||
public void setActivityDate(LocalDate activityDate) { this.activityDate = activityDate; }
|
||||
|
||||
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; }
|
||||
}
|
||||
Reference in New Issue
Block a user