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 0000000..0650fe7 Binary files /dev/null and b/src/frontend/public/blueprints.jpg differ 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