feat: 完成情绪博物馆项目重构和功能增强 - 新增日记评论和帖子功能 - 重构前端架构,优化用户体验 - 完善WebSocket通信机制 - 更新项目文档和部署配置

This commit is contained in:
2025-07-27 10:05:59 +08:00
parent 6903ac1c0d
commit cc886cd4d5
126 changed files with 21179 additions and 15734 deletions
@@ -0,0 +1,52 @@
package com.emotion.dto.request;
import lombok.Data;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
import java.util.List;
/**
* 创建日记评论请求DTO
*
* @author emotion-museum
* @date 2025-07-23
*/
@Data
public class DiaryCommentCreateRequest {
/**
* 日记ID
*/
@NotBlank(message = "日记ID不能为空")
private String diaryId;
/**
* 用户ID
*/
@NotBlank(message = "用户ID不能为空")
private String userId;
/**
* 评论内容
*/
@NotBlank(message = "评论内容不能为空")
private String content;
/**
* 评论图片
*/
private List<String> images;
/**
* 父评论ID (用于回复功能)
*/
private String parentCommentId;
/**
* 是否匿名评论: 0-实名, 1-匿名
*/
@NotNull(message = "是否匿名不能为空")
private Integer isAnonymous;
}
@@ -0,0 +1,97 @@
package com.emotion.dto.request;
import lombok.Data;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
import java.math.BigDecimal;
import java.util.List;
/**
* 创建日记请求DTO
*
* @author emotion-museum
* @date 2025-07-23
*/
@Data
public class DiaryPostCreateRequest {
/**
* 日记标题
*/
@Size(max = 200, message = "日记标题长度不能超过200个字符")
private String title;
/**
* 日记内容
*/
@NotBlank(message = "日记内容不能为空")
private String content;
/**
* 图片列表
*/
private List<String> images;
/**
* 视频列表
*/
private List<String> videos;
/**
* 发布地点
*/
@Size(max = 200, message = "发布地点长度不能超过200个字符")
private String location;
/**
* 纬度
*/
private BigDecimal latitude;
/**
* 经度
*/
private BigDecimal longitude;
/**
* 天气信息
*/
@Size(max = 50, message = "天气信息长度不能超过50个字符")
private String weather;
/**
* 心情状态
*/
@Size(max = 50, message = "心情状态长度不能超过50个字符")
private String mood;
/**
* 心情评分 (0-10)
*/
private BigDecimal moodScore;
/**
* 标签列表
*/
private List<String> tags;
/**
* 是否公开: 0-仅自己可见, 1-公开
*/
@NotNull(message = "是否公开不能为空")
private Integer isPublic;
/**
* 是否匿名发布: 0-实名, 1-匿名
*/
@NotNull(message = "是否匿名不能为空")
private Integer isAnonymous;
/**
* 用户ID
*/
@NotBlank(message = "用户ID不能为空")
private String userId;
}
@@ -0,0 +1,91 @@
package com.emotion.dto.request;
import lombok.Data;
import javax.validation.constraints.Size;
import java.math.BigDecimal;
import java.util.List;
/**
* 更新日记请求DTO
*
* @author emotion-museum
* @date 2025-07-23
*/
@Data
public class DiaryPostUpdateRequest {
/**
* 日记标题
*/
@Size(max = 200, message = "日记标题长度不能超过200个字符")
private String title;
/**
* 日记内容
*/
private String content;
/**
* 图片列表
*/
private List<String> images;
/**
* 视频列表
*/
private List<String> videos;
/**
* 发布地点
*/
@Size(max = 200, message = "发布地点长度不能超过200个字符")
private String location;
/**
* 纬度
*/
private BigDecimal latitude;
/**
* 经度
*/
private BigDecimal longitude;
/**
* 天气信息
*/
@Size(max = 50, message = "天气信息长度不能超过50个字符")
private String weather;
/**
* 心情状态
*/
@Size(max = 50, message = "心情状态长度不能超过50个字符")
private String mood;
/**
* 心情评分 (0-10)
*/
private BigDecimal moodScore;
/**
* 标签列表
*/
private List<String> tags;
/**
* 是否公开: 0-仅自己可见, 1-公开
*/
private Integer isPublic;
/**
* 是否匿名发布: 0-实名, 1-匿名
*/
private Integer isAnonymous;
/**
* 状态: draft-草稿, published-已发布, hidden-隐藏, deleted-已删除
*/
private String status;
}
@@ -32,6 +32,12 @@ public class RegisterRequest extends BaseRequest {
@Size(min = 6, max = 20, message = "密码长度必须在6-20个字符之间")
private String password;
/**
* 确认密码
*/
@NotBlank(message = "确认密码不能为空")
private String confirmPassword;
/**
* 用户名
*/
@@ -51,7 +57,7 @@ public class RegisterRequest extends BaseRequest {
/**
* 手机号
*/
@Pattern(regexp = "^1[3-9]\\d{9}$", message = "手机号格式不正确")
@Pattern(regexp = "^$|^1[3-9]\\d{9}$", message = "手机号格式不正确")
private String phone;
/**
@@ -0,0 +1,60 @@
package com.emotion.dto.request;
import lombok.Data;
import javax.validation.constraints.Email;
import javax.validation.constraints.Pattern;
import javax.validation.constraints.Size;
import java.time.LocalDate;
/**
* 用户个人资料更新请求类
*
* @author emotion-museum
* @date 2025-07-26
*/
@Data
public class UserProfileUpdateRequest {
/**
* 昵称
*/
@Size(max = 50, message = "昵称长度不能超过50个字符")
private String nickname;
/**
* 邮箱
*/
@Email(message = "邮箱格式不正确")
@Size(max = 100, message = "邮箱长度不能超过100个字符")
private String email;
/**
* 手机号
*/
@Pattern(regexp = "^1[3-9]\\d{9}$", message = "手机号格式不正确")
private String phone;
/**
* 头像URL
*/
@Size(max = 500, message = "头像URL长度不能超过500个字符")
private String avatar;
/**
* 生日
*/
private LocalDate birthDate;
/**
* 所在地
*/
@Size(max = 100, message = "所在地长度不能超过100个字符")
private String location;
/**
* 个人简介
*/
@Size(max = 500, message = "个人简介长度不能超过500个字符")
private String bio;
}
@@ -5,46 +5,69 @@ import lombok.EqualsAndHashCode;
import javax.validation.constraints.Email;
import javax.validation.constraints.Pattern;
import javax.validation.constraints.Size;
import java.time.LocalDate;
/**
* 用户更新请求类
*
*
* @author emotion-museum
* @date 2025-07-24
*/
@Data
@EqualsAndHashCode(callSuper = true)
public class UserUpdateRequest extends BaseRequest {
/**
* 用户名
*/
@Size(max = 50, message = "用户名长度不能超过50个字符")
private String username;
/**
* 昵称
*/
@Size(max = 50, message = "昵称长度不能超过50个字符")
private String nickname;
/**
* 邮箱
*/
@Email(message = "邮箱格式不正确")
@Size(max = 100, message = "邮箱长度不能超过100个字符")
private String email;
/**
* 手机号
*/
@Pattern(regexp = "^1[3-9]\\d{9}$", message = "手机号格式不正确")
private String phone;
/**
* 头像
* 头像URL
*/
@Size(max = 500, message = "头像URL长度不能超过500个字符")
private String avatar;
/**
* 生日
*/
private LocalDate birthDate;
/**
* 所在地
*/
@Size(max = 100, message = "所在地长度不能超过100个字符")
private String location;
/**
* 个人简介
*/
@Size(max = 500, message = "个人简介长度不能超过500个字符")
private String bio;
/**
* 状态
*/
private Integer status;
}
}
@@ -0,0 +1,136 @@
package com.emotion.dto.response;
import lombok.Data;
import java.math.BigDecimal;
import java.util.List;
/**
* 日记评论响应DTO
*
* @author emotion-museum
* @date 2025-07-23
*/
@Data
public class DiaryCommentResponse {
/**
* 评论ID
*/
private String id;
/**
* 日记ID
*/
private String diaryId;
/**
* 评论用户ID
*/
private String userId;
/**
* 评论用户信息
*/
private UserInfoResponse userInfo;
/**
* 父评论ID (用于回复功能)
*/
private String parentCommentId;
/**
* 父评论信息
*/
private DiaryCommentResponse parentComment;
/**
* 评论内容
*/
private String content;
/**
* 评论图片
*/
private List<String> images;
/**
* 评论类型: user-用户评论, ai-AI评论, system-系统评论
*/
private String commentType;
/**
* AI评论来源 (如: emotion_analysis, sentiment_analysis)
*/
private String aiCommentSource;
/**
* 点赞数
*/
private Integer likeCount;
/**
* 回复数
*/
private Integer replyCount;
/**
* 是否匿名评论: 0-实名, 1-匿名
*/
private Integer isAnonymous;
/**
* 是否置顶: 0-普通, 1-置顶
*/
private Integer isTop;
/**
* 状态: published-已发布, hidden-隐藏, deleted-已删除
*/
private String status;
/**
* 发布时间
*/
private String publishTime;
/**
* 最后回复时间
*/
private String lastReplyTime;
/**
* 情绪评分
*/
private BigDecimal emotionScore;
/**
* 情感评分
*/
private BigDecimal sentimentScore;
/**
* 扩展元数据
*/
private Object metadata;
/**
* 创建时间
*/
private String createTime;
/**
* 更新时间
*/
private String updateTime;
/**
* 是否已点赞
*/
private Boolean isLiked;
/**
* 子评论列表
*/
private List<DiaryCommentResponse> replies;
}
@@ -0,0 +1,197 @@
package com.emotion.dto.response;
import lombok.Data;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.List;
/**
* 日记响应DTO
*
* @author emotion-museum
* @date 2025-07-23
*/
@Data
public class DiaryPostResponse {
/**
* 日记ID
*/
private String id;
/**
* 用户ID
*/
private String userId;
/**
* 用户信息
*/
private UserInfoResponse userInfo;
/**
* 日记标题
*/
private String title;
/**
* 日记内容
*/
private String content;
/**
* 图片列表
*/
private List<String> images;
/**
* 视频列表
*/
private List<String> videos;
/**
* 发布地点
*/
private String location;
/**
* 纬度
*/
private BigDecimal latitude;
/**
* 经度
*/
private BigDecimal longitude;
/**
* 天气信息
*/
private String weather;
/**
* 心情状态
*/
private String mood;
/**
* 心情评分 (0-10)
*/
private BigDecimal moodScore;
/**
* 标签列表
*/
private List<String> tags;
/**
* 是否公开: 0-仅自己可见, 1-公开
*/
private Integer isPublic;
/**
* 是否匿名发布: 0-实名, 1-匿名
*/
private Integer isAnonymous;
/**
* 浏览数
*/
private Integer viewCount;
/**
* 点赞数
*/
private Integer likeCount;
/**
* 评论数
*/
private Integer commentCount;
/**
* 分享数
*/
private Integer shareCount;
/**
* AI评论内容
*/
private String aiComment;
/**
* AI评论时间
*/
private String aiCommentTime;
/**
* AI情绪分析结果
*/
private Object aiEmotionAnalysis;
/**
* AI情感评分 (-1到1)
*/
private BigDecimal aiSentimentScore;
/**
* AI提取的关键词
*/
private List<String> aiKeywords;
/**
* AI建议
*/
private String aiSuggestions;
/**
* 发布时间
*/
private String publishTime;
/**
* 最后评论时间
*/
private String lastCommentTime;
/**
* 状态: draft-草稿, published-已发布, hidden-隐藏, deleted-已删除
*/
private String status;
/**
* 优先级 (用于置顶功能)
*/
private Integer priority;
/**
* 是否精选: 0-普通, 1-精选
*/
private Integer featured;
/**
* 扩展元数据
*/
private Object metadata;
/**
* 创建时间
*/
private String createTime;
/**
* 更新时间
*/
private String updateTime;
/**
* 是否已点赞
*/
private Boolean isLiked;
/**
* 是否已收藏
*/
private Boolean isBookmarked;
}