richarjiang
ac231a7742
feat(challenges): 支持自定义挑战类型并优化必填字段验证
...
- 新增 CUSTOM 挑战类型枚举值
- requirementLabel 字段改为可选,允许为空并添加默认值处理
- minimumCheckInDays 最大值从 365 提升至 1000,支持更长周期挑战
- 推送通知模板支持自定义挑战的动态文案生成
- 新增 getCustomEncouragementTemplate 和 getCustomInvitationTemplate 函数
2025-11-27 11:11:26 +08:00
richarjiang
7a05097226
feat(challenges): add vip user restrictions for challenge creation
...
限制非会员用户只能创建一个未归档的自定义挑战,添加用户VIP状态检查和挑战数量限制逻辑
2025-11-27 08:33:46 +08:00
richarjiang
5d64a99ce5
feat(challenges): 添加挑战创建者标识和归档状态过滤
...
- 为挑战详情和列表接口添加isCreator字段标识创建者
- 过滤掉已归档的挑战,避免在列表和操作中显示
- 为挑战详情接口添加JWT认证守卫
- 将自定义挑战的progressUnit字段设为必填
- 优化挑战编辑时的错误提示信息
- 移除冗余的isCreator私有方法,直接在响应中设置标识
2025-11-26 18:57:13 +08:00
richarjiang
26e88ae610
feat(challenges): 添加挑战源和分享代码字段,更新挑战详情和列表接口
2025-11-26 17:26:27 +08:00
richarjiang
029b8f46b9
feat(challenges): 更新自定义挑战功能,支持时间戳转换及数据模型调整
2025-11-26 10:43:42 +08:00
richarjiang
93b4fcf553
feat(challenges): 添加用户自定义挑战功能及分享机制
...
实现完整的自定义挑战系统,支持用户创建、分享和管理个人挑战:
- 数据库扩展:添加 source、creator_id、share_code、is_public、max_participants、challenge_state 字段
- 分享机制:自动生成6位唯一分享码,支持公开和私密模式
- API接口:创建挑战、通过分享码加入、获取创建列表、更新归档挑战、重新生成分享码
- 权限控制:创建者专属编辑权限,频率限制防滥用(每日5个)
- 业务逻辑:人数限制检查、挑战状态流转、参与者统计
- 文档完善:使用文档和部署指南,包含API示例和回滚方案
兼容现有系统挑战,使用相同的打卡、排行榜和勋章系统
2025-11-25 19:07:09 +08:00
richarjiang
2d1d43922d
feat(users): 添加公共访问权限以获取可用勋章列表
2025-11-25 15:45:28 +08:00
richarjiang
f8fcc81438
feat(medications): 增强AI药品识别质量控制和多图片支持
...
- 新增图片可读性预检查机制,识别前先判断图片质量
- 设置置信度阈值为60%,低于阈值自动识别失败
- 支持多图片上传(正面、侧面、辅助图片)提高识别准确度
- 完善识别失败场景的错误分类和用户指导提示
- 新增药品有效期字段支持
- 优化AI提示词,强调安全优先原则
- 更新模型版本为 glm-4.5v 和 glm-4.5-air
数据库变更:
- Medication表新增 sideImageUrl, auxiliaryImageUrl, expiryDate 字段
- DTO层同步支持新增字段的传递和更新
质量控制策略:
- 图片模糊或不可读时直接返回失败
- 无法识别药品名称时主动失败
- 置信度<60%时拒绝识别,建议重新拍摄
- 宁可识别失败也不提供不准确的药品信息
2025-11-21 16:59:36 +08:00
richarjiang
a17fe0b965
feat(medications): 增加基于视觉AI的药品智能录入系统
...
构建了从照片到药品档案的自动化处理流程,通过GLM多模态大模型实现药品信息的智能采集:
核心能力:
- 创建任务追踪表 t_medication_recognition_tasks 存储识别任务状态
- 四阶段渐进式分析:基础识别→人群适配→成分解析→风险评估
- 提供三个REST端点支持任务创建、进度查询和结果确认
- 前端可通过轮询方式获取0-100%的实时进度反馈
- VIP用户免费使用,普通用户按次扣费
技术实现:
- 利用GLM-4V-Plus模型处理多角度药品图像(正面+侧面+说明书)
- 采用GLM-4-Flash模型进行文本深度分析
- 异步任务执行机制避免接口阻塞
- 完整的异常处理和任务失败恢复策略
- 新增AI_RECOGNITION.md文档详细说明集成方式
同步修复:
- 修正会员用户AI配额扣减逻辑,避免不必要的次数消耗
- 优化APNs推送中无效设备令牌的检测和清理流程
- 将服药提醒的提前通知时间从15分钟缩短为5分钟
2025-11-21 10:27:59 +08:00
richarjiang
75fbea2c90
feat(users): 更新用户最后登录时间记录功能
2025-11-20 19:04:38 +08:00
richarjiang
afe6ae1c6a
feat(medications): 实现V2版本药品AI分析功能及结构化数据支持
...
- 新增 V2 版药品分析服务,通过 AI 生成包含适用人群、副作用等字段的结构化 JSON 数据
- 添加 `POST :id/ai-analysis/v2` 接口,集成用户免费次数校验与自动扣费逻辑
- 在药品创建流程中增加异步触发自动 AI 分析的机制
- fix(users): 修复 Apple 登录未获取到邮箱时的报错问题,改为自动生成随机唯一邮箱
- perf(medications): 将服药提醒定时任务的检查频率调整为每 5 分钟一次
- refactor(push-notifications): 移除不再使用的 PushTestService
2025-11-20 17:55:05 +08:00
richarjiang
07fae9bdc0
refactor(push-notifications): 移除推送测试服务模块
...
删除PushTestService及其相关依赖,该服务用于在应用启动时执行挑战相关的推送测试。移除内容包括:
- 删除push-test.service.ts文件(287行代码)
- 从push-notifications.module.ts中移除PushTestService的导入和注册
- 移除了挑战提醒推送测试、活跃参与者查询等测试功能
此变更简化了推送通知模块结构,移除了仅用于测试目的的代码。
2025-11-18 15:33:05 +08:00
richarjiang
bbc6924f5b
feat(users): 添加会员状态自动同步验证功能
...
- 新增登录时异步触发会员状态验证机制,不阻塞响应
- 实现5分钟频率限制,避免过度调用RevenueCat API
- 重构API调用方法,分别获取subscriptions和purchases数据
- 支持终身会员识别和有效期自动更新
- 添加内存缓存记录最后验证时间
- 完善错误处理和日志记录,确保主流程不受影响
2025-11-18 15:31:37 +08:00
1c033cd801
feat(badges): 更新勋章系统,支持UUID作为勋章ID类型
...
feat(challenges): 优化进度报告,添加睡眠挑战勋章授予逻辑
fix(push-notifications): 修复推送测试服务初始化返回值问题
2025-11-15 23:25:02 +08:00
9c7bcb6083
feat(medications): 添加药品分析日志记录功能
2025-11-15 21:18:29 +08:00
richarjiang
bac75f82ba
feat(challenges): 在挑战列表和详情中添加勋章信息展示
...
为睡眠挑战类型添加勋章信息支持,在挑战列表和详情接口中返回 sleepChallengeMonth 勋章配置数据。
- 在 ChallengesModule 中注册 BadgeConfig 模型
- 在 ChallengesService 中注入 BadgeConfig 仓库
- 查询列表时,若存在睡眠挑战则预加载勋章配置
- 查询详情时,若为睡眠挑战则附加勋章信息
- 在 DTO 中新增 BadgeInfoDto 接口定义勋章数据结构
- 仅对激活状态的 sleepChallengeMonth 勋章进行查询和展示
2025-11-14 17:26:41 +08:00
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