Очистка проекта от устаревшей документации и исправление логики миграции базы данных
Удалены устаревшие файлы документации (CHANGES.md, COMMANDS.md, DEBUG.md, OFFLINE_FIX.md, QUICK_START.md, README_RU.md), конфигурационные файлы .cursor и скрипты установки/запуска (install.sh, start.sh). Исправлена логика миграции в backend/server.js: теперь is_public_profile обновляется только для пользователей с NULL значением, а не для всех пользователей с 0, что предотвращает нежелательное изменение явно установленных значений. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
parent
3346fae87d
commit
12c0870c8f
@ -1,5 +0,0 @@
|
||||
---
|
||||
alwaysApply: true
|
||||
---
|
||||
|
||||
не забывай использовать MCP сервера
|
||||
@ -1,5 +0,0 @@
|
||||
---
|
||||
alwaysApply: true
|
||||
---
|
||||
|
||||
Never try to start the server yourself. If it is required, then ask me to do it!
|
||||
@ -1,5 +0,0 @@
|
||||
{
|
||||
"setup-worktree": [
|
||||
"npm install"
|
||||
]
|
||||
}
|
||||
157
CHANGES.md
157
CHANGES.md
@ -1,157 +0,0 @@
|
||||
# Список изменений - NoteJS React
|
||||
|
||||
## Структура проекта
|
||||
|
||||
Проект реорганизован для независимой работы фронтенда и бэкенда:
|
||||
|
||||
### ✅ Backend (Node.js + Express)
|
||||
|
||||
**Расположение:** `backend/`
|
||||
|
||||
**Что сделано:**
|
||||
|
||||
- ✅ Скопирован `server.js` из корня проекта
|
||||
- ✅ Скопированы `package.json` и `package-lock.json`
|
||||
- ✅ Изменён порт с `3000` на `3001` (чтобы не конфликтовать со старым приложением)
|
||||
- ✅ Установлены все зависимости (`npm install`)
|
||||
- ✅ Созданы папки:
|
||||
- `database/` - для SQLite баз данных
|
||||
- `public/uploads/` - для загруженных файлов
|
||||
- ✅ Создан `.gitignore` для исключения ненужных файлов
|
||||
- ✅ Создан `README.md` с инструкциями
|
||||
|
||||
**Запуск:**
|
||||
|
||||
```bash
|
||||
cd backend
|
||||
npm start
|
||||
```
|
||||
|
||||
**Адрес:** http://localhost:3001
|
||||
|
||||
---
|
||||
|
||||
### ✅ Frontend (React + TypeScript)
|
||||
|
||||
**Расположение:** `src/`
|
||||
|
||||
**Что сделано:**
|
||||
|
||||
- ✅ Обновлён `vite.config.ts`:
|
||||
- Порт изменён на `5173` (стандартный для Vite)
|
||||
- Настроен proxy для API запросов к бэкенду (`http://localhost:3001`)
|
||||
- Добавлены proxy правила для `/api`, `/uploads`, `/logout`
|
||||
- ✅ Обновлён `package.json`:
|
||||
- Добавлен скрипт `server` для запуска бэкенда
|
||||
- Добавлен скрипт `dev:all` для одновременного запуска фронтенда и бэкенда
|
||||
- Добавлен скрипт `start` как алиас для `dev:all`
|
||||
- Установлен пакет `concurrently` для параллельного запуска
|
||||
|
||||
**Запуск только фронтенда:**
|
||||
|
||||
```bash
|
||||
npm run dev
|
||||
```
|
||||
|
||||
**Адрес:** http://localhost:5173
|
||||
|
||||
---
|
||||
|
||||
## 🚀 Запуск всего приложения
|
||||
|
||||
### Вариант 1: Одна команда (рекомендуется)
|
||||
|
||||
```bash
|
||||
npm start
|
||||
```
|
||||
|
||||
Это запустит фронтенд и бэкенд одновременно.
|
||||
|
||||
### Вариант 2: Раздельный запуск
|
||||
|
||||
**Терминал 1 (Backend):**
|
||||
|
||||
```bash
|
||||
cd backend
|
||||
npm start
|
||||
```
|
||||
|
||||
**Терминал 2 (Frontend):**
|
||||
|
||||
```bash
|
||||
npm run dev
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 📋 Установка зависимостей
|
||||
|
||||
### Первый раз:
|
||||
|
||||
```bash
|
||||
# Фронтенд
|
||||
npm install
|
||||
|
||||
# Бэкенд
|
||||
cd backend
|
||||
npm install
|
||||
cd ..
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🔧 Конфигурация
|
||||
|
||||
### Backend (.env)
|
||||
|
||||
Создайте файл `backend/.env`:
|
||||
|
||||
```env
|
||||
PORT=3001
|
||||
SESSION_SECRET=your-secret-key-here
|
||||
NODE_ENV=development
|
||||
ENCRYPTION_KEY=your-encryption-key-min-32-chars
|
||||
```
|
||||
|
||||
**Важно:** `ENCRYPTION_KEY` используется для шифрования заметок в базе данных. Используйте надежный случайный ключ минимум 32 символа!
|
||||
|
||||
---
|
||||
|
||||
## 📍 Порты
|
||||
|
||||
- **Frontend (dev):** http://localhost:5173
|
||||
- **Backend (новый):** http://localhost:3001
|
||||
- **Старое приложение:** http://localhost:3000 (если запущено)
|
||||
|
||||
---
|
||||
|
||||
## ✨ Преимущества новой структуры
|
||||
|
||||
1. **Независимость:** Фронтенд и бэкенд могут разрабатываться и деплоиться независимо
|
||||
2. **Современный стек:** Vite для быстрой разработки фронтенда
|
||||
3. **Hot Reload:** Автоматическая перезагрузка при изменениях
|
||||
4. **TypeScript:** Типизация на фронтенде
|
||||
5. **Proxy:** Нет проблем с CORS в разработке
|
||||
6. **Раздельные зависимости:** Чистое разделение фронтенд/бэкенд зависимостей
|
||||
|
||||
---
|
||||
|
||||
## 📖 Документация
|
||||
|
||||
- [QUICK_START.md](QUICK_START.md) - Быстрый старт
|
||||
- [README_RU.md](README_RU.md) - Полная документация на русском
|
||||
- [backend/README.md](backend/README.md) - Документация бэкенда
|
||||
- [DEBUG.md](DEBUG.md) - Отладка и решение проблем
|
||||
|
||||
---
|
||||
|
||||
## 🔄 Совместимость со старым приложением
|
||||
|
||||
Старое приложение (порт 3000) и новое (порты 5173 + 3001) могут работать одновременно.
|
||||
|
||||
**База данных:** Оба приложения используют разные базы данных:
|
||||
|
||||
- Старое: `/database/notes.db`
|
||||
- Новое: `/backend/database/notes.db`
|
||||
|
||||
Если нужно использовать общую базу, можно скопировать файлы из `/database/` в `/backend/database/`.
|
||||
192
COMMANDS.md
192
COMMANDS.md
@ -1,192 +0,0 @@
|
||||
# Команды NoteJS React
|
||||
|
||||
## 🔧 Установка
|
||||
|
||||
```bash
|
||||
# Автоматическая установка всех зависимостей
|
||||
./install.sh
|
||||
|
||||
# Или вручную:
|
||||
npm install # Фронтенд
|
||||
cd backend && npm install # Бэкенд
|
||||
```
|
||||
|
||||
## 🚀 Запуск
|
||||
|
||||
```bash
|
||||
# Запуск всего приложения (рекомендуется)
|
||||
./start.sh
|
||||
# или
|
||||
npm start
|
||||
# или
|
||||
npm run dev:all
|
||||
|
||||
# Только фронтенд
|
||||
npm run dev
|
||||
|
||||
# Только бэкенд
|
||||
npm run server
|
||||
# или
|
||||
cd backend && npm start
|
||||
```
|
||||
|
||||
## 🏗️ Сборка
|
||||
|
||||
```bash
|
||||
# Production сборка
|
||||
npm run build
|
||||
|
||||
# Предпросмотр production сборки
|
||||
npm run preview
|
||||
```
|
||||
|
||||
## 🧹 Разработка
|
||||
|
||||
```bash
|
||||
# Проверка кода (линтинг)
|
||||
npm run lint
|
||||
```
|
||||
|
||||
## 📂 Структура команд
|
||||
|
||||
### Package.json (корень)
|
||||
|
||||
- `npm run dev` - Запуск Vite dev сервера (фронтенд)
|
||||
- `npm run build` - Сборка production версии
|
||||
- `npm run preview` - Предпросмотр production сборки
|
||||
- `npm run lint` - Проверка кода
|
||||
- `npm run server` - Запуск бэкенда
|
||||
- `npm run dev:all` - Запуск фронтенда и бэкенда одновременно
|
||||
- `npm start` - Алиас для `dev:all`
|
||||
|
||||
### Backend/package.json
|
||||
|
||||
- `npm start` - Запуск сервера
|
||||
- `npm run dev` - Запуск с nodemon (auto-reload)
|
||||
|
||||
## 🌐 Адреса
|
||||
|
||||
После запуска приложение доступно по адресам:
|
||||
|
||||
- **Frontend (dev):** http://localhost:5173
|
||||
- **Backend API:** http://localhost:3001
|
||||
- **Старая версия:** http://localhost:3000 (если запущена)
|
||||
|
||||
## 🔑 Переменные окружения
|
||||
|
||||
### Backend (.env)
|
||||
|
||||
Создайте файл `backend/.env`:
|
||||
|
||||
```env
|
||||
PORT=3001
|
||||
SESSION_SECRET=ваш-секретный-ключ
|
||||
NODE_ENV=development
|
||||
```
|
||||
|
||||
## 📝 Примеры использования
|
||||
|
||||
### Первый запуск
|
||||
|
||||
```bash
|
||||
# 1. Клонирование репозитория
|
||||
git clone <repo-url>
|
||||
cd notejs-react
|
||||
|
||||
# 2. Установка зависимостей
|
||||
./install.sh
|
||||
|
||||
# 3. Настройка бэкенда (создать .env)
|
||||
nano backend/.env
|
||||
|
||||
# 4. Запуск
|
||||
./start.sh
|
||||
```
|
||||
|
||||
### Разработка
|
||||
|
||||
```bash
|
||||
# Терминал 1: Backend с auto-reload
|
||||
cd backend
|
||||
npm run dev
|
||||
|
||||
# Терминал 2: Frontend с hot-reload
|
||||
npm run dev
|
||||
```
|
||||
|
||||
### Production
|
||||
|
||||
```bash
|
||||
# 1. Сборка фронтенда
|
||||
npm run build
|
||||
|
||||
# 2. Запуск бэкенда
|
||||
cd backend
|
||||
NODE_ENV=production npm start
|
||||
```
|
||||
|
||||
## 🐛 Отладка
|
||||
|
||||
```bash
|
||||
# Проверка портов
|
||||
lsof -i :3001 # Backend
|
||||
lsof -i :5173 # Frontend
|
||||
|
||||
# Логи бэкенда
|
||||
cd backend
|
||||
npm start
|
||||
|
||||
# Логи фронтенда
|
||||
npm run dev
|
||||
```
|
||||
|
||||
## 🔄 Работа с базой данных
|
||||
|
||||
```bash
|
||||
# Просмотр базы данных (SQLite)
|
||||
sqlite3 backend/database/notes.db
|
||||
|
||||
# Создание резервной копии
|
||||
cp backend/database/notes.db backend/database/notes.db.backup
|
||||
|
||||
# Восстановление
|
||||
cp backend/database/notes.db.backup backend/database/notes.db
|
||||
```
|
||||
|
||||
## 📦 Обновление зависимостей
|
||||
|
||||
```bash
|
||||
# Проверка устаревших пакетов (фронтенд)
|
||||
npm outdated
|
||||
|
||||
# Обновление (фронтенд)
|
||||
npm update
|
||||
|
||||
# Проверка устаревших пакетов (бэкенд)
|
||||
cd backend
|
||||
npm outdated
|
||||
npm update
|
||||
```
|
||||
|
||||
## 🧪 Тестирование
|
||||
|
||||
```bash
|
||||
# В будущем здесь будут команды для тестов
|
||||
# npm test
|
||||
```
|
||||
|
||||
## 📋 Git
|
||||
|
||||
```bash
|
||||
# Статус
|
||||
git status
|
||||
|
||||
# Добавить изменения
|
||||
git add .
|
||||
|
||||
# Коммит
|
||||
git commit -m "Описание изменений"
|
||||
|
||||
# Отправка
|
||||
git push
|
||||
```
|
||||
70
DEBUG.md
70
DEBUG.md
@ -1,70 +0,0 @@
|
||||
# Инструкция по отладке подключения к backend
|
||||
|
||||
## Проблема: "Ошибка соединения с сервером"
|
||||
|
||||
### Шаг 1: Проверьте, запущен ли backend сервер
|
||||
|
||||
```bash
|
||||
# В корне проекта NoteJS
|
||||
cd /home/fovway/git/NoteJS
|
||||
npm start
|
||||
# или
|
||||
node server.js
|
||||
```
|
||||
|
||||
Backend должен быть запущен на порту 3000. Проверьте:
|
||||
|
||||
- В консоли должно быть: "Сервер запущен на порту 3000"
|
||||
- В браузере: http://localhost:3000 должен открываться
|
||||
|
||||
### Шаг 2: Проверьте консоль браузера
|
||||
|
||||
Откройте DevTools (F12) и посмотрите в консоль:
|
||||
|
||||
- Если видите "API Request: POST /api/login" - запрос отправляется
|
||||
- Если видите "Network error - server might be down or proxy not working" - backend не отвечает
|
||||
- Если видите ошибку CORS - проблема с настройками сервера
|
||||
|
||||
### Шаг 3: Проверьте прокси Vite
|
||||
|
||||
Vite dev server (порт 3001) должен проксировать запросы на `/api` на `http://localhost:3000`.
|
||||
|
||||
Убедитесь что в `vite.config.ts`:
|
||||
|
||||
```typescript
|
||||
proxy: {
|
||||
"/api": {
|
||||
target: "http://localhost:3000",
|
||||
changeOrigin: true,
|
||||
secure: false,
|
||||
ws: true,
|
||||
},
|
||||
}
|
||||
```
|
||||
|
||||
### Шаг 4: Проверьте сетевые запросы
|
||||
|
||||
В DevTools > Network:
|
||||
|
||||
- Запрос должен быть на `http://localhost:3001/api/login` (не 3000!)
|
||||
- Статус должен быть 200 или 400/401 (не ошибка сети)
|
||||
|
||||
### Шаг 5: Проверьте сессии
|
||||
|
||||
Backend использует cookies для сессий. Убедитесь что:
|
||||
|
||||
- `withCredentials: true` в axios клиенте
|
||||
- Backend настроен для работы с cookies
|
||||
|
||||
### Типичные ошибки:
|
||||
|
||||
1. **"Сервер не отвечает"** - backend не запущен
|
||||
2. **CORS ошибка** - проверьте настройки CORS в server.js
|
||||
3. **404 Not Found** - неправильный URL или прокси не работает
|
||||
4. **Network Error** - backend не доступен или прокси не настроен
|
||||
|
||||
### Быстрое решение:
|
||||
|
||||
1. Убедитесь что backend запущен: `cd /home/fovway/git/NoteJS && npm start`
|
||||
2. Перезапустите Vite dev server: `cd notejs-react && npm run dev`
|
||||
3. Откройте браузер и проверьте консоль для деталей ошибки
|
||||
131
OFFLINE_FIX.md
131
OFFLINE_FIX.md
@ -1,131 +0,0 @@
|
||||
# Исправление проблемы с оффлайн режимом
|
||||
|
||||
## Проблема
|
||||
При обновлении страницы в оффлайн режиме попеременно показывается сообщение "нет подключения к интернету" и нормальное отображение приложения.
|
||||
|
||||
## Причина
|
||||
Service Worker использовал стратегию, которая пыталась обратиться к сети перед использованием кэша, что приводило к показу страницы ошибки браузера при отсутствии подключения.
|
||||
|
||||
## Решение
|
||||
Внесены изменения в `vite.config.ts` для обеспечения стабильной работы в оффлайн режиме:
|
||||
|
||||
### 1. Стратегия CacheFirst для навигационных запросов
|
||||
Теперь при обновлении страницы Service Worker **сразу** загружает кэшированную версию без попыток обращения к сети:
|
||||
|
||||
```typescript
|
||||
{
|
||||
urlPattern: ({ request }) => request.mode === 'navigate',
|
||||
handler: "CacheFirst",
|
||||
options: {
|
||||
cacheName: "pages-cache",
|
||||
expiration: {
|
||||
maxEntries: 10,
|
||||
maxAgeSeconds: 7 * 24 * 60 * 60, // 7 days
|
||||
},
|
||||
cacheableResponse: {
|
||||
statuses: [0, 200],
|
||||
},
|
||||
},
|
||||
}
|
||||
```
|
||||
|
||||
### 2. Дополнительное кэширование HTML файлов
|
||||
Добавлено специальное правило для всех HTML файлов:
|
||||
|
||||
```typescript
|
||||
{
|
||||
urlPattern: /\.html$/,
|
||||
handler: "CacheFirst",
|
||||
options: {
|
||||
cacheName: "html-cache",
|
||||
expiration: {
|
||||
maxEntries: 10,
|
||||
maxAgeSeconds: 7 * 24 * 60 * 60,
|
||||
},
|
||||
cacheableResponse: {
|
||||
statuses: [0, 200],
|
||||
},
|
||||
},
|
||||
}
|
||||
```
|
||||
|
||||
### 3. Автоматическое обновление Service Worker
|
||||
Изменен тип регистрации с `"prompt"` на `"autoUpdate"` для обеспечения автоматического обновления SW без запроса пользователя:
|
||||
|
||||
```typescript
|
||||
registerType: "autoUpdate"
|
||||
```
|
||||
|
||||
### 4. Отключение Navigation Preload
|
||||
Добавлена настройка `navigationPreload: false` для предотвращения попыток загрузки из сети при навигации.
|
||||
|
||||
## Как применить изменения
|
||||
|
||||
### 1. Пересборка проекта
|
||||
```bash
|
||||
npm run build
|
||||
```
|
||||
|
||||
### 2. Копирование файлов на сервер
|
||||
После успешной сборки скопируйте содержимое папки `dist/` в `backend/public/`:
|
||||
|
||||
```bash
|
||||
# Windows PowerShell
|
||||
Remove-Item -Recurse -Force backend/public/*
|
||||
Copy-Item -Recurse dist/* backend/public/
|
||||
|
||||
# Linux/Mac
|
||||
rm -rf backend/public/*
|
||||
cp -r dist/* backend/public/
|
||||
```
|
||||
|
||||
### 3. Запуск сервера
|
||||
Запустите сервер (или попросите это сделать):
|
||||
|
||||
```bash
|
||||
cd backend
|
||||
npm start
|
||||
```
|
||||
|
||||
### 4. Проверка работы
|
||||
1. Откройте приложение в браузере
|
||||
2. Дождитесь полной загрузки приложения
|
||||
3. Откройте DevTools → Application → Service Workers
|
||||
4. Убедитесь, что новый Service Worker активирован
|
||||
5. Переключите браузер в оффлайн режим (DevTools → Network → Offline)
|
||||
6. Обновите страницу несколько раз - приложение должно загружаться из кэша каждый раз
|
||||
|
||||
### 5. Очистка старого кэша (если необходимо)
|
||||
Если проблема все еще возникает, попробуйте:
|
||||
1. DevTools → Application → Clear storage → Clear site data
|
||||
2. Закройте и откройте браузер заново
|
||||
3. Перейдите на сайт снова - новый SW установится и закэширует все ресурсы
|
||||
4. Проверьте работу в оффлайн режиме
|
||||
|
||||
## Технические детали
|
||||
|
||||
### Стратегии кэширования
|
||||
|
||||
**CacheFirst (Cache First, Network Fallback)**
|
||||
- Сначала проверяется кэш
|
||||
- Если ресурс найден в кэше, он возвращается немедленно
|
||||
- Если ресурса нет в кэше, делается запрос к сети
|
||||
- Идеально для статических ресурсов и оффлайн работы
|
||||
|
||||
**NetworkFirst** (используется для API)
|
||||
- Сначала пытается загрузить из сети
|
||||
- Если сеть недоступна или таймаут, возвращается кэшированная версия
|
||||
- Идеально для данных, которые должны быть актуальными
|
||||
|
||||
### Настройки Service Worker
|
||||
- `skipWaiting: true` - новый SW активируется немедленно
|
||||
- `clientsClaim: true` - новый SW берет контроль над всеми открытыми страницами
|
||||
- `cleanupOutdatedCaches: true` - автоматическая очистка устаревших кэшей
|
||||
|
||||
## Ожидаемый результат
|
||||
После применения изменений приложение будет:
|
||||
- ✅ Всегда загружаться из кэша в оффлайн режиме
|
||||
- ✅ Не показывать страницу "нет подключения к интернету"
|
||||
- ✅ Работать стабильно при любом количестве обновлений страницы
|
||||
- ✅ Автоматически обновлять Service Worker без запроса пользователя
|
||||
|
||||
144
QUICK_START.md
144
QUICK_START.md
@ -1,144 +0,0 @@
|
||||
# Быстрый старт NoteJS React
|
||||
|
||||
## 🚀 Первый запуск
|
||||
|
||||
### 1. Установка всех зависимостей
|
||||
|
||||
```bash
|
||||
# Установка зависимостей фронтенда
|
||||
npm install
|
||||
|
||||
# Установка зависимостей бэкенда
|
||||
cd backend && npm install && cd ..
|
||||
```
|
||||
|
||||
### 2. Запуск приложения
|
||||
|
||||
```bash
|
||||
# Запуск фронтенда и бэкенда одновременно
|
||||
npm start
|
||||
```
|
||||
|
||||
Приложение будет доступно по адресу: **http://localhost:5173**
|
||||
|
||||
⚠️ **ВАЖНО:** Открывайте именно **http://localhost:5173** (Frontend), а НЕ http://localhost:3001 (Backend API)
|
||||
|
||||
## 🏗️ Архитектура
|
||||
|
||||
Приложение разделено на два независимых сервера:
|
||||
|
||||
1. **Frontend (React + Vite)** - порт 5173
|
||||
|
||||
- Отображает интерфейс пользователя
|
||||
- Обрабатывает роутинг
|
||||
- Проксирует API запросы к бэкенду
|
||||
|
||||
2. **Backend (Node.js + Express)** - порт 3001
|
||||
- Предоставляет REST API
|
||||
- Работает с базой данных
|
||||
- Обрабатывает аутентификацию
|
||||
- Хранит файлы и изображения
|
||||
|
||||
**Как это работает:**
|
||||
|
||||
- Вы открываете http://localhost:5173
|
||||
- Frontend отображает интерфейс
|
||||
- При запросе данных Frontend обращается к Backend API
|
||||
- Backend обрабатывает запрос и возвращает данные
|
||||
|
||||
## 📋 Полезные команды
|
||||
|
||||
### Запуск
|
||||
|
||||
```bash
|
||||
# Запуск всего приложения (фронтенд + бэкенд)
|
||||
npm start
|
||||
# или
|
||||
npm run dev:all
|
||||
|
||||
# Запуск только фронтенда
|
||||
npm run dev
|
||||
|
||||
# Запуск только бэкенда
|
||||
npm run server
|
||||
# или
|
||||
cd backend && npm start
|
||||
```
|
||||
|
||||
### Сборка
|
||||
|
||||
```bash
|
||||
# Production сборка фронтенда
|
||||
npm run build
|
||||
|
||||
# Предпросмотр production сборки
|
||||
npm run preview
|
||||
```
|
||||
|
||||
### Разработка
|
||||
|
||||
```bash
|
||||
# Проверка кода (линтинг)
|
||||
npm run lint
|
||||
```
|
||||
|
||||
## 🔧 Первоначальная настройка
|
||||
|
||||
### 1. Настройка бэкенда
|
||||
|
||||
Создайте файл `backend/.env`:
|
||||
|
||||
```env
|
||||
PORT=3001
|
||||
SESSION_SECRET=замените-на-свой-секретный-ключ
|
||||
NODE_ENV=development
|
||||
ENCRYPTION_KEY=замените-на-свой-ключ-минимум-32-символа
|
||||
```
|
||||
|
||||
**Важно:** `ENCRYPTION_KEY` используется для шифрования заметок в базе данных. Используйте надежный случайный ключ минимум 32 символа!
|
||||
|
||||
### 2. Первый пользователь
|
||||
|
||||
1. Откройте http://localhost:5173
|
||||
2. Перейдите на страницу регистрации
|
||||
3. Создайте учетную запись
|
||||
|
||||
### 3. Настройка AI (опционально)
|
||||
|
||||
1. Войдите в приложение
|
||||
2. Перейдите в "Настройки"
|
||||
3. Вкладка "AI настройки"
|
||||
4. Введите:
|
||||
- API ключ
|
||||
- Base URL (например: `https://api.openai.com/v1/`)
|
||||
- Модель (например: `gpt-3.5-turbo`)
|
||||
5. Включите "Включить AI функционал"
|
||||
|
||||
## 📍 Адреса
|
||||
|
||||
- **Фронтенд (dev)**: http://localhost:5173
|
||||
- **Бэкенд API**: http://localhost:3001
|
||||
- **Старая версия**: http://localhost:3000 (если запущена)
|
||||
|
||||
## ❓ Проблемы
|
||||
|
||||
### Порт уже занят
|
||||
|
||||
Если порт 3001 или 5173 занят:
|
||||
|
||||
1. Измените порт в `backend/.env` (для бэкенда)
|
||||
2. Измените порт в `vite.config.ts` (для фронтенда)
|
||||
|
||||
### База данных не создается
|
||||
|
||||
Проверьте, что папка `backend/database/` существует и доступна для записи.
|
||||
|
||||
### Не загружаются файлы
|
||||
|
||||
Проверьте, что папка `backend/public/uploads/` существует и доступна для записи.
|
||||
|
||||
## 📖 Документация
|
||||
|
||||
Полная документация в файле [README_RU.md](README_RU.md)
|
||||
|
||||
Backend документация: [backend/README.md](backend/README.md)
|
||||
204
README_RU.md
204
README_RU.md
@ -1,204 +0,0 @@
|
||||
# NoteJS React - Приложение для заметок
|
||||
|
||||
Современное PWA приложение для ведения заметок с поддержкой Markdown, изображений, файлов и AI.
|
||||
|
||||
## Структура проекта
|
||||
|
||||
```
|
||||
notejs-react/
|
||||
├── backend/ # Backend сервер (Node.js + Express)
|
||||
│ ├── database/ # SQLite базы данных
|
||||
│ ├── public/ # Статические файлы и загрузки
|
||||
│ ├── server.js # Основной файл сервера
|
||||
│ └── package.json # Зависимости бэкенда
|
||||
├── src/ # Frontend исходники (React + TypeScript)
|
||||
│ ├── api/ # API клиенты
|
||||
│ ├── components/ # React компоненты
|
||||
│ ├── hooks/ # Кастомные хуки
|
||||
│ ├── pages/ # Страницы приложения
|
||||
│ ├── store/ # Redux store
|
||||
│ ├── styles/ # CSS стили
|
||||
│ ├── types/ # TypeScript типы
|
||||
│ └── utils/ # Утилиты
|
||||
├── public/ # Публичные файлы (иконки, манифест)
|
||||
└── package.json # Зависимости фронтенда
|
||||
```
|
||||
|
||||
## Установка
|
||||
|
||||
### 1. Установка зависимостей фронтенда
|
||||
|
||||
```bash
|
||||
npm install
|
||||
```
|
||||
|
||||
### 2. Установка зависимостей бэкенда
|
||||
|
||||
```bash
|
||||
cd backend
|
||||
npm install
|
||||
cd ..
|
||||
```
|
||||
|
||||
## Запуск
|
||||
|
||||
### Вариант 1: Запуск всего приложения (рекомендуется)
|
||||
|
||||
```bash
|
||||
npm start
|
||||
```
|
||||
|
||||
или
|
||||
|
||||
```bash
|
||||
npm run dev:all
|
||||
```
|
||||
|
||||
Это запустит:
|
||||
|
||||
- **Frontend** на `http://localhost:5173`
|
||||
- **Backend** на `http://localhost:3001`
|
||||
|
||||
### Вариант 2: Раздельный запуск
|
||||
|
||||
**Frontend:**
|
||||
|
||||
```bash
|
||||
npm run dev
|
||||
```
|
||||
|
||||
**Backend (в отдельном терминале):**
|
||||
|
||||
```bash
|
||||
npm run server
|
||||
```
|
||||
|
||||
или
|
||||
|
||||
```bash
|
||||
cd backend
|
||||
npm start
|
||||
```
|
||||
|
||||
## Функционал
|
||||
|
||||
### ✨ Основные возможности
|
||||
|
||||
- 📝 Создание и редактирование заметок с Markdown
|
||||
- 🖼️ Загрузка изображений к заметкам
|
||||
- 📎 Прикрепление файлов (PDF, DOC, XLS, ZIP и др.)
|
||||
- 📌 Закрепление важных заметок
|
||||
- 📦 Архивация заметок
|
||||
- 🔍 Поиск по заметкам и тегам
|
||||
- 📅 Календарь заметок
|
||||
- 🏷️ Система тегов
|
||||
- 🌓 Светлая/тёмная тема
|
||||
- 🎨 Настройка цветовой схемы
|
||||
- 👤 Профили пользователей с аватарами
|
||||
|
||||
### 🤖 AI функционал
|
||||
|
||||
- Улучшение текста заметок
|
||||
- Исправление ошибок
|
||||
- Генерация контента
|
||||
- Настройка собственного OpenAI-совместимого API
|
||||
|
||||
### 📱 PWA
|
||||
|
||||
- Установка как приложение
|
||||
- Работа офлайн (Service Worker)
|
||||
- Push-уведомления (опционально)
|
||||
- Адаптивный дизайн для всех устройств
|
||||
|
||||
### Markdown поддержка
|
||||
|
||||
- Заголовки (H1-H5)
|
||||
- **Жирный** и _курсив_
|
||||
- Списки (маркированные и нумерованные)
|
||||
- ~~Зачеркнутый текст~~
|
||||
- [Ссылки](https://example.com)
|
||||
- `Код` и блоки кода
|
||||
- Todo списки с чекбоксами
|
||||
- ||Спойлеры||
|
||||
- Внешние ссылки
|
||||
|
||||
## Технологии
|
||||
|
||||
### Frontend
|
||||
|
||||
- React 18
|
||||
- TypeScript
|
||||
- Redux Toolkit
|
||||
- React Router
|
||||
- Vite
|
||||
- Axios
|
||||
- Marked (Markdown)
|
||||
- Iconify
|
||||
|
||||
### Backend
|
||||
|
||||
- Node.js
|
||||
- Express
|
||||
- SQLite3
|
||||
- Bcrypt
|
||||
- Multer
|
||||
- Express Session
|
||||
- Helmet
|
||||
|
||||
## Разработка
|
||||
|
||||
### Сборка production версии
|
||||
|
||||
```bash
|
||||
npm run build
|
||||
```
|
||||
|
||||
Собранные файлы будут в папке `dist/`.
|
||||
|
||||
### Проверка типов
|
||||
|
||||
```bash
|
||||
npm run lint
|
||||
```
|
||||
|
||||
## Конфигурация
|
||||
|
||||
### Backend (.env)
|
||||
|
||||
Создайте файл `backend/.env`:
|
||||
|
||||
```env
|
||||
PORT=3001
|
||||
SESSION_SECRET=your-secret-key-here
|
||||
NODE_ENV=development
|
||||
ENCRYPTION_KEY=your-encryption-key-min-32-chars
|
||||
```
|
||||
|
||||
**Важно:**
|
||||
- `ENCRYPTION_KEY` - ключ для шифрования заметок в базе данных (минимум 32 символа)
|
||||
- В продакшене ОБЯЗАТЕЛЬНО используйте надежный случайный ключ
|
||||
- Не используйте дефолтный ключ в продакшене!
|
||||
|
||||
### AI настройки
|
||||
|
||||
Настройки AI выполняются через интерфейс приложения в разделе "Настройки".
|
||||
|
||||
Требуется:
|
||||
|
||||
- OpenAI API Key (или ключ совместимого API)
|
||||
- Base URL (например, `https://api.openai.com/v1/`)
|
||||
- Модель (например, `gpt-3.5-turbo`)
|
||||
|
||||
## Порты
|
||||
|
||||
- **Frontend (dev)**: `http://localhost:5173`
|
||||
- **Backend**: `http://localhost:3001`
|
||||
- **Старое приложение**: `http://localhost:3000` (если запущено)
|
||||
|
||||
## Лицензия
|
||||
|
||||
ISC
|
||||
|
||||
## Автор
|
||||
|
||||
NoteJS Team
|
||||
@ -625,18 +625,18 @@ function runMigrations() {
|
||||
console.log(
|
||||
"Колонка is_public_profile добавлена в таблицу users"
|
||||
);
|
||||
// Устанавливаем is_public_profile = 1 для всех существующих пользователей
|
||||
// Только для NULL значений устанавливаем DEFAULT (1)
|
||||
db.run(
|
||||
"UPDATE users SET is_public_profile = 1 WHERE is_public_profile IS NULL OR is_public_profile = 0",
|
||||
"UPDATE users SET is_public_profile = 1 WHERE is_public_profile IS NULL",
|
||||
(updateErr) => {
|
||||
if (updateErr) {
|
||||
console.error(
|
||||
"Ошибка обновления is_public_profile для существующих пользователей:",
|
||||
"Ошибка обновления is_public_profile для пользователей с NULL:",
|
||||
updateErr.message
|
||||
);
|
||||
} else {
|
||||
console.log(
|
||||
"is_public_profile установлен в 1 для всех существующих пользователей"
|
||||
"is_public_profile установлен в 1 для пользователей с NULL"
|
||||
);
|
||||
}
|
||||
}
|
||||
@ -644,23 +644,6 @@ function runMigrations() {
|
||||
}
|
||||
}
|
||||
);
|
||||
} else {
|
||||
// Если колонка уже существует, обновляем существующих пользователей с NULL или 0
|
||||
db.run(
|
||||
"UPDATE users SET is_public_profile = 1 WHERE is_public_profile IS NULL OR is_public_profile = 0",
|
||||
(updateErr) => {
|
||||
if (updateErr) {
|
||||
console.error(
|
||||
"Ошибка обновления is_public_profile для существующих пользователей:",
|
||||
updateErr.message
|
||||
);
|
||||
} else {
|
||||
console.log(
|
||||
"is_public_profile установлен в 1 для всех существующих пользователей"
|
||||
);
|
||||
}
|
||||
}
|
||||
);
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
@ -82,7 +82,7 @@ define(['./workbox-47da91e0'], (function (workbox) { 'use strict';
|
||||
"revision": "3ca0b8505b4bec776b69afdba2768812"
|
||||
}, {
|
||||
"url": "/index.html",
|
||||
"revision": "0.rkgg11egm7o"
|
||||
"revision": "0.unrihnsl5to"
|
||||
}], {
|
||||
"ignoreURLParametersMatching": [/^utm_/, /^fbclid$/]
|
||||
});
|
||||
|
||||
36
install.sh
36
install.sh
@ -1,36 +0,0 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Скрипт для установки всех зависимостей NoteJS React
|
||||
|
||||
echo "📦 Установка зависимостей NoteJS React..."
|
||||
echo ""
|
||||
|
||||
# Установка зависимостей фронтенда
|
||||
echo "1️⃣ Установка зависимостей фронтенда..."
|
||||
npm install
|
||||
|
||||
if [ $? -ne 0 ]; then
|
||||
echo "❌ Ошибка установки зависимостей фронтенда"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo ""
|
||||
echo "2️⃣ Установка зависимостей бэкенда..."
|
||||
cd backend
|
||||
npm install
|
||||
|
||||
if [ $? -ne 0 ]; then
|
||||
echo "❌ Ошибка установки зависимостей бэкенда"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
cd ..
|
||||
|
||||
echo ""
|
||||
echo "✅ Все зависимости успешно установлены!"
|
||||
echo ""
|
||||
echo "Для запуска приложения выполните:"
|
||||
echo " npm start"
|
||||
echo "или"
|
||||
echo " ./start.sh"
|
||||
|
||||
154
review.md
Normal file
154
review.md
Normal file
@ -0,0 +1,154 @@
|
||||
● Проведено полное ревью кода вашего приложения. Вот краткое резюме найденных проблем:
|
||||
|
||||
🔴 КРИТИЧЕСКИЕ УЯЗВИМОСТИ БЕЗОПАСНОСТИ
|
||||
|
||||
1. Hardcoded Secrets в репозитории ⚠️ CRITICAL
|
||||
|
||||
Файл: backend/.env
|
||||
- Ключ шифрования и секреты коммитятся в git
|
||||
- Любой с доступом к репозиторию может расшифровать все заметки
|
||||
- СРОЧНО: Удалите .env из истории git, ротируйте все секреты
|
||||
|
||||
2. Отключена CORS защита ⚠️ HIGH
|
||||
|
||||
Файл: backend/server.js
|
||||
- CORS пакет установлен, но НЕ используется
|
||||
- Приложение открыто для CSRF атак
|
||||
- API доступен с любых доменов
|
||||
|
||||
3. Отключен Rate Limiting ⚠️ HIGH
|
||||
|
||||
Файл: backend/server.js:187-192
|
||||
- Защита от брутфорса закомментирована
|
||||
- Возможны DDoS атаки
|
||||
- Перебор паролей неограничен
|
||||
|
||||
4. Отсутствует CSRF защита ⚠️ HIGH
|
||||
|
||||
- Все POST/PUT/DELETE эндпоинты уязвимы
|
||||
- Используются сессии, но без CSRF токенов
|
||||
|
||||
5. Небезопасная конфигурация сессий ⚠️ HIGH
|
||||
|
||||
Файл: backend/server.js:221-236
|
||||
cookie: {
|
||||
secure: false, // ❌ куки передаются по HTTP
|
||||
// ❌ нет httpOnly
|
||||
// ❌ нет sameSite
|
||||
}
|
||||
|
||||
🟡 СРЕДНИЕ УЯЗВИМОСТИ
|
||||
|
||||
6. Слабые требования к паролям
|
||||
|
||||
- Минимум только 6 символов
|
||||
- Нет требований к сложности
|
||||
- Рекомендация: минимум 12 символов + буквы/цифры/спецсимволы
|
||||
|
||||
7. Path Traversal в загрузке файлов
|
||||
|
||||
Файл: backend/server.js:1637-1641
|
||||
- Недостаточная санитизация имен файлов
|
||||
- Возможна запись в произвольные директории
|
||||
|
||||
8. Недостаточная валидация файлов
|
||||
|
||||
- Проверка только по MIME типу
|
||||
- Возможна загрузка вредоносных файлов с подменой расширения
|
||||
- Рекомендация: Magic byte validation
|
||||
|
||||
9. Нет валидации AI input
|
||||
|
||||
Файлы: server.js:3117, 3258, 3655
|
||||
- Возможны prompt injection атаки
|
||||
- Нет лимитов на длину текста
|
||||
- Риск больших расходов на API
|
||||
|
||||
10. Слабая генерация backup кодов
|
||||
|
||||
Math.random().toString(36) // ❌ не криптографически безопасно
|
||||
Используйте: crypto.randomBytes()
|
||||
|
||||
📊 ПРОБЛЕМЫ КАЧЕСТВА КОДА
|
||||
|
||||
11. Массовое дублирование кода
|
||||
|
||||
Файлы: NoteEditor.tsx vs NoteItem.tsx
|
||||
- 500+ строк идентичного markdown кода
|
||||
- При багфиксе нужно править 2 места
|
||||
- Рекомендация: Вынести в useMarkdownEditor hook
|
||||
|
||||
12. Проблемы производительности
|
||||
|
||||
Файл: NoteEditor.tsx:820-870
|
||||
- handleSelection вызывается на каждый mousemove
|
||||
- Нет debounce/throttle
|
||||
- Рекомендация: Добавить debounce 100ms
|
||||
|
||||
Файл: NotesList.tsx:167-183
|
||||
- Сортировка массива на каждом рендере
|
||||
- Рекомендация: Обернуть в useMemo
|
||||
|
||||
13. Злоупотребление TypeScript any
|
||||
|
||||
- 29 использований error: any
|
||||
- any в types для sync queue
|
||||
- Множество @ts-expect-error
|
||||
- Рекомендация: Использовать unknown и type guards
|
||||
|
||||
14. Огромные компоненты
|
||||
|
||||
Файл: NoteEditor.tsx - 1,172 строки
|
||||
- Нарушение Single Responsibility
|
||||
- Рекомендация: Разбить на:
|
||||
- Core editor
|
||||
- useMarkdownEditor hook
|
||||
- useFloatingToolbar hook
|
||||
- useAIFeatures hook
|
||||
|
||||
15. Проблемы с accessibility
|
||||
|
||||
- Кнопки без aria-label
|
||||
- Inputs без labels
|
||||
- Нет focus management в модалках
|
||||
- Icon-only кнопки без текстовых альтернатив
|
||||
|
||||
16. Отключенные ESLint правила
|
||||
|
||||
// eslint-disable-next-line react-hooks/exhaustive-deps
|
||||
- Вместо исправления - отключение
|
||||
- Пропущенные зависимости в useEffect
|
||||
|
||||
🎯 ПРИОРИТЕТЫ ИСПРАВЛЕНИЯ
|
||||
|
||||
⚠️ СРОЧНО (24 часа):
|
||||
|
||||
1. Удалить .env из git истории
|
||||
2. Ротировать все секреты
|
||||
3. Включить rate limiting
|
||||
4. Настроить CORS
|
||||
5. Исправить session cookies
|
||||
|
||||
🔴 Высокий (1 неделя):
|
||||
|
||||
1. Добавить CSRF защиту
|
||||
2. Улучшить валидацию паролей
|
||||
3. Исправить CSP конфигурацию
|
||||
4. Добавить валидацию всех inputs
|
||||
5. Исправить проблемы с TypeScript any
|
||||
|
||||
🟡 Средний (1 месяц):
|
||||
|
||||
1. Вынести дублированный код
|
||||
2. Оптимизировать производительность
|
||||
3. Разбить большие компоненты
|
||||
4. Добавить unit тесты
|
||||
5. Исправить accessibility
|
||||
|
||||
📈 Метрики качества:
|
||||
|
||||
- Безопасность: 4/10
|
||||
- Качество кода: 6.5/10
|
||||
- TypeScript: 5/10
|
||||
- Производительность: 6/10
|
||||
- Accessibility: 4/10
|
||||
Loading…
x
Reference in New Issue
Block a user