443 lines
15 KiB
JSON
443 lines
15 KiB
JSON
{
|
||
"projectName": "PetCare",
|
||
"domain": "pet",
|
||
"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│ PetCare — 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 Schedule │\n│ 3 日常记录 │\n│ 4 Storage │\n│ 5 附近医院 │\n│ 6 健康百科 │\n│ │\n└─────────────────────────────────────────────────────────┘",
|
||
"dataFlows": [
|
||
{
|
||
"page": "健康日程",
|
||
"route": "/schedule",
|
||
"description": "疫苗、驱虫、体检日历",
|
||
"dataFlow": [
|
||
"GET /api/schedules → 获取健康日程列表",
|
||
"POST /api/schedules → 创建健康日程"
|
||
],
|
||
"direction": "Client → API Gateway → Backend → Database → Response → Client"
|
||
},
|
||
{
|
||
"page": "日常记录",
|
||
"route": "/daily-log",
|
||
"description": "饮食/运动/排泄记录表单",
|
||
"dataFlow": [
|
||
"POST /api/daily-logs → 记录日常活动",
|
||
"GET /api/daily-logs → 查询日常记录"
|
||
],
|
||
"direction": "Client → API Gateway → Backend → Database → Response → Client"
|
||
},
|
||
{
|
||
"page": "成长相册",
|
||
"route": "/album",
|
||
"description": "时间线照片浏览",
|
||
"dataFlow": [
|
||
"POST /api/albums → 上传宠物照片"
|
||
],
|
||
"direction": "Client → API Gateway → Backend → Database → Response → Client"
|
||
}
|
||
],
|
||
"modules": [
|
||
{
|
||
"name": "宠物档案",
|
||
"label": "宠物档案",
|
||
"features": [
|
||
"宠物档案"
|
||
],
|
||
"responsibilities": [
|
||
"提供 宠物档案 相关功能"
|
||
]
|
||
},
|
||
{
|
||
"name": "schedule",
|
||
"label": "Schedule",
|
||
"features": [
|
||
"健康日程"
|
||
],
|
||
"responsibilities": [
|
||
"提供 健康日程 相关功能"
|
||
]
|
||
},
|
||
{
|
||
"name": "日常记录",
|
||
"label": "日常记录",
|
||
"features": [
|
||
"日常记录"
|
||
],
|
||
"responsibilities": [
|
||
"提供 日常记录 相关功能"
|
||
]
|
||
},
|
||
{
|
||
"name": "storage",
|
||
"label": "Storage",
|
||
"features": [
|
||
"成长相册"
|
||
],
|
||
"responsibilities": [
|
||
"提供 成长相册 相关功能"
|
||
]
|
||
},
|
||
{
|
||
"name": "附近医院",
|
||
"label": "附近医院",
|
||
"features": [
|
||
"附近医院"
|
||
],
|
||
"responsibilities": [
|
||
"提供 附近医院 相关功能"
|
||
]
|
||
},
|
||
{
|
||
"name": "健康百科",
|
||
"label": "健康百科",
|
||
"features": [
|
||
"健康百科"
|
||
],
|
||
"responsibilities": [
|
||
"提供 健康百科 相关功能"
|
||
]
|
||
},
|
||
{
|
||
"name": "content",
|
||
"label": "Content",
|
||
"features": [
|
||
"社区分享"
|
||
],
|
||
"responsibilities": [
|
||
"提供 社区分享 相关功能"
|
||
]
|
||
},
|
||
{
|
||
"name": "pet",
|
||
"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": "pets",
|
||
"description": "宠物档案表",
|
||
"fields": [
|
||
{
|
||
"name": "id",
|
||
"type": "UUID",
|
||
"constraints": "PK"
|
||
},
|
||
{
|
||
"name": "owner_id",
|
||
"type": "UUID",
|
||
"constraints": "FK → users.id"
|
||
},
|
||
{
|
||
"name": "name",
|
||
"type": "VARCHAR(64)",
|
||
"constraints": "NOT NULL"
|
||
},
|
||
{
|
||
"name": "species",
|
||
"type": "VARCHAR(32)"
|
||
},
|
||
{
|
||
"name": "breed",
|
||
"type": "VARCHAR(64)"
|
||
},
|
||
{
|
||
"name": "birth_date",
|
||
"type": "DATE"
|
||
},
|
||
{
|
||
"name": "weight_kg",
|
||
"type": "DECIMAL(5,2)"
|
||
},
|
||
{
|
||
"name": "avatar_url",
|
||
"type": "TEXT"
|
||
},
|
||
{
|
||
"name": "created_at",
|
||
"type": "TIMESTAMPTZ",
|
||
"constraints": "DEFAULT NOW()"
|
||
}
|
||
]
|
||
},
|
||
{
|
||
"table": "schedules",
|
||
"description": "健康日程表",
|
||
"fields": [
|
||
{
|
||
"name": "id",
|
||
"type": "UUID",
|
||
"constraints": "PK"
|
||
},
|
||
{
|
||
"name": "pet_id",
|
||
"type": "UUID",
|
||
"constraints": "FK → pets.id"
|
||
},
|
||
{
|
||
"name": "type",
|
||
"type": "VARCHAR(32)",
|
||
"constraints": "NOT NULL"
|
||
},
|
||
{
|
||
"name": "title",
|
||
"type": "VARCHAR(128)",
|
||
"constraints": "NOT NULL"
|
||
},
|
||
{
|
||
"name": "scheduled_at",
|
||
"type": "TIMESTAMPTZ"
|
||
},
|
||
{
|
||
"name": "completed",
|
||
"type": "BOOLEAN",
|
||
"constraints": "DEFAULT false"
|
||
}
|
||
]
|
||
},
|
||
{
|
||
"table": "daily_logs",
|
||
"description": "日常记录表",
|
||
"fields": [
|
||
{
|
||
"name": "id",
|
||
"type": "UUID",
|
||
"constraints": "PK"
|
||
},
|
||
{
|
||
"name": "pet_id",
|
||
"type": "UUID",
|
||
"constraints": "FK → pets.id"
|
||
},
|
||
{
|
||
"name": "category",
|
||
"type": "VARCHAR(32)",
|
||
"constraints": "NOT NULL"
|
||
},
|
||
{
|
||
"name": "value",
|
||
"type": "TEXT"
|
||
},
|
||
{
|
||
"name": "logged_at",
|
||
"type": "TIMESTAMPTZ",
|
||
"constraints": "DEFAULT NOW()"
|
||
}
|
||
]
|
||
}
|
||
],
|
||
"apiDesign": [
|
||
{
|
||
"resource": "albums",
|
||
"basePath": "/api/albums",
|
||
"endpoints": [
|
||
{
|
||
"method": "POST",
|
||
"path": "/api/albums",
|
||
"description": "上传宠物照片"
|
||
}
|
||
]
|
||
},
|
||
{
|
||
"resource": "daily-logs",
|
||
"basePath": "/api/daily-logs",
|
||
"endpoints": [
|
||
{
|
||
"method": "POST",
|
||
"path": "/api/daily-logs",
|
||
"description": "记录日常活动"
|
||
},
|
||
{
|
||
"method": "GET",
|
||
"path": "/api/daily-logs",
|
||
"description": "查询日常记录"
|
||
}
|
||
]
|
||
},
|
||
{
|
||
"resource": "hospitals",
|
||
"basePath": "/api/hospitals",
|
||
"endpoints": [
|
||
{
|
||
"method": "GET",
|
||
"path": "/api/hospitals",
|
||
"description": "查询附近医院"
|
||
}
|
||
]
|
||
},
|
||
{
|
||
"resource": "pets",
|
||
"basePath": "/api/pets",
|
||
"endpoints": [
|
||
{
|
||
"method": "POST",
|
||
"path": "/api/pets",
|
||
"description": "添加宠物档案"
|
||
},
|
||
{
|
||
"method": "GET",
|
||
"path": "/api/pets/:id",
|
||
"description": "获取宠物详情"
|
||
},
|
||
{
|
||
"method": "PUT",
|
||
"path": "/api/pets/:id",
|
||
"description": "更新宠物信息"
|
||
}
|
||
]
|
||
},
|
||
{
|
||
"resource": "schedules",
|
||
"basePath": "/api/schedules",
|
||
"endpoints": [
|
||
{
|
||
"method": "GET",
|
||
"path": "/api/schedules",
|
||
"description": "获取健康日程列表"
|
||
},
|
||
{
|
||
"method": "POST",
|
||
"path": "/api/schedules",
|
||
"description": "创建健康日程"
|
||
}
|
||
]
|
||
}
|
||
],
|
||
"directoryStructure": [
|
||
"petcare/",
|
||
"├── apps/",
|
||
"│ ├── mobile/ # React Native / Flutter 移动端",
|
||
"│ │ ├── src/",
|
||
"│ │ │ ├── screens/ # 页面组件",
|
||
"│ │ │ │ ├── 宠物档案/",
|
||
"│ │ │ │ ├── schedule/",
|
||
"│ │ │ │ ├── 日常记录/",
|
||
"│ │ │ │ ├── storage/",
|
||
"│ │ │ ├── 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/",
|
||
"│ │ │ ├── schedule/",
|
||
"│ │ │ │ ├── schedule.controller.ts",
|
||
"│ │ │ │ ├── schedule.service.ts",
|
||
"│ │ │ │ ├── schedule.module.ts",
|
||
"│ │ │ │ └── dto/",
|
||
"│ │ │ ├── 日常记录/",
|
||
"│ │ │ │ ├── 日常记录.controller.ts",
|
||
"│ │ │ │ ├── 日常记录.service.ts",
|
||
"│ │ │ │ ├── 日常记录.module.ts",
|
||
"│ │ │ │ └── dto/",
|
||
"│ │ │ ├── storage/",
|
||
"│ │ │ │ ├── storage.controller.ts",
|
||
"│ │ │ │ ├── storage.service.ts",
|
||
"│ │ │ │ ├── storage.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-04T22:58:48.869Z",
|
||
"sourceDomain": "pet",
|
||
"moduleCount": 8,
|
||
"tableCount": 4,
|
||
"apiEndpointCount": 9
|
||
}
|
||
} |