全局
- 1. 把之前api中的userId参数放在路径中,方便进行token和userId匹配性的校验;
- 2. 把项目时区设置为UTC;参考资料:www.jianshu.com/p/504c17b35…
时间统计模块
条目分类
后端
-
1. 列出某用户所有项目分类;
-
2. 添加新的项目分类;(参数: name, color,userId)
-
3. 删除某个项目分类
-
4. 更新项目分类
-
5. 把projectCategory都改为TimeEntryCategory
-
5. 查出某个分类已统计的时间总和
-
这里我的思路是从time entry表中读取分类id和duration两列数据,返回给前端,前端遍历这个list,把里面的duration数据分别加到对应分类id上。
-
问题: 这里我需要用jpa查询部分字段,于是我在jpa中写了如下内容
@Modifying
@Query(value ="select category_id, duration from time_entry where user_id= :userId ", nativeQuery = true)
List<TimeEntry> findCatAndDurByUserId(String userId);
事实证明,这样是不行的,即使写了select category_id, duration,jpa还是会尝试为entity获取所有的列数据,所以它不会不断报错Column 'cxxx' not found.
解决: 参考这里解决问题
我使用了最高赞的方法。 (1)在timeentry的entity类中增加一个接口。
public interface ProjectCategoryIdAndDuration{
String getCategoryId();
Long getDuration();
}
(2)在接口中把返回类型改为这个接口类型
@Modifying
@Query(value ="select id, category_id, duration from time_entry where user_id= :userId ", nativeQuery = true)
List<TimeEntry.ProjectCategoryIdAndDuration> findCatAndDurByUserId(String userId);
- 6. 用户注册时给用户添加一个名为“默认分类”的时间条目分类
- 7. 把产生的默认分类id设置为当前用户id,方便使用
- 8. 删除分类增加判定: 如果为默认分类,则不可删除。
- 9. 更改获取分类为按创建时间升序排列,这样能保证默认分类会在第一行。
前端
- 1. 创建分类
-
- 解决问题: 数据库添加成功,前端却报404错误。-〉把controller的controller注解改为rest controller(11/19)
- 2. 显示分类
-
- 测试累计时间都为0的情况(从time entry表中读取分类id和duration两列数据为空)(11/19)
-
- 测试累计时间不为0的情况
-
- 加上当时间条目分类已被删除时的处理-> 如果时间条目分类id在category list中找不到对应的,就把对应的累计时间加到默认分类上。
- 3. 编辑分类
- 4. 删除分类
-
- 前端判定确保删除的不是默认分类
时间条目
后端
- 1. 新增时间条目
- 新增时间条目分为两种情况,第一种是手动添加,第二种是自动添加。手动添加时会把时间条目开始和结束时间都填上。而自动添加在开始时会先提交一条没有end的时间条目,等用户暂停该条时间条目后,会再向服务器发送该条目何时结束的信息。
后端add方法思路:
if isManual
// 再次校验结束时间是否大于开始时间,以及结束时间是否小于现在
check ifEndIsAfterStart
check ifEndIsBeforeNow
else
//非手动而是自动计时时,需要校验开始时间是否小于现在
check ifStartIsBeforeNow
if catId
check ifCatExists // 如果有填分类,那么先检查分类是否存在,不存在则抛出异常;
else
catId = defaultcatId //没有填分类的话,把分类指定为默认分类
createEntityAndSaveToDatabase // 手动添加的添加到time entry表中,而自动计时的添加到tmp表中,等结束计时后再挪回 time entry表。
中间的报错:
-
Ambiguous mapping. Cannot map 'timeEntryController' method解决: 在timeEntryController上添加了@RequestMapping -
2.删除某条目
-
3.结束某条目的计时
-
思路:1. 判断end有效性; 2. 根据id和userid到tmp中查找,如果无抛出异常; 3. 计算dur,把数据添加到entry表中。
-
4.读取用户当前正在计时的条目
-
5.更新时间条目
-
6.修改添加条目的api/
-
7.列出某时间段内的时间条目
-
- 理清思路
-
- 写controller和service
-
- 写时区时间的转化方法
前端
-
1. 手动添加条目
-
2. 自动添加条目
-
3. 读取正在计时的条目(:api参数是路径中的,但却忘记写全路径)
-
4. 测试停止计时(问题:测试后忘记删除tmp表中的条目)
-
5. 把计时框的出现变柔顺一点,加个过渡效果。
-
6. 获取时间条目