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

12 KiB
Raw Blame History

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 (главный файл)

// 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

// JWT authentication middleware
// authMiddleware - требует токен
// optionalAuthMiddleware - опциональный токен

src/utils/auth.ts

// JWT token generation
// Password hashing/verification (bcrypt-style)

src/original-html.ts

// Embedded HTML template
// Создаётся из public/original.html
// Содержит полный HTML главной страницы

Frontend (public/)

public/original.html

<!-- Главный HTML шаблон -->
<!-- ~700 строк -->
<!-- Tailwind CSS (CDN) -->
<!-- FontAwesome icons -->
<!-- Axios для HTTP запросов -->

public/static/app.js

// Главный 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

-- production_records table
-- status_checkboxes table
-- users table
-- audit_log table
-- Indexes

Configuration

package.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

{
  "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)

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

- 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

- 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

- 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

- 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. Локальная разработка

# 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. Обновление кода

# 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

git add .
git commit -m "Fix: описание изменения"
git push origin main

4. Deployment на Cloudflare

# 1. Build
npm run build

# 2. Deploy
npx wrangler pages deploy dist --project-name webapp

🔗 Важные ссылки


📚 Документация

Файл Размер Описание
README.md ~5KB Основная документация
FULL_DEVELOPMENT_HISTORY.md 25KB Детальная история всех версий
VERSION_SUMMARY.md 3KB Краткая сводка версий
PROJECT_STRUCTURE.md Этот файл Структура проекта

Конец документа