# ๐Ÿ—๏ธ Steel Prices Service node scripts/import-data.js api --startDate 2025-01-01 --endDate 2026-01-01 > ไธ€ไธชไธ“ไธš็š„้’ขๆไปทๆ ผๆŸฅ่ฏขไธŽๅˆ†ๆžๆœๅŠกๅนณๅฐ [![Node.js](https://img.shields.io/badge/Node.js-Express.js-green)](https://nodejs.org/) [![Database](https://img.shields.io/badge/Database-MySQL-blue)](https://www.mysql.com/) [![License](https://img.shields.io/badge/License-MIT-yellow.svg)](LICENSE) [![Status](https://img.shields.io/badge/Status-๐ŸŒฑ%20Initial-orange)](https://github.com) --- ## ๐Ÿ“– ้กน็›ฎ็ฎ€ไป‹ Steel Prices Service ๆ˜ฏไธ€ไธชๅŸบไบŽ **Express.js + MySQL** ็š„้’ขๆไปทๆ ผๆ•ฐๆฎ็ฎก็†ไธŽๆŸฅ่ฏขๆœๅŠกใ€‚้กน็›ฎ่‡ดๅŠ›ไบŽไธบ้’ขๆ่กŒไธšๆไพ›ๅฎžๆ—ถใ€ๅ‡†็กฎ็š„ไปทๆ ผๆ•ฐๆฎๆŸฅ่ฏขใ€็ปŸ่ฎกๅˆ†ๆžๅ’Œ่ถ‹ๅŠฟ้ข„ๆต‹ๅŠŸ่ƒฝใ€‚ ### ๆ ธๅฟƒๅŠŸ่ƒฝ - ๐Ÿ“Š **ๆ•ฐๆฎ่งฃๆžไธŽๅฏผๅ…ฅ** - ๆ”ฏๆŒ JSON ๆ ผๅผ็š„้’ขๆไปทๆ ผๆ•ฐๆฎๆ‰น้‡ๅฏผๅ…ฅ - ๐Ÿ” **็ตๆดปๆŸฅ่ฏข** - ๆŒ‰ๅœฐๅŒบใ€ๆ่ดจใ€่ง„ๆ ผใ€ๆ—ฅๆœŸ่Œƒๅ›ด็ญ‰ๅคš็ปดๅบฆๆŸฅ่ฏข - ๐Ÿ“ˆ **็ปŸ่ฎกๅˆ†ๆž** - ไปทๆ ผ่ถ‹ๅŠฟๅˆ†ๆžใ€ๅŒบๅŸŸๅฏนๆฏ”ใ€ๅ‡ไปท่ฎก็ฎ— - ๐Ÿš€ **้ซ˜ๆ€ง่ƒฝ** - ๆ•ฐๆฎๅบ“็ดขๅผ•ไผ˜ๅŒ–๏ผŒๆŸฅ่ฏขๅ“ๅบ”ๅฟซ้€Ÿ - ๐Ÿ”„ **ๅฎšๆ—ถๆ›ดๆ–ฐ** - ่‡ชๅŠจ้‡‡้›†ๆœ€ๆ–ฐๅธ‚ๅœบไปทๆ ผๆ•ฐๆฎ - ๐Ÿ“ฑ **RESTful API** - ๆ ‡ๅ‡†ๅŒ–ๆŽฅๅฃ่ฎพ่ฎก๏ผŒๆ˜“ไบŽ้›†ๆˆ --- ## ๐Ÿ—๏ธ ๆŠ€ๆœฏๆžถๆž„ ### ๆŠ€ๆœฏๆ ˆ | ๅฑ‚็บง | ๆŠ€ๆœฏ้€‰ๅž‹ | ่ฏดๆ˜Ž | |------|----------|------| | **ๅŽ็ซฏๆก†ๆžถ** | Express.js | ่ฝป้‡็บง Node.js Web ๆก†ๆžถ | | **ๆ•ฐๆฎๅบ“** | MySQL 8.0+ | ๅ…ณ็ณปๅž‹ๆ•ฐๆฎๅบ“๏ผŒๅญ˜ๅ‚จไปทๆ ผๆ•ฐๆฎ | | **API ๆ–‡ๆกฃ** | Swagger (OpenAPI 3.0) | ไบคไบ’ๅผ API ๆ–‡ๆกฃ | | **ORM** | Sequelize / ๅŽŸ็”Ÿ SQL | ๆ•ฐๆฎๅบ“ๆ“ไฝœๆŠฝ่ฑกๅฑ‚ | | **ๆ•ฐๆฎ้‡‡้›†** | Axios + Cheerio | ็ฝ‘็ปœ็ˆฌ่™ซ๏ผŒ่‡ชๅŠจ้‡‡้›†ไปทๆ ผๆ•ฐๆฎ | | **ไปปๅŠก่ฐƒๅบฆ** | node-cron | ๅฎšๆ—ถไปปๅŠก๏ผŒ่‡ชๅŠจๆ›ดๆ–ฐๆ•ฐๆฎ | | **ๆต‹่ฏ•** | Jest / Mocha | ๅ•ๅ…ƒๆต‹่ฏ•ไธŽ้›†ๆˆๆต‹่ฏ• | | **ๅฎนๅ™จๅŒ–** | Docker | ๅบ”็”จๅฎนๅ™จๅŒ–้ƒจ็ฝฒ | ### ็ณป็ปŸๆžถๆž„ ``` โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ ๅฎขๆˆท็ซฏๅฑ‚ (Client) โ”‚ โ”‚ Web / Mobile App / Third Party โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚ HTTPS / REST API โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ ๆœๅŠกๆŽฅๅฃๅฑ‚ (API Layer) โ”‚ โ”‚ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ โ”‚ โ”‚ REST API โ”‚ โ”‚ WebSocket โ”‚ โ”‚ โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ ไธšๅŠก้€ป่พ‘ๅฑ‚ (Service Layer) โ”‚ โ”‚ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ โ”‚ โ”‚ ๆŸฅ่ฏขๆœๅŠก โ”‚ โ”‚ ็ปŸ่ฎกๆœๅŠก โ”‚ โ”‚ ้‡‡้›†ๆœๅŠก โ”‚ โ”‚ โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ ๆ•ฐๆฎ่ฎฟ้—ฎๅฑ‚ (Data Layer) โ”‚ โ”‚ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ โ”‚ โ”‚ MySQL โ”‚ โ”‚ โ”‚ โ”‚ (ไธปๅญ˜ๅ‚จ) โ”‚ โ”‚ โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ ``` --- ## ๐Ÿ“ฆ ๆ•ฐๆฎ่ต„ไบง ้กน็›ฎๅฝ“ๅ‰ๅŒ…ๅซ **31,098 ๆก**้’ขๆไปทๆ ผๆ•ฐๆฎ่ฎฐๅฝ•๏ผš | ๆ•ฐๆฎๆบ | ่ฎฐๅฝ•ๆ•ฐ | ่ฆ†็›–ๅœฐๅŒบ | ๆ›ดๆ–ฐๆ—ฅๆœŸ | ็Šถๆ€ | |--------|--------|----------|----------|------| | **ๆˆ‘็š„้’ข้“็ฝ‘** | 211 ๆก | ้‡ๅบ†ใ€ๆˆ้ƒฝใ€ๅนฟๅทžใ€ๅ—ๅฎ | 2026-01-05 | โœ… ๆ–ฐ้ฒœ | | **ๅพท้’ขๆŒ‡ๅฏผไปท** | 29,987 ๆก | ไบ‘ๅ—๏ผˆ็މๆบชใ€ๆ˜ญ้€š็ญ‰๏ผ‰ | 2025-09-04 | โš ๏ธ ้™ˆๆ—ง | | **ไบ‘ๅ—้’ขๅ** | 900 ๆก | ๆ˜†ๆ˜Žใ€็މๆบชใ€ๆฅš้›„ใ€ๅคง็† | 2026-01-05 | โœ… ๆ–ฐ้ฒœ | ๆ•ฐๆฎๆ–‡ไปถไฝไบŽ [`data/`](data/) ็›ฎๅฝ•๏ผŒ่ฏฆ่ง [data/CLAUDE.md](data/CLAUDE.md)ใ€‚ --- ## ๐Ÿš€ ๅฟซ้€Ÿๅผ€ๅง‹ ### ็Žฏๅขƒ่ฆๆฑ‚ - **Node.js**: >= 16.x - **MySQL**: >= 8.0 ### ๅฎ‰่ฃ…ๆญฅ้ชค #### 1. ๅ…‹้š†้กน็›ฎ ```bash git clone https://github.com/your-username/steel_prices_service.git cd steel_prices_service ``` #### 2. ๅฎ‰่ฃ…ไพ่ต– ```bash npm install ``` #### 3. ้…็ฝฎ็Žฏๅขƒๅ˜้‡ ๅคๅˆถ `.env.example` ๅˆฐ `.env` ๅนถ้…็ฝฎ๏ผš ```bash cp .env.example .env ``` ็ผ–่พ‘ `.env` ๆ–‡ไปถ๏ผš ```env # ๆœๅŠกๅ™จ้…็ฝฎ NODE_ENV=development PORT=3000 # ๆ•ฐๆฎๅบ“้…็ฝฎ DB_HOST=localhost DB_PORT=3306 DB_NAME=steel_prices DB_USER=root DB_PASSWORD=your_password # ๆ—ฅๅฟ—้…็ฝฎ LOG_LEVEL=info ``` #### 4. ๅˆๅง‹ๅŒ–ๆ•ฐๆฎๅบ“ ```bash # ๅˆ›ๅปบๆ•ฐๆฎๅบ“ mysql -u root -p -e "CREATE DATABASE steel_prices CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;" # ๅฏผๅ…ฅ่กจ็ป“ๆž„๏ผˆไฝฟ็”จ scripts/init-db.sql ๆˆ–่ฟ่กŒๅˆๅง‹ๅŒ–่„šๆœฌ๏ผ‰ npm run db:init # ๅฏผๅ…ฅๆ•ฐๆฎ๏ผˆไปŽ data/ ็›ฎๅฝ•็š„ JSON ๆ–‡ไปถ๏ผ‰ npm run db:import ``` #### 5. ๅฏๅŠจๆœๅŠก ```bash # ๅผ€ๅ‘ๆจกๅผ๏ผˆ็ƒญ้‡่ฝฝ๏ผ‰ npm run dev # ็”Ÿไบงๆจกๅผ npm start ``` ๆœๅŠกๅฐ†ๅœจ `http://localhost:3000` ๅฏๅŠจใ€‚ --- ## ๐Ÿ“š API ๆ–‡ๆกฃ ### ๐Ÿ“– ไบคไบ’ๅผๆ–‡ๆกฃ๏ผˆSwagger UI๏ผ‰ ๅฏๅŠจๆœๅŠกๅŽ๏ผŒ่ฎฟ้—ฎ **Swagger UI** ๆŸฅ็œ‹ๅฎŒๆ•ด็š„ API ๆ–‡ๆกฃ๏ผš ``` http://localhost:3000/api-docs ``` **ๅŠŸ่ƒฝ็‰นๆ€ง๏ผš** - ๐Ÿ“– ๅฎŒๆ•ด็š„ API ๆŽฅๅฃๆ–‡ๆกฃ - ๐Ÿงช ็›ดๆŽฅๅœจๆต่งˆๅ™จไธญๆต‹่ฏ• API - ๐Ÿ“ ่ฏฆ็ป†็š„่ฏทๆฑ‚/ๅ“ๅบ”็คบไพ‹ - ๐Ÿ” ๅ‚ๆ•ฐ่ฏดๆ˜Žๅ’Œ้ชŒ่ฏ่ง„ๅˆ™ - ๐ŸŽจ ็พŽ่ง‚็š„ไบคไบ’ๅผ็•Œ้ข ่ฏฆ็ป†ไฝฟ็”จ่ฏดๆ˜Ž่ฏทๆŸฅ็œ‹๏ผš[API ๆ–‡ๆกฃๆŒ‡ๅ—](docs/API_DOCUMENTATION.md) ### ๅŸบ็ก€ไฟกๆฏ - **Base URL**: `http://localhost:3000/api` - **ๆ•ฐๆฎๆ ผๅผ**: JSON - **ๅญ—็ฌฆ็ผ–็ **: UTF-8 - **API ่ง„่Œƒ**: OpenAPI 3.0 ### ๆ ธๅฟƒๆŽฅๅฃ #### 1. ๆŒ‰ๅœฐๅŒบๆŸฅ่ฏขไปทๆ ผ ```http GET /api/prices/region?region=ๆ˜†ๆ˜Ž&date=2026-01-05 ``` **ๅ“ๅบ”็คบไพ‹**: ```json { "success": true, "data": [ { "id": 1, "region": "ๆ˜†ๆ˜Ž", "material": "่žบ็บน้’ข", "specification": "HRB400 ฮฆ16-25mm", "price": 4200, "unit": "ๅ…ƒ/ๅจ", "date": "2026-01-05", "source": "ไบ‘ๅ—้’ขๅ" } ], "total": 1 } ``` #### 2. ๆŒ‰ๆ่ดจๅ’Œ่ง„ๆ ผๆŸฅ่ฏข ```http GET /api/prices/search?material=่žบ็บน้’ข&specification=HRB400&startDate=2026-01-01&endDate=2026-01-05 ``` #### 3. ไปทๆ ผ็ปŸ่ฎกๅˆ†ๆž ```http GET /api/prices/stats?region=ๆ˜†ๆ˜Ž&material=่žบ็บน้’ข&days=30 ``` **ๅ“ๅบ”็คบไพ‹**: ```json { "success": true, "data": { "avgPrice": 4250.5, "minPrice": 4100, "maxPrice": 4400, "trend": "up", "changeRate": "+2.5%" } } ``` #### 4. ๆ•ฐๆฎๅฏผๅ…ฅ ```http POST /api/import Content-Type: multipart/form-data file: prices.json ``` ### ๅฎŒๆ•ด API ๆ–‡ๆกฃ ่ฏฆ็ป†็š„ API ๆ–‡ๆกฃ่ฏทๆŸฅ็œ‹๏ผš - **Swagger UI**: `http://localhost:3000/api-docs` ๏ผˆๆŽจ่๏ผ‰ - **JSON ่ง„่Œƒ**: `http://localhost:3000/api-docs.json` - **ไฝฟ็”จๆŒ‡ๅ—**: [API Documentation](docs/API_DOCUMENTATION.md) --- ## ๐Ÿงช ๆต‹่ฏ• ```bash # ่ฟ่กŒๆ‰€ๆœ‰ๆต‹่ฏ• npm test # ่ฟ่กŒๅ•ๅ…ƒๆต‹่ฏ• npm run test:unit # ่ฟ่กŒ้›†ๆˆๆต‹่ฏ• npm run test:integration # ็”Ÿๆˆๆต‹่ฏ•่ฆ†็›–็އๆŠฅๅ‘Š npm run test:coverage ``` --- ## ๐Ÿ“ ้กน็›ฎ็ป“ๆž„ ``` steel_prices_service/ โ”œโ”€โ”€ src/ # ๆบไปฃ็ ็›ฎๅฝ• โ”‚ โ”œโ”€โ”€ config/ # ้…็ฝฎๆ–‡ไปถ โ”‚ โ”‚ โ”œโ”€โ”€ database.js # ๆ•ฐๆฎๅบ“้…็ฝฎ โ”‚ โ”‚ โ””โ”€โ”€ logger.js # ๆ—ฅๅฟ—้…็ฝฎ โ”‚ โ”œโ”€โ”€ controllers/ # ๆŽงๅˆถๅ™จๅฑ‚ โ”‚ โ”‚ โ”œโ”€โ”€ priceController.js โ”‚ โ”‚ โ””โ”€โ”€ importController.js โ”‚ โ”œโ”€โ”€ services/ # ไธšๅŠก้€ป่พ‘ๅฑ‚ โ”‚ โ”‚ โ”œโ”€โ”€ priceService.js โ”‚ โ”‚ โ”œโ”€โ”€ statsService.js โ”‚ โ”‚ โ””โ”€โ”€ crawlService.js โ”‚ โ”œโ”€โ”€ models/ # ๆ•ฐๆฎๆจกๅž‹ โ”‚ โ”‚ โ”œโ”€โ”€ Price.js โ”‚ โ”‚ โ””โ”€โ”€ index.js โ”‚ โ”œโ”€โ”€ routes/ # ่ทฏ็”ฑๅฎšไน‰ โ”‚ โ”‚ โ”œโ”€โ”€ api.js โ”‚ โ”‚ โ””โ”€โ”€ index.js โ”‚ โ”œโ”€โ”€ middlewares/ # ไธญ้—ดไปถ โ”‚ โ”‚ โ”œโ”€โ”€ errorHandler.js โ”‚ โ”‚ โ””โ”€โ”€ validator.js โ”‚ โ”œโ”€โ”€ utils/ # ๅทฅๅ…ทๅ‡ฝๆ•ฐ โ”‚ โ”‚ โ”œโ”€โ”€ csvParser.js โ”‚ โ”‚ โ””โ”€โ”€ dateHelper.js โ”‚ โ”œโ”€โ”€ tasks/ # ๅฎšๆ—ถไปปๅŠก โ”‚ โ”‚ โ””โ”€โ”€ priceCrawler.js โ”‚ โ””โ”€โ”€ app.js # Express ๅบ”็”จๅ…ฅๅฃ โ”œโ”€โ”€ data/ # ๆ•ฐๆฎๆ–‡ไปถ็›ฎๅฝ• โ”‚ โ”œโ”€โ”€ ้’ขๆ็ฝ‘ๆžถ.json โ”‚ โ”œโ”€โ”€ ้’ขๅŽ‚ๆŒ‡ๅฏผไปท.json โ”‚ โ”œโ”€โ”€ ๅˆšๅๆŒ‡ๅฏผไปท.json โ”‚ โ””โ”€โ”€ CLAUDE.md # ๆ•ฐๆฎๆจกๅ—ๆ–‡ๆกฃ โ”œโ”€โ”€ scripts/ # ่„šๆœฌ็›ฎๅฝ• โ”‚ โ”œโ”€โ”€ init-db.sql # ๆ•ฐๆฎๅบ“ๅˆๅง‹ๅŒ–่„šๆœฌ โ”‚ โ””โ”€โ”€ import-data.js # ๆ•ฐๆฎๅฏผๅ…ฅ่„šๆœฌ โ”œโ”€โ”€ tests/ # ๆต‹่ฏ•็›ฎๅฝ• โ”‚ โ”œโ”€โ”€ unit/ โ”‚ โ””โ”€โ”€ integration/ โ”œโ”€โ”€ docs/ # ๆ–‡ๆกฃ็›ฎๅฝ• โ”‚ โ”œโ”€โ”€ api.md # API ๆ–‡ๆกฃ โ”‚ โ””โ”€โ”€ architecture.md # ๆžถๆž„่ฎพ่ฎกๆ–‡ๆกฃ โ”œโ”€โ”€ .env.example # ็Žฏๅขƒๅ˜้‡็คบไพ‹ โ”œโ”€โ”€ .gitignore # Git ๅฟฝ็•ฅๆ–‡ไปถ โ”œโ”€โ”€ docker-compose.yml # Docker ็ผ–ๆŽ’ๆ–‡ไปถ โ”œโ”€โ”€ Dockerfile # Docker ้•œๅƒๆž„ๅปบๆ–‡ไปถ โ”œโ”€โ”€ package.json # ้กน็›ฎ้…็ฝฎ โ”œโ”€โ”€ CLAUDE.md # ้กน็›ฎ AI ไธŠไธ‹ๆ–‡ๆ–‡ๆกฃ โ””โ”€โ”€ README.md # ้กน็›ฎ่ฏดๆ˜Žๆ–‡ๆกฃ ``` --- ## ๐Ÿ”ง ๅผ€ๅ‘ๆŒ‡ๅ— ### ็ผ–็ ่ง„่Œƒ ้กน็›ฎ้ตๅพชไปฅไธ‹็ผ–็ ่ง„่Œƒ๏ผˆ่ฏฆ่ง [CLAUDE.md](CLAUDE.md)๏ผ‰๏ผš - **SOLID ๅŽŸๅˆ™** - ๅ•ไธ€่Œ่ดฃใ€ๅผ€้—ญๅŽŸๅˆ™ใ€้‡Œๆฐๆ›ฟๆขใ€ๆŽฅๅฃ้š”็ฆปใ€ไพ่ต–ๅ€’็ฝฎ - **KISS ๅŽŸๅˆ™** - ไฟๆŒไปฃ็ ็ฎ€ๅ•็›ดๆŽฅ - **DRY ๅŽŸๅˆ™** - ้ฟๅ…ไปฃ็ ้‡ๅค - **YAGNI ๅŽŸๅˆ™** - ๅชๅฎž็Žฐๅฟ…่ฆๅŠŸ่ƒฝ ### ๆไบค่ง„่Œƒ ไฝฟ็”จ [Conventional Commits](https://www.conventionalcommits.org/) ่ง„่Œƒ๏ผš ```bash feat: ๆ–ฐๅŠŸ่ƒฝ fix: ไฟฎๅค Bug docs: ๆ–‡ๆกฃๆ›ดๆ–ฐ style: ไปฃ็ ๆ ผๅผ่ฐƒๆ•ด refactor: ้‡ๆž„ test: ๆต‹่ฏ•็›ธๅ…ณ chore: ๆž„ๅปบ/ๅทฅๅ…ท้“พๆ›ดๆ–ฐ ``` ### ๅผ€ๅ‘่ทฏ็บฟๅ›พ ่ฏฆ่ง [CLAUDE.md - ๅผ€ๅ‘่ทฏ็บฟๅ›พ](CLAUDE.md#ๅผ€ๅ‘่ทฏ็บฟๅ›พ)ใ€‚ #### ๅฝ“ๅ‰้˜ถๆฎต๏ผš๐ŸŒฑ ้˜ถๆฎต 1 - ๆ•ฐๆฎๅ‡†ๅค‡ไธŽ้ชŒ่ฏ๏ผˆ่ฟ›่กŒไธญ๏ผ‰ - [x] ๆ•ฐๆฎๆ”ถ้›†๏ผˆ31,098 ๆก่ฎฐๅฝ•๏ผ‰ - [ ] ๆ•ฐๆฎๅบ“่ฎพ่ฎกไธŽๅปบ่กจ - [ ] ๆ•ฐๆฎๅฏผๅ…ฅ่„šๆœฌๅผ€ๅ‘ - [ ] ๆ•ฐๆฎ้ชŒ่ฏไธŽๆธ…ๆด— #### ๅŽ็ปญ้˜ถๆฎต - **้˜ถๆฎต 2**: ๆ ธๅฟƒๆœๅŠกๅผ€ๅ‘๏ผˆAPI ๅผ€ๅ‘๏ผ‰ - **้˜ถๆฎต 3**: ๆ•ฐๆฎ้‡‡้›†่‡ชๅŠจๅŒ–๏ผˆๅฎšๆ—ถไปปๅŠก๏ผ‰ - **้˜ถๆฎต 4**: ๆ™บ่ƒฝๅˆ†ๆžไธŽ้ข„ๆต‹๏ผˆAI ้›†ๆˆ๏ผ‰ --- ## ๐Ÿณ Docker ้ƒจ็ฝฒ ### ไฝฟ็”จ Docker Compose๏ผˆๆŽจ่๏ผ‰ ```bash # ๅฏๅŠจๆ‰€ๆœ‰ๆœๅŠก๏ผˆMySQL + App๏ผ‰ docker-compose up -d # ๆŸฅ็œ‹ๆ—ฅๅฟ— docker-compose logs -f # ๅœๆญขๆœๅŠก docker-compose down ``` ### ๅ•็‹ฌๆž„ๅปบ ```bash # ๆž„ๅปบ้•œๅƒ docker build -t steel-prices-service . # ่ฟ่กŒๅฎนๅ™จ docker run -p 3000:3000 --env-file .env steel-prices-service ``` --- ## ๐Ÿค ่ดก็ŒฎๆŒ‡ๅ— ๆฌข่ฟŽ่ดก็Œฎไปฃ็ ใ€ๆŠฅๅ‘Š Bug ๆˆ–ๆๅ‡บๆ–ฐๅŠŸ่ƒฝๅปบ่ฎฎ๏ผ ### ่ดก็Œฎๆต็จ‹ 1. Fork ๆœฌไป“ๅบ“ 2. ๅˆ›ๅปบ็‰นๆ€งๅˆ†ๆ”ฏ (`git checkout -b feature/AmazingFeature`) 3. ๆไบคๆ›ดๆ”น (`git commit -m 'feat: Add some AmazingFeature'`) 4. ๆŽจ้€ๅˆฐๅˆ†ๆ”ฏ (`git push origin feature/AmazingFeature`) 5. ๆไบค Pull Request ### ไปฃ็ ๅฎกๆŸฅ - ็กฎไฟไปฃ็ ้€š่ฟ‡ๆ‰€ๆœ‰ๆต‹่ฏ• (`npm test`) - ้ตๅพช้กน็›ฎ็ผ–็ ่ง„่Œƒ - ๆทปๅŠ ๅฟ…่ฆ็š„ๆณจ้‡Šๅ’Œๆ–‡ๆกฃ - ๆ›ดๆ–ฐ็›ธๅ…ณๆ–‡ๆกฃ ่ฏฆ่ง [่ดก็ŒฎๆŒ‡ๅ—](CONTRIBUTING.md)ใ€‚ --- ## ๐Ÿ“„ ่ฎธๅฏ่ฏ ๆœฌ้กน็›ฎ้‡‡็”จ [MIT ่ฎธๅฏ่ฏ](LICENSE)ใ€‚ --- ## ๐Ÿ“ž ่”็ณปๆ–นๅผ - **ไฝœ่€…**: Your Name - **้‚ฎ็ฎฑ**: your.email@example.com - **้กน็›ฎไธป้กต**: [https://github.com/your-username/steel_prices_service](https://github.com/your-username/steel_prices_service) - **้—ฎ้ข˜ๅ้ฆˆ**: [GitHub Issues](https://github.com/your-username/steel_prices_service/issues) --- ## ๐Ÿ™ ่‡ด่ฐข - ๆ•ฐๆฎๆฅๆบ๏ผšๆˆ‘็š„้’ข้“็ฝ‘ใ€ๅพท้’ขใ€ไบ‘ๅ—้’ขๅ - ๆŠ€ๆœฏๆ ˆ๏ผšExpress.jsใ€MySQL - ็คพๅŒบ่ดก็Œฎ่€… --- ## ๐Ÿ“Š ้กน็›ฎ็Šถๆ€ ![Status](https://img.shields.io/badge/Status-๐ŸŒฑ%20Initial%20Development-orange) ![Progress](https://img.shields.io/badge/Progress-10%25-yellow) **ๅฝ“ๅ‰็‰ˆๆœฌ**: v0.1.0 (Alpha) **ๆœ€่ฟ‘ๆ›ดๆ–ฐ**: 2026-01-05 ---
**ๅฆ‚ๆžœ่ฟ™ไธช้กน็›ฎๅฏนๆ‚จๆœ‰ๅธฎๅŠฉ๏ผŒ่ฏท็ป™ไธ€ไธช โญ๏ธ Star ๆ”ฏๆŒไธ€ไธ‹๏ผ** [โฌ† ่ฟ”ๅ›ž้กถ้ƒจ](#-steel-prices-service)