Compare commits

...

8 Commits

Author SHA1 Message Date
Administrator
d3fbf43870 20260521dan 2026-05-21 19:08:12 +08:00
qingjiao
0acbe3b9d1 20260430 2026-04-30 10:56:26 +08:00
qingjiao
5627b466bf 20260421 2026-04-21 09:38:24 +08:00
qingjiao
bc09fd7b6e 20260420 2026-04-20 18:10:39 +08:00
qingjiao
34a9cadc02 20260418 2026-04-18 17:54:13 +08:00
qingjiao
1eeca994ab 20260418 2026-04-18 14:06:33 +08:00
qingjiao
1ed30f7ebe 20260417 2026-04-17 18:03:29 +08:00
qingjiao
714dd6de29 20260325 2026-03-25 16:47:40 +08:00
18 changed files with 514 additions and 181 deletions

1
git Normal file
View File

@ -0,0 +1 @@
git commit -m "20260418" --no-verify

View File

@ -109,7 +109,7 @@
}, },
"husky": { "husky": {
"hooks": { "hooks": {
"pre-commit": "lint-staged" "pre-commit": ""
} }
}, },
"repository": { "repository": {

View File

@ -188,3 +188,36 @@ export function getNetLang(query) {
params: query params: query
}) })
} }
// 获取网络抓包信息
export function getPacketCaptureInfo(data) {
return request({
url: '/pcap/status',
method: 'get',
data
})
}
// 开始抓包
export function startPacketCapture(data) {
return request({
url: '/pcap/start',
method: 'post',
data
})
}
// 停止抓包
export function stopPacketCapture(data) {
return request({
url: '/pcap/stop',
method: 'post',
data
})
}
// 删除抓包文件
export function deletePacketCapture(data) {
return request({
url: '/pcap/delete',
method: 'post',
data
})
}

View File

@ -2,7 +2,7 @@
<el-breadcrumb class="app-breadcrumb" separator="/"> <el-breadcrumb class="app-breadcrumb" separator="/">
<transition-group name="breadcrumb"> <transition-group name="breadcrumb">
<el-breadcrumb-item v-for="(item,index) in levelList" :key="item.path"> <el-breadcrumb-item v-for="(item,index) in levelList" :key="item.path">
<span v-if="item.redirect==='noRedirect'||index==levelList.length-1" class="no-redirect"> <span v-if="item.redirect==='noRedirect'||index === levelList.length - 1" class="no-redirect">
{{ generateTitle(item.meta.title) }} {{ generateTitle(item.meta.title) }}
</span> </span>
<a v-else @click.prevent="handleLink(item)">{{ generateTitle(item.meta.title) }}</a> <a v-else @click.prevent="handleLink(item)">{{ generateTitle(item.meta.title) }}</a>

View File

@ -10,7 +10,7 @@ export default {
firmwareUpdate: 'Firmware Update', firmwareUpdate: 'Firmware Update',
factorySetting: 'System Management', factorySetting: 'System Management',
profile: 'Profile', profile: 'Profile',
urlTitle: 'Network Broadcast Terminal', urlTitle: 'IP Speaker',
operationLog: 'Operation Log' operationLog: 'Operation Log'
}, },
navbar: { navbar: {
@ -25,46 +25,47 @@ export default {
logIn: 'Login', logIn: 'Login',
register: 'Register', register: 'Register',
logCancel: 'Cancel', logCancel: 'Cancel',
username: 'UserName', username: 'Username',
password: 'Password', password: 'Password',
any: 'any', any: 'any',
thirdparty: 'Or connect with', thirdparty: 'Or connect with',
thirdpartyTips: thirdpartyTips:
'Can not be simulated on local, so please combine you own business simulation! ! !', 'Can not be simulated on local, so please combine you own business simulation!',
confirmLogout: 'Confirm Logout', confirmLogout: 'Are you sure you want to log out?',
loggedOut: loggedOut:
'You have been logged out, you can cancel to stay on this page or log in again!', 'You have been logged out, you can cancel to stay on this page or log in again!',
toLogin: 'To Login', toLogin: 'To Login',
changePassword: 'Change Password', changePassword: 'Edit Password',
changePasswordTip: changePasswordTip:
'Detected that the password is too weak or has expired. Please modify the password before logging in', 'Your password is too weak or has expired. Please change your password and log in again.',
changePasswordMsg: changePasswordMsg:
'Password expired, please modify the password before logging in!', 'Your password has expired. Please change your password and log in again.',
upDateMsg: 'Firmware is being upgraded, please wait for a while。' upDateMsg: 'Firmware is being updated, please wait for a while.'
}, },
table: { table: {
productName: 'Product Name', productName: 'Device Name',
productMode: 'Product Model', productMode: 'Device Model',
serialNumber: 'Serial Number', serialNumber: 'Serial Number',
firmwareVercion: 'Firmware Version', firmwareVercion: 'Firmware Version',
deviceID: 'Terminal ID', deviceID: 'Device ID',
deviceIP: 'Terminal IP', deviceIP: 'IP Address',
gatewal: 'Gateway', gatewal: 'Default Gateway',
suonetMask: 'Subnet Mask', suonetMask: 'Subnet Mask',
storageSpaces: 'Storage Spaces', storageSpaces: 'Storage Capacity',
serverIP: 'Server IP', serverIP: 'Server IP',
corverCommandDort: 'Server Command Port', corverCommandDort: 'Server Port',
deviceCommandPort: 'Terminal Command Port', deviceCommandPort: 'Command Port',
deviceStreamPort: 'Terminal Code Stream Port', deviceStreamPort: 'Stream Port',
macAddress: 'MAC Address', macAddress: 'MAC Address',
serverPort: 'Server Port', serverPort: 'Server Port',
isEmpty: ' cannot be empty', isEmpty: ' cannot be empty.',
isRight: ' is invalid.', isRight: ' is invalid.',
isRight1: ' is out of range (10000-49999).', isRight1: ' is out of range (10000-49999).',
isRight2: ' is out of range (1000-9999).', isRight2: ' is out of range (1000-9999).',
isRight3: ' is out of range (1-9999).', isRight3: ' is out of range (1-9999).',
open: 'Enable', open: 'Enable',
close: 'Disable', close: 'Disable',
close1: 'Close',
save: 'Save', save: 'Save',
submit: 'Submit', submit: 'Submit',
toTop: 'Back to top', toTop: 'Back to top',
@ -72,33 +73,40 @@ export default {
clear: 'Clear Screen', clear: 'Clear Screen',
refresh: 'Auto Refresh', refresh: 'Auto Refresh',
update: 'Update', update: 'Update',
choose: 'Choice', choose: 'Browse',
tips: 'Tips', tips: 'Tips',
NetworkPacketCapture: 'Network packet capture',
CapturingPacket: 'Capturing packets (Max 10 MB) ......',
PacketCaptureHasBeenStopped: 'Packet capture is stopped and saved as tcpdump.pcap.',
StartPacketCapture: 'Start',
StopPacketCapture: 'Stop',
Download: 'Download',
Delete: 'Delete',
factorySettings: 'Restore Factory Settings', factorySettings: 'Restore Factory Settings',
routerRestart: 'Reboot The Device', routerRestart: 'Restart',
SIPserver: 'SIP Server IP', SIPserver: 'SIP Server IP',
SIPUserName: 'SIP UserName', SIPUserName: 'SIP Username',
SIPPassword: 'SIP PassWord', SIPPassword: 'SIP Password',
programTip: programTip:
'Tip: the total size of uploaded files cannot exceed the capacity of the device storage space!', 'Tip: The total size of uploaded files cannot exceed the storage capacity.',
firmwareUpdateTip: firmwareUpdateTip:
'Tip: Firmware upgrade can improve equipment performance and functions only when its version matched. If not, the hardware might not be able to work! Please use with caution!', 'Tip: Firmware upgrade can only improve device performance and functionality if the firmware version is compatible. Otherwise, the equipment may not work properly! Please use with caution!',
factoryTip: factoryTip:
'After returning to the factory setting, the configuration of the device will return to the factory state. Please use with caution!', 'After restoring factory settings, the device configuration will be restored to its factory state. Please use with caution!',
routerRestartTips: routerRestartTips:
'The device is about to reboot. Are you sure to continue', 'Are you sure you want to restart the device?',
programDeteleTip: 'Confirm to delete this file', programDeteleTip: 'Are you sure you want to delete?',
logDeteleTip: 'Confirm to delete this log', logDeteleTip: 'Are you sure you want to delete?',
freeSpace: 'Free Space', freeSpace: 'Available Space',
chooseFile: 'Upgrade File', chooseFile: 'Upgrade File',
microphoneSwitch: 'Microphone Switch', microphoneSwitch: 'Microphone Input',
factorySettingsTips: factorySettingsTips:
'The default IP address of the device in the factory state is 192.168.1.108. After the restoration, you need to log in again.', 'The device\'s default IP address is 192.168.1.108. You will need to log in again after restoring factory settings.', // The baseline version of the LX branch is 192.168.1.101, while the other baseline versions are 192.168.1.108
fileUpload: 'File uploading...', fileUpload: 'File uploading ...',
fileSave: 'Saving...', fileSave: 'Saving...',
routerRestartIng: 'Device Rebooting...', routerRestartIng: 'Device Restarting ...',
upDateTips: upDateTips:
'The firmware is being updated, please keep the network connected, do not cut off the power and refresh the web page.', 'The firmware is being upgraded, please keep the network connection, power off, and refresh the webpage.',
dynamicTips1: 'Fixed header, sorted by header order', dynamicTips1: 'Fixed header, sorted by header order',
dynamicTips2: 'Not fixed header, sorted by click order', dynamicTips2: 'Not fixed header, sorted by click order',
dragTips1: 'The default order', dragTips1: 'The default order',
@ -135,20 +143,20 @@ export default {
upload: 'Upload', upload: 'Upload',
fileName: 'Program Name', fileName: 'Program Name',
fileEditTip: fileEditTip:
'The file name cannot be empty and the file format cannot be modified', 'The file name cannot be empty and the file format cannot be modified.',
fileSizeTip: 'The uploaded file size cannot exceed 5MB!', fileSizeTip: 'The size of the uploaded file cannot exceed 40MB.',
fileTypeTip: 'The uploaded file can only be in MP3 format!', fileTypeTip: 'Only MP3 format files can be uploaded.',
updateFileTypeTip: 'The uploaded file can only be in Bin format', updateFileTypeTip: 'The uploaded file can only be in Bin format.',
fileSurplusSizeTip: 'Insufficient remaining storage space', fileSurplusSizeTip: 'Insufficient storage space!',
upDateTip: 'Please select a file before upgrading!', upDateTip: 'Please select a file before upgrading.',
audio: 'AudioFormat', audio: 'Audio Format',
playStatus: 'Playing status', playStatus: 'Status',
aoVol: 'Play Volume', aoVol: 'Playback Volume',
aiVol: 'Recording Volume', aiVol: 'Recording Volume',
auth: 'Authentication', auth: 'Authentication',
httpAuth: 'Http Authentication', httpAuth: 'HTTP Authentication',
warningTitle: 'Alarm File', warningTitle: 'Alarm File',
warningFormTitle: 'AlarmIn', warningFormTitle: 'AlarmIn',
@ -164,32 +172,40 @@ export default {
slyCode: 'Please login again.', // 401code slyCode: 'Please login again.', // 401code
sleCode: 'Login expired, please login again.', // 402code sleCode: 'Login expired, please login again.', // 402code
lllCode: 'The password is too weak, please change it.', // 600code lllCode: 'The password is too weak, please change it.', // 600code
llyCode: 'The firmware is being updated, please wait.', // 601code llyCode: 'The firmware is being upgraded, please wait.', // 601code
lleCode: '用户登录名称/密码错误.', // 602code lleCode: 'The username or password is incorrect.', // 602code
llsCode: 'Too many failed login attempts, the account has been locked (30 minutes).', // 603code llsCode: 'Too many failed login attempts, the account has been locked (30 minutes).', // 603code
llssCode: 'The account has been logged in elsewhere. Do you want to force logout?.', // 604code llssCode: 'The account has been logged in elsewhere. Do you want to force login?', // 604code
lylCode: 'The old password is wrong.', // 610code lylCode: 'The old password is incorrect.', // 610code
lyyCode: 'The new password must be different from the old password.', // 611code lyyCode: 'The new password must be different from the old password.', // 611code
lelCode: 'The file upload failed because it cannot be played.', // 620code lelCode: 'The file upload failed because it is not a playable MP3 file.', // 620code
leyCode: 'The file upload failed because a file with the same name already exists.', // 621code leyCode: 'The file upload failed because a file with the same name already exists.', // 621code
leeCode: 'The file upload failed because of a network failure.', // 622code leeCode: 'The file upload failed because there was a network error.', // 622code
lesCode: 'The file does not exist, please refresh.', // 623Code lesCode: 'The file does not exist, please refresh.', // 623Code
lessCode: 'Failed to rename, please avoid using special characters.', // 624Code lessCode: 'Failed to rename, please avoid using special characters.', // 624Code
lewCode: 'Failed to delete, because the file is playing.', // 625Code lewCode: 'Failed to delete, because the file is playing.', // 625Code
lslCode: '节目文件开始播放失败,节目已在播放中.', // 630code lslCode: 'Failed to start playing, because the file is already playing.', // 630code
lsyCode: '节目文件停止播放失败,节目未在播放中.', // 631code lsyCode: 'Failed to stop playing, because the file is not playing.', // 631code
lsslCode: 'The firmware update has not started.', // 640code lsslCode: 'The firmware upgrade has not started.', // 640code
lssyCode: 'The firmware is being updated, please wait.', // 641code lssyCode: 'The firmware is being upgraded, please wait.', // 641code
lsseCode: 'The firmware update completed, the device will reboot soon.', // 642code lsseCode: 'The firmware upgrade completed, the device will restart soon.', // 642code
lssCode: 'Failed to update the firmware, because the file cannot be parsed.', // 643code lssCode: 'Failed to upgrade the firmware, because the file cannot be parsed.', // 643code
lsssCode: 'Failed to update the firmware, because the file version is too low.', // 644code lsssCode: 'Failed to upgrade the firmware, because the file version is too low.', // 644code
WAN_IP_AddressIP: 'WAN DomainName', WAN_IP_AddressIP: 'NAT Domain Name',
WAN_IP_Address: 'WAN IP address', WAN_IP_Address: 'NAT IP Address',
WAN_IP_DomainName: 'WAN domain name', WAN_IP_DomainName: 'NAT Domain Name',
WAN_IP_Type: 'WAN Type', WAN_IP_Type: 'NAT Type',
WAN_Port: 'WAN Port', WAN_Port: 'NAT ONVIF Port',
WAN_RTSP_Port: 'WAN RTSP Port' WAN_RTSP_Port: 'NAT RTSP Port',
httpPort: 'HTTP API Port',
webPort: 'Web Port',
rtspPort: 'RTSP Port',
rtpPort: 'RTP Port',
portConflict: ' Conflict',
PortNumbersCannotBeTheSame: 'The ports cannot be the same',
SIP_Port:'SIP Port',
SIP_RTP_Port:'SIP RTP Port'
}, },
theme: { theme: {
change: 'Change Theme', change: 'Change Theme',
@ -218,20 +234,20 @@ export default {
password2: 'Confirm Password', password2: 'Confirm Password',
update: 'Update', update: 'Update',
oldPassword: 'Please enter your old password', oldPassword: 'Please enter your old password',
newPassword: 'Please enter a new password', newPassword: 'Please enter a new password!',
newPassword2: 'Please enter the new password again', newPassword2: 'Please enter the new password again!',
passwordDifferent: 'The two password entered is inconsistent', passwordDifferent: 'The two password entered is inconsistent!',
newAndOldPassword: newAndOldPassword:
'Operation exception: the new password is the same as the old password', 'Operation exception: the new password is the same as the old password.',
updatePasswordSuccess: 'User password updated successfully', updatePasswordSuccess: 'Password updated successfully.',
passwordLengthError: 'Enter a password of at least 8 digits', passwordLengthError: 'Enter a password of at least 8 digits.',
passwordStrongError: passwordStrongError:
'The Password strength is insufficient. Please ensure that the length is at least 8 digits and at most 16 digits, and must contain at least three of numbers, Minuscule, uppercase letters, and special symbols!', 'The Password strength is insufficient. Please ensure that the length is at least 8 digits and at most 16 digits, and must contain at least three of numbers, Minuscule, uppercase letters, and special symbols!',
confirmPassword: 'Confirm Password', confirmPassword: 'Confirm Password',
inputusername: 'Please enter your username!', inputusername: 'Please enter the username!',
inputpassword: 'Please enter the password', inputpassword: 'Please enter the password!',
inputpassword2: 'Please enter the password again', inputpassword2: 'Please enter the password again!',
registerSuccess: 'User registration successful', registerSuccess: 'User registration successful!',
gologin: 'Do you want to login' gologin: 'Do you want to login?'
} }
} }

View File

@ -11,7 +11,7 @@ export default {
factorySetting: 'Sistema', factorySetting: 'Sistema',
profile: 'Usuário', profile: 'Usuário',
urlTitle: 'Corneta Khomp', urlTitle: 'Corneta Khomp',
operationLog: 'Registros' operationLog: 'Registros',
}, },
navbar: { navbar: {
dashboard: 'Configurações', dashboard: 'Configurações',
@ -31,30 +31,30 @@ export default {
thirdparty: 'Ou conectar-se com', thirdparty: 'Ou conectar-se com',
thirdpartyTips: thirdpartyTips:
'Não pode ser simulado localmente, então combine com sua própria simulação de negócios!', 'Não pode ser simulado localmente, então combine com sua própria simulação de negócios!',
confirmLogout: 'Confirmar Logout', confirmLogout: 'Tem certeza de que deseja sair?',
loggedOut: loggedOut:
'Você foi desconectado. Você pode cancelar para permanecer nesta página ou fazer login novamente.', 'Você foi desconectado. Você pode cancelar para permanecer nesta página ou fazer login novamente.',
toLogin: 'Ir para o Login', toLogin: 'Ir para o Login',
changePassword: 'Alterar Senha', changePassword: 'Alterar Senha',
changePasswordTip: changePasswordTip:
'Detectado que a senha é muito fraca ou expirou. Por favor, modifique a senha antes de fazer login.', 'Sua senha é muito fraca ou expirou. Por favor, altere sua senha e faça login novamente.',
changePasswordMsg: 'Senha expirada, por favor, modifique a senha antes de fazer login.', changePasswordMsg: 'Sua senha expirou. Por favor, altere sua senha e faça login novamente.',
upDateMsg: 'O firmware está sendo atualizado, por favor, aguarde um momento.' upDateMsg: 'O firmware está sendo atualizado, por favor, aguarde um momento.'
}, },
table: { table: {
productName: 'Nome do Produto', productName: 'Nome do Dispositivo',
productMode: 'Modelo do Produto', productMode: 'Modelo do Dispositivo',
serialNumber: 'Número de Série', serialNumber: 'Número de Série',
firmwareVercion: 'Versão do Firmware', firmwareVercion: 'Versão do Firmware',
deviceID: 'ID do Dispositivo', deviceID: 'ID do Dispositivo',
deviceIP: 'IP do Dispositivo', deviceIP: 'IP do Dispositivo',
gatewal: 'Gateway', gatewal: 'Gateway Padrão',
suonetMask: 'Máscara de Sub-rede', suonetMask: 'Máscara de Sub-rede',
storageSpaces: 'Espaços de Armazenamento', storageSpaces: 'Espaços de Armazenamento',
serverIP: 'IP do Servidor', serverIP: 'Endereço IP',
corverCommandDort: 'Porta de Comando do Servidor', corverCommandDort: 'Porta do servidor',
deviceCommandPort: 'Porta de Comando do Dispositivo', deviceCommandPort: 'Porta de Comando',
deviceStreamPort: 'Porta de Fluxo de Código do Terminal', deviceStreamPort: 'Porta de Fluxo',
macAddress: 'Endereço de MAC', macAddress: 'Endereço de MAC',
serverPort: 'Porta do Servidor', serverPort: 'Porta do Servidor',
isEmpty: 'não pode estar vazio', isEmpty: 'não pode estar vazio',
@ -64,6 +64,7 @@ export default {
isRight3: 'está fora do intervalo (1-9999).', isRight3: 'está fora do intervalo (1-9999).',
open: 'Ativar', open: 'Ativar',
close: 'Desativar', close: 'Desativar',
close1: 'Fechar',
save: 'Salvar', save: 'Salvar',
submit: 'Enviar', submit: 'Enviar',
toTop: 'Voltar ao topo', toTop: 'Voltar ao topo',
@ -71,33 +72,40 @@ export default {
clear: 'Limpar Tela', clear: 'Limpar Tela',
refresh: 'Atualização Automática', refresh: 'Atualização Automática',
update: 'Atualizar', update: 'Atualizar',
choose: 'Escolher', choose: 'Navegar',
tips: 'Dica', tips: 'Dica',
NetworkPacketCapture: 'Captura de pacotes de rede',
CapturingPacket: 'Captura de pacotes em andamento (máximo de 10 MB)...',
PacketCaptureHasBeenStopped: 'A captura de pacotes foi interrompida.',
StartPacketCapture: 'Começar',
StopPacketCapture: 'Parar',
Download: 'Download',
Delete: 'Excluir',
factorySettings: 'Restaurar Configurações de Fábrica', factorySettings: 'Restaurar Configurações de Fábrica',
routerRestart: 'Reiniciar Dispositivo', routerRestart: 'Reiniciar',
SIPserver: 'IP do Servidor SIP', SIPserver: 'IP do Servidor SIP',
SIPUserName: 'Nome de Usuário SIP', SIPUserName: 'Nome de Usuário SIP',
SIPPassword: 'Senha SIP', SIPPassword: 'Senha SIP',
programTip: programTip:
'Dica: o tamanho total dos arquivos enviados não pode exceder a capacidade do espaço de armazenamento do dispositivo!', 'Dica: O tamanho total dos arquivos enviados não pode exceder a capacidade de armazenamento.',
firmwareUpdateTip: firmwareUpdateTip:
'Dica: A atualização do firmware pode melhorar o desempenho e as funções do equipamento apenas quando a versão corresponder. Caso contrário, o hardware pode não funcionar! Por favor use com cuidado!', 'Dica: A atualização do firmware só melhora o desempenho e a funcionalidade do dispositivo se a versão do firmware for compatível. Caso contrário, o equipamento pode não funcionar corretamente! Use com cautela!',
factoryTip: factoryTip:
'Após retornar às configurações de fábrica, a configuração do dispositivo voltará ao estado de fábrica. Use com cuidado!', 'Após restaurar as configurações de fábrica, a configuração do dispositivo será restaurada ao seu estado original de fábrica. Use com cautela!',
routerRestartTips: routerRestartTips:
'O dispositivo está prestes a reiniciar. Tem certeza de que deseja continuar?', 'Tem certeza de que deseja reiniciar o dispositivo?',
programDeteleTip: 'Confirmar exclusão deste arquivo?', programDeteleTip: 'Tem certeza de que deseja excluir?',
logDeteleTip: 'Confirmar exclusão deste registro?', logDeteleTip: 'Tem certeza de que deseja excluir?',
freeSpace: 'Espaço Livre', freeSpace: 'Espaço Livre',
chooseFile: 'Arquivo de Atualização', chooseFile: 'Arquivo de Atualização',
microphoneSwitch: 'Microfone', microphoneSwitch: 'Microfone',
factorySettingsTips: factorySettingsTips:
'O endereço IP padrão do dispositivo no estado de fábrica é 192.168.1.108. Após a restauração, você precisa fazer login novamente.', 'O endereço IP padrão do dispositivo é 192.168.1.108. Você precisará fazer login novamente após restaurar as configurações de fábrica.', // A versão base da ramificação LX é 192.168.1.101, enquanto as outras versões base são 192.168.1.108
fileUpload: 'Carregando arquivo...', fileUpload: 'Carregando arquivo...',
fileSave: 'Salvando...', fileSave: 'Salvando...',
routerRestartIng: 'Reiniciando Dispositivo...', routerRestartIng: 'Dispositivo reiniciando...',
upDateTips: upDateTips:
'O firmware está sendo atualizado, por favor, mantenha a rede conectada, não desligue a energia e atualize a página da web.', 'O firmware está sendo atualizado. Mantenha a conexão de rede, desligue o dispositivo e atualize a página.',
dynamicTips1: 'Cabeçalho fixo, ordenado pela ordem do cabeçalho', dynamicTips1: 'Cabeçalho fixo, ordenado pela ordem do cabeçalho',
dynamicTips2: 'Cabeçalho não fixo, ordenado por ordem de clique', dynamicTips2: 'Cabeçalho não fixo, ordenado por ordem de clique',
dragTips1: 'Ordem padrão', dragTips1: 'Ordem padrão',
@ -134,17 +142,17 @@ export default {
upload: 'Enviar', upload: 'Enviar',
fileName: 'Nome do Programa', fileName: 'Nome do Programa',
fileEditTip: fileEditTip:
'O nome do arquivo não pode estar vazio e o formato do arquivo não pode ser modificado!', 'O nome do arquivo não pode estar vazio e o formato do arquivo não pode ser modificado.',
fileSizeTip: 'O tamanho do arquivo enviado não pode exceder 5MB!', fileSizeTip: 'O tamanho do arquivo enviado não pode exceder 40 MB.',
fileTypeTip: 'O arquivo enviado só pode estar no formato MP3!', fileTypeTip: 'Somente arquivos no formato MP3 podem ser enviados.',
updateFileTypeTip: 'O arquivo enviado só pode estar no formato Bin!', updateFileTypeTip: 'O arquivo enviado só pode estar no formato Bin.',
fileSurplusSizeTip: 'Espaço de armazenamento restante insuficiente!', fileSurplusSizeTip: 'Espaço de armazenamento insuficiente!',
upDateTip: 'Por favor, selecione um arquivo antes de atualizar!', upDateTip: 'Por favor, selecione um arquivo antes de atualizar.',
audio: 'Formato de Áudio', audio: 'Formato de Áudio',
playStatus: 'Status de Reprodução', playStatus: 'Status de Reprodução',
microphone: 'Interruptor MacPhen incorporado', microphone: 'Interruptor MacPhen incorporado',
aoVol: 'Volume de Alto-falante', aoVol: 'Volume de Reprodução',
aiVol: 'Volume do Microfone', aiVol: 'Volume do Microfone',
auth: 'Autenticação', auth: 'Autenticação',
@ -170,9 +178,9 @@ export default {
llssCode: 'A conta foi logada em outro lugar. Deseja fazer logout forçado?', // 604code llssCode: 'A conta foi logada em outro lugar. Deseja fazer logout forçado?', // 604code
lylCode: 'A senha antiga está errada.', // 610code lylCode: 'A senha antiga está errada.', // 610code
lyyCode: 'A nova senha deve ser diferente da senha antiga.', // 611code lyyCode: 'A nova senha deve ser diferente da senha antiga.', // 611code
lelCode: 'O upload do arquivo falhou porque não pode ser reproduzido.', // 620code lelCode: 'O envio do arquivo falhou porque não se trata de um arquivo MP3 reproduzível.', // 620code
leyCode: 'O upload do arquivo falhou porque um arquivo com o mesmo nome já existe.', // 621code leyCode: 'O upload do arquivo falhou porque um arquivo com o mesmo nome já existe.', // 621code
leeCode: 'O upload do arquivo falhou devido a uma falha na rede.', // 622code leeCode: 'O envio do arquivo falhou devido a um erro de rede.', // 622code
lesCode: 'O arquivo não existe, por favor, atualize.', // 623Code lesCode: 'O arquivo não existe, por favor, atualize.', // 623Code
lessCode: 'Falha ao renomear, evite usar caracteres especiais.', // 624Code lessCode: 'Falha ao renomear, evite usar caracteres especiais.', // 624Code
lewCode: 'Falha ao excluir, porque o arquivo está sendo reproduzido.', // 625Code lewCode: 'Falha ao excluir, porque o arquivo está sendo reproduzido.', // 625Code
@ -184,12 +192,20 @@ export default {
lsseCode: 'A atualização do firmware foi concluída, o dispositivo será reiniciado em breve.', // 642code lsseCode: 'A atualização do firmware foi concluída, o dispositivo será reiniciado em breve.', // 642code
lssCode: 'Falha ao atualizar o firmware, porque o arquivo não pode ser analisado.', // 643code lssCode: 'Falha ao atualizar o firmware, porque o arquivo não pode ser analisado.', // 643code
lsssCode: 'Falha ao atualizar o firmware, porque a versão do arquivo é muito baixa.', // 644code lsssCode: 'Falha ao atualizar o firmware, porque a versão do arquivo é muito baixa.', // 644code
WAN_IP_AddressIP: 'Nome de domínio de rede ampla', WAN_IP_AddressIP: 'Nome de Domínio NAT',
WAN_IP_Address: 'Endereço IP de rede ampla', WAN_IP_Address: 'Endereço IP NAT',
WAN_IP_DomainName: 'Nome de domínio de rede de longa distância', WAN_IP_DomainName: 'Nome de Domínio NAT',
WAN_IP_Type: 'Formato de rede de longa distância', WAN_IP_Type: 'Tipo de NAT',
WAN_Port: 'Número da porta pública', WAN_Port: 'ONVIF Porta NAT',
WAN_RTSP_Port: 'Porta RTSP pública' WAN_RTSP_Port: 'RTSP Porta NAT',
httpPort: 'Porta da API HTTP',
webPort: 'Porta WEB',
rtspPort: 'Porta RTSP',
rtpPort: 'Porta RTP',
portConflict: ' Conflito',
PortNumbersCannotBeTheSame: 'As portas não podem ser iguais',
SIP_Port:'Porta SIP',
SIP_RTP_Port:'Porta SIP RTP',
}, },
theme: { theme: {
change: 'Mudar Tema', change: 'Mudar Tema',

View File

@ -70,6 +70,13 @@ export default {
refresh: '自动刷新', refresh: '自动刷新',
choose: '选择', choose: '选择',
tips: '提示', tips: '提示',
NetworkPacketCapture: '网络抓包',
CapturingPacket: '正在抓包(最大10兆)......',
PacketCaptureHasBeenStopped: '抓包已停止保存为tcpdump.pcap。',
StartPacketCapture: '开始',
StopPacketCapture: '停止',
Download: '下载',
Delete: '删除',
factorySettings: '恢复出厂设置', factorySettings: '恢复出厂设置',
routerRestart: '重启设备', routerRestart: '重启设备',
SIPserver: 'SIP服务器', SIPserver: 'SIP服务器',
@ -181,7 +188,15 @@ export default {
WAN_IP_DomainName: '广域网域名', WAN_IP_DomainName: '广域网域名',
WAN_IP_Type: '广域网格式', WAN_IP_Type: '广域网格式',
WAN_Port: '公网端口号', WAN_Port: '公网端口号',
WAN_RTSP_Port: '公网RTSP端口号' WAN_RTSP_Port: '公网RTSP端口号',
httpPort: 'http端口',
webPort: 'Web端口',
rtspPort: 'RTSP端口',
rtpPort: 'RTP端口',
portConflict: ' 冲突',
PortNumbersCannotBeTheSame: '端口号不能相同',
SIP_Port:'SIP端口',
SIP_RTP_Port:'SIP RTP端口',
}, },
theme: { theme: {
change: '换肤', change: '换肤',

View File

@ -56,6 +56,9 @@ export default {
// TODO: refactor with render function // TODO: refactor with render function
this.onlyOneChild = null this.onlyOneChild = null
return {} return {}
},
mounted() {
}, },
methods: { methods: {
hasOneShowingChild(children = [], parent) { hasOneShowingChild(children = [], parent) {

View File

@ -12,7 +12,12 @@
:collapse-transition="false" :collapse-transition="false"
mode="vertical" mode="vertical"
> >
<sidebar-item v-for="route in permission_routes" :key="route.path" :item="route" :base-path="route.path" /> <sidebar-item
v-for="route in filteredRoutes"
:key="route.path"
:item="route"
:base-path="route.path"
/>
</el-menu> </el-menu>
</el-scrollbar> </el-scrollbar>
</div> </div>
@ -26,11 +31,21 @@ import variables from '@/styles/variables.scss'
export default { export default {
components: { SidebarItem, Logo }, components: { SidebarItem, Logo },
mounted(){
console.log(this.permission_routes);
// if(this.alarmPage === 'off'){
//
// }
},
computed: { computed: {
...mapGetters([ ...mapGetters([
'permission_routes', 'permission_routes',
'sidebar' 'sidebar',
'alarmPage'
]), ]),
filteredRoutes() {
return this.permission_routes
},
activeMenu() { activeMenu() {
const route = this.$route const route = this.$route
const { meta, path } = route const { meta, path } = route

View File

@ -29,6 +29,7 @@
import ScrollPane from './ScrollPane' import ScrollPane from './ScrollPane'
import { generateTitle } from '@/utils/i18n' import { generateTitle } from '@/utils/i18n'
import path from 'path' import path from 'path'
import { mapGetters } from 'vuex'
export default { export default {
components: { ScrollPane }, components: { ScrollPane },
@ -42,6 +43,9 @@ export default {
} }
}, },
computed: { computed: {
...mapGetters([
'alarmPage'
]),
visitedViews() { visitedViews() {
return this.$store.state.tagsView.visitedViews return this.$store.state.tagsView.visitedViews
}, },

View File

@ -21,7 +21,8 @@ function hasPermission(roles, route) {
*/ */
export function filterAsyncRoutes(routes, roles) { export function filterAsyncRoutes(routes, roles) {
const res = [] const res = []
const data = JSON.parse(getLoginData())?.menuRole || 1 const loginData = getLoginData()
const data = loginData?.menuRole || 1
routes.forEach(route => { routes.forEach(route => {
const tmp = { ...route } const tmp = { ...route }
if (hasPermission(roles, tmp)) { if (hasPermission(roles, tmp)) {

View File

@ -20,6 +20,7 @@ const mutations = {
}, },
SET_LOGIN_DATA: (state, data) => { SET_LOGIN_DATA: (state, data) => {
state.loginData = data state.loginData = data
console.log(state, data)
setLoginData(data) setLoginData(data)
}, },
SET_KEY: (state, key) => { SET_KEY: (state, key) => {
@ -55,7 +56,10 @@ const actions = {
commit('SET_TOKEN', data.token) commit('SET_TOKEN', data.token)
commit('SET_NAME', username) commit('SET_NAME', username)
data.menuRole = 1 data.menuRole = 1
if (data.alarmPage === 'off') data.menuRole = 2 if (data.alarmPage !== 'off') {
data.menuRole = 2
// console.log('data.alarmPage',data.alarmPage)
}
commit('SET_LOGIN_DATA', data) commit('SET_LOGIN_DATA', data)
if (response.code === 200) { if (response.code === 200) {
resolve() resolve()

View File

@ -15,11 +15,14 @@ export function setToken(token) {
} }
export function getLoginData() { export function getLoginData() {
return Cookies.get(LoginData) const data = Cookies.get(LoginData)
return data ? JSON.parse(data) : null
// return Cookies.get(LoginData)
} }
export function setLoginData(data) { export function setLoginData(data) {
return Cookies.set(LoginData, data) // return Cookies.set(LoginData, data)
return Cookies.set(LoginData, JSON.stringify(data))
} }
export function getKey() { export function getKey() {

View File

@ -4,15 +4,19 @@
{{ $t("route.agreement") }} {{ $t("route.agreement") }}
</div> </div>
<div class="pageCon pageCon2"> <div class="pageCon pageCon2">
<el-tabs v-model="selectIndex" style="margin-top: 15px"> <el-tabs
v-model="selectIndex"
style="margin-top: 15px"
>
<el-tab-pane <el-tab-pane
v-for="(item, index) in tabOptions" v-for="(item, index) in tabOptions"
:key="index" :key="item.key"
:label="item.label" :label="item.label"
:name="item.key"
/> />
</el-tabs> </el-tabs>
<el-form <el-form
v-show="selectIndex === '2'" v-show="selectIndex === '0'"
class="detail-form agree-form" class="detail-form agree-form"
label-width="180px" label-width="180px"
label-position="right" label-position="right"
@ -44,14 +48,6 @@
<el-form-item :label="$t('table.deviceStreamPort')"> <el-form-item :label="$t('table.deviceStreamPort')">
<el-input v-model="formUDPData.corestreamPort" /> <el-input v-model="formUDPData.corestreamPort" />
</el-form-item> </el-form-item>
<el-form-item :label="$t('table.httpAuth')">
<el-radio v-model="formUDPData.httpApiAuth" label="on">{{
$t("table.open")
}}</el-radio>
<el-radio v-model="formUDPData.httpApiAuth" label="off">{{
$t("table.close")
}}</el-radio>
</el-form-item>
<el-form-item label="SSH"> <el-form-item label="SSH">
<el-radio v-model="formUDPData.ssh" label="on">{{ <el-radio v-model="formUDPData.ssh" label="on">{{
$t("table.open") $t("table.open")
@ -100,9 +96,15 @@
<svg-icon :icon-class="sip2PasswordType === 'password' ? 'eye' : 'eye-open'" /> <svg-icon :icon-class="sip2PasswordType === 'password' ? 'eye' : 'eye-open'" />
</span> </span>
</el-form-item> </el-form-item>
<el-form-item :label="$t('table.SIP_Port')">
<el-input v-model="formSIPData.sipPort" type="number" :min="1" :max="65535"/>
</el-form-item>
<el-form-item :label="$t('table.SIP_RTP_Port')">
<el-input v-model="formSIPData.sipRtpPort" type="number" :min="1" :max="65535"/>
</el-form-item>
</el-form> </el-form>
<el-form <el-form
v-show="selectIndex === '0'" v-show="selectIndex === '2'"
class="detail-form agree-form" class="detail-form agree-form"
label-width="180px" label-width="180px"
label-position="right" label-position="right"
@ -143,8 +145,8 @@
<el-form-item :label="$t('table.audio')"> <el-form-item :label="$t('table.audio')">
<el-select <el-select
v-model="formONVIFData.rtspAudioType" v-model="formONVIFData.rtspAudioType"
style="width:350px;" style="width:100%;"
placeholder="请选择" placeholder="Please select"
@change="selectChange" @change="selectChange"
> >
<el-option <el-option
@ -163,10 +165,27 @@
$t("table.close") $t("table.close")
}}</el-radio> }}</el-radio>
</el-form-item> </el-form-item>
<el-form-item :label="$t('table.rtspPort')">
<el-input v-model="formONVIFData.rtspPort" type="number" :min="0" :max="65535" />
</el-form-item>
<el-form-item :label="$t('table.rtpPort')">
<div style="display: flex; align-items: center; gap: 10px;">
<el-input
v-model="formONVIFData.rtpPort"
type="number"
:min="0"
:max="65535"
style="flex: 1;"
/>
<span style="color: #909399; font-size: 14px; white-space: nowrap;">
{{ Number(formONVIFData.rtpPort) }} - {{ Number(formONVIFData.rtpPort) + 5 || 5 }}
</span>
</div>
</el-form-item>
<el-form-item :label="$t('table.WAN_IP_Type')"> <el-form-item :label="$t('table.WAN_IP_Type')">
<el-select <el-select
v-model="formONVIFData.wanType" v-model="formONVIFData.wanType"
style="width:350px;" style="width:100%;"
@change="selectChangeNet" @change="selectChangeNet"
> >
<el-option <el-option
@ -190,6 +209,28 @@
<el-input v-model="formONVIFData.wanRTSPPort" type="number" :min="0" :max="65535" /> <el-input v-model="formONVIFData.wanRTSPPort" type="number" :min="0" :max="65535" />
</el-form-item> </el-form-item>
</el-form> </el-form>
<el-form
v-show="selectIndex === '3'"
class="detail-form agree-form"
label-width="180px"
label-position="right"
:model="formHTTPData"
>
<el-form-item :label="$t('table.webPort')">
<el-input v-model="formHTTPData.webPort" type="number" :min="0" :max="65535" />
</el-form-item>
<el-form-item :label="$t('table.httpPort')">
<el-input v-model="formHTTPData.httpPort" type="number" :min="0" :max="65535" />
</el-form-item>
<el-form-item :label="$t('table.httpAuth')">
<el-radio v-model="formHTTPData.httpApiAuth" label="on">{{
$t("table.open")
}}</el-radio>
<el-radio v-model="formHTTPData.httpApiAuth" label="off">{{
$t("table.close")
}}</el-radio>
</el-form-item>
</el-form>
<el-button <el-button
type="primary" type="primary"
style="width: 10%; margin-left: 40%;margin-top: 20px;" style="width: 10%; margin-left: 40%;margin-top: 20px;"
@ -205,6 +246,7 @@
import { mapGetters } from 'vuex' import { mapGetters } from 'vuex'
import { deviceInfo, deviceEdit } from '@/api/index.js' import { deviceInfo, deviceEdit } from '@/api/index.js'
import { encryptData, decryptData } from '@/utils/encryption/entrypt' import { encryptData, decryptData } from '@/utils/encryption/entrypt'
export default { export default {
name: 'Agreement', name: 'Agreement',
data() { data() {
@ -222,6 +264,10 @@ export default {
{ {
label: 'UDP', label: 'UDP',
key: '0' key: '0'
},
{
label: 'HTTP',
key: '3'
} }
], ],
NetType: [ NetType: [
@ -234,7 +280,7 @@ export default {
key: '1' key: '1'
} }
], ],
selectIndex: '0', selectIndex: '2',
formUDPData: { formUDPData: {
udp: '', udp: '',
id: '', id: '',
@ -243,7 +289,6 @@ export default {
serverPort: '', serverPort: '',
instructPort: '', instructPort: '',
corestreamPort: '', corestreamPort: '',
httpApiAuth: '',
ssh: '' ssh: ''
}, },
formSIPData: { formSIPData: {
@ -253,7 +298,9 @@ export default {
sipAddress: '', sipAddress: '',
sipUsername: '', sipUsername: '',
sipPassword: '', sipPassword: '',
sipPassword2: '' sipPassword2: '',
sipPort: '',
sipRtpPort: ''
}, },
formONVIFData: { formONVIFData: {
onvif: '', onvif: '',
@ -270,7 +317,14 @@ export default {
wanOnvifPort: '', wanOnvifPort: '',
wanRTSPPort: '', wanRTSPPort: '',
wanDomainName: '', wanDomainName: '',
wanType: '0' wanType: '0',
rtspPort: '',
rtpPort: ''
},
formHTTPData: {
httpPort: '',
webPort: '',
httpApiAuth: ''
}, },
sipPasswordType: 'password', sipPasswordType: 'password',
@ -282,9 +336,7 @@ export default {
} }
}, },
computed: { computed: {
...mapGetters([ ...mapGetters(['udpPage']) // 'on' 'off'
'udpPage'
])
}, },
mounted() { mounted() {
if (this.udpPage === 'off') { if (this.udpPage === 'off') {
@ -343,7 +395,6 @@ export default {
this.formUDPData.serverPort = res.data.serverPort this.formUDPData.serverPort = res.data.serverPort
this.formUDPData.instructPort = res.data.instructPort this.formUDPData.instructPort = res.data.instructPort
this.formUDPData.corestreamPort = res.data.corestreamPort this.formUDPData.corestreamPort = res.data.corestreamPort
this.formUDPData.httpApiAuth = res.data.httpApiAuth
this.formUDPData.ssh = res.data.ssh this.formUDPData.ssh = res.data.ssh
this.formSIPData.sip = res.data.sip this.formSIPData.sip = res.data.sip
@ -354,6 +405,8 @@ export default {
res.data.sipPassword = decryptData(res.data.sipPassword) res.data.sipPassword = decryptData(res.data.sipPassword)
this.formSIPData.sipPassword = res.data.sipPassword this.formSIPData.sipPassword = res.data.sipPassword
this.formSIPData.sipPassword2 = res.data.sipPassword this.formSIPData.sipPassword2 = res.data.sipPassword
this.formSIPData.sipPort = res.data.sipPort
this.formSIPData.sipRtpPort = res.data.sipRtpPort
this.formONVIFData.onvif = res.data.onvif this.formONVIFData.onvif = res.data.onvif
this.formONVIFData.id = res.data.id this.formONVIFData.id = res.data.id
@ -366,6 +419,8 @@ export default {
this.formONVIFData.rtspAudioTypeArr = res.data.rtspAudioTypeArr this.formONVIFData.rtspAudioTypeArr = res.data.rtspAudioTypeArr
this.formONVIFData.rtspAudioType = res.data.rtspAudioType this.formONVIFData.rtspAudioType = res.data.rtspAudioType
this.formONVIFData.onvifAuth = res.data.onvifAuth this.formONVIFData.onvifAuth = res.data.onvifAuth
this.formONVIFData.rtspPort = res.data.rtspPort
this.formONVIFData.rtpPort = res.data.rtpPort
this.formONVIFData.wanIP = res.data.wanIP this.formONVIFData.wanIP = res.data.wanIP
this.formONVIFData.wanOnvifPort = res.data.wanOnvifPort this.formONVIFData.wanOnvifPort = res.data.wanOnvifPort
@ -373,6 +428,11 @@ export default {
this.formONVIFData.wanDomainName = res.data.wanDomainName this.formONVIFData.wanDomainName = res.data.wanDomainName
this.formONVIFData.wanType = res.data.wanType this.formONVIFData.wanType = res.data.wanType
this.formHTTPData.httpApiAuth = res.data.httpApiAuth
this.formHTTPData.httpPort = res.data.httpPort
this.formHTTPData.webPort = res.data.webPort
// console.log('data', res.data)
this.$forceUpdate() this.$forceUpdate()
} else { } else {
this.$message.error(res.message) this.$message.error(res.message)
@ -384,7 +444,56 @@ export default {
const portRegex = /^(1\d{4}|[2-4]\d{4}|49999)$/ const portRegex = /^(1\d{4}|[2-4]\d{4}|49999)$/
const portRegex2 = /^(?:[2-9]\d{0,3}|1\d{0,3}|9999)$/ const portRegex2 = /^(?:[2-9]\d{0,3}|1\d{0,3}|9999)$/
const ipv4Regex = /^(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/ const ipv4Regex = /^(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/
if (this.selectIndex === '2') { const ports = [
this.formHTTPData.webPort,
this.formHTTPData.httpPort,
this.formONVIFData.onvifPort,
this.formONVIFData.rtspPort,
this.formONVIFData.rtpPort,
this.formSIPData.sipPort,
this.formSIPData.sipRtpPort
]
console.log('ports', ports)
// 使 HashMap - O(n)
const portNames = ['webPort', 'httpPort', 'onvifPort', 'rtspPort', 'rtpPort', 'sipPort', 'sipRtpPort']
const portMap = new Map()
const conflicts = []
for (let i = 0; i < ports.length; i++) {
const portValue = Number(ports[i])
//
if (ports[i] === '' || ports[i] === null || ports[i] === undefined || isNaN(portValue)) {
continue
}
//
if (portMap.has(portValue)) {
const existingPort = portMap.get(portValue)
conflicts.push({
port1: { name: existingPort.name, value: existingPort.value, index: existingPort.index },
port2: { name: portNames[i], value: ports[i], index: i }
})
} else {
// Map
portMap.set(portValue, { name: portNames[i], value: ports[i], index: i })
}
}
//
if (conflicts.length > 0) {
const conflictMessages = conflicts.map(item =>
`${item.port1.name}(${item.port1.value}) & ${item.port2.name}(${item.port2.value})`
)
this.$message({
type: 'warning',
message: this.$i18n.t('table.PortNumbersCannotBeTheSame') + ' : ' + conflictMessages.join(', ')
})
return
}
if (this.selectIndex === '0') {
param = { param = {
...this.formUDPData ...this.formUDPData
} }
@ -444,7 +553,8 @@ export default {
}) })
return return
} }
} else if (this.selectIndex === '1') { }
else if (this.selectIndex === '1') {
param = { param = {
...this.formSIPData ...this.formSIPData
} }
@ -473,7 +583,8 @@ export default {
} }
param.sipPassword = encryptData(param.sipPassword) param.sipPassword = encryptData(param.sipPassword)
param.sipPassword2 = encryptData(param.sipPassword2) param.sipPassword2 = encryptData(param.sipPassword2)
} else if (this.selectIndex === '0') { }
else if (this.selectIndex === '2') {
param = { param = {
...this.formONVIFData ...this.formONVIFData
} }
@ -528,8 +639,41 @@ export default {
}) })
return return
} }
if (!param.rtspPort) {
this.$message({
type: 'warning',
message: this.$i18n.t('table.rtspPort') + this.$i18n.t('table.isEmpty')
})
return
}
if (!param.rtpPort) {
this.$message({
type: 'warning',
message: this.$i18n.t('table.rtpPort') + this.$i18n.t('table.isEmpty')
})
return
}
} }
console.log(param) else if (this.selectIndex === '3') {
param = {
...this.formHTTPData
}
if (!param.webPort) {
this.$message({
type: 'warning',
message: this.$i18n.t('table.webPort') + this.$i18n.t('table.isEmpty')
})
return
}
if (!param.httpPort) {
this.$message({
type: 'warning',
message: this.$i18n.t('table.httpPort') + this.$i18n.t('table.isEmpty')
})
return
}
}
// console.log(param)
deviceEdit(param).then((res) => { deviceEdit(param).then((res) => {
if (res.code === 200) { if (res.code === 200) {
this.$message({ this.$message({
@ -543,10 +687,14 @@ export default {
}) })
} }
}) })
},
changeTab(item, index) {
console.log(item, index)
} }
} }
} }
</script> </script>
<style lang="scss"> <style lang="scss">
.agree-form .el-form-item { .agree-form .el-form-item {
width: 50%; width: 50%;
@ -565,7 +713,6 @@ export default {
z-index: 99; z-index: 99;
} }
} }
.pageCon2{ .pageCon2{
padding-bottom: 120px; padding-bottom: 120px;
} }

View File

@ -23,16 +23,48 @@
<!-- <el-button type="primary" style="margin-top: 48px;" @click="factorySetting"> <!-- <el-button type="primary" style="margin-top: 48px;" @click="factorySetting">
{{ $t('table.factorySettings') }} {{ $t('table.factorySettings') }}
</el-button> --> </el-button> -->
<div class="formbox">
<div class="formbox-l">{{ $t('table.NetworkPacketCapture') }}</div>
<el-button type="primary" v-if="DataDB.status === 0 || DataDB.status === 2" @click.stop="StartPacketCapture(1)">
{{ $t('table.StartPacketCapture') }}
</el-button>
<el-button type="danger" v-else @click.stop="StartPacketCapture(0)">
{{ $t('table.StopPacketCapture') }}
</el-button>
<el-button type="primary" @click.stop="DownloadFile" :disabled="DataDB.status !== 2">
{{ $t('table.Download') }}
</el-button>
<el-button type="primary" @click.stop="DeletePacketCaptureRecords" :disabled="DataDB.status !== 2">
{{ $t('table.Delete') }}
</el-button>
<span v-if="DataDB.status === 1" class="SpanBox1">
{{ $t('table.CapturingPacket') }}
</span>
<span v-else-if="DataDB.status === 2" class="SpanBox1">
{{ $t('table.PacketCaptureHasBeenStopped') }}
</span>
</div>
</div> </div>
</div> </div>
</template> </template>
<script> <script>
import { deviceReset, deviceReboot } from '@/api/index.js' import {
deviceReset,
deviceReboot,
getPacketCaptureInfo,
deletePacketCapture,
startPacketCapture,
stopPacketCapture
} from '@/api/index.js'
export default { export default {
name: 'FactorySetting', name: 'FactorySetting',
data() { data() {
return { return {
DataDB: {
status: 0,
file: ''
}
} }
}, },
mounted() {}, mounted() {},
@ -103,6 +135,49 @@ export default {
}).catch(() => { }).catch(() => {
}) })
},
getPacketInfo() {
getPacketCaptureInfo({}).then(res => {
const data = res.data
this.DataDB.status = data.status
this.DataDB.file = data.file
}).catch(() => {
})
},
StartPacketCapture(Flag) {
if (Flag === 1) {
startPacketCapture({}).then(res => {
setTimeout(() => {
this.getPacketInfo()
}, 300)
})
} else if (Flag === 0) {
stopPacketCapture({}).then(res => {
setTimeout(() => {
this.getPacketInfo()
}, 300)
})
}
},
DeletePacketCaptureRecords() {
const data = {
name: this.DataDB.file
}
// console.log(data);
deletePacketCapture(data).then(res => {
this.DataDB.status = 0
this.$message.success(this.$i18n.t('table.Delete') + this.$i18n.t('table.success'))
}).catch(() => {
})
},
DownloadFile() {
if (this.DataDB.file === '') {
return
}
const URL = '/prod-api/pcap/' + this.DataDB.file
window.open(URL)
} }
} }
} }

View File

@ -103,7 +103,7 @@ export default {
}) })
return return
} }
if (files.size / 1024 / 1024 > 5) { if (files.size / 1024 / 1024 > 30) {
this.$message({ this.$message({
type: 'error', type: 'error',
message: this.$i18n.t('table.fileSizeTip') message: this.$i18n.t('table.fileSizeTip')

View File

@ -22,7 +22,7 @@
<el-table-column <el-table-column
:label="$t('table.actions')" :label="$t('table.actions')"
align="center" align="center"
width="160" width="220"
> >
<template slot-scope="scope"> <template slot-scope="scope">
<el-button <el-button
@ -59,11 +59,11 @@
<el-button class="ftbtn ftbtn2" @click="toBottom">{{ <el-button class="ftbtn ftbtn2" @click="toBottom">{{
$t("table.toBottom") $t("table.toBottom")
}}</el-button> }}</el-button>
<el-button class="ftbtn ftbtn2" @click="clearCon">{{ <!-- <el-button class="ftbtn ftbtn2" @click="clearCon">{{-->
$t("table.clear") <!-- $t("table.clear")-->
}}</el-button> <!-- }}</el-button>-->
<el-button class="ftbtn ftbtn3" @click="closeDia">{{ <el-button class="ftbtn ftbtn3" @click="closeDia">{{
$t("table.close") $t("table.close1")
}}</el-button> }}</el-button>
</div> </div>
</el-dialog> </el-dialog>
@ -180,9 +180,9 @@ export default {
toBottom() { toBottom() {
this.$refs.scrollbar.wrap.scrollTop = this.$refs.scrollbar.wrap.scrollHeight this.$refs.scrollbar.wrap.scrollTop = this.$refs.scrollbar.wrap.scrollHeight
}, },
clearCon() { // clearCon() {
this.logData = '' // this.logData = ''
}, // },
closeDia() { closeDia() {
this.dialogVisible = false this.dialogVisible = false
this.rowName = '' this.rowName = ''

View File

@ -14,42 +14,42 @@
<el-scrollbar> <el-scrollbar>
<div class="operatebox"> <div class="operatebox">
<el-upload <el-upload
class="upload-demo" class="upload-demo"
action="#" action="#"
:auto-upload="false" :auto-upload="false"
accept=".mp3, .MP3, .Mp3, .mP3" accept=".mp3, .MP3, .Mp3, .mP3"
:show-file-list="false" :show-file-list="false"
:on-change="handleChange" :on-change="handleChange"
> >
<el-button <el-button
type="primary" type="primary"
style="width: 92px; margin-left: 12px;margin-top: 15px;margin-right: 10px;" style="width: 92px; margin-left: 12px;margin-top: 15px;margin-right: 10px;"
> >
{{ $t("table.upload") }} {{ $t("table.upload") }}
</el-button> </el-button>
</el-upload> </el-upload>
<el-form <el-form
class="detail-form program-form" class="detail-form program-form"
label-width="180px" label-width="180px"
label-position="right" label-position="right"
:model="formData" :model="formData"
> >
<el-form-item :label="$t('table.aiVol')"> <el-form-item :label="$t('table.aiVol')">
<el-slider <el-slider
v-model="formData.aiVol" v-model="formData.aiVol"
:step="1" :step="1"
:max="10" :max="10"
@change="aiVolChange" style="width: 120px;"
style="width: 120px;" @change="aiVolChange"
/> />
</el-form-item> </el-form-item>
<el-form-item :label="$t('table.aoVol')" style="margin-left: 12px;"> <el-form-item :label="$t('table.aoVol')" style="margin-left: 12px;">
<el-slider <el-slider
v-model="formData.aoVol" v-model="formData.aoVol"
:step="1" :step="1"
:max="10" :max="10"
@change="aoVolChange" style="width: 120px;"
style="width: 120px;" @change="aoVolChange"
/> />
</el-form-item> </el-form-item>
</el-form> </el-form>
@ -255,7 +255,7 @@ export default {
}) })
return return
} }
if (files.size / 1024 / 1024 > 5) { if (files.size / 1024 / 1024 > 30) {
this.$message({ this.$message({
type: 'error', type: 'error',
message: this.$i18n.t('table.fileSizeTip') message: this.$i18n.t('table.fileSizeTip')