我和群众站一队-alpha冲刺第7日
冲刺日记七:
| 这个作业属于哪个课程 | 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梁蕴潆 | 参与项目让我获得提升,学到很多新知识。 |
相关推荐
基于混合储能协调控制的三相并网逆变系统设计【附说明文档】
内容概要:本文针对含分布式电源的配电网在故障情况下的恢复问题,提出了一种将网络重构、孤岛划分与检修进度统一考虑的多时段优化模型。该模型以最小化网损和甩负荷惩罚为目标,综合考虑节点功率守恒、支路潮流、电压与容量限制、二阶锥松弛以及拓扑连通性等约束条件,利用混合整数二阶锥规划方法进行求解。通过引入虚拟流变量和大常数松弛技术,有效描述了供电片区的连通性与支路开断状态,避免了传统模型中因设置节点归属变量导致的变量规模膨胀问题。模型在IEEE33节点系统上实现了故障后多时段的重构与孤岛运行方案优化,并通过仿真展示了各时段的网络拓扑、电压分布和负荷恢复情况。文章还对模型的建模细节进行了深入评述,指出了当前实现中存在的简化与不足,如无功处理不完善、电压约束未区分失电节点、缺乏储能与开关操作成本等,并提出了相应的改进建议,为后续研究提供了方向。; 适合人群:电力系统自动化、智能电网及相关专业的研究生、科研人员及从事配电网故障恢复、分布式电源集成、优化调度等领域的工程技术人员。; 使用场景及目标:①用于研究含高比例分布式电源的主动配电网在故障条件下的韧性提升策略;②为实现网络重构与孤岛划分的协同优化提供建模参考;③适用于学术论文复现、课题研究建模与电力系统仿真教学;④目标是掌握基于二阶锥松弛与虚拟流的多时段混合整数规划方法在配电网恢复中的应用。; 阅读建议:建议结合文中引用的参考文献(如汤一达等、陈文兴等的研究)对比阅读,深入理解模型的理论渊源;在复现过程中重点关注虚拟流连通性、大常数松弛与二阶锥转换的实现机制;建议在现有模型基础上逐步加入负荷分级、储能动态、分布式电源出力调控等模块,以构建更贴近实际的完整故障恢复系统。
国央企创新负责人如何利用平台实现创新资源的精准配置与高效联动?.docx
科易网基于AI模型+行业大数据,在技术转移、成果转化、技术经纪、知识产权、产业创新、科技招商等垂直领域的多样化应用场景,推出科技创新领域的AI+工具与数智化解决方案,推动科技创新与产业创新智能化发展。
国央企创新负责人如何提升技术需求挖掘与分析的专业性与准确性?.docx
国央企创新负责人如何提升技术需求挖掘与分析的专业性与准确性?
CIM工具450|库位容量与周转率分析器(LED芯片CIM-MES配套)
按库位聚合在库量与容量算利用率、年化周转率,识别超容/低利用/周转偏慢库位与呆滞料清单,给出挪库清库建议。纯Python标准库,含示例数据与中文分析报告,Python 3.8+直接运行。
Delphi 13.2控件之DxAutoInstaller-2.1.10.rar
Delphi 13.2控件之DxAutoInstaller_2.1.10.rar












