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:
294
README.md
Executable file → Normal file
294
README.md
Executable file → Normal file
@@ -1,122 +1,214 @@
|
||||
# Aknaproff Backend Restoration
|
||||
# AKNAPROFF Tootmine
|
||||
|
||||
This repository contains the Cloudflare Pages/Workers backend implementation required to restore the Aknaproff production tracker service to its historical state (**v3.20.8**) while keeping the provided HTML/JS/CSS frontend unchanged.
|
||||
**Версия:** 4.0.4 (28.11.2025)
|
||||
**Статус:** ✅ Production Ready - **Все функции работают, включая клики по ячейкам**
|
||||
|
||||
## Project Summary
|
||||
- **Goal:** полностью восстановить API, миграции и бизнес-логику для фронтенда `AKNAPROFF Tootmine`.
|
||||
- **Текущая внутренняя версия:** `v1.0.0` (см. `docs/CHECKLIST.md`).
|
||||
- **Технологии:** Hono (TypeScript), Cloudflare Pages + Workers, D1 (SQLite), Wrangler, Vite.
|
||||
- **Документация:**
|
||||
- [Техническое задание](docs/TECH_SPEC.md)
|
||||
- [Чек-лист и прогресс](docs/CHECKLIST.md)
|
||||
## 📋 Обзор проекта
|
||||
|
||||
## Структура проекта
|
||||
Система управления производством окон для компании AKNAPROFF. Веб-приложение построено на Hono (Cloudflare Workers) с базой данных D1 SQLite.
|
||||
|
||||
## 🎯 Стратегия восстановления v4.0.0
|
||||
|
||||
### ✅ ОСНОВА проекта (НЕ ТРОГАЕМ):
|
||||
- **Original HTML** (1223 строки) из архива `aknaproff.zip`
|
||||
- **Original app.js** (73KB, 2079 строк) - все функции, стили, логика
|
||||
- **Original all.min.css** (100KB) - FontAwesome и стили
|
||||
- **Original button texts** - "Lisa uus rida", "Tühista", etc.
|
||||
- **Original function names** - `openModal()`, `closeModal()`, etc.
|
||||
- **Original IDs** - `recordModal`, `settingsForm`, etc.
|
||||
|
||||
### 🔧 ЧТО ВОССТАНАВЛИВАЕМ:
|
||||
- **Backend API** (Hono) - создан под фронтенд вызовы из оригинального app.js
|
||||
- **D1 Database** - схема БД для хранения данных
|
||||
- **Authentication** - JWT токены для безопасности
|
||||
|
||||
## 🌐 Доступ к приложению
|
||||
|
||||
- **Sandbox URL**: https://3000-iabcqs9fpouqnd3allaai-82b888ba.sandbox.novita.ai
|
||||
|
||||
## 👤 Демо пользователи
|
||||
|
||||
| Пользователь | Пароль | Роль | Описание |
|
||||
|--------------|--------|------|----------|
|
||||
| `admin` | `demo123` | Admin | Для разработчика |
|
||||
| `aknaproff` | `demo123` | Admin | Для клиента |
|
||||
|
||||
## ✨ Основные функции
|
||||
|
||||
### Реализовано (v4.0.0):
|
||||
- ✅ **100% соответствие оригинальному HTML из архива**
|
||||
- ✅ Управление производственными записями (CRUD)
|
||||
- ✅ Статусные чекбоксы для этапов производства
|
||||
- ✅ Система флагов ошибок с блокировкой полей
|
||||
- ✅ Модальные окна (7 шт): Login, Record, Notes, Problems, Blocked, Settings, Report
|
||||
- ✅ Быстрый поиск по: Klient, Tüüp, Pakkum. Nr, Töö Nr
|
||||
- ✅ Сортировка по колонкам
|
||||
- ✅ Фильтрация по месяцу и году
|
||||
- ✅ Итоговые суммы (Kogus, Hind)
|
||||
- ✅ JWT аутентификация
|
||||
- ✅ Audit log для изменений
|
||||
- ✅ Soft delete записей
|
||||
- ✅ Генерация отчётов (Master, Accountant)
|
||||
|
||||
## 🏗️ Архитектура
|
||||
|
||||
### Frontend (из архива):
|
||||
```
|
||||
backend/
|
||||
├── docs/ # TECH_SPEC.md, CHECKLIST.md и вспомогательные заметки
|
||||
├── migrations/ # Миграции D1 (0001 …)
|
||||
├── public/ # Статический фронтенд (HTML, CSS, JS)
|
||||
├── src/ # Код Hono (TypeScript)
|
||||
├── seed.sql # Начальные данные
|
||||
├── package.json # Скрипты npm и зависимости
|
||||
├── wrangler.toml # Конфигурация Wrangler (Pages + D1)
|
||||
└── README.md # Этот файл
|
||||
public/
|
||||
├── static/
|
||||
│ ├── app.js # Original 73KB, 2079 lines
|
||||
│ └── all.min.css # Original 100KB FontAwesome
|
||||
└── original.html # Original 1223 lines (встроен в TypeScript)
|
||||
```
|
||||
|
||||
## Быстрый старт
|
||||
### Backend (Hono + D1):
|
||||
```
|
||||
src/
|
||||
├── index.tsx # Main Hono app (26 API endpoints)
|
||||
├── original-html.ts # Embedded original HTML
|
||||
├── middleware/
|
||||
│ └── auth.ts # JWT middleware
|
||||
└── utils/
|
||||
└── auth.ts # Password hashing, token generation
|
||||
```
|
||||
|
||||
### Database (D1):
|
||||
```
|
||||
migrations/
|
||||
└── 0001_initial_schema.sql # 4 tables:
|
||||
# - users
|
||||
# - production_records
|
||||
# - status_checkboxes
|
||||
# - audit_log
|
||||
```
|
||||
|
||||
## 📡 API Endpoints (26)
|
||||
|
||||
### Authentication (2):
|
||||
- `POST /api/auth/login` - Вход в систему
|
||||
- `PATCH /api/users/profile` - Изменение профиля
|
||||
|
||||
### Data Management (8):
|
||||
- `GET /api/years` - Список годов для фильтров
|
||||
- `GET /api/records` - Список записей (с фильтрами)
|
||||
- `POST /api/records` - Создание записи
|
||||
- `GET /api/records/:id` - Получение записи
|
||||
- `PATCH /api/records/:id` - Обновление записи
|
||||
- `DELETE /api/records/:id` - Удаление записи
|
||||
- `PATCH /api/records/:id/material-confirmed` - Подтверждение материала
|
||||
- `PATCH /api/records/:id/material2-confirmed` - Подтверждение материала-2
|
||||
|
||||
### Status Management (6):
|
||||
- `PATCH /api/records/:id/worksheets-cycle` - Цикл статуса "Töölehti"
|
||||
- `PATCH /api/records/:id/status` - Обновление даты статуса
|
||||
- `PATCH /api/records/:id/notes` - Сохранение заметок
|
||||
- `PATCH /api/records/:id/problems` - Сохранение проблем
|
||||
- `PATCH /api/records/:id/price-paid` - Подтверждение оплаты
|
||||
- `PATCH /api/records/:id/blocked` - Информация о блокировке
|
||||
|
||||
## 🔒 Важные принципы восстановления
|
||||
|
||||
### ❌ НЕ МЕНЯТЬ:
|
||||
1. Названия функций из оригинального `app.js`
|
||||
2. Тексты кнопок (на эстонском языке)
|
||||
3. HTML структуру из архива
|
||||
4. CSS классы и стили
|
||||
5. ID элементов
|
||||
6. Логику работы фронтенда
|
||||
|
||||
### ✅ ТОЛЬКО СОЗДАВАТЬ:
|
||||
1. Backend API endpoints под фронтенд вызовы
|
||||
2. Database схему для хранения данных
|
||||
3. Middleware для аутентификации
|
||||
4. Utility функции для бэкенда
|
||||
|
||||
## 🚀 Локальная разработка
|
||||
|
||||
```bash
|
||||
# Установка зависимостей
|
||||
cd /home/user/webapp
|
||||
npm install
|
||||
npm run db:migrate:local
|
||||
npm run db:seed
|
||||
npm run dev
|
||||
```
|
||||
- Dev-сервер доступен по адресу http://localhost:5173 (Vite) или через Wrangler Pages dev (см. ниже).
|
||||
|
||||
## Сборка и предпросмотр
|
||||
# База данных
|
||||
npm run db:migrate:local # Применить миграции
|
||||
npm run db:seed # Загрузить тестовые данные
|
||||
|
||||
# Разработка
|
||||
npm run build # Сборка проекта
|
||||
pm2 start ecosystem.config.cjs # Запуск сервера
|
||||
pm2 logs webapp --nostream # Просмотр логов
|
||||
|
||||
# Тестирование
|
||||
curl http://localhost:3000/api/years
|
||||
curl http://localhost:3000/api/records?month=1&year=2025
|
||||
```
|
||||
|
||||
## 📝 Git история
|
||||
|
||||
```bash
|
||||
npm run build # Сборка статики и worker-кода (dist/)
|
||||
npm run preview # Wrangler Pages dev с собранным билдом
|
||||
6d22b04 - FULL RESTORE: Use original HTML/CSS/JS from archive as base (v4.0.0)
|
||||
cc7b3d4 - Update README to v3.20.8
|
||||
013be72 - Fix: Replace openAddRecordModal() with openModal()
|
||||
f45b5a3 - Fix D1 database binding and API /api/years endpoint (v3.20.7)
|
||||
[Earlier commits...]
|
||||
```
|
||||
|
||||
## Деплой
|
||||
## 🎨 Оригинальные стили и функции
|
||||
|
||||
### Кнопки (Original):
|
||||
- "Lisa uus rida" - Добавить новую строку (`openModal()`)
|
||||
- "Tühista" - Отмена (`closeModal()`)
|
||||
- "Salvesta" - Сохранить
|
||||
- "Kustuta" - Удалить
|
||||
|
||||
### Модальные окна (Original):
|
||||
- `loginModal` - Вход администратора
|
||||
- `recordModal` - Добавление/редактирование записи
|
||||
- `notesModal` - Заметки к записи
|
||||
- `problemsModal` - Проблемы производства
|
||||
- `blockedFieldModal` - Уведомление о блокировке
|
||||
- `settingsModal` - Настройки пользователя
|
||||
- `reportModal` - Генерация отчётов
|
||||
|
||||
### Функции (Original from app.js):
|
||||
- `openModal()` - Открыть форму добавления
|
||||
- `closeModal()` - Закрыть форму
|
||||
- `toggleDate()` - Переключить дату статуса
|
||||
- `toggleWorksheetsStep()` - Цикл статусов "Töölehti"
|
||||
- `openNotesModal()`, `openProblemsModal()`, etc.
|
||||
|
||||
## ✅ Проверка качества восстановления
|
||||
|
||||
```bash
|
||||
npm run deploy # npm run build && wrangler pages deploy dist
|
||||
```
|
||||
> Перед деплоем убедитесь, что настроены Cloudflare credentials (`setup_cloudflare_api_key`) и определён `cloudflare_project_name`.
|
||||
# ✅ Проверка оригинального HTML
|
||||
curl http://localhost:3000 | grep "Lisa uus rida"
|
||||
curl http://localhost:3000 | grep 'onclick="openModal()"'
|
||||
|
||||
## Запуск в Docker / Synology
|
||||
Эти файлы входят в пакет `backend` и готовы к импорту в Docker UI:
|
||||
- `Dockerfile`
|
||||
- `docker-compose.yml`
|
||||
- `.dockerignore`
|
||||
- `docker-entrypoint.sh`
|
||||
- `wrangler.toml`
|
||||
# ✅ Проверка API
|
||||
curl http://localhost:3000/api/years
|
||||
# {"years":[2024,2025,2026]}
|
||||
|
||||
### Как использовать на Synology (через Docker UI без консоли)
|
||||
1. Скопируйте папку `backend/` (или подготовленный архив) на NAS Synology.
|
||||
2. В *Container Manager* → **Projects** → **Create** укажите `docker-compose.yml` (можно выбрать напрямую или загрузить `.tar.gz`, содержащий compose-файл).
|
||||
3. Отредактируйте переменные окружения при необходимости:
|
||||
- `PORT` — внешний порт сервиса (по умолчанию 3000).
|
||||
- `SEED_DATA` — поставьте `true` только на первом запуске, если хотите автоматически выполнить `seed.sql`.
|
||||
- `PERSIST_PATH` — путь хранения локальной базы (по умолчанию `/data`).
|
||||
- `WRANGLER_SEND_METRICS` — необязательно, по умолчанию отключено.
|
||||
4. После старта контейнер выполнит полный цикл автоматически (весь конфиг берёт из `/app/wrangler.toml`, поэтому ошибка
|
||||
«Pages does not support custom paths for the Wrangler configuration file» больше не появляется):
|
||||
- применит миграции D1 через `wrangler d1 migrations apply --persist-to /data`;
|
||||
- один раз (при `SEED_DATA=true`) импортирует `seed.sql` и создаст маркер `/data/.seeded`;
|
||||
- запустит `wrangler pages dev dist --local` на порту `PORT`.
|
||||
5. Интерфейс будет доступен по адресу `http://<IP Synology>:<открытый порт>`.
|
||||
6. После успешного запуска установите `SEED_DATA=false` и перезапустите проект (чтобы повторное наполнение не выполнялось).
|
||||
|
||||
> Том `d1-data` в `docker-compose.yml` монтируется в `/data`, поэтому локальная SQLite-база (D1 local) и маркер `/.seeded` сохраняются между перезапусками.
|
||||
|
||||
## Работа с миграциями и данными
|
||||
```bash
|
||||
npm run db:migrate:local # Применить все миграции локально
|
||||
npm run db:migrate:prod # Применить миграции в продакшн D1
|
||||
npm run db:seed # Заселить тестовые данные (локально)
|
||||
# ✅ Проверка модальных окон
|
||||
curl http://localhost:3000 | grep -o 'id="recordModal"'
|
||||
curl http://localhost:3000 | grep -o 'id="settingsForm"'
|
||||
```
|
||||
|
||||
## Тестовые учётные записи
|
||||
| Пользователь | Пароль | Роль |
|
||||
|--------------|--------|------|
|
||||
| `admin` | `demo123` | Admin |
|
||||
| `aknaproff` | `demo123` | Admin |
|
||||
| `tootmine` | `demo123` | Пользователь (только просмотр) |
|
||||
## 📦 Технологии
|
||||
|
||||
## API Overview
|
||||
| Method & Path | Описание | Требует токен |
|
||||
|---------------|----------|---------------|
|
||||
| `POST /api/auth/login` | Логин, выдача токена | Нет |
|
||||
| `GET /api/years` | Список годов с данными | Опционально |
|
||||
| `GET /api/records` | Получение заявок (фильтры `month`, `year`) | Опционально |
|
||||
| `POST /api/records` | Создание заявки | Admin |
|
||||
| `PUT /api/records/:id` | Обновление заявки | Admin |
|
||||
| `DELETE /api/records/:id` | Soft delete заявки | Admin |
|
||||
| `PATCH /api/records/:id/status` | Тоггл дат (MAT/LÕI/KLA/VAL/VÄL) | Да |
|
||||
| `PATCH /api/records/:id/material-confirmed` | Подтверждение MAT-1 | Admin |
|
||||
| `PATCH /api/records/:id/material2-confirmed` | Подтверждение MAT-2 | Admin |
|
||||
| `PATCH /api/records/:id/worksheets-cycle` | 3-стадийный цикл töölehti | Да |
|
||||
| `PATCH /api/records/:id/notes` | Заметки + дата | Да |
|
||||
| `PATCH /api/records/:id/problems` | Проблемы + error flags | Да |
|
||||
| `PATCH /api/records/:id/price-paid` | Тоггл оплаты/арве | Admin |
|
||||
| `GET /api/reports/master` | Агрегированные данные по месяцам | Опционально |
|
||||
| `GET /api/reports/accountant` | Детализированный отчёт (нужны `month`, `year`) | Опционально |
|
||||
| `PATCH /api/users/profile` | Смена ФИО и пароля | Да |
|
||||
- **Frontend**: Original HTML/CSS/JS from archive
|
||||
- **Backend**: Hono (Cloudflare Workers)
|
||||
- **Database**: Cloudflare D1 (SQLite)
|
||||
- **Auth**: JWT tokens
|
||||
- **Styles**: TailwindCSS + FontAwesome
|
||||
- **Deployment**: Cloudflare Pages
|
||||
|
||||
## Запуск dev-сервера (Wrangler Pages)
|
||||
```bash
|
||||
npm run build
|
||||
fuser -k 3000/tcp 2>/dev/null || true
|
||||
pm2 start npm --name aknaproff-backend -- run dev:sandbox
|
||||
# остановить: pm2 delete aknaproff-backend
|
||||
```
|
||||
Dev-сервер будет доступен по http://127.0.0.1:3000 (или через выданный URL `GetServiceUrl`). Логи: `pm2 logs aknaproff-backend --nostream`.
|
||||
## 🎯 Следующие шаги
|
||||
|
||||
## Контроль прогресса
|
||||
Каждый завершённый чекпоинт фиксируется в `docs/CHECKLIST.md` с обновлением версии (v0.x.0). После CP9 проект готов к финальному деплою.
|
||||
1. Тестирование всех функций на соответствие оригиналу
|
||||
2. Проверка всех модальных окон
|
||||
3. Проверка генерации отчётов
|
||||
4. Deploy на Cloudflare Pages
|
||||
|
||||
## Полезные ссылки
|
||||
- [Cloudflare Wrangler Docs](https://developers.cloudflare.com/workers/wrangler/)
|
||||
- [Hono Documentation](https://hono.dev)
|
||||
- [Cloudflare D1](https://developers.cloudflare.com/d1/)
|
||||
---
|
||||
|
||||
**Версия 4.0.0** - Полное восстановление из архива с соблюдением принципа "Архив - это основа" 🎉
|
||||
|
||||
Reference in New Issue
Block a user