记录项目的文档,记录开发时的思路,方便查询。
CatTodo项目 03
编辑任务时新增子任务会有bug 没有效果
实现任务专注功能
我想要实现任务专注功能: 这个功能是这样子的,在首页侧边栏可以跳转到这个页面 需要选择一个任务然后选择专注模式 默认显示正计时 会本地存储上次使用的模式(正计时 倒计时 随机提示音 番茄钟) 开始专注
番茄钟和随机提示音后面再加入 番茄钟是这样的: 点击开始运行工作时长的倒计时 时间到了发起提醒 然后进入短时休息时长 短时结束后再继续运行工作时长 执行设置次数的工作时长后 进入长时间休息时长
正计时:不用设置什么东西 选择一个任务 点击开始即可计时 会一直计时 直到用户点击终止。
倒计时:设置一个时长 会有一个弹窗让设置常用的时长15分钟 30分钟 45分钟 1小时 1.5小时 2小时 2.5小时 3小时 和自定义时长 会记住上次使用的时长 点击开始进行倒计时 倒计时结束后会有提示音和震动(可以设置是否提示音和是否震动) 倒计时完成后自动暂停时长
番茄钟的设置是这样的:可以设置番茄工作时长 短时休息时长 长时休息时长 设置几次工作时长后长时间休息 设置是否自动开始工作 设置是否自动开始休息 可以设置提醒是否开启震动 是否长时间(2.5s)震动 完成时是否开启提示音
随机提示音是这样的: 每隔3-5分钟(时间是随机的)会出现随机提示音 然后开始10秒倒计时 此时用户听到提示音要自己休息十秒钟 10秒钟后再次出现提示音表示休息完成 然后用户再继续专注 一直这样子循环下去 直到专注持续了90分钟 出现另外一个提示音 表示休息 接着倒计时20分钟来休息 这个计时会一直这样子循环下去 直到用户终止
随机提示音的设置是这样的: 可以设置每隔多久到多久出现随机提示音 可以设置休息时长(不小于5秒 超过30秒) 可以设置专注时长(不小于半小时 不超过三小时)和长时间休息时长(不少于5分钟 不多于一小时) 可以设置是否开启震动 是否长时间休息提醒时开启长震动 可以设置不同的提示音
在选择任务后开始计时操作后 可以点击完成任务 会记录从点击开始计时到点击完成任务的时间 如果任务全都完成了 计时也会暂停 会暂停 但是不会终止 终止需要用户手动终止 退出当前页面也会继续计时 如果选择的任务带有子任务 则点击子任务也会记录下来计时信息 例如: 我选择了带有3个子任务的主任务来进行专注 界面上就会显示出主任务和这三个任务的标题和描述 在计时开始后 我点击某个子任务就会完成这个子任务 并且记录我完成这个任务的时长作为这个任务的专注时长 然后我再继续点下一个子任务 就会记录上一个完成到这一个子任务完成的时长作为这个任务的专注时长 我完成主任务会记录我上一次完成到这次主任务完成的时长作为这个任务的专注时长(主任务完成后所有子任务会自动完成)
我完成任务后(没完成也可以切换)可以切换任务 此时我再点击完成 会记录我切换这个任务到我点击完成的这个时长作为这个任务的专注时长 某次计时结束(用户终止计时 或者倒计时结束 番茄钟完成一个工作时长 随机提示音进入长时间休息时) 或者任务完成 都会记录专注时长 如果没有完成任务 且计时没有结束 就不用记录
目前我只需要实现正计时和倒计时 另外两个不用实现 但是后续会加进去
我需要一个专注表 用于记录专注的数据 数据主要用来统计页面里面看专注某个任务的时长 或者单纯的专注时长(如果没选择任务) 不选择任务也可以开始计时操作 此时记录只会记录专注了 不会记录任务
然后我需要新增一个页面 有计时器 可以选择正计时 倒计时 可以选择任务开始专注 选择任务实例后会显示在页面上 可以点击完成 也可以点击撤回
这个专注表只用于显示统计表格和统计数据
请先帮我整理一下我上面的需求和方案 让别人能更容易看懂
项目当前逻辑:
请分别帮我梳理一下 下面这些内容 并保存到CLAUDE.md中
- 当前这个项目的任务母版创建逻辑
- 任务母版生成任务实例逻辑
- 任务实例完成逻辑
- 任务实例撤销逻辑
- 前端调用同步接口逻辑
- 后端同步接口逻辑
- 前端https_utils运行逻辑
请创建TODO 然后一步步进行梳理
修复token自动刷新不了的问题
目前access token过期后并没有成功的自动刷新
并且 会显示401错误 和一个很长的dio报错 就算token过期也不应该在前端有显示出原始的报错
请再检查一下为什么会错误并进行修复
实现任务的提醒功能
我的任务重复规则十分复杂 如果我要实现任务的提醒功能应该怎么实现? (注:请查看我的项目如何实现的任务母版和如何生成任务实例)
实现方案: 提前生成7天的所有任务实例 生成任务实例时根据规则创建提醒 删除任务母版时也会删除他们 因为页面上只显示当天的任务 所以他们不会影响功能
实现任务经济奖励和自定义商店系统
需要多一个表 用来存储任务奖励
需要一个表用于存储 商店商品
两个数据都需要同步到服务器
我需要用户可以自定义商店物品 商店物品有价格 描述 图标 和类型 类型有:(目前只需要实现使用物这一个 其他的先不实现 但是要保证目前的设计 另外的后续实现起来不会太难)
- 宝箱 打开后里面可以获得多个物品
- 使用物:可以使用 会有效果 可以是增加用户经验 增加金币 或者单纯的一个使用动画 效果由现实中用户自己决定(比如奶茶券 使用后去买一杯奶茶) 或者调出专注倒计时来倒计时一段时间代表某种时长(倒计时先不实现 但是要后续能实现)
- 纪念品:可以保留着或者出售(类似抽卡一样 会出现各种好看的物品和卡片 带有等级 可以把低级的出售和合成)
当前用户模型并没有设置经验值和等级这种字段 也没有金币字段
任务没有奖励id字段 并且也没有创建任务奖励表和商品表
我想实现任务可以设置奖励 这个奖励可以是金币或者经验或者物品
然后用户可以靠自己完成任务得到的奖励去购买商店物品 并使用
接下来请帮我整理一下上面的需求 记得选择只需要实现最简单的任务可以设置金币经验和自定义物品 并且设置金币经验值可以给一个拖动条快捷设置(这个条代表难度与重要性 拉得越高给的经验值和金币越多 按一定的曲线增加) 以及商店可以自定义物品的价格 图标和使用效果即可(目前只需要使用物并且不需要实现倒计时功能)
实现团队功能
团队功能是这样子的:
首先团队相关的一切东西都需要联网才允许使用,因此我想的是团队相关的任务和内容不需要考虑本地优先 直接存储在服务器中 使用到再从服务器里获取。 因此 进入团队页面应该检查是否登录 未登录应该显示内容提醒用户去登录 接着 用户登录后可以在这里输入团队编码来加入团队 或者自己创建团队 创建后团队会有一个编码 可以复制发给别人用于加入 加入团队需要团队创建者(创建人也是管理员)或者团队管理员同意(后端我想使用消息队列)
团队有团队的头像和名称 还有团队的描述
在团队界面这里不会显示所有的团队 而是选中一个团队
在团队这个界面 会显示这个团队的一个项目(可以切换到其他项目) 以及这个项目的清单和对应清单的任务(这里的默认清单同样是默认的uuid 但是不用关联用户id 直接关联项目id)
管理员和团队创建者可以负责创建任务和编辑任务 以及分配任务给某人(分配给谁 这个任务的id就关联谁 需要改前端同步的东西 把有项目id的任务都不进行同步)
不分配的话 这个任务就默认每个人都可以实现 谁实现就标记谁的id 只有可以实现这个任务的人才可以撤销这个任务
管理员可以实现所有任务 但是如果这个任务已经有分配的人了 完成的人也还是这个被分配了任务的人 完成会标记这个任务是谁完成的
因此管理员也可以撤销任务的完成
管理员和创建者可以分配权限(团队的权限只有三种 一种是正常成员权限 只能完成分配给自己的任务和未分配的任务 以及撤销自己可以撤销的任务 一种是管理任务的管理员A 一种是管理成员的管理员B 创建者也是管理成员的管理员(并且可以分配权限 也可以管理任务) B有A的全部权限
创建者可以转让团队给团队里的另外一个人
创建团队任务可以手动创建 同样可以配置重复规则 开始时间 配置提醒 配置清单(项目的清单)
但是创建团队任务之类的是由需要发请求让后端进行创建的
之后会加入ai功能 可以让ai帮忙创建和分配(需要预留前端样式给个位置 后续实现)
项目可以被创建者设置状态为归档
数据库设计
团队表 项目表 团队成员表->用于关联用户和团队
实现逻辑
一个团队里可以有多个用户 用团队成员表来关联
一个团队里可以有多个项目 每个项目只有一个团队
团队成员可以查看团队里的项目 每个项目可以有多个清单用于分类任务(不关联用户 只关联项目) 团队任务的完成和创建和分配都需要联网处理
实现ai生成目标功能
接下来我说一下我想实现的ai功能和目标功能
后端使用langChain4j!!
生成任务时使用的任务表仍然是task_masters 和 task_instances这两个 统一数据 本地的同步会更好实现。
AI有功能有下面这几个:
- ai会自动检查用户提供的信息是否违法 过于敏感 或者有问题 如果有问题结束对话并返回文本提醒用户发送的内容有问题。
- 生成用户个人的任务(根据用户的要求)
- 生成团队任务(只能由有权限生成团队任务的团队成员来使用)
- 生成用户个人目标
需要一个与ai对话的界面,在这个界面中可以选择生成目标 AI功能必须联网才可以使用 但是目标界面不联网也可以进入
用户和ai对话创建编辑删除个人任务
注意 用户发送的东西违规的话会直接打回
首先是生成用户个人的任务,用户可以跟ai说自己想创建大概什么样的任务 然后ai会分析后生成对应的任务。 界面显示和逻辑上是这样子的:
用户在ai对话界面发送自己需要ai帮忙生成的任务,例如: 用户:帮我创建一下健身的任务,我是这样子健身的 练胸 练背 然后休息一天 练肩膀和腿 接着休息两天 然后再练胸这样子循环下去,假设今天是练背后的休息日。 ai:(分析需求后 知道要创建三个任务 假设今日是练背后的休息日(如果没给ai可以直接默认今天是练胸日 让ai自己决定)) 接着生成三个任务 并显示给用户看 问用户是否确认创建,用户点击确认就进行创建。生成时ai还会设置任务难度。
用户让ai编辑自己的任务: 我的想法是 只保留任务的标题数据 然后加上用户的描述信息来确认具体是什么任务 接着根据用户的要求修改任务并询问是否确认修改。 例子如下: 用户:帮我把健身相关任务往前推迟一天(接着把所有任务标题整理后上传) ai:(读取用户的聊天和所有任务的标题和任务id,确认用户说的是哪几个任务,如果没有找到合适的对应的任务 就直接返回消息让告诉用户描述清晰一些 用户再次发送更详细的描述 会携带前面的对话上下文)找到具体任务后,ai根据需求对任务进行修改,然后发送给用户 对话界面会显示对任务进行了什么修改,问用户是否确认修改。
用户让ai删除任务: 类似上面一样,根据标题和用户对话匹配说的任务是哪些,然后询问用户是否确认删除。
生成时ai还会设置任务难度
要有限制 一次性不让生成过多的任务 防止传输数据过大
团队管理员(有创建任务权限的成员)和ai对话来创建任务、编辑任务和分配任务
注意 用户发送的东西违规的话会直接打回
同样是在ai界面里 团队管理员可以在对话框上方点击项目按钮来选择自己要生成任务的项目(手动选择 没登录不显示 登录了点击后会显示自己有权限的项目 如果没有的话就提示没有 )
选择对应的项目后,可以用自然语言让ai执行类似上面 用户和ai对话创建编辑删除个人任务 的功能 但是有限制 目前团队功能里没实现的都不让搞 比如 创建重复任务 创建多次任务 设置开始时间 期限时间 提醒时间等之类的都不让搞(但是之后如果实现了还是要加上)
同样的 在所有的对任务的实际操作之前都需要用户确认
要有限制 一次性不让生成过多的任务 防止传输数据过大
用户通过ai创建目标
注意 用户发送的东西违规的话会直接打回
目标功能和ai功能强相关 目标生成和目标调整都必须通过ai来调整
目标功能我的设想是这样的: 用户在ai界面的对话框上面选择目标生成功能(注意 只能和项目功能选中其中一个)
目标功能是这样的 用户提供一个想要完成的目标 比如: 用户:我想通过英语四级考试 这里如果发现这个目标就是不可实现 则直接返回信息告诉用户这个目标不可实现 请更换一个
ai根据这个目标 首先判断属于什么类型的目标 不同类型的目标有不同的提示词 根据提示词来思考信息量是否充足
我想的是分为以下这几种目标:
- 习惯养成目标:建立日常重复性行为,如早起、阅读。
- 项目达成目标:完成有明确成果的项目,如写书、开发软件。
- 技能学习目标:掌握新知识或技能,如学语言、编程。
- 健康改善目标:改善身体健康或心理健康,如减肥、缓解焦虑。
- 财务积累目标:管理或增加财富,如储蓄、投资。
- 人际关系目标:建立或改善人际关系,如拓展社交、修复关系。
- 体验享受目标:安排某种体验或享受,如旅行、尝试新活动。
- 综合平衡目标:平衡多个生活方面,如工作与生活平衡。
分析信息量是否足够
像上面这个 Ai首先会判断信息量不足 然后重新去询问用户一些信息 这些信息需要给出选项或者给出数值 然后返回表单给用户 比如这个例子 ai返回对应需要的数据和格式 然后会在前端对话中会显示一个表单 询问 (注意 这里最好是都限制住 除了其他补充信息以外 最好是限制用户的选择范围 这样用户好理解 而且也得到的信息也更准确合理 ): 考试的时间->前端显示一个时间选择器(并且会把用户设备的当前时间一起传过去) 英语四级考试的单词词汇量->一个滑条 可以选择从多少到多少的数值,然后显示对应的提示信息: (0表示完全 10表示完全) 每天学习多久->同样显示滑块 (0->24小时) 提示信息:0表示不到一小时 英语听力水平->给一个选择题(可以生成是或多选的题目) 比如问题是 英语听力水平的程度如何 A.完全听不懂 B.能听懂小学难度的英文 C.xxxxx以此类推的多个选项 … 目标的预期->给一个滑块 从0->710 (提示信息:想考的分数(及格是430)) 希望何时开始->给选项 选项是时间 比如现在 这个月内之类的 其他补充信息->给个多行文本框 用户自行填写
分析数据然后再次确认是否可以实现目标
分析数据确认目标是否可以实现 不可实现的情况比如说:
- 不现实(一天时间零基础学会英文之类的不可能的事情) 或者 一天只有半小时学习时间 然后只剩一两天了 基础差 想考高分
- 用户给的数据不合理 有一些数据太离谱或者不现实 或者有冲突
- 其他各种不能实现的情况
如果无法实现 提供不能实现原因并返回给用户,并建议用户修改提供的数据或者修改目标。
确认目标合理 并且可以生成目标 进入下一步
分解目标
将目标分解为多个分类和多个小目标(到时候每个小目标都会生成多个任务) 然后给出预计完成日期 分解出来这些小目标后先给用户显示出来 让用户确认是否继续生成详情任务(提醒用户 本次点击确认后将生成完整任务) 如果用户不满意可以选择调整按钮 然后发送信息(比如说点击调整后 输入重新尝试生成一份 就会直接重新生成一份 如果输入希望听力方面的任务减少一些 就会加入这个需求重新生成)
生成完整任务:
在用户确认后 开始根据信息和拆分的小目标进行生成:
对于每个小目标 ai将提供信息然后 分别发送一次请求去进行小目标的任务的生成 ai根据信息生成对应的格式的任务(ai能生成带重复规则的任务 生成有前置条件的任务 生成的任务一般有顺序 可以设置各种正常创建任务可以设置的东西 不能设置提醒时间)
最后将生成得到的数据组合到一起 发送给用户端 如果有联网并打开了ai界面 就会接收到这个数据 接受到之后就直接存本地了 之后同步逻辑类似个人任务的本地优先同步
用户端可以在对话界面选择确认添加这个目标(不添加看不到具体内容)
用户可以在目标界面删除目标 但是不能手动修改目标的具体任务 想要修改必须借助ai实现
对话将保存在本地
用户通过ai修改目标:
必须通过ai才能修改!
可以在对话界面选择对应的目标 然后发送信息给ai来进行目标的修改 会将整个完整有用的目标相关的id都上传至服务器 然后还有用户的修改要求上传至服务器 然后服务器根据id去查询对应的任务是什么 方便给ai使用
ai根据查询生成编辑的格式 然后用户就可以在界面上看到修改情况 然后确认是否修改。
缺少内容:
- ai_context不用传给前端 因为数据应该很多 存在后端即可
- 目标和子目标也需要本地优先的同步策略
- 排序均使用字符串(采用字典序分数索引 项目里其他东西的排序也是这样子的)
- 生成的任务具体可以设置一下内容:
- 开始日期 start_date
- 期限日期 due_date(期限过了并不会怎么样 只是显示红色的期限日期出来)
- 重复到什么时候截止:repeat_until
- 完成几次任务结束:total_cycles(任务循环多少次就不再重复)
- 前置任务id列表:predecessor_ids
- 量化权重 百分比表示任务占用父任务进度的多少 按比例计算 quantitative_weight
- 可以实现任务关联(就是父任务子任务)
- 循环规则:rrule
- 所属清单:list_id(这里是ai可以创建多个清单用于分类 然后给任务关联清单)
- 排序字段:sort_order
- 优先级:priority(1-4)
- 难度:difficulty(1-10) 注意 不可以设置提醒规则!
接着是界面相关:
首先进入目标界面 右下角还是符合md3规范的一个悬浮按钮 点击会直接进入ai对话界面 ai对话界面右上角有个列表按钮点击可以选择对话或者新建新对话 这些对话都是存在本地里 如果后端需要用到 比如说生成目标时 连续对话 会将本地生成的对话的uuid和用户id 生成完成时 用户进入界面获取到东西就需要根据后端这个来查找 如果用户点生成目标 结果在拿到数据前就删除了对话 则数据也会被删除(本地会发送请求获取服务器存储中的数据 如果发现这边匹配不到 就会让服务器那边的也删掉 进行中的任务也直接终止)
ai对话界面是 下面一个文本输入框 然后和ai的对话消息以左右对话框的样式显示 文本输入框上面可以选择这次想调用的功能是:
- 不选择 就是生成或者修改或者删除个人的任务
- 选择某个团队项目 就是生成或者管理团队的任务
- 选择生成目标 就是调用目标生成功能
目标界面是 上面有一个横向滚动区域(但是是类似那种轮播图一样的 然后可以左滑右滑选择目标 是无限循环的) 然后每一块显示目标的标题 目标的描述信息 目标的完成进度
接着下方的内容就是一个个的小目标信息 小目标的信息也要显示标题和进度 然后小目标区域内有多个任务 这里的任务可能会有子任务(最多两层嵌套 就是子任务不能再有子任务了) 然后主任务如果有子任务 会显示完成进度条和完成了百分之多少
用户可以在这个界面点击完成任务和点击撤销任务完成 小目标完成依赖于是否它里面的任务都完成了
界面要都使用md3规范 用到的颜色都要主题色相关
实现数据统计功能
数据统计功能放在首页的侧边栏
界面要符合md3规范,布局之类的请根据需要显示的内容进行设计
在这里会显示
- 选择统计的时间(设置选择本日 本周 本月 今年的统计信息)
- 任务的统计
- 任务完成数
- 平均每天任务的完成数
- 完成任务列表
- 期限任务完成率(带有期限任务完成时间是否超过期限)
- 专注的统计
- 显示总专注时长
- 平均每天专注时长
- 分别列出对xx任务的专注时长(读取专注记录表的值用于统计)
- 完成xx任务的耗时(读取专注记录表的值用于统计)
- 金币的统计
- 获得的金币
- 消耗的金币
- 平均每天获得的金币
- 有个折线图显示获得和失去的金币
- 显示用金币购买和使用了什么东西
- 经验值的统计
- 获得的经验值
- 等级的变化
如果需要新增数据表和统计内容的代码 请进行新增
- 完成任务列表(不显示目标任务相关的东西)
- xx任务的专注时长列表
- 现在已有的目标进度和目标任务的完成列表(只显示已完成)
修改个人中心界面
新增设置页面 把目前的各种设置移到设置界面里
个人界面 加上显示当前的金币和经验值和等级
然后下面显示一些常用的设置的导航
- 编辑资料功能(跳转到设置界面的编辑资料部分 可以设置名称 上传头像 绑定手机号 绑定手机号的功能先不实现)
- 通用设置(跳转到设置界面的通用设置部分 设置主题模式 配色方案 动态配色开关 字体大小 语言)
- 提醒设置(跳转到设置界面的提醒设置 可以设置任务完成是否开启提示音 是否开启震动)
- 数据与同步(可以跳转到设置界面的数据与同步位置 可以设置是否开启数据同步 还有导出和导入数据 还有清除本地缓存 但是实际功能先不实现 只是有界面就行)
- 桌面小组件设置(可以跳转到设置界面的桌面小组件相关设置)
- 帮助与支持(点击再跳转到设置界面常见问题 关于我们 版本信息)
- 退出登录
实现桌面小组件功能
实现简单的桌面小组件功能 兼容安卓和ios
直接显示个人当天任务 可以选择清单(或者选择全部) 右上角可以点击刷新 可以点击新增任务(如果不好实现就不实现 如果能直接用首页添加任务的逻辑就实现一下) 可以点击设置不透明度和字号 然后还有选择是否显示任务详细信息
可以在桌面点击完成 可以在桌面点击已完成任务撤回
界面参考todo软件的桌面小组件界面
接着添加和桌面小组件相关的设置在设置页面中
优化团队功能 然后实现短信提醒功能
实现团队功能设置任务时对任务的这些字段的设置
- 设置开始时间:任务在开始时间之前 也可以看到这个任务 但是不能点击完成 然后可以类似已完成一样显示一个可以收起的地方
- 设置期限时间:任务如果有期限时间 会在任务的下方显示一个日期 类似首页那样子 如果超过期限 日期会变红色
Ai生成团队任务的时候也加上可以设置开始时间和期限时间 同样由ai根据提示词和用户传过来的当前时间来决定
新增短信提醒功能: 为我的后端项目添加发送短信的功能 然后完成用户绑定手机号的功能 同样是发送验证码 验证码存在redis中 类似注册功能 这个短信提醒功能只用在团队任务中 在团队任务中 团队的管理员(有创建和分配任务的权限的成员) 可以设置具体的一个任务的提醒(左滑任务 点击提醒按钮 可以设置提醒 在日期中选择具体的时间和提醒的成员 和设置少量的提醒文本(这里会显示这个成员是否绑定了手机号 如果没绑定就不能提醒) 接着会新增一条数据到后端 后端在指定时间调用接口发送短信去提醒(提醒某些成员完成某个任务)
需要新增数据库表
其他优化和修bug
侧边栏去掉debug的调试功能 侧边栏上方显示用户的头像和用户名 如果未登录就显示未登录和默认头像 点击跳转登录界面 下方显示当前金币 经验值和等级 接着显示功能: 专注模式->跳转专注页面 Ai对话->跳转ai对话界面->处于个人任务选项 统计数据->跳转统计页面 夜间模式->快捷修改成夜间或日间 设置->跳转设置页面 关于->显示相关信息 历史记录->跳转历史记录界面 这里可以根据日期显示某一天的全部的已完成和被删除的任务 可以在这里撤销删除和撤销完成
我发现目前的方案(传递所有主任务的id和标题) 会导致后端识别不到子任务
所以无法对子任务进行操作
数据统计同步功能需要额外添加:
- 后端 SyncRequestDTO/SyncResponseDTO 添加
coinRecords、expRecords 字段 - 后端 SyncService 添加同步处理逻辑
- 前端 sync_models.dart 添加 CoinRecordSyncDTO、ExpRecordSyncDTO
- 前端 SyncService 添加收集和处理逻辑