mirror of
https://github.com/Ti-webdev/0-hereconnect-obsidian.git
synced 2026-08-01 02:06:41 +00:00
vault backup: 2025-05-14 15:18:09
This commit is contained in:
+186
@@ -0,0 +1,186 @@
|
||||
# База данных проекта
|
||||
|
||||
Проект использует базу данных **CouchDB** для хранения информации о пользователях, QR-кодах и сообщениях, что позволяет организовать взаимодействие между владельцами QR-кодов и гостями.
|
||||
CouchDB, распределенная NoSQL база данных, которая работает по протоколу HTTP и хранит данные в формате JSON.
|
||||
Это делает её удобной для интеграции с веб-приложениями и клиентскими библиотеками, такими как **PouchDB**.
|
||||
|
||||
---
|
||||
|
||||
## Доступ к тестовому серверу CouchDB
|
||||
|
||||
Тестовый сервер CouchDB для проекта "НаСвязи" доступен по следующему адресу:
|
||||
|
||||
- **URL**: [https://hereconnect.condev.ru/api/](https://hereconnect.condev.ru/api/)
|
||||
|
||||
Для управления базой данных и выполнения административных задач доступен встроенный интерфейс CouchDB — **Fauxton**:
|
||||
|
||||
- **Админ-панель Fauxton**: [https://hereconnect.condev.ru/api/_utils/](https://hereconnect.condev.ru/api/_utils/)
|
||||
---
|
||||
|
||||
## Использование админ-панели Fauxton
|
||||
|
||||
**Fauxton** — это встроенный веб-интерфейс CouchDB, предоставляющий доступ к функциям управления базой данных, работы с документами, настройки безопасности и мониторинга изменений.
|
||||
|
||||
### Основные действия в Fauxton
|
||||
|
||||
1. **Открытие Fauxton**:
|
||||
- Перейдите по адресу [https://hereconnect.condev.ru/api/_utils/](https://hereconnect.condev.ru/api/_utils/).
|
||||
- Введите логин `admin` и пароль `e1oQrcN4QN`, чтобы получить доступ к панели управления.
|
||||
|
||||
2. **Создание базы данных**:
|
||||
- На главной странице выберите **"Databases"** в боковом меню.
|
||||
- Нажмите **"Create Database"**.
|
||||
- Введите имя новой базы данных и нажмите **"Create"**, чтобы завершить создание.
|
||||
|
||||
3. **Работа с документами**:
|
||||
- Перейдите в нужную базу данных.
|
||||
- Чтобы создать новый документ, нажмите **"Add Document"**. Введите данные документа в формате JSON и нажмите **"Save Document"**.
|
||||
- Чтобы отредактировать документ, выберите его из списка, внесите изменения и нажмите **"Save Document"**. CouchDB создаст новую **ревизию** документа, сохранив изменения.
|
||||
|
||||
4. **Просмотр журнала изменений (Changes)**:
|
||||
- Внутри выбранной базы данных нажмите **"Changes"**, чтобы увидеть все изменения (добавления, обновления или удаления документов).
|
||||
- Журнал изменений позволяет отслеживать версию каждого документа, что полезно при синхронизации данных и работе с автономными приложениями.
|
||||
|
||||
5. **Настройка безопасности**:
|
||||
- В разделе **"Permissions"** можно настроить доступ к базе
|
||||
|
||||
|
||||
## Подключение к базе данных с помощью PouchDB
|
||||
|
||||
**[PouchDB](https://pouchdb.com/)** — это клиентская библиотека для работы с CouchDB, которая позволяет использовать базу данных как на стороне клиента (в браузере), так и на сервере через HTTP. PouchDB обеспечивает совместимость с CouchDB, так что работа с локальной базой не отличается от работы с удаленной.
|
||||
|
||||
### Основные операции с PouchDB
|
||||
|
||||
```bash
|
||||
npm install pouchdb
|
||||
|
||||
|
||||
```js
|
||||
// Импорт PouchDB
|
||||
import PouchDB from 'pouchdb-browser';
|
||||
|
||||
// Подключение к базе данных
|
||||
const db = new PouchDB('https://hereconnect.condev.ru/api/qr', {skip_setup: true});
|
||||
// или можно использовать локальную базу данных
|
||||
// const db = new PouchDB('qr');
|
||||
|
||||
const qr_code_uri = '4n8x9z7q';
|
||||
|
||||
try {
|
||||
// Создание документа QR-кода
|
||||
await db.put({
|
||||
_id: `qr_code:${qr_code_uri}`,
|
||||
type: 'qr_code',
|
||||
uri: qr_code_uri,
|
||||
user_uuid: '01931a8b-220c-76df-943c-ea23313c7c65',
|
||||
name: 'Мой автомобиль',
|
||||
actions: ['send_message', 'share_location'],
|
||||
url: `https://hereconnect.condev.ru/${qr_code_uri}`,
|
||||
created_at: new Date().toISOString()
|
||||
});
|
||||
console.log('QR-код успешно создан');
|
||||
} catch (error) {
|
||||
if (error.status === 409) { // Статус 409 означает конфликт (документ уже существует)
|
||||
console.log(`QR-код с идентификатором ${qr_code_uri} уже существует.`);
|
||||
} else {
|
||||
console.error('Ошибка при создании QR-кода:', error);
|
||||
}
|
||||
}
|
||||
|
||||
// Получение документа QR-кода
|
||||
const qrCodeDoc = await db.get(`qr_code:${qr_code_uri}`);
|
||||
console.log('QR-код:', qrCodeDoc);
|
||||
|
||||
// Обновление документа QR-кода (например, изменение имени)
|
||||
const qrCodeForUpdate = await db.get(`qr_code:${qr_code_uri}`);
|
||||
qrCodeForUpdate.name = 'Обновленное название объекта';
|
||||
await db.put(qrCodeForUpdate);
|
||||
|
||||
// Удаление документа QR-кода
|
||||
const qrCodeForDelete = await db.get(`qr_code:${qr_code_uri}`);
|
||||
await db.remove(qrCodeForDelete);
|
||||
|
||||
// Создание документа сообщения от гостя
|
||||
await db.put({
|
||||
_id: `message:${qr_code_uri}:1731317710358:1731317710358`,
|
||||
type: 'message',
|
||||
qr_code: qr_code_uri,
|
||||
chat: '1731317710358',
|
||||
created_at: '1731317710358',
|
||||
from: 'guest',
|
||||
content: 'Ваша машина мешает проезду',
|
||||
location: {
|
||||
lat: 55.7558,
|
||||
lng: 37.6176
|
||||
}
|
||||
});
|
||||
|
||||
// Получение всех сообщений для конкретного QR-кода
|
||||
const messages = await db.allDocs({
|
||||
startkey: `message:${qr_code_uri}:`,
|
||||
endkey: `message:${qr_code_uri}:\ufff0`,
|
||||
include_docs: true
|
||||
});
|
||||
messages.rows.forEach(row => console.log('Сообщение:', row.doc));
|
||||
|
||||
|
||||
/ Отслеживание изменений в базе данных
|
||||
db.changes({
|
||||
since: 'now',
|
||||
live: true
|
||||
}).on('change', change => {
|
||||
console.log('Изменение в базе данных:', change);
|
||||
});
|
||||
|
||||
// Синхронизация локальной и удаленной базы данных
|
||||
const remoteDB = new PouchDB('https://hereconnect.condev.ru/api/qr');
|
||||
db.sync(remoteDB, {
|
||||
live: true,
|
||||
retry: true
|
||||
}).on('change', info => {
|
||||
console.log('Синхронизация: изменения обнаружены', info);
|
||||
});
|
||||
```
|
||||
|
||||
## Ревизии документов
|
||||
CouchDB использует ревизии (`_rev`) для отслеживания версий каждого документа. Каждое обновление документа создает новую ревизию, которая включает уникальный идентификатор. Это позволяет разрешать конфликты при синхронизации и помогает управлять историей изменений.
|
||||
|
||||
Создание новой ревизии происходит при каждом обновлении документа. Ревизия представлена в виде строки, состоящей из номера и хеша (например, 1-9c65296036141e575d32ba9c034dd3ee).
|
||||
|
||||
Конфликты ревизий возникают при параллельных изменениях одного документа. CouchDB сохраняет обе версии, и конфликт можно разрешить вручную.
|
||||
|
||||
#### Как работают ревизии
|
||||
|
||||
- **Создание новой ревизии**: При каждом обновлении документа создается новая ревизия. CouchDB использует номера ревизий, которые включают префикс, указывающий версию изменения и хэш-значение, представляющее текущую версию данных. Например, ревизия может выглядеть как `1-9c65296036141e575d32ba9c034dd3ee`, где `1` — версия, а `9c65296036141e575d32ba9c034dd3ee` — уникальный хэш.
|
||||
|
||||
Использование _rev является **обязательным** для всех операций обновления и удаления документов, так как CouchDB требует указания текущей ревизии для предотвращения конфликтов данных.
|
||||
При создании нового документа указывать ревизию не требуется. CouchDB автоматически создает поле `_rev` для нового документа и присваивает ему начальную ревизию, которая обычно выглядит как `1-<хэш>` (например, `1-9c65296036141e575d32ba9c034dd3ee`).
|
||||
|
||||
- **Отслеживание изменений**: `_rev` обновляется при каждом изменении документа. Для того чтобы внести изменения в документ, необходимо указать его текущую ревизию, иначе CouchDB вернет ошибку `409 Conflict`, так как ожидает последнюю известную версию документа.
|
||||
|
||||
#### Пример использования ревизий
|
||||
|
||||
```javascript
|
||||
import PouchDB from 'pouchdb-browser';
|
||||
|
||||
const db = new PouchDB('https://hereconnect.condev.ru/api/qr', { skip_setup: true });
|
||||
try {
|
||||
// Получение текущей версии документа
|
||||
const doc = await db.get(docId);
|
||||
|
||||
// Изменение данных документа
|
||||
doc.name = 'Обновленное название объекта';
|
||||
|
||||
// Сохранение документа с новой ревизией
|
||||
const response = await db.put(doc);
|
||||
console.log('Документ обновлен:', response);
|
||||
} catch (error) {
|
||||
if (error.status === 409) {
|
||||
console.log('Конфликт: требуется обновить ревизию.');
|
||||
} else {
|
||||
console.error('Ошибка при обновлении документа:', error);
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
Ревизии в CouchDB помогают обеспечить контроль версий документов, особенно при синхронизации данных и в распределенных системах.
|
||||
Reference in New Issue
Block a user