From 0da6cde202ba863f5d7c4919dfd41dc20a542034 Mon Sep 17 00:00:00 2001 From: KilLze Date: Mon, 29 Dec 2025 15:34:41 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E6=88=90=E7=94=A8=E6=88=B7=E4=BF=A1?= =?UTF-8?q?=E6=81=AF=E4=BF=AE=E6=94=B9=EF=BC=8C=E4=BB=A5=E5=8F=8A=E7=94=A8?= =?UTF-8?q?=E6=88=B7=E4=BF=A1=E6=81=AF=E5=AE=A1=E6=A0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../bao/dating/controller/UserController.java | 5 +- .../dating/handler/ListToJsonTypeHandler.java | 64 +++++++++++++ .../com/bao/dating/service/UserService.java | 2 +- .../dating/service/impl/UserServiceImpl.java | 96 ++++++++++++++++--- .../com/bao/dating/mapper/UserMapper.xml | 4 +- 5 files changed, 154 insertions(+), 17 deletions(-) create mode 100644 src/main/java/com/bao/dating/handler/ListToJsonTypeHandler.java diff --git a/src/main/java/com/bao/dating/controller/UserController.java b/src/main/java/com/bao/dating/controller/UserController.java index 355f8b7..3f92cac 100644 --- a/src/main/java/com/bao/dating/controller/UserController.java +++ b/src/main/java/com/bao/dating/controller/UserController.java @@ -71,10 +71,9 @@ public class UserController { * @return 更新后的用户信息 */ @PostMapping("/info/update") - public Result userInfoUpdate(@RequestBody UserInfoUpdateDTO userInfoUpdateDTO) { + public Result userInfoUpdate(@RequestBody UserInfoUpdateDTO userInfoUpdateDTO) { Long userId = UserContext.getUserId(); userInfoUpdateDTO.setUserId(userId); - UserInfoVO userInfoVO = userService.updateUserInfo(userInfoUpdateDTO); - return Result.success(ResultCode.SUCCESS_REVIEW, "用户信息更新成功", userInfoVO); + return Result.success(ResultCode.SUCCESS_REVIEW, "用户信息更新成功", null); } } diff --git a/src/main/java/com/bao/dating/handler/ListToJsonTypeHandler.java b/src/main/java/com/bao/dating/handler/ListToJsonTypeHandler.java new file mode 100644 index 0000000..2448bfb --- /dev/null +++ b/src/main/java/com/bao/dating/handler/ListToJsonTypeHandler.java @@ -0,0 +1,64 @@ +package com.bao.dating.handler; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.core.type.TypeReference; +import com.fasterxml.jackson.databind.ObjectMapper; +import org.apache.ibatis.type.JdbcType; +import org.apache.ibatis.type.MappedJdbcTypes; +import org.apache.ibatis.type.MappedTypes; +import org.apache.ibatis.type.TypeHandler; + +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.List; + +@MappedJdbcTypes(JdbcType.VARCHAR) // 也可以使用JdbcType.JSON,如果数据库支持的话 +@MappedTypes(List.class) +public class ListToJsonTypeHandler implements TypeHandler> { + + private static final ObjectMapper objectMapper = new ObjectMapper(); + + @Override + public void setParameter(PreparedStatement ps, int i, List parameter, JdbcType jdbcType) throws SQLException { + if (parameter == null || parameter.isEmpty()) { + ps.setNull(i, java.sql.Types.VARCHAR); // 或者 Types.JSON 如果数据库支持 + return; + } + try { + String json = objectMapper.writeValueAsString(parameter); + ps.setString(i, json); + } catch (JsonProcessingException e) { + throw new SQLException("Error converting list to JSON", e); + } + } + + @Override + public List getResult(ResultSet rs, String columnName) throws SQLException { + String json = rs.getString(columnName); + return convertJsonToList(json); + } + + @Override + public List getResult(ResultSet rs, int columnIndex) throws SQLException { + String json = rs.getString(columnIndex); + return convertJsonToList(json); + } + + @Override + public List getResult(java.sql.CallableStatement cs, int columnIndex) throws SQLException { + String json = cs.getString(columnIndex); + return convertJsonToList(json); + } + + private List convertJsonToList(String json) throws SQLException { + if (json == null || json.isEmpty()) { + return null; + } + try { + return objectMapper.readValue(json, new TypeReference>() {}); + } catch (JsonProcessingException e) { + throw new SQLException("Error converting JSON to list", e); + } + } +} \ No newline at end of file diff --git a/src/main/java/com/bao/dating/service/UserService.java b/src/main/java/com/bao/dating/service/UserService.java index 0eb9218..2fd6dce 100644 --- a/src/main/java/com/bao/dating/service/UserService.java +++ b/src/main/java/com/bao/dating/service/UserService.java @@ -41,5 +41,5 @@ public interface UserService { * 更新用户信息 * @param userInfoUpdateDTO 用户信息 */ - UserInfoVO updateUserInfo(UserInfoUpdateDTO userInfoUpdateDTO); + void updateUserInfo(UserInfoUpdateDTO userInfoUpdateDTO); } diff --git a/src/main/java/com/bao/dating/service/impl/UserServiceImpl.java b/src/main/java/com/bao/dating/service/impl/UserServiceImpl.java index 1481799..540c225 100644 --- a/src/main/java/com/bao/dating/service/impl/UserServiceImpl.java +++ b/src/main/java/com/bao/dating/service/impl/UserServiceImpl.java @@ -25,6 +25,8 @@ 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; import java.util.UUID; @@ -45,6 +47,7 @@ public class UserServiceImpl implements UserService { /** * 用户登录 + * * @param userLoginDTO * @return 登录信息 */ @@ -56,7 +59,7 @@ public class UserServiceImpl implements UserService { } // 查询用户 User user = userMapper.getByUsername(userLoginDTO.getUsername()); - if (user == null){ + if (user == null) { throw new RuntimeException("用户不存在"); } // 密码校验 @@ -65,7 +68,7 @@ public class UserServiceImpl implements UserService { user.getSalt(), user.getPasswordHash() ); - if (!match){ + if (!match) { throw new RuntimeException("密码错误"); } // 生成token @@ -80,13 +83,14 @@ public class UserServiceImpl implements UserService { /** * 获取用户信息 + * * @param userId * @return 用户信息 */ @Override public UserInfoVO getUserInfo(Long userId) { User user = userMapper.selectByUserId(userId); - if (user == null){ + if (user == null) { throw new RuntimeException("用户不存在"); } UserInfoVO userInfoVO = new UserInfoVO(); @@ -116,7 +120,7 @@ public class UserServiceImpl implements UserService { String extension = FileUtil.getFileExtension(originalFilename); String fileName = UUID.randomUUID().toString().replace("-", "") + "." + extension; Long userId = UserContext.getUserId(); - String objectKey = "user/" + userId + "/avatar/" + fileName; + String objectKey = "user/" + userId + "/avatar/" + fileName; try { byte[] fileBytes = file.getBytes(); @@ -171,22 +175,92 @@ public class UserServiceImpl implements UserService { } } + /** + * 更新用户信息 + * + * @param userInfoUpdateDTO + * @return 用户信息 + */ @Override - public UserInfoVO updateUserInfo(UserInfoUpdateDTO userInfoUpdateDTO) { + public void updateUserInfo(UserInfoUpdateDTO userInfoUpdateDTO) { Long userId = userInfoUpdateDTO.getUserId(); User user = userMapper.selectByUserId(userId); - if (user == null){ + if (user == null) { throw new RuntimeException("用户不存在"); } + // 将需要审核的内容合并成一个文本,用于减少调用次数 + StringBuilder textBuilder = new StringBuilder(); + + if (userInfoUpdateDTO.getNickname() != null && !userInfoUpdateDTO.getNickname().isEmpty()) { + textBuilder.append(userInfoUpdateDTO.getNickname()).append(" "); + } + if (userInfoUpdateDTO.getHobbies() != null && !userInfoUpdateDTO.getHobbies().isEmpty()) { + // 将爱好列表转换为字符串,用空格分隔 + String hobbiesStr = String.join(" ", userInfoUpdateDTO.getHobbies()); + textBuilder.append(hobbiesStr).append(" "); + } + if (userInfoUpdateDTO.getSignature() != null && !userInfoUpdateDTO.getSignature().isEmpty()) { + textBuilder.append(userInfoUpdateDTO.getSignature()).append(" "); + } + // 文本审核 + if (textBuilder.length() > 0) { + Map textResult; + try { + textResult = greenTextScan.greeTextScan(textBuilder.toString()); + } catch (Exception e) { + throw new RuntimeException("用户信息文本审核失败"); + } + + String suggestion = (String) textResult.get("suggestion"); + + if ("block".equals(suggestion)) { + throw new RuntimeException("用户信息包含违规内容,修改失败"); + } + if ("review".equals(suggestion)) { + throw new RuntimeException("用户信息需要人工审核,暂无法修改"); + } + } + + // 图片审核 + List imageKeys = new ArrayList<>(); + if (userInfoUpdateDTO.getAvatarUrl() != null && !userInfoUpdateDTO.getAvatarUrl().isEmpty()) { + imageKeys.add(userInfoUpdateDTO.getAvatarUrl()); + } + if (userInfoUpdateDTO.getBackgroundUrl() != null && !userInfoUpdateDTO.getBackgroundUrl().isEmpty()) { + imageKeys.add(userInfoUpdateDTO.getBackgroundUrl()); + } + if (!imageKeys.isEmpty()) { + Map imageResult; + try { + imageResult = greenImageScan.imageScan(imageKeys); + } catch (Exception e) { + throw new RuntimeException("用户图片审核失败"); + } + + String suggestion = (String) imageResult.get("suggestion"); + + if ("block".equals(suggestion)) { + throw new RuntimeException("头像或背景图不合规,修改失败"); + } + if ("review".equals(suggestion)) { + throw new RuntimeException("头像或背景图需要人工审核,暂无法修改"); + } + } + + String nickname = userInfoUpdateDTO.getNickname(); + // 用户没传昵称 or 传空串 + if (!StringUtils.hasText(nickname)) { + // 如果数据库里原本也没有昵称 + if (!StringUtils.hasText(user.getNickname())) { + userInfoUpdateDTO.setNickname(user.getUserName()); + } else { + userInfoUpdateDTO.setNickname(null); + } + } userInfoUpdateDTO.setUpdatedAt(LocalDateTime.now()); // 更新数据库 userMapper.updateUserInfoByUserId(userInfoUpdateDTO); - - // 返回动态详情 - UserInfoVO userInfoVO = new UserInfoVO(); - BeanUtils.copyProperties(user, userInfoVO); - return userInfoVO; } } diff --git a/src/main/resources/com/bao/dating/mapper/UserMapper.xml b/src/main/resources/com/bao/dating/mapper/UserMapper.xml index 28a3a94..bf483dc 100644 --- a/src/main/resources/com/bao/dating/mapper/UserMapper.xml +++ b/src/main/resources/com/bao/dating/mapper/UserMapper.xml @@ -23,7 +23,7 @@ - + @@ -63,7 +63,7 @@ birthday = #{birthday}, - hobbies = #{hobbies, typeHandler=com.bao.dating.handler.ListToVarcharTypeHandler}, + hobbies = #{hobbies, typeHandler=com.bao.dating.handler.ListToJsonTypeHandler}, signature = #{signature},