vault backup: 2025-05-14 15:18:09

This commit is contained in:
2025-05-14 15:18:09 +02:00
parent fc86943819
commit f04766e80e
4 changed files with 328 additions and 1 deletions
+186
View File
@@ -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 помогают обеспечить контроль версий документов, особенно при синхронизации данных и в распределенных системах.
+1
View File
@@ -0,0 +1 @@
{}
@@ -0,0 +1,139 @@
#идеи
## Генерация G-code для CNC Гравера
Для того чтобы пользователи могли максимально удобно использовать созданные QR-коды, можно добавить возможность генерации G-code, который подходит для использования на CNC граверах. Это позволит мгновенно выгравировать QR-код на различных поверхностях, таких как металл, пластик, дерево и другие материалы.
### Основная Идея
- **Автоматическая Конвертация**: После создания QR-кода, пользователь может выбрать опцию "Экспортировать в G-code". Система автоматически преобразует QR-код в формат G-code, который может быть использован на CNC гравере.
- **Удобство Производства**: Это особенно полезно для владельцев, которым необходимо массово гравировать QR-коды на продуктах, таких как ошейники для животных, брелки для ключей, таблички для дверей и т.д.
### Основные Функции:
1. **Настройка Параметров Гравировки**:
- Возможность задать параметры гравировки, такие как глубина реза, скорость перемещения, размеры QR-кода и тип материала.
- Пользователь может выбрать предустановленные профили для различных материалов (например, дерево, металл, пластик).
2. **Экспорт G-code**:
- После настройки параметров, пользователь может скачать файл G-code, который готов для использования на CNC станке.
3. **Поддержка Разных Форматов**:
- Поддержка различных версий CNC граверов, позволяя выбирать подходящий формат G-code в зависимости от используемого оборудования.
### Преимущества Генерации G-code
- **Быстрая Маркировка**: Возможность быстро и точно маркировать объекты QR-кодами, обеспечивая их устойчивость и долговечность.
- **Экономия Времени и Ресурсов**: Исключение необходимости вручную создавать G-code или обращаться к внешним программам для его генерации.
- **Персонализация**: Пользователи могут легко адаптировать параметры гравировки под свои нужды, что делает процесс более гибким и удобным.
Добавление возможности вывода QR-кодов в G-code для CNC гравера позволит расширить использование сервиса и сделать его более привлекательным для пользователей, которые нуждаются в быстром и удобном решении для нанесения QR-кодов на физические объекты.
примерный код:
```ts
/**
* Converts an entire SVG file into G-code by rendering it to a canvas
* with configurable DPI and processing pixel brightness for laser engraving.
*/
type LaserConfig = {
power: number; // Laser power (0-100%)
feedRate: number; // Movement speed (mm/min)
outputWidth?: number; // Final width of the output in mm
outputHeight?: number; // Final height of the output in mm
dpi: number; // Dots per inch for rendering
startGCode: string[]; // Initial G-code commands
endGCode: string[]; // Final G-code commands
};
const defaultConfig: LaserConfig = {
power: 100,
feedRate: 500,
dpi: 300, // Default DPI (e.g., 300 DPI for high-resolution rendering)
startGCode: [
'G21 ; Set units to mm',
'G90 ; Use absolute positioning',
'M3 S100 ; Turn on laser at full power',
],
endGCode: [
'M5 ; Turn off laser',
'G0 X0 Y0 ; Return to origin',
],
};
/**
* Converts an SVG file to G-code by rendering it onto a canvas and analyzing pixel brightness.
* @param svgContent - The SVG file content as a string.
* @param config - The laser configuration for the conversion.
* @returns A promise that resolves to the G-code as a string.
*/
export const convertSvgToGCode = async (
svgContent: string,
config: LaserConfig = defaultConfig
): Promise<string> => {
const canvas = document.createElement('canvas');
const ctx = canvas.getContext('2d');
if (!ctx) throw new Error('Could not create canvas for rendering.');
const img = new Image();
img.src = `data:image/svg+xml;base64,${btoa(svgContent)}`;
// Initialize pxPerMm variable
let pxPerMm: number;
// Wait for the image to load
await new Promise<void>((resolve) => {
img.onload = () => {
const aspectRatio = img.width / img.height;
// Calculate pxPerMm based on DPI
pxPerMm = config.dpi / 25.4; // 1 inch = 25.4 mm
// Scale canvas dimensions based on output size and DPI
if (config.outputWidth && config.outputHeight) {
canvas.width = Math.ceil(config.outputWidth * pxPerMm);
canvas.height = Math.ceil(config.outputHeight * pxPerMm);
} else if (config.outputWidth) {
canvas.width = Math.ceil(config.outputWidth * pxPerMm);
canvas.height = Math.ceil((config.outputWidth / aspectRatio) * pxPerMm);
} else if (config.outputHeight) {
canvas.height = Math.ceil(config.outputHeight * pxPerMm);
canvas.width = Math.ceil((config.outputHeight * aspectRatio) * pxPerMm);
} else {
canvas.width = img.width;
canvas.height = img.height;
}
ctx.drawImage(img, 0, 0, canvas.width, canvas.height);
resolve();
};
});
// Extract image data from canvas
const imageData = ctx.getImageData(0, 0, canvas.width, canvas.height);
const { width, height, data } = imageData;
// Convert pixels to G-code
const gCode: string[] = [];
for (let y = 0; y < height; y++) {
const rowCommands: string[] = [];
for (let x = 0; x < width; x++) {
const index = (y * width + x) * 4; // RGBA index
const brightness = (data[index] + data[index + 1] + data[index + 2]) / 3; // Average RGB
const laserPower = Math.round((brightness / 255) * config.power);
if (laserPower > 0) {
rowCommands.push(`G1 X${(x / pxPerMm).toFixed(3)} Y${(y / pxPerMm).toFixed(3)} S${laserPower}`);
}
}
if (rowCommands.length > 0) {
gCode.push(...rowCommands);
}
}
return [
...config.startGCode,
...gCode,
...config.endGCode,
].join('\n');
};
```
+2 -1
View File
@@ -40,7 +40,8 @@
* получение кода
* версия для печати
* вектор
* версия для граверовки (фанерка в ресторан, кожа - подвес на поводок) см. [Генерация G code для CNC Гравера](Генерация-G-code-для-CNC-Гравера)
* версия для граверовки (фанерка в ресторан, кожа - подвес на поводок) см.
* [[Генерация G code для CNC Гравера]]
* купить готовый (+ приватный код для отвязки от текущего владельца)
* [настройка через сканирование в приложении](Настройка%20через%20сканирование%20в%20приложении.md)
* дизайн наклейки