# clothes-manager **Repository Path**: Baisux/clothes-manager ## Basic Information - **Project Name**: clothes-manager - **Description**: 个人衣物管理 - H5 小程序 - **Primary Language**: Unknown - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-05-05 - **Last Updated**: 2026-05-25 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 个人衣物管理 - H5 小程序 ## 快速开始 ```bash npm install npm run dev # 开发模式,访问 http://localhost:3000 npm run build # 构建生产版本 npm run preview # 预览生产版本 ``` ## 技术栈 | 类别 | 技术 | |------|------| | 框架 | React 19 + TypeScript 6 | | 构建 | Vite 8 + vite-plugin-pwa | | 路由 | react-router-dom v7 | | 存储 | Supabase PostgreSQL + Supabase Storage(图片) | | 样式 | 纯 CSS + CSS Variables | ## 项目结构 ``` clothes-manager/ ├── docs/ │ ├── PRD.md # 产品需求文档 │ ├── supabase.md # Supabase 配置与建表说明 │ └── hbuilderx-package-guide.md # HBuilderX 打包指南 ├── public/ │ └── favicon.svg # 站点图标 ├── src/ │ ├── main.tsx # 应用入口 │ ├── App.tsx # 路由配置 │ ├── types/ │ │ └── index.ts # 所有 TypeScript 类型定义 │ ├── services/ │ │ ├── supabase.ts # Supabase 客户端初始化(支持运行时配置) │ │ ├── db.ts # 数据库封装(Supabase Client) │ │ ├── clothesService.ts # 衣物 CRUD 操作 │ │ ├── washService.ts # 清洗批次 CRUD 操作 │ │ ├── dictionaryService.ts # 字典数据 CRUD 操作 │ │ ├── outfitService.ts # 穿搭记录/套装 CRUD 操作 │ │ ├── weatherService.ts # 天气数据获取(wttr.in + IP 定位) │ │ ├── exportService.ts # 数据导入导出(JSON/CSV/ZIP + 策略选择) │ │ └── imageService.ts # 图片压缩 + Supabase Storage 上传/删除 │ ├── hooks/ │ │ ├── useClothes.ts # 衣物数据 hooks │ │ ├── useWash.ts # 清洗数据 hooks │ │ ├── useOutfit.ts # 穿搭记录 hooks │ │ ├── useOutfitSet.ts # 搭配套装 hooks │ │ ├── useOnlineStatus.ts # 网络在线/离线状态 │ │ └── useSyncStatus.ts # 同步时间状态 │ ├── contexts/ │ │ ├── DictionaryContext.tsx # 字典全局上下文 │ │ └── WeatherContext.tsx # 天气全局上下文 │ ├── utils/ │ │ ├── constants.ts # 默认枚举常量 + WASH_LIFE_LIMITS + DISCARD_REASONS │ │ ├── dateUtils.ts # 日期格式化工具 │ │ ├── id.ts # UUID 生成 │ │ ├── validators.ts # 表单校验 │ │ ├── recommendations.ts # 穿搭推荐算法 │ │ └── zip.ts # ZIP 打包/解压工具(jszip) │ ├── components/ │ │ ├── Layout/ # 底部 Tab 导航布局 + InstallPrompt │ │ ├── Icon/ # 统一 SVG 图标组件(30+ 图标,currentColor 适配) │ │ ├── ClothCard/ # 衣物卡片 │ │ ├── FilterBar/ # 搜索 + 筛选栏 │ │ ├── WashBatchCard/ # 清洗批次卡片 │ │ ├── ImageCrop/ # 图片裁剪(Canvas 矩形框选) │ │ ├── EmptyState/ # 空状态占位 │ │ ├── InstallPrompt/ # PWA 安装提示横幅 │ │ ├── ExportMenu/ # 导出选项弹窗(JSON/CSV/ZIP) │ │ └── ImportWizard/ # 导入多步向导 │ ├── pages/ │ │ ├── Home/ # 首页(天气卡片/统计/提醒/快捷操作/最近记录) │ │ ├── ClothesList/ # 衣物列表(筛选/搜索) │ │ ├── ClothesDetail/ # 衣物详情(生命周期进度条/淘汰信息/清洗时间线) │ │ ├── ClothesForm/ # 衣物添加/编辑表单(含淘汰信息/裁剪上传/删除确认) │ │ ├── Outfits/ # 穿搭主页(天气/推荐/记录列表) │ │ ├── OutfitForm/ # 穿搭记录/编辑表单 │ │ ├── OutfitSets/ # 搭配套装列表 │ │ ├── OutfitSetForm/ # 搭配套装表单 │ │ ├── OutfitCalendar/ # 穿搭日历 │ │ ├── WashList/ # 清洗记录列表 │ │ ├── WashForm/ # 创建洗衣批次 │ │ ├── Stats/ # 数据统计看板(含清洗寿命提醒) │ │ ├── Settings/ # 字典管理 │ │ ├── Reminders/ # 提醒设置 │ │ ├── SupabaseConfig/ # Supabase 连接配置(运行时修改) │ │ ├── Mine/ # 我的(入口页) │ │ └── Migrate/ # 图片迁移工具 │ └── styles/ │ ├── variables.css # CSS 变量(主题色) │ └── global.css # 全局样式重置 ├── index.html ├── package.json ├── vite.config.ts └── tsconfig.json ``` ## 路由表 | 路径 | 页面 | 说明 | |------|------|------| | `/` | Home | 首页概览 | | `/clothes` | ClothesList | 衣物列表 | | `/clothes/new` | ClothesForm | 添加衣物 | | `/clothes/:id` | ClothesDetail | 衣物详情 | | `/clothes/:id/edit` | ClothesForm | 编辑衣物 | | `/wash` | WashList | 清洗记录列表 | | `/wash/new` | WashForm | 创建洗衣批次 | | `/mine` | Mine | 我的(入口:字典管理/统计看板/提醒设置/图片迁移/Supabase配置/导出导入) | | `/stats` | Stats | 数据统计看板 | | `/settings` | Settings | 字典管理 | | `/reminders` | Reminders | 提醒设置 | | `/supabase-config` | SupabaseConfig | Supabase 连接配置(运行时修改) | | `/outfits` | Outfits | 穿搭记录 | | `/outfits/new` | OutfitForm | 记录穿搭 | | `/outfits/:id/edit` | OutfitForm | 编辑穿搭 | | `/outfit-sets` | OutfitSets | 搭配套装列表 | | `/outfit-sets/new` | OutfitSetForm | 新建套装 | | `/outfit-calendar` | OutfitCalendar | 穿搭日历 | | `/migrate` | Migrate | 图片迁移(一次性工具) | ## 数据流 ``` 用户操作 → Page 组件 → Custom Hook → Service 函数 → Supabase PostgreSQL ↓ 刷新 state → 重新渲染 ``` 数据库使用 Supabase PostgreSQL,包含五个表: - `clothes` — 衣物数据(含生命周期字段:淘汰/转卖日期、原因、转卖价格) - `washBatches` — 洗衣批次数据 - `outfits` — 穿搭记录数据 - `outfitSets` — 搭配套装数据 - `dictionaries` — 字典数据(品类/材质/颜色等可配置选项 + 提醒设置) ## 环境变量 复制 `.env.example` 为 `.env`,填入 Supabase 项目凭证: ```env VITE_SUPABASE_URL=https://xxxxxxxxxxxx.supabase.co VITE_SUPABASE_ANON_KEY=eyJxxxxxxxxxxxxxx ``` 也可在应用内「我的 → Supabase 配置」页面运行时修改,保存后自动刷新生效。优先级:App 内设置 > 环境变量(仅开发环境)。 **注意**:生产构建不会包含 `.env` 信息,用户需要手动配置 Supabase 连接。 详细 Supabase 使用说明见 [docs/supabase.md](docs/supabase.md)。 ## 设计风格 - 主色调 `#5B8C5A`(鼠尾草绿),主色渐变 `#5B8C5A → #7aa879` - 辅助色 `#d64545`(暖红,用于警告/删除)、`#e6a700`(提醒)、`#4a90d9`(信息) - 最大宽度 430px,居中布局,移动端适配 - 底部五 Tab 导航:首页 / 衣物 / 穿搭 / 清洗 / 我的(固定定位 + 毛玻璃 + 激活态指示条) - 全 SVG 图标系统,跨浏览器/PWA 渲染一致 - 设计 Token 体系:颜色/阴影/间距/字体/圆角/动画时长全部 CSS Variable 化 ## 当前进度 | 阶段 | 状态 | 说明 | |------|------|------| | V1.0 核心功能 | ✅ 已完成 | 衣物 CRUD、清洗管理、首页概览 | | 🔄 Supabase 迁移 | ✅ 已完成 | 方案一 Supabase PostgreSQL,支持多设备数据共享 | | V1.1 数据统计看板 | ✅ 已完成 | 数据统计看板、字典管理、图片迁移至 Supabase Storage | | V1.2 穿搭模块 | ✅ 已完成 | 穿搭记录、搭配套装、穿搭日历、天气联动推荐 | | V1.2.1 | ✅ 已完成 | "我的"入口页、首页快捷入口优化、最近添加图片固定尺寸 | | V1.2.2 | ✅ 已完成 | 存放位置字典化(chip 选择 + 列表筛选 + 字典管理) | | V1.2.3 | ✅ 已完成 | 首页"久未清洗"提醒新增可展开详情:穿搭次数、最后穿搭时间、上次清洗时间 | | V1.2.4 | ✅ 已完成 | 图片裁剪上传(自由矩形框选 + 使用原图 + 逐张裁剪) | | V1.3.0 智能提醒 | ✅ 已完成 | 提醒阈值可配置、穿搭次数清洗提醒、提醒设置页 | | V1.3.2 穿搭编辑 | ✅ 已完成 | 穿搭记录可编辑回填、编辑入口、穿着次数修正、日期预填 | | V1.3.1 生命周期 | ✅ 已完成 | 衣物状态扩展、淘汰/转卖记录、清洗寿命追踪、实际使用成本 | | V1.4 数据管理 | ✅ 已完成 | 导入导出增强(CSV/ZIP/预览/策略)、PWA(App Shell 缓存/安装提示)、多设备同步 UI | | V1.4.1 安全增强 | ✅ 已完成 | 移除构建产物中的环境变量、生产环境强制手动配置、路由守卫自动跳转 | | V1.4.2 Bug 修复 | ✅ 已完成 | 修复 washBatches 表缺少 duration 列导致的 PGRST204 错误;修复 formatDateRelative 时区问题导致"今天"显示"-1天前" | | V1.5.0 UI 设计升级 | ✅ 已完成 | 全 SVG 图标系统替代 emoji(解决跨浏览器/PWA 显示不一致)、设计 Token 体系(颜色/阴影/间距/字体/动画)、Home/Layout/Mine 等核心页面视觉重构;**补充**:清理全部业务页面遗留 emoji(衣物分类 8 项、UI 控件 ✕ ✓ ✅ ⬜ 等共 21 处),新增 9 个 Icon 类型 | ## 待开发功能 按 PRD 文档 §8 未来扩展方向规划: - **V2.0**: AI 照片归类、胶囊衣橱、深色模式 ## 已完成功能 ### V1.0 核心功能 - [x] 衣物 CRUD(名称/图片/品类/品牌/价格/材质/颜色/尺码/季节/厚度/存放位置/洗涤要求/状态) - [x] 衣物列表(品类/季节/状态筛选 + 关键词搜索) - [x] 衣物详情(信息展示 + 清洗历史时间线) - [x] 洗衣批次管理(多选衣物/日期/方式/水温/柔顺剂/烘干/备注) - [x] 首页概览(衣物统计/总价值/快捷操作/最近清洗/最近添加) - [x] 图片上传(多图,自动压缩为 WebP + Supabase Storage 对象存储,向后兼容旧 base64 数据) - [x] Supabase PostgreSQL 持久化存储(方案一迁移完成) - [x] 局域网多设备访问兼容(UUID 生成兜底 + 错误提示) ### V1.1 增强体验 - [x] 数据统计看板(资产概览/品类分布/季节分布/颜色分布/清洗频次/消费排行) - [x] 字典管理(品类/材质/颜色/季节/厚度/洗涤要求/清洗方式,存储于 Supabase dictionaries 表) - [x] 动态字典全局上下文(DictionaryContext),修改实时同步所有页面 - [x] 图片迁移至 Supabase Storage(自动压缩为 WebP,单张 50-150KB,向后兼容旧 base64 数据) ### V1.2 穿搭模块 - [x] 穿搭记录(每日穿搭记录,支持多选衣物/场景标签/天气快照/穿搭照片) - [x] 搭配套装管理(创建/编辑/删除套装,设置适用季节/温度范围/场景) - [x] 穿搭日历(月度日历视图,点击日期查看当日穿搭详情) - [x] 天气联动(IP 定位获取天气,首页天气卡片,基于天气推荐套装) - [x] 一键穿搭(从推荐套装一键记录为当日穿搭) ### V1.2.1 体验优化 - [x] "我的"入口页(统计摘要/字典管理/统计看板/图片迁移入口) - [x] 首页快捷操作优化(移除字典管理入口,新增记录穿搭入口) - [x] 首页最近添加图片固定 76×76 尺寸,横向滚动显示 ### V1.2.2 存放位置字典化 - [x] 存放位置纳入字典管理(Settings 页面可增删排序) - [x] 衣物表单存放位置改为 chip 快捷选择 + 自定义输入 - [x] 衣物列表新增存放位置筛选下拉框 ### V1.2.4 图片裁剪上传 - [x] ImageCrop 裁剪组件(Canvas 绘制 + Pointer Events 交互,自由矩形框选/移动/调整大小) - [x] imageService 新增 cropImage、uploadBlob 函数 - [x] 衣物表单集成裁剪流程(选图 → 裁剪 → 上传,逐张处理;支持"使用原图"跳过裁剪) - [x] 裁剪界面自适应容器尺寸(ResizeObserver),动态光标反馈,防误触处理 ### V1.3.0 智能提醒 - [x] 提醒阈值可配置(闲置天数/久未清洗天数/穿搭次数,存 Supabase dictionaries 表) - [x] 穿搭次数清洗提醒(穿搭 N 次后未清洗自动提醒) - [x] 提醒设置页(/reminders,支持自定义阈值和恢复默认) - [x] 首页提醒改造(三类提醒分区展示,阈值从配置读取) - [x] "我的"页新增提醒设置入口 ### V1.3.2 穿搭编辑 - [x] 编辑模式表单回填已有穿搭数据(日期/场景/衣物/照片/备注/天气) - [x] 穿搭列表/今日穿搭/日历详情添加点击编辑入口 - [x] 编辑保存时仅对新增衣物增加穿着次数(修复重复计算) - [x] 支持 ?date= 查询参数预填日期(日历"记录"按钮生效) - [x] 编辑模式标题显示"编辑穿搭" ### V1.3.1 生命周期 - [x] 衣物状态扩展:新增"已捐赠/转卖"状态(donated) - [x] 淘汰/转卖记录:日期、原因(磨损/过时/不合身/不喜欢/其他)、转卖价格 - [x] 清洗寿命追踪:基于材质建议清洗次数上限,详情页进度条展示,接近/达到上限告警 - [x] 实际使用成本计算:(购买价格 - 转卖价格) / 穿着次数 - [x] 统计看板新增清洗寿命提醒 TOP 10、已捐赠/转卖计数 - [x] 筛选栏新增"已捐赠/转卖"状态选项 ### V1.4 数据管理 - [x] PWA 支持(manifest + vite-plugin-pwa + App Shell 缓存 + 安装提示横幅) - [x] 多设备同步 UI(同步状态栏、手动刷新、在线/离线状态提示、页面焦点自动刷新) - [x] CSV 导出(衣物列表电子表格格式,BOM 头兼容 Excel) - [x] ZIP 导出(JSON 数据 + 衣物图片打包备份) - [x] 导入增强(多步向导:选文件 → 预览 → 策略选择 → 确认) - [x] 导入策略(合并/追加/覆盖三种模式) - [x] Supabase 运行时配置(App 内设置页修改 URL/Key,无需重新构建) - [x] HBuilderX APK 打包支持(相对路径 base、打包指南) ### V1.4.1 安全增强 - [x] 移除构建产物中的环境变量信息(生产构建时替换为空字符串) - [x] 开发环境优先使用 `.env`,生产环境强制手动配置 - [x] 路由守卫:未配置时自动跳转到 `/supabase-config` 页面 - [x] 配置页面增强:添加输入验证、格式检查、提示信息 ### V1.5.0 UI 设计升级 - [x] **统一 SVG 图标系统**(`src/components/Icon/`,30+ 图标),彻底替换 emoji - 解决不同浏览器/系统 emoji 渲染不一致问题 - 解决 PWA 打包后部分 emoji 显示为方框 - 支持 `currentColor` 主题适配、自定义大小 - [x] **设计 Token 体系**(`src/styles/variables.css`) - 颜色:主色渐变、警告/信息/危险色阶 - 阴影层级:sm/md/lg/xl 四档 - 间距系统:xs-3xl 七档 - 字体变量:font-sans / font-display - 圆角与过渡时长统一 - [x] **核心页面视觉重构** - Home:统计卡片悬停动效、staggered 进场动画、提醒卡片层次优化 - Layout:底部 Tab 改为固定定位 + 毛玻璃 + 激活态指示条 - Mine:头部高光渐变、悬浮胶囊式同步状态栏(脉冲动画 + 圆角刷新按钮) - WashBatchCard / 通用按钮 / EmptyState 等组件统一样式 - [x] 全局动画工具类(fadeIn / slideUp / scaleIn / pulse) - [x] **补充清理(v1.5.0 后续)**:彻底替换业务页面残留 emoji,统一走 Icon 组件 - 衣物分类(8 项):`CATEGORY_ICONS` 由 emoji 字符串改为 `IconName` 映射,新增 `shirt/pants/dress/coat/underwear/bag/shoes/tshirt` 8 个图标,影响 ClothCard、ClothesDetail、Outfits、OutfitSets、OutfitCalendar、Stats - UI 控件:所有关闭/移除按钮 `✕` → ``(FilterBar、ExportMenu、ImportWizard、OutfitForm、OutfitSetForm、ClothesForm、Settings、ImageCrop) - 勾选状态:`✓` `✅` → ``、`⬜` → ``(OutfitForm、OutfitSetForm、WashForm、ImportWizard) - 保留:天气 emoji(`weatherService.getWeatherIcon` 彩色显示效果好)、Migrate 调试日志中的 ✅ ❌(纯文本日志非 UI) - [x] **图标优化(v1.5.0 补充)**:优化 4 个语义不清的图标设计 - `clothes`:原衬衫形状与 `shirt` 重复 → 改为衣柜/抽屉形状(带分隔线) - `outfit`:原不直观的矩形组合 → 改为衣架挂衣服形状(顶部挂钩) - `empty`:原衣服形状 → 改为空盒子形状(中间横线) - `dry`:原盾牌形状 → 改为三条风曲线(表示吹干/风干) ## 后续开发指引 1. **新增页面**:在 `src/pages/` 下创建新目录,参考现有页面结构 2. **新增数据表**:在 Supabase SQL Editor 中创建新表,并在 `src/services/` 下创建对应的 Service 3. **新增路由**:在 `src/App.tsx` 中添加 Route 4. **样式变量**:全局 CSS 变量定义在 `src/styles/variables.css` 5. **常量**:品类/季节等枚举默认值在 `src/utils/constants.ts`,可通过字典管理页面动态修改