diff --git a/.gitignore b/.gitignore index f8925ec..2d2c323 100644 --- a/.gitignore +++ b/.gitignore @@ -61,4 +61,7 @@ ios **/_tests # 统计行插件自己生成的文件夹 -.VSCodeCounter \ No newline at end of file +.VSCodeCounter + +# 旧的说明文件,当成开发记录 +**/_old_readme/* diff --git a/README.md b/README.md index b84a43f..011b356 100644 --- a/README.md +++ b/README.md @@ -1,147 +1,232 @@ # 说明 -Free Fitness,一个使用 flutter 开发的、包含运动健身训练和日常饮食记录的 app。 +Free-Fitness 是使用 flutter 开发的集运动跟练、饮食记录、日记编写等功能为一体的健身饮食管理 app。 -## 功能列表(todo) +此 app 适合运动健身、减肥增肌、随手记录等需求的人员。数据全部在本地,无需联网,且自定性比较灵活。 -unclear +## 功能说明 -## 开发进度 +最普遍对于保持健康身体的要求来说,是合理的饮食与锻炼。主要功能如下: -2023-10-12 +![主页面截图](_screenshots/1主页面截图.jpg) -- 初始步骤,完成大体的页面功能的布局框架和项目文件夹结构。 +### 运动模块 -2023-10-14 +对于“运动”,本应的**运动模块**主要提供以下功能: -在使用 file_picker 的时候有卡住,看 flutter run -v 之后,看到是在 +- **动作数据管理** -``` -C:\Users\swmlee\AppData\Local\Pub\Cache\hosted\pub.flutter-io.cn\flutter_plugin_android_lifecycle-2.0.16\android\build.gradle -``` +用户可以自己表单添加、或者按照指定 json 格式批量导入基础的运动动作,然后以此来制作训练组。比如添加了**动作**:坐姿举腿、卷腹、仰卧蹬车、坐姿转体,然后就创建一个“腹肌锻炼”的**训练**,添加这些动作,每个持续 30 秒,重复 5 组。如果动作足够多,训练足够多,甚至可以列一个**训练计划**:比如第一天“腹肌训练”,第二天“腿部训练”,第三天“胸部训练”…… -中的 +》 **动作模块基本功** -``` -buildscript { - repositories { - google() - mavenCentral() - } - - dependencies { - classpath 'com.android.tools.build:gradle:7.2.1' - } -} - -rootProject.allprojects { - repositories { - google() - mavenCentral() - } -} -``` +列表中向左滑进行删除。 -所以同样和项目中的`android\build.gradle`改为国内镜像即可 +可以直接导入指定格式的 json 文件(下详)或者表单新增动作,数量较少时表格展示;当然可以随时点击查看详情或者修改动作信息。 -``` -repositories { - // google() - // mavenCentral() - maven { - url 'https://maven.aliyun.com/repository/public/' - } - maven { - url 'https://maven.aliyun.com/repository/central/' - } - maven { - url 'https://maven.aliyun.com/repository/google/' - } - maven { - url 'https://maven.aliyun.com/repository/gradle-plugin/' - } - } -``` +![2动作模块基本功能](_screenshots/2动作模块基本功能.jpg) + +》 **训练模块基本功能** + +训练列表和计划列表是长按删除。 + +新增一个训练之后,需要添加指定动作并进行配置,根据动作是计时或者计次显示时间或者次数,有器械负重也可能添加。 + +在修改训练中的动作时,长按可以拖拽排序,删除按钮可以移除条目,点击条目可以修改持续时间/次数和负重配置。 + +![3训练模块基本功能](_screenshots/3训练模块基本功能.jpg) + +》 **计划模块基本功能** + +计划模块和训练基本类似,也是创建好计划的基本信息之后,添加已经存在的训练。 + +一个计划就是一组训练,一个训练就是一组动作。 + +![4计划模块基本功能](_screenshots/4计划模块基本功能.jpg) + +》 **跟练训练的页面** + +在选择某个指定训练或者计划的某一个训练日之后,点击开始可以进行跟练,有简单的 TTS 语音提示。 + +倒计时的时间,就是配置时设定的动作时间,其中动作是计时的,则是直接设定的时间;如果动作是计次的,倒计时是`次数 * 完成一个标准动作的耗时`。 + +跟练过程中可以跳过、重复等操作,完成之后还可以重新再来。 + +每完成一次都有训练报告。 + +![5跟练训练的页面](_screenshots/5跟练训练的页面.jpg) + +》 **运动报告页面** + +运动报告统计每次训练跟练的名称、持续时间等信息。还可以按需要导出为 pdf 文件。 -2023-10-15 进度 +![6运动报告页面](_screenshots/6运动报告页面.jpg) -完成都是初稿,知道功能怎么做而已: -暂时完成“基础活动”的创建,已经“动作库”主页的基本信息卡片显示 -暂时完成 card 右滑可删除(删除的逻辑细节没做,比如只有创建者才能删除,这个可以在控制是否可以删,不用等滑动时才判断) +### 饮食模块 -明天预计: -基础活动的条件查询,每次显示 10 条,滚动加载更多 -点击 card 跳转的详情页面 +对于“运动”,本应的**饮食模块**主要提供以下功能: -2023-10-16 进度 +》 **食物成分模块** -exercise 基础数据库新增标准动作耗时栏位 standard_duration,并修改相关逻辑。 +食物成分的列表展示是食物名称信息,但食物的单份营养素可以不一样。比如一个单份是 100g 是 200 大卡,还有一个单份是 1 只 200 大卡。有多个单份营养素信息时,表格更直观。 -2023-10-18 进度 +食物成分主要是添加一些食物营养素信息,可以按照指定格式 json(下详)导入或者表单新增。 -exercise 的条件查询表单雏形有了 +![7食物模块页面](_screenshots/7食物模块页面.jpg) -明天要做: +对于食物的详情页面,可以对该食物进行修改,对单份营养素进行修改。 -- done 2023-10-21 exercise 页面条件查询可以分页,上拉加载新一页。 -- done 2023-10-19 查询条件重置,如果还显示的“更少”,重置的时候在“更多”时选择的条件还会保留住。 - - X 方案:重置时先把查询条件还原到最小的样子,此时因为高级查询表单栏位没绘制,已经时默认值了,所以重置时也不需要重置高级选项. - - 不行,折叠之后高级查询没有渲染,但值还在,重置 reset'didChange(null)都没用... -- done 2023-10-18 要显示总数量 -- done 2023-10-18 许多 setState 中的查询,没有带上查询条件,如果用户有传,则需要带上,初始化时默认可以没有。 -- done 2023-10-21 卡片详情页。 +目前导入食物没有导入图片的逻辑,所以食物的图片可以在此处修改。 -showModalBottomSheet()的默认高度上限是 9/16,需要设置设置滚动控制为 true`isScrollControlled: true,`才能自定义更高。 +![8食物详情页面](_screenshots/8食物详情页面.jpg) -参看:https://blog.csdn.net/qq_42351033/article/details/125180767 +》 **饮食记录基本功能** -2023-10-19 进度 +饮食记录是比较核心的功能,用于记录一日三餐再额外一个小食(其他零食、夜宵之类的可以放在这里)共四餐的摄入信息。 -修复:exercise query 组件因为 expended 和 SingleChildScrollView 层级关系不对导致的布局错误 -简单调整 exercise 查询表单的按钮布局(折叠后重置高级选项选中的值目前没法做到) +选择指定的食物,输入摄入量,如果有对应的食物营养素信息,就可以大概了解今天整体的能量摄入,更好地管理饮食。 -明日注意,exercise 的查询和新增的 db 操作都有问题,模糊查询不对、分页查询没做,新增肌肉数据格式不对,没有分隔符。 +每餐都可以上传照片,记录一下当日当餐吃了哪些东西,后续也可以在餐食相册中统一查看。 -2023-10-19 +![9饮食记录基本功能](_screenshots/9饮食记录基本功能.jpg) -完成 饮食模块主要布局的修改 -完成 饮食模块相关的数据库创建和常规的 sql 语句,对应的类等。 -完成 食物列表显示、详情页、新增页的示例。 +》 **餐食相册页面** -2023-10-22 +可以几种浏览保存的餐次图片。 -注意:pubspec.yaml 在配置 assets 路径时,没有办法统配文件夹,每个子文件夹都得加一个配置: -https://flutter.cn/docs/development/ui/assets-and-images#specifying-assets +目前保存图片是上传的,后续会增加直接拍照的方式。 -完成 exercise 详情弹窗的基本结构和内容 +![10餐食相册页面](_screenshots/10餐食相册页面.jpg) -待完成: +》 **饮食报告页面** -(done 2023-10-23) exercise 详情弹窗中,点击图片后,再弹出一个放大图片看细节。 +除了每日饮食记录页面下方的单日统计,还有集中的饮食摄入统计,可以查看最多最近两周的饮食摄入,比如摄入食物的种类次数和摄入量,主要营养素的量等等。 -exercise 详情页内容可以更丰富一点,毕竟很多栏位都没显示出来。 +当然也可以指定范围将报告导出为 pdf 文件。 -- (done 2023-10-23) 或者显示一个【更多信息】按钮,跳转的一个新页面,在新页面还可以加【修改】按钮,也没有篇幅限制。 +![11饮食报告页面](_screenshots/11饮食报告页面.jpg) + +### 手记模块 + +手记(日记)模块一开始是为了方便快速记录而额外添加的。比如我今天跑步 10 公里,吃了烤鸡烤鸭,但我不想看 app 自带的报告,我自己简单记录一下就好。 + +手记提供富文本编辑器,自己随意添加任何信息,支持添加图片等。 + +![12手记页面](_screenshots/12手记页面.jpg) + +### 用户与设置 + +主要就是一些用户信息管理,体重记录管理,每日摄入目标,全量备份和恢复,切换语言和主题之类的。 + +其中全量备份是把内嵌数据库的数据全部导出为 json 文件后构建一个 zip 压缩包,后续其实不一定是真的 app 备份的 zip 文件,只要格式一致,自行压缩的 zip 文件也可以恢复。 + +英文和深色主题并没有完全适配,可以有些差异。 + +![用户与设置](_screenshots/13用户与设置.jpg) + +## 使用说明 + +### 少量权限 + +app 无需联网,但是为了导出 pdf 和备份恢复,会请求存储访问权限,不授予也没关系,只是该功能不可使用,不影响其他功能。 + +### 敏感信息 + +app 都无需联网,所有的数据都在本地缓存、内嵌的 sqlfite 中,就算添加网络图片地址都不一定能打开(代码中全是`File(path)`)。 + +### 数据格式 + +关于运动模块最重要的“**动作**”数据,可以参看 github 的这个仓库[yuhonas/free-exercise-db](https://github.com/yuhonas/free-exercise-db),完全兼容。 + +但为了方便,可以额外增加两个栏位:为了区分计时或者计数的`counting_mode`(timed 或者 counted),和计次时完成一个标准动作需要的耗时`standard_duration`。 + +如果没有的话默认为 `timed`计时和 `1` 秒。 + +```json +[ + { + "id": "Alternate_Incline_Dumbbell_Curl", + "name": "Alternate Incline Dumbbell Curl", + "force": "pull", + "level": "beginner", + "mechanic": "isolation", + "equipment": "dumbbell", + "primaryMuscles": ["biceps"], + "secondaryMuscles": ["forearms"], + "instructions": [ + "Sit down on an incline bench with a dumbbell in each hand being held at arms length. Tip: Keep the elbows close to the torso.This will be your starting position." + ], + "category": "strength", + "images": [ + "Alternate_Incline_Dumbbell_Curl/0.jpg", + "Alternate_Incline_Dumbbell_Curl/1.jpg" + ], + "counting_mode": "counted", + "standard_duration": "2" + } + //... +] +``` + +注意,这里运动动作的图片可以是多张,然后这里的地址是图片文件夹相对路径。 + +所以上传时要选中这 `images` 栏位中相对路径的图片文件夹(即地址公共前缀),上传时才会将两者的地址何必到一起,否则会直接存入这个相对路径的地址,就看不到图片了。 + +--- + +关于饮食模块最重要的“**食物成分**”数据,目前我没有去找对应的仓库,而是将 pdf 版本的[《中国食物成分表标准版(第 6 版)》](https://www.pumpedu.com/home-shop/5514.html) 中“能量和食物一般营养成分”部分进行截图,并通过飞桨 OCR 转为 exel 文件,并进一步构建成指定格式的 json 文件。测试数据也放在了 github 中 [Sanotsu/china-food-composition-data](https://github.com/Sanotsu/china-food-composition-data)。 + +但实际的 json 格式不必要这么多栏位,简单满足以下即可,多的用不到: + +**(当然,会被默认当成 100g 可食用部分的营养素信息)** + +```json +[ + { + "foodCode": "大润发牌", + "foodName": "鸡 (代表值)", + "water": "70.5", + "energyKCal": "145", + "energyKJ": "608", + "protein": "20.3", + "fat": "6.7", + "CHO": "0.9", + "dietaryFiber": "0.0", + "cholesterol": "106", + "Na": "62.8", + "tags": "肉", + "category": "荤", + "photos": [ + "<设备中的完整路径>/0.jpg", + "<设备中的完整路径,暂时不用传>/0.jpg" + ] + } + // ... +] +``` -考虑是不是有个批量导入预设动作列表的功能,例如预设好 json 或者 excel 表格,除了图片批量导入。及时有图片,网络图片可以直接加载,**本地图片这里再解析去找然后放到缓存文件夹?**--这个比较麻烦。 +基础的动作和食物成分 json 也可以单条数据的 json 文件,代码中发现不是`[]`包裹的数据会自动加上。 -在 exercise 详情弹窗,添加【修改】按钮,点击跳转到修改页面,修改完成返回的主页面。 +当然格式不对或者数据重复就无法导出了。一般就是动作或者食物的名称重复之类的。 -- 这其实有两个问题:1 是没有其他地方可以用来触发修改了,因为 list 中使用了 Dismissible 去包裹它。 -- 2 是修改完如果只返回修改后的那一条(查询 exercise_id),重新查询时候条件不好重置. - - 修改完也不可能返回到之前的详情弹窗取,因为还是需要重新查询,而查询不在详情页中。 -- 这个和新增应该是同一个表单,新增完成返回 list 同样没有定位到新增的那一条。 +## 其他说明 -2023-10-23 +### 仅 Android -完成:基本的在 exercise detail 弹窗中显示更多袭击的 exercise detail more 页面布局(**细节一塌糊涂**)。 +手里没有 IOS 设备,所以相关内容为 0。 -待完成:同时加一个修改按钮和表单跳转(不放在 detail more 中,不然嵌套太深了。但是也可能应该在 detail more 中跳转才合理。先完成功能,后续从哪里跳在说) +由于一开始只是自用而已,且主力机是小米 6(andriod9),备用机是一加一代(andriod11),都是 16:9 的 1080P 完整屏幕,几乎肯定在其他的设备有一些显示上的差距,可以反馈或自行修改。 -基本完成:在 exercise detail 弹窗中有个修改按钮,点击跳转到修改表单 +### 其实还存在很多的问题 -- (done 2023-11-05)还有问题:跳转到修改表单后,没有正确带上已有的主要肌肉和次要肌肉的信息--- +- 切换中英文后,弹窗的文字没有变,要有其他动作(比如点击)之后才改变为目标文字 + - 其中包括原生的日历等组件 +- 中英文和深色主题不算完全适配 +- 训练和计划的查询非常慢 +- 很多数据库操作没有 trycatch 等检查检测操作 +- 许多同样逻辑的代码但写得五花八门 +- 很多没用的组件代码块还保留,注释的代码还保留,甚至 print 都还保留 -2023-10-24 +可是是单纯想在 2023 年完成一个测试版本吧,所以赶鸭子上架,后续会持续改进。 -基本完成:食物详情页面要显示的内容(格式都后续再说) +以上,如果有什么问题请不吝指导,谢谢。 diff --git "a/_screenshots/10\351\244\220\351\243\237\347\233\270\345\206\214\351\241\265\351\235\242.jpg" "b/_screenshots/10\351\244\220\351\243\237\347\233\270\345\206\214\351\241\265\351\235\242.jpg" new file mode 100644 index 0000000..3116ef7 Binary files /dev/null and "b/_screenshots/10\351\244\220\351\243\237\347\233\270\345\206\214\351\241\265\351\235\242.jpg" differ diff --git "a/_screenshots/11\351\245\256\351\243\237\346\212\245\345\221\212\351\241\265\351\235\242.jpg" "b/_screenshots/11\351\245\256\351\243\237\346\212\245\345\221\212\351\241\265\351\235\242.jpg" new file mode 100644 index 0000000..feea036 Binary files /dev/null and "b/_screenshots/11\351\245\256\351\243\237\346\212\245\345\221\212\351\241\265\351\235\242.jpg" differ diff --git "a/_screenshots/12\346\211\213\350\256\260\351\241\265\351\235\242.jpg" "b/_screenshots/12\346\211\213\350\256\260\351\241\265\351\235\242.jpg" new file mode 100644 index 0000000..04fbc7e Binary files /dev/null and "b/_screenshots/12\346\211\213\350\256\260\351\241\265\351\235\242.jpg" differ diff --git "a/_screenshots/13\347\224\250\346\210\267\344\270\216\350\256\276\347\275\256.jpg" "b/_screenshots/13\347\224\250\346\210\267\344\270\216\350\256\276\347\275\256.jpg" new file mode 100644 index 0000000..941cdba Binary files /dev/null and "b/_screenshots/13\347\224\250\346\210\267\344\270\216\350\256\276\347\275\256.jpg" differ diff --git "a/_screenshots/1\344\270\273\351\241\265\351\235\242\346\210\252\345\233\276.jpg" "b/_screenshots/1\344\270\273\351\241\265\351\235\242\346\210\252\345\233\276.jpg" new file mode 100644 index 0000000..f948d02 Binary files /dev/null and "b/_screenshots/1\344\270\273\351\241\265\351\235\242\346\210\252\345\233\276.jpg" differ diff --git "a/_screenshots/2\345\212\250\344\275\234\346\250\241\345\235\227\345\237\272\346\234\254\345\212\237\350\203\275.jpg" "b/_screenshots/2\345\212\250\344\275\234\346\250\241\345\235\227\345\237\272\346\234\254\345\212\237\350\203\275.jpg" new file mode 100644 index 0000000..aa7cbcf Binary files /dev/null and "b/_screenshots/2\345\212\250\344\275\234\346\250\241\345\235\227\345\237\272\346\234\254\345\212\237\350\203\275.jpg" differ diff --git "a/_screenshots/3\350\256\255\347\273\203\346\250\241\345\235\227\345\237\272\346\234\254\345\212\237\350\203\275.jpg" "b/_screenshots/3\350\256\255\347\273\203\346\250\241\345\235\227\345\237\272\346\234\254\345\212\237\350\203\275.jpg" new file mode 100644 index 0000000..ca9ae42 Binary files /dev/null and "b/_screenshots/3\350\256\255\347\273\203\346\250\241\345\235\227\345\237\272\346\234\254\345\212\237\350\203\275.jpg" differ diff --git "a/_screenshots/4\350\256\241\345\210\222\346\250\241\345\235\227\345\237\272\346\234\254\345\212\237\350\203\275.jpg" "b/_screenshots/4\350\256\241\345\210\222\346\250\241\345\235\227\345\237\272\346\234\254\345\212\237\350\203\275.jpg" new file mode 100644 index 0000000..1e0e9b7 Binary files /dev/null and "b/_screenshots/4\350\256\241\345\210\222\346\250\241\345\235\227\345\237\272\346\234\254\345\212\237\350\203\275.jpg" differ diff --git "a/_screenshots/5\350\267\237\347\273\203\350\256\255\347\273\203\347\232\204\351\241\265\351\235\242.jpg" "b/_screenshots/5\350\267\237\347\273\203\350\256\255\347\273\203\347\232\204\351\241\265\351\235\242.jpg" new file mode 100644 index 0000000..788ed65 Binary files /dev/null and "b/_screenshots/5\350\267\237\347\273\203\350\256\255\347\273\203\347\232\204\351\241\265\351\235\242.jpg" differ diff --git "a/_screenshots/6\350\277\220\345\212\250\346\212\245\345\221\212\351\241\265\351\235\242.jpg" "b/_screenshots/6\350\277\220\345\212\250\346\212\245\345\221\212\351\241\265\351\235\242.jpg" new file mode 100644 index 0000000..4043b70 Binary files /dev/null and "b/_screenshots/6\350\277\220\345\212\250\346\212\245\345\221\212\351\241\265\351\235\242.jpg" differ diff --git "a/_screenshots/7\351\243\237\347\211\251\346\250\241\345\235\227\351\241\265\351\235\242.jpg" "b/_screenshots/7\351\243\237\347\211\251\346\250\241\345\235\227\351\241\265\351\235\242.jpg" new file mode 100644 index 0000000..74ded61 Binary files /dev/null and "b/_screenshots/7\351\243\237\347\211\251\346\250\241\345\235\227\351\241\265\351\235\242.jpg" differ diff --git "a/_screenshots/8\351\243\237\347\211\251\350\257\246\346\203\205\351\241\265\351\235\242.jpg" "b/_screenshots/8\351\243\237\347\211\251\350\257\246\346\203\205\351\241\265\351\235\242.jpg" new file mode 100644 index 0000000..65fc5f0 Binary files /dev/null and "b/_screenshots/8\351\243\237\347\211\251\350\257\246\346\203\205\351\241\265\351\235\242.jpg" differ diff --git "a/_screenshots/9\351\245\256\351\243\237\350\256\260\345\275\225\345\237\272\346\234\254\345\212\237\350\203\275.jpg" "b/_screenshots/9\351\245\256\351\243\237\350\256\260\345\275\225\345\237\272\346\234\254\345\212\237\350\203\275.jpg" new file mode 100644 index 0000000..0d3aa17 Binary files /dev/null and "b/_screenshots/9\351\245\256\351\243\237\350\256\260\345\275\225\345\237\272\346\234\254\345\212\237\350\203\275.jpg" differ diff --git a/lib/views/me/index.dart b/lib/views/me/index.dart index f18502a..b0959df 100644 --- a/lib/views/me/index.dart +++ b/lib/views/me/index.dart @@ -12,7 +12,7 @@ import '../../common/utils/db_user_helper.dart'; import '../../layout/themes/cus_font_size.dart'; import '../../models/cus_app_localizations.dart'; import '../../models/user_state.dart'; -import '_feature_mock_data/index.dart'; +// import '_feature_mock_data/index.dart'; import 'backup_and_restore/index.dart'; import 'intake_goals/intake_target.dart'; import 'more_settings/index.dart'; @@ -201,17 +201,17 @@ class _UserAndSettingsState extends State { CusAL.of(context).moduleTitles('3'), ), actions: [ - IconButton( - onPressed: () { - Navigator.push( - context, - MaterialPageRoute( - builder: (context) => const FeatureMockDemo(), - ), - ); - }, - icon: const Icon(Icons.bug_report), - ), + // IconButton( + // onPressed: () { + // Navigator.push( + // context, + // MaterialPageRoute( + // builder: (context) => const FeatureMockDemo(), + // ), + // ); + // }, + // icon: const Icon(Icons.bug_report), + // ), // 切换用户(切换后缓存的用户编号也得修改) IconButton( onPressed: _switchUser, diff --git a/lib/views/me/more_settings/index.dart b/lib/views/me/more_settings/index.dart index 303b760..0b7ec70 100644 --- a/lib/views/me/more_settings/index.dart +++ b/lib/views/me/more_settings/index.dart @@ -3,7 +3,7 @@ import 'package:flutter_screenutil/flutter_screenutil.dart'; import '../../../common/global/constants.dart'; import '../../../layout/app.dart'; -import '../../../layout/themes/cus_font_size.dart'; +// import '../../../layout/themes/cus_font_size.dart'; import '../../../models/cus_app_localizations.dart'; class MoreSettings extends StatefulWidget { @@ -79,32 +79,32 @@ class _MoreSettingsState extends State { ), ], ), - SizedBox(height: 10.sp), - ListTile( - leading: const Icon(Icons.description), - title: Text( - "${CusAL.of(context).userGuide}(todo)", - style: TextStyle( - fontSize: CusFontSizes.pageSubTitle, - fontWeight: FontWeight.bold, - color: Theme.of(context).primaryColor, - ), - ), - onTap: null, - ), - SizedBox(height: 10.sp), - ListTile( - leading: const Icon(Icons.question_answer), - title: Text( - "${CusAL.of(context).questionAndAnswer}(todo)", - style: TextStyle( - fontSize: CusFontSizes.pageSubTitle, - fontWeight: FontWeight.bold, - color: Theme.of(context).primaryColor, - ), - ), - onTap: null, - ), + // SizedBox(height: 10.sp), + // ListTile( + // leading: const Icon(Icons.description), + // title: Text( + // "${CusAL.of(context).userGuide}(todo)", + // style: TextStyle( + // fontSize: CusFontSizes.pageSubTitle, + // fontWeight: FontWeight.bold, + // color: Theme.of(context).primaryColor, + // ), + // ), + // onTap: null, + // ), + // SizedBox(height: 10.sp), + // ListTile( + // leading: const Icon(Icons.question_answer), + // title: Text( + // "${CusAL.of(context).questionAndAnswer}(todo)", + // style: TextStyle( + // fontSize: CusFontSizes.pageSubTitle, + // fontWeight: FontWeight.bold, + // color: Theme.of(context).primaryColor, + // ), + // ), + // onTap: null, + // ), ], ), ); diff --git a/readme-dietary.md b/readme-dietary.md deleted file mode 100644 index b662cb4..0000000 --- a/readme-dietary.md +++ /dev/null @@ -1,396 +0,0 @@ - - - - -- [(旧的内容,问题和进度记录先不看了)](#%E6%97%A7%E7%9A%84%E5%86%85%E5%AE%B9%E9%97%AE%E9%A2%98%E5%92%8C%E8%BF%9B%E5%BA%A6%E8%AE%B0%E5%BD%95%E5%85%88%E4%B8%8D%E7%9C%8B%E4%BA%86) -- [新的记录(以此份优先)](#%E6%96%B0%E7%9A%84%E8%AE%B0%E5%BD%95%E4%BB%A5%E6%AD%A4%E4%BB%BD%E4%BC%98%E5%85%88) - - [之前的未完成的问题和细节](#%E4%B9%8B%E5%89%8D%E7%9A%84%E6%9C%AA%E5%AE%8C%E6%88%90%E7%9A%84%E9%97%AE%E9%A2%98%E5%92%8C%E7%BB%86%E8%8A%82) - - [dietary 功能的 todo](#dietary-%E5%8A%9F%E8%83%BD%E7%9A%84-todo) - - [进度记录](#%E8%BF%9B%E5%BA%A6%E8%AE%B0%E5%BD%95) - - - -2023-10-26 起来在这里更新 dietary 的进度,避免合并冲突 - -## (旧的内容,问题和进度记录先不看了) - -饮食日记设计思路记录 - -- 1、直接点击左上角的搜索,则默认是为“早餐”添加食物摄入 item。 - - 如果该日“早餐”已有 item:查询已有的 meal,直接新增 item;如果没有:新增 meal,新增 item。 - - 如果直接在搜索主页面点击添加指定食物,食物摄入 item 的量就是预设的量(就算添加成功,也可以到食物详情页面去修改) - - 如果搜索到食物之后点击,进入详情页面,可以修改食物份量和单位,然后“保存”或“移除” - - 如果不添加了,直接返回按钮;移除应该是在主页面直接点击了某一餐的 item 只会跳转的详情页面使用的。 - - 所以显示的按钮: - - 移除、添加(保存) -- 2、在主页面选中“早中晚夜”各自 tab 的“+”添加按钮,操作和上一步一样,除了对应的餐次。 -- 3、可以记录早中晚夜餐次最近的食物及其份量,可以在 meal 表中添加该 meal 属于早中晚夜的哪一顿,或者直接到 meal food item 中新增栏位来标识属于早中晚夜哪一餐的摄入。 - - 或者大改数据库,早中晚夜 4 餐,4 张表,在 daily log 的 4 个栏位分别指定对应其中一个表的数据,关联查询和查询指定内容可能会方便点。 - - 但也只是把 meal 表分成 3 个而已。 - - 如果都不改数据库表的话,查询早中晚夜餐次最近摄入记录的话,直接查询 daily loy 表,指定早中晚夜 meal id,在 date 的最近 7 天能够带出指定 meal 中的那些 meal food item 即可。 - -基本完成 饮食记录的首页显示以及该日记录和细节栏位的数据库查询函数。 - -2023-10-27 - -基本完成 在饮食日记主页面点击“早中晚夜”餐次新增 item 按钮时,跳转到 food list 页面,并在 food list 页面直接添加预设单份食物的值。 - -删除了一些查询饮食日记的 db helper 方法(因为嵌套太多,这个方法不是很好写,但大体能用,要优化的点还比较多……) - -(done) 待完成 饮食记录主页面没有日期选择器来指定添加不同日期饮食记录 -待完成 主页面的显示完全没有对应的细节,只是说能找到对应的数据了 -待完成 在 food list 页面只能新增单个,且点击新增、完成新增之后没有返回到主页面,手动返回主页面也没有刷新当日日记的数据。 - -(基本 done) 完全没开始做 进入 foodlist 之后,点击查询结果的食物进入 food detail,然后再修改数量、单位,加入日记餐次列表。 - -**【日记餐次条目的处理逻辑】**: --- `2023-10-31 数据库结构改动,此处逻辑完全变化` - -- 1、删除:左右滑动即可 -- 2、修改:在主页面点击进入详情页,可以修改数量、单位、和 **【餐次】**。 - - 数量和单位还好,直接修改 db 中对应 meal food item 的 food_intake_size 和 serving_info_id 栏位而已; - - 但是修改餐次就比较麻烦了(**偏向于先不加这个功能,修改餐次直接删除该条目换个餐次新增**): - - 首先 要把修改后的 meal food item 添加到新的 meal: - - 如果新的餐次没有数据:新增 meal 和 item,绑定到 log 对应餐次(因为是修改,当日的 log 一定存在); - - 新的餐次有数据:查询 meal 取得 meal id,修改 item 再添加; - - 其次 要删除旧的餐次的该条 item 数据: - - 如果删除该 item 之后该餐次还有其他 item,该 item 删除完就完了; - - 如果删除该 item 之后还餐次没有其他 item,则删除该 meal,再删除该 meal 对应的 log 中的餐次; -- 3、新增: - - 大概流程: - - 点击在主页面对应餐次的右侧按钮(或者顶部的搜索按钮,默认为新增到早餐),进入 food list 搜索页面。 - - 在 food list 中再点击需要添加的食物,进入 food detial 页面。 - - 在 food detail 中修改数量、单位、和 **【餐次】**。 - - 问题: - - 在涉及餐次时和“修改”有点类似,要先查询要移动到的目标餐次有没有数据(没有要移除旧的) - - 目标餐次有 item,获取该餐次的 meal id 直接新增 item 即可; - - 目标餐次没有 item,新增 meal,新增 item, - - 如果连 log 都还没有,还再新增 log,再绑定其餐次的 meal id; - - 如果有 log,则直接绑定其餐次的 meal id; - -条目调到详情页的区分(可用来判断显示不同的按钮): - -- 主页面点击条目 -> 跳转到详情; -- 主页面点击添加 -> 调到食物搜索页面,食物列表选择某一个食物 -> 跳转到详情; - -2023-10-30 暂存 - -pause: log index 和 food list 点击跳转到 food detail 的逻辑有了,但发现了更优的 serving info 的数据库设计,所以暂停目前的内容,修改新的数据库设计。 - -基本完成: 修改了数据库表 serving_info 的栏位设计,并修改了目前涉及到的所有逻辑部分(主要是 food detail 营养素展示部件) - -2023-10-31 暂存 - -pause:修改旧的某一天某一餐次的条目,需要从早餐移到晚餐非常麻烦,然后重新思考了一下数据库结构,发现被“一天饮食记录只存一条数据”的想法限制住了,所以重新修改数据库,删除原本的 meal 和 meal food item,直接把把一餐的每一个食物摄入留存记录,原本`log-meal-item 1:(4*1):N` 的设计,直接 `daily_food_item` 一个表搞定,以空间换时间。 - -注意:巨大结构改动,大量已经完成的功能会被修改 - -2023-11-01 - -基本完成:饮食记录数据库结构和栏位的设计,并更新了相关代码 -基本完成:log index 添加饮食日记条目,先到 food list,再到 food detail,点击返回后直接回到 log index,并刷新 log index 页面 - -- 注意:这里参考了 stackoverflow 的 [Flutter - Pass Data Back with .popUntil](https://stackoverflow.com/questions/52075130/flutter-pass-data-back-with-popuntil) 想 popUntil 时带上参数进行刷新,但是没有成功,获取不到返回的数据。 - - popUntil 带返回值的需求一直有,但没有提供,参看[issue](https://github.com/flutter/flutter/issues/30112)。 - - 目前返回上上层并刷新其页面的实现最简单如下(都不用使用命名路由): - ```dart - Navigator.of(context) - ..pop() - ..pop(true); - Navigator.of(context).pushReplacement( - MaterialPageRoute(builder: (_) => const DietaryRecords()), - ); - ``` - -2023-11-02 - -基本完成:log index 滑动移除饮食日记条目,log index 点击 item 进入 food detail 中移除条目。 - -(done) 待完成:新增食物和食物单份营养素的表单页面 - -(done) 待完成:饮食记录主页的日期选择器 - -- 基本完成 2023-11-02 -- done 2023-11-02(命名路由 RouteSetting 传参)【存在问题】,切换了日期再进入 food list 或者 food detail 之后返回主页面,日期会被重置为今天,因为是整个重新加载部件而不是指定更新状态。 - - 无法 setstate 是因为跨级返回时(log index - food list - food detail 返回)无法带参数,这个找办法。 - -待完成:饮食记录主页的显示,和饮食数据的多种展示方式(精简、具体……) - -待完成:导出饮食记录(这个功能靠后) - -考虑:一个导入表格或者 json 文件的接口,一次性导入多个食物及其各项单份营养素信息 - -2023-11-03 - -基本完成:新增食物带上单份营养素的表单 - -- 还有问题: - - 1 没有单位 (done 2023-11-06) - - 2 没有限制只能输入数据 (done 2023-11-06) - - 3 品牌和名称唯一的报错处理 (done 2023-11-06) - -2023-11-06 - -基本完成 新增食物带上单份营养素的表单(查一些显示的细节优化了) - -## 新的记录(以此份优先) - -### 之前的未完成的问题和细节 - -1. 待完成 主页面的显示完全没有对应的细节,只是说能找到对应的数据了(没有概要视图、详细视图等切换) - - 即饮食记录主页的显示,和饮食数据的多种展示方式(精简、具体……) -2. 在 food list 页面只能新增单个食物(是否需要一个食物基本信息页面维护食物和营养素信息) -3. 待完成:导出饮食记录(这个功能靠后) -4. 考虑:一个导入表格或者 json 文件的接口,一次性导入多个食物及其各项单份营养素信息 - -### dietary 功能的 todo - -- 【2023-11-09 明确的待完成】 - - 范围为上周、本周时,要显示 7 条的条状图和目标虚线,以及对应表格数据,没做。 - - 当天或者当周无数据时,应该有个空白占位,目前就只显示了表格标题和 NaN 的图例。 - - 个人配置 RDA 和每日营养素目标的功能 - - 添加每日每餐食物条目,可以上传图片 - - **饮食报告导出和食物营养素文件导入是个大工程** - -#### 个人配置 - -- 个人信息页面 -- 目标配置 -- 体重输入,折线图 - -### 进度记录 - -- 2023-11-07 - - 基本完成饮食日记的主页的显示布局效果 -- 2023-11-08 - - 饮食日记的主页添加三大营养素的饼状图和摄入量列表 -- 2023-11-09 - - 基本完成饮食记录报告模块中选中今天、昨天时,卡路里 tabview 中的饼图和食物摄入表格的内容。 - - 基本完成饮食记录报告模块中选中今天、昨天时,宏量素 tabview 中的饼图和食物摄入表格的内容。 - - 营养素 tabview 占位有了,但因为要和摄入目标对比,暂时没有摄入目标功能,所以只是占位。 -- 2023-11-13 - - 基本完成 dietary 设置页面的个人基本信息修改功能。 -- 2023-11-14 - - 基本完成 dietary 设置页面的营养素目标设定的功能。 -- 2023-11-15 - - 基本完成 dietary 设置页面的每日营养素目标条状图。 - - 重构了饮食记录报告中卡路里和宏量素 tabview 中饼图和表格的设计,并添加了切换到上周本周时显示条状图。 - -tobed: 目标卡路里折线图是实际摄入的条状图放到一起? - -- 2023-11-22 - - - dev_ubt 下 flutter 升级到了 3.16.0, WillPopScope 将被弃用,【目前迁移工作还没做】。 - - 2023-11-23 已处理 - -- 2023-11-23 - - - 完成手记用富文本组件进行新增、编辑、预览的初版。 - -- 2023-11-24 - - - 添加了手记日历,基本完成整个'手记'模块的初始功能。 - - 同时添加了插入随机手记的测试数据。 - -- 2023-11-27 - - - 修复了手记富文本编辑页面 textField 和 quillEditor 聚焦冲突的问题;修正了手记编辑页面的细节,移除了一些备用组件代码。 - - 添加了手机时间线展示页面(背景色没有调得比较好看) - - 2023-11-27 修复小问题:手记进入编辑页面后,返回主页没有重新加载。 - -**饮食记录报告的导出?数据库的导出?图片怎么保存和导出?** - -**我的设置页面还没搞,待运动完成后,各项配置、报告导出、照片等都要放在这里** - -- 2023-11-29 - - - 完成"运动"模块的训练跟练的 tts 功能雏形。 - - 完成 [yuhonas/free-exercise-db](https://github.com/yuhonas/free-exercise-db)格式的 json 文件导入的功能,并修改了图片显示组件。 - -- 2023-11-30 - - - 完善动作和食物营养素 json 文件导入页面的细节,修复 json 文件解析未正确解析的问题。 - - 将所有锻炼动作展示本地图片使用轮播组件以便展示多张图;设置在跟练页面时屏幕保持常亮。 - -- 2023-12-05 - - - 重构了饮食记录中设计食物选择部分的组件结构,完成食物成分模块的食物详情基本页面和新增食物的相关表单页面。 - - 完成饮食日志首页跳转的日历统计概述报告页面。 - -- 2023-12-06 - - - 基本完成食物成分模块中食物详情页面,以及食物基本信息的修改及其单份营养素的新增与删除功能。 - - 基本完成食物成分模块中单份营养素页面的重构。 - - 基本完成新增食物带单份营养素的功能页面的重构。 - -- 2023-12-07 - - - 基本完成在饮食日记中,可以对每餐进行图片上传。 - - fix:所有字符串 split 的地方都先排除字符串本身就是空。 - - 基本完成饮食记录导出 pdf 的初始示例功能。 - -- 2023-12-08 - - fix:完善饮食记录导出 pdf 页面细节,增加了导出时间范围下拉选择。 - -### 问题记录 - -1. 同样的 Text()大小的中英文看起来不在一条线上。 - -原因: - -- 中文和英文字体默认的 leading 不一样。 -- StrutStyle 的 leading 属性是指字体的倍数,比如:0.5 就是 0.5\*字体的高度,而且这个高度要分成两半,上下各分一半。 - -解决方法: - -Text()中设置 leading 属性,如下 - -```dart - TableCell(child: Text('蛋白质')), - TableCell( - child: Text( - 'RDA', - strutStyle: StrutStyle( - forceStrutHeight: true, - leading: 0.5, - ), - ), - ), -``` - -参看: - -- https://blog.csdn.net/gaoyp/article/details/122121739 -- https://stackoverflow.com/questions/56799068/what-is-the-strutstyle-in-the-flutter-text-widget - ---- - -2. 命名路由的寻找顺序 - -```sh -Make sure your root app widget has provided a way to generate this route. -Generators for routes are searched for in the following order: - 1. For the "/" route, the "home" property, if non-null, is used. - 2. Otherwise, the "routes" table is used, if it has an entry for the route. - 3. Otherwise, onGenerateRoute is called. It should return a non-null value for any valid route not handled by "home" and "routes". - 4. Finally if all else fails onUnknownRoute is called. -Unfortunately, onUnknownRoute was not set. -``` - -3. ListTile 的 leading/trailing 无法设置高度 - -截止到 2023-11-20 时,组件还是默认限制了高度 48/56,目前无法修改。 - -参看 issue: https://github.com/flutter/flutter/issues/98178 - -4. 下方 BottomNavigationBar 的 item 超过 4 个后,背景色消失 - -解决: 给他指定类型 : type: BottomNavigationBarType.fixed, - -参看: https://blog.csdn.net/weixin_46005137/article/details/107049867 - -5. 好像是 flutter 更新到 3.16.0 后 AppBar 背景色消失 - -解决:因为 3.16 主题默认启用 material3,手动修改为 false 即可。 - -```dart -MaterialApp( - theme: ThemeData( - primarySwatch: Colors.blue, - // ???2023-11-22:升级到flutter 3.16 之后默认为true,现在还没有兼容修改部件,后续再启用 - useMaterial3: false, - ), - // …… -) -``` - -6. 【unsolved】2023-11-22 不知道什么原因,使用 formbuilder 构建文本输入框,一定是安全键盘,无法切换。即便手动设置`keyboardType: TextInputType.text,`也不行。原因不明 - -但是使用自带的 TextField 就不会有这个问题。 - -2023-12-04,无法解决,MIUI 什么的可以关闭安全键盘,这样打开后还是英文输入法,但可以切成中文;如果没关安全键盘,则一定弹出小米安全键盘,无法输入中文。 - -但 FormBuilderTextField 的 keyboardType 改为"`TextInputType.number`"它就是正常键盘的数字键而已,就不会弹安全键盘,原因不明。 - -**改为`keyboardType: TextInputType.name`可以启用正常键盘。** - -**2023-12-13 但是无法换行!!** - -这应该是 form_builder 工具库的一个 bug,新版本不兼容问题。查看 issue: https://github.com/flutter-form-builder-ecosystem/flutter_form_builder/issues/1334 - -**2023-12-21 更新** - -有新进度,加上`enableSuggestions:true`可以使用默认的 text 键盘了,multitext 亦同。 - -7. Chip 部件的默认高度 - -对于 chip 也有设置默认 MaterialTapTargetSize.padded, 也就是说 chip 有个最小高度 48px。 - -所以为了缩小尺寸,可以修改为 MaterialTapTargetSize.shrinkWrap ,这将移除额外的空间。 - -参看:https://stackoverflow.com/questions/51440984/how-to-adjust-the-size-of-a-chip-in-flutter. - -8. 2023-11-25 一个很严重的 bug:在手记修改页面,标题或者标签的文本输入框中是编辑状态,打开了键盘,点击收起键盘之后,又会立马聚焦到输入框,然后弹出键盘,重复收起又弹窗很多次键盘后,才会不自动聚焦到输入框。 - -同样,只要点击了这两个输入框进行文本修改,再点击 rich text 修改正文也无法聚焦,要重复点击多次,鼠标跳过去了,但完成 rich text 编辑收起键盘,还是会聚焦到标题或者标签的文本输入框去,然后弹出键盘。再点击收起又弹出多次,才失去焦点。 - -文本输入框换成 Formbuilder 的也一样,**原因不知**。 - -有可能是类似这个 issue: https://github.com/flutter-form-builder-ecosystem/flutter_form_builder/discussions/1297 - -【实际解决】:是因为 textField 和 quillEditor 聚焦冲突的问题,手动控制点击 quillEditor 让 textField 失去焦点就可以了;反之亦然。 - -9. 【unsolved】2023-12-02 image_gallery_saver 保存图片时报错,3.13 有升级到 3.16.0 - -表现和 https://stackoverflow.com/questions/69883867/flutter-unhandled-exception-missingpluginexceptionno-implementation-found-f -差不多。 - -后来找了很多方法,肯定不是权限问题,初步分析是在 Android9 上无法正常工作了,后续用更高级的 Android 版本的试一下。 - -【实际测试】:的确是 Android9 及旧的版本不支持,一加一刷 lineageOS 的 Android11 实测可以。 - -所以检测到设备 sdk 版本小于 30,就不显示按钮。 - -还有问题:预览时白色,下载的图片是黑色,所以手机中看到是白底黑色下载之后黑字的标题就没有了。 - -10. 【unsolved】 2023-12-06 所有的 formbuilder 的 reset 都没有效果? - -执行力`_formKey.currentState!.reset();` 页面选中或者输入的值还在; - -但`print("已经执行了简单查询的重置了_formKey.currentState!${_formKey.currentState!.value}");` 却是空对象。 - -11. 对字符串 split() 的理解和认知不对。 - -str.split()的描述是:如果模式与该字符串完全不匹配,则结果总是一个仅包含原始字符串的列表。 - -```dart -var a = ""; -var b = a.split(","); -print(b); // [] -print(b.isEmpty); // false -print(b.length); // 1 -// 因为此时的 b 虽然是`[]`,但是具有一个空字符串的列表,而不是空列表。 -``` - -同理: - -```dart -var a = ","; -var b = a.split(","); -print(b); // [, ] -print(b.isEmpty); // false -print(b.length); // 2 -// 此时的 b 是`[, ]`,是具有两个空字符串数据的列表。 -``` - -但是: - -```dart -var a = ""; -var b = a.split(""); -print(b.isEmpty); // true -print(b.length); // 0 -print(b); // [] -``` - -**所以后续在使用字符串拆分的时候,先判断是否为空字符串,连字符至少是个空格或者逗号。** diff --git a/readme-merged.md b/readme-merged.md deleted file mode 100644 index 09b388c..0000000 --- a/readme-merged.md +++ /dev/null @@ -1,249 +0,0 @@ -## 说明 - -### 2023-11-16 dietary 和 training 合并之后的继续处理 - -#### 2023-11-16 - -- 重新整理和优化了 DBDietaryHelper 和 DBTrainingHelper 数据库工具类 -- 集中并重新编写了测试数据插入函数,并统一先放置在“我的”模块中 -- 修改饮食记录报告下方表格会出现溢出的问题 -- 修正饮食日记主页下方图表营养素图例的颜色为统一枚举值 - -开始处理主要界面的布局和文字描述 - -#### 2023-11-17 - -- 整理了 constants 文件的内容,把 CusLabel、ExerciseDefaultOption、CusDropdownOption 类型合并。 -- 简单整理了 exercise list 主页面,优化了新增基础活动及其条件查询的表单页面。 - -#### 2023-11-18 - -- frombuilder 的输入框和下拉框二次自定义封装,并在 exercise 修改和查询表单中复用。 - -#### 2023-11-19 - -- 基本整理好了运动的“动作”模块的所有初步的细节。(导入功能靠后再做) -- 基本整理了训练组模块的首页的布局,新增了查询功能、修改训练基础信息的功能。 - -#### 2023-11-21 - -- 饮食模块新增了单独的食物营养素管理子模块,已初步完成 - - 食物列表主页面 - - 食物 json 文件导入(数据和格式来源于《中国食物成分表标准版第 6 版》自己 ocr 识别的截图数据) - - 食物详情页(展示 OK,**修改、添加新的单份营养素、布局等还没做**) - -#### 2023-11-21 - -- 基本完成了训练组模块内容的重新整理(跟练功能放在最后再做)。 - ---- - -### 2023-12-09 阶段总结 - -2023-12-09 感觉大部分功能都已经完成了,剩下的需要一个个页面进行检查时再改善优化。 -先整理一下各个部分之前还剩下的问题。 - -### 2023-12-12 开始优化和部分细节完善 - -- 基本完善了饮食日记的首页、添加时的详情页等细节; -- 基本完成运动模块的基本细节。 -- 修复了运动的查询时重置无效的问题。 - -### 2023-12-13 - -- fix: 不再使用命名路由,修复添加饮食条目返回主页没有重新加载的问题,当摄入量无小数位时不显示小数,简化饮食条目食物详情页面。 -- feat: 完成饮食条目食物详情页面的新增单份营养素功能,同时删除旧的营养素详情的代码;fix:删除命名路由相关代码。 -- perf:优化了饮食报告页面的部分细节。 -- feat:新增了添加饮食记录可以选择最近餐次的摄入记录的食物列表。 -- fix:备份恢复添加了加载中指示器。 - -### 2023-12-14 - -**【大问题:没有考虑食物成分的删除】-> 训练模块的基础数据也没考虑删除,而且更复杂!!!** - -- 删除食物和营养素功能: 那后续饮食记录统计等不就带不出对应的数据了吗? - - - 两个思路: - - 第一:daily food item 用冗余设计,直接是条目、食物、营养素信息的所有栏位,不用关联查询 - - 第二:逻辑删除,食物成分管理时只显示未逻辑删除的,就不影响已有关联的摄入条目的联合查询。 - - 第三:还是物理删除,但有其他地方使用到的食物不允许删除。 - - 引申出来: **有用到的就逻辑删除、没用到的就物理删除。(这个改动没那么大,也比较合理)** - -- feat: 添加了食物成分列表中长按可删除食物及其单份营养素的功能。fix:添加逻辑删除栏位,食物及其单份营养素有被饮食记录条目使用则逻辑删除,否则就物理删除。 - -- 删除运动相关的基础表逻辑(耦合太多): - - 因为 exercise 算是主体内容,所有有被使用就不允许删除,具体: - - exercise(和 action 是 1 对 1,及有关联的 action) 有被 group 使用,则不允许删除; - - group 有被 plan(及存在与 plan_has_group)使用,则不允许删除; - - plan 有被训练日志使用,则不允许删除。 - - 训练日志肯定不允许删除; - - 删除 plan: 从 plan_has_group 中移除该 plan_id 的数据即可。 -- 那新问题出现了:用户跟着一个计划或者训练练习了之后,需要调整,就无法调整,只能新增了,因为有日志不允许删除的缘故。 - - 目前的逻辑: - - 删除 exercise,group 对应的 action 会被删除; - - 没有删除 group; - - 没有删除 plan; - - plan 有训练日志,则不允许跳转其 group list; -- 2023-12-14 目前最简单的处理:**联合查询,有用到的就不允许删除**。可能不合理,但时间不充裕了。 - -- feat: 新增训练、计划列表中长按删除;添加了动作、训练、计划在删除前检查是否有被使用的逻辑,有被使用则不支持删除。 - -### 2023-12-15 - -- feat:添加应用图标,修改应用名称,测试打包效果。fix:无数据时体重趋势折线图绘制异常。 -- refactor:重构了用户基本信息的预览页和修改页。perf:优化了首次使用的初始化页面.feat:新增了运动模块的部分 i10n 的中英文显示。 - -### 2023-12-16 - -- feat:添加更多设置模块,添加切换中英文显示的按钮。fix:修复无训练记录是运动报告统计报错的问题。 -- feat:完成用户与设置模块中摄入目标、运动设置、备份恢复、更多设置相关页面的中英文切换的多语言支持。 - -### 2023-12-18 - -- feat:完成用户与设置模块中基本信息、体重趋势相关页面的中英文切换的多语言支持。 -- feat:体重趋势中体重记录添加了日期范围查询。 -- feat:完成手记模块的相关页面的中英文切换的多语言支持,添加长按 tile 删除指定手记的功能。fix:修正手记分类为单选、心情标签为多选。 - -### 2023-12-19 - -- fix:手记查询时筛选为当前用户的数据;feat:时间线模式添加关键字查询功能。 -- feat:基本完成饮食模块的食物组成相关页面的中英文切换的多语言支持;fix:完成单份营养素详细的修改功能。 - -### 2023-12-20 - -- feat:基本完成饮食模块的饮食记录、餐次相册和饮食报告相关页面的中英文切换的多语言支持。 - -### 2023-12-21 - -- feat:基本完成运动模块的动作管理子模块相关页面的中英文切换的多语言支持,并修复一些细节 bug。 - -### 2023-12-22 - -- feat:基本完成运动模块的训练管理子模块(除了跟练页面)相关页面的中英文切换的多语言支持。 -- 跟练还有 bug:已经完成之后的弹窗,点击返回按钮之后,弹窗消失,其他按钮又能够点击了,这样数据就不对。 - - 应该点击了返回,直接就退出才对。 - -### 2023-12-23 - -- fix:添加跟练点击返回按钮显示是否终止的确认弹窗,修复跟练结束点击返回按钮会关闭弹窗但还是在跟练结束页面而不是主页面。 -- feat:基本完成运动模块的计划管理子模块相关页面的中英文切换的多语言支持,修复部分细节 bug。 -- feat:基本完成运动模块的训练报告模块(除导出 pdf 外)相关页面的中英文切换的多语言支持,修缮部分细节 bug。 - -### 2023-12-25 - -- feat:基本完成运动模块的训练报告导出 pdf 页面的中英文切换的多语言支持,修复 pdf 一条记录一页而不是按每日训练记录分页的问题。 - -记录: - -- RichText 在默认的主题中(即 ThemeData.dark()或 ThemeData.light())颜色都是白色,所以如果当前系统主题是浅色,就会导致使用 RichText 的文本看不太清楚(浅色背景+白色文本)。 - - - 目前解决方法是虽然使用自带的其他 textTheme 的预设值,例如 - - `Theme.of(context).textTheme.bodyLarge?.color`,它就会根据浅色/深色背景切换颜色为黑色或者白色。 - - 2023-12-25 因为使用默认的 material3 的样式适配深色浅色背景太麻烦,目前还是使用 FlexThemeData 预设好的, - - 用户如果选择主题跟随系统,则默认使用的还是 FlexThemeData 得主题,而不是 material3 的预设主题。 - -- feat:基本完成运动模块页面深/浅色主题的适配,标签文字大小和颜色统一使用全局变量而不是随意设定,修复部分细节 bug。 - -### 2023-12-26 - -- feat:基本完成饮食模块页面深/浅色主题的适配,标签文字大小和颜色统一使用全局变量而不是随意设定。新增轮播图可以点击展开弹窗进行缩放预览。fix:修改所有表单的背景色为透明。 -- feat:基本完成手记模块页面深/浅色主题的适配。 -- feat:基本完成用户与设置模块页面深/浅色主题的适配(至此主题适配基本都完成了)。 - -### 2023-12-27 - -- fix:修复跟练页面点击返回无暂停弹窗的问题。 -- fix:修复饮食记录主页面表格模式时顶部概述部分的表格和下方餐次的表格位对齐额问题。 -- refactor:重新设计了训练日志宽表,计划可以任意删除修改,动作和训练未被使用时可删除。删除的计划和训练的训练记录的关键信息依旧保存在日志宽表中。 - -### 2023-12-28 - -- fix:修正饮食记录添加摄入条目的餐次下拉按钮样式。 - -### 2023-12-29 - -- fix:统一动作、训练、计划的分类为同一个列表;修正训练的动作组为空时不显示“开始”按钮。 - -flutter build apk --split-per-abi - -### 2023-12-30 - -- bug 或需要修改的问题列表: - - - done 初次使用的输入框有背景色;且就算有输入数据还是使用的预设值(按钮文字含义不明确) - - done 首次输入的身高体重也应该放到体重趋势表 - - done 基本信息的修改文字按钮看不清,应该是用的 primaryColor - - done 基础动作的条件查询按钮和训练、计划不一致 - - (保留不一致,因为查询条件不一样、列表的栏位也不一样、删除方式也不一样,是故意的。) - - done 下拉选择框文字大小不一致,英文时又可能太长无法完整显示 - - 统一在组件内部限定,中文标签时 16.sp,英文时 13.sp - - done 基础动作的 ttsNote、用户上传等栏位没有意义,不要显示 - - done 基础动作修改的肌肉多选弹窗的按钮是英文,且搜索框有背景色 - - 数量不多,不启用搜索 - - done 基础动作详情弹窗的图片不能点击缩放预览 - - done 所有的地方的 appbar 处的按钮都应该一致,都改为图标,有的地方还是文字 - - 有的地方比如手记的新增保留了文字+图表的按钮。 - - done 新建训练和修改训练的标题文字反了 - - done 新建计划和修改计划的标题文字反了 - - done 修改训练组时,给它添加新的动作没有分类筛选的功能,只有关键字(应该和计划添加训练一致) - - ???跟练完查看报告后返回依旧是跟练的最后一个动作的页面 - - 等待复现 - - done 跟练的休息间隔时间一开始是 db 中的 30s,但不知道是不是点击了退出弹窗或者暂停按钮,下一个动作时变为了预设的 10s - - ??? 修改计划弹窗,点击确认之后,退出到上一层(不应该),且弹窗没有关闭 - - 突然又没有了,等待复现 - - done 修改计划弹窗中的“周期栏位”好像没意义,因为添加的训练组和输入周期不匹配没有问题,没做限制 - - 周期栏位不显示,仅存在理论作用,即根据该计划包含的训练数量为实际业务依据。 - - done 基础动作条件查询时,如果有弹出键盘,点击 appbar 返回按钮时会有像素溢出问题,(训练、计划模块也是如此,饮食模块中子模块返回亦同) - - 这个问题就是点击返回按钮时键盘没有收起来,所以即便加上了 expanded,还是有一瞬间看到被压缩的子模块的样子 - - 就算修改了 appbar 的 leading,点击时先收起键盘`FocusScope.of(context).unfocus();`再 pop,还是有一瞬间能看到压缩后的样子。 - - done 所有的 exercise 的轮播图和公共轮播组件不一致,没有点击缩放预览功能 - - done 训练新增动作时,动作配置页面的图片不对 - - done 不同地方的取消和确定按钮的样式不对(有点左边是确定,有的右边是确定,有的都是 TextButton,有的是 ElevatedButton) - - 所有的 AlertDialog 的按钮都是 TextButton,且一般都是左边取消右边确认 - ---- - -有好些 bug 有出现过,但又没法直接复现,但可能还是会出现。其中有部分我猜测是手机性能不够,我以为正常很快的结果并不是,尤其是页面 pop 或者 posh 是在异步函数中的时候。 - ---- - -### 2023-12-31 - -- bug 或需要修改的问题列表: - - - done 手记的时间线模式应该按照时间倒序 - - done 有修改过的手记,在时间线模式的时间戳没显示时间 - - 时间戳统一显示创建时间,因为修改时间可能比较乱 - - done half 编辑手记时分类和心情被选中的模式要改一下,不要前面的勾,因为被挤压变现严重 - - 多选的组件支持不显示勾,单选则不支持取消 - - ???新增手记,又修改之后,创建时间不对了。也不一定,偶尔有发生创建时间为 null 的情况,原因不明 - - 等待复现 - - done 饮食报告的 pdf,中文标题无法显示,正文的中文倒是正常(运动的 pdf 没有问题) - - base 和 fontFallback 都加载本地支持 unicode 的字体资源即可 - - done 训练日志的导出的范围下拉框宽度不对,和饮食记录的不一致 - - 修改宽度即可 - - done 餐次相册,在饮食日记给对应餐次添加照片,好像全是当日的餐次,如果是切换到其他日期,也是今天的。 - - 查询餐次摄入照片后,没有清空旧的就直接替换新的数据 - - done 此外假如正在预览昨天的饮食记录,看到显示的图片及其数量也是今天的。 - - 同上 - - done 饮食条目不是给今天添加,也会添加到今天 - - 添加最近饮食记录条目时,date 栏位不对 - - done 餐次相册模块的照片下方应该有点空余,不然不好看 - - done 饮食报告的今天昨天本周上周的下拉框字体大小不是 16 和 12sp - - done 食物列表应该按食物新增时间倒序排序,不管是食物成分模块还是新增饮食记录 - - done 饮食条目添加的详情页面的表单有背景色 - - done 全量备份有问题 - - `AndroidManifest.xml` 还是需要 WRITE_EXTERNAL_STORAGE 权限 - - done 保存餐次相册的图片预览上方应该有点空隙 - -- --- 暂不急 - - - 切换中英文后,弹窗的文字没有变,要有其他动作(比如点击)之后才改变为目标文字 - - 其中包括原生的日历等组件 - - 中英文和深色主题不算完全适配,先中文的浅色背景吧。 - -- 比较重点但改动可能较大 - - 训练和计划的查询非常慢 - - 很多数据库操作没有 trycatch 等操作 - - 许多同意逻辑的代码但写得五花八门 - - 很多没用的组件代码块还保留,注释的代码还保留,甚至 print 都还保留 diff --git a/readme-training.md b/readme-training.md deleted file mode 100644 index ad56e7b..0000000 --- a/readme-training.md +++ /dev/null @@ -1,212 +0,0 @@ -## 2023-11-05 之后 training 进度放到这里,避免冲突 - -### 2023-11-05 之前旧的问题整理 - -(这些问题都可以放在大功能完成之后再考虑) - -1. exercise 列表的查询区域,显示更多之后有选择高级选项的值,折叠之后的【重置】无法实际重置折叠之后高级选项选中的值。 - - - 解决方案不清楚。 - -2. exercise 详情页的内容有了,布局和细节都没有 - -3. exercise 可能需要一个批量导入的功能 - - - 是否使用 json 格式? - - 图片怎么办? - - 在线地址的话 app 就要连网了,可能不行。 - - 本地图片的话如何批量导入到对应的 exercise 中,图片放在对应缓存地址去? - -4. exercise 的修改按钮位置是否合理? - - - 现在是放在 exercise list 点击之后的 showModalBottomSheet 中,里面有【详情】和【修改】按钮。 - - 是不是应该把修改放到详情中,这样才知道具体要修改什么,否则看完详情再返回上一层再修改逻辑不是很顺。 - -5. showModalBottomSheet 点击图片可以浮出来,但是没有双指放大等功能,太小也可能看不清。 - -6. 一个 exercise 如果有多个图片,在 showModalBottomSheet 或者详情页都只是默认显示第一张,没有地方看第二张。 - -7. 新增或者修改 exercise 之后,返回列表页面,现在是重新从 0 开始加载所有,是否只是重新加载当前新增或修改的数据? - ---- - -### 训练计划模块功能 - -参考手机里“男士减肥健身软件”的“我的锻炼计划” - -注意内容 训练计划 Group/workout - 动作 Action - 基础活动 Exercise (这里显示 workout,对应 db 就是 group 表) - -基本流程: - -计划列表主页 -> 点击新增训练计划 -> 可搜索的 exercise 列表 -> 选中某一 exercise,跳转到 Action 配置页面(设置时间或者个数) -> action 配置页面点击保存,进入 action 列表 -> action 列表点击新增,继续跳转 可搜索的 exercise 列表,之后相同(选择 exercise,配置 action,保存后返回 action list)…… - -主要页面: - -1. 主页锻炼计划列表 - - 右下角悬浮新增按钮 -2. 点击训练计划【新增】进入可搜索 exericse 的“基础活动”列表,也是下拉加载更多 - - 选中某个 exercise 之后跳到 action“动作”页面,显示 exercise 的大概信息,和该 exercise 运动的持续时间或者个数 - - 点击【新增】加入到这个新的训练计划的第一条,即返回训练计划的 action 条目列表 - - 更多的条目类似操作,即 action 条目中点击新增按钮 -3. 新增训练计划的 action 条目列表,在点击保存时弹窗口给训练计划取个名字(默认为新锻炼、新计划等) - -数据库操作: - -- 新增 group 的时候,会先带一个 action(关联一个 exercise),所以是 insert 时一次性新增一个 group、多条 action、多条 group_has_action 数据? - - 还是说,更简单一点,action 不能复用,一个 action 一定属于某个 group(反正也没有单独展示所有 action 列表的地方,内容重复不影响,idb 不同) - - 即只要 group 和 action 表,group has action 就不要了 - -**【2023-11-08 更新】**: - -不能按照“男士减肥健身软件”的顺序来,因为无论是创建 group 还是 action 都有很多自行输入的栏位, -如果按那个软件来,group 只能填一个名称,action 只有一个时间和次数,和现有数据库设计差距过大。 - -还是常规顺序: - -进入训练计划页面 workout list -> 点击新增训练计划,弹窗输入训练计划的基本信息,显示当前训练计划空白 action list --> 点击添加动作,弹窗查询 exercise list -> 点击指定 exercise,进入动作配置信息页面 action config --> 点击保存,返回 action list - -**或者说**,之前的设计太麻烦了,就应该 只保留 group 和 action,1 对多,额外栏位也不要了。 - ---- 这部分,我试一下新的数据库设计 simple group 和 simple action 的 1 对多 - -### 进度 - -#### 2023-11-05 - -- 基本完成训练计划(workout 或者 group)的几个空页面大概需要什么和理清最基础的跳转逻辑。 - -#### 2023-11-06 - -- 基础查询 exercise 列表,要调整查询框和显示数量,还有 card 的高度,图片太小了 - -#### 2023-11-07 - -- 基本调整了新增训练计划时跳转的插查询的基础 exercise 列表页面。 -- 大概有了 action 配置的页面 - - 【问题】 - - 1 exercise 缺少 counting_mode 栏位,无法判断是计时还是计数 - - 2 action 表中的 action_code、action_name、action_level、description 等栏位需要手动输入 - - 能不能简化一下,group 直接关联了 exercise 就好多一些冗余栏位。即不复用 action 和不需要 group_has_action 表 - -#### 2023-11-09【暂停】 - -问题: - -之前的设置参考"“男士减肥健身软件"目前有个无法解决的问题,就是有 3 种情况会进入 action config 页面,但是添加了 action 之后,要返回到 action list 比较麻烦,因为存在两种情况,1 是新增训练计划(group)时,还不存在 action list,要同时新增 group 和 action list,但是 group 没有用户输入的阶段。如果是选择完所有的 action,再新增时同时新增 group,那么一次性配置一个 action,后配置的从 action config 页面返回之后,旧的就没有了。 - -最主要是存在 3 种情况 - -- 新增训练计划 group list > action list > simple exercise list -> action config => 返回新的 action list -- 旧训练计划新增动作配置 group list > action list > simple exercise list -> action config => 返回旧的 action list -- 旧训练计划修改动作配置 group list > action list > action config => 返回旧的 action list - -现在放弃了,一步一步来,每步都保存: - -- 新增训练计划 group list -> new group form -> 空 action list -> 带入 group id 进入 simple exercise list -> action config => 返回旧的 action list -- 旧训练计划新增动作配置 group list -> 指定 action list -> 带入 group id 进入 simple exercise list -> action config => 返回旧的 action list -- 旧训练计划修改动作配置 group list > action list > action config => 返回旧的 action list - -#### 2023-11-10 - -后续 exercise 称为**活动**,action 称为**动作**, group/workout 称为**训练**,plan 称为**计划**,整个模块 training 称为**锻炼**。 - -【注意】:看看 action config 从一个页面,换成一个 dailog 看看,能不能解决 pop 两次的问题?? - -基本完成 训练主页面点击某想训练进入动作列表 - -待完成: - -- 训练中查询动作列表时,要按照 group id 来排序;当修改该 group id 中的 action 顺序时,点击保存则把每个对应 action 的 action id 替换为当前的 index,然后按 group id 删除已存在的 action,再新增重新排序的 action。 - - 注意,修改除了移动顺序,还行修改配置(时间次数重量等)、删除、新增(弹窗的方式),在点击保存时再重新先删除后新增。 - -#### 2023-11-12 - -- 基本完成 action list 中修改、移动顺序、删除的展示(**还没有实现保存修改数据库数据的逻辑**) - - - 这个保存全部删除旧的再新增新的列表的话,如何指定存入 action 编号? - - - 还是说顺序批量保存的,让数据库的自增应该不会出现乱序的?也就是一定不会异步插入? - - - 待完成: - - action list 中新增 action 的逻辑。 - - 点击新增->跳到 simple exercise list 页面 -> 选中某个 exercise,带数据返回 action list -> 关闭 simple exercise list 页面的同时,展开 action config 弹窗,带入数据,进行配置。 - - 注意,action config 弹窗可能没法全部复用,因为传入的内容参数不一样,也不存在 actiondetail 数据,看怎么修改: - - 是弹窗前 new 一个 ActionDetail 还是写两个不同参数的弹窗。 - -#### 2023-11-13 - -- 基本完成了从训练中新增或点击指定训练,进入动作列表,对动作列表的动作进行修改、删除、新增、调整顺序的功能逻辑。 -- 待完成 - - 流程走通了,页面非常粗糙,很多的地方只是占位,没有实际实现。 - - (**2023-11-13 完成**) action list 中点击修改按钮后,再点击某个指定 action 是进入 action config 弹窗;但还应该正常点击时进入 action detail 弹窗,并且想之前的 exercise list 一样可以上下条切换。 - - 参考实现:传入 action list 以及对应的 index。 - -完成训练的显示细节,或者开始计划(plan)的逻辑。 - -推荐后者,前者功能走通了,后续图片什么的展示导入还比较麻烦。 - -#### 2023-11-14 - -- 旧的计划列表模块走通了流程,修改指定计划中的训练和修改训练中的动作类似,还没做。 - -理清计划列表的逻辑。 - -【核心功能】没有考虑到: - -- 在训练列表中,选择了某个训练,进入了列表,不是修改的话,底部默认应该有个【开始】按钮,然后开始跟练。 - - 这个时候,退出、tts、计时、日志记录等都出来了 -- 同样,在计划列表中,选择了某个计划,就要开始跟踪这个计划的每一个训练的完成度了。 - - 进入指定的训练,点击【开始】,就跟上面一样了。 -- **因此,这两者中模式类似,功能类似,是否可以抽出来,或者复用???** -- 或者,现在的计划都只是用来管理的,查看和编辑等,真正跟练的地方在别处,只能跟练,不能修改;要修改就去数据管理的地方去改好再说。--> **值得考虑,但重构工作较多** - -#### 2023-11-15 - -- 基本搞通了计划的整个流程,新增计划,指定计划中训练的新增、删除、调整顺序以及跳转到训练详情。 - -- 【注意】 - - 整个训练模块、计划模块的细节都没有处理,核心的跟练也没开始。 - - 接下来从最简单的表单细节、各项枚举值整理、组件复用的地方下手;再是用户配置页面;然后批量导入基础运动等;跟练放在最后面去实现。 - -#### 2023-11-23 - -- 基本完成了"计划"模块内容的重新整理。 - -#### 2023-11-26 - -- 基本有了跟练倒计时的页面雏形。 - - 还差的东西: - - 训练模块用户的一些配置信息(比如预设动作之间的休息时间)。 - - 显示的内容组件(比如暂停和继续用一个按钮?现在只有计时的,没有计次,计次是标准动作耗时加次数) - - 如果要随时隐藏倒计时和显示动作的话,统计数据有问题,也不方便。**最好看看倒计时内部的文字能不能该** - - 2023-11-26 解决方法:可以自定义显示的文本,用“重复次数\*标准耗时”作为这个倒计时的秒数,再“倒计时的秒数除以标准耗时然后向上取整”用来当做显示文本; - - 跟练页面点击返回按钮 - - 完成之后,这里页面点返回按钮,应该和弹窗中跳到报告页面一样。 - - ???或者正式的时候,弹窗就直接改为跳到报告页面即可 - - 跟练中点击返回按钮,时暂停,然后询问用户是否确定退出,还是继续等等 - - 存入数据库,和显示报告。 - - 语音 tts 的设计。 - -#### 2023-11-27 - -- **思考** 参考软件的跟练逻辑和现在设计的不一样 - - 休息和跟练的画面不一样 - - 预备 只有第一个动作的图、倒计时、跳过的箭头按钮, - - 休息 只有“+20s” 的按钮和“跳过”休息的按钮,以及下一个动作的基本信息(标题、时间/次数、图片) - - 没有圆的 HH:ss 格式的倒计时 - - 跟练 显示图片、动作标题和使用时间,暂停/继续、上一个、跳过的按钮,没有+20s 的按钮 - - “上一个”是直接到上一个跟练的倒计时,“跳过”是直接来到休息的页面。 - - 圆圈圈的 S 格式倒计时。 -- 如果不按照现在的逻辑,就每个动作完成再切换显示倒计时?用两个不同的组件和用是否休息的标志来区分? - - 就是每轮到一个新的动作、就新创建一个倒计时组件? - -#### 2023-11-28 - -- 基本完成了运动模块的中指定“训练”的跟练功能的雏形(还没有保存训练数据到 db,还没有 tts,细节还待调整) - -#### 2023-12-11 - -- feat:添加了运动日志的 pdf 导出功能. -- feat:添加了所有内嵌数据库表数据导出为 json 文件的功能. diff --git a/readme-user.md b/readme-user.md deleted file mode 100644 index 9d3cf51..0000000 --- a/readme-user.md +++ /dev/null @@ -1,47 +0,0 @@ -## 2023-11-30 新的 user and setting 的进度放到这里 - -### 进度记录 - -#### 2023-11-30 - -- 新增单独的用户信息和配置信息相关的 model 和 db 相关内容,并把之前饮食模块的用户相关操作移除,合并到单独的 user 模块来。 - -#### 2023-12-01 - -- 完成跟练时的休息间隔时间设置。 -- 完成个人配置的体重变化趋势折线图,修改体重和 BMI 的功能。 - -#### 2023-12-02 - -- 完成个人配置的体重趋势图 x 轴间距的放大缩小功能,添加了体重记录数据的管理(可删除,按日期范围查询还没写) -- 测试来看 Android9 及以下没法使用 image_gallery_saver 等相关工具库保存图表,所以小于 9 的不显示保存按钮。 -- 完成训练日志的报告模块基本结构,初步完成日历显示锻炼历史的页面。 -- 完成从训练直接进入跟练完成后记录训练日志(计划中过去的没处理)。 - -#### 2023-12-04 - -- 完成从计划某个训练日进入跟练完成后记录训练日志(暂定从计划进入跟练则不传训练编号)。 -- **需要日志表的冗余设计** - - 【待处理】查询训练日志还真不一定有对应数据:计划跟练之后又有修改,导致某些训练、动作都有变化了,那么 searchTrainedLogWithGroupBasic 这里就一定会报错。 - - 暂时有跟练的计划不让修改,(理论上对应的 action list 也不允许再改了) - - 后续再看如何设计日志表,冗余设计,暂时的日志内容全在表里面,不关联查询其他表,这样其他表计划、训练、动作等都有修改了也不影响日志表。 - - 【饮食记录】也应该类似设置饮食日志表 -- 完成运动报告中简单的“总计”和“最近”tabview 的内容。 - -#### 2023-12-08 - -- feat:添加了 storage 存放 userId;首次使用 app 提供用户输入称呼;完成新增用户和切换使用者;重构修改用户信息; -- todo: - - 所有的非基础数据都要限定使用者,及查询的日志等内容全部是当前 storage 的 id。 - - 修改其他表的 contributor 为 userID,并修改类型为 int - -#### 2023-12-09 - -- refactor:重新整理了目前所有的数据库的表和及其栏位,修改对应的类和属性类型,并修正所有使用到的地方。 -- refactor:把获取缓存用户编号的方式抽成单例模式。 -- feat:新增查看饮食相册的功能,新增修改头像功能。 -- fix:修改获取内部存储权限在 json 文件导入时才询问。 - -#### 2023-12-11 - -- feat: 添加了应用内嵌的数据库中所有数据的备份和恢复功能。