2026/3/11 23:48:19
网站建设
项目流程
wordpress 点赞打赏,网站SEO优化托管,制作简易网站,江阴网站的建设冥想放松计时工具 - 全栈开发实践 1. 实际应用场景描述 本工具面向高压职场人群、学生群体、心理咨询师以及正念练习爱好者#xff0c;提供科学化的数字冥想体验。在快节奏的现代生活中#xff0c;焦虑、失眠、注意力涣散已成为普遍问题。 典型使用场景#xff1a; - 晨间唤…冥想放松计时工具 - 全栈开发实践1. 实际应用场景描述本工具面向高压职场人群、学生群体、心理咨询师以及正念练习爱好者提供科学化的数字冥想体验。在快节奏的现代生活中焦虑、失眠、注意力涣散已成为普遍问题。典型使用场景- 晨间唤醒上班族早起5分钟正念冥想开启清醒状态- 午休恢复程序员下午2点困倦时10分钟呼吸练习- 睡前放松焦虑失眠者15分钟身体扫描改善睡眠质量- 学习间隙学生考试前通过冥想调节考试焦虑- 团体辅导心理咨询师引导多人同时进行冥想练习用户画像分析- 25-40岁互联网从业者工作压力大追求效率- 大学生群体面临学业和就业双重压力- 创意工作者需要灵感激发和情绪调节- 慢病康复人群需要非药物辅助治疗手段2. 引入痛点分析2.1 现有解决方案的局限性1. 功能单一化多数APP仅提供计时器缺乏科学指导2. 音频质量参差背景音效不专业影响冥想效果3. 数据无沉淀只有简单记录缺少趋势分析和成长激励4. 社交属性弱缺乏同伴支持和专业反馈机制5. 商业化过重免费功能受限付费墙影响用户体验2.2 市场机会洞察- 中国心理健康服务市场预计2025年达1350亿元- 疫情后正念冥想用户增长300%以上- 企业员工心理健康管理成为HR新需求- 政策层面支持健康中国2030心理服务体系建设3. 核心逻辑深度解析3.1 系统架构设计graph TBA[表现层] -- B[应用层]B -- C[领域层]C -- D[基础设施层]A --|用户交互| BB --|业务处理| CC --|数据操作| DE[音频引擎] --|音效处理| BF[数据分析] --|统计报告| CG[通知服务] --|提醒推送| Bsubgraph 技术实现A(CLI/GUI/Web)B(Python Services)C(Domain Models)D(SQLite/PostgreSQL)endsubgraph 外部集成H[音频CDN]I[云存储]J[推送服务]end3.2 核心算法逻辑3.2.1 渐进式音频引导算法def generate_guided_audio(duration_minutes: int, user_level: str) - AudioTrack:生成个性化引导音频基于用户经验和冥想时长动态调整引导密度guidance_intervals {beginner: {5: 2, 10: 4, 15: 6}, # 5分钟2次引导intermediate: {5: 1, 10: 2, 15: 3},advanced: {5: 0, 10: 1, 15: 2}}base_tracks load_base_audio_tracks(duration_minutes)guidance_points calculate_guidance_timing(duration_minutes, guidance_intervals[user_level])mixed_audio mix_audio_tracks(base_tracks, guidance_points)return apply_fade_effects(mixed_audio)3.2.2 放松效果评估模型def calculate_relaxation_score(session_data: dict) - float:基于多维度数据计算放松效果评分使用加权算法综合评估冥想质量weights {completion_rate: 0.3, # 完成率权重consistency: 0.25, # 规律性权重duration_adequacy: 0.2, # 时长适当性user_feedback: 0.15, # 主观反馈physiological_proxy: 0.1 # 生理代理指标}scores {completion_rate: session_data[completed] / session_data[planned],consistency: calculate_streak_score(session_data[history]),duration_adequacy: evaluate_duration_fit(session_data),user_feedback: session_data.get(rating, 3) / 5,physiological_proxy: estimate_stress_reduction(session_data)}return sum(scores[factor] * weights[factor] for factor in weights)3.3 数据流设计sequenceDiagramparticipant U as 用户participant UI as 用户界面participant AS as 音频服务participant TS as 计时服务participant DS as 数据服务participant AN as 分析报告U-UI: 选择冥想模式(5/10/15分钟)UI-AS: 请求对应音频文件AS--UI: 返回音频URLUI-TS: 开始计时TS-AS: 播放引导音频loop 实时监测TS-DS: 记录进度数据DS-AN: 更新实时统计endTS-U: 结束提示U-UI: 提交体验反馈UI-DS: 保存完整记录DS-AN: 生成周期报告AN--UI: 返回可视化报告4. 模块化实现4.1 领域模型层# core/domain/models.py冥想领域模型层定义核心业务实体和值对象from dataclasses import dataclass, fieldfrom datetime import datetime, timedeltafrom enum import Enumfrom typing import List, Optional, Dictimport uuidclass MeditationLevel(Enum):冥想熟练度等级BEGINNER beginnerINTERMEDIATE intermediateADVANCED advancedclass SessionStatus(Enum):冥想会话状态SCHEDULED scheduledIN_PROGRESS in_progressCOMPLETED completedINTERRUPTED interrupteddataclassclass AudioTrack:音频轨道值对象track_id: strduration_seconds: intfile_path: strvolume_level: float 0.7fade_in_seconds: int 3fade_out_seconds: int 5def validate(self) - bool:验证音频参数有效性return (0 self.volume_level 1.0 andself.fade_in_seconds 0 andself.fade_out_seconds 0 andself.duration_seconds 0)dataclassclass MeditationSession:冥想会话实体session_id: str field(default_factorylambda: str(uuid.uuid4()))user_id: str planned_duration: int 600 # 默认10分钟(秒)actual_duration: int 0level: MeditationLevel MeditationLevel.BEGINNERstatus: SessionStatus SessionStatus.SCHEDULEDstarted_at: Optional[datetime] Noneended_at: Optional[datetime] Noneinterruptions: int 0user_rating: Optional[int] None # 1-5星评价notes: str def start_session(self) - None:开始冥想会话if self.status ! SessionStatus.SCHEDULED:raise InvalidSessionStateError(Can only start scheduled sessions)self.status SessionStatus.IN_PROGRESSself.started_at datetime.now()def end_session(self, rating: Optional[int] None, notes: str ) - None:结束冥想会话if self.status ! SessionStatus.IN_PROGRESS:raise InvalidSessionStateError(Can only end in-progress sessions)self.status SessionStatus.COMPLETEDself.ended_at datetime.now()self.actual_duration int((self.ended_at - self.started_at).total_seconds())self.user_rating ratingself.notes notesdef add_interruption(self) - None:记录中断if self.status SessionStatus.IN_PROGRESS:self.interruptions 1propertydef completion_rate(self) - float:计算完成率if self.planned_duration 0:return 0.0return min(self.actual_duration / self.planned_duration, 1.0)propertydef duration_category(self) - str:时长分类minutes self.planned_duration // 60if minutes 5:return shortelif minutes 15:return mediumelse:return longclass MeditationUserProfile:冥想用户画像def __init__(self, user_id: str):self.user_id user_idself.total_sessions: int 0self.total_duration_minutes: int 0self.current_streak_days: int 0self.longest_streak_days: int 0self.preferred_duration: int 600 # 默认偏好10分钟self.level: MeditationLevel MeditationLevel.BEGINNERself.join_date: datetime datetime.now()def update_after_session(self, session: MeditationSession) - None:会话结束后更新用户画像self.total_sessions 1self.total_duration_minutes session.actual_duration // 60# 根据用户表现调整熟练度self._evaluate_level_up(session)def _evaluate_level_up(self, session: MeditationSession) - None:评估是否需要升级熟练度if (self.level MeditationLevel.BEGINNER andself.total_sessions 10 andsession.completion_rate 0.8):self.level MeditationLevel.INTERMEDIATE4.2 应用服务层# core/services/meditation_service.py冥想核心业务逻辑服务import asynciofrom datetime import datetime, timedeltafrom typing import List, Optional, Dict, Anyimport loggingfrom contextlib import asynccontextmanagerfrom ..domain.models import (MeditationSession, MeditationLevel, SessionStatus,MeditationUserProfile)from ..infrastructure.repositories import SessionRepository, UserRepositoryfrom ..infrastructure.audio_provider import AudioProviderfrom ..utils.validators import validate_duration, validate_user_idlogger logging.getLogger(__name__)class MeditationService:冥想业务服务def __init__(self, session_repo: SessionRepository,user_repo: UserRepository,audio_provider: AudioProvider):self.session_repo session_repoself.user_repo user_repoself.audio_provider audio_providerself.active_timers: Dict[str, asyncio.Task] {}async def start_meditation_session(self, user_id: str,duration_minutes: int,level: MeditationLevel MeditationLevel.BEGINNER) - MeditationSession:开始新的冥想会话# 输入验证validate_user_id(user_id)if not validate_duration(duration_minutes):raise ValueError(Duration must be 5, 10, or 15 minutes)# 获取或创建用户画像user_profile await self.user_repo.get_or_create_user(user_id)# 创建会话实例duration_seconds duration_minutes * 60session MeditationSession(user_iduser_id,planned_durationduration_seconds,levellevel)# 获取对应音频audio_track await self.audio_provider.get_audio_track(duration_minutes, level)# 保存到数据库await self.session_repo.save_session(session)# 启动后台计时任务timer_task asyncio.create_task(self._session_timer(session.session_id, duration_seconds))self.active_timers[session.session_id] timer_tasklogger.info(fStarted meditation session {session.session_id} for user {user_id})return sessionasync def _session_timer(self, session_id: str, duration_seconds: int) - None:会话计时器后台任务try:# 等待指定时长await asyncio.sleep(duration_seconds)# 时间到标记会话完成session await self.session_repo.get_session(session_id)if session and session.status SessionStatus.IN_PROGRESS:session.end_session()await self.session_repo.save_session(session)# 更新用户画像user_profile await self.user_repo.get_user(session.user_id)if user_profile:user_profile.update_after_session(session)await self.user_repo.save_user(user_profile)logger.info(fSession {session_id} completed automatically)except Exception as e:logger.error(fError in session timer for {session_id}: {e})finally:# 清理定时器引用self.active_timers.pop(session_id, None)async def interrupt_session(self, session_id: str, reason: str ) - bool:中断正在进行的会话session await self.session_repo.get_session(session_id)if not session or session.status ! SessionStatus.IN_PROGRESS:return Falsesession.add_interruption()session.status SessionStatus.INTERRUPTEDsession.notes f\nInterrupted: {reason} if reason else \nInterruptedawait self.session_repo.save_session(session)# 取消后台计时任务timer_task self.active_timers.pop(session_id, None)if timer_task:timer_task.cancel()logger.info(fSession {session_id} interrupted: {reason})return Trueasync def submit_session_feedback(self, session_id: str, rating: int,notes: str ) - bool:提交会话反馈if not (1 rating 5):raise ValueError(Rating must be between 1 and 5)session await self.session_repo.get_session(session_id)if not session:return Falsesession.user_rating ratingsession.notes f\nFeedback: {notes} if notes else await self.session_repo.save_session(session)return Trueasync def get_user_statistics(self, user_id: str,days: int 30) - Dict[str, Any]:获取用户冥想统计数据end_date datetime.now()start_date end_date - timedelta(daysdays)sessions await self.session_repo.get_user_sessions(user_id, start_date, end_date)if not sessions:return self._empty_statistics()# 计算各种统计指标total_sessions len(sessions)completed_sessions [s for s in sessions if s.status SessionStatus.COMPLETED]total_minutes sum(s.actual_duration for s in completed_sessions) // 60# 计算平均完成率completion_rates [s.completion_rate for s in completed_sessions]avg_completion sum(completion_rates) / len(completion_rates) if completion_rates else 0# 计算连续天数streak_info self._calculate_streak(sessions)return {period_days: days,total_sessions: total_sessions,completed_sessions: len(completed_sessions),completion_rate: avg_completion,total_minutes: total_minutes,average_session_minutes: total_minutes / len(completed_sessions) if completed_sessions else 0,current_streak_days: streak_info[current],longest_streak_days: streak_info[longest],preferred_duration: self._get_preferred_duration(sessions),sessions_per_week: total_sessions / (days / 7)}def _calculate_streak(self, sessions: List[MeditationSession]) - Dict[str, int]:计算连续冥想天数if not sessions:return {current: 0, longest: 0}# 按日期分组session_dates set()for session in sessions:if session.status SessionStatus.COMPLETED and session.ended_at:session_dates.add(session.ended_at.date())if not session_dates:return {current: 0, longest: 0}# 计算最长连续天数sorted_dates sorted(session_dates)longest_streak self._longest_consecutive_days(sorted_dates)# 计算当前连续天数today datetime.now().date()current_streak 0if today in session_dates:current_streak 1check_date today - timedelta(days1)while check_date in session_dates:current_streak 1check_date - timedelta(days1)return {current: current_streak, longest: longest_streak}def _longest_consecutive_days(self, dates: List[date]) - int:计算最长连续天数if not dates:return 0max_streak 1current_streak 1for i in range(1, len(dates)):if (dates[i] - dates[i-1]).days 1:current_streak 1max_streak max(max_streak, current_streak)else:current_streak 1return max_streakdef _get_preferred_duration(self, sessions: List[MeditationSession]) - int:获取用户偏好的冥想时长duration_counts {}for session in sessions:if session.status SessionStatus.COMPLETED:duration_minutes session.planned_duration // 60duration_counts[duration_minutes] duration_counts.get(duration_minutes, 0) 1return max(duration_counts.items(), keylambda x: x[1])[0] if duration_counts else 10def _empty_statistics(self) - Dict[str, Any]:返回空的统计数据模板return {period_days: 0,total_sessions: 0,completed_sessions: 0,completion_rate: 0,total_minutes: 0,average_session_minutes: 0,current_streak_days: 0,longest_streak_days: 0,preferred_duration: 10,sessions_per_week: 0}class ReportGenerator:冥想报告生成器def __init__(self, meditation_service: MeditationService):self.meditation_service meditation_serviceasync def generate_weekly_report(self, user_id: str) - Dict[str, Any]:生成周报stats await self.meditation_service.get_user_statistics(user_id, 7)# 生成洞察和建议insights self._generate_insights(stats)recommendations self._generate_recommendations(stats)return {report_period: weekly,generated_at: datetime.now().isoformat(),statistics: stats,insights: insights,recommendations: recommendations,progress_chart_data: self._prepare_chart_data(stats)}def _generate_insights(self, stats: Dict[str, Any]) - List[str]:生成个性化洞察insights []if stats[completion_rate] 0.9:insights.append( 您的冥想坚持度非常棒完成率达到90%以上)elif stats[completion_rate] 0.7:insights.append( 您的冥想习惯正在稳步建立中继续保持)else:insights.append( 刚开始冥想很正常不要给自己太大压力)if stats[current_streak_days] 7:insights.append(f 恭喜达成{stats[current_streak_days]}天连续冥想)elif stats[current_streak_days] 0:insights.append(f 当前连续{stats[current_streak_days]}天再接再厉)if stats[total_minutes] 100:insights.append(f⏰ 本周累计冥想{stats[total_minutes]}分钟相当于{stats[total_minutes]//20}次深度呼吸练习)return insightsdef _generate_recommendations(self, stats: Dict[str, Any]) - List[str]:生成改进建议recommendations []if stats[completion_rate] 0.6:recommendations.append(建议从5分钟短时冥想开始逐步建立习惯)if stats[sessions_per_week] 3:recommendations.append(尝试每周至少3次冥想效果会更明显)if stats[preferred_duration] 5 and stats[total_sessions] 5:recommendations.append(可以考虑尝试10分钟的冥想会有更深层的放松效果)if stats[current_streak_days] 0:recommendations.append(选择一个固定的时间和地点有助于养成冥想习惯)return recommendationsdef _prepare_chart_data(self, stats: Dict[str, Any]) - Dict[str, Any]:准备图表数据return {completion_trend: [{label: 本周完成率, value: round(stats[completion_rate] * 100, 1)}],duration_distribution: [{label: 偏好时长, value: stats[preferred_duration], unit: 分钟}],streak_info: [{label: 当前连续, value: stats[current_streak_days], unit: 天},{label: 历史最长, value: stats[longest_streak_days], unit: 天}]}4.3 基础设施层# infrastructure/repositories.py数据访问层 - 仓储模式实现import sqlite3import jsonfrom datetime import datetimefrom typing import List, Optional, Dict, Anyfrom contextlib import contextmanagerfrom core.domain.models import MeditationSession, MeditationUserProfile, SessionStatusclass BaseRepository:仓储基类def __init__(self, db_path: str meditation_data.db):self.db_path db_pathself._init_database()contextmanagerdef _get_connection(self):数据库连接上下文管理器conn sqlite3.connect(self.db_path)conn.row_factory sqlite3.Row # 支持字典式访问try:yield connconn.commit()except Exception:conn.rollback()raisefinally:conn.close()class SessionRepository(BaseRepository):冥想会话仓储def _init_database(self):初始化会话相关表with self._get_connection() as conn:conn.execute(CREATE TABLE IF NOT EXISTS meditation_sessions (session_id TEXT PRIMARY KEY,user_id TEXT NOT NULL,planned_duration INTEGER NOT NULL,actual_duration INTEGER DEFAULT 0,level TEXT NOT NULL,status TEXT NOT NULL,started_at TIMESTAMP,利用AI解决实际问题如果你觉得这个工具好用欢迎关注长安牧笛