Files
steel_prices_service/CLAUDE.md
2026-01-06 09:19:12 +08:00

481 lines
15 KiB
Markdown
Raw 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.

# steel_prices_service - 钢材价格服务
> **项目状态**: 🌱 初始阶段(数据准备完成,待开发服务层)
>
> **最后更新**: 2026-01-05 16:13:47
---
## 变更记录 (Changelog)
### 2026-01-05 16:13:47
- 初始化根级文档
- 完成项目结构分析
- 识别数据模块并生成模块文档
- 创建 Mermaid 架构图
- 定义开发路线图
---
## 项目愿景
**steel_prices_service** 是一个钢材价格数据解析与查询服务,旨在:
1. **数据整合**: 从多个来源(我的钢铁网、钢厂官方、行业协会)采集钢材价格数据
2. **标准化存储**: 使用 MySQL 数据库统一存储和管理价格数据
3. **高效查询**: 提供快速、灵活的价格查询 API
4. **实时更新**: 支持定时任务自动采集和更新价格数据
### 核心价值
- 为钢材采购决策提供实时市场价格参考
- 支持历史价格趋势分析
- 多地区、多钢厂价格对比
- 自动化数据采集减少人工成本
---
## 架构总览
### 技术栈(规划中)
根据项目 README 和数据结构,预计技术栈为:
- **后端框架**: Express.js (Node.js)
- **数据库**: MySQL
- **数据格式**: JSON导入格式
- **API 设计**: RESTful
> 注意:项目目前处于数据准备阶段,尚未实现服务代码。
### 系统架构
```
┌─────────────────────────────────────────────────────────────┐
│ 数据采集层 │
│ 我的钢铁网 │ 钢厂官方 │ 行业协会 │ 手动导入 │
└─────────────────────┬───────────────────────────────────────┘
┌─────────────────────────────────────────────────────────────┐
│ 数据处理层 │
│ JSON 解析 │ 数据清洗 │ 验证 │ 转换 │
└─────────────────────┬───────────────────────────────────────┘
┌─────────────────────────────────────────────────────────────┐
│ 数据存储层 │
│ MySQL 数据库 │
│ 价格表 │ 索引优化 │ 定时归档 │
└─────────────────────┬───────────────────────────────────────┘
┌─────────────────────────────────────────────────────────────┐
│ 服务接口层 │
│ Express.js REST API │
│ 价格查询 │ 趋势分析 │ 数据导出 │
└─────────────────────────────────────────────────────────────┘
```
---
## 模块结构图
```mermaid
graph TD
Root["steel_prices_service<br/>(根目录)"]
Root --> Data["data/<br/>📦 数据模块"]
click Data "d:/Code/steel_prices_service/data/CLAUDE.md" "查看 data 模块文档"
style Root fill:#e1f5ff,stroke:#01579b,stroke-width:3px
style Data fill:#fff9c4,stroke:#f57f17,stroke-width:2px
```
---
## 模块索引
| 模块名 | 路径 | 职责 | 状态 | 文档 |
|--------|------|------|------|------|
| **数据模块** | `data/` | 存储和管理钢材价格原始数据JSON 格式) | ✅ 已完成 | [查看文档](./data/CLAUDE.md) |
| **服务模块** | (待创建) | Express.js 服务、API 接口 | ⏳ 待开发 | - |
| **数据导入** | (待创建) | JSON 解析、数据清洗、数据库导入 | ⏳ 待开发 | - |
| **测试模块** | (待创建) | 单元测试、集成测试 | ⏳ 待开发 | - |
---
## 数据资产
### 当前数据
| 数据源 | 文件 | 记录数 | 地区覆盖 | 更新日期 |
|--------|------|--------|----------|----------|
| **我的钢铁网** | `data/钢材网架.json` | 211+ 条 | 重庆、成都、广州、南宁 | 2026-01-05 |
| **德钢指导价** | `data/钢厂指导价.json` | 29,987 条 | 云南省内(玉溪、昭通等) | 2025-09-04 |
| **云南钢协** | `data/刚协指导价.json` | 900 条 | 昆明、玉溪、楚雄、大理 | 2026-01-05 |
### 数据模型
所有价格数据遵循统一的结构,包含以下关键字段:
- **商品信息**: 材质 (GOODS_MATERIAL)、规格 (GOODS_SPEC)、品名 (PARTSNAME_NAME)
- **价格信息**: 挂牌价、钢厂价、涨跌幅
- **来源信息**: 钢厂 (PRODUCTAREA_NAME)、地区 (PR_PRICE_REGION)、来源 (PR_PRICE_SOURCE)
- **时间信息**: 价格日期 (PIRCE_DATE)
- **唯一标识**: PRICE_ID
详细数据结构请参考 [data/CLAUDE.md](./data/CLAUDE.md)
---
## 运行与开发
### 当前状态
项目目前只有数据文件,尚未搭建服务层代码。
### 建议的开发环境
- **Node.js**: v18+ (推荐使用 LTS 版本)
- **MySQL**: 8.0+
- **包管理器**: npm 或 yarn
### 推荐的项目结构
```
steel_prices_service/
├── data/ # 数据文件目录(已存在)
│ ├── 钢材网架.json
│ ├── 钢厂指导价.json
│ └── 刚协指导价.json
├── src/ # 源代码目录(待创建)
│ ├── app.js # Express 应用入口
│ ├── config/ # 配置文件
│ │ └── database.js # 数据库连接配置
│ ├── routes/ # API 路由
│ │ └── prices.js # 价格查询接口
│ ├── models/ # 数据模型
│ │ └── Price.js # 价格数据模型
│ ├── services/ # 业务逻辑
│ │ ├── parser.js # JSON 解析服务
│ │ ├── importer.js # 数据导入服务
│ │ └── query.js # 查询服务
│ └── utils/ # 工具函数
│ └── validator.js # 数据验证
├── scripts/ # 脚本目录(待创建)
│ └── import-data.js # 数据导入脚本
├── tests/ # 测试目录(待创建)
│ ├── unit/ # 单元测试
│ └── integration/ # 集成测试
├── .env.example # 环境变量示例(待创建)
├── .gitignore # Git 忽略规则(待创建)
├── package.json # 项目配置(待创建)
├── README.md # 项目说明(已存在)
└── CLAUDE.md # AI 文档(本文件)
```
### 初始化步骤
1. **初始化 Node.js 项目**
```bash
npm init -y
```
2. **安装依赖**
```bash
npm install express mysql2 dotenv cors
npm install --save-dev nodemon jest
```
3. **创建数据库表**
```sql
CREATE TABLE steel_prices (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
price_id VARCHAR(64) UNIQUE NOT NULL COMMENT '价格唯一ID',
goods_material VARCHAR(32) NOT NULL COMMENT '材质牌号',
goods_spec VARCHAR(16) NOT NULL COMMENT '规格型号',
partsname_name VARCHAR(32) NOT NULL COMMENT '品名',
productarea_name VARCHAR(64) NOT NULL COMMENT '产地/钢厂',
price_source VARCHAR(32) NOT NULL COMMENT '价格来源',
price_region VARCHAR(32) NOT NULL COMMENT '价格地区',
pntree_name VARCHAR(32) NOT NULL COMMENT '分类名称',
price_date DATETIME NOT NULL COMMENT '价格日期',
make_price INT COMMENT '钢厂价(元/吨)',
hang_price INT COMMENT '挂牌价(元/吨)',
last_make_price INT COMMENT '上次钢厂价',
last_hang_price INT COMMENT '上次挂牌价',
make_price_updw VARCHAR(8) COMMENT '钢厂价涨跌',
hang_price_updw VARCHAR(8) COMMENT '挂牌价涨跌',
operator_code VARCHAR(16) COMMENT '操作员代码',
operator_name VARCHAR(32) COMMENT '操作员名称',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
INDEX idx_price_date (price_date),
INDEX idx_region_material (price_region, goods_material),
INDEX idx_source_date (price_source, price_date)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='钢材价格表';
```
4. **配置环境变量** (.env)
```env
DB_HOST=localhost
DB_PORT=3306
DB_USER=root
DB_PASSWORD=your_password
DB_NAME=steel_prices
PORT=3000
NODE_ENV=development
```
5. **导入数据**
```bash
node scripts/import-data.js
```
6. **启动服务**
```bash
npm start
```
---
## 测试策略
### 测试金字塔(建议)
```
┌──────────────┐
/ E2E 测试 \ (端到端测试)
/__________________\
/ 集成测试 (API) \ (API 接口测试)
/______________________\
/ 单元测试 (业务逻辑) \ (函数/类测试)
/____________________________\
```
### 测试工具推荐
- **单元测试**: Jest + Supertest
- **集成测试**: Jest + Test Database
- **E2E 测试**: Cypress 或 Playwright
- **API 测试**: Postman + Newman
### 关键测试场景
1. **数据导入测试**
- JSON 文件解析正确性
- 数据验证与清洗
- 重复数据处理
- 批量插入性能
2. **API 接口测试**
- 价格查询接口(按地区、材质、日期)
- 数据统计接口(平均价、涨跌幅)
- 错误处理(无效参数、数据不存在)
3. **性能测试**
- 大数据量查询响应时间
- 并发请求处理能力
- 数据库索引效果验证
---
## 编码规范
### JavaScript/Node.js 规范(建议)
1. **代码风格**
- 使用 ESLint + Prettier
- 采用 Airbnb Style Guide
- 强制使用分号
2. **命名约定**
- 变量和函数camelCase
- 类和构造函数PascalCase
- 常量UPPER_SNAKE_CASE
- 文件名kebab-case
3. **注释规范**
- JSDoc 格式文档注释
- 关键业务逻辑必须注释
- API 接口使用 OpenAPI/Swagger 文档
4. **错误处理**
- 使用 async/await + try-catch
- 统一错误中间件
- 详细的错误日志
### SQL 规范
- 表名snake_case
- 字段名snake_case
- 索引名idx_表名_字段名
- 必须添加字段注释
---
## AI 使用指引
### 给 AI 的提示词模板
#### 1. 数据库相关
```
"请根据 data/CLAUDE.md 中的数据结构,设计 MySQL 建表语句"
```
#### 2. API 开发
```
"请创建 Express.js 路由,实现按地区和材质查询价格的功能"
```
#### 3. 数据导入
```
"请编写 Node.js 脚本,将 data/*.json 文件导入到 MySQL 数据库"
```
#### 4. 性能优化
```
"请优化价格查询接口支持快速查询最近30天的平均价格"
```
### 项目上下文快速加载
在与 AI 对话时,可以这样说:
> "我正在开发 steel_prices_service 项目,这是一个钢材价格查询服务。项目使用 Express.js + MySQL数据文件在 data/ 目录下。请参考根目录的 CLAUDE.md 了解项目结构。"
---
## 开发路线图
### 第一阶段:基础搭建(预计 1-2 周)
- [ ] 初始化 Node.js 项目
- [ ] 创建数据库表结构
- [ ] 实现 JSON 数据解析模块
- [ ] 实现数据导入脚本
- [ ] 基础 API 框架搭建
### 第二阶段:核心功能(预计 2-3 周)
- [ ] 价格查询 API按地区、材质、日期
- [ ] 价格统计 API平均价、最高价、最低价
- [ ] 趋势分析 API涨跌幅、历史曲线
- [ ] 数据验证与清洗逻辑
- [ ] 错误处理与日志记录
### 第三阶段:增强功能(预计 1-2 周)
- [ ] 定时任务自动采集数据
- [ ] 数据变更通知
- [ ] 数据导出功能Excel、CSV
- [ ] API 文档Swagger
- [ ] 性能优化与缓存
### 第四阶段:测试与部署(预计 1 周)
- [ ] 单元测试覆盖
- [ ] 集成测试
- [ ] Docker 容器化
- [ ] CI/CD 流程
- [ ] 生产环境部署
---
## 常见问题 (FAQ)
### Q: 为什么选择 Express.js 而不是其他框架?
A: Express.js 是成熟稳定的 Node.js 框架,具有以下优势:
- 轻量级,灵活性高
- 中间件生态丰富
- 社区活跃,文档完善
- 适合构建 RESTful API
如果需要更完整的解决方案,也可以考虑 NestJS 或 Fastify。
### Q: 数据库如何选择?
A: 根据项目特点MySQL 是合适的选择:
- 结构化数据,关系清晰
- 事务支持强
- 索引优化成熟
- 运维成本低
未来如果数据量激增,可考虑:
- 分库分表Sharding
- 时序数据库InfluxDB
- 数据仓库ClickHouse
### Q: 如何保证数据一致性?
A: 建议采用以下策略:
1. 使用 PRICE_ID 作为唯一标识,避免重复导入
2. 使用 UPSERT 语句INSERT ... ON DUPLICATE KEY UPDATE
3. 添加数据校验和checksum
4. 记录数据导入日志
### Q: 如何处理大量历史数据?
A: 建议采用以下策略:
1. 按日期分表(如 `steel_prices_2025_01`
2. 定期归档历史数据(如 2 年前的数据)
3. 使用冷热数据分离(热数据在 SSD冷数据在 HDD
4. 考虑使用时序数据库或数据仓库
---
## 相关资源
### 技术文档
- [Express.js 官方文档](https://expressjs.com/)
- [MySQL 文档](https://dev.mysql.com/doc/)
- [Node.js 最佳实践](https://github.com/goldbergyoni/nodebestpractices)
### 相关工具
- **API 测试**: Postman, Insomnia
- **数据库管理**: MySQL Workbench, DBeaver
- **代码质量**: ESLint, Prettier
- **版本控制**: Git + GitHub
---
## 贡献指南
### 开发流程
1. Fork 本仓库
2. 创建特性分支 (`git checkout -b feature/AmazingFeature`)
3. 提交更改 (`git commit -m 'Add some AmazingFeature'`)
4. 推送到分支 (`git push origin feature/AmazingFeature`)
5. 开启 Pull Request
### Commit 规范
遵循 Conventional Commits 规范:
```
feat: 添加价格查询接口
fix: 修复数据导入时的编码问题
docs: 更新 API 文档
style: 代码格式化
refactor: 重构数据验证逻辑
test: 添加单元测试
chore: 更新依赖包
```
---
## 联系方式
- **项目位置**: `d:\Code\steel_prices_service`
- **文档维护**: AI Context Architect
- **最后更新**: 2026-01-05 16:13:47
---
**导航**: [data/ 模块文档](./data/CLAUDE.md) | [GitHub](https://github.com) | [API 文档](#) (待开发)