From d8d46ab089be26e33f3f83e71c74fa5594f3af06 Mon Sep 17 00:00:00 2001 From: yang Date: Mon, 5 Jan 2026 10:01:03 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9F=A5=E8=AF=A2=E9=99=84=E8=BF=91=E7=9A=84?= =?UTF-8?q?=E4=BA=BA=EF=BC=88=E5=8F=AF=E4=BB=A5=E6=9F=A5=E7=9C=8B=E7=89=88?= =?UTF-8?q?=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/bao/dating/common/aliyun/SmsUtil.java | 3 ++ .../java/com/bao/dating/config/WebConfig.java | 3 +- .../bao/dating/controller/UserController.java | 18 +++++-- .../com/bao/dating/mapper/CommentsMapper.java | 6 +-- .../com/bao/dating/mapper/UserMapper.java | 12 +++++ .../com/bao/dating/pojo/vo/UserInfoVO.java | 2 + .../com/bao/dating/service/UserService.java | 4 ++ .../dating/service/impl/UserServiceImpl.java | 48 +++++++++++++++++++ .../java/com/bao/dating/util/CodeUtil.java | 12 +++++ .../com/bao/dating/util/DistanceUtil.java | 27 +++++++++++ .../com/bao/dating/mapper/UserMapper.xml | 9 ++++ 11 files changed, 137 insertions(+), 7 deletions(-) create mode 100644 src/main/java/com/bao/dating/util/CodeUtil.java create mode 100644 src/main/java/com/bao/dating/util/DistanceUtil.java diff --git a/src/main/java/com/bao/dating/common/aliyun/SmsUtil.java b/src/main/java/com/bao/dating/common/aliyun/SmsUtil.java index 290c766..65f7b39 100644 --- a/src/main/java/com/bao/dating/common/aliyun/SmsUtil.java +++ b/src/main/java/com/bao/dating/common/aliyun/SmsUtil.java @@ -75,6 +75,8 @@ public class SmsUtil { .setTemplateCode(templateCode != null ? templateCode : this.templateCode) .setTemplateParam(templateParam); + log.error("TemplateParam 实际值 = {}", templateParam); + SendSmsResponse response = client.sendSms(sendSmsRequest); if ("OK".equals(response.getBody().getCode())) { @@ -145,6 +147,7 @@ public class SmsUtil { jsonBuilder.append("}"); return sendSms(phoneNumber, templateCode, jsonBuilder.toString()); } + } diff --git a/src/main/java/com/bao/dating/config/WebConfig.java b/src/main/java/com/bao/dating/config/WebConfig.java index 98a0683..dc377a7 100644 --- a/src/main/java/com/bao/dating/config/WebConfig.java +++ b/src/main/java/com/bao/dating/config/WebConfig.java @@ -29,7 +29,8 @@ public class WebConfig implements WebMvcConfigurer { .addPathPatterns("/**") // 忽略的接口 .excludePathPatterns( - "/user/login" + "/user/login", + "/user/sendCode" ); } } diff --git a/src/main/java/com/bao/dating/controller/UserController.java b/src/main/java/com/bao/dating/controller/UserController.java index aad6328..7379311 100644 --- a/src/main/java/com/bao/dating/controller/UserController.java +++ b/src/main/java/com/bao/dating/controller/UserController.java @@ -15,6 +15,7 @@ import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; import javax.servlet.http.HttpServletRequest; +import java.util.Map; /** * 用户接口 @@ -65,7 +66,6 @@ public class UserController { * @param file 头像文件 * @return 上传后的文件URL列表 */ - @Log @PostMapping(value = "/info/uploadAvatar", consumes = "multipart/form-data") public Result uploadAvatar(@RequestParam("file") MultipartFile file) { String fileUrl = userService.uploadAvatar(file); @@ -77,7 +77,6 @@ public class UserController { * @param file 背景文件 * @return 上传后的文件URL列表 */ - @Log @PostMapping(value = "/info/uploadBackground", consumes = "multipart/form-data") public Result uploadBackground(@RequestParam("file") MultipartFile file) { String fileUrl = userService.uploadBackground(file); @@ -89,7 +88,6 @@ public class UserController { * @param userInfoUpdateDTO 用户信息更新参数 * @return 更新后的用户信息 */ - @Log @PostMapping("/info/update") public Result userInfoUpdate(@RequestBody UserInfoUpdateDTO userInfoUpdateDTO) { Long userId = UserContext.getUserId(); @@ -97,4 +95,18 @@ public class UserController { UserInfoVO userInfoVO =userService.updateUserInfo(userInfoUpdateDTO); return Result.success(ResultCode.SUCCESS, "用户信息更新成功", userInfoVO); } + + @PostMapping("/sendCode") + public Result sendCode(@RequestBody Map body) { + String phone = body.get("phone"); + userService.sendSmsCode(phone); + return Result.success(ResultCode.SUCCESS, "验证码发送成功"); + } + + @PostMapping("/loginByCode") + public Result loginByCode(@RequestBody Map body){ + boolean ok = userService.verifyCode(body.get("phone"), body.get("code")); + return ok ? Result.success(ResultCode.SUCCESS, "登录成功") : Result.error(ResultCode.SYSTEM_ERROR, "登录失败"); + } + } diff --git a/src/main/java/com/bao/dating/mapper/CommentsMapper.java b/src/main/java/com/bao/dating/mapper/CommentsMapper.java index 78ca350..43e6184 100644 --- a/src/main/java/com/bao/dating/mapper/CommentsMapper.java +++ b/src/main/java/com/bao/dating/mapper/CommentsMapper.java @@ -8,15 +8,15 @@ import java.util.List; public interface CommentsMapper { // 添加评论 - @Insert("INSERT INTO comments(content, user_id, post_id, created_at) VALUES(#{content}, #{user_id}, #{post_id}, #{created_at})") + @Insert("INSERT INTO dating.comments(content, user_id, post_id, created_at) VALUES(#{content}, #{user_id}, #{post_id}, #{created_at})") int addComment(Comments comments); // 删除评论 - @Delete("DELETE FROM comments WHERE user_id = #{user_id}") + @Delete("DELETE FROM dating.comments WHERE user_id = #{user_id}") int deleteComments(@Param("user_id") Long user_id); // 根据动态ID查询评论列表 - @Select("SELECT * FROM comments WHERE post_id = #{post_id} ORDER BY created_at DESC") + @Select("SELECT * FROM dating.comments WHERE post_id = #{post_id} ORDER BY created_at DESC") List getCommentsByPostId(@Param("post_id") Long post_id); /** diff --git a/src/main/java/com/bao/dating/mapper/UserMapper.java b/src/main/java/com/bao/dating/mapper/UserMapper.java index b15f293..a49abc9 100644 --- a/src/main/java/com/bao/dating/mapper/UserMapper.java +++ b/src/main/java/com/bao/dating/mapper/UserMapper.java @@ -3,6 +3,9 @@ package com.bao.dating.mapper; import com.bao.dating.pojo.dto.UserInfoUpdateDTO; import com.bao.dating.pojo.entity.User; import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + +import java.util.List; /** * 用户Mapper @@ -33,4 +36,13 @@ public interface UserMapper { */ void updateUserInfoByUserId(UserInfoUpdateDTO userInfoUpdateDTO); + /** + * 根据经纬度范围查询用户 + * @param minLat 最小纬度 + * @param maxLat 最大纬度 + * @param minLng 最小经度 + * @param maxLng 最大经度 + * @return 用户列表 + */ + List findByLatLngRange(@Param("minLat") double minLat, @Param("maxLat") double maxLat, @Param("minLng") double minLng, @Param("maxLng") double maxLng); } diff --git a/src/main/java/com/bao/dating/pojo/vo/UserInfoVO.java b/src/main/java/com/bao/dating/pojo/vo/UserInfoVO.java index c5a81fa..35c5c90 100644 --- a/src/main/java/com/bao/dating/pojo/vo/UserInfoVO.java +++ b/src/main/java/com/bao/dating/pojo/vo/UserInfoVO.java @@ -24,4 +24,6 @@ public class UserInfoVO implements Serializable { private String signature; private LocalDateTime updatedAt; private LocalDateTime createdAt; + private Double latitude; + private Double longitude; } diff --git a/src/main/java/com/bao/dating/service/UserService.java b/src/main/java/com/bao/dating/service/UserService.java index 8dd074c..a1efe62 100644 --- a/src/main/java/com/bao/dating/service/UserService.java +++ b/src/main/java/com/bao/dating/service/UserService.java @@ -52,4 +52,8 @@ public interface UserService { * @return 更新后的用户信息 */ UserInfoVO updateUserInfo(UserInfoUpdateDTO userInfoUpdateDTO); + + void sendSmsCode(String phone); + + boolean verifyCode(String phone, String code); } 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 189b7e3..196c9b5 100644 --- a/src/main/java/com/bao/dating/service/impl/UserServiceImpl.java +++ b/src/main/java/com/bao/dating/service/impl/UserServiceImpl.java @@ -3,6 +3,7 @@ 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.aliyun.SmsUtil; import com.bao.dating.common.result.AliOssResult; import com.bao.dating.common.result.GreenAuditResult; import com.bao.dating.config.RedisConfig; @@ -14,6 +15,7 @@ import com.bao.dating.pojo.entity.User; import com.bao.dating.pojo.vo.UserInfoVO; import com.bao.dating.pojo.vo.UserLoginVO; import com.bao.dating.service.UserService; +import com.bao.dating.util.CodeUtil; import com.bao.dating.util.FileUtil; import com.bao.dating.util.JwtUtil; import com.bao.dating.util.MD5Util; @@ -21,6 +23,7 @@ import io.jsonwebtoken.Claims; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.data.redis.core.StringRedisTemplate; import org.springframework.stereotype.Service; import org.springframework.web.multipart.MultipartFile; @@ -37,6 +40,10 @@ import java.util.concurrent.TimeUnit; @Service public class UserServiceImpl implements UserService { + + @Autowired + private SmsUtil smsUtil; + @Autowired private AliOssUtil ossUtil; @@ -52,6 +59,9 @@ public class UserServiceImpl implements UserService { @Autowired private UserMapper userMapper; + @Autowired + private StringRedisTemplate stringRedisTemplate; + /** * 用户登录 * @@ -311,4 +321,42 @@ public class UserServiceImpl implements UserService { BeanUtils.copyProperties(updatedUser, userInfoVO); return userInfoVO; } + + // 发送短信验证码 + @Override + public void sendSmsCode(String phone) { + //防刷:60 秒内只能发一次 + String key = "sms:code:" + phone; + Boolean exists = stringRedisTemplate.hasKey(key); + if (Boolean.TRUE.equals(exists)){ + throw new RuntimeException("请勿频繁发送验证码"); + } + // 生成验证码 + String code = CodeUtil.generateCode(); + // 发送短信 + smsUtil.sendVerificationCode(phone, code); + //存 Redis(5分钟过期) + stringRedisTemplate.opsForValue() + .set(key,code, 5, TimeUnit.MINUTES); + } + + // 校验验证码 + @Override + public boolean verifyCode(String phone, String code) { + + String key = "sms:code:" + phone; + String realCode = stringRedisTemplate.opsForValue().get(key); + //过期,未发送 + if (realCode ==null){ + return false; + } + //不匹配 + if (!realCode.equals(code)){ + return false; + } + // 校验成功,删除验证码(一次性) + stringRedisTemplate.delete(key); + return true; + } + } diff --git a/src/main/java/com/bao/dating/util/CodeUtil.java b/src/main/java/com/bao/dating/util/CodeUtil.java new file mode 100644 index 0000000..be43c7f --- /dev/null +++ b/src/main/java/com/bao/dating/util/CodeUtil.java @@ -0,0 +1,12 @@ +package com.bao.dating.util; + +import java.util.Random; + +public class CodeUtil { + // 生成6位数字验证码 + public static String generateCode() { + Random random = new Random(); + int code=100000+random.nextInt(900000); + return String.valueOf(code); + } +} diff --git a/src/main/java/com/bao/dating/util/DistanceUtil.java b/src/main/java/com/bao/dating/util/DistanceUtil.java new file mode 100644 index 0000000..4db45ab --- /dev/null +++ b/src/main/java/com/bao/dating/util/DistanceUtil.java @@ -0,0 +1,27 @@ +package com.bao.dating.util; + +public class DistanceUtil { + private static final double EARTH_RADIUS = 6371.0; // 地球半径 km + + /** + * 计算两点之间距离(单位:km) + */ + public static double calculate( + double lat1, double lon1, + double lat2, double lon2) { + + double dLat = Math.toRadians(lat2 - lat1); + double dLon = Math.toRadians(lon2 - lon1); + + lat1 = Math.toRadians(lat1); + lat2 = Math.toRadians(lat2); + + double a = Math.sin(dLat / 2) * Math.sin(dLat / 2) + + Math.cos(lat1) * Math.cos(lat2) + * Math.sin(dLon / 2) * Math.sin(dLon / 2); + + double c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a)); + + return EARTH_RADIUS * c; + } +} diff --git a/src/main/resources/com/bao/dating/mapper/UserMapper.xml b/src/main/resources/com/bao/dating/mapper/UserMapper.xml index 61bb82b..fcab72b 100644 --- a/src/main/resources/com/bao/dating/mapper/UserMapper.xml +++ b/src/main/resources/com/bao/dating/mapper/UserMapper.xml @@ -28,6 +28,8 @@ + + + select * from dating.user where user_phone =#{phone} + + \ No newline at end of file