diff --git a/api/Dockerfile b/api/Dockerfile index 7fa3191..99d015e 100644 --- a/api/Dockerfile +++ b/api/Dockerfile @@ -8,6 +8,8 @@ RUN npm install RUN apt-get update +RUN apt-get update && apt-get install -y chromium + COPY . . EXPOSE 4000 diff --git a/api/middleware/genCards.js b/api/middleware/genCards.js index ad86664..38e7ee6 100644 --- a/api/middleware/genCards.js +++ b/api/middleware/genCards.js @@ -1,77 +1,58 @@ -const path = require('path'); +const os = require('os'); const fs = require('fs'); -const puppeteer = require('puppeteer'); +const path = require('path'); +const { chromium } = require('playwright'); const sharp = require('sharp'); const DIR = process.env.CARDS_PATH || '../cards'; -async function genCards({ center, type, wayId, zoom, number, address }) { - const browser = await puppeteer.launch({ +async function genCards({ id, type }) { + if (!process.env.DOMAIN) throw new Error("❌ DOMAIN не заданий у .env"); + if (!process.env.ADMIN_TOKEN) throw new Error("❌ ADMIN_TOKEN не заданий у .env"); + if (!process.env.CARDS_PATH) throw new Error("❌ CARDS_PATH не заданий у .env"); + + + const name = type == 'homestead' ? `H${id}` : `T${id}` + + const URL = `https://${process.env.DOMAIN}/api/${type}/${id}`; // Замени на свой URL + const AUTH_TOKEN = process.env.ADMIN_TOKEN; + const DIR = process.env.CARDS_PATH || '../cards'; + const SCREENSHOT_FILE = path.resolve(`${DIR}/cache/${type}/${name}.png`); + const OUTPUT_FILE = path.resolve(`${DIR}/${type}/${name}.webp`); + + + // --- Отримуємо дані --- + const res = await fetch(URL, { + headers: { 'Authorization': AUTH_TOKEN, 'Accept': 'application/json' } + }); + if (!res.ok) throw new Error(`Помилка запиту: ${res.status}`); + const data = await res.json(); + + // --- Генеруємо HTML --- + const html = `

Картка плану території

`; + + // --- Зберігаємо тимчасовий HTML --- + const tmpFile = path.join(os.tmpdir(), 'map.html'); + fs.writeFileSync(tmpFile, html, 'utf-8'); + + // --- Зберігаємо --- + // const browser = await chromium.launch(); + const browser = await chromium.launch({ executablePath: process.env.PUPPETEER_EXECUTABLE_PATH || '/usr/bin/chromium-browser', args: ['--no-sandbox', '--disable-setuid-sandbox'] }); - - - let latlng = center && center.lat && center.lng ? `lat=${center.lat}&lng=${center.lng}&` : ''; - - const page = await browser.newPage(); - await page.setViewport({ width: 1144, height: (750 + 140) }) - await page.goto(`https://sheep-service.com/screenshot.html?${latlng}type=${type}&wayId=${wayId}&zoom=${zoom}&address=${address}&number=${number}`, { timeout: 0 }); - await page.waitForSelector('.leaflet-tile-loaded', { timeout: 30000 }); - await new Promise(resolve => setTimeout(resolve, 1000)); - - let name = () => { - if (type == "house") return `T${number}.png` - else if (type == "entrance") return `E${number}.png` - else if (type == "homestead") return `H${number}.png` - return `${Date.now()}.png` - } - - if (!fs.existsSync(path.join(DIR, 'cache'))) { - fs.mkdirSync(path.join(DIR, 'cache'), { recursive: true }) - } - - await page.screenshot({ path: path.join(DIR, "cache", name()) }); - + const page = await browser.newPage({ viewport: { width: 811, height: 531 } }); + await page.goto(`file://${tmpFile}`); + await page.waitForTimeout(2000); // пауза 1 секунда для провантаження карти + await page.screenshot({ path: SCREENSHOT_FILE }); await browser.close(); - return name(); + await sharp(SCREENSHOT_FILE) + .webp() + .toFile(OUTPUT_FILE); + + console.log(`Зображеня збережене: ${name}.png`); + // return fs.existsSync(OUTPUT_FILE); } -async function saveCards({ center, type, wayId, zoom, number, address }) { - let name = await genCards({ center, type, wayId, zoom, number, address }); - - if (!fs.existsSync(path.join(DIR, type))) { - fs.mkdirSync(path.join(DIR, type), { recursive: true }); - } - - try { - const metadata = await sharp(path.join(DIR, 'cache', name)).metadata(); - const width = metadata.width; - const height = metadata.height; - - if (width > 20 && height > 140) { - const outputPath = path.join(DIR, type, name.replace(path.extname(name), '.webp')); - - await sharp(path.join(DIR, 'cache', name)) - .extract({ - left: 0, - top: 0, - width: width, - height: height - 140 - }) - .webp() - .toFile(outputPath); - - return fs.existsSync(outputPath); - } else { - console.error('Изображение слишком маленькое для обрезки!'); - return false; - } - } catch (err) { - console.error('Ошибка при обработке изображения:', err); - return false; - } -} - -module.exports = saveCards; \ No newline at end of file +module.exports = genCards; \ No newline at end of file diff --git a/api/package-lock.json b/api/package-lock.json index ae6fddf..e645e77 100644 --- a/api/package-lock.json +++ b/api/package-lock.json @@ -1,12 +1,12 @@ { "name": "API Sheep Service", - "version": "2.0.1", + "version": "2.0.5", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "API Sheep Service", - "version": "2.0.1", + "version": "2.0.5", "license": "ISC", "dependencies": { "cors": "^2.8.5", @@ -14,7 +14,7 @@ "exceljs": "^4.4.0", "express": "^4.21.0", "node-telegram-bot-api": "^0.66.0", - "pg": "^8.16.3", + "playwright": "^1.56.1", "puppeteer": "^24.4.0", "sharp": "^0.33.5", "sqlite3": "^5.1.7", @@ -2362,6 +2362,19 @@ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" }, + "node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, "node_modules/fstream": { "version": "1.0.12", "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.12.tgz", @@ -4252,92 +4265,39 @@ "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==" }, - "node_modules/pg": { - "version": "8.16.3", - "resolved": "https://registry.npmjs.org/pg/-/pg-8.16.3.tgz", - "integrity": "sha512-enxc1h0jA/aq5oSDMvqyW3q89ra6XIIDZgCX9vkMrnz5DFTw/Ny3Li2lFQ+pt3L6MCgm/5o2o8HW9hiJji+xvw==", - "dependencies": { - "pg-connection-string": "^2.9.1", - "pg-pool": "^3.10.1", - "pg-protocol": "^1.10.3", - "pg-types": "2.2.0", - "pgpass": "1.0.5" - }, - "engines": { - "node": ">= 16.0.0" - }, - "optionalDependencies": { - "pg-cloudflare": "^1.2.7" - }, - "peerDependencies": { - "pg-native": ">=3.0.1" - }, - "peerDependenciesMeta": { - "pg-native": { - "optional": true - } - } - }, - "node_modules/pg-cloudflare": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/pg-cloudflare/-/pg-cloudflare-1.2.7.tgz", - "integrity": "sha512-YgCtzMH0ptvZJslLM1ffsY4EuGaU0cx4XSdXLRFae8bPP4dS5xL1tNB3k2o/N64cHJpwU7dxKli/nZ2lUa5fLg==", - "optional": true - }, - "node_modules/pg-connection-string": { - "version": "2.9.1", - "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.9.1.tgz", - "integrity": "sha512-nkc6NpDcvPVpZXxrreI/FOtX3XemeLl8E0qFr6F2Lrm/I8WOnaWNhIPK2Z7OHpw7gh5XJThi6j6ppgNoaT1w4w==" - }, - "node_modules/pg-int8": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/pg-int8/-/pg-int8-1.0.1.tgz", - "integrity": "sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==", - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/pg-pool": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/pg-pool/-/pg-pool-3.10.1.tgz", - "integrity": "sha512-Tu8jMlcX+9d8+QVzKIvM/uJtp07PKr82IUOYEphaWcoBhIYkoHpLXN3qO59nAI11ripznDsEzEv8nUxBVWajGg==", - "peerDependencies": { - "pg": ">=8.0" - } - }, - "node_modules/pg-protocol": { - "version": "1.10.3", - "resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.10.3.tgz", - "integrity": "sha512-6DIBgBQaTKDJyxnXaLiLR8wBpQQcGWuAESkRBX/t6OwA8YsqP+iVSiond2EDy6Y/dsGk8rh/jtax3js5NeV7JQ==" - }, - "node_modules/pg-types": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/pg-types/-/pg-types-2.2.0.tgz", - "integrity": "sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==", - "dependencies": { - "pg-int8": "1.0.1", - "postgres-array": "~2.0.0", - "postgres-bytea": "~1.0.0", - "postgres-date": "~1.0.4", - "postgres-interval": "^1.1.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/pgpass": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/pgpass/-/pgpass-1.0.5.tgz", - "integrity": "sha512-FdW9r/jQZhSeohs1Z3sI1yxFQNFvMcnmfuj4WBMUTxOrAyLMaTcE1aAMBiTlbMNaXvBCQuVi0R7hd8udDSP7ug==", - "dependencies": { - "split2": "^4.1.0" - } - }, "node_modules/picocolors": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==" }, + "node_modules/playwright": { + "version": "1.56.1", + "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.56.1.tgz", + "integrity": "sha512-aFi5B0WovBHTEvpM3DzXTUaeN6eN0qWnTkKx4NQaH4Wvcmc153PdaY2UBdSYKaGYw+UyWXSVyxDUg5DoPEttjw==", + "dependencies": { + "playwright-core": "1.56.1" + }, + "bin": { + "playwright": "cli.js" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "fsevents": "2.3.2" + } + }, + "node_modules/playwright-core": { + "version": "1.56.1", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.56.1.tgz", + "integrity": "sha512-hutraynyn31F+Bifme+Ps9Vq59hKuUCz7H1kDOcBs+2oGguKkWTU50bBWrtz34OUWmIwpBTWDxaRPXrIXkgvmQ==", + "bin": { + "playwright-core": "cli.js" + }, + "engines": { + "node": ">=18" + } + }, "node_modules/possible-typed-array-names": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", @@ -4346,41 +4306,6 @@ "node": ">= 0.4" } }, - "node_modules/postgres-array": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/postgres-array/-/postgres-array-2.0.0.tgz", - "integrity": "sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==", - "engines": { - "node": ">=4" - } - }, - "node_modules/postgres-bytea": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/postgres-bytea/-/postgres-bytea-1.0.0.tgz", - "integrity": "sha512-xy3pmLuQqRBZBXDULy7KbaitYqLcmxigw14Q5sj8QBVLqEwXfeybIKVWiqAXTlcvdvb0+xkOtDbfQMOf4lST1w==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/postgres-date": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/postgres-date/-/postgres-date-1.0.7.tgz", - "integrity": "sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/postgres-interval": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/postgres-interval/-/postgres-interval-1.2.0.tgz", - "integrity": "sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==", - "dependencies": { - "xtend": "^4.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/prebuild-install": { "version": "7.1.3", "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.3.tgz", @@ -5345,14 +5270,6 @@ "node": ">=0.10.0" } }, - "node_modules/split2": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz", - "integrity": "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==", - "engines": { - "node": ">= 10.x" - } - }, "node_modules/sqlite3": { "version": "5.1.7", "resolved": "https://registry.npmjs.org/sqlite3/-/sqlite3-5.1.7.tgz", @@ -6132,14 +6049,6 @@ "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==" }, - "node_modules/xtend": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", - "engines": { - "node": ">=0.4" - } - }, "node_modules/y18n": { "version": "5.0.8", "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", diff --git a/api/package.json b/api/package.json index f996548..9ae91b0 100644 --- a/api/package.json +++ b/api/package.json @@ -1,6 +1,6 @@ { "name": "API Sheep Service", - "version": "2.0.1", + "version": "2.0.5", "main": "app.js", "scripts": { "start": "node app.js" @@ -14,6 +14,7 @@ "exceljs": "^4.4.0", "express": "^4.21.0", "node-telegram-bot-api": "^0.66.0", + "playwright": "^1.56.1", "puppeteer": "^24.4.0", "sharp": "^0.33.5", "sqlite3": "^5.1.7", diff --git a/api/services/constructor.service.js b/api/services/constructor.service.js index b488112..0346fd3 100644 --- a/api/services/constructor.service.js +++ b/api/services/constructor.service.js @@ -1,204 +1,7 @@ const db = require("../config/db"); -const saveCards = require("../middleware/genCards"); +const genCards = require("../middleware/genCards"); class ConstructorService { - // createPack(data) { - // return new Promise((res, rej) => { - // let sql = ` - // INSERT INTO - // house( - // group_id, - // title, - // number, - // points, - // points_number, - // geo, - // osm_id, - // settlement, - // created_at - // ) - // VALUES - // (?, ?, ?, ?, ?, ?, ?, ?, ?) - // `; - - // db.run(sql, [ - // Number(data.house.group_id), - // data.house.title, - // data.house.number, - // JSON.stringify(data.house.points), - // JSON.stringify(data.house.points_number), - // JSON.stringify(data.house.geo), - // JSON.stringify(data.house.osm_id), - // data.house.settlement, - // Math.floor(Date.now()) - // ], function (err) { - // if (err) { - // console.error(err.message); - // return res(false); - // } else if (this.changes === 0) { - // return res(false); - // } else { - // const houseId = this.lastID; - - // const entranceStmt = db.prepare(` - // INSERT INTO - // entrance( - // house_id, - // entrance_number, - // title, - // points, - // points_number, - // created_at - // ) - // VALUES - // (?, ?, ?, ?, ?, ?)`); - - // const apartmentStmt = db.prepare(` - // INSERT INTO - // apartments( - // entrance_id, - // apartment_number, - // floors_number, - // updated_at - // ) - // VALUES - // (?, ?, ?, ?)`); - - // data.entrance.forEach((e, index) => { - // entranceStmt.run( - // houseId, - // Number(e.entrance_number), - // e.title, - // JSON.stringify(e.points), - // JSON.stringify(e.points_number), - // Math.floor(Date.now()), - // function (err) { - // if (err) { - // console.error(err.message); - // return; - // } - // const entranceId = this.lastID; - - // if (data.apartments[e.editor_id]) { - // data.apartments[e.editor_id].forEach(apartment => { - // apartmentStmt.run( - // entranceId, - // apartment.apartment_number, - // apartment.floors_number, - // Math.floor(Date.now()) - // ); - // }); - // } - // } - // ); - // }); - - // entranceStmt.finalize(); - // apartmentStmt.finalize(); - - // // res({ "status": "ok", "id": houseId }); - // } - // }); - // }); - // } - - // createPack(data) { - // return new Promise((res, rej) => { - - // if (data.type == "house") { - // const sql = ` - // INSERT INTO house ( - // title, number, points, points_number, geo, osm_id, settlement, created_at - // ) VALUES (?, ?, ?, ?, ?, ?, ?, ?)`; - - // db.run(sql, [ - // data.title, - // data.number, - // JSON.stringify(data.points), - // JSON.stringify(data.points_number), - // JSON.stringify(data.geo), - // JSON.stringify(data.osm_id), - // data.settlement, - // Math.floor(Date.now()) - // ], function (err) { - // if (err) { - // console.error(err.message); - // return res(false); - // } - // if (this.changes === 0) { - // return res(false); - // } - - // const houseId = this.lastID; - - // saveCards({ center: data.geo, wayId: data.osm_id, zoom: data.zoom ?? 18, type: "house", number: houseId, address: `${data.title} ${data.number}` }); - - - // const entranceStmt = db.prepare(` - // INSERT INTO entrance ( - // house_id, entrance_number, title, points, points_number, created_at - // ) VALUES (?, ?, ?, ?, ?, ?)`); - - // const apartmentStmt = db.prepare(` - // INSERT INTO apartments ( - // entrance_id, apartment_number, title, floors_number - // ) VALUES (?, ?, ?, ?)`); - - // const entranceIdMap = {}; // Для сопоставления editor_id → entrance_id - - // let pendingEntrances = data.entrance.length; - - // data.entrance.forEach((e) => { - // entranceStmt.run( - // houseId, - // Number(e.entrance_number), - // e.title, - // JSON.stringify(e.points), - // JSON.stringify(e.points_number), - // Math.floor(Date.now()), - // function (err) { - // if (err) { - // console.error(err.message); - // return; - // } - // const entranceId = this.lastID; - // entranceIdMap[e.editor_id] = entranceId; - - // if (--pendingEntrances === 0) { - // insertApartments(); - // } - // } - // ); - // }); - - // function insertApartments() { - // for (const [editor_id, apartments] of Object.entries(data.apartments)) { - // const entranceId = entranceIdMap[editor_id]; - // if (!entranceId) continue; - - // apartments.forEach(apartment => { - // apartmentStmt.run( - // entranceId, - // Number(apartment.apartment_number), - // apartment.title, - // apartment.floors_number - // ); - // }); - // } - - // entranceStmt.finalize(); - // apartmentStmt.finalize(); - // res({ "status": "ok", "id": houseId }); - // } - // }); - // } else if (data.type == "homestead") { - // return res(false); - // } else { - // return res(false); - // } - // }); - // } - createPack(data) { return new Promise((res, rej) => { @@ -228,8 +31,6 @@ class ConstructorService { const houseId = this.lastID; - // saveCards({ center: data.geo, wayId: data.osm_id, zoom: data.zoom ?? 18, type: "house", number: houseId, address: `${data.title} ${data.number}` }); - const entranceStmt = db.prepare(` INSERT INTO entrance ( house_id, entrance_number, title, created_at @@ -287,6 +88,8 @@ class ConstructorService { ); }); + genCards({type: "house", id: houseId}); + function finalize() { entranceStmt.finalize(); apartmentStmt.finalize(); @@ -321,8 +124,6 @@ class ConstructorService { const homesteadId = this.lastID; - // saveCards({ center: data.geo, wayId: data.osm_id, zoom: data.zoom ?? 17, type: "homestead", number: homesteadId, address: `${data.title} ${data.number}` }); - const buildingStmt = db.prepare(` INSERT INTO buildings ( homestead_id, title, geo @@ -351,6 +152,8 @@ class ConstructorService { ); }); + genCards({type: "homestead", id: homesteadId}); + function finalize() { buildingStmt.finalize(); res({ status: "ok", id: homesteadId }); diff --git a/api/services/stand.service.js b/api/services/stand.service.js index 9c57190..8ce973c 100644 --- a/api/services/stand.service.js +++ b/api/services/stand.service.js @@ -272,11 +272,11 @@ class StandService { console.error(err.message); return res(false); } - // Notification.sendStand({ - // title: "Додан новий день служіння", - // body: `Стенд «${stand.title}» поповнився, встигніть записатися.`, - // page: `/stand/card/${stand.id}` - // }); + Notification.sendStand({ + title: "Додан новий день служіння", + body: `Стенд «${stand.title}» поповнився, встигніть записатися.`, + page: `/stand/card/${stand.id}` + }); res({ status: "ok", inserted: list.length }); }); diff --git a/data/meetings_schedule.json b/data/meetings_schedule.json new file mode 100644 index 0000000..7c9bd25 --- /dev/null +++ b/data/meetings_schedule.json @@ -0,0 +1,11 @@ +[ + { + "id": 1, + "date": 100000001, + "type": 0, + "number": "", + "sheep_1": "", + "sheep_2": "", + "title": "" + } +] \ No newline at end of file diff --git a/docker-compose.yml b/docker-compose.yml index 3a9a534..72e894d 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -30,6 +30,8 @@ services: - VAPID_PUBLIC_KEY=${VAPID_PUBLIC_KEY} - VAPID_PRIVATE_KEY=${VAPID_PRIVATE_KEY} - DOMAIN=${DOMAIN} + - ADMIN_TOKEN=${ADMIN_TOKEN} + shm_size: '1gb' networks: - network diff --git a/web/config.js b/web/config.js index 75fd64e..3286ac1 100644 --- a/web/config.js +++ b/web/config.js @@ -1,4 +1,5 @@ const CONFIG = { + "web": "https://test.sheep-service.com/", "api": "https://test.sheep-service.com/api/", "wss": "wss://test.sheep-service.com/ws" } \ No newline at end of file diff --git a/web/css/main.css b/web/css/main.css index 25ff46e..70847c0 100644 --- a/web/css/main.css +++ b/web/css/main.css @@ -6,6 +6,17 @@ --FontSize3: 14px; --FontSize4: 15px; --FontSize5: 16px; + --FontSize6: 22px; + + --C0: #9a77c9; + --C1: #7c7c7c; + --C2: #c5ba59; + --C3: #a14a2e; + --C4: #779953; + --C5: #537299; + --C6: #bb4444; + --C7: #539974; + --C8: #537299; } @media (prefers-color-scheme: light) { @@ -740,7 +751,11 @@ body.modal-open { color: var(--ColorThemes3) !important; } -.leaflet_drop {} +.leaflet_drop { + display: flex; + flex-direction: column; + align-items: center; +} .leaflet_drop>div { background: #C14D4D; @@ -751,6 +766,12 @@ body.modal-open { margin: -3px 0 0 -3px; } +.leaflet_drop>span { + font-size: var(--FontSize1); + opacity: 0.8; + margin-bottom: 10px; +} + .leaflet-pm-tooltip { display: none !important; } diff --git a/web/img/stand/1.png b/web/img/stand/1.png new file mode 100644 index 0000000..69b26d0 Binary files /dev/null and b/web/img/stand/1.png differ diff --git a/web/img/stand/2.png b/web/img/stand/2.png new file mode 100644 index 0000000..fbaf103 Binary files /dev/null and b/web/img/stand/2.png differ diff --git a/web/img/stand/3.png b/web/img/stand/3.png new file mode 100644 index 0000000..f971814 Binary files /dev/null and b/web/img/stand/3.png differ diff --git a/web/img/stand/4.png b/web/img/stand/4.png new file mode 100644 index 0000000..ca6df62 Binary files /dev/null and b/web/img/stand/4.png differ diff --git a/web/img/stand/5.png b/web/img/stand/5.png new file mode 100644 index 0000000..0d79016 Binary files /dev/null and b/web/img/stand/5.png differ diff --git a/web/img/stand/6.png b/web/img/stand/6.png new file mode 100644 index 0000000..ecadefe Binary files /dev/null and b/web/img/stand/6.png differ diff --git a/web/img/stand/7.png b/web/img/stand/7.png new file mode 100644 index 0000000..b347bc3 Binary files /dev/null and b/web/img/stand/7.png differ diff --git a/web/img/stand/8.png b/web/img/stand/8.png new file mode 100644 index 0000000..de3ef56 Binary files /dev/null and b/web/img/stand/8.png differ diff --git a/web/img/stand_0.png b/web/img/stand/stand_0.png similarity index 100% rename from web/img/stand_0.png rename to web/img/stand/stand_0.png diff --git a/web/img/stand_1.png b/web/img/stand_1.png index 69b26d0..db68d44 100644 Binary files a/web/img/stand_1.png and b/web/img/stand_1.png differ diff --git a/web/img/stand_2.png b/web/img/stand_2.png index fbaf103..cc318ae 100644 Binary files a/web/img/stand_2.png and b/web/img/stand_2.png differ diff --git a/web/img/stand_3.png b/web/img/stand_3.png deleted file mode 100644 index 75e9d27..0000000 Binary files a/web/img/stand_3.png and /dev/null differ diff --git a/web/img/stand_4.png b/web/img/stand_4.png deleted file mode 100644 index cc318ae..0000000 Binary files a/web/img/stand_4.png and /dev/null differ diff --git a/web/img/stand_5.png b/web/img/stand_5.png deleted file mode 100644 index db68d44..0000000 Binary files a/web/img/stand_5.png and /dev/null differ diff --git a/web/index.html b/web/index.html index d5560a1..413f488 100644 --- a/web/index.html +++ b/web/index.html @@ -93,6 +93,9 @@ + + + @@ -111,8 +114,8 @@ - - + + diff --git a/web/lib/pages/home/index.html b/web/lib/pages/home/index.html index 0e456d3..42eb954 100644 --- a/web/lib/pages/home/index.html +++ b/web/lib/pages/home/index.html @@ -1,5 +1,19 @@
-