feat: 新增用户地址、收藏、商品评价和订单项模块

- 新增 UserAddress/UserFavorite/ProductReview/OrderItem 实体类
- 新增对应的 DTO、Repository、Service 和 Controller
- 新增 OrderMigrationService 订单数据迁移服务
This commit is contained in:
2026-03-10 23:16:57 +08:00
parent 371884a3d1
commit 977db8f333
18 changed files with 1053 additions and 0 deletions

View File

@@ -0,0 +1,50 @@
package com.org.flashsalesystem.entity;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import javax.persistence.*;
import java.math.BigDecimal;
import java.time.LocalDateTime;
@Entity
@Table(name = "order_items")
@Data
@NoArgsConstructor
@AllArgsConstructor
public class OrderItem {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(name = "order_id", nullable = false)
private Long orderId;
@Column(name = "product_id", nullable = false)
private Long productId;
@Column(name = "product_name", nullable = false, length = 200)
private String productName;
@Column(name = "product_image_url", length = 500)
private String productImageUrl;
@Column(name = "price", nullable = false, precision = 10, scale = 2)
private BigDecimal price;
@Column(name = "quantity", nullable = false)
private Integer quantity;
@Column(name = "subtotal", nullable = false, precision = 10, scale = 2)
private BigDecimal subtotal;
@Column(name = "created_at", nullable = false, updatable = false)
private LocalDateTime createdAt;
@PrePersist
protected void onCreate() {
createdAt = LocalDateTime.now();
}
}

View File

@@ -0,0 +1,63 @@
package com.org.flashsalesystem.entity;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import javax.persistence.*;
import java.time.LocalDateTime;
@Entity
@Table(name = "product_reviews", uniqueConstraints = {
@UniqueConstraint(name = "uk_review_order_user_product", columnNames = {"order_id", "user_id", "product_id"})
})
@Data
@NoArgsConstructor
@AllArgsConstructor
public class ProductReview {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(name = "product_id", nullable = false)
private Long productId;
@Column(name = "user_id", nullable = false)
private Long userId;
@Column(name = "order_id", nullable = false)
private Long orderId;
@Column(nullable = false)
private Integer rating = 5;
@Column(nullable = false, columnDefinition = "TEXT")
private String content;
@Column(nullable = false)
private Integer status = 1;
@Column(name = "admin_reply", columnDefinition = "TEXT")
private String adminReply;
@Column(name = "replied_at")
private LocalDateTime repliedAt;
@Column(name = "created_at", nullable = false, updatable = 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();
}
}

View File

@@ -0,0 +1,61 @@
package com.org.flashsalesystem.entity;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import javax.persistence.*;
import java.time.LocalDateTime;
@Entity
@Table(name = "user_addresses")
@Data
@NoArgsConstructor
@AllArgsConstructor
public class UserAddress {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(name = "user_id", nullable = false)
private Long userId;
@Column(nullable = false, length = 100)
private String name;
@Column(nullable = false, length = 20)
private String phone;
@Column(length = 50)
private String province;
@Column(length = 50)
private String city;
@Column(length = 50)
private String district;
@Column(nullable = false, length = 255)
private String address;
@Column(name = "is_default", nullable = false)
private Boolean isDefault = false;
@Column(name = "created_at", nullable = false, updatable = 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();
}
}

View File

@@ -0,0 +1,36 @@
package com.org.flashsalesystem.entity;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import javax.persistence.*;
import java.time.LocalDateTime;
@Entity
@Table(name = "user_favorites", uniqueConstraints = {
@UniqueConstraint(name = "uk_favorite_user_product", columnNames = {"user_id", "product_id"})
})
@Data
@NoArgsConstructor
@AllArgsConstructor
public class UserFavorite {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(name = "user_id", nullable = false)
private Long userId;
@Column(name = "product_id", nullable = false)
private Long productId;
@Column(name = "created_at", nullable = false, updatable = false)
private LocalDateTime createdAt;
@PrePersist
protected void onCreate() {
createdAt = LocalDateTime.now();
}
}