feat(api): Add Time Period Configuration

This commit is contained in:
web@ppanel 2024-12-29 22:10:43 +07:00
parent fec80f592d
commit 837157cc42
30 changed files with 466 additions and 80 deletions

View File

@ -1,13 +1,20 @@
'use client';
import { getNodeConfig, updateNodeConfig } from '@/services/admin/system';
import { Icon } from '@iconify/react';
import {
getNodeConfig,
getNodeMultiplier,
setNodeMultiplier,
updateNodeConfig,
} from '@/services/admin/system';
import { useQuery } from '@tanstack/react-query';
import { Button } from '@workspace/ui/components/button';
import { Label } from '@workspace/ui/components/label';
import { Table, TableBody, TableCell, TableRow } from '@workspace/ui/components/table';
import { EnhancedInput } from '@workspace/ui/custom-components/enhanced-input';
import { DicesIcon } from 'lucide-react';
import { nanoid } from 'nanoid';
import { useTranslations } from 'next-intl';
import { useState } from 'react';
import { toast } from 'sonner';
export default function Node() {
@ -36,62 +43,175 @@ export default function Node() {
}
}
const [timeSlots, setTimeSlots] = useState<API.TimePeriod[]>([]);
const { data: NodeMultiplier, refetch: refetchNodeMultiplier } = useQuery({
queryKey: ['getNodeMultiplier'],
queryFn: async () => {
const { data } = await getNodeMultiplier();
if (timeSlots.length === 0) {
setTimeSlots(data.data?.periods || []);
}
return data.data?.periods || [];
},
});
const addTimeSlot = () => {
setTimeSlots([...timeSlots, { start_time: '', end_time: '', multiplier: 1 }]);
};
const removeTimeSlot = (index: number) => {
setTimeSlots(timeSlots.filter((_, i) => i !== index));
};
const updateTimeSlot = (index: number, field: keyof API.TimePeriod, value: string | number) => {
const updatedSlots = timeSlots.map((slot, i) => {
if (i === index) {
return { ...slot, [field]: value };
}
return slot;
});
setTimeSlots(updatedSlots);
};
return (
<Table>
<TableBody>
<TableRow>
<TableCell>
<Label>{t('communicationKey')}</Label>
<p className='text-muted-foreground text-xs'>{t('communicationKeyDescription')}</p>
</TableCell>
<TableCell className='text-right'>
<EnhancedInput
placeholder={t('inputPlaceholder')}
value={data?.node_secret}
onValueBlur={(value) => updateConfig('node_secret', value)}
suffix={
<Icon
icon='uil:arrow-random'
onClick={() => {
updateConfig('node_secret', nanoid());
}}
<>
<Table>
<TableBody>
<TableRow>
<TableCell>
<Label>{t('communicationKey')}</Label>
<p className='text-muted-foreground text-xs'>{t('communicationKeyDescription')}</p>
</TableCell>
<TableCell className='text-right'>
<EnhancedInput
placeholder={t('inputPlaceholder')}
value={data?.node_secret}
onValueBlur={(value) => updateConfig('node_secret', value)}
suffix={
<DicesIcon
onClick={() => {
updateConfig('node_secret', nanoid());
}}
/>
}
/>
</TableCell>
</TableRow>
<TableRow>
<TableCell>
<Label>{t('nodePullInterval')}</Label>
<p className='text-muted-foreground text-xs'>{t('nodePullIntervalDescription')}</p>
</TableCell>
<TableCell className='text-right'>
<EnhancedInput
type='number'
min={0}
onValueBlur={(value) => updateConfig('node_pull_interval', value)}
suffix='S'
value={data?.node_pull_interval}
placeholder={t('inputPlaceholder')}
/>
</TableCell>
</TableRow>
<TableRow>
<TableCell>
<Label>{t('nodePushInterval')}</Label>
<p className='text-muted-foreground text-xs'>{t('nodePushIntervalDescription')}</p>
</TableCell>
<TableCell className='text-right'>
<EnhancedInput
type='number'
min={0}
value={data?.node_push_interval}
onValueBlur={(value) => updateConfig('node_push_interval', value)}
placeholder={t('inputPlaceholder')}
/>
</TableCell>
</TableRow>
<TableRow>
<TableCell>
<Label>{t('dynamicMultiplier')}</Label>
<p className='text-muted-foreground text-xs'>{t('dynamicMultiplierDescription')}</p>
</TableCell>
<TableCell className='flex justify-end gap-2'>
<Button
size='sm'
variant='outline'
onClick={() => {
setTimeSlots(NodeMultiplier || []);
}}
>
{t('reset')}
</Button>
<Button
size='sm'
onClick={() => {
setNodeMultiplier({
periods: timeSlots,
}).then(async () => {
const result = await refetchNodeMultiplier();
if (result.data) setTimeSlots(result.data);
toast.success(t('saveSuccess'));
});
}}
>
{t('save')}
</Button>
</TableCell>
</TableRow>
</TableBody>
</Table>
<div className='px-2'>
<div className='mt-4 grid gap-4'>
{timeSlots.map((slot, index) => (
<div key={index} className='flex flex-col items-end gap-2 lg:flex-row'>
<div>
<Label>{t('startTime')}</Label>
<EnhancedInput
key={`${index}-start-time`}
type='time'
value={slot.start_time}
onValueChange={(value) => updateTimeSlot(index, 'start_time', value as string)}
/>
}
/>
</TableCell>
</TableRow>
<TableRow>
<TableCell>
<Label>{t('nodePullInterval')}</Label>
<p className='text-muted-foreground text-xs'>{t('nodePullIntervalDescription')}</p>
</TableCell>
<TableCell className='text-right'>
<EnhancedInput
type='number'
min={0}
onValueBlur={(value) => updateConfig('node_pull_interval', value)}
suffix='S'
value={data?.node_pull_interval}
placeholder={t('inputPlaceholder')}
/>
</TableCell>
</TableRow>
<TableRow>
<TableCell>
<Label>{t('nodePushInterval')}</Label>
<p className='text-muted-foreground text-xs'>{t('nodePushIntervalDescription')}</p>
</TableCell>
<TableCell className='text-right'>
<EnhancedInput
type='number'
min={0}
value={data?.node_push_interval}
onValueBlur={(value) => updateConfig('node_push_interval', value)}
placeholder={t('inputPlaceholder')}
/>
</TableCell>
</TableRow>
</TableBody>
</Table>
</div>
<div>
<Label>{t('endTime')}</Label>
<EnhancedInput
key={`${index}-end-time`}
type='time'
value={slot.end_time}
onValueChange={(value) => updateTimeSlot(index, 'end_time', value as string)}
/>
</div>
<div>
<Label>{t('multiplier')}</Label>
<EnhancedInput
key={`${index}-multiplier`}
type='number'
value={slot.multiplier}
onValueChange={(value) => updateTimeSlot(index, 'multiplier', value as number)}
min={1}
step='0.1'
/>
</div>
<Button
variant='destructive'
onClick={() => {
removeTimeSlot(index);
}}
>
{t('delete')}
</Button>
</div>
))}
</div>
<Button onClick={addTimeSlot} variant='outline' className='mt-4 w-full'>
{t('addTimeSlot')}
</Button>
</div>
</>
);
}

View File

@ -45,14 +45,23 @@
"saveSuccess": "Úspěšně uloženo"
},
"node": {
"addTimeSlot": "Přidat časový úsek",
"communicationKey": "Komunikační klíč",
"communicationKeyDescription": "Klíč pro komunikaci uzlu, aby se zajistilo, že data nebudou zachycena jinými osobami",
"delete": "Smazat",
"dynamicMultiplier": "Dynamický násobitel",
"dynamicMultiplierDescription": "Dynamický násobitel označuje zpracování posunutých dat s různými násobiteli pro různé uzly během různých časových období.",
"endTime": "Čas konce",
"inputPlaceholder": "Prosím zadejte",
"multiplier": "Násobitel",
"nodePullInterval": "Interval stahování uzlu",
"nodePullIntervalDescription": "Frekvence, s jakou uzel získává data z panelu (v sekundách)",
"nodePushInterval": "Interval odesílání uzlu",
"nodePushIntervalDescription": "Frekvence, s jakou uzel odesílá data do panelu",
"saveSuccess": "Úspěšně uloženo"
"reset": "Resetovat",
"save": "Uložit",
"saveSuccess": "Úspěšně uloženo",
"startTime": "Čas začátku"
},
"register": {
"emailSuffixWhitelist": "Seznam povolených přípon e-mailů",

View File

@ -45,14 +45,23 @@
"saveSuccess": "Erfolgreich gespeichert"
},
"node": {
"addTimeSlot": "Zeitfenster hinzufügen",
"communicationKey": "Kommunikationsschlüssel",
"communicationKeyDescription": "Schlüssel für die Kommunikation des Knotens, um sicherzustellen, dass Daten nicht von anderen abgefangen werden",
"delete": "Löschen",
"dynamicMultiplier": "Dynamischer Multiplikator",
"dynamicMultiplierDescription": "Dynamischer Multiplikator bezieht sich auf die Verarbeitung von übermittelten Daten mit unterschiedlichen Multiplikatoren für verschiedene Knoten während unterschiedlicher Zeiträume.",
"endTime": "Endzeit",
"inputPlaceholder": "Bitte eingeben",
"multiplier": "Multiplikator",
"nodePullInterval": "Knotenabfrageintervall",
"nodePullIntervalDescription": "Häufigkeit, mit der der Knoten Daten vom Panel abruft (Sekunden)",
"nodePushInterval": "Knotenübertragungsintervall",
"nodePushIntervalDescription": "Häufigkeit, mit der der Knoten Daten an das Panel überträgt",
"saveSuccess": "Erfolgreich gespeichert"
"reset": "Zurücksetzen",
"save": "Speichern",
"saveSuccess": "Erfolgreich gespeichert",
"startTime": "Startzeit"
},
"register": {
"emailSuffixWhitelist": "E-Mail-Suffix-Whitelist",

View File

@ -45,14 +45,23 @@
"saveSuccess": "Save Successful"
},
"node": {
"addTimeSlot": "Add Time Slot",
"communicationKey": "Communication Key",
"communicationKeyDescription": "Key for node communication to ensure data security",
"delete": "Delete",
"dynamicMultiplier": "Dynamic Multiplier",
"dynamicMultiplierDescription": "Dynamic Multiplier refers to processing pushed data with different multipliers for different nodes during different time periods.",
"endTime": "End Time",
"inputPlaceholder": "Enter",
"multiplier": "Multiplier",
"nodePullInterval": "Node Pull Interval",
"nodePullIntervalDescription": "Frequency (in seconds) for nodes to fetch data from the panel",
"nodePushInterval": "Node Push Interval",
"nodePushIntervalDescription": "Frequency for nodes to push data to the panel",
"saveSuccess": "Save Successful"
"reset": "Reset",
"save": "Save",
"saveSuccess": "Save Successful",
"startTime": "Start Time"
},
"register": {
"emailSuffixWhitelist": "Email Suffix Whitelist",

View File

@ -45,14 +45,23 @@
"saveSuccess": "Guardado exitosamente"
},
"node": {
"addTimeSlot": "Agregar Franja Horaria",
"communicationKey": "Clave de comunicación",
"communicationKeyDescription": "Clave para la comunicación del nodo, para asegurar que los datos no sean interceptados por otros",
"delete": "Eliminar",
"dynamicMultiplier": "Multiplicador Dinámico",
"dynamicMultiplierDescription": "El Multiplicador Dinámico se refiere al procesamiento de datos enviados con diferentes multiplicadores para diferentes nodos durante distintos períodos de tiempo.",
"endTime": "Hora de Fin",
"inputPlaceholder": "Por favor, ingrese",
"multiplier": "Multiplicador",
"nodePullInterval": "Intervalo de extracción del nodo",
"nodePullIntervalDescription": "Frecuencia con la que el nodo obtiene datos del panel (segundos)",
"nodePushInterval": "Intervalo de envío del nodo",
"nodePushIntervalDescription": "Frecuencia con la que el nodo envía datos al panel",
"saveSuccess": "Guardado exitosamente"
"reset": "Restablecer",
"save": "Guardar",
"saveSuccess": "Guardado exitosamente",
"startTime": "Hora de Inicio"
},
"register": {
"emailSuffixWhitelist": "Lista blanca de sufijos de correo electrónico",

View File

@ -45,14 +45,23 @@
"saveSuccess": "Guardado exitosamente"
},
"node": {
"addTimeSlot": "Agregar Franja Horaria",
"communicationKey": "Clave de comunicación",
"communicationKeyDescription": "Clave para la comunicación del nodo, para asegurar que los datos no sean interceptados por otros",
"delete": "Eliminar",
"dynamicMultiplier": "Multiplicador Dinámico",
"dynamicMultiplierDescription": "El Multiplicador Dinámico se refiere al procesamiento de datos enviados con diferentes multiplicadores para diferentes nodos durante distintos períodos de tiempo.",
"endTime": "Hora de Fin",
"inputPlaceholder": "Por favor ingrese",
"multiplier": "Multiplicador",
"nodePullInterval": "Intervalo de extracción del nodo",
"nodePullIntervalDescription": "Frecuencia con la que el nodo obtiene datos del panel (segundos)",
"nodePushInterval": "Intervalo de envío del nodo",
"nodePushIntervalDescription": "Frecuencia con la que el nodo envía datos al panel",
"saveSuccess": "Guardado exitosamente"
"reset": "Restablecer",
"save": "Guardar",
"saveSuccess": "Guardado exitosamente",
"startTime": "Hora de Inicio"
},
"register": {
"emailSuffixWhitelist": "Lista blanca de sufijos de correo electrónico",

View File

@ -45,14 +45,23 @@
"saveSuccess": "ذخیره‌سازی موفقیت‌آمیز"
},
"node": {
"addTimeSlot": "افزودن بازه زمانی",
"communicationKey": "کلید ارتباطی",
"communicationKeyDescription": "کلید برای ارتباط گره به منظور اطمینان از امنیت داده‌ها",
"delete": "حذف",
"dynamicMultiplier": "ضریب پویا",
"dynamicMultiplierDescription": "ضریب پویا به پردازش داده‌های ارسال شده با ضرایب مختلف برای گره‌های مختلف در دوره‌های زمانی مختلف اشاره دارد.",
"endTime": "زمان پایان",
"inputPlaceholder": "وارد کنید",
"multiplier": "ضریب",
"nodePullInterval": "فاصله زمانی کشیدن گره",
"nodePullIntervalDescription": "فرکانس (به ثانیه) برای گره‌ها جهت دریافت داده از پنل",
"nodePushInterval": "فاصله زمانی فشار گره",
"nodePushIntervalDescription": "فرکانس برای گره‌ها جهت ارسال داده به پنل",
"saveSuccess": "ذخیره با موفقیت انجام شد"
"reset": "بازنشانی",
"save": "ذخیره",
"saveSuccess": "ذخیره با موفقیت انجام شد",
"startTime": "زمان شروع"
},
"register": {
"emailSuffixWhitelist": "لیست سفید پسوند ایمیل",

View File

@ -45,14 +45,23 @@
"saveSuccess": "Tallennus onnistui"
},
"node": {
"addTimeSlot": "Lisää aikaväli",
"communicationKey": "Viestintäavain",
"communicationKeyDescription": "Solmun viestinnän avain, joka varmistaa, että tiedot eivät joudu muiden sieppaamiksi",
"delete": "Poista",
"dynamicMultiplier": "Dynaaminen Kerroin",
"dynamicMultiplierDescription": "Dynaaminen Kerroin viittaa siihen, että käsitellään siirrettyä dataa eri kertoimilla eri solmuille eri ajanjaksoina.",
"endTime": "Lopetusaika",
"inputPlaceholder": "Ole hyvä ja syötä",
"multiplier": "Kerroin",
"nodePullInterval": "Solmun noutoväli",
"nodePullIntervalDescription": "Kuinka usein solmu hakee tietoja paneelista (sekunteina)",
"nodePushInterval": "Solmun lähetysväli",
"nodePushIntervalDescription": "Kuinka usein solmu lähettää tietoja paneeliin",
"saveSuccess": "Tallennus onnistui"
"reset": "Nollaa",
"save": "Tallenna",
"saveSuccess": "Tallennus onnistui",
"startTime": "Aloitusaika"
},
"register": {
"emailSuffixWhitelist": "Sähköpostin jälkiliitteen sallittu luettelo",

View File

@ -45,14 +45,23 @@
"saveSuccess": "Enregistrement réussi"
},
"node": {
"addTimeSlot": "Ajouter un créneau horaire",
"communicationKey": "Clé de communication",
"communicationKeyDescription": "Clé pour la communication du nœud, afin de garantir que les données ne soient pas interceptées par d'autres",
"delete": "Supprimer",
"dynamicMultiplier": "Multiplicateur Dynamique",
"dynamicMultiplierDescription": "Le Multiplicateur Dynamique fait référence au traitement des données poussées avec différents multiplicateurs pour différents nœuds pendant différentes périodes.",
"endTime": "Heure de Fin",
"inputPlaceholder": "Veuillez entrer",
"multiplier": "Multiplicateur",
"nodePullInterval": "Intervalle de récupération du nœud",
"nodePullIntervalDescription": "Fréquence à laquelle le nœud récupère les données du panneau (en secondes)",
"nodePushInterval": "Intervalle de poussée du nœud",
"nodePushIntervalDescription": "Fréquence à laquelle le nœud pousse les données vers le panneau",
"saveSuccess": "Enregistrement réussi"
"reset": "Réinitialiser",
"save": "Enregistrer",
"saveSuccess": "Enregistrement réussi",
"startTime": "Heure de Début"
},
"register": {
"emailSuffixWhitelist": "Liste blanche des suffixes d'email",

View File

@ -45,14 +45,23 @@
"saveSuccess": "सफलतापूर्वक सहेजा गया"
},
"node": {
"addTimeSlot": "समय स्लॉट जोड़ें",
"communicationKey": "संचार कुंजी",
"communicationKeyDescription": "डेटा को अन्य लोगों द्वारा अवरोधित होने से बचाने के लिए नोड संचार की कुंजी",
"delete": "हटाएं",
"dynamicMultiplier": "डायनामिक मल्टीप्लायर",
"dynamicMultiplierDescription": "डायनामिक मल्टीप्लायर का मतलब है विभिन्न समय अवधियों के दौरान विभिन्न नोड्स के लिए अलग-अलग मल्टीप्लायर के साथ प्रोसेस किए गए डेटा को प्रोसेस करना।",
"endTime": "समाप्ति समय",
"inputPlaceholder": "कृपया दर्ज करें",
"multiplier": "मल्टीप्लायर",
"nodePullInterval": "नोड पुल अंतराल",
"nodePullIntervalDescription": "पैनल से डेटा प्राप्त करने के लिए नोड की आवृत्ति (सेकंड में)",
"nodePushInterval": "नोड पुश अंतराल",
"nodePushIntervalDescription": "नोड द्वारा डेटा को पैनल पर भेजने की आवृत्ति",
"saveSuccess": "सफलतापूर्वक सहेजा गया"
"reset": "रीसेट",
"save": "सहेजें",
"saveSuccess": "सफलतापूर्वक सहेजा गया",
"startTime": "प्रारंभ समय"
},
"register": {
"emailSuffixWhitelist": "ईमेल प्रत्यय श्वेतसूची",

View File

@ -45,14 +45,23 @@
"saveSuccess": "Sikeres mentés"
},
"node": {
"addTimeSlot": "Időrés hozzáadása",
"communicationKey": "Kommunikációs kulcs",
"communicationKeyDescription": "A csomópontok közötti kommunikáció kulcsa, amely biztosítja, hogy az adatokat ne lehessen elfogni mások által",
"delete": "Törlés",
"dynamicMultiplier": "Dinamikus Szorzó",
"dynamicMultiplierDescription": "A Dinamikus Szorzó arra utal, hogy a különböző csomópontoknál különböző szorzókkal dolgozzák fel a továbbított adatokat különböző időszakokban.",
"endTime": "Befejezési Idő",
"inputPlaceholder": "Kérjük, írja be",
"multiplier": "Szorzó",
"nodePullInterval": "Csomópont lehívási intervallum",
"nodePullIntervalDescription": "A csomópont milyen gyakran kér le adatokat a panelről (másodpercben)",
"nodePushInterval": "Csomópont küldési intervallum",
"nodePushIntervalDescription": "A csomópont milyen gyakran küld adatokat a panelre",
"saveSuccess": "Sikeres mentés"
"reset": "Visszaállítás",
"save": "Mentés",
"saveSuccess": "Sikeres mentés",
"startTime": "Kezdési Idő"
},
"register": {
"emailSuffixWhitelist": "E-mail végződés fehérlista",

View File

@ -45,14 +45,23 @@
"saveSuccess": "保存に成功しました"
},
"node": {
"addTimeSlot": "時間枠を追加",
"communicationKey": "通信キー",
"communicationKeyDescription": "ノード通信のためのキーで、データが他人に傍受されないようにします",
"delete": "削除",
"dynamicMultiplier": "動的乗数",
"dynamicMultiplierDescription": "動的乗数は、異なる時間帯に異なるノードに対して異なる乗数でプッシュされたデータを処理することを指します。",
"endTime": "終了時間",
"inputPlaceholder": "入力してください",
"multiplier": "乗数",
"nodePullInterval": "ノード取得間隔",
"nodePullIntervalDescription": "ノードがパネルからデータを取得する頻度(秒)",
"nodePushInterval": "ノード送信間隔",
"nodePushIntervalDescription": "ノードがデータをパネルに送信する頻度",
"saveSuccess": "保存成功"
"reset": "リセット",
"save": "保存",
"saveSuccess": "保存成功",
"startTime": "開始時間"
},
"register": {
"emailSuffixWhitelist": "メールサフィックスホワイトリスト",

View File

@ -45,14 +45,23 @@
"saveSuccess": "저장 성공"
},
"node": {
"addTimeSlot": "시간 슬롯 추가",
"communicationKey": "통신 키",
"communicationKeyDescription": "데이터가 다른 사람에게 가로채이지 않도록 보장하는 노드 통신 키",
"delete": "삭제",
"dynamicMultiplier": "동적 배수",
"dynamicMultiplierDescription": "동적 배수는 서로 다른 시간대에 서로 다른 노드에 대해 다른 배수를 사용하여 처리된 데이터를 의미합니다.",
"endTime": "종료 시간",
"inputPlaceholder": "입력하세요",
"multiplier": "배수",
"nodePullInterval": "노드 가져오기 간격",
"nodePullIntervalDescription": "노드가 패널에서 데이터를 가져오는 빈도(초)",
"nodePushInterval": "노드 푸시 간격",
"nodePushIntervalDescription": "노드가 데이터를 패널로 푸시하는 빈도",
"saveSuccess": "저장 성공"
"reset": "재설정",
"save": "저장",
"saveSuccess": "저장 성공",
"startTime": "시작 시간"
},
"register": {
"emailSuffixWhitelist": "이메일 접미사 화이트리스트",

View File

@ -45,14 +45,23 @@
"saveSuccess": "Lagret vellykket"
},
"node": {
"addTimeSlot": "Legg til tidsluke",
"communicationKey": "Kommunikasjonsnøkkel",
"communicationKeyDescription": "Nøkkelen for kommunikasjon mellom noder, for å sikre at data ikke blir avlyttet av andre",
"delete": "Slett",
"dynamicMultiplier": "Dynamisk Multiplikator",
"dynamicMultiplierDescription": "Dynamisk Multiplikator refererer til behandling av dyttet data med forskjellige multiplikatorer for forskjellige noder i ulike tidsperioder.",
"endTime": "Sluttid",
"inputPlaceholder": "Vennligst skriv inn",
"multiplier": "Multiplikator",
"nodePullInterval": "Node hentingsintervall",
"nodePullIntervalDescription": "Frekvensen (i sekunder) som noden henter data fra panelet",
"nodePushInterval": "Node push-intervall",
"nodePushIntervalDescription": "Frekvensen som noden sender data til panelet",
"saveSuccess": "Lagring vellykket"
"reset": "Tilbakestill",
"save": "Lagre",
"saveSuccess": "Lagring vellykket",
"startTime": "Starttid"
},
"register": {
"emailSuffixWhitelist": "E-post suffiks hviteliste",

View File

@ -45,14 +45,23 @@
"saveSuccess": "Zapisano pomyślnie"
},
"node": {
"addTimeSlot": "Dodaj przedział czasowy",
"communicationKey": "Klucz komunikacyjny",
"communicationKeyDescription": "Klucz do komunikacji węzła, aby zapewnić, że dane nie zostaną przechwycone przez inne osoby",
"delete": "Usuń",
"dynamicMultiplier": "Mnożnik dynamiczny",
"dynamicMultiplierDescription": "Mnożnik dynamiczny odnosi się do przetwarzania przesyłanych danych z różnymi mnożnikami dla różnych węzłów w różnych okresach czasu.",
"endTime": "Czas zakończenia",
"inputPlaceholder": "Proszę wprowadzić",
"multiplier": "Mnożnik",
"nodePullInterval": "Interwał pobierania węzła",
"nodePullIntervalDescription": "Częstotliwość, z jaką węzeł pobiera dane z panelu (w sekundach)",
"nodePushInterval": "Interwał wysyłania węzła",
"nodePushIntervalDescription": "Częstotliwość, z jaką węzeł wysyła dane do panelu",
"saveSuccess": "Zapisano pomyślnie"
"reset": "Resetuj",
"save": "Zapisz",
"saveSuccess": "Zapisano pomyślnie",
"startTime": "Czas rozpoczęcia"
},
"register": {
"emailSuffixWhitelist": "Biała lista sufiksów e-mail",

View File

@ -45,14 +45,23 @@
"saveSuccess": "Salvo com sucesso"
},
"node": {
"addTimeSlot": "Adicionar Faixa de Horário",
"communicationKey": "Chave de Comunicação",
"communicationKeyDescription": "Chave para comunicação do nó, garantindo que os dados não sejam interceptados por terceiros",
"delete": "Excluir",
"dynamicMultiplier": "Multiplicador Dinâmico",
"dynamicMultiplierDescription": "Multiplicador Dinâmico refere-se ao processamento de dados enviados com diferentes multiplicadores para diferentes nós durante diferentes períodos de tempo.",
"endTime": "Hora de Término",
"inputPlaceholder": "Por favor, insira",
"multiplier": "Multiplicador",
"nodePullInterval": "Intervalo de Extração do Nó",
"nodePullIntervalDescription": "Frequência com que o nó obtém dados do painel (segundos)",
"nodePushInterval": "Intervalo de Envio do Nó",
"nodePushIntervalDescription": "Frequência com que o nó envia dados para o painel",
"saveSuccess": "Salvo com sucesso"
"reset": "Redefinir",
"save": "Salvar",
"saveSuccess": "Salvo com sucesso",
"startTime": "Hora de Início"
},
"register": {
"emailSuffixWhitelist": "Lista branca de sufixos de e-mail",

View File

@ -45,14 +45,23 @@
"saveSuccess": "Salvare reușită"
},
"node": {
"addTimeSlot": "Adaugă Interval Orar",
"communicationKey": "Cheie de comunicare",
"communicationKeyDescription": "Cheia de comunicare a nodului, pentru a asigura că datele nu sunt interceptate de alții",
"delete": "Ștergere",
"dynamicMultiplier": "Multiplicator Dinamic",
"dynamicMultiplierDescription": "Multiplicatorul Dinamic se referă la procesarea datelor transmise cu multiplicatori diferiți pentru noduri diferite în perioade de timp diferite.",
"endTime": "Ora de Sfârșit",
"inputPlaceholder": "Vă rugăm să introduceți",
"multiplier": "Multiplicator",
"nodePullInterval": "Interval de extragere a nodului",
"nodePullIntervalDescription": "Frecvența cu care nodul obține date de la panou (secunde)",
"nodePushInterval": "Interval de împingere a nodului",
"nodePushIntervalDescription": "Frecvența cu care nodul trimite date către panou",
"saveSuccess": "Salvare reușită"
"reset": "Resetare",
"save": "Salvare",
"saveSuccess": "Salvare reușită",
"startTime": "Ora de Începere"
},
"register": {
"emailSuffixWhitelist": "Lista albă a sufixelor de e-mail",

View File

@ -45,14 +45,23 @@
"saveSuccess": "Успешно сохранено"
},
"node": {
"addTimeSlot": "Добавить временной интервал",
"communicationKey": "Ключ связи",
"communicationKeyDescription": "Ключ для связи узла, чтобы гарантировать, что данные не будут перехвачены другими",
"delete": "Удалить",
"dynamicMultiplier": "Динамический множитель",
"dynamicMultiplierDescription": "Динамический множитель относится к обработке переданных данных с различными множителями для разных узлов в разные периоды времени.",
"endTime": "Время окончания",
"inputPlaceholder": "Пожалуйста, введите",
"multiplier": "Множитель",
"nodePullInterval": "Интервал извлечения узла",
"nodePullIntervalDescription": "Частота, с которой узел получает данные с панели (в секундах)",
"nodePushInterval": "Интервал отправки узла",
"nodePushIntervalDescription": "Частота, с которой узел отправляет данные на панель",
"saveSuccess": "Успешно сохранено"
"reset": "Сбросить",
"save": "Сохранить",
"saveSuccess": "Успешно сохранено",
"startTime": "Время начала"
},
"register": {
"emailSuffixWhitelist": "Белый список суффиксов электронной почты",

View File

@ -45,14 +45,23 @@
"saveSuccess": "บันทึกสำเร็จ"
},
"node": {
"addTimeSlot": "เพิ่มช่วงเวลา",
"communicationKey": "คีย์การสื่อสาร",
"communicationKeyDescription": "คีย์สำหรับการสื่อสารของโหนด เพื่อให้มั่นใจว่าข้อมูลจะไม่ถูกดักจับโดยผู้อื่น",
"delete": "ลบ",
"dynamicMultiplier": "ตัวคูณแบบไดนามิก",
"dynamicMultiplierDescription": "ตัวคูณแบบไดนามิกหมายถึงการประมวลผลข้อมูลที่ถูกส่งด้วยตัวคูณที่แตกต่างกันสำหรับโหนดต่างๆ ในช่วงเวลาที่แตกต่างกัน",
"endTime": "เวลาสิ้นสุด",
"inputPlaceholder": "กรุณาใส่ข้อมูล",
"multiplier": "ตัวคูณ",
"nodePullInterval": "ช่วงเวลาการดึงข้อมูลของโหนด",
"nodePullIntervalDescription": "ความถี่ที่โหนดดึงข้อมูลจากแผงควบคุม (วินาที)",
"nodePushInterval": "ช่วงเวลาการส่งข้อมูลของโหนด",
"nodePushIntervalDescription": "ความถี่ที่โหนดส่งข้อมูลไปยังแผงควบคุม",
"saveSuccess": "บันทึกสำเร็จ"
"reset": "รีเซ็ต",
"save": "บันทึก",
"saveSuccess": "บันทึกสำเร็จ",
"startTime": "เวลาเริ่มต้น"
},
"register": {
"emailSuffixWhitelist": "รายการอนุญาตโดเมนอีเมล",

View File

@ -45,14 +45,23 @@
"saveSuccess": "Başarıyla kaydedildi"
},
"node": {
"addTimeSlot": "Zaman Dilimi Ekle",
"communicationKey": "İletişim Anahtarı",
"communicationKeyDescription": "Verilerin başkaları tarafından ele geçirilmemesini sağlamak için düğüm iletişim anahtarı",
"delete": "Sil",
"dynamicMultiplier": "Dinamik Çarpan",
"dynamicMultiplierDescription": "Dinamik Çarpan, farklı zaman dilimlerinde farklı düğümler için farklı çarpanlarla işlenen veriyi ifade eder.",
"endTime": "Bitiş Zamanı",
"inputPlaceholder": "Lütfen giriniz",
"multiplier": "Çarpan",
"nodePullInterval": "Düğüm Çekme Aralığı",
"nodePullIntervalDescription": "Düğümün panelden veri alma sıklığı (saniye)",
"nodePushInterval": "Düğüm Gönderme Aralığı",
"nodePushIntervalDescription": "Düğümün verileri panele gönderme sıklığı",
"saveSuccess": "Başarıyla kaydedildi"
"reset": "Sıfırla",
"save": "Kaydet",
"saveSuccess": "Başarıyla kaydedildi",
"startTime": "Başlangıç Zamanı"
},
"register": {
"emailSuffixWhitelist": "E-posta Soneki Beyaz Listesi",

View File

@ -45,14 +45,23 @@
"saveSuccess": "Успішно збережено"
},
"node": {
"addTimeSlot": "Додати часовий проміжок",
"communicationKey": "Ключ зв'язку",
"communicationKeyDescription": "Ключ для зв'язку вузла, щоб забезпечити захист даних від перехоплення",
"delete": "Видалити",
"dynamicMultiplier": "Динамічний Множник",
"dynamicMultiplierDescription": "Динамічний множник відноситься до обробки переданих даних з різними множниками для різних вузлів протягом різних періодів часу.",
"endTime": "Час Закінчення",
"inputPlaceholder": "Будь ласка, введіть",
"multiplier": "Множник",
"nodePullInterval": "Інтервал отримання вузла",
"nodePullIntervalDescription": "Частота отримання даних вузлом з панелі (в секундах)",
"nodePushInterval": "Інтервал відправки вузла",
"nodePushIntervalDescription": "Частота відправки даних вузлом на панель",
"saveSuccess": "Збережено успішно"
"reset": "Скинути",
"save": "Зберегти",
"saveSuccess": "Збережено успішно",
"startTime": "Час Початку"
},
"register": {
"emailSuffixWhitelist": "Білий список суфіксів електронної пошти",

View File

@ -45,14 +45,23 @@
"saveSuccess": "Lưu thành công"
},
"node": {
"addTimeSlot": "Thêm Khung Giờ",
"communicationKey": "Khóa giao tiếp",
"communicationKeyDescription": "Khóa giao tiếp của nút để đảm bảo dữ liệu không bị chặn bởi người khác",
"delete": "Xóa",
"dynamicMultiplier": "Hệ số động",
"dynamicMultiplierDescription": "Hệ số động đề cập đến việc xử lý dữ liệu đẩy với các hệ số khác nhau cho các nút khác nhau trong các khoảng thời gian khác nhau.",
"endTime": "Thời gian kết thúc",
"inputPlaceholder": "Vui lòng nhập",
"multiplier": "Hệ số",
"nodePullInterval": "Khoảng thời gian kéo nút",
"nodePullIntervalDescription": "Tần suất nút lấy dữ liệu từ bảng điều khiển (giây)",
"nodePushInterval": "Khoảng thời gian đẩy nút",
"nodePushIntervalDescription": "Tần suất nút đẩy dữ liệu lên bảng điều khiển",
"saveSuccess": "Lưu thành công"
"reset": "Đặt lại",
"save": "Lưu",
"saveSuccess": "Lưu thành công",
"startTime": "Thời gian bắt đầu"
},
"register": {
"emailSuffixWhitelist": "Danh sách trắng hậu tố email",

View File

@ -45,14 +45,23 @@
"saveSuccess": "保存成功"
},
"node": {
"addTimeSlot": "添加时间段",
"communicationKey": "通信密钥",
"communicationKeyDescription": "节点通信的密钥,以确保数据不被他人拦截",
"delete": "删除",
"dynamicMultiplier": "动态倍率",
"dynamicMultiplierDescription": "动态倍率是指在不同时间段内,对不同的节点推送的数据进行不同的倍率处理",
"endTime": "结束时间",
"inputPlaceholder": "请输入",
"multiplier": "倍率",
"nodePullInterval": "节点拉取间隔",
"nodePullIntervalDescription": "节点从面板获取数据的频率(秒)",
"nodePushInterval": "节点推送间隔",
"nodePushIntervalDescription": "节点将数据推送到面板的频率",
"saveSuccess": "保存成功"
"reset": "重置",
"save": "保存",
"saveSuccess": "保存成功",
"startTime": "开始时间"
},
"register": {
"emailSuffixWhitelist": "电子邮件后缀白名单",

View File

@ -45,14 +45,23 @@
"saveSuccess": "保存成功"
},
"node": {
"addTimeSlot": "新增時間段",
"communicationKey": "通訊密鑰",
"communicationKeyDescription": "節點通訊的密鑰,以確保數據不被他人攔截",
"delete": "刪除",
"dynamicMultiplier": "動態乘數",
"dynamicMultiplierDescription": "動態乘數指的是在不同時間段內,對不同節點的推送數據使用不同的乘數進行處理。",
"endTime": "結束時間",
"inputPlaceholder": "請輸入",
"multiplier": "乘數",
"nodePullInterval": "節點拉取間隔",
"nodePullIntervalDescription": "節點從面板獲取數據的頻率(秒)",
"nodePushInterval": "節點推送間隔",
"nodePushIntervalDescription": "節點將數據推送到面板的頻率",
"saveSuccess": "保存成功"
"reset": "重設",
"save": "儲存",
"saveSuccess": "保存成功",
"startTime": "開始時間"
},
"register": {
"emailSuffixWhitelist": "電子郵件後綴白名單",

View File

@ -104,6 +104,17 @@ export async function updateEmailSmtpConfig(
});
}
/** Get Node Multiplier GET /v1/admin/system/get_node_multiplier */
export async function getNodeMultiplier(options?: { [key: string]: any }) {
return request<API.Response & { data?: API.GetNodeMultiplierResponse }>(
'/v1/admin/system/get_node_multiplier',
{
method: 'GET',
...(options || {}),
},
);
}
/** Get invite config GET /v1/admin/system/invite_config */
export async function getInviteConfig(options?: { [key: string]: any }) {
return request<API.Response & { data?: API.InviteConfig }>('/v1/admin/system/invite_config', {
@ -167,6 +178,21 @@ export async function updateRegisterConfig(
});
}
/** Set Node Multiplier POST /v1/admin/system/set_node_multiplier */
export async function setNodeMultiplier(
body: API.SetNodeMultiplierRequest,
options?: { [key: string]: any },
) {
return request<API.Response & { data?: any }>('/v1/admin/system/set_node_multiplier', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
data: body,
...(options || {}),
});
}
/** setting telegram bot POST /v1/admin/system/setting_telegram_bot */
export async function settingTelegramBot(options?: { [key: string]: any }) {
return request<API.Response & { data?: any }>('/v1/admin/system/setting_telegram_bot', {

View File

@ -375,6 +375,10 @@ declare namespace API {
search?: string;
};
type GetNodeMultiplierResponse = {
periods: TimePeriod[];
};
type GetNodeServerListRequest = {
page: number;
size: number;
@ -686,6 +690,10 @@ declare namespace API {
download: number;
};
type SetNodeMultiplierRequest = {
periods: TimePeriod[];
};
type Shadowsocks = {
method: string;
port: number;
@ -792,6 +800,12 @@ declare namespace API {
count: number;
};
type TimePeriod = {
start_time: string;
end_time: string;
multiplier: number;
};
type TosConfig = {
tos_content: string;
};

View File

@ -373,6 +373,12 @@ declare namespace API {
updated_at: number;
};
type TimePeriod = {
start_time: string;
end_time: string;
multiplier: number;
};
type TosConfig = {
tos_content: string;
};

View File

@ -41,6 +41,7 @@ export function getRedirectUrl() {
}
export function Logout() {
if (!isBrowser()) return;
const cookies = new Cookies(null, { path: '/' });
cookies.remove('Authorization');
const pathname = location.pathname;

View File

@ -373,6 +373,12 @@ declare namespace API {
updated_at: number;
};
type TimePeriod = {
start_time: string;
end_time: string;
multiplier: number;
};
type TosConfig = {
tos_content: string;
};

View File

@ -521,6 +521,12 @@ declare namespace API {
updated_at: number;
};
type TimePeriod = {
start_time: string;
end_time: string;
multiplier: number;
};
type TosConfig = {
tos_content: string;
};