这个作业属于哪个课程 | 软件工程A |
---|---|
这个作业要求在哪里 | 团队作业—beta冲刺+事后诸葛亮 |
这个作业的目标 | 记录beta冲刺Day5 |
团队名称 | 指导组 |
团队置顶集合随笔链接 | 指导组--beta冲刺随笔置顶 |
其他参考文献 |
一、SCRUM部分
成员描述
成员 | 完成的任务 | 花费的时间(min) | 剩余的时间(min) | 存在/遇到的问题 | 从今天到明天会议的安排 |
---|---|---|---|---|---|
072103402-卢成熙 | 完成页面搜索(es)和文件上传(MinIO) | 60 | 20 | es自我保护机制,MinIO接不上 | 优化完成前后端的对接 |
102101117-刘建鑫 | 导入数据库数据 | 90 | 10 | 图片的展示依旧有问题 | 具体展示图片 |
102101427-陈永裕 | 完善管理员端与后端交互接口的设计 | 120 | 20 | 遇到接口定义不统一的问题 | 规范统一管理员端的接口实现 |
102101413-王润富 | 完善管理员端的博客管理 | 70 | 20 | 博客显示界面显示异常 | 继续完成管理员端的博客管理界面设计 |
102101128-陈林旭 | 完成管理员端前后端部分接口测试 | 90 | 10 | 遇到数据传递错误的问题 | 继续完成前后端的对接 |
102101133-纳世荣 | 完善用户端博客界面的设计 | 90 | 12 | 遇到功能设置不合理的问题 | 继续完成博客界面的设计 |
291800137-赵鑫 | 完善用户端前后端的接口 | 90 | 10 | 遇到接口性能的问题 | 继续完成前后端的接口设计 |
102101134-范智强 | 优惠券界面设计,个人主页的设计优化 | 90 | 15 | 优惠券二维码不够优美,个人主页展示出错 | 利用组件库设计 |
102101137-林鹏 | 评论区界面,搜索界面设计 | 90 | 12 | 搜索框不正确,搜索界面展示出错 | 重点先解决搜索框 |
031802441-张志敏 | 完善用户端隐藏界面的设计 | 120 | 0 | 遇到界面用户体验不佳的问题 | 继续完成用户端隐藏界面的设计 |
代码部分
用户/商铺/博客 图片上传至MinIO,并返回图片路径
@PostMapping("blog")
public Result uploadImage(@RequestParam("file") MultipartFile image) {
try {
String filePath = fileStorageService.uploadImgFile("", image.getOriginalFilename(), image.getInputStream());
return Result.ok(filePath);
} catch (IOException e) {
throw new RuntimeException("文件上传失败", e);
}
}
相关MinIO测试
@Test
public void testUpdateImgFile() {
try {
FileInputStream fileInputStream = new FileInputStream("E:\\pictures\\利率计算器.png");
String filePath = fileStorageService.uploadImgFile("", "calculator.jpg", fileInputStream);
System.out.println(filePath);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
搜索功能的实现(基于elasticSearch)
@PostMapping({"keyword"})
public Result searchByKeyword(@PathVariable("keyword") String keyword) throws IOException {
BulkRequest bulkRequest = new BulkRequest("shop_info");
// 构建查询条件,可以根据具体需求进行修改
SimpleQueryStringBuilder queryStringBuilder = QueryBuilders.simpleQueryStringQuery(keyword)
.field("name")
.field("area")
.field("address");
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
searchSourceBuilder.query(queryStringBuilder);
SearchRequest searchRequest = new SearchRequest("shop_info");
searchRequest.source(searchSourceBuilder);
// 执行查询
SearchResponse searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
List<Shop> shopList = new ArrayList<>();
for (SearchHit hit : searchResponse.getHits().getHits()) {
Map<String, Object> sourceAsMap = hit.getSourceAsMap();
Shop shop = new Shop();
BeanUtil.fillBeanWithMap(sourceAsMap, shop, true);
// 其他字段的设置,需要根据实际情况添加
shopList.add(shop);
}
return Result.ok(shopList);
}
将商铺数据导入索引库
@Test
public void testEs() throws IOException {
List<Shop> shops = shopService.list();
BulkRequest bulkRequest = new BulkRequest("shop_info");
for(Shop shop : shops) {
IndexRequest indexRequest = new IndexRequest().id(shop.getId().toString())
.source(JSONUtil.toJsonStr(shop), XContentType.JSON);
//批量添加数据
bulkRequest.add(indexRequest);
}
restHighLevelClient.bulk(bulkRequest, RequestOptions.DEFAULT);
}
索引库的创建
{
"mappings": {
"properties": {
"id": {
"type": "long"
},
"name": {
"type": "text",
"analyzer":"ik_smart"
},
"typeId": {
"type": "long"
},
"images": {
"type": "text",
"index": false
},
"area": {
"type": "text",
"analyzer":"ik_smart"
},
"address": {
"type": "text"
},
"x": {
"type": "double"
},
"y": {
"type": "double"
},
"avgPrice": {
"type": "long"
},
"sold": {
"type": "integer"
},
"comments": {
"type": "integer"
},
"score": {
"type": "integer"
},
"openHours": {
"type": "text"
},
"createTime": {
"type": "date"
},
"updateTime": {
"type": "date"
},
"distance": {
"type": "double"
}
}
}
}
会议照片
二、PM报告
项目燃尽图
项目运行情况
用户端主页内容,搜索框的设计
博客页面