查询附近的人(可以查看版)

This commit is contained in:
2026-01-05 10:01:03 +08:00
parent c83d86ad1a
commit d8d46ab089
11 changed files with 137 additions and 7 deletions

View File

@@ -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());
}
}

View File

@@ -29,7 +29,8 @@ public class WebConfig implements WebMvcConfigurer {
.addPathPatterns("/**")
// 忽略的接口
.excludePathPatterns(
"/user/login"
"/user/login",
"/user/sendCode"
);
}
}

View File

@@ -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<String> 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<String> 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<UserInfoVO> 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<String, String> body) {
String phone = body.get("phone");
userService.sendSmsCode(phone);
return Result.success(ResultCode.SUCCESS, "验证码发送成功");
}
@PostMapping("/loginByCode")
public Result loginByCode(@RequestBody Map<String, String> body){
boolean ok = userService.verifyCode(body.get("phone"), body.get("code"));
return ok ? Result.success(ResultCode.SUCCESS, "登录成功") : Result.error(ResultCode.SYSTEM_ERROR, "登录失败");
}
}

View File

@@ -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<Comments> getCommentsByPostId(@Param("post_id") Long post_id);
/**

View File

@@ -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<User> findByLatLngRange(@Param("minLat") double minLat, @Param("maxLat") double maxLat, @Param("minLng") double minLng, @Param("maxLng") double maxLng);
}

View File

@@ -24,4 +24,6 @@ public class UserInfoVO implements Serializable {
private String signature;
private LocalDateTime updatedAt;
private LocalDateTime createdAt;
private Double latitude;
private Double longitude;
}

View File

@@ -52,4 +52,8 @@ public interface UserService {
* @return 更新后的用户信息
*/
UserInfoVO updateUserInfo(UserInfoUpdateDTO userInfoUpdateDTO);
void sendSmsCode(String phone);
boolean verifyCode(String phone, String code);
}

View File

@@ -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);
//存 Redis5分钟过期
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;
}
}

View File

@@ -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);
}
}

View File

@@ -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;
}
}

View File

@@ -28,6 +28,8 @@
<result property="signature" column="signature"/>
<result property="createdAt" column="created_at"/>
<result property="updatedAt" column="updated_at"/>
<result property="latitude" column="user_latitude"/>
<result property="longitude" column="user_longitude"/>
</resultMap>
<select id="selectByUserId" resultMap="UserResultMap">
SELECT
@@ -74,4 +76,11 @@
</set>
WHERE user_id = #{userId}
</update>
<select id="selectByPhone" resultType="com.bao.dating.pojo.entity.User">
select * from dating.user where user_phone =#{phone}
</select>
<select id="findByLatLngRange" resultType="com.bao.dating.pojo.entity.User">
SELECT * FROM user WHERE user_latitude BETWEEN #{minLat} AND #{maxLat} AND user_longitude BETWEEN #{minLng} AND #{maxLng}
</select>
</mapper>