From 569d10a4ba7d7de34d0df4be824666930a948e58 Mon Sep 17 00:00:00 2001 From: anibilag Date: Sat, 12 Jul 2025 23:16:22 +0300 Subject: [PATCH] =?UTF-8?q?=D0=92=D0=B5=D1=80=D1=81=D0=B8=D1=8F=200.3.1=20?= =?UTF-8?q?=D0=9F=D1=80=D0=B0=D0=B2=D0=BA=D0=B8=20=D0=B4=D0=BB=D1=8F=20?= =?UTF-8?q?=D1=80=D0=B0=D0=B1=D0=BE=D1=82=D1=8B=20=D0=B2=20Docker.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- db/lawn_scheduler.db | Bin 20480 -> 20480 bytes docker-compose.dev.yml | 2 +- docker-compose.yml | 2 +- package.json | 2 +- scripts/start-dev.sh | 10 +++++----- scripts/start-prod.sh | 10 +++++----- server/index.js | 6 +++++- src/components/Dashboard.tsx | 2 +- src/services/api.ts | 28 ++++++++++++++-------------- 9 files changed, 33 insertions(+), 29 deletions(-) diff --git a/db/lawn_scheduler.db b/db/lawn_scheduler.db index f5befce0de3742e7dad6f1b56d32b4ef519121c7..81eae8f059061c399a02b5f3f24a7d0a987895d2 100644 GIT binary patch delta 103 zcmZozz}T>Wae_3X_e2?IM(>RYEBKjsH*Dq-n93`Y#2_TgV9Us8Y%6Wae_3X*F+g-Mz4(tEBKlCk~VV*Oy!NZz>p}*V9Us8Y%6ss(U}b7xWn`ddYHSw8CyJ0!fXEmaz=RCVQ58@AE}PAg!^Xw1IZbYs FApnQNBMJZj diff --git a/docker-compose.dev.yml b/docker-compose.dev.yml index c0f58f6..494a414 100644 --- a/docker-compose.dev.yml +++ b/docker-compose.dev.yml @@ -14,7 +14,7 @@ services: - .:/app - /app/node_modules - ./uploads:/app/uploads - - ./db:/app/db + - ./db:/app/db:rw environment: - NODE_ENV=development - CHOKIDAR_USEPOLLING=true diff --git a/docker-compose.yml b/docker-compose.yml index 9625add..c5d206b 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -9,7 +9,7 @@ services: restart: unless-stopped volumes: - ./uploads:/app/uploads - - ./lawn_scheduler.db:/app/lawn_scheduler.db + - ./lawn_scheduler.db:/app/db/lawn_scheduler.db environment: - NODE_ENV=production networks: diff --git a/package.json b/package.json index f7fe8f1..d276c07 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "lawn-mowing-scheduler", "private": true, - "version": "0.3.0", + "version": "0.3.1", "type": "module", "scripts": { "dev": "concurrently \"npm run server\" \"npm run client\"", diff --git a/scripts/start-dev.sh b/scripts/start-dev.sh index d22aad8..f93c5af 100644 --- a/scripts/start-dev.sh +++ b/scripts/start-dev.sh @@ -6,13 +6,13 @@ echo "Starting Lawn Scheduler in Development Mode..." mkdir -p uploads # Build and start services -docker-compose -f docker-compose.dev.yml down -docker-compose -f docker-compose.dev.yml build --no-cache -docker-compose -f docker-compose.dev.yml up -d +docker compose -f docker-compose.dev.yml down +docker compose -f docker-compose.dev.yml build --no-cache +docker compose -f docker-compose.dev.yml up -d echo "Development environment started!" echo "Frontend (Vite): http://localhost:8080" echo "Backend API: http://localhost:3001" echo "" -echo "To view logs: docker-compose -f docker-compose.dev.yml logs -f" -echo "To stop: docker-compose -f docker-compose.dev.yml down" \ No newline at end of file +echo "To view logs: docker compose -f docker-compose.dev.yml logs -f" +echo "To stop: docker compose -f docker-compose.dev.yml down" \ No newline at end of file diff --git a/scripts/start-prod.sh b/scripts/start-prod.sh index 52d5a46..ff0f190 100644 --- a/scripts/start-prod.sh +++ b/scripts/start-prod.sh @@ -7,12 +7,12 @@ mkdir -p nginx/conf.d mkdir -p uploads # Build and start services -docker-compose down -docker-compose build --no-cache -docker-compose up -d +docker compose down +docker compose build --no-cache +docker compose up -d echo "Application started!" echo "Access the application at: http://localhost" echo "" -echo "To view logs: docker-compose logs -f" -echo "To stop: docker-compose down" \ No newline at end of file +echo "To view logs: docker compose logs -f" +echo "To stop: docker compose down" \ No newline at end of file diff --git a/server/index.js b/server/index.js index c9ea70a..d68b4a0 100644 --- a/server/index.js +++ b/server/index.js @@ -641,7 +641,11 @@ app.put('/api/zones/:id', upload.single('image'), async (req, res) => { sql = 'UPDATE zones SET name = ?, imagePath = ?, lastMowedDate = ?, intervalDays = ?, scheduleType = ?, nextMowDate = NULL, area = ? WHERE id = ?'; args = [name, imagePath, lastMowedDate || null, parseInt(intervalDays), scheduleType || 'interval', parseFloat(area) || 0, req.params.id]; } - + + console.log('Updating zone with data:', { name, intervalDays, lastMowedDate, nextMowDate, scheduleType, area }); + console.log('SQL:', sql); + console.log('ARGS:', args); + await db.execute({ sql, args }); // Delete old image if new one was provided diff --git a/src/components/Dashboard.tsx b/src/components/Dashboard.tsx index d31f141..9fa8148 100644 --- a/src/components/Dashboard.tsx +++ b/src/components/Dashboard.tsx @@ -290,7 +290,7 @@ const Dashboard: React.FC = () => {

Актуально

{okCount}

-

обслужено зон

+

зон обслужено

diff --git a/src/services/api.ts b/src/services/api.ts index 4424130..831ab01 100644 --- a/src/services/api.ts +++ b/src/services/api.ts @@ -1,17 +1,17 @@ import { Zone, ZoneFormData, MowingHistoryResponse, MowingStats, MowingFormData, Mower, MowerFormData, BulkMowingFormData } from '../types/zone'; -const API_BASE = new URL('api', import.meta.env.VITE_API_URL).toString(); +const API_BASE = import.meta.env.VITE_API_URL; export const api = { async getZones(): Promise { - const response = await fetch(`${API_BASE}/zones`); - console.log(`${API_BASE}/zones`); + const response = await fetch(`${API_BASE}/api/zones`); + console.log(`${API_BASE}/api/zones`); if (!response.ok) throw new Error('Failed to fetch zones'); return response.json(); }, async getZone(id: number): Promise { - const response = await fetch(`${API_BASE}/zones/${id}`); + const response = await fetch(`${API_BASE}/api/zones/${id}`); if (!response.ok) throw new Error('Failed to fetch zone'); return response.json(); }, @@ -32,7 +32,7 @@ export const api = { formData.append('image', data.image); } - const response = await fetch(`${API_BASE}/zones`, { + const response = await fetch(`${API_BASE}/api/zones`, { method: 'POST', body: formData, }); @@ -60,7 +60,7 @@ export const api = { formData.append('image', data.image); } - const response = await fetch(`${API_BASE}/zones/${id}`, { + const response = await fetch(`${API_BASE}/api/zones/${id}`, { method: 'PUT', body: formData, }); @@ -70,14 +70,14 @@ export const api = { }, async deleteZone(id: number): Promise { - const response = await fetch(`${API_BASE}/zones/${id}`, { + const response = await fetch(`${API_BASE}/api/zones/${id}`, { method: 'DELETE', }); if (!response.ok) throw new Error('Failed to delete zone'); }, async markAsMowed(id: number, data?: MowingFormData): Promise { - const response = await fetch(`${API_BASE}/zones/${id}/mow`, { + const response = await fetch(`${API_BASE}/api/zones/${id}/mow`, { method: 'POST', headers: { 'Content-Type': 'application/json', @@ -89,7 +89,7 @@ export const api = { }, async markAsTrimmed(id: number, data?: MowingFormData): Promise { - const response = await fetch(`${API_BASE}/zones/${id}/trim`, { + const response = await fetch(`${API_BASE}/api/zones/${id}/trim`, { method: 'POST', headers: { 'Content-Type': 'application/json', @@ -99,7 +99,7 @@ export const api = { if (!response.ok) throw new Error('Failed to mark as trimmed'); }, async bulkMarkAsMowed(data: BulkMowingFormData): Promise { - const response = await fetch(`${API_BASE}/zones/bulk-mow`, { + const response = await fetch(`${API_BASE}/api/zones/bulk-mow`, { method: 'POST', headers: { 'Content-Type': 'application/json', @@ -118,25 +118,25 @@ export const api = { params.append('zoneId', zoneId.toString()); } - const response = await fetch(`${API_BASE}/history?${params}`); + const response = await fetch(`${API_BASE}/api/history?${params}`); if (!response.ok) throw new Error('Failed to fetch mowing history'); return response.json(); }, async getMowingStats(period = 30): Promise { - const response = await fetch(`${API_BASE}/history/stats?period=${period}`); + const response = await fetch(`${API_BASE}/api/history/stats?period=${period}`); if (!response.ok) throw new Error('Failed to fetch mowing statistics'); return response.json(); }, async getMowers(): Promise { - const response = await fetch(`${API_BASE}/mowers`); + const response = await fetch(`${API_BASE}/api/mowers`); if (!response.ok) throw new Error('Failed to fetch mowers'); return response.json(); }, async createMower(data: MowerFormData): Promise { - const response = await fetch(`${API_BASE}/mowers`, { + const response = await fetch(`${API_BASE}/api/mowers`, { method: 'POST', headers: { 'Content-Type': 'application/json',