今日任务

中间五一节玩了几天,隔了很久才完成
今日内容
CreateFocusSession(创造专注记录)

写法模式和以前很像没什么多说的
专注时间设置最少1分钟最长4个小时
GetTodayFocus(获取今天的专注记录)
tagsummary对应这个表

stduysession是这个表


那么这个函数中,用s变量range每一条专注记录,把所有专注记录的时长s.duration累加到totalseconds
前面的tagmap是一个以tag名为下标,然后tag对应的tagsummary汇总表为值的哈希表
那么再把每个已有s的tag名的汇总表赋值给ts,如果tag名找得到就赋值ts不然就else新创建表
这个依然是同一个tag名的专注时间累加到ts.seconds,else新创建表同样的逻辑
最后bytag表计算percentage
时长大于0就可以计算占比,形成多个tagsummay列表
最终组装成bytag表在response中上传
GetFocusSummary(获取指定多少天的专注总览)


这里前面的历史总计没有时间限制,默认的查询所有记录,
后面的sql查询条件就较多了 这个select是需要查询的列有哪些,这里有day,totalseconds,sessioncount
相当于把上面这个三个列的头确定了
然后where就是限制条件查哪里的这里明确了查对应的用户id,然后AND date >= DATE_SUB(CURDATE(), INTERVAL ? DAY),这里"CURDATE()"代表今天的日期,"?"是占位符后面days会赋值,"interval ?day"相当于经过多少天的意思,
"DATE_SUB(CURDATE(), INTERVAL ? DAY)"意思就是今天之前"?"那天的日期(如果"?"的值为30,就是从今天往前数三十天那一天的时期),这里的意思就是查询的日期要大于那一天,
最终的意思就是查询前30天的记录 然后group("date")这里是以日期分组 DESC代表降序(从大到小)
Rows是gorm的方法,启动查询
单日的统计表

后续defer rows.Close代表当程序执行完后最后再关闭,延迟关闭。其实就是关闭数据库连接池中的一个链接,归还一个链接。

这里scan三个变量填入的是上面对应的select的三个数据,然后这里scan是在循环内的,说明每一行都需要填入。 rows.next相当循环变量,一旦下一行没有数据才终止,
然后这里再格式化处理一下数据,然后把每一行数据逐一装入定义好的dailystatitem表
最后再响应json数据
GetFocusHistory(获取以前具体某一天的专注记录详情)

这个也是都是常见的写法
先通过find自动把数据库对应数据映射到这个session表,然后后续通过循环sessions补充details表 最后响应返回details表
CreateTag(创造标签)

当err信息中有"Duplicate"或者"unique"时,表示重复或者不是唯一的意思,就是指tag名重复
GetTags(获取标签)

今日练习
模拟标签占比

SQL查询
