From fc949f83a8e7564bc7fc0225de43dd5d3bfe7a07 Mon Sep 17 00:00:00 2001 From: moxitech Date: Sat, 5 Oct 2024 01:59:08 +0700 Subject: [PATCH] Main GUI screen and service for server-side logic --- .env | 1 + src/frontend/public/blueprints.jpg | Bin 0 -> 58217 bytes src/frontend/src/App.js | 4 +- src/frontend/src/Main.css | 9 ++ src/frontend/src/Sidebar.js | 5 +- src/frontend/src/pages/DeviceGroups.js | 6 +- src/frontend/src/pages/Devices.js | 94 ++---------------- src/frontend/src/pages/Main.js | 35 +++++++ src/frontend/src/pages/PrevCalc.js | 94 ++++-------------- src/frontend/src/pages/UserAccount.js | 6 +- .../pages/components/DroneAssets/InfoBlock.js | 35 +++++++ src/frontend/src/pages/service/Local.js | 10 ++ src/frontend/src/pages/service/Server.js | 40 ++++++++ .../src/pages/service/SimulationRequests.js | 21 ++++ src/server/internal/server/server.go | 2 +- 15 files changed, 194 insertions(+), 168 deletions(-) create mode 100644 src/frontend/public/blueprints.jpg create mode 100644 src/frontend/src/Main.css create mode 100644 src/frontend/src/pages/Main.js create mode 100644 src/frontend/src/pages/components/DroneAssets/InfoBlock.js create mode 100644 src/frontend/src/pages/service/Local.js create mode 100644 src/frontend/src/pages/service/Server.js create mode 100644 src/frontend/src/pages/service/SimulationRequests.js diff --git a/.env b/.env index ae83aa7..025c56b 100644 --- a/.env +++ b/.env @@ -1,5 +1,6 @@ SERVER_BASE_ADDRESS=0.0.0.0:8080 + MONGO_INITDB_ROOT_USERNAME=moxitech MONGO_INITDB_ROOT_PASSWORD=moxitech MONGO_INITDB_DATABASE=drone-network-simulator diff --git a/src/frontend/public/blueprints.jpg b/src/frontend/public/blueprints.jpg new file mode 100644 index 0000000000000000000000000000000000000000..0650fe766fedb56dff226a1f2fa00532492751be GIT binary patch literal 58217 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 YR=nwo-lPmk3Y$7YB~dQxoB#hN0A^J8j{pDw literal 0 HcmV?d00001 diff --git a/src/frontend/src/App.js b/src/frontend/src/App.js index 0182a18..9f5e9e5 100644 --- a/src/frontend/src/App.js +++ b/src/frontend/src/App.js @@ -3,6 +3,7 @@ import DeviceGroups from "./pages/DeviceGroups"; import Devices from "./pages/Devices"; import Sidebar from "./Sidebar"; import Dashboard from './pages/Dashboard'; +import Main from './pages/Main'; import UserAccount from './pages/UserAccount'; // Импортируем компонент UserAccount import Login from './pages/Login'; // Импортируем страницу логина import Connections from './pages/Connections'; // Импортируем страницу подключений @@ -13,7 +14,7 @@ import { BrowserRouter as Router, Routes, Route, Navigate } from 'react-router-d const App = () => { const [isLoggedIn, setIsLoggedIn] = useState(false); // Статус авторизации - const [activeTab, setActiveTab] = useState('map'); // По умолчанию активная вкладка "Карта" + const [activeTab, setActiveTab] = useState('main'); // По умолчанию активная вкладка "Карта" // Функция для выхода из системы const handleLogout = () => { @@ -42,6 +43,7 @@ const App = () => { onLogout={handleLogout} // Передаем функцию handleLogout через пропс onLogout />

+ {activeTab === 'main' &&
} {/* Подключаем компонент Dashboard */} {activeTab === 'map' && } {/* Подключаем компонент Dashboard */} {activeTab === 'connection' && } {/* Страница подключений */} {activeTab === 'account' && } {/* Подключаем компонент UserAccount */} diff --git a/src/frontend/src/Main.css b/src/frontend/src/Main.css new file mode 100644 index 0000000..1450f31 --- /dev/null +++ b/src/frontend/src/Main.css @@ -0,0 +1,9 @@ + +.main__imager { + height: 100%; + background-image: url('../public/blueprints.jpg'); +} + +.main__t_b { + color: black; +} \ No newline at end of file diff --git a/src/frontend/src/Sidebar.js b/src/frontend/src/Sidebar.js index 57abdbe..1fa7de4 100644 --- a/src/frontend/src/Sidebar.js +++ b/src/frontend/src/Sidebar.js @@ -16,9 +16,12 @@ const Sidebar = ({ onSelectTab, activeTab, onLogout }) => {

Меню

    -
  • onSelectTab('map')}> +
  • onSelectTab('main')}> Главная
  • +
  • onSelectTab('map')}> + Сессия 1 +
  • onSelectTab('connection')}> Настройки
  • diff --git a/src/frontend/src/pages/DeviceGroups.js b/src/frontend/src/pages/DeviceGroups.js index 2bc3609..2eb30d4 100644 --- a/src/frontend/src/pages/DeviceGroups.js +++ b/src/frontend/src/pages/DeviceGroups.js @@ -41,16 +41,16 @@ const DeviceGroups = () => { return (
    -

    Группы устройств

    +

    Шаблоны / СШК

    setNewGroupName(e.target.value)} - placeholder="Название новой группы" + placeholder="Название шаблона" /> - +
      diff --git a/src/frontend/src/pages/Devices.js b/src/frontend/src/pages/Devices.js index adb5992..3a03656 100644 --- a/src/frontend/src/pages/Devices.js +++ b/src/frontend/src/pages/Devices.js @@ -3,91 +3,19 @@ import { QRCodeCanvas } from "qrcode.react"; import '../Devices.css'; const Devices = () => { - const [devices, setDevices] = useState([]); - const [selectedDevice, setSelectedDevice] = useState(null); - const [deviceName, setDeviceName] = useState(''); - const [deviceStatus, setDeviceStatus] = useState(''); - - const addDevice = () => { - if (deviceName) { - const newDevice = { name: deviceName, status: deviceStatus || 'Неактивен', id: Date.now() }; - setDevices([...devices, newDevice]); - setDeviceName(''); - setDeviceStatus(''); - } - }; - - const removeDevice = () => { - if (selectedDevice) { - setDevices(devices.filter(device => device.id !== selectedDevice.id)); - setSelectedDevice(null); - } - }; - - const editDevice = () => { - if (selectedDevice) { - const updatedDevices = devices.map(device => - device.id === selectedDevice.id - ? { ...device, name: deviceName, status: deviceStatus } - : device - ); - setDevices(updatedDevices); - setSelectedDevice(null); - setDeviceName(''); - setDeviceStatus(''); - } - }; - - const generateQR = (device) => { - return ( - - ); - }; - return ( -
      -

      Устройства

      - setDeviceName(e.target.value)} - /> - setDeviceStatus(e.target.value)} - /> - - - - - - - - - - - {devices.map((device) => ( - setSelectedDevice(device)}> - - - - - - ))} - -
      НазваниеСтатусQR КодДействия
      {device.name}{device.status}{generateQR(device)} - -
      -
      - - - -
      +
      + +
      + +
      + +
      + + +
      - ); + ) }; export default Devices; \ No newline at end of file diff --git a/src/frontend/src/pages/Main.js b/src/frontend/src/pages/Main.js new file mode 100644 index 0000000..7c7f9bf --- /dev/null +++ b/src/frontend/src/pages/Main.js @@ -0,0 +1,35 @@ +import React from 'react'; +import '../Main.css'; +import { InfoBlock } from './components/DroneAssets/InfoBlock'; + +const Main = () => { + + const makeSimulation = () => { + // POST $BASE_ADDR/createSimulation?userToken=? + } + + const connectSimulation = () => { + // POST $BASE_ADDR/connectSimulation?userToken=? + } + + return ( +
      + +
      +
      +

      Создать новую симуляцию

      + +
      +
      +

      Присоединиться к моделированию

      +
      +

      Расчет полета до камчатки

      + +
      +
      +
      +
      + ) +}; + +export default Main; diff --git a/src/frontend/src/pages/PrevCalc.js b/src/frontend/src/pages/PrevCalc.js index 6805ee6..d4c839e 100644 --- a/src/frontend/src/pages/PrevCalc.js +++ b/src/frontend/src/pages/PrevCalc.js @@ -2,83 +2,25 @@ import React, { useState } from 'react'; import '../UserAccount.scss'; const PrevCalc = () => { - const [userData, setUserData] = useState({ - username: 'Мамут Рахал', - email: 'yatupoidayn@mail.ru', - phone: '+666', - }); - - const [isEditing, setIsEditing] = useState(false); - const [formData, setFormData] = useState(userData); - - const handleChange = (e) => { - const { name, value } = e.target; - setFormData((prevData) => ({ - ...prevData, - [name]: value, - })); - }; - - const handleSave = () => { - setUserData(formData); - setIsEditing(false); - }; - - const handleCancel = () => { - setFormData(userData); - setIsEditing(false); - }; - + return ( -
      -

      Данные

      - - {isEditing ? ( -
      - - - -
      - - -
      -
      - ) : ( -
      -

      Имя: {userData.username}

      -

      Email: {userData.email}

      -

      Телефон: {userData.phone}

      - -
      - )} -
      - ); + + + + + + + + + + + + + + + +
      UIDИмяПользовательВремя началаВремя конца
      1Калькуляция полета до варшавыГитлер1:004:04
      + ) }; export default PrevCalc; \ No newline at end of file diff --git a/src/frontend/src/pages/UserAccount.js b/src/frontend/src/pages/UserAccount.js index 1b24d19..45f6ac7 100644 --- a/src/frontend/src/pages/UserAccount.js +++ b/src/frontend/src/pages/UserAccount.js @@ -3,8 +3,8 @@ import '../UserAccount.scss'; const UserAccount = () => { const [userData, setUserData] = useState({ - username: 'Мамут Рахал', - email: 'yatupoidayn@mail.ru', + username: 'Никита Николаевич', + email: 'moxitech@moxitech.com', phone: '+666', }); @@ -30,7 +30,7 @@ const UserAccount = () => { }; return ( -
      +

      Данные

      {isEditing ? ( diff --git a/src/frontend/src/pages/components/DroneAssets/InfoBlock.js b/src/frontend/src/pages/components/DroneAssets/InfoBlock.js new file mode 100644 index 0000000..bc18b2a --- /dev/null +++ b/src/frontend/src/pages/components/DroneAssets/InfoBlock.js @@ -0,0 +1,35 @@ + +import React from "react" + +export const InfoBlock = () => { + return( + + + + ) +} \ No newline at end of file diff --git a/src/frontend/src/pages/service/Local.js b/src/frontend/src/pages/service/Local.js new file mode 100644 index 0000000..68d1eea --- /dev/null +++ b/src/frontend/src/pages/service/Local.js @@ -0,0 +1,10 @@ + + + +export const LocalSimulationJson = () => { + + + return { + "TODO": "JSON RETURN" + } +} \ No newline at end of file diff --git a/src/frontend/src/pages/service/Server.js b/src/frontend/src/pages/service/Server.js new file mode 100644 index 0000000..cd1c0e0 --- /dev/null +++ b/src/frontend/src/pages/service/Server.js @@ -0,0 +1,40 @@ + + + +export const giveMeServerAddress = () => { + if (process.env.SERVER_BASE_ADDRESS) { + return process.env.SERVER_BASE_ADDRESS + } + return "http://localhost:3000"; +} + +export const ServerRequest = async (req, type, data = null) => { + let addr = giveMeServerAddress(); // получаем адрес сервера + let options = { + method: type, // тип запроса (GET, POST, PUT, DELETE и т.д.) + headers: { + 'Content-Type': 'application/json', // заголовки для JSON данных + } + }; + + // Если данные есть и метод не GET, добавляем тело запроса + if (data && type !== 'GET') { + options.body = JSON.stringify(data); + } + + try { + const response = await fetch(`${addr}/${req}`, options); // выполняем запрос + const responseData = await response.json(); // парсим JSON ответ + + return { + data: responseData, // данные от сервера + status: response.status // код состояния ответа + }; + } catch (error) { + console.error('Error:', error); + return { + data: null, // если ошибка, данных нет + status: 500 // возвращаем код ошибки сервера + }; + } +}; diff --git a/src/frontend/src/pages/service/SimulationRequests.js b/src/frontend/src/pages/service/SimulationRequests.js new file mode 100644 index 0000000..f5e5898 --- /dev/null +++ b/src/frontend/src/pages/service/SimulationRequests.js @@ -0,0 +1,21 @@ + +import {ServerRequest} from './Server' + +export const RequestSaveOnServer = () => { + // Запрос на сохранение результатов на сервере +} + + +export const RequestRunCalculations = () => { + // Запрос на сохранение результатов на запуск вычислений +} + +export const RequestGetClientSettings = () => { + // Запрос на получение клиентских настроек + +} + +export const RequestUpdateClientSettings = () => { + // Запрос на обновление клиентских настроек + +} \ No newline at end of file diff --git a/src/server/internal/server/server.go b/src/server/internal/server/server.go index e8082f9..b7bb70e 100644 --- a/src/server/internal/server/server.go +++ b/src/server/internal/server/server.go @@ -57,7 +57,7 @@ func CreateSocket(c *websocket.Conn) { fmt.Printf("Received message from user %s: %s\n", userToken, msg) // Отправляем обратно сообщение клиенту - err = c.WriteMessage(websocket.BinaryMessage, msg) + err = c.WriteMessage(websocket.TextMessage, msg) if err != nil { fmt.Printf("Error writing message: %v\n", err) break