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:
Deploy Bot
2026-01-14 18:37:00 +02:00
parent 4898f5ec7f
commit 64403d6fd6
113 changed files with 19231 additions and 3084 deletions

408
PROJECT_STRUCTURE.md Normal file
View 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 | Этот файл | Структура проекта |
---
**Конец документа**