副业收益追踪器,记录时间投入与收入,自行算时薪,判断副业是否值得坚持。
副业收益追踪器 - 时薪计算与价值评估系统一、实际应用场景描述场景小王是一名前端开发工程师利用晚上和周末接私活、写技术博客、做线上课程。一个月下来他接了3个外包项目共收入15000元写了2篇技术文章稿费800元录制了1节课程收入500元。但他感觉很累不确定这些副业是否值得。他打开副业收益追踪器输入各项副业的投入时间和收入系统自动计算时薪分析时间价值并与他的本职工作时薪对比给出继续/调整/停止的建议同时生成可视化报表帮助他做决策。二、引入痛点1. 时间投入无记录感觉花了很多时间但具体多少说不清2. 时薪计算混乱收入看起来不错但不知道时薪到底多少3. 多项目难比较外包、写文、录课哪个更划算没有数据支撑4. 机会成本忽视没考虑副业时间本可用于学习或休息的价值5. 收益趋势不明不知道副业收入是在增长还是下滑6. 精力分配失衡副业挤占太多时间影响主业发展和健康三、核心逻辑讲解┌─────────────────────────────────────────────────────────┐│ 副业收益追踪决策流程 │├─────────────────────────────────────────────────────────┤│ 1. 数据录入层 ││ └── 记录副业项目: 名称/类型/收入/开始时间/结束时间/技能标签 ││ └── 记录主业数据: 月薪/工作时长(用于计算基准时薪) ││ └── 数据验证: 时间逻辑/收入合理性/重复项目检测 ││ ││ 2. 时薪计算层 (核心算法) ││ └── 单项目时薪 项目收入 ÷ 实际投入小时数 ││ └── 总时薪 总收入 ÷ 总投入小时数 ││ └── 有效时薪 总收入 ÷ (总投入 - 无效时间) ││ └── 时薪趋势 滑动平均/环比/同比分析 ││ ││ 3. 价值评估层 ││ └── 机会成本计算: 副业时薪 vs 主业时薪 vs 学习投资回报率 ││ └── 价值系数 副业时薪 ÷ 基准时薪 ││ └── 综合评分 时薪×0.4 成长性×0.3 技能提升×0.2 兴趣度×0.1 ││ └── 可持续性评估: 时间可扩展性/收入稳定性/技能复用性 ││ ││ 4. 决策建议层 ││ └── 价值系数1.5: 强烈建议继续 ││ └── 价值系数1.0-1.5: 建议优化 ││ └── 价值系数0.5-1.0: 建议调整 ││ └── 价值系数0.5: 建议停止或转型 ││ ││ 5. 报表生成层 ││ └── 时薪趋势图/项目对比图/时间分布饼图/收益构成图 ││ └── 周报/月报/自定义周期报告 │└─────────────────────────────────────────────────────────┘关键算法- 时薪计算引擎: 支持多维度时薪计算毛时薪/净时薪/有效时薪- 价值评估模型: 基于多因素加权的综合评分算法- 趋势分析器: 使用移动平均和环比分析预测未来收益- 机会成本计算器: 对比不同时间投入的价值回报四、代码模块化实现项目结构side_hustle_tracker/├── main.py # 主程序入口├── config.py # 配置文件├── data/│ ├── models.py # 数据模型定义│ ├── database.py # 数据库操作│ └── sample_data.py # 示例数据├── core/│ ├── time_calculator.py # 时薪计算引擎│ ├── value_evaluator.py # 价值评估器│ ├── decision_maker.py # 决策建议器│ └── report_generator.py # 报表生成器├── utils/│ ├── validators.py # 数据验证器│ ├── formatters.py # 格式化工具│ └── helpers.py # 辅助函数└── README.md # 使用说明1. config.py - 配置文件配置模块 - 定义系统参数、分类体系和计算规则from dataclasses import dataclass, fieldfrom typing import Dict, List, Set, Tuple, Optionalfrom enum import Enumfrom datetime import timeclass IncomeType(Enum):副业收入类型OUTSOURCING 外包项目 # 接私活、外包开发CONTENT_CREATION 内容创作 # 写文章、拍视频、做播客ONLINE_COURSE 在线课程 # 录制课程、知识付费CONSULTING 咨询服务 # 技术咨询、顾问服务AFFILIATE 联盟营销 # 推广分成、佣金INVESTMENT 投资收益 # 理财、投资回报FREELANCE 自由职业 # 设计、翻译、其他技能服务OTHER 其他 # 未分类收入class SkillTag(Enum):技能标签FRONTEND 前端开发BACKEND 后端开发FULLSTACK 全栈开发MOBILE 移动开发DATA_SCIENCE 数据科学AI_ML 人工智能DEVOPS 运维开发UI_UX UI/UX设计WRITING 技术写作VIDEO 视频制作TEACHING 教学培训CONSULTING 技术咨询PRODUCT 产品管理MARKETING 数字营销OTHER 其他技能class DecisionCategory(Enum):决策类别STRONGLY_CONTINUE 强烈建议继续 # 价值系数1.5OPTIMIZE_AND_CONTINUE 建议优化后继续 # 价值系数1.0-1.5ADJUST_AND_MONITOR 建议调整并监控 # 价值系数0.5-1.0STOP_OR_PIVOT 建议停止或转型 # 价值系数0.5dataclassclass SystemConfig:系统全局配置# 时薪计算规则MIN_HOURLY_RATE: float 0.0 # 最低时薪阈值(低于此值警告)BENCHMARK_HOURLY_RATE: float 100.0 # 基准时薪(用于对比)EFFECTIVE_HOUR_THRESHOLD: float 0.6 # 有效时间比例阈值(60%)# 价值评估权重VALUE_WEIGHTS: Dict[str, float] field(default_factorylambda: {hourly_rate: 0.40, # 时薪占比growth_potential: 0.25, # 成长潜力skill_development: 0.20, # 技能提升interest_alignment: 0.10, # 兴趣匹配度sustainability: 0.05 # 可持续性})# 决策阈值DECISION_THRESHOLDS: Dict[str, float] field(default_factorylambda: {strong_continue: 1.5, # 强烈继续optimize_continue: 1.0, # 优化继续adjust_monitor: 0.5, # 调整监控stop_pivot: 0.0 # 停止转型})# 时间计算规则WORKING_DAYS_PER_WEEK: int 5WORKING_HOURS_PER_DAY: int 8WEEKS_PER_MONTH: int 4.33# 收入类型默认时薪参考(元/小时)DEFAULT_HOURLY_RATES: Dict[IncomeType, float] field(default_factorylambda: {IncomeType.OUTSOURCING: 150.0,IncomeType.CONTENT_CREATION: 80.0,IncomeType.ONLINE_COURSE: 120.0,IncomeType.CONSULTING: 300.0,IncomeType.AFFILIATE: 50.0,IncomeType.INVESTMENT: 0.0, # 被动收入特殊处理IncomeType.FREELANCE: 100.0,IncomeType.OTHER: 75.0})# 技能加成系数(相对于基准时薪)SKILL_MULTIPLIERS: Dict[SkillTag, float] field(default_factorylambda: {SkillTag.FRONTEND: 1.0,SkillTag.BACKEND: 1.1,SkillTag.FULLSTACK: 1.2,SkillTag.MOBILE: 1.15,SkillTag.DATA_SCIENCE: 1.3,SkillTag.AI_ML: 1.4,SkillTag.DEVOPS: 1.25,SkillTag.UI_UX: 0.95,SkillTag.WRITING: 0.8,SkillTag.VIDEO: 0.75,SkillTag.TEACHING: 0.9,SkillTag.CONSULTING: 1.5,SkillTag.PRODUCT: 1.35,SkillTag.MARKETING: 0.85,SkillTag.OTHER: 0.9})# 技能标签显示名称映射SKILL_TAG_NAMES {SkillTag.FRONTEND: 前端开发,SkillTag.BACKEND: 后端开发,SkillTag.FULLSTACK: 全栈开发,SkillTag.MOBILE: 移动开发,SkillTag.DATA_SCIENCE: 数据科学,SkillTag.AI_ML: 人工智能,SkillTag.DEVOPS: 运维开发,SkillTag.UI_UX: UI/UX设计,SkillTag.WRITING: 技术写作,SkillTag.VIDEO: 视频制作,SkillTag.TEACHING: 教学培训,SkillTag.CONSULTING: 技术咨询,SkillTag.PRODUCT: 产品管理,SkillTag.MARKETING: 数字营销,SkillTag.OTHER: 其他技能}# 收入类型图标INCOME_TYPE_ICONS {IncomeType.OUTSOURCING: ,IncomeType.CONTENT_CREATION: ✍️,IncomeType.ONLINE_COURSE: ,IncomeType.CONSULTING: ,IncomeType.AFFILIATE: ,IncomeType.INVESTMENT: ,IncomeType.FREELANCE: ,IncomeType.OTHER: }# 决策类别颜色和图标DECISION_STYLES {DecisionCategory.STRONGLY_CONTINUE: {color: green, icon: ✅, emoji: },DecisionCategory.OPTIMIZE_AND_CONTINUE: {color: blue, icon: ⚡, emoji: },DecisionCategory.ADJUST_AND_MONITOR: {color: yellow, icon: ⚠️, emoji: },DecisionCategory.STOP_OR_PIVOT: {color: red, icon: ❌, emoji: }}2. data/models.py - 数据模型定义数据模型模块 - 定义核心数据结构使用Python dataclass实现类型安全的模型from dataclasses import dataclass, fieldfrom typing import List, Optional, Dict, Any, Unionfrom datetime import datetime, timedeltafrom enum import Enumimport uuidfrom config import IncomeType, SkillTag, SystemConfigdataclassclass TimeEntry:时间记录条目id: str field(default_factorylambda: str(uuid.uuid4()))project_id: str # 关联的项目IDstart_time: Optional[datetime] None # 开始时间end_time: Optional[datetime] None # 结束时间duration_minutes: float 0.0 # 持续时间(分钟)description: str # 描述tags: List[str] field(default_factorylist) # 标签created_at: datetime field(default_factorydatetime.now)propertydef duration_hours(self) - float:获取小时数return self.duration_minutes / 60.0def to_dict(self) - Dict[str, Any]:转换为字典return {id: self.id,project_id: self.project_id,start_time: self.start_time.isoformat() if self.start_time else None,end_time: self.end_time.isoformat() if self.end_time else None,duration_minutes: self.duration_minutes,duration_hours: round(self.duration_hours, 2),description: self.description,tags: self.tags,created_at: self.created_at.isoformat()}dataclassclass SideHustleProject:副业项目id: str field(default_factorylambda: str(uuid.uuid4()))name: str # 项目名称income_type: IncomeType IncomeType.OTHER # 收入类型skill_tags: List[SkillTag] field(default_factorylist) # 技能标签total_income: float 0.0 # 总收入(元)currency: str CNY # 货币单位time_entries: List[TimeEntry] field(default_factorylist) # 时间记录start_date: Optional[datetime] None # 开始日期end_date: Optional[datetime] None # 结束日期status: str active # 状态: active/completed/pausednotes: str # 备注created_at: datetime field(default_factorydatetime.now)updated_at: datetime field(default_factorydatetime.now)propertydef total_hours(self) - float:总投入小时数return sum(entry.duration_hours for entry in self.time_entries)propertydef hourly_rate(self) - float:计算时薪if self.total_hours 0:return 0.0return self.total_income / self.total_hourspropertydef effective_hours(self) - float:有效工作时间(扣除低效时间)total self.total_hoursif total 0:return 0.0# 假设有效时间比例为70%(可根据实际情况调整)effective_ratio 0.7return total * effective_ratiopropertydef effective_hourly_rate(self) - float:有效时薪if self.effective_hours 0:return 0.0return self.total_income / self.effective_hoursdef add_time_entry(self, entry: TimeEntry) - None:添加时间记录entry.project_id self.idself.time_entries.append(entry)self.updated_at datetime.now()def calculate_metrics(self, config: SystemConfig) - Dict[str, float]:计算项目关键指标return {total_income: self.total_income,total_hours: round(self.total_hours, 2),hourly_rate: round(self.hourly_rate, 2),effective_hours: round(self.effective_hours, 2),effective_hourly_rate: round(self.effective_hourly_rate, 2),daily_average_income: round(self.total_income / max(1, (self.end_date - self.start_date).days), 2) if self.end_date and self.start_date else 0,weekly_average_income: round(self.total_income / max(1, len(self.time_entries) / 5), 2) if self.time_entries else 0}def to_dict(self) - Dict[str, Any]:转换为字典return {id: self.id,name: self.name,income_type: self.income_type.value,skill_tags: [tag.value for tag in self.skill_tags],total_income: self.total_income,currency: self.currency,total_hours: round(self.total_hours, 2),hourly_rate: round(self.hourly_rate, 2),effective_hours: round(self.effective_hours, 2),effective_hourly_rate: round(self.effective_hourly_rate, 2),time_entries_count: len(self.time_entries),start_date: self.start_date.isoformat() if self.start_date else None,end_date: self.end_date.isoformat() if self.end_date else None,status: self.status,notes: self.notes,created_at: self.created_at.isoformat(),updated_at: self.updated_at.isoformat()}dataclassclass MainJobInfo:主业信息monthly_salary: float 0.0 # 月薪currency: str CNY # 货币单位working_hours_per_week: int 40 # 每周工作小时数working_days_per_week: int 5 # 每周工作天数vacation_days_per_year: int 10 # 年假天数start_date: Optional[datetime] None # 入职日期position: str # 职位company: str # 公司created_at: datetime field(default_factorydatetime.now)propertydef weekly_income(self) - float:周收入return self.monthly_salary * 12 / 52propertydef hourly_rate(self) - float:主业时薪return self.weekly_income / self.working_hours_per_weekpropertydef daily_income(self) - float:日收入return self.monthly_salary / 21.75 # 月计薪天数def to_dict(self) - Dict[str, Any]:转换为字典return {monthly_salary: self.monthly_salary,currency: self.currency,working_hours_per_week: self.working_hours_per_week,working_days_per_week: self.working_days_per_week,vacation_days_per_year: self.vacation_days_per_year,hourly_rate: round(self.hourly_rate, 2),weekly_income: round(self.weekly_income, 2),daily_income: round(self.daily_income, 2),position: self.position,company: self.company,created_at: self.created_at.isoformat()}dataclassclass ValueEvaluation:价值评估结果project_id: str project_name: str hourly_rate: float 0.0effective_hourly_rate: float 0.0benchmark_hourly_rate: float 0.0value_coefficient: float 0.0 # 价值系数 副业时薪 / 基准时薪growth_potential: float 0.0 # 成长潜力评分(0-10)skill_development: float 0.0 # 技能提升评分(0-10)interest_alignment: float 0.0 # 兴趣匹配度(0-10)sustainability: float 0.0 # 可持续性评分(0-10)overall_score: float 0.0 # 综合评分(0-10)decision_category: DecisionCategory DecisionCategory.ADJUST_AND_MONITORrecommendations: List[str] field(default_factorylist)risks: List[str] field(default_factorylist)opportunities: List[str] field(default_factorylist)created_at: datetime field(default_factorydatetime.now)def to_dict(self) - Dict[str, Any]:转换为字典return {project_id: self.project_id,project_name: self.project_name,hourly_rate: round(self.hourly_rate, 2),effective_hourly_rate: round(self.effective_hourly_rate, 2),benchmark_hourly_rate: round(self.benchmark_hourly_rate, 2),value_coefficient: round(self.value_coefficient, 2),growth_potential: round(self.growth_potential, 1),skill_development: round(self.skill_development, 1),interest_alignment: round(self.interest_alignment, 1),sustainability: round(self.sustainability, 1),overall_score: round(self.overall_score, 1),decision_category: self.decision_category.value,recommendations: self.recommendations,risks: self.risks,opportunities: self.opportunities,created_at: self.created_at.isoformat()}dataclassclass ReportData:报表数据report_period: str # 报表周期generated_at: datetime field(default_factorydatetime.now)summary: Dict[str, Any] field(default_factorydict)projects_summary: List[Dict[str, Any]] field(default_factorylist)hourly_rate_trend: List[Dict[str, Any]] field(default_factorylist)time_distribution: Dict[str, float] field(default_factorydict)income_breakdown: Dict[str, float] field(default_factorydict)value_evaluations: List[ValueEvaluation] field(default_factorylist)charts_config: Dict[str, Any] field(default_factorydict)def to_dict(self) - Dict[str, Any]:转换为字典return {report_period: self.report_period,generated_at: self.generated_at.isoformat(),summary: self.summary,projects_summary: self.projects_summary,hourly_rate_trend: self.hourly_rate_trend,time_distribution: self.time_distribution,income_breakdown: self.income_breakdown,value_evaluations: [eval.to_dict() for eval in self.value_evaluations],charts_config: self.charts_config}3. data/database.py - 数据库操作数据库操作模块 - 使用SQLite存储和管理数据import sqlite3import jsonfrom datetime import datetimefrom typing import List, Optional, Dict, Anyfrom contextlib import contextmanagerfrom data.models import (TimeEntry, SideHustleProject, MainJobInfo,ValueEvaluation, IncomeType, SkillTag)from config import SystemConfigclass DatabaseManager:数据库管理器def __init__(self, db_path: str side_hustle_tracker.db):self.db_path db_pathself.init_database()contextmanagerdef get_connection(self):获取数据库连接的上下文管理器conn sqlite3.connect(self.db_path)conn.row_factory sqlite3.Rowtry:yield connconn.commit()except Exception as e:conn.rollback()raise efinally:conn.close()def init_database(self) - None:初始化数据库表结构with self.get_connection() as conn:cursor conn.cursor()# 主业信息表cursor.execute(CREATE TABLE IF NOT EXISTS main_job (id TEXT PRIMARY KEY,monthly_salary REAL NOT NULL,currency TEXT DEFAULT CNY,working_hours_per_week INTEGER DEFAULT 40,working_days_per_week INTEGER DEFAULT 5,vacation_days_per_year INTEGER DEFAULT 10,start_date TEXT,position TEXT,company TEXT,created_at TEXT NOT NULL))# 副业项目表cursor.execute(CREATE TABLE IF NOT EXISTS side_hustle_projects (id TEXT PRIMARY KEY,name TEXT NOT NULL,income_type TEXT NOT NULL,skill_tags TEXT,total_income REAL DEFAULT 0,currency TEXT DEFAULT CNY,start_date TEXT,end_date TEXT,status TEXT DEFAULT active,notes TEXT,created_at TEXT NOT NULL,updated_at TEXT NOT NULL))# 时间记录表cursor.execute(CREATE TABLE IF NOT EXISTS time_entries (id TEXT PRIMARY KEY,project_id TEXT NOT NULL,start_time TEXT,end_time TEXT,duration_minutes REAL DEFAULT 0,description TEXT,tags TEXT,created_at TEXT NOT NULL,FOREIGN KEY (project_id) REFERENCES side_hustle_projects(id)))# 价值评估表cursor.execute(CREATE TABLE IF NOT EXISTS value_evaluations (id TEXT PRIMARY KEY,project_id TEXT NOT NULL,利用AI解决实际问题如果你觉得这个工具好用欢迎关注长安牧笛
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2413604.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!