v4.1.21: Реструктуризация проекта для Synology ARM
- Реструктуризация: src/ разбит на middleware/, utils/, repositories/ (удалены), routes/ (удалены) - Добавлен src/original-html.ts — полный HTML с reportModal - Добавлен src/index.tsx.backup — React-компонент с reportModal - Миграции переименованы (0001_initial_schema.sql) - Добавлена миграция 0018 (удалена позже) - Docker: multi-stage build, wrangler.toml - Frontend: public/static/app.js + style.css - seed.sql добавлен - Документация: CHANGELOG, CHANGES_v4.1.0-4.1.9, PROJECT_STRUCTURE
This commit is contained in:
408
PROJECT_STRUCTURE.md
Normal file
408
PROJECT_STRUCTURE.md
Normal file
@@ -0,0 +1,408 @@
|
||||
# AKNAPROFF Tootmine - Структура проекта
|
||||
|
||||
**Версия:** v4.0.13 (28.11.2025)
|
||||
|
||||
---
|
||||
|
||||
## 📁 Структура директорий
|
||||
|
||||
```
|
||||
webapp/
|
||||
├── src/ # Backend исходники (Hono + TypeScript)
|
||||
│ ├── index.tsx # Главный файл приложения (26 API endpoints)
|
||||
│ ├── original-html.ts # Embedded HTML для главной страницы
|
||||
│ ├── middleware/ # Middleware для аутентификации
|
||||
│ │ └── auth.ts # authMiddleware, optionalAuthMiddleware
|
||||
│ └── utils/ # Утилиты
|
||||
│ └── auth.ts # JWT, password hashing
|
||||
│
|
||||
├── public/ # Статические файлы
|
||||
│ ├── original.html # Исходный HTML шаблон
|
||||
│ ├── test-datepicker.html # Тестовая страница для date picker
|
||||
│ └── static/ # Статические ресурсы (доступны как /static/*)
|
||||
│ ├── app.js # Главный JavaScript файл (1500+ строк)
|
||||
│ └── styles.css # Дополнительные стили
|
||||
│
|
||||
├── migrations/ # D1 Database миграции
|
||||
│ ├── 0001_initial_schema.sql
|
||||
│ ├── 0002_add_user_profiles.sql
|
||||
│ └── meta/
|
||||
│
|
||||
├── dist/ # Build output (создаётся при npm run build)
|
||||
│ ├── _worker.js # Скомпилированный Cloudflare Worker
|
||||
│ └── _routes.json # Cloudflare routing config
|
||||
│
|
||||
├── .wrangler/ # Wrangler development state
|
||||
│ └── state/v3/d1/ # Локальная D1 база данных
|
||||
│
|
||||
├── node_modules/ # NPM зависимости
|
||||
│
|
||||
├── .git/ # Git repository
|
||||
│
|
||||
├── package.json # NPM конфигурация и скрипты
|
||||
├── wrangler.jsonc # Cloudflare Workers конфигурация
|
||||
├── tsconfig.json # TypeScript конфигурация
|
||||
├── vite.config.ts # Vite build конфигурация
|
||||
├── ecosystem.config.cjs # PM2 конфигурация (для development)
|
||||
├── .gitignore # Git ignore файл
|
||||
├── seed.sql # Demo данные для локальной разработки
|
||||
│
|
||||
├── README.md # Основная документация проекта
|
||||
├── FULL_DEVELOPMENT_HISTORY.md # Полная история разработки (25KB)
|
||||
├── VERSION_SUMMARY.md # Краткая сводка версий (3KB)
|
||||
└── PROJECT_STRUCTURE.md # Этот файл
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 📄 Ключевые файлы
|
||||
|
||||
### Backend (src/)
|
||||
|
||||
#### src/index.tsx (главный файл)
|
||||
```typescript
|
||||
// 665 строк кода
|
||||
// 26 API endpoints
|
||||
// Hono framework + Cloudflare Workers
|
||||
// D1 Database integration
|
||||
|
||||
Основные секции:
|
||||
- Type Bindings (D1Database, Variables)
|
||||
- CORS middleware
|
||||
- Static file serving
|
||||
- Auth routes (login, profile)
|
||||
- Data routes (CRUD для records)
|
||||
- Status checkbox routes
|
||||
- Material confirmed routes
|
||||
- Main page route
|
||||
```
|
||||
|
||||
#### src/middleware/auth.ts
|
||||
```typescript
|
||||
// JWT authentication middleware
|
||||
// authMiddleware - требует токен
|
||||
// optionalAuthMiddleware - опциональный токен
|
||||
```
|
||||
|
||||
#### src/utils/auth.ts
|
||||
```typescript
|
||||
// JWT token generation
|
||||
// Password hashing/verification (bcrypt-style)
|
||||
```
|
||||
|
||||
#### src/original-html.ts
|
||||
```typescript
|
||||
// Embedded HTML template
|
||||
// Создаётся из public/original.html
|
||||
// Содержит полный HTML главной страницы
|
||||
```
|
||||
|
||||
### Frontend (public/)
|
||||
|
||||
#### public/original.html
|
||||
```html
|
||||
<!-- Главный HTML шаблон -->
|
||||
<!-- ~700 строк -->
|
||||
<!-- Tailwind CSS (CDN) -->
|
||||
<!-- FontAwesome icons -->
|
||||
<!-- Axios для HTTP запросов -->
|
||||
```
|
||||
|
||||
#### public/static/app.js
|
||||
```javascript
|
||||
// Главный JavaScript файл
|
||||
// ~1500 строк кода
|
||||
|
||||
Основные функции:
|
||||
- loadRecords() - загрузка records из API
|
||||
- renderRecords() - рендеринг таблицы
|
||||
- renderCalendarCell() - calendar picker для MAT-1/MAT-2
|
||||
- renderDateCell() - 3-step toggle для других полей
|
||||
- toggleDate() - toggle date fields
|
||||
- toggleMaterialConfirmed() - toggle MAT-1 checkbox
|
||||
- toggleMaterial2Confirmed() - toggle MAT-2 checkbox
|
||||
- openModal() - открытие модального окна
|
||||
- editRecord() - редактирование record
|
||||
- deleteRecord() - удаление record
|
||||
- handleLogin() - логин
|
||||
- initFilters() - инициализация фильтров
|
||||
```
|
||||
|
||||
### Database (migrations/)
|
||||
|
||||
#### migrations/0001_initial_schema.sql
|
||||
```sql
|
||||
-- production_records table
|
||||
-- status_checkboxes table
|
||||
-- users table
|
||||
-- audit_log table
|
||||
-- Indexes
|
||||
```
|
||||
|
||||
### Configuration
|
||||
|
||||
#### package.json
|
||||
```json
|
||||
{
|
||||
"scripts": {
|
||||
"dev": "vite",
|
||||
"dev:sandbox": "wrangler pages dev dist --ip 0.0.0.0 --port 3000",
|
||||
"build": "vite build",
|
||||
"deploy": "npm run build && wrangler pages deploy dist",
|
||||
"db:migrate:local": "wrangler d1 migrations apply webapp-production --local",
|
||||
"db:migrate:prod": "wrangler d1 migrations apply webapp-production"
|
||||
},
|
||||
"dependencies": {
|
||||
"hono": "^4.0.0"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@cloudflare/workers-types": "4.20250705.0",
|
||||
"@hono/vite-cloudflare-pages": "^0.4.2",
|
||||
"vite": "^5.0.0",
|
||||
"wrangler": "^3.78.0"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
#### wrangler.jsonc
|
||||
```jsonc
|
||||
{
|
||||
"name": "webapp",
|
||||
"compatibility_date": "2024-01-01",
|
||||
"pages_build_output_dir": "./dist",
|
||||
"d1_databases": [
|
||||
{
|
||||
"binding": "DB",
|
||||
"database_name": "webapp-production",
|
||||
"database_id": "your-database-id"
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
#### ecosystem.config.cjs (PM2)
|
||||
```javascript
|
||||
module.exports = {
|
||||
apps: [{
|
||||
name: 'webapp',
|
||||
script: 'npx',
|
||||
args: 'wrangler pages dev dist --ip 0.0.0.0 --port 3000',
|
||||
env: {
|
||||
NODE_ENV: 'development',
|
||||
PORT: 3000
|
||||
}
|
||||
}]
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 📊 Статистика кода
|
||||
|
||||
| Файл | Строки | Тип | Назначение |
|
||||
|------|--------|-----|------------|
|
||||
| src/index.tsx | ~665 | TypeScript | Backend API |
|
||||
| public/static/app.js | ~1500 | JavaScript | Frontend logic |
|
||||
| public/original.html | ~700 | HTML | UI template |
|
||||
| src/middleware/auth.ts | ~50 | TypeScript | Authentication |
|
||||
| src/utils/auth.ts | ~80 | TypeScript | JWT & passwords |
|
||||
| migrations/0001_*.sql | ~100 | SQL | Database schema |
|
||||
| FULL_DEVELOPMENT_HISTORY.md | ~790 | Markdown | Documentation |
|
||||
|
||||
**Всего:** ~3885 строк кода (без node_modules, dist, .wrangler)
|
||||
|
||||
---
|
||||
|
||||
## 🔌 API Endpoints (26 шт)
|
||||
|
||||
### Authentication (2)
|
||||
```
|
||||
POST /api/auth/login - Логин пользователя
|
||||
PATCH /api/users/profile - Обновление профиля (требует auth)
|
||||
```
|
||||
|
||||
### Data CRUD (5)
|
||||
```
|
||||
GET /api/years - Получить список доступных годов
|
||||
GET /api/records - Получить records (по месяцу/году)
|
||||
GET /api/records/:id - Получить один record
|
||||
POST /api/records - Создать новый record
|
||||
PUT /api/records/:id - Обновить record
|
||||
DELETE /api/records/:id - Удалить record (soft delete)
|
||||
```
|
||||
|
||||
### Status Management (13)
|
||||
```
|
||||
PATCH /api/records/:id/status - Toggle date field
|
||||
PATCH /api/records/:id/worksheets-cycle - 3-step worksheets cycle
|
||||
PATCH /api/records/:id/notes - Обновить notes
|
||||
PATCH /api/records/:id/problems - Обновить problems + error flags
|
||||
PATCH /api/records/:id/material-confirmed - Toggle MAT-1 checkbox
|
||||
PATCH /api/records/:id/material2-confirmed - Toggle MAT-2 checkbox
|
||||
PATCH /api/records/:id/price-paid - Обновить price paid status
|
||||
PATCH /api/status/:recordId/:field - Обновить date field
|
||||
PATCH /api/status/:recordId/:field/error - Обновить error flag
|
||||
PATCH /api/status/:recordId/:field/confirm - Обновить confirmation flag
|
||||
```
|
||||
|
||||
### Pages (6)
|
||||
```
|
||||
GET / - Главная страница (HTML)
|
||||
GET /test-click - Тестовая страница для clicks
|
||||
GET /test-datepicker - Тестовая страница для date picker
|
||||
GET /static/* - Статические файлы (app.js, styles.css)
|
||||
GET /favicon.ico - Favicon (empty response)
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🗄️ Database Schema
|
||||
|
||||
### Tables (4)
|
||||
|
||||
#### production_records
|
||||
```sql
|
||||
- id INTEGER PRIMARY KEY
|
||||
- month INTEGER -- 1-12
|
||||
- year INTEGER -- 2024, 2025, etc.
|
||||
- client_name TEXT
|
||||
- type TEXT
|
||||
- offer_number TEXT
|
||||
- work_number TEXT
|
||||
- quantity INTEGER
|
||||
- color TEXT
|
||||
- notes TEXT
|
||||
- problems TEXT
|
||||
- installer TEXT
|
||||
- price REAL
|
||||
- created_at DATETIME
|
||||
- updated_at DATETIME
|
||||
- deleted_at DATETIME
|
||||
- deleted_by INTEGER
|
||||
```
|
||||
|
||||
#### status_checkboxes
|
||||
```sql
|
||||
- id INTEGER PRIMARY KEY
|
||||
- record_id INTEGER (FK → production_records.id)
|
||||
- material_date DATE
|
||||
- material2_date DATE
|
||||
- package_date DATE
|
||||
- worksheets_date DATE
|
||||
- cutting_date DATE
|
||||
- glazing_date DATE
|
||||
- ready_date DATE
|
||||
- issued_date DATE
|
||||
- worksheets_error BOOLEAN
|
||||
- cutting_error BOOLEAN
|
||||
- glazing_error BOOLEAN
|
||||
- ready_error BOOLEAN
|
||||
- issued_error BOOLEAN
|
||||
- material_confirmed BOOLEAN
|
||||
- material2_confirmed BOOLEAN
|
||||
- worksheets_confirmed BOOLEAN
|
||||
```
|
||||
|
||||
#### users
|
||||
```sql
|
||||
- id INTEGER PRIMARY KEY
|
||||
- username TEXT UNIQUE
|
||||
- password_hash TEXT
|
||||
- full_name TEXT
|
||||
- role TEXT (admin/user)
|
||||
- created_at DATETIME
|
||||
- updated_at DATETIME
|
||||
- deleted_at DATETIME
|
||||
```
|
||||
|
||||
#### audit_log
|
||||
```sql
|
||||
- id INTEGER PRIMARY KEY
|
||||
- user_id INTEGER (FK → users.id)
|
||||
- record_id INTEGER (FK → production_records.id)
|
||||
- field_name TEXT
|
||||
- old_value TEXT
|
||||
- new_value TEXT
|
||||
- action_type TEXT
|
||||
- created_at DATETIME
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🔄 Development Workflow
|
||||
|
||||
### 1. Локальная разработка
|
||||
```bash
|
||||
# 1. Build проекта
|
||||
npm run build
|
||||
|
||||
# 2. Запуск с PM2
|
||||
pm2 start ecosystem.config.cjs
|
||||
|
||||
# 3. Миграции базы данных
|
||||
npm run db:migrate:local
|
||||
|
||||
# 4. Тестирование
|
||||
curl http://localhost:3000/api/records?month=1&year=2025
|
||||
|
||||
# 5. Логи
|
||||
pm2 logs webapp --nostream
|
||||
```
|
||||
|
||||
### 2. Обновление кода
|
||||
```bash
|
||||
# 1. Изменить код
|
||||
nano public/static/app.js
|
||||
|
||||
# 2. Обновить версию
|
||||
sed -i 's/app.js?v=4.0.13/app.js?v=4.0.14/' public/original.html
|
||||
|
||||
# 3. Пересоздать embedded HTML
|
||||
node -e "..."
|
||||
|
||||
# 4. Rebuild
|
||||
npm run build
|
||||
|
||||
# 5. Restart PM2
|
||||
pm2 restart webapp
|
||||
```
|
||||
|
||||
### 3. Git workflow
|
||||
```bash
|
||||
git add .
|
||||
git commit -m "Fix: описание изменения"
|
||||
git push origin main
|
||||
```
|
||||
|
||||
### 4. Deployment на Cloudflare
|
||||
```bash
|
||||
# 1. Build
|
||||
npm run build
|
||||
|
||||
# 2. Deploy
|
||||
npx wrangler pages deploy dist --project-name webapp
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🔗 Важные ссылки
|
||||
|
||||
- **Sandbox URL**: https://3000-iabcqs9fpouqnd3allaai-82b888ba.sandbox.novita.ai
|
||||
- **Local URL**: http://localhost:3000
|
||||
- **Git Repository**: /home/user/webapp
|
||||
- **Cloudflare Pages**: (при деплое)
|
||||
|
||||
---
|
||||
|
||||
## 📚 Документация
|
||||
|
||||
| Файл | Размер | Описание |
|
||||
|------|--------|----------|
|
||||
| README.md | ~5KB | Основная документация |
|
||||
| FULL_DEVELOPMENT_HISTORY.md | 25KB | Детальная история всех версий |
|
||||
| VERSION_SUMMARY.md | 3KB | Краткая сводка версий |
|
||||
| PROJECT_STRUCTURE.md | Этот файл | Структура проекта |
|
||||
|
||||
---
|
||||
|
||||
**Конец документа**
|
||||
Reference in New Issue
Block a user