个人项目的一些记录3 - 时间统计模块

105 阅读4分钟

全局

  • 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. 获取时间条目