添加注释,优化代码,减少魔法值

This commit is contained in:
KilLze
2025-12-29 17:58:40 +08:00
parent cc88ec820c
commit 70a1d0012e
24 changed files with 133 additions and 50 deletions

View File

@@ -2,6 +2,7 @@ package com.bao.dating.common;
/**
* 响应状态码枚举
* @author KilLze
*/
public enum ResultCode {
/** 成功 */

View File

@@ -4,16 +4,17 @@ import com.aliyun.oss.ClientException;
import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.OSSException;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
import java.io.ByteArrayInputStream;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
/**
* 阿里云OSS工具类
* @author KilLze
*/
@Data
@Slf4j
@Component

View File

@@ -0,0 +1,11 @@
package com.bao.dating.common.result;
/**
* 阿里云 OSS 文件上传结果
* @author KilLze
*/
public class AliOssResult {
public static final String IMAGE = "image";
public static final String VIDEO = "video";
}

View File

@@ -0,0 +1,15 @@
package com.bao.dating.common.result;
/**
* 文件上传结果
* @author KilLze
*/
public class FileResult {
public static final String JPG = "jpg";
public static final String JPEG = "jpeg";
public static final String PNG = "png";
public static final String GIF = "gif";
public static final String MP4 = "mp4";
public static final String AVI = "avi";
public static final String MOV = "mov";
}

View File

@@ -0,0 +1,11 @@
package com.bao.dating.common.result;
/**
* 阿里云敏感内容审核结果
* @author KilLze
*/
public class GreenAuditResult {
public static final String PASS = "pass";
public static final String REVIEW = "review";
public static final String BLOCK = "block";
}

View File

@@ -7,6 +7,10 @@ import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
/**
* WebMvc配置类
* @author KilLze
*/
@Configuration
public class WebConfig implements WebMvcConfigurer {

View File

@@ -6,14 +6,14 @@ package com.bao.dating.context;
*/
public class UserContext {
private static final ThreadLocal<Long> userHolder = new ThreadLocal<>();
private static final ThreadLocal<Long> USER_HOLDER = new ThreadLocal<>();
/**
* 设置当前线程的用户ID
* @param userId 用户ID
*/
public static void setUserId(Long userId) {
userHolder.set(userId);
USER_HOLDER.set(userId);
}
/**
@@ -21,13 +21,13 @@ public class UserContext {
* @return 当前用户ID如果未设置则返回null
*/
public static Long getUserId() {
return userHolder.get();
return USER_HOLDER.get();
}
/**
* 清除当前线程的用户ID
*/
public static void clear() {
userHolder.remove();
USER_HOLDER.remove();
}
}

View File

@@ -13,6 +13,11 @@ import org.springframework.web.multipart.MultipartFile;
import java.util.List;
/**
* 动态接口
*
* @author KilLze
*/
@RestController
@RequestMapping("/posts")
public class PostController {

View File

@@ -12,6 +12,11 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
/**
* 用户接口
*
* @author KilLze
*/
@RestController
@RequestMapping("/user")
public class UserController {

View File

@@ -13,11 +13,16 @@ import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;
@MappedJdbcTypes(JdbcType.VARCHAR) // 也可以使用JdbcType.JSON如果数据库支持的话
/**
* List类型转换成JSON类型
* @author KilLze
*/
@MappedJdbcTypes(JdbcType.VARCHAR)
@MappedTypes(List.class)
public class ListToJsonTypeHandler implements TypeHandler<List<String>> {
private static final ObjectMapper objectMapper = new ObjectMapper();
private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper();
@Override
public void setParameter(PreparedStatement ps, int i, List<String> parameter, JdbcType jdbcType) throws SQLException {
@@ -26,7 +31,7 @@ public class ListToJsonTypeHandler implements TypeHandler<List<String>> {
return;
}
try {
String json = objectMapper.writeValueAsString(parameter);
String json = OBJECT_MAPPER.writeValueAsString(parameter);
ps.setString(i, json);
} catch (JsonProcessingException e) {
throw new SQLException("Error converting list to JSON", e);
@@ -56,7 +61,7 @@ public class ListToJsonTypeHandler implements TypeHandler<List<String>> {
return null;
}
try {
return objectMapper.readValue(json, new TypeReference<List<String>>() {});
return OBJECT_MAPPER.readValue(json, new TypeReference<List<String>>() {});
} catch (JsonProcessingException e) {
throw new SQLException("Error converting JSON to list", e);
}

View File

@@ -5,7 +5,6 @@ import javax.servlet.http.HttpServletResponse;
import com.bao.dating.context.UserContext;
import com.bao.dating.util.JwtUtil;
import io.jsonwebtoken.Claims;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import org.springframework.web.method.HandlerMethod;
@@ -14,6 +13,7 @@ import org.springframework.web.servlet.HandlerInterceptor;
/**
* HttpToken拦截器类
* 用于拦截请求并验证JWT token的有效性同时从token中解析用户信息
* @author KilLze
*/
@Slf4j
@Component

View File

@@ -6,12 +6,17 @@ import org.apache.ibatis.annotations.Param;
import java.util.List;
/**
* 动态Mapper
*
* @author KilLze lanyangyang-yzx
*/
@Mapper
public interface PostMapper {
/**
* 插入动态
*
* @param post
* @param post 动态
*/
void insert(Post post);
@@ -25,24 +30,23 @@ public interface PostMapper {
/**
* 根据ID查询动态
*
* @param postId
* @return
* @param postId 动态ID
* @return 动态
*/
Post selectById(Long postId);
/**
* 根据ID更新动态
*
* @param post
* @return
* @param post 动态
*/
void updateById(Post post);
/**
* 查询点赞数
*
* @param postId
* @return
* @param postId 动态ID
* @return 点赞数
*/
int selectLikeCount(Long postId);
@@ -72,8 +76,8 @@ public interface PostMapper {
/**
* 查询点赞数
*
* @param postId
* @return
* @param postId 动态ID
* @return 点赞数
*/
int selectFavoriteCount(Long postId);

View File

@@ -1,10 +1,13 @@
package com.bao.dating.mapper;
import com.bao.dating.pojo.dto.UserInfoUpdateDTO;
import com.bao.dating.pojo.entity.Post;
import com.bao.dating.pojo.entity.User;
import org.apache.ibatis.annotations.Mapper;
/**
* 用户Mapper
* @author KilLze
*/
@Mapper
public interface UserMapper {
@@ -26,7 +29,7 @@ public interface UserMapper {
/**
* 更新用户信息
* @param userInfoUpdateDTO
* @param userInfoUpdateDTO 用户信息更新参数
*/
void updateUserInfoByUserId(UserInfoUpdateDTO userInfoUpdateDTO);

View File

@@ -7,9 +7,10 @@ import java.util.List;
/**
* 动态数据传输对象
* @author KilLze
*/
@Data
public class PostRequestDTO implements Serializable {
public class PostRequestDTO implements Serializable{
private String content;
private List<String> mediaOssKeys;
private List<String> tags;

View File

@@ -6,6 +6,10 @@ import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.List;
/**
* 用户信息更新数据传输对象
* @author KilLze
*/
@Data
public class UserInfoUpdateDTO {
private Long userId;
@@ -18,6 +22,4 @@ public class UserInfoUpdateDTO {
private List<String> hobbies;
private String signature;
private LocalDateTime updatedAt;
/** 需要清空的字段 */
private List<String> clearFields;
}

View File

@@ -6,6 +6,7 @@ import java.io.Serializable;
/**
* 用户登录数据传输对象
* @author KilLze
*/
@Data
public class UserLoginDTO implements Serializable {

View File

@@ -8,6 +8,7 @@ import java.util.List;
/**
* 修改内容查询返回数据
* @author KilLze
*/
@Data
public class PostEditVO implements Serializable {

View File

@@ -2,15 +2,17 @@ package com.bao.dating.pojo.vo;
import lombok.Data;
import java.io.Serializable;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.List;
/**
* 用户信息VO
* @author KilLze
*/
@Data
public class UserInfoVO {
public class UserInfoVO implements Serializable {
private Long userId;
private String userName;
private String nickname;

View File

@@ -5,6 +5,7 @@ import java.io.Serializable;
/**
* 登录返回数据
* @author KilLze
*/
@Data
public class UserLoginVO implements Serializable {

View File

@@ -7,6 +7,10 @@ import org.springframework.web.multipart.MultipartFile;
import java.util.List;
/**
* 动态服务
* @author bao KilLze lanyangyang-yzx yang
*/
public interface PostService {
/**
* 上传媒体文件
@@ -33,6 +37,7 @@ public interface PostService {
/**
* 查询动态详情(用于编辑)
* @param postId 动态ID
* @return 动态详情
*/
PostEditVO getPostForEdit(Long postId);

View File

@@ -2,13 +2,14 @@ package com.bao.dating.service;
import com.bao.dating.pojo.dto.UserInfoUpdateDTO;
import com.bao.dating.pojo.dto.UserLoginDTO;
import com.bao.dating.pojo.vo.PostEditVO;
import com.bao.dating.pojo.vo.UserInfoVO;
import com.bao.dating.pojo.vo.UserLoginVO;
import org.springframework.web.multipart.MultipartFile;
import java.util.List;
/**
* 用户服务接口
* @author KilLze
*/
public interface UserService {
/**
* 登录
@@ -20,6 +21,7 @@ public interface UserService {
/**
* 查询个人信息
* @param userId 动态ID
* @return 个人信息
*/
UserInfoVO getUserInfo(Long userId);
@@ -40,6 +42,7 @@ public interface UserService {
/**
* 更新用户信息
* @param userInfoUpdateDTO 用户信息
* @return 更新后的用户信息
*/
UserInfoVO updateUserInfo(UserInfoUpdateDTO userInfoUpdateDTO);
}

View File

@@ -2,6 +2,7 @@ package com.bao.dating.service.impl;
import com.bao.dating.common.aliyun.GreenImageScan;
import com.bao.dating.common.aliyun.GreenTextScan;
import com.bao.dating.common.result.GreenAuditResult;
import com.bao.dating.context.UserContext;
import com.bao.dating.mapper.PostMapper;
import com.bao.dating.pojo.dto.PostRequestDTO;
@@ -25,7 +26,7 @@ import java.util.*;
/**
* 动态服务实现类
*
* @author KilLze
* @author KilLze yang
*/
@Service
public class PostServiceImpl implements PostService {
@@ -144,10 +145,10 @@ public class PostServiceImpl implements PostService {
String imageSuggestion = (String) imageResult.get("suggestion");
// 根据审核结果设置状态
if ("block".equals(textSuggestion) || "block".equals(imageSuggestion)) {
if (GreenAuditResult.BLOCK.equals(textSuggestion) || GreenAuditResult.BLOCK.equals(imageSuggestion)) {
// 审核未通过,允许用户修改
post.setIsPublic(2);
} else if ("review".equals(textSuggestion) || "review".equals(imageSuggestion)) {
} else if (GreenAuditResult.REVIEW.equals(textSuggestion) || GreenAuditResult.REVIEW.equals(imageSuggestion)) {
// 待审核,需人工审核
post.setIsPublic(1);
} else {
@@ -156,10 +157,10 @@ public class PostServiceImpl implements PostService {
}
} else {
// 只有文本内容的情况
if ("block".equals(textSuggestion)) {
if (GreenAuditResult.BLOCK.equals(textSuggestion)) {
// 审核未通过,允许用户修改
post.setIsPublic(2);
} else if ("review".equals(textSuggestion)) {
} else if (GreenAuditResult.REVIEW.equals(textSuggestion)) {
// 待审核,需人工审核
post.setIsPublic(1);
} else {
@@ -268,10 +269,10 @@ public class PostServiceImpl implements PostService {
String imageSuggestion = (String) imageResult.get("suggestion");
// 根据审核结果设置状态
if ("block".equals(textSuggestion) || "block".equals(imageSuggestion)) {
if (GreenAuditResult.BLOCK.equals(textSuggestion) || GreenAuditResult.BLOCK.equals(imageSuggestion)) {
// 审核未通过,允许用户修改
post.setIsPublic(2);
} else if ("review".equals(textSuggestion) || "review".equals(imageSuggestion)) {
} else if (GreenAuditResult.REVIEW.equals(textSuggestion) || GreenAuditResult.REVIEW.equals(imageSuggestion)) {
// 待审核,需人工审核
post.setIsPublic(1);
} else {
@@ -280,10 +281,10 @@ public class PostServiceImpl implements PostService {
}
} else {
// 只有文本内容的情况
if ("block".equals(textSuggestion)) {
if (GreenAuditResult.BLOCK.equals(textSuggestion)) {
// 审核未通过,允许用户修改
post.setIsPublic(2);
} else if ("review".equals(textSuggestion)) {
} else if (GreenAuditResult.REVIEW.equals(textSuggestion)) {
// 待审核,需人工审核
post.setIsPublic(1);
} else {

View File

@@ -3,6 +3,8 @@ package com.bao.dating.service.impl;
import com.bao.dating.common.aliyun.AliOssUtil;
import com.bao.dating.common.aliyun.GreenImageScan;
import com.bao.dating.common.aliyun.GreenTextScan;
import com.bao.dating.common.result.AliOssResult;
import com.bao.dating.common.result.GreenAuditResult;
import com.bao.dating.context.UserContext;
import com.bao.dating.mapper.UserMapper;
import com.bao.dating.pojo.dto.UserInfoUpdateDTO;
@@ -20,9 +22,7 @@ import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
@@ -120,12 +120,11 @@ public class UserServiceImpl implements UserService {
}
String fileType = FileUtil.getFileType(originalFilename);
if (!"image".equals(fileType)) {
if (!AliOssResult.IMAGE.equals(fileType)) {
throw new RuntimeException("仅支持图片上传");
}
//生成 OSS 路径
String dir = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyy/MM"));
String extension = FileUtil.getFileExtension(originalFilename);
String fileName = UUID.randomUUID().toString().replace("-", "") + "." + extension;
Long userId = UserContext.getUserId();
@@ -165,7 +164,7 @@ public class UserServiceImpl implements UserService {
}
String fileType = FileUtil.getFileType(originalFilename);
if (!"image".equals(fileType)) {
if (!AliOssResult.IMAGE.equals(fileType)) {
throw new RuntimeException("仅支持图片上传");
}
@@ -228,10 +227,10 @@ public class UserServiceImpl implements UserService {
String suggestion = (String) textResult.get("suggestion");
if ("block".equals(suggestion)) {
if (GreenAuditResult.BLOCK.equals(suggestion)) {
throw new RuntimeException("用户信息包含违规内容,修改失败");
}
if ("review".equals(suggestion)) {
if (GreenAuditResult.REVIEW.equals(suggestion)) {
throw new RuntimeException("用户信息需要人工审核,暂无法修改");
}
}
@@ -254,10 +253,10 @@ public class UserServiceImpl implements UserService {
String suggestion = (String) imageResult.get("suggestion");
if ("block".equals(suggestion)) {
if (GreenAuditResult.BLOCK.equals(suggestion)) {
throw new RuntimeException("头像或背景图不合规,修改失败");
}
if ("review".equals(suggestion)) {
if (GreenAuditResult.REVIEW.equals(suggestion)) {
throw new RuntimeException("头像或背景图需要人工审核,暂无法修改");
}
}

View File

@@ -1,5 +1,7 @@
package com.bao.dating.util;
import com.bao.dating.common.result.FileResult;
/**
* 文件工具类
* @author KilLze
@@ -13,9 +15,9 @@ public class FileUtil {
public static String getFileType(String fileUrl) {
String extension = getFileExtension(fileUrl);
if (extension.equals("jpg") || extension.equals("jpeg") || extension.equals("png") || extension.equals("gif")) {
if (FileResult.JPG.equals(extension) || FileResult.JPEG.equals(extension) || FileResult.PNG.equals(extension) || FileResult.GIF.equals(extension)) {
return "image";
} else if (extension.equals("mp4") || extension.equals("avi") || extension.equals("mov")) {
} else if (FileResult.MP4.equals(extension) || FileResult.AVI.equals(extension) || FileResult.MOV.equals(extension)) {
return "video";
}
return "unknown";