113
社区成员
发帖
与我相关
我的任务
分享| 这个作业属于哪个课程 | https://bbs.csdn.net/forums/2401_CS_SE_FZU |
|---|---|
| 这个作业要求在哪里 | https://bbs.csdn.net/topics/619397949 |
| 这个作业的目标 | CodeArt团队实战总结 |
| 其他参考文献 | CSDN,博客园 |
222200315张俊腾
进展一:修改了RescueService.java,首先检查用户是否已接取过该求助,如果未接取,再根据求助类型进行额外的检查。
// 首先检查用户是否已经接取过该求助
boolean alreadyAcceptedByUser = rescueInfoRepository.existsByHelpIdAndUid(helpRequest.getId(), userId);
if (alreadyAcceptedByUser) {
return new Response<>(400, "您已接取过该求助", null);
}
// 根据求助类型进行额外的检查,如果是1对多就无需额外检查
if (type == 1) { // 一对一
// 检查该求助是否已被其他用户接取
boolean alreadyAccepted = rescueInfoRepository.existsByHelpId(helpRequest.getId());
if (alreadyAccepted) {
return new Response<>(400, "该求助已被其他用户接取", null);
}
}
222200309孙阳
进展一:完成“新增用户奖牌功能”
public boolean Add_medal(Long user_id,Byte medal_id){
User user = userRepository.findById(user_id).orElse(null);
if (user != null) {
// 创建并保存消息
UserMedal medal = new UserMedal();
medal.setUid(user_id);
medal.setMedalType(medal_id);
medal.setCreatedAt(LocalDateTime.now());
medal.setUpdatedAt(LocalDateTime.now());
medalRepository.save(medal); // 将消息存入数据库,并返回保存后的实体
return true;
} else {
return false;
}
}
222200304卢君豪
进展一:““获取附近求助信息”service的实现
public Response<List<HelpRequestInfo>> getNearbyHelpRequest(String location) {
if (!location.matches("^([0-8]?\\d(\\.\\d+)?|90(\\.0+)?),(1[0-7]?\\d(\\.\\d+)?|0?\\d{1,2}(\\.\\d+)?|180(\\.0+)?)$")) {
return new Response<>(401, "位置无效", null);
}
List<HelpRequest> helpRequestList = helpRequestRepository.findByStatusAndAuditStatus(1, 1);
List<HelpRequestInfo> helpRequestInfoList = new ArrayList<>();
for (HelpRequest helpRequest : helpRequestList) {
if (calculateDistance(location, helpRequest.getLocation()) < 1.0) {
helpRequestInfoList.add(new HelpRequestInfo(helpRequest.getId(), helpRequest.getUid(), helpRequest.getLocation(), helpRequest.getType(), helpRequest.getPhoneNumber(), helpRequest.getDetailedAddress(), helpRequest.getRoadCondition(), helpRequest.getWeatherCondition(), helpRequest.getUtilitiesInfo(), helpRequest.getAssistanceType(), helpRequest.getSuppliesNeeded(), helpRequest.getAssistanceType(), helpRequest.getIntroduction()));
}
}
return new Response<>(200, "success", helpRequestInfoList);
}
private double calculateDistance(String coordA, String coordB) {
double EARTH_RADIUS = 6371.0;
String[] latLonA = coordA.split(",");
String[] latLonB = coordB.split(",");
double lat1 = Double.parseDouble(latLonA[0]);
double lon1 = Double.parseDouble(latLonA[1]);
double lat2 = Double.parseDouble(latLonB[0]);
double lon2 = Double.parseDouble(latLonB[1]);
double lat1Rad = Math.toRadians(lat1);
double lon1Rad = Math.toRadians(lon1);
double lat2Rad = Math.toRadians(lat2);
double lon2Rad = Math.toRadians(lon2);
double deltaLat = lat2Rad - lat1Rad;
double deltaLon = lon2Rad - lon1Rad;
double a = Math.sin(deltaLat / 2) * Math.sin(deltaLat / 2) + Math.cos(lat1Rad) * Math.cos(lat2Rad) * Math.sin(deltaLon / 2) * Math.sin(deltaLon / 2);
double c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
return EARTH_RADIUS * c;
}
222200310李怡涵
进展一:实现了获取附近实况的接口,在获取的过程中删除过期实况
public Response<List<UserLiveList>> getNearbyLive(String location){
List<LiveInfo> getAllLiveInfo = liveInfoRepository.findAll();
List<UserLiveList> liveList = new ArrayList<>();
for (LiveInfo item : getAllLiveInfo){
//实况已经过期
if (!item.getExpiryAt().isAfter(LocalDateTime.now())){
liveInfoRepository.softDeleteLiveInfoById(item.getId());
}
else if (calculateDistance(location, item.getLocation()) <= 1){
UserLiveList userLiveList = new UserLiveList(item.getId(),item.getUid(),item.getLocation(),item.getWeatherCondition(),
item.getRoadCondition(),item.getUtilitiesInfo(),item.getLevel(),item.getIntroduction(),item.getExpiryAt());
liveList.add(userLiveList);
}
}
return new Response<>(200, "success", liveList);
}
进展二:距离计算的代码
private static final double EARTH_RADIUS = 6371;
// 将度数转换为弧度
private static double toRadians(double degree) {
return degree * Math.PI / 180.0;
}
// 计算两个经纬度之间的距离
private static double calculateDistance(String coord1, String coord2) {
// 将坐标字符串按逗号分割
String[] parts1 = coord1.split(",");
String[] parts2 = coord2.split(",");
// 获取经度和纬度(注意:东经和北纬默认是正数)
double lat1 = Double.parseDouble(parts1[0]);
double lon1 = Double.parseDouble(parts1[1]);
double lat2 = Double.parseDouble(parts2[0]);
double lon2 = Double.parseDouble(parts2[1]);
// 将经纬度从度数转换为弧度
lat1 = toRadians(lat1);
lon1 = toRadians(lon1);
lat2 = toRadians(lat2);
lon2 = toRadians(lon2);
// Haversine公式
double dlat = lat2 - lat1;
double dlon = lon2 - lon1;
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;
}
222200311李梓玄
进展一:完成上传实况的后端对接
进展二:加入上传实况和发布求助的加载动画
进展三:学习使用地图控件覆盖物
222200328夏振
进展一: - 新增管理员审核实况信息接口
222200401丁昌彪
进展一:实名信息从网络获取,设置增加更换手机号和个人信息
222200312杨年申
进展一:完成UserController.modifyUserInfo及其Request搭建
@PutMapping("/modify_info")
public ResultResponse<UserInfo> modifyUserInfo(
@ModelAttribute ModifyInfoRequest modifyInfoRequest,
@RequestHeader("Authorization") String token
) {
return userService.ModifyUserInfo(modifyInfoRequest,token);
}
public class ModifyInfoRequest {
private String phone_number;
// Getter 和 Setter
public String getPhone_number() {
return phone_number;
}
public void setPhone_number(String phone_number) {
this.phone_number = phone_number;
}
}
进展二:完善modifyUserInfo的Service
public Response<UserDetail> ModifyUserInfo(ModifyInfoRequest modifyInfoRequest, String token) {
// 检查令牌
Claims claims;
try {
claims = JwtUtil.extractClaims(token);
} catch (MalformedJwtException e) {
return new Response<>(400, "无效的令牌格式", null);
} catch (ExpiredJwtException e) {
return new Response<>(401, "令牌已过期", null);
} catch (IllegalArgumentException e) {
return new Response<>(400, "令牌不能为空", null);
} catch (JwtException e) {
return new Response<>(401, "无效的令牌", null);
} catch (Exception e) {
return new Response<>(500, "服务器内部错误", null);
}
long userId = Long.parseLong(claims.getSubject());
//验证电话号码
String phoneNumber = modifyInfoRequest.getPhone_number();
if (phoneNumber.length() != 11) {
return new Response<>(400, "无效的手机号", null);
}
//更新实名状态
Optional<User> optionalUser = userRepository.findById(userId);
if (optionalUser.isPresent()) {
User user = optionalUser.get();
user.setPhoneNumber(modifyInfoRequest.getPhone_number());
userRepository.save(user);
UserDetail userDetail = new UserDetail(
user.getId(),
user.getUsername(),
user.getRole(),
user.getPhoneNumber(),
user.getIsRealNameAuthentication()
);
return new Response<>(200, "success", userDetail);
}
else
{
return new Response<>(500, "用户不存在", null);
}
}
222200230梁蕴潆
进展一:编写冲刺日记
进展二:上传了剩下部分捐赠部分插件的代码
<div class="donation-form">
<h3>进行捐赠</h3>
<form @submit.prevent="submitDonation">
<label for="donorName">捐赠者姓名:</label>
<input type="text" id="donorName" v-model="donorName" required>
<label for="donationDetails">捐赠内容:</label>
<input type="text" id="donationDetails" v-model="donationDetails" required>
<label for="contactInfo">联系方式:</label>
<input type="text" id="contactInfo" v-model="contactInfo" required>
<button type="submit">提交捐赠</button>
</form>
</div>
</div>
</template>
<script>
export default {
name: 'DonationComponent',
data() {
return {
donations: [], // 存储捐赠信息的数组
donorName: '', // 捐赠者姓名
donationDetails: '', // 捐赠内容
contactInfo: '', // 联系方式
};
},
methods: {
submitDonation() {
// 创建一个新的捐赠对象
const newDonation = {
id: Date.now(), // 使用时间戳作为唯一ID
donorName: this.donorName,
donationDetails: this.donationDetails,
donationDate: new Date().toISOString().split('T')[0], // 获取捐赠日期
contactInfo: this.contactInfo,
};
// 将新的捐赠信息添加到数组中
this.donations.push(newDonation);
// 清空表单
this.donorName = '';
this.donationDetails = '';
this.contactInfo = '';
},
},
};
</script>
<style scoped>
.donation-info-container {
max-width: 800px;
margin: 0 auto;
padding: 20px;
border: 1px solid #ccc;
border-radius: 8px;
}
.donation-list {
margin-bottom: 20px;
}
.donation-item {
border-bottom: 1px solid #eee;
padding: 10px 0;
}
.donation-form {
background-color: #f9f9f9;
padding: 20px;
border-radius: 8px;
}
.donation-form h3 {
margin-bottom: 15px;
}
.donation-form label {
display: block;
margin-bottom: 5px;
}
.donation-form input {
width: 100%;
padding: 8px;
margin-bottom: 10px;
border: 1px solid #ddd;
border-radius: 4px;
}
.donation-form button {
padding: 10px 20px;
background-color: #007bff;
color: white;
border: none;
border-radius: 4px;
cursor: pointer;
transition: background-color 0.3s;
}
.donation-form button:hover {
background-color: #0056b3;
}
</style>
| 成员 | 存在的问题/遇到的困难 | 接下来的安排 |
|---|---|---|
| 222200315张俊腾 | - 遇到的问题: - 在优化acceptHelpRequest方法时,如何有效地减少数据库查询次数.- 解答:- 通过调整检查顺序,首先检查用户是否已接取过该求助,避免不必要的类型检查和查询。 | 继续完善RescueService.java中的业务逻辑,确保接取求助功能在各种场景下都能稳定运行。 |
| 222200309孙阳 | 无 | 打算测试“新增用户奖牌功能,”开始编写“自动添加用户奖牌”的接口代码 |
| 222200304卢君豪 | 问题、困难1,不知道怎么用经纬度计算距离 - 解答,经查询资料所得,可以用哈弗辛公式计算 | 设计“完成/取消求助”的controller |
| 222200310李怡涵 | 遇到的困难- 如何通过两地的经纬度字符串来计算两地的距离- 解决- 分割字符串,并引入Haversine 公式进行计算 | 修复已知的Bug,进行更完善的测试 |
| 222200311李梓玄 | 无 | 对接获取实况信息和获取求助信息的接 |
| 222200328夏振 | 暂不是很熟APIFOX,第一次没跑通,删了body就跑通了 | 接下来还是把我剩下没完成的功能设计实现,并总结今天完成的内容 |
| 222200401丁昌彪 | 无 | 完成更换手机号,完成求助记录的状态修改 |
| 222200312杨年申 | - 问题、困难1- 在修改用户信息时,可能需要处理多个字段的更新,确保逻辑清晰。- 解答- 在 Service 层中,将修改逻辑分解为多个步骤,每一步处理一个具体的字段更新,增强代码的可读性和维护性。- 问题、困难2 - 在修改用户信息过程中可能会发生异常,例如数据库保存失败。- 解答- 使用全局异常处理器捕获并处理可能出现的异常,返回友好的错误信息。 | 安排实现一个接口deleteUserInfo |
| 222200230梁蕴潆 | 有些无法理解Vue如何追踪依赖和响应数据变化 | 总结今日的工作,初步实现下一项任务。 |

| 成员 | 相关图片 |
|---|---|
| 222200315张俊腾 |
|
| 222200309孙阳 |
|
| 222200304卢君豪 |
|
| 222200310李怡涵 |
|
| 222200311李梓玄 |
|
| 222200328夏振 |
|
| 222200401丁昌彪 |
|
| 222200312杨年申 |
|
| 222200230梁蕴潆 |
|
| 成员 | 心得体会 |
|---|---|
| 222200315张俊腾 | 做项目时既要确保系统既满足业务需求,又要保持数据的完整性和一致性。 |
| 222200309孙阳 | 代码编写要专心,否则只会永远debug |
| 222200304卢君豪 | 非常好的学习,使我“获取附近求助信息” |
| 222200310李怡涵 | 修复已知的Bug,进行更完善的测试 |
| 222200311李梓玄 | 地图控件太太太难看懂了,感觉需要攻坚克难一下 |
| 222200328夏振 | 感谢项目使我获得提升,谢谢 |
| 222200401丁昌彪 | 开发速度太慢,得抓紧时间了。 |
| 222200312杨年申 | 良好的代码结构:将修改逻辑拆分成多个步骤,不仅提升了代码的可读性,也便于将来进行维护和扩展。合理的代码结构可以提高团队协作效率。 |
| 222200230梁蕴潆 | 参与项目让我获得提升,学到很多新知识。 |