第02组 每周小结 (2/3)(组长)
第 02 组 每周小结 (2/3)
基本情况
冲刺情况汇报
过去一周完成了哪些任务?文字/口头描述
前端:
- 今日热门和推荐交换位置,优化用户体验
- 标签选择添加标签被打数量
- 地图样式修改
后端
-
相应服务层、持久层的单元测试
-
做 quartz 定时器任务,计算今日热门
-
添加 system/getInfo 的 tagNum,以帮助前端显示热门标签
展示 GitHub 当日代码/文档签入记录
前端
后端
做了哪些优化和迭代
前端
- 部分样式修改
- 标签选择添加标签被打数量
- 地图样式修改
后端
- 做 quartz 定时器任务,每日定时计算今日热门,用空间换时间,内存中先放好
通过自动化测试测出的 bug(如没有可不填)
解决了哪些 Bug,又是如何解决的(需要写详细)
前端
地图样式错误
image 组件设置 mode='widthFix'
import { Image, Text, View } from "@tarojs/components";
import * as React from "react";
import { AtFloatLayout } from "taro-ui";
import "./windowDesc.scss";
export default function WindowDesc(props: {
windowName: string;
pngSrc: string;
description: string;
mapSrc: string;
star: number;
canteenName: string;
}): JSX.Element {
const [open, setOpen] = React.useState<boolean>();
return (
<View className="window-desc">
<View className="window-desc-top">
<View className="window-desc-top-text">
<Text className="window-desc-title">{props.windowName}</Text>
<View className="window-desc-canteen-star">
<Text className="window-desc-canteen">{props.canteenName}</Text>
<Text className="window-desc-star">{props.star.toFixed(1)}分</Text>
</View>
</View>
<Image className="window-desc-top-image" src={props.pngSrc} />
</View>
<View className="window-desc-desc">{props.description}</View>
<View
className="window-desc-more"
onClick={() => {
setOpen(true);
}}
>
展开更多
</View>
<AtFloatLayout
title="详细信息"
isOpened={open}
onClose={() => {
setOpen(false);
}}
>
<View className="window-desc-map-title">描述</View>
<View className="window-desc-map-content">{props.description}</View>
<View className="window-desc-map-title">地图指引</View>
<Image
mode="widthFix"
src={props.mapSrc}
className="window-desc-map-image"
/>
</AtFloatLayout>
</View>
);
}
对应的样式文件再设置
.window-desc-map-image {
width: 100%;
}
即可按正常比例显示图片
后端
- spring 除了三个基本层之外的类,@Autowired 无法注入,疯狂空指针
这个注入的问题处理了很久,因为需要在 Job 的实现类中调用持久层方法,不得不注入相应持久层接口
解决的思路是:
在 Job 实现类中引入自身的一个静态类引用对象,强制其类加载,并实现在 servlet 初始化加载之前做一些初始化任务,如下:
@Component
public class PopularJob implements Job {
@Autowired
private WindowMapper windowMapper;
@Autowired
private DishTagMapper dishTagMapper;
@Autowired
private DishCommentMapper dishCommentMapper;
public static PopularJob popularJob;
private Recommend recommend;
private List<DishRecommend> dishRecommends;
@PostConstruct
public void init(){
popularJob = this;
popularJob.windowMapper = this.windowMapper;
popularJob.dishCommentMapper = this.dishCommentMapper;
popularJob.dishTagMapper = this.dishTagMapper;
popularJob.recommend = new Recommend();
popularJob.dishRecommends = new ArrayList<>();
}
// ...
}
最关键的是之后使用的 mapper 对象,一定要用这个静态类的,否则仍然是空指针!
比如获取窗口列表,要这样:
List<Window> windowList = popularJob.windowMapper.listWindows();
接下来的计划还剩下哪些任务?
前端
后端
-
自动化测试
-
推荐算法的优化
-
做食堂拥挤程度的可视化接口实现
-
做安全相关的事项
遇到了哪些困难?
目前最大的困难可能还是在后端,推荐的算法不好,IO 也处理的不是很好(热门可以提前计算,但是推荐需要根据用户状态实时计算),加之带宽也并不是很给力,就存在一些速度问题,导致用户体验不佳。
团队有哪些收获和疑问?
收获: 学会了优化用户体验的小技巧,以及学会了忙里学习新知识和改 bug
疑问: 自动化测试还是差点意思,项目真的不大,确实测不了太多内容
成果展示
展示组内最新成果
首页界面优化包括图标和打开速度
窗口优化及地图尺寸
标签的上标
展示本周自动化测试的结果
我们在后端成员编写了测试代码检测出来一些简单的逻辑错误现已解决,同时,通过自动化测试,我们确定了 quartz 定时器任务;首页预加载热门,给用户更加流畅的体验;在搜索上我们自动化测试出的结果显示我们的筛选功能已经趋近完善。利用暴力测试,我们解决了各个机型上的显示问题,特别是安卓手机的显示 bug。