这个作业属于哪个课程 | 2301-计算机学院-软件工程社区-CSDN社区云 |
---|---|
这个作业要求在哪里 | 团队作业——站立式会议+alpha冲刺-CSDN社区 |
这个作业的目标 | 记录alpha冲刺Day10 |
团队名称 | 熬夜会秃头 |
团队置顶集合随笔链接 | Alpha 冲刺随笔置顶(熬夜会秃头团队)-CSDN博客 |
目录
一、团队成员站立式会议总结
组员 | 昨天站立式会议到现在的进展 | 存在的问题/遇到的困难 | 心得体会 |
陈少桐 | 编写缺少的页面,实现了单文件上传以及下载 | 在下载文件的实现过程中路径会报错,后来发现将当前文件的地址当成了服务器的地址,将url改为this.url就可以 | 学会了利用uni.upload以及uni.download,比起利用uni-file-piker会更加自由 |
梁菲汎 | 实现了各页面之间的点击跳转 | 无 | 首先需要对按钮绑定一个函数,然后在函数里进行页面路由的改变。 这里要确保项目中已经在使用vue-router。 |
陈知菲 | 完善了文件分片上传功能,实现了Redis的slot分配在文件分片上传中的运用和文件分片与去中心化分布式架构的整合,使文件在集群中变得可标识 | 文件分片上传包括准备、上传、校验三个阶段,每个阶段都有一独立的接口实现,如何标识同一文件的三个阶段,使集群中的节点“记得”调用某一阶段的接口的属于哪个文件 使用jwt+md5的方式,jwt定位文件上传的目的节点,md5定义某一分片属于哪个未上传完成的文件 | 了解了在去中心化集群中标识某一文件的方法,了解了jwt的算法与使用。 |
李恒欣 | 继续完善后端代码功能 | 无 | 引入缓存机制能减少对数据库的访问次数,提高后端代码的性能和可扩展性。 |
邱思源 | 对新实现的后端代码进行单元测试 | 需要确保测试能够准确地模拟后端代码的输入和输出,同时还要确保测试能够在不同环境下可靠地运行 | 使用自动化测试工具来进行测试,并对测试结果进行详细的分析和比较,能提高测试的准确性和可靠性。 |
宋芳鑫 | 完善测试随笔、编写冲刺总结随笔 | 如何确保总结的全面性和客观性 | 编写随笔可以帮助我更好地组织和表达思想。通过将想法转化为文字,我可以更清晰地理解自己的思路,并提高团队沟通能力。 |
张一凡 | 对新实现的前端代码进行单元测试 | 需要确保测试覆盖了所有重要的功能和边界情况,同时还要确保测试的有效性 | 单元测试需要持续进行和定期更新,以确保其与代码的变化保持同步。 |
林承桢 | 继续进行功能测试,完善测试文档 | 如何确保功能测试的全面性和有效性 | 编写有效的功能测试需要花费一定的时间和精力,但这是非常值得的,因为它可以帮助我在早期阶段发现和解决问题,从而避免在后期的开发环境中出现严重的问题。 |
黄才栋 | 完善了图片上传功能 | 要使图片上传功能正常工作并防止恶意行为 | 编写有效的图片上传功能需要综合考虑多个因素,如文件大小限制、文件类型过滤等。最后,图片上传功能需要与后端紧密配合,以确保文件的安全存储和传输。 |
谢怀广 | 核对已完成代码规范并制作项目燃尽图 | 无 | 在编写代码时,不仅要考虑功能的实现,还要考虑代码的结构和可读性。通过制作燃尽图,我不仅了解了项目的整体进度,还发现了项目中的瓶颈和需要改进的地方。 |
二、今日成果展示
上传并下载单文件
uploadAFile(){
uni.uploadFile({
url:this.url,
filePath: tempFilePaths[0],
name: 'file',
formData:this.formdata,
header:{
"Content-Type": "multipart/form-data",
"token":this.token
},
success: (res) => {
if (res.data.code == 200){
console.log('请求成功',res)
uni.showToast({
icon:'none',
title:'提交成功',
success: (res) => {
setTimeout(() => {
uni.navigateBack({
delta: 1
})
}, 1500)
}
})
}
},
fail:(err)=>{
console.log('请求失败',err)
}
})
},
downLoadAFile(){
uni.downloadFile({
url: 'http://test-cn.your-api-server.com',
success: res => {
let filePath = res.tempFilePath;
uni.openDocument({
filePath,
success: () => {
console.log('打开文档成功');
},
fail: error => {
console.log(error)
}
});
} else {
uni.saveFile({
tempFilePath: filePath,
success: () => {
uni.showToast({
title:'下载成功'
})
},
fail:()=>{
uni.showToast({
title:'下载失败'
})
}
})
}
},
fail:()=>{
if(!open){
uni.showToast({
title:'下载失败'
})
}
}
})
},
各页面之间的点击跳转
export default {
name :'login',
setup()
{
...
const jump = () =>{
router.push({path:'/register'})
}
return {jump}
}
}
Slot分配机制在文件分片上传过程中的实现
上传准备阶段:去中心化集群的某一节点获取其目的节点的url,向目的节点转发,将目的节点的url用jwt加密后返回
public ResponseResult shardPreparation(ShardMessage message, String originMd5) {
String bucketId = message.getBucketId();
String fileName = message.getFileName();
String uri = servicesUtil.distributeURI(fileName);
String jwt = JwtUtil.createJWT(uri);
// if ("localhost".equals(uri)) {
// return putService.shardPreparation(message, originMd5);
// } else {
try {
ResponseResult res = testFeign.shardPreparation(new URI(uri), fileName,
message.getShardNum(), message.getShardSize(), bucketId,
message.getIsZip(), originMd5, 1);
return new ResponseResult(res.getCode(), res.getMsg(), jwt);
} catch (URISyntaxException e) {
throw new RuntimeException(e);
}
// }
}
上传和校验阶段:
前端携带准备阶段的jwt请求,后端解析jwt后获取其目的节点的url,向目的节点转发请求
@Override
public ResponseResult<Integer> uploadShard(ShardFile shardFile, String key) {
try {
String uri = JwtUtil.parseJWT(key).getSubject();
testFeign.uploadShard(new URI(uri), shardFile.getNo(), shardFile.getTotalMD5(),
shardFile.getOwnMD5(), shardFile.getFile(), key, 1);
} catch (Exception e) {
e.printStackTrace();
return new ResponseResult<>(200, "key解析失败");
}
return new ResponseResult<>(200, "找不到路径");
}
@Override
public ResponseResult<Set<Integer>> checkShard(String md5, String key) {
try {
String uri = JwtUtil.parseJWT(key).getSubject();
testFeign.checkShard(new URI(uri), md5, key, 1);
} catch (Exception e) {
e.printStackTrace();
return new ResponseResult<>(200, "key解析失败");
}
return new ResponseResult<>(200, "找不到路径");
}