Files
2026-06-06 10:40:48 +08:00

1 line
16 KiB
JSON
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
{"projectName":"MealPrep","domain":"ecommerce","techStack":{"frontend":"React Native 0.76 + Expo / Flutter 3.x","backend":"NestJS + Prisma","database":"PostgreSQL 15 + Redis 7 + MinIO(文件存储)","deployment":"Docker Compose + Nginx / K8s(规模化)","considerations":[]},"architectureDiagram":"┌─────────────────────────────────────────────────────────┐\n│ MealPrep — System Architecture │\n├─────────────────────────────────────────────────────────┤\n│ │\n│ ┌──────────────────────┐ ┌──────────────────────┐ │\n│ │ Client Layer │ │ Admin / Web │ │\n│ │ React Native 0.76 + Expo / Flutter 3.x │ │ React + Vite (Web) │ │\n│ └──────────┬───────────┘ └──────────┬───────────┘ │\n│ │ │ │\n│ └──────────┬────────────────┘ │\n│ │ │\n│ ┌─────────▼──────────┐ │\n│ │ API Gateway │ │\n│ │ Nginx / Kong │ │\n│ └─────────┬──────────┘ │\n│ │ │\n│ ┌─────────▼──────────┐ │\n│ │ Backend Services │ │\n│ │ NestJS + Prisma │ │\n│ └─────────┬──────────┘ │\n│ │ │\n│ ┌───────────────┼───────────────┐ │\n│ │ │ │ │\n│ ┌─────▼─────┐ ┌──────▼──────┐ ┌────▼─────┐ │\n│ │ PostgreSQL 15│ │ Redis Cache │ │ MinIO │ │\n│ │ Primary │ │ Session │ │ Files │ │\n│ └───────────┘ └─────────────┘ └──────────┘ │\n│ │\n├─────────────────────────────────────────────────────────┤\n│ Modules: │\n│ 1 食物库 │\n│ 2 客户管理 │\n│ 3 餐计划 │\n│ 4 营养计算 │\n│ 5 购物清单 │\n│ 6 模板功能 │\n│ │\n└─────────────────────────────────────────────────────────┘","dataFlows":[{"page":"客户管理","route":"/customers","description":"客户档案。","dataFlow":["GET /api/customers → 获取客户管理列表","POST /api/customers → 创建客户管理"],"direction":"Client → API Gateway → Backend → Database → Response → Client"},{"page":"食物库","route":"/foods","description":"营养成分。","dataFlow":["GET /api/foods → 获取食物库列表","POST /api/foods → 创建食物库"],"direction":"Client → API Gateway → Backend → Database → Response → Client"},{"page":"餐计划","route":"/meal_plans","description":"每周计划。","dataFlow":["GET /api/meal_plans → 获取餐计划列表","POST /api/meal_plans → 创建餐计划"],"direction":"Client → API Gateway → Backend → Database → Response → Client"},{"page":"营养计算","route":"/nutrition","description":"自动计算。","dataFlow":["GET /api/nutrition → 获取营养计算列表","POST /api/nutrition → 创建营养计算"],"direction":"Client → API Gateway → Backend → Database → Response → Client"}],"modules":[{"name":"食物库","label":"食物库","features":["食物库"],"responsibilities":["提供 食物库 相关功能"]},{"name":"客户管理","label":"客户管理","features":["客户管理"],"responsibilities":["提供 客户管理 相关功能"]},{"name":"餐计划","label":"餐计划","features":["餐计划"],"responsibilities":["提供 餐计划 相关功能"]},{"name":"营养计算","label":"营养计算","features":["营养计算"],"responsibilities":["提供 营养计算 相关功能"]},{"name":"购物清单","label":"购物清单","features":["购物清单"],"responsibilities":["提供 购物清单 相关功能"]},{"name":"模板功能","label":"模板功能","features":["模板功能"],"responsibilities":["提供 模板功能 相关功能"]},{"name":"product","label":"商品管理","features":["商品浏览"],"responsibilities":["提供 商品浏览 相关功能"]},{"name":"order","label":"订单管理","features":["订单管理"],"responsibilities":["提供 订单管理 相关功能"]}],"databaseSchema":[{"table":"users","description":"用户表","fields":[{"name":"id","type":"UUID","constraints":"PK, DEFAULT gen_random_uuid()"},{"name":"phone","type":"VARCHAR(20)","constraints":"UNIQUE"},{"name":"nickname","type":"VARCHAR(64)"},{"name":"avatar_url","type":"TEXT"},{"name":"created_at","type":"TIMESTAMPTZ","constraints":"DEFAULT NOW()"},{"name":"updated_at","type":"TIMESTAMPTZ","constraints":"DEFAULT NOW()"}],"indexes":["idx_users_phone ON users(phone)"]},{"table":"foods","description":"营养成分。表","fields":[{"name":"id","type":"UUID","constraints":"PK, DEFAULT gen_random_uuid()"},{"name":"user_id","type":"UUID","constraints":"FK → users.id"},{"name":"title","type":"VARCHAR(256)","constraints":"NOT NULL"},{"name":"description","type":"TEXT"},{"name":"status","type":"VARCHAR(32)","constraints":"DEFAULT 'active'"},{"name":"data","type":"JSONB"},{"name":"created_at","type":"TIMESTAMPTZ","constraints":"DEFAULT NOW()"},{"name":"updated_at","type":"TIMESTAMPTZ","constraints":"DEFAULT NOW()"}],"indexes":["idx_foods_user ON foods(user_id)"]},{"table":"customers","description":"客户档案。表","fields":[{"name":"id","type":"UUID","constraints":"PK, DEFAULT gen_random_uuid()"},{"name":"user_id","type":"UUID","constraints":"FK → users.id"},{"name":"title","type":"VARCHAR(256)","constraints":"NOT NULL"},{"name":"description","type":"TEXT"},{"name":"status","type":"VARCHAR(32)","constraints":"DEFAULT 'active'"},{"name":"data","type":"JSONB"},{"name":"created_at","type":"TIMESTAMPTZ","constraints":"DEFAULT NOW()"},{"name":"updated_at","type":"TIMESTAMPTZ","constraints":"DEFAULT NOW()"}],"indexes":["idx_customers_user ON customers(user_id)"]},{"table":"meal_plans","description":"每周计划。表","fields":[{"name":"id","type":"UUID","constraints":"PK, DEFAULT gen_random_uuid()"},{"name":"user_id","type":"UUID","constraints":"FK → users.id"},{"name":"title","type":"VARCHAR(256)","constraints":"NOT NULL"},{"name":"description","type":"TEXT"},{"name":"status","type":"VARCHAR(32)","constraints":"DEFAULT 'active'"},{"name":"data","type":"JSONB"},{"name":"created_at","type":"TIMESTAMPTZ","constraints":"DEFAULT NOW()"},{"name":"updated_at","type":"TIMESTAMPTZ","constraints":"DEFAULT NOW()"}],"indexes":["idx_meal_plans_user ON meal_plans(user_id)"]},{"table":"nutrition","description":"自动计算。表","fields":[{"name":"id","type":"UUID","constraints":"PK, DEFAULT gen_random_uuid()"},{"name":"user_id","type":"UUID","constraints":"FK → users.id"},{"name":"title","type":"VARCHAR(256)","constraints":"NOT NULL"},{"name":"description","type":"TEXT"},{"name":"status","type":"VARCHAR(32)","constraints":"DEFAULT 'active'"},{"name":"data","type":"JSONB"},{"name":"created_at","type":"TIMESTAMPTZ","constraints":"DEFAULT NOW()"},{"name":"updated_at","type":"TIMESTAMPTZ","constraints":"DEFAULT NOW()"}],"indexes":["idx_nutrition_user ON nutrition(user_id)"]},{"table":"shopping_lists","description":"自动生成。表","fields":[{"name":"id","type":"UUID","constraints":"PK, DEFAULT gen_random_uuid()"},{"name":"user_id","type":"UUID","constraints":"FK → users.id"},{"name":"title","type":"VARCHAR(256)","constraints":"NOT NULL"},{"name":"description","type":"TEXT"},{"name":"status","type":"VARCHAR(32)","constraints":"DEFAULT 'active'"},{"name":"data","type":"JSONB"},{"name":"created_at","type":"TIMESTAMPTZ","constraints":"DEFAULT NOW()"},{"name":"updated_at","type":"TIMESTAMPTZ","constraints":"DEFAULT NOW()"}],"indexes":["idx_shopping_lists_user ON shopping_lists(user_id)"]},{"table":"templates","description":"保存复用。表","fields":[{"name":"id","type":"UUID","constraints":"PK, DEFAULT gen_random_uuid()"},{"name":"user_id","type":"UUID","constraints":"FK → users.id"},{"name":"title","type":"VARCHAR(256)","constraints":"NOT NULL"},{"name":"description","type":"TEXT"},{"name":"status","type":"VARCHAR(32)","constraints":"DEFAULT 'active'"},{"name":"data","type":"JSONB"},{"name":"created_at","type":"TIMESTAMPTZ","constraints":"DEFAULT NOW()"},{"name":"updated_at","type":"TIMESTAMPTZ","constraints":"DEFAULT NOW()"}],"indexes":["idx_templates_user ON templates(user_id)"]},{"table":"products","description":"商品表","fields":[{"name":"id","type":"UUID","constraints":"PK"},{"name":"title","type":"VARCHAR(256)","constraints":"NOT NULL"},{"name":"price","type":"DECIMAL(10,2)","constraints":"NOT NULL"},{"name":"stock","type":"INTEGER","constraints":"DEFAULT 0"},{"name":"images","type":"JSONB"},{"name":"category_id","type":"UUID","constraints":"FK → categories.id"},{"name":"created_at","type":"TIMESTAMPTZ","constraints":"DEFAULT NOW()"}],"indexes":["idx_products_category ON products(category_id)"]},{"table":"orders","description":"订单表","fields":[{"name":"id","type":"UUID","constraints":"PK"},{"name":"user_id","type":"UUID","constraints":"FK → users.id"},{"name":"status","type":"VARCHAR(32)","constraints":"DEFAULT 'pending'"},{"name":"total_amount","type":"DECIMAL(10,2)"},{"name":"address_id","type":"UUID","constraints":"FK → addresses.id"},{"name":"created_at","type":"TIMESTAMPTZ","constraints":"DEFAULT NOW()"}]},{"table":"order_items","description":"订单明细表","fields":[{"name":"id","type":"UUID","constraints":"PK"},{"name":"order_id","type":"UUID","constraints":"FK → orders.id"},{"name":"product_id","type":"UUID","constraints":"FK → products.id"},{"name":"quantity","type":"INTEGER","constraints":"NOT NULL"},{"name":"unit_price","type":"DECIMAL(10,2)"}]},{"table":"logistics","description":"物流追踪表","fields":[{"name":"id","type":"UUID","constraints":"PK"},{"name":"order_id","type":"UUID","constraints":"FK → orders.id, UNIQUE"},{"name":"carrier","type":"VARCHAR(64)"},{"name":"tracking_number","type":"VARCHAR(128)"},{"name":"status","type":"VARCHAR(32)"},{"name":"events","type":"JSONB","constraints":"DEFAULT '[]'"},{"name":"updated_at","type":"TIMESTAMPTZ","constraints":"DEFAULT NOW()"}]}],"apiDesign":[{"resource":"auth","basePath":"/api/auth","endpoints":[{"method":"POST","path":"/api/auth/login","description":"用户登录"},{"method":"GET","path":"/api/auth/me","description":"获取当前用户"}]},{"resource":"customers","basePath":"/api/customers","endpoints":[{"method":"GET","path":"/api/customers","description":"获取客户管理列表"},{"method":"POST","path":"/api/customers","description":"创建客户管理"}]},{"resource":"foods","basePath":"/api/foods","endpoints":[{"method":"GET","path":"/api/foods","description":"获取食物库列表"},{"method":"POST","path":"/api/foods","description":"创建食物库"}]},{"resource":"meal_plans","basePath":"/api/meal_plans","endpoints":[{"method":"GET","path":"/api/meal_plans","description":"获取餐计划列表"},{"method":"POST","path":"/api/meal_plans","description":"创建餐计划"}]},{"resource":"nutrition","basePath":"/api/nutrition","endpoints":[{"method":"GET","path":"/api/nutrition","description":"获取营养计算列表"},{"method":"POST","path":"/api/nutrition","description":"创建营养计算"}]}],"directoryStructure":["mealprep/","├── apps/","│ ├── mobile/ # React Native / Flutter 移动端","│ │ ├── src/","│ │ │ ├── screens/ # 页面组件","│ │ │ │ ├── 食物库/","│ │ │ │ ├── 客户管理/","│ │ │ │ ├── 餐计划/","│ │ │ │ ├── 营养计算/","│ │ │ ├── components/ # 通用组件","│ │ │ ├── hooks/ # 自定义 Hooks","│ │ │ ├── services/ # API 调用层","│ │ │ ├── store/ # 状态管理","│ │ │ └── utils/ # 工具函数","│ │ ├── app.json","│ │ └── package.json","│ └── web/ # Web 管理后台","│ ├── src/","│ │ ├── pages/","│ │ ├── components/","│ │ └── layouts/","│ └── package.json","├── packages/","│ └── shared/ # 共享类型/常量","├── server/ # NestJS 后端服务","│ ├── src/","│ │ ├── modules/ # 业务模块","│ │ │ ├── 食物库/","│ │ │ │ ├── 食物库.controller.ts","│ │ │ │ ├── 食物库.service.ts","│ │ │ │ ├── 食物库.module.ts","│ │ │ │ └── dto/","│ │ │ ├── 客户管理/","│ │ │ │ ├── 客户管理.controller.ts","│ │ │ │ ├── 客户管理.service.ts","│ │ │ │ ├── 客户管理.module.ts","│ │ │ │ └── dto/","│ │ │ ├── 餐计划/","│ │ │ │ ├── 餐计划.controller.ts","│ │ │ │ ├── 餐计划.service.ts","│ │ │ │ ├── 餐计划.module.ts","│ │ │ │ └── dto/","│ │ │ ├── 营养计算/","│ │ │ │ ├── 营养计算.controller.ts","│ │ │ │ ├── 营养计算.service.ts","│ │ │ │ ├── 营养计算.module.ts","│ │ │ │ └── dto/","│ │ │ ├── 购物清单/","│ │ │ │ ├── 购物清单.controller.ts","│ │ │ │ ├── 购物清单.service.ts","│ │ │ │ ├── 购物清单.module.ts","│ │ │ │ └── dto/","│ │ ├── common/ # 通用(guards, filters, interceptors","│ │ ├── prisma/ # Prisma ORM","│ │ │ └── schema.prisma","│ │ ├── config/ # 环境配置","│ │ └── main.ts","│ ├── test/","│ ├── Dockerfile","│ └── package.json","├── docker-compose.yml","├── .github/workflows/ # CI/CD","│ └── ci.yml","├── .env.example","├── README.md","└── turbo.json # Monorepo 配置"],"deployment":{"environments":["development","staging","production"],"strategy":"Docker Compose + Nginx / K8s(规模化)","services":["API Server (NestJS)","PostgreSQL 15","Redis 7"],"ci":"GitHub Actions → Build → Test → Deploy"},"meta":{"generatedAt":"2026-06-05T10:34:51.147Z","sourceDomain":"ecommerce","moduleCount":8,"tableCount":11,"apiEndpointCount":10}}