richarjiang
7b4d7c4459
feat(badges): 添加用户勋章系统,支持睡眠挑战勋章自动授予
...
实现完整的用户勋章功能模块:
- 新增 BadgeConfig 和 UserBadge 数据模型,支持勋章配置和用户勋章管理
- 新增 BadgeService 服务,提供勋章授予、查询、展示状态管理等核心功能
- 在挑战服务中集成勋章授予逻辑,完成首次睡眠打卡授予 goodSleep 勋章,完成睡眠挑战授予 sleepChallengeMonth 勋章
- 新增用户勋章相关接口:获取用户勋章列表、获取可用勋章列表、标记勋章已展示
- 支持勋章分类(睡眠、运动、饮食等)、排序、启用状态管理
- 支持勋章来源追踪(挑战、系统、手动授予)和元数据记录
2025-11-14 17:08:02 +08:00
richarjiang
f04c2ccd5d
feat(medications): 添加药物超时提醒功能
...
在MedicationRecord模型中添加overdueReminderSent字段追踪超时提醒状态,在提醒服务中新增定时任务检查超过服药时间1小时的未服用记录,并向用户发送鼓励提醒。该功能每10分钟检查一次,避免重复发送提醒,帮助用户及时补服错过的药物。
2025-11-14 14:47:44 +08:00
richarjiang
5a9be42a93
feat(medications): 添加药品AI分析功能,支持智能用药指导
...
新增基于GLM-4.5V大模型的药品AI分析服务,为用户提供专业的用药指导和健康建议:
- 新增MedicationAnalysisService服务,集成GLM视觉和文本模型
- 实现流式SSE响应,支持实时返回AI分析结果
- 药品模型新增aiAnalysis字段,持久化存储分析结果
- 添加药品识别度判断,无法识别时引导用户补充信息
- 集成用户使用次数限制,免费用户次数用完后提示开通会员
- 支持图片识别分析,结合药品外观提供更准确的建议
- 提供全面的用药指导:适应症、用法用量、注意事项、副作用等
2025-11-12 17:07:39 +08:00
richarjiang
e6f3c79104
refactor(medications): 简化服药时间更新逻辑,采用删除重建策略
...
将更新服药时间的处理方式从复杂的记录更新逻辑改为删除当天记录并重新生成。
这样做的好处:
- 简化代码逻辑,移除了 updateTodayUntakenRecords 方法及其 75 行代码
- 与激活状态更新的处理方式保持一致,提高代码可维护性
- 避免了时间匹配和记录排序的复杂性,更加可靠
- 系统会在定时任务中自动根据新的服药时间重新生成正确的记录
2025-11-11 15:54:09 +08:00
richarjiang
d9c144ff87
feat(medications): 添加提醒发送状态追踪,防止重复推送
...
- 新增 reminder_sent 字段到服药记录表,用于标记提醒发送状态
- 添加数据库索引优化未发送提醒记录的查询性能
- 提醒检查频率从 5 分钟优化至 1 分钟,提升及时性
- 添加主进程检测机制,避免多进程环境下重复发送提醒
- 增强错误处理和发送结果统计功能
2025-11-11 11:13:44 +08:00
richarjiang
2850eba7cf
feat(medications): 优化药物删除功能,添加事务处理和批量操作
...
- 在药物删除时使用事务确保数据一致性
- 删除药物时同时软删除所有相关用药记录
- 优化删除操作性能,使用批量更新替代循环删除
- 扩展删除范围,从删除未服用记录改为删除当天所有记录
- 添加完善的错误处理和日志记录
2025-11-10 14:46:10 +08:00
richarjiang
e25002e018
feat(medications): 新增药物激活状态管理及相关记录更新功能
2025-11-10 11:04:36 +08:00
richarjiang
188b4addca
feat(medications): 新增完整的药物管理和服药提醒功能
...
实现了包含药物信息管理、服药记录追踪、统计分析、自动状态更新和推送提醒的完整药物管理系统。
核心功能:
- 药物 CRUD 操作,支持多种剂型和自定义服药时间
- 惰性生成服药记录策略,查询时才生成当天记录
- 定时任务自动更新过期记录状态(每30分钟)
- 服药前15分钟自动推送提醒(每5分钟检查)
- 每日/范围/总体统计分析功能
- 完整的 API 文档和数据库建表脚本
技术实现:
- 使用 Sequelize ORM 管理 MySQL 数据表
- 集成 @nestjs/schedule 实现定时任务
- 复用现有推送通知系统发送提醒
- 采用软删除和权限验证保障数据安全
2025-11-07 17:29:11 +08:00
richarjiang
37cc2a729b
feat(push-notifications): 新增挑战提醒定时推送功能
...
新增每日定时推送系统,根据用户参与状态发送不同类型的挑战提醒:
- 已参与用户:每日发送鼓励推送
- 未参与用户:隔天发送挑战邀请
- 匿名用户:隔天发送通用邀请
包含推送历史记录表、定时任务调度、多类型文案模板和防重复发送机制
2025-11-03 17:49:14 +08:00
richarjiang
3a3939e1ba
根据提供的 git diff,我来分析这次变更:
...
## 变更分析
这次提交主要涉及 APNs 推送通知功能的优化:
1. **apns.provider.ts** 的变更:
- 重构了通知选项的构建逻辑,将 alert 设置为顶层属性
- 增强了 `createDeviceNotification` 方法,完整复制所有通知选项(badge、sound、contentAvailable、mutableContent、priority、type、data)
- 移除了未使用的 aps 对象
2. **push-notifications.service.ts** 的变更:
- 移除了冗余的 `alert` 字段
- 新增了更多 APNs 通知选项:priority、expiry、collapseId、mutableContent、contentAvailable
这是一次功能增强和代码重构,主要目的是完善 APNs 推送通知的配置选项支持。
## 建议的提交信息
feat(push-notifications): 完善APNs推送通知配置选项支持
- 重构通知选项构建逻辑,优化alert属性设置
- createDeviceNotification方法新增完整选项复制(badge、sound、contentAvailable、mutableContent、priority、type、data)
- 推送服务新增priority、expiry、collapseId、mutableContent、contentAvailable等配置项支持
- 移除冗余的alert字段设置
2025-11-03 17:31:31 +08:00
richarjiang
fa9b28a98f
feat(push-notifications): 新增更新令牌用户ID功能
...
添加新的API端点用于更新设备推送令牌绑定的用户ID,包括:
- 新增UpdateTokenUserIdDto和UpdateTokenUserIdResponseDto
- 在控制器中添加updateTokenUserId端点
- 在服务层实现updateTokenUserId方法
- 在push-token服务中添加底层更新逻辑
- 优化推送测试服务,仅在主进程中执行
2025-11-03 17:08:56 +08:00
richarjiang
200484ce39
feat(push-notifications): 将推送测试改为基于挑战的个性化提醒
...
重构推送测试服务,从简单的测试推送改为针对正在进行中挑战的个性化提醒推送。
新增功能包括:
- 获取正在进行中的挑战和活跃参与者
- 根据挑战类型生成个性化推送内容
- 为挑战参与者发送针对性的提醒推送
- 支持多种挑战类型的推送模板(饮水、运动、饮食、心情、睡眠、体重管理)
2025-11-03 16:11:30 +08:00
richarjiang
fa8feb309d
perf: 优化脚本
2025-10-29 10:15:21 +08:00
richarjiang
d89adaf19a
feat(diet-records): 新增营养成分分析免费使用次数限制
...
在营养成分分析功能中添加免费使用次数检查和扣减机制,非VIP用户免费次数用尽时将无法使用该功能。分析成功后自动扣减用户免费次数,确保资源合理使用。
2025-10-16 17:17:38 +08:00
richarjiang
66a9e65d9b
feat(diet-records): 新增营养成分分析记录删除功能
...
添加删除营养成分分析记录的API端点,支持软删除机制
- 新增DELETE /nutrition-analysis-records/:id接口
- 添加DeleteNutritionAnalysisRecordResponseDto响应DTO
- 在NutritionAnalysisService中实现deleteAnalysisRecord方法
- 包含完整的权限验证和错误处理逻辑
2025-10-16 16:43:42 +08:00
richarjiang
1fe969aa97
feat(diet-records): 修复营养成分分析记录查询参数验证和类型转换
...
修复GET请求查询参数验证装饰器缺失问题,添加正确的class-validator装饰器
在控制器中实现查询参数类型转换,确保数字参数正确处理
更新技术文档,添加DTO验证装饰器编写规范和GET请求参数处理指南
2025-10-16 16:26:58 +08:00
richarjiang
a2c719f10a
perf: 初始化
2025-10-16 12:15:41 +08:00
richarjiang
4d1bc9259b
feat(diet-records): 新增营养成分分析记录功能
...
- 添加营养成分分析记录数据模型和数据库集成
- 实现分析记录保存功能,支持成功和失败状态记录
- 新增获取用户营养成分分析记录的API接口
- 支持按日期范围、状态等条件筛选查询
- 提供分页查询功能,优化大数据量场景性能
2025-10-16 11:25:31 +08:00
richarjiang
91cac3134e
refactor(api): 统一API响应格式规范
...
重构营养成分分析相关接口,统一使用base.dto.ts中定义的通用响应结构体ApiResponseDto,规范所有接口返回格式。更新AI模型prompt以返回标准化的code、msg、data结构,并添加相应的验证装饰器确保数据完整性。
2025-10-16 11:16:33 +08:00
richarjiang
2f2901a0bf
Merge branch 'feature/push'
2025-10-16 10:04:09 +08:00
richarjiang
5c2c9dfae8
feat(diet-records): 新增营养成分表图片分析功能
...
- 添加营养成分表图片识别API接口,支持通过AI模型分析食物营养成分
- 新增NutritionAnalysisService服务,集成GLM-4.5V和Qwen VL视觉模型
- 实现营养成分提取和健康建议生成功能
- 添加完整的API文档和TypeScript类型定义
- 支持多种营养素类型识别,包括热量、蛋白质、脂肪等20+种营养素
2025-10-16 10:03:22 +08:00
richarjiang
cc83b84c80
feat(push): 新增设备推送和测试功能
...
- 新增基于设备令牌的推送通知接口
- 添加推送测试服务,支持应用启动时自动测试
- 新增推送测试文档说明
- 更新 APNS 配置和日志记录
- 迁移至 apns2 库的 PushType 枚举
- 替换订阅密钥文件
- 添加项目规则文档
2025-10-15 19:09:51 +08:00
richarjiang
38dd740c8c
feat(push): migrate APNs provider from @parse/node-apn to apns2 library
...
- Replace @parse/node-apn with apns2 for improved APNs integration
- Update ApnsProvider to use new ApnsClient with modern API
- Refactor notification creation and sending logic for better error handling
- Add proper error event listeners for device token issues
- Update configuration interface to match apns2 requirements
- Modify push notification endpoints to allow public access for token registration
- Update service methods to handle new response format from apns2
- Add UsersModule dependency to PushNotificationsModule
2025-10-14 19:25:30 +08:00
richarjiang
305a969912
feat: 支持 push
2025-10-11 17:38:04 +08:00
a2ac667668
perf
2025-10-01 22:55:34 +08:00
4d1b8910f8
feat(challenges): 修改挑战列表过滤条件为只显示正在进行的挑战
2025-10-01 22:54:03 +08:00
richarjiang
999fc7f793
feat(challenges): 支持公开访问挑战列表与详情接口
...
- 在 GET /challenges、GET /challenges/:id、GET /challenges/:id/rankings 添加 @Public() 装饰器,允许未登录用户访问
- 将 userId 改为可选参数,未登录时仍可返回基础数据
- 列表接口过滤掉 UPCOMING 状态挑战,仅展示进行中/已结束
- 返回 DTO 新增 unit 字段,用于前端展示进度单位
- 鉴权守卫优化:公开接口若携带 token 仍尝试解析并注入 user,方便后续业务逻辑
2025-09-30 16:43:46 +08:00
richarjiang
87c3cbfac9
feat(challenges): 新增分页排行榜接口并重构排行逻辑
...
- 新增 GET /challenges/:id/rankings 接口,支持分页查询排行榜
- 抽离 buildChallengeRankings 方法,统一排行榜数据构建逻辑
- 新增 ChallengeRankingListDto 与 GetChallengeRankingQueryDto 用于接口数据校验
- 优化挑战列表排序逻辑,按状态优先级与时间排序
- 修复排行榜索引计算错误,确保分页场景下排名正确
2025-09-30 11:17:31 +08:00
richarjiang
f13953030b
feat(challenges): 新增今日上报值与目标值字段至排行榜接口
2025-09-29 17:22:10 +08:00
richarjiang
12acbbd166
feat(challenges): 新增今日打卡状态字段并更新进度构建逻辑
...
- 在 ChallengeProgressDto 中增加 checkedInToday 字段
- 修改 buildChallengeProgress 方法,支持传入 lastProgressAt 参数
- 所有调用处同步更新,确保返回包含今日打卡状态
- 使用 dayjs 判断最后进度时间是否为今日
2025-09-29 17:12:54 +08:00
richarjiang
64460a9d68
feat(challenges): 新增挑战类型字段并重构进度上报逻辑
...
- 数据库新增 type 列区分 water/exercise/diet/mood/sleep/weight 六类挑战
- 进度上报由增量模式改为绝对值模式,字段 increment_value → reportedValue
- 服务层按 challenge.targetValue 判断当日是否完成,再按 minimumCheckInDays 统计总进度
- 相关 DTO 与模型同步更新,支持新类型返回
BREAKING CHANGE: 上报接口字段由 increment 改为 value,且为当日绝对值
2025-09-29 15:14:48 +08:00
richarjiang
d87fc84575
feat(challenges): 使用 minimumCheckInDays 统一进度目标计算
...
将挑战完成目标从 targetValue/progressUnit 改为 minimumCheckInDays 字段驱动,确保列表、详情、加入、打卡各场景使用一致的完成天数标准,并移除前端展示字段 badge/subtitle。
2025-09-29 10:25:20 +08:00
richarjiang
22fcf694a6
fix(db): 统一字符集排序规则并修复时间戳类型
...
- 新增 SQL 脚本统一表与列字符集为 utf8mb4_unicode_ci
- 移除建表语句冗余 COLLATE 子句,由全局配置控制
- 将挑战起止时间字段由 Date 改为 BIGINT 时间戳,避免时区与精度问题
- 补充 Winston 日志追踪挑战详情查询性能
- 数据库模块新增 charset 与 collate 全局配置,确保后续表一致性
BREAKING CHANGE: challenge.startAt/endAt 由 Date 变更为 number(毫秒时间戳),调用方需同步调整类型
2025-09-29 09:59:06 +08:00
richarjiang
ae8039c9ed
feat(challenges): 新增每日进度上报防重复机制
...
- 创建 t_challenge_progress_reports 表记录用户每日上报
- 通过唯一索引 (challenge_id, user_id, report_date) 确保每日仅一次有效上报
- 更新 progress 时先写入报告表,冲突则直接返回当前进度
- 模块中新增 ChallengeProgressReport 模型及相关依赖
2025-09-28 12:13:31 +08:00
richarjiang
1b7132a325
feat(challenges): 新增挑战功能模块及完整接口实现
...
- 新增挑战列表、详情、加入/退出、进度上报等 REST 接口
- 定义 Challenge / ChallengeParticipant 数据模型与状态枚举
- 提供排行榜查询与用户排名计算
- 包含接口文档与数据库初始化脚本
2025-09-28 12:02:39 +08:00
richarjiang
8e51994e71
feat: 支持会员编号
2025-09-26 08:48:22 +08:00
richarjiang
21b00cee0d
fix: 优化围度数据计算逻辑
2025-09-24 18:03:32 +08:00
richarjiang
c9eda4577f
feat(users): 新增围度分析报表接口
...
- 添加 dayjs 依赖用于日期处理
- 新增 GetBodyMeasurementAnalysisDto 和 GetBodyMeasurementAnalysisResponseDto
- 支持按周、月、年三种时间范围统计围度变化趋势
- 实现最近数据点匹配算法,返回各围度类型最接近时间点的测量值
2025-09-24 17:51:57 +08:00
richarjiang
e2fcb1c428
feat(users): 添加身体围度测量功能
...
新增用户身体围度的完整功能模块,包括数据库迁移、模型定义、API接口和历史记录追踪。
支持胸围、腰围、上臀围、臂围、大腿围、小腿围六项身体围度指标的管理。
- 添加数据库迁移脚本,扩展用户档案表字段
- 创建围度历史记录表用于数据追踪
- 实现围度数据的更新和历史查询API
- 添加数据验证和错误处理机制
2025-09-22 09:49:42 +08:00
dc06dfbebd
perf:修复健康数据
2025-09-12 23:00:49 +08:00
richarjiang
cf02fda4ec
chore: 调整用户控制器日志级别并新增文件信息记录
2025-09-12 15:48:39 +08:00
richarjiang
090b91e72d
feat: 支持图片上传接口
2025-09-12 14:23:18 +08:00
richarjiang
97e6a0ff6d
feat: 添加GLM-4.5V和DashScope模型支持,优化饮食分析服务的API调用
2025-09-04 10:16:24 +08:00
richarjiang
d34f752776
feat: 新增食物识别API,调整字段名,扩展识别功能与提示逻辑
2025-09-04 09:36:07 +08:00
richarjiang
02f21f0858
feat(water-records): 优化创建喝水记录和获取记录列表的日期处理逻辑
2025-09-02 15:27:21 +08:00
richarjiang
730b1df35e
feat: 更新喝水统计功能,支持指定日期查询并返回相应数据
2025-09-02 11:32:22 +08:00
richarjiang
2c2e964199
feat(water-records): 新增喝水记录功能模块
...
新增完整的喝水记录管理功能,支持用户记录每日喝水情况、设置目标和查看统计信息。功能包括:
- 创建、查询、更新和删除喝水记录
- 设置和管理每日喝水目标
- 获取今日喝水统计和完成率分析
- 支持分页查询和日期范围筛选
- 完整的数据验证和错误处理机制
该模块已从用户模块中独立出来,提供REST API接口,包含数据库迁移脚本和详细文档。
2025-09-01 11:02:13 +08:00
richarjiang
0488fe62a1
feat: 添加食物识别功能,支持根据图片URL识别食物并转换为饮食记录格式
2025-08-31 14:14:33 +08:00
d0b02b6228
feat: 新增用户食物收藏功能
...
- 创建用户食物收藏表 `t_user_food_favorites`,用于存储用户收藏的食物信息。
- 在 `FoodLibraryController` 中添加收藏和取消收藏食物的 API 接口。
- 在 `FoodLibraryService` 中实现收藏和取消收藏的业务逻辑,并获取用户收藏的食物 ID 列表。
- 更新 DTO 以支持食物是否已收藏的状态。
2025-08-29 21:03:55 +08:00
richarjiang
6542988cb6
feat: 支持用户自定义食物
2025-08-29 15:57:28 +08:00