Files
Aknaproff/PROJECT_STRUCTURE.md
Deploy Bot 64403d6fd6 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
2026-01-14 18:37:00 +02:00

409 lines
12 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.
# 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 | Этот файл | Структура проекта |
---
**Конец документа**