{"id":28898844,"url":"https://github.com/phj233/cine_vision_backend","last_synced_at":"2026-05-08T15:41:22.732Z","repository":{"id":296542268,"uuid":"991309076","full_name":"phj233/cine_vision_backend","owner":"phj233","description":null,"archived":false,"fork":false,"pushed_at":"2025-05-31T14:52:24.000Z","size":97,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"master","last_synced_at":"2025-06-01T00:43:34.024Z","etag":null,"topics":["fastify","nodejs","prisma","typescript"],"latest_commit_sha":null,"homepage":"","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/phj233.png","metadata":{"files":{"readme":"readme.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2025-05-27T12:39:37.000Z","updated_at":"2025-05-31T14:52:28.000Z","dependencies_parsed_at":"2025-06-07T22:16:51.078Z","dependency_job_id":null,"html_url":"https://github.com/phj233/cine_vision_backend","commit_stats":null,"previous_names":["phj233/cine_vision_backend"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/phj233/cine_vision_backend","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/phj233%2Fcine_vision_backend","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/phj233%2Fcine_vision_backend/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/phj233%2Fcine_vision_backend/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/phj233%2Fcine_vision_backend/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/phj233","download_url":"https://codeload.github.com/phj233/cine_vision_backend/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/phj233%2Fcine_vision_backend/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":261088330,"owners_count":23107676,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["fastify","nodejs","prisma","typescript"],"created_at":"2025-06-21T08:00:30.019Z","updated_at":"2026-05-08T15:41:22.727Z","avatar_url":"https://github.com/phj233.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Cine Vision Backend 项目文档\n\n## 1. 项目概述\n这是一个基于 TypeScript Prisma 和 Fastify 的后端服务，用于管理和分析电影数据。主要功能包括：\n- **电影数据管理**：提供电影数据的增删改查操作。\n- **数据可视化**：支持多种电影数据的统计和可视化分析。\n- **CSV 数据导入**：允许通过 CSV 文件批量导入电影数据。\n\n项目使用模块化设计，包含控制器、服务、工具类等模块，确保代码的可维护性和扩展性。\n\n## 2. 项目结构\n```\n.\n├── logs\n│   ├── error.log\n│   └── info.log\n├── prisma\n│   ├── migrations\n│   │   ├── 20250517054126_init\n│   │   │   └── migration.sql\n│   │   ├── 20250517142038_change_cast_to_string_array\n│   │   │   └── migration.sql\n│   │   └── migration_lock.toml\n│   └── schema.prisma\n├── src\n│   ├── config\n│   │   ├── index.js\n│   │   └── index.ts\n│   ├── controllers\n│   │   ├── import.controller.js\n│   │   ├── import.controller.ts\n│   │   ├── movie.controller.js\n│   │   ├── movie.controller.ts\n│   │   ├── visualization.controller.js\n│   │   └── visualization.controller.ts\n│   ├── logs\n│   │   └── error.log\n│   ├── routes\n│   │   ├── import.route.js\n│   │   ├── import.route.ts\n│   │   ├── movie.route.js\n│   │   └── movie.route.ts\n│   ├── services\n│   │   ├── csv.service.js\n│   │   ├── csv.service.ts\n│   │   ├── movie.service.js\n│   │   └── movie.service.ts\n│   ├── types\n│   ├── utils\n│   │   ├── advanced-clean-database.js\n│   │   ├── advanced-clean-database.ts\n│   │   ├── clean-database.js\n│   │   ├── clean-database.ts\n│   │   ├── db-test.js\n│   │   ├── db-test.ts\n│   │   ├── error-handler.js\n│   │   ├── error-handler.ts\n│   │   ├── logger.js\n│   │   ├── logger.ts\n│   │   ├── parser.js\n│   │   ├── parser.ts\n│   │   ├── stream-processor.js\n│   │   ├── stream-processor.ts\n│   │   ├── validator.js\n│   │   └── validator.ts\n│   ├── alias.js\n│   ├── alias.ts\n│   ├── app.js\n│   ├── app.ts\n│   ├── types.js\n│   └── types.ts\n├── tmp\n├── package-lock.json\n├── package.json\n└── tsconfig.json\n```\n\n### 目录说明\n- **logs**: 存放日志文件。\n- **prisma**: 包含 Prisma 配置和数据库迁移文件。\n- **src**: 源代码目录，包含配置、控制器、路由、服务、工具类等。\n- **tmp**: 临时文件存储目录。\n- **package.json**: 项目依赖和脚本配置。\n- **tsconfig.json**: TypeScript 编译配置。\n\n## 3. 依赖管理\n### 主要依赖\n```json\n{\n  \"dependencies\": {\n    \"@fastify/cors\": \"^11.0.1\",\n    \"@fastify/multipart\": \"^9.0.3\",\n    \"@prisma/client\": \"^6.8.2\",\n    \"csv-parse\": \"^5.6.0\",\n    \"dotenv\": \"^16.5.0\",\n    \"fastify\": \"^5.3.3\",\n    \"fs-extra\": \"^11.3.0\",\n    \"pino\": \"^9.6.0\"\n  },\n  \"devDependencies\": {\n    \"@types/fs-extra\": \"^11.0.4\",\n    \"@types/node\": \"^22.15.18\",\n    \"typescript\": \"^5.8.3\"\n  }\n}\n```\n\n### 脚本命令\n```json\n{\n  \"scripts\": {\n    \"build\": \"tsc -p tsconfig.json\",\n    \"start\": \"npm run build \u0026\u0026 node src/app.js\",\n    \"dev\": \"tsc -w \u0026 nodemon src/app.js\",\n    \"test\": \"echo \\\"Error: no test specified\\\" \u0026\u0026 exit 1\"\n  }\n}\n```\n\n## 4. 配置文件\n### `src/config/index.ts`\n```ts\nimport dotenv from 'dotenv';\n\ndotenv.config();\n\nexport default {\n  port: process.env.PORT || 3000,\n  database: {\n    url: process.env.DATABASE_URL || 'postgresql://postgre:postgre@localhost:5432/movies'\n  },\n  csv: {\n    batchSize: parseInt(process.env.CSV_BATCH_SIZE || '1000'),\n    maxFileSize: parseInt(process.env.CSV_MAX_FILE_SIZE || '1073741824'), // 1GB\n    timeout: parseInt(process.env.CSV_TIMEOUT || '3600000'), // 1小时\n    retryCount: parseInt(process.env.CSV_RETRY_COUNT || '3'),\n    retryDelay: parseInt(process.env.CSV_RETRY_DELAY || '1000') // 1秒\n  },\n  logging: {\n    level: process.env.LOG_LEVEL || 'debug',\n    file: {\n      enabled: process.env.LOG_FILE_ENABLED === 'true',\n      path: process.env.LOG_FILE_PATH || 'logs/app.log'\n    }\n  }\n};\n```\n\n### `tsconfig.json`\n- 使用 CommonJS 模块系统。\n- 启用严格类型检查。\n- 支持别名路径（`@/*` 映射到 `src/*`）。\n\n## 5. 数据库模型\n### `prisma/schema.prisma`\n```prisma\nmodel Movie {\n  id                       String    @id @unique // 电影的唯一标识符\n  title                    String // 电影标题\n  vote_average             Float // 平均评分\n  vote_count               Int // 评分人数\n  status                   String // 电影状态（如上映、未上映等）\n  release_date             DateTime? // 发行日期\n  revenue                  BigInt // 票房收入\n  runtime                  Int? // 时长（分钟）\n  budget                   BigInt // 预算\n  imdb_id                  String? // IMDb ID\n  original_language        String? // 原始语言\n  original_title           String // 原始标题\n  overview                 String? // 概述/简介\n  popularity               Float? // 流行度评分\n  tagline                  String? // 标语\n  genres                   String[] // 类型数组\n  production_companies     Json // 制作公司信息（JSON格式）\n  production_countries     String[] // 制作国家/地区\n  spoken_languages         String[] // 使用的语言\n  cast                     String[] // 演员列表\n  director                 String[] // 导演列表\n  director_of_photography  String[] // 摄影指导列表\n  writers                  String[] // 编剧列表\n  producers                String[] // 制片人列表\n  music_composer           String[] // 音乐作曲家列表\n  imdb_rating              Float? // IMDb 评分\n  imdb_votes               Int? // IMDb 评分人数\n  poster_path              String? // 海报图片路径\n\n  @@index([release_date]) // 在发行日期上创建索引\n  @@index([genres], type: Gin) // 在类型上创建Gin索引\n  @@index([vote_average]) // 在平均评分上创建索引\n}\n```\n\n字段说明：\n- **id**: 电影的唯一标识符\n- **title**: 电影标题\n- **vote_average**: 平均评分\n- **vote_count**: 评分人数\n- **status**: 电影状态（如上映、未上映等）\n- **release_date**: 发行日期\n- **revenue**: 票房收入\n- **runtime**: 时长（分钟）\n- **budget**: 预算\n- **imdb_id**: IMDb ID\n- **original_language**: 原始语言\n- **original_title**: 原始标题\n- **overview**: 概述/简介\n- **popularity**: 流行度评分\n- **tagline**: 标语\n- **genres**: 类型数组\n- **production_companies**: 制作公司信息（JSON格式）\n- **production_countries**: 制作国家/地区\n- **spoken_languages**: 使用的语言\n- **cast**: 演员列表\n- **director**: 导演列表\n- **director_of_photography**: 摄影指导列表\n- **writers**: 编剧列表\n- **producers**: 制片人列表\n- **music_composer**: 音乐作曲家列表\n- **imdb_rating**: IMDb 评分\n- **imdb_votes**: IMDb 评分人数\n- **poster_path**: 海报图片路径\n\n索引说明：\n- **release_date**: 在发行日期上创建索引以加速按年份查询\n- **genres**: 在类型上创建Gin索引以加速按类型查询\n- **vote_average**: 在平均评分上创建索引以加速按评分排序\n\n## 6. 核心模块\n### 控制器\n#### `src/controllers/movie.controller.ts`\n- 提供电影数据的查询接口。\n- 支持分页、过滤、排序等功能。\n- 实现了高级查询功能，如相似电影推荐、随机推荐等。\n\n#### `src/controllers/visualization.controller.ts`\n- 提供电影数据的可视化接口。\n- 支持评分分布、年度趋势、类型对比等多种分析。\n\n#### `src/controllers/import.controller.ts`\n- 实现了 CSV 文件的上传和处理。\n- 支持大文件流式处理，避免内存溢出。\n\n### 工具类\n#### `src/utils/stream-processor.ts`\n- 实现了 CSV 流的解析和数据库写入。\n- 支持批处理和错误重试机制。\n\n#### `src/utils/parser.ts`\n- 解析制作公司和演员信息。\n- 支持多种格式的输入。\n\n#### `src/utils/error-handler.ts`\n- 自定义错误类（如 ValidationError, NotFoundError）。\n- 异步错误处理包装器。\n\n#### `src/utils/logger.ts`\n- 日志记录器，支持多级日志输出（info, error, warn, debug）。\n\n## 7. API 接口\n### `/api/v1/movies`\n- `GET /movies`: 获取电影列表（支持分页、过滤、排序）。\n- `GET /movies/all`: 获取所有电影。\n- `GET /movies/:id`: 获取单部电影详情。\n- `GET /movies/search`: 搜索电影（支持关键词搜索）。\n- `GET /recommendations/random`: 获取随机推荐电影。\n- `GET /genres/stats`: 获取电影类型统计信息。\n- `GET /stats/years`: 按年份分组的电影数量。\n- `GET /stats/summary`: 电影数据统计摘要。\n- `GET /visualization/rating-distribution`: 电影评分分布。\n- `GET /visualization/yearly-trends`: 年度趋势分析。\n- `GET /visualization/genre-comparison`: 类型对比分析。\n- `GET /visualization/runtime-distribution`: 电影时长分布。\n- `GET /visualization/top-production-companies`: 制作公司排名。\n- `GET /visualization/actor-collaborations`: 演员合作网络分析。\n- `GET /visualization/budget-revenue`: 预算与票房关系分析。\n\n### `/api/v1/import`\n- `POST /import`: 上传并处理 CSV 文件。\n\n## 8. 日志与测试工具\n- 日志文件存放在 `logs` 目录中。\n- 日志级别可通过环境变量配置。\n- 支持开发环境下的调试日志。\n\n## 9. 构建与部署\n### 开发环境\n- 使用 `npm run dev` 启动开发服务器。\n- 自动监听文件变化并重启服务。\n\n### 生产环境\n- 使用 `npm run build` 构建生产版本。\n- 使用 `npm start` 启动生产服务。\n\n### 部署建议\n- 使用 PM2 等进程管理工具确保服务稳定性。\n- 配置反向代理（如 Nginx）以提高性能和安全性。\n\n## 10. 总结\n该项目是一个功能齐全的电影数据分析平台，具备强大的数据导入、查询和可视化能力。通过合理的模块划分和良好的错误处理机制，确保了系统的稳定性和可维护性。","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fphj233%2Fcine_vision_backend","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fphj233%2Fcine_vision_backend","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fphj233%2Fcine_vision_backend/lists"}