From 285c9b660b593fe5785060751ef91a3d51f96732 Mon Sep 17 00:00:00 2001 From: TsMask <340112800@qq.com> Date: Sat, 23 Nov 2024 11:18:40 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=AE=9E=E8=AE=AD=E6=95=99=E5=AD=A6?= =?UTF-8?q?=E6=A8=A1=E5=9D=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- practical_training/README.md | 27 + practical_training/i18n/locales/en-US.ts | 2197 +++++++++++++++++ practical_training/i18n/locales/zh-CN.ts | 2197 +++++++++++++++++ .../configManage/configParamApply/index.vue | 713 ++++++ .../components/OpeateDrawer.vue | 327 +++ .../hooks/useConfigArray.ts | 342 +++ .../hooks/useConfigArrayChild.ts | 349 +++ .../hooks/useConfigList.ts | 139 ++ .../configParamTreeTable/hooks/useOptions.ts | 192 ++ .../hooks/usePtOptions.ts | 228 ++ .../configParamTreeTable/index.vue | 1249 ++++++++++ .../views/configManage/neManage/index.vue | 1275 ++++++++++ .../views/configManage/neOverview/index.vue | 442 ++++ .../views/dashboard/amfUE/index.vue | 728 ++++++ .../views/dashboard/imsCDR/index.vue | 839 +++++++ .../views/dashboard/mmeUE/index.vue | 742 ++++++ .../views/dashboard/smfCDR/index.vue | 838 +++++++ .../views/dashboard/smscCDR/index.vue | 769 ++++++ .../monitor/topologyArchitecture/index.vue | 551 +++++ .../ne/neInfo/components/BackConfModal.vue | 374 +++ .../views/ne/neInfo/components/EditModal.vue | 834 +++++++ .../views/ne/neInfo/components/OAMModal.vue | 322 +++ .../views/ne/neInfo/hooks/useNeOptions.ts | 153 ++ practical_training/views/ne/neInfo/index.vue | 790 ++++++ practical_training/views/plugins/auth-user.ts | 66 + .../views/store/modules/user.ts | 171 ++ 26 files changed, 16854 insertions(+) create mode 100644 practical_training/README.md create mode 100644 practical_training/i18n/locales/en-US.ts create mode 100644 practical_training/i18n/locales/zh-CN.ts create mode 100644 practical_training/views/configManage/configParamApply/index.vue create mode 100644 practical_training/views/configManage/configParamTreeTable/components/OpeateDrawer.vue create mode 100644 practical_training/views/configManage/configParamTreeTable/hooks/useConfigArray.ts create mode 100644 practical_training/views/configManage/configParamTreeTable/hooks/useConfigArrayChild.ts create mode 100644 practical_training/views/configManage/configParamTreeTable/hooks/useConfigList.ts create mode 100644 practical_training/views/configManage/configParamTreeTable/hooks/useOptions.ts create mode 100644 practical_training/views/configManage/configParamTreeTable/hooks/usePtOptions.ts create mode 100644 practical_training/views/configManage/configParamTreeTable/index.vue create mode 100644 practical_training/views/configManage/neManage/index.vue create mode 100644 practical_training/views/configManage/neOverview/index.vue create mode 100644 practical_training/views/dashboard/amfUE/index.vue create mode 100644 practical_training/views/dashboard/imsCDR/index.vue create mode 100644 practical_training/views/dashboard/mmeUE/index.vue create mode 100644 practical_training/views/dashboard/smfCDR/index.vue create mode 100644 practical_training/views/dashboard/smscCDR/index.vue create mode 100644 practical_training/views/monitor/topologyArchitecture/index.vue create mode 100644 practical_training/views/ne/neInfo/components/BackConfModal.vue create mode 100644 practical_training/views/ne/neInfo/components/EditModal.vue create mode 100644 practical_training/views/ne/neInfo/components/OAMModal.vue create mode 100644 practical_training/views/ne/neInfo/hooks/useNeOptions.ts create mode 100644 practical_training/views/ne/neInfo/index.vue create mode 100644 practical_training/views/plugins/auth-user.ts create mode 100644 practical_training/views/store/modules/user.ts diff --git a/practical_training/README.md b/practical_training/README.md new file mode 100644 index 00000000..fd9e3e34 --- /dev/null +++ b/practical_training/README.md @@ -0,0 +1,27 @@ +# 实训教学模块 + +网元固定一套,ne_id 默认使用`001` + +## 静态资源 + +将目录下文件放置到对应目录 + +- i18n 对应覆盖 src\i18n +- views 对应覆盖 src\views + + +## 涉及文件 + +- src\i18n\locales\en-US.ts +- src\i18n\locales\zh-CN.ts +- src\views\monitor\topologyArchitecture\index.vue +- src\views\configManage\configParamTreeTable +- src\views\configManage\configParamApply +- src\views\ne\neInfo\index.vue +- src\plugins\auth-user.ts +- src\views\dashboard\amfUE\index.vue +- src\views\dashboard\mmeUE\index.vue +- src\views\dashboard\imsCDR\index.vue +- src\views\dashboard\smfCDR\index.vue +- src\views\dashboard\smscCDR\index.vue +- src\store\modules\user.ts diff --git a/practical_training/i18n/locales/en-US.ts b/practical_training/i18n/locales/en-US.ts new file mode 100644 index 00000000..3cf352c9 --- /dev/null +++ b/practical_training/i18n/locales/en-US.ts @@ -0,0 +1,2197 @@ +export default { + // 语言 + i18n: 'English', + hello: 'Hello', + welcome: 'Welcome, Core Network Management Platform', + + // 通用 + common: { + title: 'Login Platform', + desc: 'Core Network Management Platform', + loading: 'Please wait...', + inputPlease: 'Please input', + selectPlease: 'please select', + tipTitle: 'Prompt', + msgSuccess: 'Success {msg}', + errorFields: 'Please fill in the required information in {num} correctly!', + tablePaginationTotal: 'Total {total} items', + noData: "No Data", + zebra:'Tabular zebra pattern', + ok: 'Ok', + cancel: 'Cancel', + close: 'Close', + search: 'Search', + reset: 'Reset', + viewText: 'View', + getInfoFail:'Failed to obtain information', + view: 'View', + addText: 'Add', + editText: 'Edit', + deleteText: 'Delete', + downloadText: 'Download', + import:'Import', + export:'Export', + uploadText: 'Upload', + unableNull:' Cannot be empty', + moreText: 'More', + searchBarText: 'Search bar', + reloadText: 'Refresh', + columnSetText: 'Column Setting', + columnSetTitle: 'Column Display / Sorting', + sizeText: 'Density', + size: { + default: 'Default', + middle: 'Medium', + small: 'Compact', + }, + switch: { + show: 'Show', + hide: 'Hidden', + open: 'Open', + shut: 'Shut', + launch: 'Expand', + fold: 'Fold', + }, + rowId: 'ID', + createTime: 'Create Time', + updateTime: 'Update Time', + remark: 'Remark', + description: 'Description', + operate: 'More Action', + operateOk: 'Operation Successful!', + operateErr: 'Operation Failed!', + copyText: "Copy", + copyOk: 'Copy Successful!', + units: { + second: 'Second', + minute: 'Minute', + hour: 'Hour', + day: 'Day', + week: 'Week', + month: 'Month', + year: 'Year', + core: 'Core', + } + }, + + // 组件 + components: { + CronModal: { + title: "Cron Expression Generator", + addon: "Expression Preview:", + day1: "Every day", + day21: "Execute every", + day22: "days, starting from the", + day23: "day", + day31: "Cycle from", + day32: "to", + day33: "days", + day4: "Designated day (optional)", + day5: "Last day of the month", + hour1: "Hourly", + hour21: "Execute every", + hour22: "hours, starting from the", + hour23: "hour", + hour31: "Cycle time from", + hour32: "to", + hour33: "hours", + hour4: "Specified hours (multiple options available)", + minute1: "Every minute", + minute21: "Execute every", + minute22: "minutes, starting from the", + minute23: "minute", + minute31: "Cycle time from", + minute32: "to", + minute33: "minutes", + minute4: "Specified minutes (multiple options available)", + month1: "Every month", + month21: "Execute every", + month22: "months, starting from the", + month23: "month", + month31: "Cycle time from", + month32: "to", + month33: "months", + month4: "Specified months (multiple options available)", + second1: "Every second", + second21: "Execute every", + second22: "seconds, starting from the", + second23: "second", + second31: "Cycle time from", + second32: "to", + second33: "seconds", + second4: "Specify the number of seconds (multiple selectable)", + }, + UploadModal:{ + uploadTitle:'Data Import', + uploadTip:'Click to select or drag the file into the border area to upload', + allowSize:'Allowed upload file size', + allowFormat:'The formats allowed to be imported are ', + allowFilter:'Upload file size must be less than ', + onlyAllow:'Only supports upload file formats', + }, + LockScreen: { + inputPlacePwd:'Lock Screen Password', + validSucc:'Validation Passed', + validError:'Validation Failure', + backLogin:'Logout to Relogin', + backReload:'Restarting now, please wait...', + backReload2:'When ready, Your browser will automatically refresh.', + systemReset:'Resetting now, please wait...', + systemReset2:'Data information is being reset.', + }, + }, + + // 静态路由 + router: { + index: "Home", + login: "Sign In", + register: 'Registrations', + page403: 'No Access', + page404: 'Match Page Not Found', + helpDoc: 'System User Documentation', + traceTaskHLR: 'Tracking Tasks HLR', + lockScreen: 'Lock Screen', + account: { + index: "Personal Center", + profile: "Personal Info", + settings: "Personal Settings", + }, + }, + + // 校验 + valid: { + userNameReg: 'The account cannot start with a number and can contain uppercase and lowercase letters, numbers, and no less than 5 digits.', + userNamePlease: 'Please enter the correct login account', + userNameHit: 'Login account', + passwordReg: 'The password should contain at least uppercase and lowercase letters, numbers, special symbols, and no less than 6 digits.', + passwordPlease: 'Please enter the correct login password', + passwordHit: 'Login password', + passwordConfirmHit: 'Confirm login password', + phoneReg: 'Incorrect phone number', + phonePlease: 'Please enter the correct phone number', + phoneHit: 'Mobile number', + codePlease: 'Please enter the correct verification code', + codeHit: 'Verification code', + codeText: 'Obtain verification code', + codeSmsSend: 'Successfully sent, please pay attention to checking the SMS', + ipPlease: 'Please enter a valid IP address', + ipv4Reg: 'Not a valid IPv4 address', + ipv6Reg: 'Not a valid IPv6 address', + }, + + // 布局 + loayouts: { + basic: { + officialUrl: 'Official', + helpDoc: 'Doc', + }, + rightContent: { + alarm: "Active Alarms", + lock: "Lock Screen", + lockTip: "Confirmation of the lock screen?", + lockPasswd: "Unlock Password", + lockPasswdTip: "No password can be set", + fullscreen: "Full Screen", + theme: "Theme light/dark mode", + logout: "Logout", + profile: "Profile", + settings: "Settings", + }, + tabs: { + reload: "Refresh Current Tab", + more: "More Options", + closeCurrent: "Close Current Tab", + closeOther: "Close Other Tabs", + closeAll: "Close All Tabs", + } + }, + + // 页面 + views: { + index: { + normal:'Normal', + abnormal:'Abnormal', + hostName: 'Host Name', + osInfo: 'OS Info', + dbInfo: 'Database Info', + ipAddress: 'IP Address', + port: 'Port', + version: 'Version', + cpuUse: 'CPU Usage', + memoryUse: 'Memory Usage', + capability: 'Capability', + serialNum: 'Serial Number', + expiryDate: 'Expiry Date', + neStatus: 'NE status is abnormal', + runStatus:'Running Status', + mark:'Brief Information', + object:'Object', + versionNum:'Version', + systemStatus:'Status', + realNeStatus:'Status', + reloadTime:'Refresh Time', + Critical:'Critical', + Major:'Major', + Minor:'Minor', + Warning:'Warning', + Event:'Event' + }, + error: { + err403: { + ttile: 'No access', + subTitle:'Please do not perform illegal operations, you can go back to the main page or return to the', + backHome: 'Back to Home', + back: 'Back', + }, + err404: { + ttile: 'Match page not found', + subTitle:'Sorry, the page you are looking for does not exist.', + backHome: 'Back to Home', + tipTitle: "Can't find the page?", + paragraph: 'Try checking the URL for errors and then press the refresh button on your browser.', + paragraph1: 'Try to find other content in our application.', + }, + }, + login: { + tabPane1: 'Account password login', + tabPane2: 'Login with phone number', + registerBtn: 'Register an account', + loginBtn: 'Sign In', + loginSuccess: 'Login Successful', + loginMethod: 'Other login methods:', + loginMethodWX: 'WeChat Scan Login', + loginMethodQQ: 'QQ Scan Code Login', + }, + register: { + registerBtn: 'Register', + loginBtn: 'Log in with an existing account', + passwordErr: 'Please enter the correct confirmation password', + passwordConfirmErr: 'The two passwords entered do not match', + tipContent: 'Congratulations, {username} account registration succeeded!', + tipBtn: 'Go to login', + }, + account: { + settings: { + baseInfo: " Basic Info", + sex: "Gender", + sexPleace: "Please select the user's gender", + email: "Email", + emailPleace: "Please enter the correct e-mail address", + phonenumber: "Phone", + phonenumberPleace: "Please enter the correct cell phone number", + nick: "NickName", + nickPleace: "Please enter a user nickname", + nickTip: "Nicknames can only contain letters, numbers, Chinese characters and underscores, and no less than 2 digits", + profileTip: "Are you sure you want to submit changes to basic user information?", + profileOk: "The user's basic information is modified successfully!", + know: "I got it.", + uploadPleace: "Please choose an equal-sized image for your avatar, such as {txt}", + upload: "Upload/Change Images", + uploadFormat: 'Only supports uploading image formats ({format})', + uploadSize: 'Image file size must be less than {size}MB', + uploadTip: "Confirmed to upload/change user avatar?", + uploadOk: "Avatar upload/change successful", + resetPasswd: "Reset Password", + oldPassword: "Old Password", + oldPasswordTip: "The old password must not be empty and must be at least 6 digits long", + oldPasswordPleace: "Please enter the old password", + newPassword: "New Password", + newPasswordTip: "Password contains at least upper and lower case letters, numbers, special symbols, and not less than 6 digits", + newPassworddPleace: "Please enter a new password", + confirmPassword: "Confirm new password", + confirmPasswordPleace: "Please confirm the new password", + submit: "Submit changes", + reset: "Reset", + submitTip: "Are you sure you want to submit a password change?", + submitOkTip: "Congratulations, {num} account password changed successfully!", + submitOk: "Sign in again", + equalToPassword: "Please enter a new password to confirm", + equalToPasswordOld: "Same as the old password, please re-enter the new password", + equalToPasswordErr: "Inconsistent new passwords entered twice", + styleLayout: "Personalization", + area1: "Layout Properties", + layout: "Overall Layout", + layoutActions: "Navigation mode module settings", + layoutSide: "Left", + layoutTop: "Top", + layoutMix: "Mixed", + color: "Style color scheme", + colorActions: "Overall style color scheme setting", + colorRandomly: "Randomization", + theme: "Theme dark and light modes", + themeActions: "Toggle light/dark mode", + navTheme: "Dark Menu", + navThemeActions: "Menus that can only change the navigation mode", + fixedHeader: "Fixed top navigation bar", + fixedHeaderActions: "Whether the top navigation bar is fixed and does not move with the scroll bar", + fixSiderbar: "Fixed left menu", + fixSiderbarActions: "Whether the left menu is fixed or not, only valid for left menu layout", + splitMenus: "Auto Split Menu", + splitMenusActions: "Show left menu when there are multiple levels of menus at the top, valid only for mixed menu layouts", + area2: "Content Area", + tabRender: "Navigation tabs", + tabRenderActions: "Whether to show the top tab navigation items", + menuHeaderRender: "Menu Header", + menuHeaderRenderActions: "Whether or not to display the logo area at the top of the left menu bar", + footerRender: "Footer", + footerRenderActions: "Whether to show the bottom navigation bar", + headerRender: "Parapet", + headerRenderActions: "Whether to display the top navigation bar", + }, + profile: { + phonenumber: "Phone", + email: "Email", + deptName: "Class", + postGroup: "Possession of posts", + roleGroup: "Ownership", + loginIp: "Log in", + loginDate: "Login Time", + list: "Lists", + empty: "Empty State", + description: "No data yet, try refreshing", + }, + }, + configManage: { + neManage: { + addNe:'Add Network Element', + delSure:'Confirm deleting the data item with network element name {msg}', + editNe:'Edit Network Element', + exportSure:'Confirm exporting the configuration information with the network element name {msg}', + exportTip:'Export successful, please go to backup management for download', + getInfo:'Failed to get network element information', + neType:'NE Type', + neTypePlease: 'Select network element type', + neId:'NE ID', + neName:'NE Name', + neTypeTip:'Fill in the type of network element created, such as:SMF', + uid:'RM UID', + uidTip:'Please enter a unique resource identifier', + ip:'IP Address', + mac:'NE MAC address', + macTip:'Able to locate the physical address (MAC) of the network element', + port:'Port', + portTip:'Maximum range 0~65535', + pvflag:'PV Flag', + pnf:'Physical Network Element', + vnf:'Virtual Network Element', + province:'Region', + vendorName:'Vendor Name', + dn:'Network Identification', + reload: 'Reload', + restart: 'Restart', + totalSure:'Confirm the network element with {operator} network element name {msg}', + stop: 'Stop', + start: 'Start', + log: 'Logs', + export: 'Export', + import: 'Import', + fileForm:'File Source', + selectPlease:'Please select the source of the import file', + server:'Server File', + local:'Local File', + fileSelect:'Please select the current import file', + sync:'Synchronize to NE', + open:'Open', + close:'Close', + addFail:'Add failed', + operFail:'Operation Failed' + }, + backupManage: { + setBackupTask: 'Set automatic backup time', + neTypePlease: 'Query network element type', + neType: 'NE Type', + neID: 'NE ID', + fileName: 'File Name', + createAt: 'Create at', + remark:'Remark', + edit:'Edit Backup File', + totalSure:'Confirm that {oper} records item number {id}?', + }, + softwareManage: { + sendBtn: 'Distribute', + runBtn: 'Activate', + backBtn: 'Rollback', + historyBtn: 'Distribution Record', + neTypePlease: 'Select network element type', + neType: 'NE Type', + fileName: 'File Name', + version: 'Version', + versionPlease: 'Version number cannot be empty', + updateTime: 'Uploaded Time', + description: 'Description', + deleteTip: 'Are you sure to delete the data item with software [{fileName}]?', + downloadTip: 'Are you sure to download the data item with software [{fileName}]?', + updateComment: 'Comment', + updateCommentPlease: 'Please enter the software description', + updateFile: 'Software File', + updateFilePlease: 'Please upload the updated software file', + verifyFile: 'Verify File', + selectFile: 'SELECT FILE', + sendTitle: 'Distribute software version', + sendContent: 'Are you sure to send the file with the software package [{fileName}] to the corresponding network element?', + runTitle: 'Activate software version', + runContent: 'Are you sure to activate the software version of [{fileName}] that has been issued to the corresponding network element?', + backTitle: 'Fallback software version', + backContent: 'Confirm that the software version of [{fileName}] has been issued for the corresponding network element rollback?', + neId: 'Corresponding network element', + neIdPlease: 'Please select the corresponding network element', + versions:'Version', + upVersions:'Version before upgrade', + backVersions:'Version before rollback', + status:'Status', + letUpTime:'Activation time', + createTime:'Creation time', + onlyAble:'Only upload file format {fileText} is supported', + nullVersion:'There is no rollback version for the current network element.', + }, + license: { + neTypePlease: 'Select network element type', + neType: 'NE Type', + serialNum: 'Serial Num', + createTime: 'Time', + comment: 'Description', + updateComment: 'License Description', + updateCommentPlease: 'Please enter a license description', + updateFile: 'License File', + updateFilePlease: 'Please upload and update the License file', + selectFile: 'SELECT FILE', + neId: 'NE ID', + neIdPlease: 'Please select the corresponding network element', + }, + configParam:{ + dataNull:'No configuration item data yet', + editSuss:'Modification successful', + editFail:'Edit failed', + Unable:'Illegal operation of attribute value', + delSure:'Confirm to delete the data item with Index [{value}]?', + addSuss:'Add successfully', + addFail:'Add failed', + delArraySure:'Confirm to delete the data item with {arrayChildTitle} Index as [{value}]?', + parUnable:'The parameter value is not within the reasonable range', + ipv4Tip:'Not a legal IPV4 address', + ipv6Tip:'Not a legal IPV6 address', + enumTip:'Not a reasonable enumeration value', + boolTip:'Not a reasonable Boolean value', + default:'The input value is of unknown type', + reloadSuss:'Network element reloading completed', + reloadFail:'Network element reloading failed', + neNUll:'No network element list data yet', + reload:'Reload', + post:'Submit', + editSure:'Are you sure you want to update this attribute value? ', + arraryEdit:'Are you sure to submit the record whose updated Index is [{value}]? ', + addSure:'Are you sure to submit the new record of Index: [{value}]? ' + }, + configParamForm: { + treeTitle: "Navigation Configuration", + treeSelectTip: "Select configuration item information in the left configuration navigation!", + neType: 'NE Type', + neTypePleace: "Please select the network element type", + noConfigData: "No data on configuration items", + updateValue: "[ {num} ] parameter value modified successfully.", + updateValueErr: "Attribute value modification failure", + updateItem: "Modify Index to {num}.", + updateItemErr: "Record modification failure", + delItemOk: "Deleting Index as {num} succeeded", + addItemOk: "Add Index as {num} Record Succeeded", + addItemErr: "Record addition failure", + requireUn: "[ {display} ] input value is of unknown type", + requireString: "[ {display} ] parameter value is invalid.", + requireInt: "[ {display} ] parameter value not in reasonable range {filter}", + requireIpv4: "[ {display} ] not a legitimate IPV4 address", + requireIpv6: "[ {display} ] not a legitimate IPV6 address.", + requireEnum: "[ {display} ] is not a reasonable enumeration value.", + requireBool: "[ {display} ] is not a reasonable boolean value.", + editOkTip: "Confirm updating the value of this [ {num} ] attribute?", + updateItemTip: "Confirm updating the data item with Index [{num}]?", + delItemTip: "Confirm deleting the data item with Index [{num}]?", + arrayMore: "Expand", + ptDiff: 'Comparison Example', + ptDiffExample: 'Example Configuration', + ptDiffSelf: 'Current Individuals', + ptDiffLoad: 'Load More', + ptDiffMerge: 'Comparative Differences', + ptDiffRest: 'Restore this version', + ptHistory: 'History', + ptReset: 'Reset To Example', + ptLoad: 'Load Current Configuration', + ptExport: "Export Excel", + ptExportTip: "Exporting NE Configuration Data to an Excel file", + ptApplyShow: 'View Student', + ptApply: 'request', + ptApplyNE: 'Application To NE', + ptApplyStu: 'Application To {ne}', + ptApplyStuRack: 'Return Request', + ptApplyStuNE: 'Application Request', + }, + }, + dashboard: { + overview:{ + title: "Core Network Dashboard", + fullscreen: "Click on the full-screen display", + toRouter: "Click to jump to the detail page", + skim: { + users: "Users", + userTitle:'User Information', + imsUeNum: "VoNR/VoLTE", + smfUeNum: "Data Sessions", + gnbBase: "Online gNodeB", + enbBase: "Online eNodeB", + gnbUeNum:'5G Active Users', + enbUeNum:'4G Active Users', + baseTitle:'Online Information', + }, + upfFlow:{ + title: "UPF Throughput", + up:'Uplink', + down:'Downlink' + }, + upfFlowTotal:{ + title:'Traffic Summary', + up:'Uplink', + down:'Downlink' + }, + alarmTypeBar:{ + alarmSum:'Alarm Summary', + topTitle:"TOP 3", + }, + resources: { + title: "Resource Usage", + sysMem: "SYS Mem", + sysCpu: "SYS CPU", + sysDisk: "SYS Store", + neCpu: "NE CPU", + }, + topology: { + title: "Network Status", + normal: "Normal", + abnormal: "Abnormal", + }, + userActivity: { + title: "User Activity", + type: "Type", + duration: "Duration", + caller: "Caller", + called: "Called", + result: "Result", + time: "Time", + resultOK: "Success", + }, + }, + cdr: { + recordType: "Recording Behavior", + realTimeDataStart: "Turn on real-time data", + realTimeDataStop: "Turn off real-time data", + cdrInfo: "CDR Info", + time: "Time", + rowInfo: "Info", + type: "Type", + duration: "Duration", + seizureTime: "Call Start Time", + releaseTime: "Hangup Time", + caller: "Caller", + called: "Called", + result: "Result", + resultOk: "Success", + resultFail: "Fail", + delTip: "Confirm deletion of the data item numbered [{msg}]?", + exportTip: "Do you confirm to export the current query conditions of the CDR data? (Maximum 10,000 items can be exported.)", + smfChargingID: 'Charging ID', + smfSubscriptionIDData: 'Subscription ID Data', + smfSubscriptionIDType: 'Subscription ID Type', + smfDataVolumeUplink: 'Data Volume Uplink', + smfDataVolumeDownlink: 'Data Volume Downlink', + smfDataTotalVolume: 'Data Total Volume', + smfDuration: 'Duration', + smfInvocationTime: 'Invocation Time', + }, + ue: { + eventType: "Event Type", + realTimeDataStart: "Turn on real-time data", + realTimeDataStop: "Turn off real-time data", + ueInfo: "UE Info", + time: "Time", + rowInfo: "Info", + result: "Result", + resultOk: "Successes", + delTip: "Confirm deletion of the data item numbered [{msg}]?", + exportTip: "Do you confirm to export the event data of the current query condition? (Maximum 10,000 items can be exported.)", + }, + }, + ne: { + common: { + neType: 'NE Type', + neTypePlease: "Please select network element type", + neTypeTip: 'Fill in the type of network element to be created, e.g. SMF.', + neId: 'NE ID', + neIdPlease: 'Please enter the network element identification', + neIdTip: 'Fill in the unique identifier of the network element binding', + rmUid: 'Resource Unique ID', + rmUidPlease: 'Please enter a resource unique ID', + rmUidTip: "Tagging for data reporting of network element logs, alarms, metrics, etc.", + neName: 'NE Name', + neNamePlease: 'Please enter the name of the network element', + ipAddr: 'IP Addr', + ipAddrPlease: 'Please enter the IP address of the network element', + ipAddrTip: "Support IPV4/IPV6, synchronized change of configuration address", + port: 'Port', + portTip: "Network element port default:33030", + serialNum: 'Serial Number', + expiryDate: 'Expiry Date', + normalcy: 'Normal', + exceptions: 'Abnormal', + restart: 'Restart', + restartTip: 'Are you sure you want to restart the network element service?', + start: 'Start', + startTip: 'Are you sure you want to start the network element service?', + stop: 'Stop', + stopTip: 'Are you sure you want to stop the network element service?', + reload: 'Reload', + reloadTip: 'Confirm that you want to reload the network element configuration information?', + oam: 'OAM', + log: 'Logs', + }, + neInfo: { + version: "Version", + state: "State", + serviceState: "Service Status", + info: 'Status Message', + resourceInfo: 'Resource Situation', + sysMem: "SYS Mem", + sysCpu: "SYS CPU", + sysDisk: "SYS Store", + neCpu: "NE CPU", + hostConfig: "Connection Configuration", + pvflag: 'NE Virtualization', + pnf: 'physical network element', + vnf: 'virtual network element', + neAddress: 'MAC', + neAddressTip: 'Record the physical address (MAC) of the network card of the network element', + dn: 'network identifier', + vendorName: 'provider', + province: 'Service Area', + addTitle: 'New network element information', + editTitle: 'Edit network element information', + delTip: 'Confirm deletion of network element information data items?', + oam: { + title: 'OAM Configuration', + sync: 'Sync to NE', + oamEnable: 'Service', + oamPort: 'Port', + snmpEnable: 'Service', + snmpPort: 'Port', + kpiEnable: 'Report', + kpiTimer: 'Reporting Cycle', + kpiTimerPlease: 'Please enter the reporting period (in seconds)', + omcIP: 'OMC IP', + }, + backConf: { + export: 'Config Export', + import: 'Config Import', + title: 'Configuration File Import', + importType: 'Source of File', + server:'Server File', + local:'Local File', + localUpload:'Local Upload', + exportTip:'Confirm that you want to export the network element configuration file?', + exportMsg:'Exporting Network Element Configuration Information to a File Succeeded', + pathPlease: 'No Backup File Found', + }, + }, + neHost: { + hostType: "Type", + groupId: "Group", + title: "Host Name", + titlePlease: "Please fill in the host name correctly", + addr: "IP Addr", + addrPlease: "Please fill in the host IP address correctly", + port: "Port", + portPlease: "Please fill in the host port number correctly", + user: "User", + userPlease: "Please fill in the host user correctly", + database: "DataBase", + authMode: "Auth Mode", + password: "Password", + passwordPlease: "Please fill in the host password correctly", + privateKey: "Private Key", + privateKeyPlease: "Please fill in the private key characters correctly ~/.ssh/id_rsa", + passPhrase: "Private Key Cipher", + delTip: "Confirm that you want to delete the host number [{num}]?", + addTitle: "Add Host Connection", + editTitle: "Edit Host Connection", + test: "Test Connection", + testOk: "Test Connection Successful", + authRSA: 'Secret Authorization', + authRSATip: "Do I have to configure secret-free authorization?", + }, + neHostCmd: { + cmdType: "Type", + groupId: "Group", + title: "Title", + titlePlease: "Please fill in the command name correctly", + command: "Command", + commandPlease: "Please enter a valid command string correctly", + delTip: "Are you sure you want to delete the message with command number [{num}]?", + addTitle: "New Host Commands", + editTitle: "Edit Host Commands", + }, + neSoftware: { + uploadTitle: "Update Software", + upload: "Upload", + uploadNotFile: "No software files uploaded", + uploadBatch: "Batch Upload", + uploadBatchMax: "Multiple packages can be uploaded, with up to {txt} selected at the same time.", + uploadFileName: "Parses file names in the format of: amf-r2.240x.xx-xxx", + name: "File Name", + path: "Software File", + pathPlease: "Please upload the software package file", + version: "Software Version", + versionPlease: "Please enter the software version number", + delTip: "Confirmed to remove the package?", + downTip: "Confirmation to download package [{txt}]?", + fileCheckType: 'The corresponding network element type is not resolved', + fileCheckVer: 'The corresponding version number is not resolved', + fileTypeNotEq: 'Not a specified network element type {txt}', + fileTypeExists: 'Same type of file already exists', + fileNameExists: 'File with same name already exists', + fileCheckTypeDep: 'The specified dependency package type is not resolved', + dependFile: 'Software Dependencies', + dependFileTip: 'File name resolution is the same as above, and installation is based on the order of uploading.', + }, + neVersion: { + upgrade: "Upgrade To New Version", + upgradeTip: "Confirmed to upgrade to the new version?", + upgradeTipEmpty: "There are currently no new versions available", + upgradeTipEqual: "The current version is the same as the new version, confirmed to update?", + rollback: 'Switch to previous version', + rollbackTip: "Confirm switching to the previous version?", + rollbackTipEmpty: "There is currently no previous version available", + rollbackTipEqual: 'The current version is the same as the previous version, are you sure you want to make the switch?', + version: "Current Version", + preVersion: "Previous Version", + newVersion: "New Version", + status: "Revision Status", + upgradeBatch: "Batch Upgrade", + upgradeBatchTip: "Do you perform new version upgrades on checked records?", + upgradeNotNewVer: 'No new version found', + upgradeOMCVer: 'Rejection of batch operation upgrades OMC', + upgradeDone: 'Update complete, service being reloaded', + upgradeFail: 'The update fails, please check whether the software file exists and whether the service terminal environment is available!', + upgradeModal: 'Network Element Version Updates', + }, + neLicense: { + status: "License Status", + change: "Change License", + reload: "Refresh Info", + reloadTip: "Confirmed to refresh license information?", + reloadBatch: "Batch Refresh", + reloadBatchTip: "Do you do an information refresh on checked records?", + updateTtile: "Update License", + downCodeTop: "Confirmed to save the license activation code to a file?", + activationRequestCode: "License Activation Code", + licensePath: "License File", + licensePathTip: "Please upload license file", + upload: 'Upload', + uploadFile: "Upload License", + uploadChangeOk: 'Network Element renewed license successfully and is being calibrated in the background!', + uploadChangeFail: "Some network elements failed to update the license, please check whether the service terminal environment is available!", + }, + neConfig: { + treeTitle: "Navigation Configuration", + treeSelectTip: "Select configuration item information in the left configuration navigation!", + neType: 'NE Type', + neTypePleace: "Please select the network element type", + noConfigData: "No data on configuration items", + updateValue: "[ {num} ] parameter value modified successfully.", + updateValueErr: "Attribute value modification failure", + updateItem: "Modify Index to {num}.", + updateItemErr: "Record modification failure", + delItemOk: "Deleting Index as {num} succeeded", + addItemOk: "Add Index as {num} Record Succeeded", + addItemErr: "Record addition failure", + requireUn: "[ {display} ] input value is of unknown type", + requireString: "[ {display} ] parameter value is invalid.", + requireInt: "[ {display} ] parameter value not in reasonable range {filter}", + requireIpv4: "[ {display} ] not a legitimate IPV4 address", + requireIpv6: "[ {display} ] not a legitimate IPV6 address.", + requireEnum: "[ {display} ] is not a reasonable enumeration value.", + requireBool: "[ {display} ] is not a reasonable boolean value.", + editOkTip: "Confirm updating the value of this [ {num} ] attribute?", + updateItemTip: "Confirm updating the data item with Index [{num}]?", + delItemTip: "Confirm deleting the data item with Index [{num}]?", + arrayMore: "Expand", + }, + neConfigBackup: { + name: "Name", + downTip: 'Confirmed to download the backup file [{txt}]?', + title: "Modify Backup {txt}", + }, + neQuickSetup: { + reloadPara5G: 'Reload', + stepPrev: 'Previous', + stepPrevTip: 'Confirm that you want to abandon the current change and return to the previous step?', + stepNext: 'Next', + stepSave: 'Save', + startTitle: 'Service Terminal Environment', + startDesc: 'Test connectivity to network element services', + startStepNext: 'Confirm that you want to proceed to the next step to configure the network element information?', + addr: 'Terminal IP', + kernelName: 'System', + kernelRelease: 'Kernel', + machine: 'Framework', + prettyName: 'Platform', + prettyNameTip: 'Support Ubuntu', + nodename: 'Node Name', + auth: 'Competence Grant', + sudo: 'sudo', + sudoErr: 'To ensure that you have permission to install packages, configure to grant the current user permission to allow passwordless sudo privileges.', + sshLink: 'confidentiality', + configTitle: "Configuring Network Elements", + configDesc: "Fill in the basic information of the network element", + configAddTitle: 'New Tips', + configAddTip: 'Is it added as new network element information and continue?', + configUpdateTitle: 'Update Tips', + configUpdateTip: 'Does it update to the already existing network element information and continue?', + configStepNext: 'Confirm that you want to proceed to the next step for the Network Element software installation?', + installTitle: "Network Element Installation", + installDesc: "Installation to Service Terminal", + installConfirmTip: 'Are you sure you want to install package [{name}]?', + installStepNext: 'Confirm that you want to proceed to the next step for network element authorization?', + installSource: 'Software Source', + installSourceOption: 'Uploaded', + installSourceUpload: 'New Upload', + installSelect: 'Select Record', + installUpload: 'Upload File', + installText: 'Installed', + licenseTitle: "Licenses", + licenseDesc: "Network element service authorization certification", + licenseResultTitle: "Whether to authorize activation immediately", + licenseResultTitleOk: 'Successful Activation', + licenseUpload: 'License', + licenseEnd: 'Finish', + licenseEndTip: "Confirmed to end the installation?", + licenseCheack: 'Waiting for network element validation', + licenseTip1: '1. Click [License] to get the license activation code, and then contact the network element vendor for activation.', + licenseTip2: '2. Clicking [Finish] will end the installation process.', + }, + }, + neUser: { + auth: { + authInfo:' Authentication Info', + neTypePlease: 'Query network element Object', + neType: 'UDM Object', + export: 'Export', + exportConfirm: 'Are you sure to export all authentication user data?', + checkExport : 'Check Export', + checkExportConfirm: 'Confirm exporting the checked authenticated user data?', + import: 'Import', + loadDataConfirm: 'Are you sure you want to reload the data?', + loadData: 'Load Data', + loadDataTip: 'Successfully fetched loaded data: {num} items, the system is internally updating the data, it will take about {timer} seconds, please wait!!!!!.', + startIMSI: 'Start IMSI', + batchAddText: 'Batch Add', + batchDelText: 'Batch Delete', + numAdd: 'Number of releases', + numDel: 'Number of deleted', + checkDel: 'Check Delete', + imsiTip: 'IMSI=MCC+MNC+MSIN', + imsiTip1: 'MCC=Mobile Country Code, consisting of three digits.', + imsiTip2: 'MNC = Mobile Network Number, consisting of two digits', + imsiTip3: 'MSIN = Mobile Subscriber Identification Number, consisting of 10 equal digits.', + amfTip: 'Authentication management field, maximum parameter length is 4', + algoIndexTip: 'Algorithm index, between 0 and 15', + kiTip: 'User signing key information, the length can only be 32', + opcTip: 'The authentication key, OPC, is calculated from Ki and OP, OP is the root key of the operator, ki is the authentication key, and the maximum length is 32.', + delSure:'Are you sure you want to delete the user with IMSI number: {imsi} ?', + imsiConfirm:'The length of the IMSI must be 15', + }, + sub: { + subInfo:' Subscription Info', + neType: 'UDM Object', + export: 'Export', + exportConfirm: 'Are you sure to export all signed user data?', + checkExport : 'Check Export', + checkExportConfirm: 'Are you sure to export the data of the checked subscribers?', + import: 'Import', + loadDataConfirm: 'Are you sure you want to reload the data?', + loadData: 'Load Data', + loadDataTip: 'Successfully fetched loaded data: {num} items, the system is internally updating the data, it will take about {timer} seconds, please wait!!!!!.', + numAdd: 'Number of releases', + numDel: 'Number of deleted', + checkDel: 'Check Delete', + batchAddText: 'Batch Add', + batchDelText: 'Batch Delete', + enable:'Enabled', + disable:'Disabled', + startIMSI: 'Start IMSI', + imsiTip: 'IMSI=MCC+MNC+MSIN', + imsiTip1: 'MCC=Mobile Country Code, consisting of three digits.', + imsiTip2: 'MNC = Mobile Network Number, consisting of two digits', + imsiTip3: 'MSIN = Mobile Subscriber Identification Number, consisting of 10 equal digits.', + msisdnTip: 'Maximum parameter length {num}', + inputTip: 'The maximum length of the parameter is {num}', + arfbTip: 'Restricted area template, in which the UE is not allowed to communicate with the network in the restricted area specified in the template', + sarTip: 'Service Area Restriction template, defining permitted areas in which the UE can communicate with the network, and disallowed areas in which the UE and the network are not allowed to initiate Service Requests or SM signaling to obtain subscriber services', + micoTip: 'Signed MICO business flag bits', + rfspTip:'RFSP index, in NG-RAN, the index of a specific RRM configuration, parameter between 0 and 127', + ueTypeTip: 'Operator-defined subscriber UE Usage Type, integer, parameter between 0 and 127', + cnFlag: 'Whether to enable 5G Core Network service', + epsFlagTip: 'Whether to enable 4G EPS service', + contextIdTip: 'To sign up for an APN Context ID, you must select it from the APN Context list.', + apnContextTip: 'The list of APNs available to the phone, up to six, is defined in the HSS.', + staticIpTip: 'Specify the static IP address to be used by the cell phone user to access the Internet, and "-" means dynamic IP address is used.', + epsOdbTip: 'ODB (Operator-Determined Barring) Operator-determined blocking, i.e. the ability of a subscriber to access the EPS network is determined by the operator.', + hplmnOdbTip: 'HPLMN-ODB homing operator-determined blocking, i.e., the ability of a subscriber to access services in the EPS network is determined by the subscriber is homing operator', + ardTip:'Access-Restriction-Data (Access-Restriction-Data), can be used to distinguish between 2G/3G/LTE users, to facilitate the coexistence of 2G/3G/LTE network for different types of users to distinguish between the service', + smDataTip:'The IP in sm_data=1-000001&internet-1.2.3.4&ims-1.2.3.5: 1.2.3.4 is the static IP assigned to the APN of 5G user internet, and 1.2.3.5 is the static IP assigned to the APN of 5G user ims. If it is dynamic allocation, just remove the IP and the previous connector. Need to support multiple dnn uses & connections', + smDataArrTip:'SST,DNN/APN is required', + }, + pcf: { + neType: 'PCF Object', + export: 'Export', + exportConfirm: 'Confirm exporting all user policy control information data?', + import: 'Import', + addTitle: 'Adding Policy Control Information', + updateTitle: '{imsi} Policy control information', + startIMSI: 'Start IMSI', + batchOper: 'Batch Operations', + batchAddText: 'Batch Add', + batchDelText: 'Batch Delete', + batchUpdateText: 'Batch Modify', + batchNum: 'Number of batches', + imsiTip: 'IMSI=MCC+MNC+MSIN', + imsiTip1: 'MCC=Mobile Country Code, consisting of three digits.', + imsiTip2: 'MNC = Mobile Network Number, consisting of two digits', + imsiTip3: 'MSIN = Mobile Subscriber Identification Number, consisting of 10 equal digits.', + checkDel: 'Check Delete', + delSure:'Are you sure you want to delete the user with IMSI number: {imsi}?', + uploadFileOk: 'File Upload Successful', + uploadFileErr: 'File Upload Failed', + pccRuleTip:'PCC policy rule template (corresponding to parameter configuration -PCC Rules)', + sessRuleTip:' Session policy rule template (corresponding to parameter configuration-session Rules)', + qosAudioTip:' Voice call QoS(corresponding parameter configuration -QoS Template QoS ID)', + qosVideoTip:' Video call QoS(corresponding parameter configuration -QoS Template QoS ID)', + hdrTip:'HTTP Header enhancement (corresponding parameter configuration -Header Enrich Template)', + ueTip:'UE policy template (example: uep_001)', + sarTip1:' Service area Restriction ', + sarTip2:'(corresponding parameter setting -Service Area Restriction)', + rfsfTip:'RAT Frequency Selection Priority', + }, + base5G: { + neType: 'NE Object', + }, + n3iwf: { + neType: 'N3IWF Object', + }, + ue: { + neType: 'SMF Object', + }, + ims: { + neType: 'IMS Object', + }, + nssf:{ + neType: 'NSSF Object', + }, + }, + perfManage: { + taskManage:{ + taskId: 'Task ID', + neType: 'NE Type', + size: 'Time Granularity', + taskStatus: 'Task Status', + addUser: 'Creator', + addTime: 'Creation Time', + granulOption:'Granularity', + performanceList:'Performance Set', + period:'Measuring Period', + plan:'Measuring Plan', + performanceSelect:'Please select a performance measurement dataset', + delPerfTip: 'Are you sure to delete the data item with record number {num}', + delPerf: 'Successfully deleted task {num}', + viewTask:'View Task', + editTask:'Edit Task', + addTask:'Add Task', + stopTask:'Stop', + errorTaskInfo: 'Failed to obtain task information', + granulOptionPlease:'Please select the measurement granularity', + letupSure:'Confirm activation of task with number [{id}]?', + stopSure:'Confirm the pending task with number [{id}]?', + letUpWarning:'Prohibit activation of activated tasks', + stopWarning: 'Prohibit suspending inactive measurement tasks', + weekPlan:'Weekly Plan', + monthPlan:'Monthly Plan', + one:'Monday', + two:'Tuesday', + three:'Wednesday', + four:'Thursday', + five:'Friday', + six:'Saturday', + seven:'Sunday', + }, + perfThreshold:{ + thresholdValue:'Threshold Value', + alarmType:'Alarm Type', + delThre:'Successfully deleted threshold {num}', + delThreTip:'Are you sure to delete the data item with record number {num}?', + editThre:'Update Threshold', + addThre:'Add Threshold', + errorThreInfo: 'Failed to obtain threshold information', + staticSet:'Statistical Settings', + threValue:'Threshold Value', + alarmLevel:'Severity', + status:'Status', + letupSure:'Confirm the performance threshold of activation number [{id}]?', + stopSure:'Confirm the performance threshold of the suspension number [{id}]?', + letUpWarning:'Prohibit activation of activated performance threshold', + stopWarning:'Prohibit suspending inactive performance thresholds', + }, + perfData:{ + taskId:'Task ID', + type:'NE Type', + neName:'Ne Name', + granulOption:'Granularity', + kpiCode:'KPI Code', + kpiId:'KPI ID', + value:'Value', + startTime:'Start Time', + endTime:'End Time', + }, + goldTarget:{ + type:'NE Type', + enTitle:'KPI ID', + value:'Value', + startTime:'Start Time', + endTime:'End Time', + interval: 'Granularity', + timeFrame: 'Time Range', + nullTip:'There are no statistical data within this time range', + kpiChartTitle:'KPI Statistics Chart', + kpiTableTitle:'KPI Statistics Data', + time:'Time', + exportSure:'Confirm whether to export all statistical data', + exportEmpty: "Export data is empty", + showChartSelected: "Show All", + realTimeData: "Real Time Data", + }, + customTarget:{ + TourTitle1:'Calculate element selection', + TourDes1:'Select the metric corresponding to the selected NE type for the calculation formula', + TourTitle2:'Calculate symbol selection', + TourDes2:'Select a calculation symbol', + TourTitle3:'Calculation formula', + TourDes3:'The calculation formula is automatically composed from the calculation elements and calculation symbols selected earlier', + TourTitle4:'Result unit', + TourDes4:'Units are optional. PS: Formula automatically × 100% when the % sign', + kpiId:' Custom Indicator', + kpiIdTip:'This Ne has no custom indicators', + period:' Granularity', + title:' Custom Indicator Title', + objectType:' Object type', + expression:'Expression', + description:' Description', + kpiSet:' Statistical Settings', + sixHoursAgo:'Six hours ago', + threeHoursAgo:'Three hours ago.', + delCustomTip:'Confirm deletion of data item with record Custom Indicator {num}?', + delCustom:' Successfully delete record number {num} custom indicator', + addCustom:' Add custom indicator', + editCustom:' Edit Custom indicator', + errorCustomInfo: 'Failed to get information', + status: 'Status', + active:'Active', + inactive:'Inactive', + symbol:'Symbol', + element:'Element', + granularity:'Granularity', + unit:'Unit', + expressionModal:'Expression Modal', + expressionErrorTip:'Please check the expression, the wrong indicator is {kpiId}', + expressionNoIdTip:'Please check the expression, no valid indicator is found', + }, + kpiKeyTarget:{ + "time":"Time", + "rawData":"Table Data", + "statistics":"NE metrics", + "fullWidthLayout":"Full Width", + "twoColumnLayout":"Two Column", + "saveLayout": "Save Layout", + "restoreSaved": "Restore Layout", + "saveSuccess": " '{name}' saved successfully", + "restoreSavedSuccess": " '{name}' restored successfully", + "noSavedLayout": "No saved layout found for '{name}'", + "layout1": "Layout 1", + "layout2": "Layout 2", + "layout3": "Layout 3" + }, + kpiOverView:{ + "kpiName":"NE Metrics Name", + "maxValue":"Max Value", + "minValue":"Min Value", + "kpiChartTitle":"Overview of NE metrics", + "changeLine":"Change to Line Charts", + "changeBar":"Change to Bar Charts", + "chooseShowMetrics":"Select the metric you want to display", + "chooseMetrics":"Select an indicator", + }, + }, + traceManage: { + analysis: { + imsi: 'IMSI', + imsiPlease: 'Please enter IMSI', + msisdn: 'MSISDN', + msisdnPlease: 'Please enter MSISDN', + trackTaskId: 'Task ID', + srcIp: 'Source IP Address', + dstIp: 'Destination IP Address', + signalType: 'Signaling Type', + msgDirect: 'Message Direction', + msgType: 'Message Type', + rowTime: 'Record Time', + signalData: 'Signaling Data', + signalDetail: 'Signaling Details', + noData: 'No information content', + taskTitle: 'Task {num}', + taskDownText: 'Download HTML', + taskDownTip: 'Confirm downloading the signaling details HTML file?', + }, + pcap: { + capArgPlease: 'Please enter tcpdump -i any support parameter', + cmd: 'Command', + execCmd: "Common Command Options", + execCmd2: "Filter Protocol Port Command", + execCmd3: "File Split By Time units of seconds (-G 10), Generated Max File Number (-W 7)", + execUPFCmdA: 'Standard Edition - UPF with other NE anomalous packet capture analysis', + execUPFCmdB: 'Standard Edition - UPF anomalies requiring packet capture analysis', + batchOper: 'Batch Operations', + batchStartText: 'Batch Start', + batchStopText: 'Batch Stop', + batchDownText: 'Batch Download', + fileView: 'Historical Packet Capture Files', + fileUPF: 'Standard Edition', + fileUPFTip: 'UPF internal packet capture and analysis packet', + textStart: "Start", + textStop: "Stop", + textLog: "LogFile", + textLogMsg: "LogFile Info", + textDown: "Download", + downTip: "Are you sure you want to download the {title} capture data file?", + downOk: "{title} file download complete", + downErr: "{title} file download exception", + textSelect: "check list", + startTip: "Are you sure you want to start the {title} packet grabbing task?", + startOk: "{title} the mission has begun", + startErr: "{title} mission anomaly", + stopTip: "Are you sure you want to stop the {title} grabbing task?", + stopOk: "{title} mandate closed", + stopErr: "{title} mission anomaly", + stopNotRun: "{title} not running", + }, + task: { + traceId: 'Tracing No', + trackType: 'Tracing Type', + trackTypePlease: 'Please select a tracing type', + creater: 'Created by', + textStop: "Stop", + status: 'Status', + time: 'Time', + startTime: 'Start Time', + endTime: 'End Time', + msisdn: 'MSISDN', + msisdnPlease: 'Please enter MSISDN', + msisdnTip: 'Mobile communication MSISDN number', + imsi: 'IMSI', + imsiPlease: 'Please enter IMSI', + imsiTip: 'Mobile communication IMSI number', + srcIp: 'Source IP Address', + srcIpPlease: 'Please enter the IP address', + srcIpTip: 'Current sender IPv4 address', + dstIp: 'Destination IP Address', + dstIpPlease: 'Please enter the IP address', + dstIpTip: 'IPv4 address of the receiving end of the other party', + interfaces: 'Signaling Interface', + interfacesPlease: 'Please enter the signaling interface', + signalPort: 'Signal Port', + signalPortPlease: 'Please enter the signaling port', + signalPortTip: 'Port of the side corresponding to the destination IP address or source IP address', + rangePicker: 'Start/End Time', + rangePickerPlease: 'Please select the start and end time of the task', + remark: 'Remark', + remarkPlease: 'Task description can be entered', + addTask: 'Add Task', + editTask: 'Modify Task', + viewTask: 'View Task', + errorTaskInfo: 'Failed to obtain task information', + delTaskTip: 'Are you sure to delete the data item with record ID {id} ?', + stopTask: 'Successful cessation of tasks {id}', + stopTaskTip: 'Confirm stopping the task with record ID {id} ?', + pcapView: "Tracking Data Analysis", + traceFile: "Tracking File", + errMsg: "Error Message", + imsiORmsisdn: "imsi or msisdn is null, cannot start task", + }, + }, + faultManage: { + activeAlarm: { + all:'All', + neType: 'NE Type', + neName: 'NE Name', + neId: 'NE UID', + alarmCode: 'Alarm Code', + origLevel: 'Severity', + eventTime: 'Event Time', + pvFlag: 'PV Flag', + alarmType: 'Alarm Type', + confirm: 'Confirm', + updateConfirm: 'Cancel Confirm', + handSync: 'Manual Synchronization', + clear: 'Clear', + mySelf: 'Personalization', + exportAll: 'Export All', + disPlayFilfter: 'Display Filters', + alarmId:'ID', + alarmTitle:'Title', + clearUser:'Clear User', + clearType:'Clear Type', + ackState: 'Ack Status', + ackUser:'Ack User', + alarmSeq:'Sequence Number', + objectName:'Object Name', + locationInfo:'Location Info', + province:'Region', + addInfo:'Additional Info', + specificProblemId:'Cause ID', + specificProblem:'Cause', + clearTime:'Clear Time', + alarmStatus:'Status', + ackTime:'Ack Time', + ackError:'Please do not confirm again', + syncMyself:'Manual Synchronization', + realTitle:'English Title', + objectNf:'Object NE', + helpFile:'Help Documentation', + set:'Set', + cancelSure:'Confirm whether to cancel the acknowledgment alarm', + cancelSuss:'Alarm canceled successfully', + sysncSuss:'Manual synchronization successful', + delSuss:'Clear successfully', + delSure:'Whether to clear this alarm', + showSet:'Show filter settings', + exportSure:'Confirm whether to export all active alarm information', + viewIdInfo:'View {alarmId} record information', + closeModal:'Close', + }, + historyAlarm:{ + exportSure:'Confirm whether to export all historical alarm information', + }, + faultSetting:{ + interfaceType:'Type', + email:'Email', + sms:'SMS', + save:'Save', + noChange:'There is no change in the alarm forwarding settings.', + forwardSet:'Alarm Forwarding Setting', + }, + eventAlarm:{ + exportSure:'Confirm whether to export all event alarm information', + } + }, + logManage:{ + alarm:{ + type:'NE Type', + neId:'NE UID', + alarmId:'Alarm ID', + alarmSeq:'Sequence Number', + alarmCode:'Alarm Code', + alarmStatus:'Status', + eventTime:'Event Time', + logTime:'Recording Time', + status:'Status', + }, + mml:{ + account:'Account', + ip:'IP', + type:'NE Type', + neId:'NE ID', + MML:'MML', + logTime:'Log Time' + }, + forwarding:{ + type:'NE Type', + neId:'NE UID', + alarmId:'Alarm ID', + alarmSeq:'Sequence Number', + alarmObj:'Forward Users', + alarmInter:'Forward Interface', + alarmTitle:'Alarm Title', + alarmInfo:'Operation Results', + eventTime:'Event Time', + logTime:'Log Time' + }, + neFile: { + neType:'NE Type', + neTypePlease:'Please select NE Type', + nePath: "Directory Path", + fileMode: "File Mode", + owner: "Owner", + group: "Group", + size: "Size", + modifiedTime: "Modified Time", + fileName: "File Name", + downTip: "Confirm the download file name is [{fileName}] File?", + downTipErr: "Failed to get file", + dirCd: "Enter Dir", + viewAs: 'View Action', + reload: "Reload", + follow: 'Monitoring Content', + tailChar: 'End Characters', + tailLines: 'End Lines', + }, + exportFile:{ + fileName:'File Source', + downTip: "Confirm the download file name is [{fileName}] File?", + downTipErr: "Failed to get file", + deleteTip: "Confirm the delete file name is [{fileName}] File?", + deleteTipErr: "Failed to delete file", + selectTip:"Please select File Name", + } + }, + monitor: { + session: { + userName: "Login Account", + userNamePlease: 'Query login account', + ipaddr: "IP Address", + ipaddrPlease: 'Query IP address', + loginTime: "Login Time", + shakeTime: "Idle Time (minutes)", + status: "Status", + online: "Online", + offline: "Offline", + logoutTip: "Confirm to forcibly log out the user with the login account {num}?", + logoutSuccess: "User {num} has been forcibly retired", + }, + monitor:{ + filter: "Global Filter", + startTime: 'Start Time', + endTime: 'End Time', + today: 'Today', + yesterday: 'Yesterday', + week: 'This Week', + month: 'This Month', + avgLoad: 'Average loads', + memory: 'RAM', + cache: 'Cache', + io: 'Disk', + network: 'Network', + loadDetail: "Load Factor", + resourceUsage: "Usage Rate", + read: 'Read', + write: 'Write', + readWriteCount: 'Read/Write Count', + count: 'Substandard', + readWriteTime: 'Read/Write Delay', + up: 'Uplink', + down: 'Downlink', + }, + online:{ + mettingId:'Session Number', + account:'Account', + host:'Host', + loginDes:'Login Location', + os:'OS', + lib:'Browser', + loginTime:'Login Time', + getOut:'Forced Quit', + getOutSure:'Confirm the forced logout of the user whose login account is {userName} ?', + }, + system:{ + systemInfo:'System Information', + runPlace:'Running Platform', + placeVersion:'Platform Version', + systemPlace:'System Platform', + systemArchitecture:'System Architecture', + host:'Host Name', + runTime:'Running Time', + cpuInfo:'CPU Information', + model:'Model', + hz:'Rate HZ', + cores:'Number of Cores', + usage:'Usage Rate (%)', + memory:'Memory Information', + totalMemory:'Total Memory', + lastMemory:'Remaining Memory', + proMemory:'Total process memory', + heapSize:'Total size of the heap', + heapUsage:'Heap Allocated', + libUse:'Link Library Occupation', + timeInfo:'Time Information', + time:'Time', + timeZone:'Time Zone', + timeZoneName:'Time Zone Name', + networkInfo:'Network Information', + ethernet:'Ethernet', + localConnect:'Local Connection* ', + diskInfo:'Disk Information', + disk:'Path Drive Letter', + totalSize:'Total Size', + lastSize:'Remaining Size', + usageSize:'Used Size', + spaceUsage:'Space Usage (%)' + }, + job: { + jobName: "Name", + jobNamePlease: 'Please enter the task name correctly, limited to 2-50 characters', + jobGroup: "Group", + invokeTarget: "Invoke", + invokeTargetPlease: 'Please enter the call target correctly, limited to 2-50 characters.', + invokeTargetTip: "Parameter description: support for preset incoming parameters, serialized processing parameters in the processor", + cronExpression: "Cron", + cronExpressionPlease: 'Please enter or generate a cron execution expression', + cronExpressionTip: "Example of an expression:0/20 * * * * ?", + cronExpressionTip1: "Illustrative example: Execute tasks every 20 seconds", + cronExpressionNew: "Generating Expression", + status: "Status", + statusChange: "Are you sure you want the {text} {num} job?", + saveLog: "Log", + tipRowErr: "Errors in the recording of jobs", + viewInfoErr: "Failed to get job information", + viewJob: "Task Info", + addJob: "Add Task", + editJob: "Modify Task", + runOne: "execute once", + runOneTip: "Are you sure you want to perform a [{num}] task right away?", + runOneOk: "{num} Executed successfully", + delTip: "Are you sure you want to delete task number [{num}]?", + delOk: "Deleted Successfully", + resetTip: "Sure you want to reset and refresh the scheduling task?", + resetOk: "Reset Successful", + exportTip: "Confirm exporting xlsx table files based on search criteria?", + exportOk: "Completed Export", + resetQueue: "Reset Queue", + jobLog: "Task Log", + createTime: "CreateTime", + targetParams: "Arguments", + targetParamsPlease: 'Call target incoming parameters, only support json strings', + misfirePolicy: "Error Strategy", + misfirePolicy1: "Immediate Implementation", + misfirePolicy2: "Execute Once", + misfirePolicy3: "Waiver of implementation", + concurrent: "Concurrency", + concurrent0: "Prohibit", + concurrent1: "Allowed", + remark: "Remarks", + }, + jobLog: { + jobName: "Job Name", + jobGroup: "Job Group", + invokeTarget: "Job Invoke", + status: "Status", + status0: "Failures", + status1: "Active", + createTime: "Time", + costTime: "Time Lap", + viewLog: "Scheduling log Info", + delTip: "Are you sure you want to delete the scheduling log entry with the number [{num}]?", + delOk: "Deleted Successfully", + clearText: "Clear", + clearTip: "Confirm that all dispatch log data items are cleared?", + clearOk: "Cleared Successfully", + exportTip: "Confirm exporting xlsx table files based on search criteria?", + exportOk: "Export Completed", + jobMsg: "Job Messages", + targetParams: "TargetParams", + }, + cache: { + cacheKey: "Cache Key Name", + cacheName: "Cache Name", + cacheValue: "Cached content", + remark: "Remark", + clearCacheKeyOk: "Deleted cache key name {txt}", + clearCacheNameOk: "Cleared cache name {txt}", + cacheList: "Cache Lists", + cacheKeyListErr: "Please select the data item in the cache list!", + clearCacheSafe: "Security Clearance", + clearCacheSafeTip: "Confirm that you want to perform a safe clean of all key names under the cache?", + clearCacheSafeOk: "Completed securely clearing the cache", + filter: "Filter", + filterPlace: "Fuzzy filtering {txt}", + clearCacheNameTip: "Are you sure you want to clear all the keys under that cache name?", + keyNameList: "Key Name List", + clearCacheKeyTip: "Are you sure you want to delete the cache key?", + keyContent: "Cached content", + }, + cacheInfo: { + baseInfo: "Basic Info", + version: "Service Versions", + mode: "Operating Mode", + modeStandalone: "stand-alone", + modeClusters: "clusters", + port: "Port", + clients: "Client Connections", + uptimeInDays: "Running time (days)", + memoryHuman: "Using Memory", + usedCpu: "Using CPU", + maxmemory: "Memory Configuration", + aof: "Whether AOF is enabled", + rdb: "Whether the RDB is successful", + dbSize: "Number of Keys", + kbps: "Network entry/exit", + commandstats: "Command Statistics", + }, + topology: { + showAllHide: "Show all hidden items", + collapseAll: "Collapse all clusters", + expandAll: "Expanded clusters", + foldAll: "Folded Cluster", + hideEdge: "Hidden edge", + hideNode: "Hidden node", + state: "Status", + normalcy: "Normal", + exceptions: "Abnormal", + refreshTime: "Refresh Time", + name: "Name", + version: "Version", + serialNum: 'Serial Number', + expiryDate: 'Expiry Date', + switchLayout: "Switch Layout", + noData: "Can't find the corresponding plot data", + }, + topologyBuild: { + graphMode: "Graph Model", + graphGroup: "Graph Group Name", + graphGroupTip: "Graph data is updated when a graph group name already exists, and a new graph group is added when it does not.", + graphSave: "Save", + graphDelete: "Delete", + noData: "There is no group data at the moment, you can add a new group using [Graph Model - Edit].", + groupPlease: "Groups cannot be empty", + saveTtite: "Group Information Saving", + saveOk: "Saved group [{group}] successfully.", + saveFail: "Failed to save group [{group}].", + delTip: "Are you sure you want to delete the chart group named [{group}]?", + edgeTitleAdd: "Add Edge Info", + edgeTitleEdit: "Edit Edge Info", + nodeTitleAdd: "Add Node Info", + nodeTitleEdit: "Edit Node Info", + comboTitleAdd: "Add Combo Info", + comboTitleEdit: "Edit Combo Info", + comboFormParentId: "Parent Combo", + comboFormParentIdTip: "Place the current combo point into another combo box", + comboFormId: "Combo ID", + comboFormIdPlease: "Combo Unique ID", + comboFormIdNot: "Combo Element ID Error", + comboFormType: "Combo Type", + comboFormSize: "Minimum Size", + comboFormSizeCircle: "Radius", + comboFormSizeRect: "Length, height", + comboFormPadding: "Inner Margin", + comboFormPaddingRect: "Up, Left, Down, Right", + formStyleFill: "Filler Color", + formStyleFillOpacity: "Transparent Value", + formStyleStroke: "Trim Color", + formStyleLineWidth: "Trim Width", + comboFormChildren: "Element within Combo", + comboFormChildrenTip: "Elements include nodes and combo", + label: "Markup text and its configuration", + formLabel: "Label Text", + formLabelTip: "Text text, if there is none it will not be displayed", + formLabelStyleFill: "Text Color", + formLabelStyleFontSize: "Text Size", + formLabelRefX: "X Offset", + formLabelRefXTip: "The offset of the label in the x-direction", + formLabelRefY: "Y Offset", + formLabelRefYTip: "The offset of the label in the y-direction", + formLabelPosition: "Position", + comboFormLabelPosition: "Position of the label text relative to the position within the grouping", + nodeFormLabelPosition: "Position of the label text relative to the node", + edgeFormLabelPosition: "Position of label text relative to edge", + nodeFormLabelOffset: "Text Offset", + edgeFormLabelAutoRotate: "Follow the side rotation", + edgeFormLabelAutoRotateTip: "Whether the label text follows the side rotation", + edgeFormType: "Edge Type", + edgeFormTypePlease: "The edge type cannot be null", + edgeFormSource: "Start Element", + edgeFormSourcePlease: "Edge start element cannot be empty", + edgeFormTarget: "End Element", + edgeFormTargetPlease: "Edge end element cannot be empty", + edgeFormStartArrow: "Starting Arrow", + edgeFormStartArrowTip: "Default arrows are drawn at the beginning of edges", + edgeFormEndArrow: "Closing Arrow", + edgeFormEndArrowTip: "Default arrows are drawn at the end of edges", + nodeFormComboId: "Node Combo", + nodeFormComboIdTip: "Putting nodes into the combo box", + nodeFormId: "Node ID", + nodeFormIdPlease: "Node Unique ID", + nodeFormIdNot: "Node Element ID Error", + nodeFormType: "Node Type", + nodeFormX: "x Coordinate", + nodeFormY: "Y Coordinate", + nodeFormSize: "Node Size", + nodeFormSizeCircle: "Diameter, position of the center of the circle corresponding to the position of the node", + nodeFormSizeStar: "The size of the star, the center of the star is the position of the node.", + nodeFormSizeDonut: "Diameter, position of the center of the circle corresponding to the position of the node", + nodeFormSizeTriangle: "Side lengths, the center of the triangle is the position of the nodes.", + nodeFormSizeEllipse: "Long shaft diameter, short shaft diameter", + nodeFormSizeOhter: "Width, Height", + nodeFormDirection: "Direction", + nodeFormTypeImage: "Image", + nodeFormImg: "Image Source", + nodeFormClipShow: "Crop Feature", + nodeFormClipType: "Crop Image Shape", + nodeFormClipTypeCircle: "Radius of the clipped circle", + nodeFormClipTypeRectWidth: "Width of the clipping rectangle", + nodeFormClipTypeRectHeight: "Length of the clipping rectangle", + nodeFormClipTypeEllipseRx: "Radius of the long axis of the clipping ellipse", + nodeFormClipTypeEllipseRy: "Radius of the short axis of the clipped ellipse", + nodeFormClipX: "The x-coordinate of the cropped figure", + nodeFormClipY: "The y-coordinate of the cropped figure", + nodeFormIcon: "Icon", + nodeFormIconShow: "Does It Show", + nodeFormIconImg: "Icon Source", + nodeFormIconWidth: "Width", + nodeFormIconHeight: "Height", + nodeFormIconOffset: "Offset", + comboTypeCircle: "Circle", + comboTypeRect: "Rect", + comboLabelPositionTop: "Top", + comboLabelPositionLeft: "Left", + comboLabelPositionRight: "Right", + comboLabelPositionBottom: "Bottom", + comboLabelPositionCenter: "Center", + edgeFormIdPlease: "Edge Unique ID", + edgeFormIdNot: "Edge Element ID Error", + edgeTypeLine: "Straight line, a line connecting two nodes", + edgeTypePolyline: "Folding line, a line formed by multiple line segments connecting two endpoints", + edgeTypeArc: "Circular arc, a segment of a circular arc connecting two nodes", + edgeTypeQuadratic: "Second-order Bessel curves, curves with only one control point", + edgeTypeCubic: "Third-order Bessel curve with two control points", + edgeTypeCubicV: "Vertical third-order Bessel curve", + edgeTypeCubicH: "Horizontal third-order Bessel curve", + edgeTypeLoop: "Self-Loop", + edgeTypeCubicAnimateLineDash: "Third-order Bessel curve, dashed motion", + edgeTypeCubicAnimateCircleMove: "Third-order Bézier curves with dots moving along edges", + edgeTypeLineAnimateState: "Straight line with state animations", + edgeLabelPositionStart: "Start", + edgeLabelPositionMiddle: "Middle", + edgeLabelPositionEnd: "End", + nodeTypeCircle: "Circle", + nodeTypeRect: "Rect", + nodeTypeEllipse: "Ellipse", + nodeTypeDiamond: "Diamond", + nodeTypeTriangle: "Triangle", + nodeTypeStar: "Star", + nodeTypeImage: "Image", + nodeTypeCircleAnimateShapeR: "Circle, node zoom in and out animation", + nodeTypeCircleAnimateShapeStroke: "Circular, node edge spread animation", + nodeTypeRectAnimateState: "Rectangle with state animations", + nodeTypeImageAnimateState: "Image with status animation", + nodeLabelPositionTop: "Top", + nodeLabelPositionLeft: "Left", + nodeLabelPositionRight: "Right", + nodeLabelPositionBottom: "Bottom", + nodeLabelPositionCenter: "Center", + nodeDirectionUp: "Up", + nodeDirectionDown: "Down", + nodeDirectionLeft: "Left", + nodeDirectionRight: "Right", + nodeImageClipCircle: "Circle", + nodeImageClipRect: "Rect", + nodeImageClipEllipse: "Ellipse", + nodeImageBase: "Base Stations", + nodeImageCloud: "Cloud", + nodeImageService: "Server", + nodeImageServiceDB: "Server Data", + nodeImageFirewall: "Firewall", + nodeImageMobile: "Mobile", + nodeImageUser: "User", + graphModeDefault: "Default", + graphModeEdit: "Edit", + graphNotInfo: "no information", + graphMenuHide: "Hide", + graphMenuHideAllShow: "Show all hidden items", + graphMenuEdit: "Edit", + graphMenuDel: "Delete", + graphMenuAddEdge: "New Edge", + graphMenuAddNode: "New Node", + graphMenuAddCombo: "New Combo", + graphCanvas: "Canvas", + graphCombo: "Combo", + graphNode: "Node", + graphEdge: "Edge", + }, + }, + system:{ + user: { + userInfo:' User Info', + userNum: 'User Number', + account: 'Account', + userName: 'Nick Name', + permission: 'Role', + className: 'Class', + loginIp: 'Login Address', + loginTime: 'Login Time', + status: 'Status', + userNameTip:'The account number can only contain strings of uppercase letters, lowercase letters and numbers with a minimum length of 6 digits', + passwdTip:'The password should contain at least uppercase and lowercase letters, numbers, special symbols, and no less than 6 digits', + nickNameTip:'Nicknames no less than 2 digits', + emailTip:'Please enter the correct email address', + phoneTip:'Please enter the correct phone number', + resetPwd:'Reset Password', + start:'Enable', + stop:'Pending', + normalcy:'Active', + deactivate:'Pending', + delSuss:'Successfully deleted', + sureTip:'Are you sure you want to {text} {userName} user?', + delSure:'Confirm deletion of data item with user ID {userId}?', + export:'Export', + import:'Import', + exportSure:'Are you sure to export the xlsx table file based on search criteria?', + phone:'Phone Number', + createTime:'Creation time', + userTop:'User profile', + sex:'User Gender', + email:'E-mail', + fromClass:'Class', + userWork:'User position', + userWorkPlease: 'Please select user post', + userTip:'User Description', + loginPwd:'Password', + updateSure:'Do you want to update existing data', + downloadObj:'Download Tpl', + importTitle:'User Import', + importOk: 'Successfully read and download imported templates', + tipRowErr: "Failed to get user information", + viewInfoErr: "Errors in user records", + lock:'Lock', + inactive:'Inactive', + active:'Active', + }, + config: { + configName: "Config Name", + configNamePlease: 'Please input the Config Name correctly', + configKey: "Config Key", + configKeyPlease: 'Please enter the Config Key correctly', + configType: "Built In", + configValue: "Config Value", + configValuePlease: 'Please enter the Config Value correctly', + remark: "Config description", + createTime: "Create Time", + refreshCache: "Refresh Cache", + viewInfo: "Config Info", + viewInfoErr: "Failed to get Config Info", + addInfo: "Add Parameter Configuration", + editInfo: "Modify the Config Info", + tipRowErr: "There is an error in the Config Info record", + delTip: "Confirm deleting the data item with parameter number [{num}] ?", + delOk: "Deleted Successfully", + exportTip: "Confirm exporting xlsx table files based on search criteria?", + exportOk: "Completed Export", + refreshCacheTip: "Are you sure you want to refresh the parameter configuration cache?", + refreshCacheOk: "Refresh Cache Successful", + }, + setting: { + charMaxLen: 'characters length', + saveSubmit: 'Submit&Save', + saveSuccess: 'Submit ands Save Successful', + revert: 'Reset', + revertSuccess: 'Reset Successful', + uploadFile: 'Upload File', + uploadFormat: 'Only the upload file format ({format}) is supported', + uploadSize: 'The file size must be less than {size}MB.', + uploadSuccess: 'File uploaded successfully, submit and save to take effect', + sysLogo: 'System Logo', + sysLogoBrand: 'Brand', + sysLogoIcon: 'Icon', + sysLogoUpload: 'Upload Logo', + sysLogoTipContent: 'Confirm that you want to submit the currently changed logo file?', + sysLogoTipContentUpload: 'Are you sure you want to upload the logo file?', + sysLogoInstruction: 'The system logo display style is shown in the preview area.', + sysLogoInstruction1: 'If you want to change the image, please adjust it accordingly before uploading.', + sysLogoInstruction2: 'Show the whole picture to the system logo area, please use transparent background, size ratio', + sysLogoInstruction3: 'Displayed as logo + system name to the system logo area.', + sysLogoInstruction4: 'Logo size ratio', + sysName: 'System Name', + sysNameLimitation: 'System Name Restrictions', + sysNameTipContent: 'Confirm that you want to submit the current changed system name?', + sysCopyright: 'Copyright Notice', + sysCopyrightLimitation: 'Copyright Notice Limitation', + sysCopyrightTipContent: 'Confirmation of submitting a copyright notice for the current change?', + sysLoginBg: 'Login Screen Background', + sysLoginBgNone: 'No background image', + sysLoginBgUpload: 'Upload background image', + sysLoginBgTipContentUpload: 'Confirmed to upload login screen background file?', + sysLoginBgTipContent: 'Are you sure you want to submit the currently changed login screen background?', + sysLoginBgTipContentRevert: 'Are you sure you want to restore the background image to the initial system default background?', + sysLoginBgInstruction: 'The background style of the system login interface is shown in the preview area, please refer to the actual display.', + sysLoginBgInstruction1: 'Please select the appropriate image for uploading.', + sysLoginBgInstruction2: 'Restore the background image to the initial system default background by clicking the Restore button.', + sysHelpDoc: 'System User Documentation', + sysHelpDocTipContentUpload: 'Are you sure you want to upload the system documentation?', + sysHelpDocTipContent: 'Confirm that you want to submit system usage documentation for the current [{lang}] change?', + sysHelpDocOpen: 'Document Access', + sysHelpDocInstruction: 'Description of system functions and use, PDF document manual', + sysOfficialUrl: 'Official Link', + sysOfficialUrlErrTip: 'Please fill in a valid link address http(s)://', + sysOfficialUrlTipContent: 'Do you confirm that you want to submit the current change of the official website address?', + sysOfficialUrlNo: 'No link address', + sysOfficialUrlOpen: 'Open the official website.', + sysOfficialUrlInstruction: 'Official website link address', + sysOfficialUrlInstruction1: 'start, if you need to hide do not jump to fill in the', + i18n: "Internationalization Switch", + i18nOpen: "Display Switch", + i18nDefault: "Default Languages", + i18nInstruction: 'Whether to display the internationalization switch and set the system default language', + reset: "System Reset", + resetInstruction: "A system reset will erase all data in the current system, please proceed with caution!!!!", + resetTipContent: 'Are you sure you want to clear all data from the current system and insist on continuing?', + homeInstruction:'Set the home page', + home: 'Home Page', + homeTip:'Do you want to submit the current interface as the system interface?', + homeSet:'Home Page Settings', + }, + role:{ + allScopeOptions:'All data permissions', + byMyselfScopeOptions:'Custom data permissions', + onlyClassScopeOptions:'Data permissions of this class', + classAllScopeOptions:'Data permissions for this class and the following', + myselfScopeOptions:'Only personal data permissions', + roleId:'Role Number', + roleName:'Role Name', + roleKey:'Role Key', + roleSort:'Role Sort', + roleStatus:'Role Status', + createTime:'Creation Time', + trueValue:'Please enter {msg} correctly', + roleInfo:'Role information', + distribute:'Assign data permissions', + open:'Enable', + close:'Pending', + statusSure:'Are you sure you want {text} {roleName} role?', + statusFailed:'{roleName} {text} failed', + delSure:'Confirm to delete the data item with role number [{roleId}]?', + distributeUser:'Assign Users', + roleMark:'Role Description', + menu:'Menu Permissions', + roleKeyTip:"Privilege identifiers are used to control page controls or routing interfaces", + openSwitch:'Expand/Collapse', + selAllSwitch:'Select All/Deselect All', + relationSwitch:'Node Linkage', + normal:'Active', + stop:'Pending', + preScope:'Scope of authority', + dataPer:'Data permission', + userId:'User Number', + account:'Login Account', + userName:'User Nickname', + phone:'Phone', + email:'Email', + userStaus:'User Status', + selectPls:'Please select the user to be assigned', + suss:'{oper}success', + giveUser:'Authorized User', + cancelGive:'Cancel authorization', + cancelSure:'Confirm to cancel the authorization of the data item with user number [{userId}]?', + batchCancel:'Batch cancellation of authorization', + }, + dept:{ + classInfo:' Class Information', + className:'Class Name', + classId:'Class Number', + classSort:'Class Sorting', + status:'Class Status', + createTime:'Creation Time', + highClass:'Higher Office', + emailTip:'Please input the correct email address', + phoneTip:'Please enter the correct phone number', + node:'Root Node', + delSure:'Are you sure to delete the data item with class number [{deptId}]?', + open:'Exhibition', + close:'Fold', + addClass:'Add new sub-class', + admin:'Principal', + phone:'Contact Number', + email:'Mail', + }, + post:{ + positionInfo:'Position Information', + positionId:'Position Number', + positionCode:'Position Code', + positionName:'Position Name', + positionSort:'Position Sort', + positionStatus:'Position Status', + positionMark:'Position Description', + createTime:'Creation Time', + codeTip:'Please enter the position code correctly', + nameTip:'Please enter the position name correctly', + delSure:'Confirm to delete the data item with post number [{postId}]?', + }, + log:{ + operate:{ + operId:'Log ID', + moduleName:'Module Name', + workType:'Operation', + operUser:'Operator', + requestMe:'Request Method', + host:'Request Host', + operStatus:'Status', + operDate:'Time', + useTime:'Time Lap', + logInfo:'Operation Log Information', + delSure:'Are you sure to delete the data item with access number [{ids}]?', + delAllSure:'Confirm to clear all login log data items?', + delAllSuss:'Cleared successfully', + operModule:'Operation module', + operTime:'Operation time', + delAll:'Clear', + fail:'Failed', + suss:'Normal', + RequestIp:'Request Address', + operMe:'Operation Method', + reqParam:'Request Parameter', + operInfo:'Operation Information', + }, + login:{ + operId:'Log ID', + account:'Login Account', + loginIp:'Login Address', + loginLoc:'Login Location', + os:'Operating System', + browser:'Browser', + status:'Status', + info:'Login Information', + loginTime:'Login Time', + delSure:'Are you sure to delete the data item with access number [{ids}]?', + delAllSure:'Confirm to clear all login log data items?', + delAll:'Clear', + unlock:'Unlock', + unlockSuss:'{userName} unlocked successfully', + unlockSure:'Confirm to unlock user [{username}] data item?', + }, + }, + menu:{ + menuInfo:' Menu Information', + menuName:'Menu Name', + menuId:'Menu Number', + menuSort:'Menu Sort', + menuTitle:'Menu Icon', + perId:'Permission ID', + formLoc:'Component Path', + status:'Display Status', + menuStatus:'Menu Status', + menuType:'Menu Type', + createTime:'Creation Time', + highMenu:'Superior Menu', + routerAdrr:'Routing Address', + delSure:'Confirm to delete the data item with menu number [{menuId}]?', + addSon:'Add Submenu', + hidden:'Hidden', + show:'Show', + root:'Directory', + menu:'Menu', + button:'Button', + yes:'Yes', + no:'No', + cache:'Cache', + noCache:'Not cache', + pageCache:'Page cache', + local:'Internal Address', + mark:'Menu Description', + pathTip:`The accessed routing address, such as: user, /auth 1. If the network address requires internal access, start with http(s):// Menu behavior (root node): The current window opens the menu behavior, (non-root node) :Embedded window. 2. If the network address requires external access, set the internal address option to No. Menu behavior: Open a new tab 3. If the embedded subpage needs to hide the page, set the display status option to Hide address splicing to embed routing. address`, + sonPage:'Subpage address', + componentTip:' The component path accessed by views in the page component directory, such as: system/user/index Note: The routing address without the .vue file suffix is the network address and can be filled in as a link', + perms:`Permission identification example: monitor:server:query Permission identification is used in the back-end controller, such as:['monitor:server:query'] Permission identification is used in the front-end Vue page, such as: v-perms:has="['monitor:server:query']"` + }, + dict:{ + dictInfo:'Dictionary Type Information', + dictId:'Dictionary Number', + dictName:'Dictionary Name', + dictType:' Dictionary Type', + dictSatus:'Status', + createTime:'Creation Time', + realDictName:'Please enter the dictionary name correctly', + realDictType:'Please enter the dictionary type correctly', + delSure:'Confirm to delete the data item with parameter number [{dictId}]?', + reloadSure:'Are you sure you want to refresh the dictionary data cache?', + reloadSuss:'Refresh cache successfully', + dictData:'Dictionary Data', + reload:'Refresh Cache', + mark:'Dictionary Description', + colorSelect:'Color Picker', + }, + dictData: { + dictType: "Dictionary name", + dictCode: "Data Code", + dictLabel: "Data Key", + dictLabelPleac: "Please enter the data key correctly", + dictValue: "Data Value", + dictValuePleac: "Please enter the data value correctly", + dictSort: "Data Sort", + status: "Status", + createTime: "CreateTime", + tagType: "Tag Type", + tagTypeShow: "Tag Type Show", + tagClass: "Tag Class", + remark: "Remark", + viewInfo: "Dictionary Data Info", + viewInfoErr: "Failed to get dictionary data information", + addInfo: "Add Dictionary Data", + editInfo: "Modifying Dictionary Data", + delTip: "Confirm deleting the data item with dictionary data code [{txt}]?", + delOk: "Deleted successfully", + exportTip: "Confirm exporting xlsx table files based on search criteria?", + exportOk: "Completed export", + typeDataErr: "Failed to get dictionary type information", + }, + quickStart: { + start: 'Start Setup', + skip: 'Skip', + finish: 'Complete Setup', + stepPrev: 'Previous', + stepNext: 'Next', + exit: 'Exit', + save: 'Save Info', + sysTitle: 'System Configuration', + sysAdmin: 'Administrator', + sysInfo: 'System Info', + sysLogo: 'System Logo', + sysLogoTip: 'Show the image to the system logo area to see the effect, please use a transparent background, the size of the proportion to adapt to the size of the area', + sysName: 'System Name', + sysNameTip: 'Limit system name to 20 characters in length', + sysUploadLogo: 'Confirmation of uploading the system logo file?', + sysUploadOk: 'File uploaded successfully, please save the information', + sysSave: 'Save', + sysSaveOk: 'Info saved successfully!', + sysPrevTip: 'Confirmed to go back to the previous step?', + sysNextNe: 'Confirming that you want to do a network element installation?', + sysNextDone: 'Confirmed to skip the network element installation?', + stepNeInfoTitle: "Service Configuration", + stepNeInfoDesc: "Setting the service terminal corresponding to a network element", + stepNeInfoStepPrev: 'Confirming that you want to exit the network element installation step?', + stepNeInfoStepNext: 'Confirm that you want to proceed to the next step to configure the parameters of the network element?', + stepPara5GTitle: "Configuration Parameter", + stepPara5GDesc: "Setting network element global parameter information", + savePara5GOk: 'Save Success!', + stepPara5GStepPrev: 'Confirm that you want to abandon the current change and return to the previous step?', + stepPara5GStepNext: 'Confirm that you want to proceed to the next step for the network element service installation?', + stepInstallTitle: "Service Install", + stepInstallDesc: "Installation of network element services to service terminals", + stepInstallStepPrev: 'Confirm that you want to abandon the current change and return to the previous step?', + stepInstallStepNext: 'Confirm that you want to proceed to the next step for network element license authorization?', + stepInstallText: 'Select Install', + stepInstallTip: 'Confirm the installation of the new version of the chosen Net Meta?', + stepInstallModal: 'Network Element For Install', + stepInstallNotNewVer: 'No new version found', + stepInstallDone: 'Installation complete, service initialized', + stepInstallFail: 'Installation fails, check if the service terminal environment is available!', + stepLicenseTitle: "Service License", + stepLicenseDesc: "Obtaining a license activation code for authorization authentication", + stepLicenseReload: 'Select Refresh', + stepLicenseReloadTip: 'Confirm refreshing selected license information?', + stepLicenseDownCode: 'Select Download Activation Code', + stepLicenseDownCodeTip: 'Confirmed to download the selected network element license activation code to a text file?', + stepLicenseStepPrev: 'Confirm that you want to abandon the current change and return to the previous step?', + stepLicenseStepNext: 'Confirmed to end the network element installation step?', + stepLicenseStepNext2: 'Please download the Net Element License Authorization Code file to save it and contact the Net Element vendor to get the authorization license', + stepLicenseEnd: 'End', + doneTitle: "Completing the Configuration", + doneTip: 'Please enter the system and configure it as appropriate.', + doneNETitle: 'Configuration of the network element installation has been performed', + doneNEDesc: 'In case of abnormal network elements, the license can be reinstalled in the system', + doneSkipTitle: 'No network element installation configuration', + doneSkipDesc: 'The system will initialize the network element information by default, which can be modified or installed within the system.', + donePrevTip: 'Confirmed to go back to the previous step?', + doneOkTip: 'Confirm that you have completed the setup and started using it?', + }, + }, + mmlManage: { + cmdTitle: "Command Navigator", + cmdConsole: "consoles", + cmdOpTip: "Select the item to be operated in the left command navigation!", + cmdNoTip: "{num} no optional command operation", + require: "Mandatory parameter: {num}", + requireUn: "[ {display} ] input value is of unknown type", + requireString: "[ {display} ] parameter value is invalid.", + requireInt: "[ {display} ] parameter value not in reasonable range {filter}", + requireIpv4: "[ {display} ] not a legitimate IPV4 address", + requireIpv6: "[ {display} ] not a legitimate IPV6 address.", + requireEnum: "[ {display} ] is not a reasonable enumeration value.", + requireBool: "[ {display} ] is not a reasonable boolean value.", + requireFile: "[ {display} ] is not a value that matches the parameter file type.", + cmdQuickEntry: "Command Quick Entry", + cmdQuickEntryHelp: "Line feed (Shift + Enter), Execute (Enter)", + cmdParamPanel: "Parameter Panel", + clearForm: "Reset", + clearLog: "Clear Logs", + exec: "Execute", + uploadFileTip: 'Are you sure you want to upload the file?', + uploadFileOk: 'File Upload Successful', + uploadFileErr: 'File Upload Failed', + neOperate:{ + mml: "General", + mml2: "Standard", + }, + omcOperate:{ + noOMC: "No OMC network elements", + }, + udmOpesrate:{ + noUDM: "No UDM network elements", + }, + mmlSet: { + operationtitle: "Interface Settings", + saveText: "Save Settings", + ipadd: "Listening to IP addresses", + ipaddPlease: "Please enter the listening IP address", + port: "listening port", + portPlease: "Please enter the remote port, 0~65535", + okChange: "Interface settings saved successfully", + noChange: "No change in interface settings", + }, + }, + tool: { + help: { + fileName: "5G Core Network Network Management Operations Manual.pdf", + download: "Download", + pdfViewer: "In-browser preview", + pdfViewerErr: "Sorry, your browser does not support PDF preview!", + }, + terminal: { + start: "Start Page", + new: "To Create", + more: "More", + reload: "Reload Current Tab", + reloadTip: "Are you sure you want to refresh and reconnect the current [{num}] terminal link?", + current: "Close Current Tab", + other: "Close Other Tabs", + otherTip: "Confirm that you want to close other terminal links?", + all: "Close All Tabs", + allTip: "Confirmed to close all terminal links?", + closeTip: "Confirm that you want to close the [{num}] terminal link?", + hostSelectTitle: "Select the created host to connect to", + hostSelectShow: "Open Selection", + hostSelectMore: "Load More {num}", + hostSelectHeader: "Host List", + }, + ps:{ + realTimeHigh:"High", + realTimeLow:"Low", + realTimeRegular:"Regular", + realTimeStop:"Stop", + realTime:"Real Time Speed", + pid:"PID", + name:"Program name", + username:"User Name", + runTime:"Run Time", + numThreads:"Thread", + cpuPercent:"CPU Percent", + diskRead:"Disk Read", + diskWrite:"Disk Write", + }, + net:{ + localAddr:"Local Address", + remoteAddr:"Foreign Address", + status:"State", + proto:"Proto", + port:"Port", + }, + }, + }, +}; diff --git a/practical_training/i18n/locales/zh-CN.ts b/practical_training/i18n/locales/zh-CN.ts new file mode 100644 index 00000000..0a3a3561 --- /dev/null +++ b/practical_training/i18n/locales/zh-CN.ts @@ -0,0 +1,2197 @@ +export default { + // 语言 + i18n: '中文', + hello: '你好', + welcome: '欢迎使用,核心网管理平台', + + // 通用 + common: { + title: '登录平台', + desc: '核心网管理平台', + loading: '请稍等...', + inputPlease: '请输入', + selectPlease: '请选择', + tipTitle: '提示', + msgSuccess: '{msg} 成功', + errorFields: '请正确填写 {num} 处必填信息!', + tablePaginationTotal: '总共 {total} 条', + noData: "暂无数据", + zebra:'表格斑马纹', + ok: '确定', + cancel: '取消', + close: '关闭', + search: '搜索', + reset: '重置', + viewText: '查看详情', + getInfoFail:'获取信息失败', + view: '查看', + addText: '新增', + editText: '编辑', + deleteText: '删除', + downloadText: '下载', + import:'导入', + export:'导出', + uploadText: '上传', + unableNull:'不能为空', + moreText: '更多', + searchBarText: '搜索栏', + reloadText: '刷新', + columnSetText: '列设置', + columnSetTitle: '列展示/排序', + sizeText: '密度', + size: { + default: '默认', + middle: '中等', + small: '紧凑', + }, + switch: { + show: '显示', + hide: '隐藏', + open: '打开', + shut: '关闭', + launch: '展开', + fold: '折叠', + }, + rowId: '编号', + createTime: '创建时间', + updateTime: '更新时间', + remark: '备注', + description: '说明', + operate: '更多操作', + operateOk: '操作成功!', + operateErr: '操作失败!', + copyText: "复制", + copyOk: '复制成功!', + units: { + second: '秒', + minute: '分钟', + hour: '小时', + day: '天', + week: '周', + month: '月', + year: '年', + core: '核', + } + }, + + // 组件 + components: { + CronModal: { + title: "Cron表达式生成", + addon: "表达式预览:", + day1: "每一天", + day21: "每隔", + day22: "天执行一次,从", + day23: "日开始", + day31: "周期从", + day32: "到", + day33: "日", + day4: "指定日(可多选)", + day5: "本月最后一天", + hour1: "每一小时", + hour21: "每隔", + hour22: "小时执行一次,从", + hour23: "时开始", + hour31: "周期从", + hour32: "到", + hour33: "小时", + hour4: "指定小时(可多选)", + minute1: "每一分钟", + minute21: "每隔", + minute22: "分钟执行一次,从", + minute23: "分钟开始", + minute31: "周期从", + minute32: "到", + minute33: "分钟", + minute4: "指定分钟(可多选)", + month1: "每一月", + month21: "每隔", + month22: "月执行,从", + month23: "月开始", + month31: "周期从", + month32: "到", + month33: "月之间的每个月", + month4: "指定月(可多选)", + second1: "每一秒钟", + second21: "每隔", + second22: "秒执行一次,从", + second23: "秒开始", + second31: "周期从", + second32: "到", + second33: "秒", + second4: "指定秒数(可多选)", + }, + UploadModal:{ + uploadTitle:'数据导入', + uploadTip:'点击选择或将文件拖入边框区域进行上传', + allowSize:'允许上传文件大小', + allowFormat:'允许导入的格式为', + allowFilter:'上传文件大小必须小于', + onlyAllow:'只支持上传文件格式', + }, + LockScreen: { + inputPlacePwd:'请输入锁屏密码', + validSucc:'校验通过', + validError:'校验失败', + backLogin:'退出并重新登录', + backReload:'正在重启,请稍等...', + backReload2:'当准备就绪的时候,你的浏览器会自动刷新。', + systemReset:'正在重置,请稍等...', + systemReset2:'数据信息正在重置', + }, + }, + + // 静态路由 + router: { + index: "主页", + login: "登录", + register: '注册', + page403: '没有访问权限', + page404: '找不到匹配页面', + helpDoc: '系统使用文档', + traceTaskHLR: '跟踪任务 HLR', + lockScreen: '锁屏', + account: { + index: "个人中心", + profile: "个人信息", + settings: "个人设置", + }, + }, + + // 校验 + valid: { + userNameReg: '账号不能以数字开头,可包含大写小写字母,数字,且不少于5位', + userNamePlease: '请输入正确登录账号', + userNameHit: '登录账号', + passwordReg: '密码至少包含大小写字母、数字、特殊符号,且不少于6位', + passwordPlease: '请输入正确登录密码', + passwordHit: '登录密码', + passwordConfirmHit: '确认登录密码', + phoneReg: '手机号码不正确', + phonePlease: '请输入正确的手机号码', + phoneHit: '手机号码', + codePlease: '请输入正确的验证码', + codeHit: '验证码', + codeText: '获取验证码', + codeSmsSend: '发送成功,请注意查看短信', + ipPlease: '请输入有效的IP地址', + ipv4Reg: '不是有效IPv4地址', + ipv6Reg: '不是有效IPv6地址', + }, + + // 布局 + loayouts: { + basic: { + officialUrl: '官网', + helpDoc: '使用手册', + }, + rightContent: { + alarm: "活动告警", + lock: "锁屏", + lockTip: "确认要进行锁屏吗?", + lockPasswd: "解锁密码", + lockPasswdTip: "可不设置密码", + fullscreen: "全屏显示", + theme: "主题明/暗模式", + logout: "退出登录", + profile: "个人中心", + settings: "个人设置", + }, + tabs: { + reload: "刷新当前标签", + more: "更多选项", + closeCurrent: "关闭当前标签", + closeOther: "关闭其他标签", + closeAll: "关闭全部标签", + } + }, + + // 页面 + views: { + index: { + normal:'正常', + abnormal:'异常', + hostName: '主机名', + osInfo: '操作系统信息', + dbInfo: '数据库信息', + ipAddress: 'IP地址', + port: '端口', + version: '软件版本', + cpuUse: 'CPU利用率', + memoryUse: '内存使用', + capability: '用户容量', + serialNum: '序列号', + expiryDate: '许可证到期日期', + neStatus:'网元状态异常', + runStatus:'运行状态', + mark:'简略信息', + object:'对象', + versionNum:'版本号', + systemStatus:'系统状态', + realNeStatus:'网元状态', + reloadTime:'刷新时间', + Critical:'严重告警', + Major:'主要告警', + Minor:'次要告警', + Warning:'警告告警', + Event:'事件告警' + }, + error: { + err403: { + ttile: '没有访问权限', + subTitle:'请不要进行非法操作,您可以返回主页面或返回', + backHome: '返回首页', + back: '返回', + }, + err404: { + ttile: '找不到匹配页面', + subTitle:'对不起,您正在寻找的页面不存在。', + backHome: '返回首页', + tipTitle: '找不到网页?', + paragraph: '尝试检查URL的错误,然后按浏览器上的刷新按钮。', + paragraph1: '尝试在我们的应用程序中找到其他内容。', + }, + }, + login: { + tabPane1: '账号密码登录', + tabPane2: '手机号登录', + registerBtn: '注册账号', + loginBtn: '登录', + loginSuccess: '登录成功', + loginMethod: '其他登录方式:', + loginMethodWX: '微信扫一扫登录', + loginMethodQQ: 'QQ扫码登录', + }, + register: { + registerBtn: '注册', + loginBtn: '使用已有账号登录', + passwordErr: '请正确输入确认密码', + passwordConfirmErr: '两次输入的密码不一致', + tipContent: '恭喜您,{username} 账号注册成功!', + tipBtn: '前往登录', + }, + account: { + settings: { + baseInfo: "基础信息", + sex: "用户性别", + sexPleace: "请选择用户性别", + email: "电子邮箱", + emailPleace: "请输入正确的电子邮箱", + phonenumber: "手机号码", + phonenumberPleace: "请输入正确的手机号码", + nick: "用户昵称", + nickPleace: "请输入用户昵称", + nickTip: "昵称少于2位", + profileTip: "确认要提交修改用户基本信息吗?", + profileOk: "用户基本信息修改成功!", + know: "我知道了", + uploadPleace: "请选择等比大小图片作为头像,如{txt}", + upload: "上传/变更图片", + uploadFormat: '只支持上传图片格式({format})', + uploadSize: '图片文件大小必须小于 {size}MB', + uploadTip: "确认要上传/变更用户头像吗?", + uploadOk: "头像上传/变更成功", + resetPasswd: "重置密码", + oldPassword: "旧密码", + oldPasswordTip: "旧密码不能为空,且不少于6位", + oldPasswordPleace: "请输入旧密码", + newPassword: "新密码", + newPasswordTip: "密码至少包含大小写字母、数字、特殊符号,且不少于6位", + newPassworddPleace: "请输入新密码", + confirmPassword: "确认新密码", + confirmPasswordPleace: "请确认新密码", + submit: "提交修改", + reset: "重置", + submitTip: "确认要提交修改密码吗?", + submitOkTip: "恭喜您,{num} 账号密码修改成功!", + submitOk: "重新登录", + equalToPassword: "请输入确认新密码", + equalToPasswordOld: "与旧密码一致,请重新输入新密码", + equalToPasswordErr: "两次输入的新密码不一致", + styleLayout: "个性化", + area1: "布局属性", + layout: "整体布局", + layoutActions: "导航模式模块设置", + layoutSide: "左侧菜单布局", + layoutTop: "顶部菜单布局", + layoutMix: "混合菜单布局", + color: "风格配色", + colorActions: "整体风格配色设置", + colorRandomly: "随机", + theme: "主题明暗模式", + themeActions: "切换浅色/暗黑模式", + navTheme: "深色菜单", + navThemeActions: "只能改变导航模式的菜单", + fixedHeader: "固定顶部导航栏", + fixedHeaderActions: "顶部导航栏是否固定,不随滚动条移动", + fixSiderbar: "固定左侧菜单", + fixSiderbarActions: "左侧菜单是否固定,仅左侧菜单布局时有效", + splitMenus: "自动分割菜单", + splitMenusActions: "顶部有多级菜单时显示左侧菜单,仅混合菜单布局时有效", + area2: "内容区域", + tabRender: "导航标签项", + tabRenderActions: "是否显示顶部Tab导航标签项", + menuHeaderRender: "菜单头", + menuHeaderRenderActions: "是否显示左侧菜单栏顶部LOGO区域", + footerRender: "页脚", + footerRenderActions: "是否显示底部导航栏", + headerRender: "顶栏", + headerRenderActions: "是否显示顶部导航栏", + }, + profile: { + phonenumber: "手机号码", + email: "用户邮箱", + deptName: "所属班级", + postGroup: "拥有职位", + roleGroup: "拥有角色", + loginIp: "登录地址", + loginDate: "登录时间", + list: "列表", + empty: "空状态", + description: "暂无数据,尝试刷新看看", + }, + }, + configManage: { + neManage: { + addNe:'添加网元', + delSure:'确认删除网元名称为{msg}的数据项 ', + editNe:'修改网元', + exportSure:'确认导出网元名称为 {msg} 的配置信息', + exportTip:'导出成功,请到备份管理进行下载', + getInfo:'获取网元信息失败', + neType:'网元类型', + neTypePlease: '请输入网元类型', + neId:'网元内部标识', + neName:'网元名称', + neTypeTip:'填写创建的网元类型,如:SMF', + uid:'资源唯一标识', + uidTip:'请输入资源唯一标识', + ip:'IP地址', + mac:'网元物理地址', + macTip:'能够定位网元的物理地址(MAC)', + port:'端口', + portTip:'最大范围0~65535', + pvflag:'网元虚拟化标识', + pnf:'物理网元', + vnf:'虚拟网元', + province:'网元服务省份', + vendorName:'厂商名称', + dn:'网络标识', + reload: '重载', + restart: '重启', + totalSure:'确认{oper}网元名称为 {msg} 的网元', + stop: '停止', + start: '启动', + log: '日志', + export: '导出', + import: '导入', + fileForm:'文件来源', + selectPlease:'请选择导入文件来源', + server:'服务器文件', + local:'本地文件', + fileSelect:'请选择当前导入文件', + sync:'同步到网元', + open:'开', + close:'关', + addFail:'新增失败', + operFail:'操作失败' + }, + backupManage: { + setBackupTask: '设置自动备份时间', + neTypePlease: '查询网元类型', + neType: '网元类型', + neID: '网元内部标识', + fileName: '文件名', + createAt: '创建时间', + remark:'备份说明', + edit:'编辑备份文件', + totalSure:'确认{oper}记录编号为 {id} 的数据项?', + }, + softwareManage: { + sendBtn: '下发', + runBtn: '激活', + backBtn: '回退', + historyBtn: '下发记录', + neTypePlease: '选择网元类型', + neType: '网元类型', + fileName: '文件名', + version: '版本号', + versionPlease: '版本号不能为空', + updateTime: '上传时间', + description: '功能描述', + deleteTip: '确认删除 【{fileName}】 的软件数据项?', + downloadTip: '确认下载 【{fileName}】 的软件数据项?', + updateComment: '软件说明', + updateCommentPlease: '请输入软件说明', + updateFile: '软件文件', + updateFilePlease: '请上传更新软件文件', + verifyFile: '校验文件', + selectFile: '选择文件', + sendTitle: '下发软件版本', + sendContent: '确认下发软件包为【{fileName}】的文件到对应网元?', + runTitle: '激活软件版本', + runContent: '确认在对应网元激活已下发【{fileName}】的软件版本?', + backTitle: '回退软件版本', + backContent: '确认在对应网元回退已下发【{fileName}】的软件版本?', + neId: '对应网元', + neIdPlease: '请选择对应网元', + versions:'版本', + upVersions:'升级前版本', + backVersions:'回退前版本', + status:'状态', + letUpTime:'激活时间', + createTime:'创建时间', + onlyAble:'只支持上传文件格式 {fileText}', + nullVersion:'当前网元无可回退版本', + }, + license: { + neTypePlease: '选择网元类型', + neType: '网元类型', + serialNum: '序列号', + createTime: '时间', + comment: '说明', + updateComment: 'License说明', + updateCommentPlease: '请输入License说明', + updateFile: 'License文件', + updateFilePlease: '请上传更新License文件', + selectFile: '选择文件', + neId: '网元内部标识', + neIdPlease: '请选择对应网元', + }, + configParam:{ + dataNull:'暂无配置项数据', + editSuss:'修改成功', + editFail:'修改失败', + unable:'非法操作属性值', + delSure:'确认删除Index为 【{value}】 的数据项?', + addSuss:'新增成功', + addFail:'新增失败', + delArraySure:'确认删除{arrayChildTitle} Index 为 【{value}】 的数据项?', + parUnable:'参数值不在合理范围', + ipv4Tip:'不是合法的IPV4地址', + ipv6Tip:'不是合法的IPV6地址', + enumTip:'不是合理的枚举值', + boolTip:'不是合理的布尔类型的值', + default:'输入值是未知类型', + reloadSuss:'网元重新加载完成', + reloadFail:'网元重新加载失败', + neNUll:'暂无网元列表数据', + reload:'重载', + post:'提交', + editSure:'确认更新该属性值吗?', + arraryEdit:'确认提交更新 Index 为 【{value}】 的记录吗?', + addSure:'确认提交新增 Index :【{value}】 的记录吗?', + }, + configParamForm: { + treeTitle: "配置导航", + treeSelectTip: "左侧配置导航中选择配置项信息!", + neType: "网元类型", + neTypePleace: "请选择网元类型", + noConfigData: "暂无配置项数据", + updateValue: "【 {num} 】 属性值修改成功", + updateValueErr: "属性值修改失败", + updateItem: "修改 Index 为 {num} 记录成功", + updateItemErr: "记录修改失败", + delItemOk: "删除 Index 为 {num} 记录成功", + addItemOk: "新增 Index 为 {num} 记录成功", + addItemErr: "记录新增失败", + requireUn: "【 {display} 】输入值是未知类型", + requireString: "【 {display} 】参数值不合理", + requireInt: "【 {display} 】参数值不在合理范围 {filter}", + requireIpv4: "【 {display} 】不是合法的IPV4地址", + requireIpv6: "【 {display} 】不是合法的IPV6地址", + requireEnum: "【 {display} 】不是合理的枚举值", + requireBool: "【 {display} 】不是合理的布尔类型的值", + editOkTip: "确认更新该【 {num} 】属性值吗?", + updateItemTip: "确认更新Index为 【{num}】 的数据项?", + delItemTip: "确认删除Index为 【{num}】 的数据项?", + arrayMore: "展开", + ptDiff: '对比示例', + ptDiffExample: '示例配置', + ptDiffSelf: '当前个人', + ptDiffLoad: '加载更多', + ptDiffMerge: '差异对比', + ptDiffRest: '还原此版本', + ptHistory: '历史记录', + ptReset: '重置为示例', + ptLoad: '载入当前网元配置', + ptExport: "导出Excel", + ptExportTip: "导出网元配置数据到Excel文件中", + ptApplyShow: '查看学生', + ptApply: '申请', + ptApplyNE: '应用配置到网元', + ptApplyStu: '申请配置应用到 {ne}', + ptApplyStuRack: '退回该学生配置', + ptApplyStuNE: '应用该学生配置', + }, + }, + dashboard: { + overview:{ + title: "核心网系统看板", + fullscreen: "点击全屏显示", + toRouter: "点击跳转详情页面", + skim: { + users: "用户数", + userTitle:'用户信息', + imsUeNum: "IMS 会话数", + smfUeNum: "Data 会话数", + gnbBase: "5G 基站数", + gnbUeNum:'5G 用户数', + enbBase: "4G 基站数", + enbUeNum:'4G 用户数', + baseTitle:'在线信息', + }, + upfFlow:{ + title: "用户面吞吐量", + up:'上行', + down:'下行' + }, + upfFlowTotal:{ + title:'流量信息', + up:'上行', + down:'下行' + }, + alarmTypeBar:{ + alarmSum:'告警统计', + topTitle:"TOP3", + }, + resources: { + title: "资源情况", + sysMem: "系统内存", + sysCpu: "系统CPU", + sysDisk: "系统存储", + neCpu: "网元CPU", + }, + topology: { + title: "网络拓扑", + normal: "正常", + abnormal: "异常", + }, + userActivity: { + title: "用户活动", + type: "类型", + duration: "时长", + caller: "主叫", + called: "被叫", + result: "结果", + time: "时间", + resultOK: "成功", + }, + }, + cdr: { + recordType: "记录行为", + realTimeDataStart: "开启实时数据", + realTimeDataStop: "关闭实时数据", + cdrInfo: "CDR信息", + time: "记录时间", + rowInfo: "记录信息", + type: "记录类型", + duration: "通话时长", + seizureTime: "呼叫开始时间", + releaseTime: "挂断结束时间", + caller: "主叫", + called: "被叫", + result: "结果", + resultOk: "成功", + resultFail: "失败", + delTip: "确认删除编号为【{msg}】的数据项?", + exportTip: "确认导出当前查询条件的话单数据吗?(导出最大支持一万条)", + smfChargingID: '计费ID', + smfSubscriptionIDData: '订阅 ID 数据', + smfSubscriptionIDType: '订阅 ID 类型', + smfDataVolumeUplink: '数据量上行链路', + smfDataVolumeDownlink: '数据量下行链路', + smfDataTotalVolume: '数据总量', + smfDuration: '持续时间', + smfInvocationTime: '调用时间', + }, + ue: { + eventType: "事件类型", + realTimeDataStart: "开启实时数据", + realTimeDataStop: "关闭实时数据", + ueInfo: "UE信息", + rowInfo: "记录信息", + time: "记录时间", + result: "结果", + resultOk: "成功", + delTip: "确认删除编号为【{msg}】的数据项?", + exportTip: "确认导出当前查询条件的事件数据吗?(导出最大支持一万条)", + }, + }, + ne: { + common: { + neType: '网元类型', + neTypePlease: "请选择网元类型", + neTypeTip: '填写创建的网元类型,如:SMF', + neId: '网元标识', + neIdPlease: '请输入网元标识', + neIdTip: '填写网元绑定的唯一标识', + rmUid: '资源唯一标识', + rmUidPlease: '请输入资源唯一标识', + rmUidTip: "用于网元日志、告警、指标等数据上报的标记", + neName: '网元名称', + neNamePlease: '请输入网元名称', + ipAddr: '服务IP', + ipAddrPlease: '请输入网元服务IP地址', + ipAddrTip: "支持IPV4/IPV6,同步变更配置地址", + port: '服务端口', + portTip: "网元服务端口,默认:33030", + serialNum: '序列号', + expiryDate: '许可证到期日期', + normalcy: '正常', + exceptions: '异常', + restart: '重启', + restartTip: '确认要重新启动网元服务吗?', + start: '启动', + startTip: '确认要启动网元服务吗?', + stop: '停止', + stopTip: '确认要停止网元服务吗?', + reload: '重载', + reloadTip: '确认要重载网元配置信息吗?', + oam: 'OAM', + log: '日志', + }, + neInfo: { + version: "网元版本", + state: "网元状态", + serviceState: "服务状态", + info: '状态信息', + resourceInfo: '资源情况', + sysMem: "系统内存", + sysCpu: "系统CPU", + sysDisk: "系统存储", + neCpu: "网元CPU", + hostConfig: "终端连接配置", + pvflag: '网元虚拟化标识', + pnf: '物理网元', + vnf: '虚拟网元', + neAddress: '物理地址(MAC)', + neAddressTip: '记录网元的网卡物理地址(MAC)', + dn: '网络标识', + vendorName: '提供厂商', + province: '服务地域', + addTitle: '新增网元信息', + editTitle: '编辑网元信息', + delTip: '确认删除网元信息数据项吗?', + oam: { + title: 'OAM配置', + sync: '同步到网元', + oamEnable: '服务', + oamPort: '端口', + snmpEnable: '服务', + snmpPort: '端口', + kpiEnable: '上报', + kpiTimer: '上报周期', + kpiTimerPlease: '请输入上报周期(单位秒)', + omcIP: 'OMC IP', + }, + backConf: { + export: '配置导出', + import: '配置导入', + title: '配置文件导入', + importType: '文件来源', + server:'服务器文件', + local:'本地文件', + localUpload:'本地上传', + exportTip:'确认要导出网元配置信息到文件?', + exportMsg:'导出网元配置信息到文件成功', + pathPlease: '未发现文件', + }, + }, + neHost: { + hostType: "主机类型", + groupId: "分组", + title: "主机名称", + titlePlease: "请正确填写主机名称", + addr: "IP地址", + addrPlease: "请正确填写主机IP地址", + port: "端口", + portPlease: "请正确填写主机端口号", + user: "用户名", + userPlease: "请正确填写主机用户", + database: "数据库", + authMode: "认证模式", + password: "密码", + passwordPlease: "请正确填写主机密码", + privateKey: "私钥", + privateKeyPlease: "请正确填写私钥字符内容 ~/.ssh/id_rsa", + passPhrase: "私钥密码", + delTip: "确认要删除主机编号为【{num}】的信息吗?", + addTitle: "新增主机连接", + editTitle: "编辑主机连接", + test: "测试连接", + testOk: "测试连接成功", + authRSA: "免密授权", + authRSATip: "是否要配置免密授权?", + }, + neHostCmd: { + cmdType: "命令类型", + groupId: "分组", + title: "名称", + titlePlease: "请正确填写命令名称", + command: "命令", + commandPlease: "请正确输入有效命令字符串", + delTip: "确认要删除命令编号为【{num}】的信息吗?", + addTitle: "新增主机命令", + editTitle: "编辑主机命令", + }, + neSoftware: { + uploadTitle: "上传软件", + upload: "上传", + uploadNotFile: "未上传软件文件", + uploadBatch: "批量上传", + uploadBatchMax: "可上传多个软件包,最多同时选择{txt}个。", + uploadFileName: "解析文件名称格式如: amf-r2.240x.xx-xxx", + name: "文件名", + path: "软件文件", + pathPlease: "请上传软件包文件", + version: "软件版本", + versionPlease: "请输入软件版本号", + delTip: "确认要删除软件包吗?", + downTip: "确认要下载软件包【{txt}】吗?", + fileCheckType: '未解析出对应的网元类型', + fileCheckVer: '未解析出对应的版本号', + fileTypeNotEq: '不是指定网元类型 {txt}', + fileTypeExists: '已存在相同类型文件', + fileNameExists: '已存在相同名称文件', + fileCheckTypeDep: '未解析出对应指定的依赖包类型', + dependFile: '软件包依赖', + dependFileTip: '文件名解析同上,依据上传顺序安装', + }, + neVersion: { + upgrade: "升级到新版本", + upgradeTip: "确认要升级到新版本吗?", + upgradeTipEmpty: "当前没有可用的新版本", + upgradeTipEqual: "当前版本与新版本相同,确认要进行更新吗?", + rollback: '切换到上一个版本', + rollbackTip: "确认切换到上一个版本吗?", + rollbackTipEmpty: "目前没有可用的上一个版本", + rollbackTipEqual: '当前版本与之前版本相同,确认要进行切换吗?', + version: "当前版本", + preVersion: "上一个版本", + newVersion: "新版本", + status: "版本状态", + upgradeBatch: "批量更新", + upgradeBatchTip: "对勾选的记录进行新版本升级吗?", + upgradeNotNewVer: '没有发现新版本', + upgradeOMCVer: '拒绝批量操作升级OMC', + upgradeDone: '更新完成,服务正在重载', + upgradeFail: '更新失败,请检查软件文件是否存在且服务终端环境是否可用!', + upgradeModal: '网元版本更新', + }, + neLicense: { + status: "许可证状态", + change: "变更许可证", + reload: "刷新信息", + reloadTip: "确认要刷新许可证信息吗?", + reloadBatch: "批量刷新", + reloadBatchTip: "对勾选的记录进行信息刷新吗?", + updateTtile: "更新许可证", + downCodeTop: "确认要将许可激活码保存到文件吗?", + activationRequestCode: "许可激活码", + licensePath: "许可证文件", + licensePathTip: "请上传许可证文件", + upload: '上传', + uploadFile: "上传许可证", + uploadChangeOk: '网元更新许可证成功,正在后台校验!', + uploadChangeFail: "部分网元更新许可证失败,请检查服务终端环境是否可用!", + }, + neConfig: { + treeTitle: "配置导航", + treeSelectTip: "左侧配置导航中选择配置项信息!", + neType: "网元类型", + neTypePleace: "请选择网元类型", + noConfigData: "暂无配置项数据", + updateValue: "【 {num} 】 属性值修改成功", + updateValueErr: "属性值修改失败", + updateItem: "修改 Index 为 {num} 记录成功", + updateItemErr: "记录修改失败", + delItemOk: "删除 Index 为 {num} 记录成功", + addItemOk: "新增 Index 为 {num} 记录成功", + addItemErr: "记录新增失败", + requireUn: "【 {display} 】输入值是未知类型", + requireString: "【 {display} 】参数值不合理", + requireInt: "【 {display} 】参数值不在合理范围 {filter}", + requireIpv4: "【 {display} 】不是合法的IPV4地址", + requireIpv6: "【 {display} 】不是合法的IPV6地址", + requireEnum: "【 {display} 】不是合理的枚举值", + requireBool: "【 {display} 】不是合理的布尔类型的值", + editOkTip: "确认更新该【 {num} 】属性值吗?", + updateItemTip: "确认更新Index为 【{num}】 的数据项?", + delItemTip: "确认删除Index为 【{num}】 的数据项?", + arrayMore: "展开", + }, + neConfigBackup: { + name: "名称", + downTip: '确认要下载备份文件【{txt}】吗?', + title: "修改备份信息 {txt}", + }, + neQuickSetup: { + reloadPara5G: '刷新', + stepPrev: '上一步', + stepPrevTip: '确认要放弃当前变更返回上一步吗?', + stepNext: '下一步', + stepSave: '保存信息', + startTitle: '服务终端环境', + startDesc: '测试连接网元服务', + startStepNext: '确认要下一步进行配置网元信息?', + addr: '终端IP', + kernelName: '系统', + kernelRelease: '内核', + machine: '架构', + prettyName: '平台', + prettyNameTip: '支持 Ubuntu', + nodename: '主机名', + auth: '权限授予', + sudo: '提权', + sudoErr: '确保有权限进行软件包安装,请配置授予当前用户允许无密码 sudo 权限。', + sshLink: '免密直连', + configTitle: "配置网元", + configDesc: "填写网元基础信息", + configAddTitle: '新增提示', + configAddTip: '是否新增为新的网元信息并继续?', + configUpdateTitle: '更新提示', + configUpdateTip: '是否更新到已存在网元信息并继续?', + configStepNext: '确认要下一步进行网元软件安装?', + installTitle: "网元安装", + installDesc: "安装到服务终端", + installConfirmTip: '确认要安装软件包【{name}】吗?', + installStepNext: '确认要下一步进行网元授权吗?', + installSource: '软件来源', + installSourceOption: '已上传', + installSourceUpload: '新上传', + installSelect: '选择记录', + installUpload: '上传文件', + installText: '安装', + licenseTitle: "授权许可", + licenseDesc: "网元服务授权认证", + licenseResultTitle: "是否立即授权激活", + licenseResultTitleOk: '成功激活', + licenseUpload: '许可证', + licenseEnd: '结束', + licenseEndTip: "确认要结束安装吗?", + licenseCheack: '等待网元验证', + licenseTip1: '1. 点击【许可证】可获取许可激活码,随后联系网元厂商进行激活', + licenseTip2: '2. 点击【结束】将结束安装过程', + }, + }, + neUser: { + auth: { + authInfo:'鉴权信息', + neTypePlease: '查询网元类型', + neType: 'UDM网元对象', + export: '导出', + exportConfirm: '确认导出全部鉴权用户数据吗?', + checkExport : '勾选导出', + checkExportConfirm: '确认导出已勾选的鉴权用户数据吗?', + import: '导入', + loadDataConfirm: '确认要重新加载数据吗?', + loadData: '加载数据', + loadDataTip: '成功获取加载数据:{num}条,系统内部正在进行数据更新,大约需要{timer}秒,请稍候!!!', + startIMSI: '起始IMSI', + batchAddText: '批量新增', + batchDelText: '批量删除', + numAdd: '放号个数', + numDel:'删除个数', + checkDel:'勾选删除', + imsiTip: 'IMSI=MCC+MNC+MSIN', + imsiTip1: 'MCC=移动国家号码, 由三位数字组成', + imsiTip2: 'MNC=移动网络号,由两位数字组成', + imsiTip3: 'MSIN=移动客户识别码,采用等长10位数字构成', + amfTip: '鉴权管理域,参数最大长度为 4', + algoIndexTip: '算法索引,介于0到15之间', + kiTip: '用户签权密钥信息,长度只能是32', + opcTip: '鉴权秘钥,OPC是由Ki和OP经过计算得来的,OP为运营商的根秘钥,ki是鉴权秘钥,最大长度为32', + delSure:'确认删除IMSI编号为: {imsi} 的用户吗?', + imsiConfirm:'IMSI的长度必须为15', + }, + sub: { + subInfo:'签约信息', + neType: 'UDM网元类型', + export: '导出', + exportConfirm: '确认导出全部签约用户数据吗?', + checkExport : '勾选导出', + checkExportConfirm: '确认导出已勾选的签约用户数据吗?', + import: '导入', + loadDataConfirm: '确认要重新加载数据吗?', + loadData: '加载数据', + loadDataTip: '成功获取加载数据:{num}条,系统内部正在进行数据更新,大约需要{timer}秒,请稍候!!!', + numAdd: '放号个数', + numDel: '删除个数', + checkDel:'勾选删除', + batchAddText: '批量新增', + batchDelText: '批量删除', + enable:'开启', + disable:'关闭', + startIMSI: '起始IMSI', + imsiTip: 'IMSI=MCC+MNC+MSIN', + imsiTip1: 'MCC=移动国家号码, 由三位数字组成', + imsiTip2: 'MNC=移动网络号,由两位数字组成', + imsiTip3: 'MSIN=移动客户识别码,采用等长10位数字构成', + msisdnTip: '参数最大长度 {num}', + inputTip: '参数最大长度为 {num}', + arfbTip: '限制区域模板,在模板指定的限制区域中,UE 不允许与网络通信', + sarTip: '服务区域限制模板,定义允许的区域,UE 在这些区域中可以和网络通信;定义不允许的区,UE 和网络在这些区域中,不允许发起Service Request 或 SM 信令来获取用户服务', + micoTip: '签约的 MICO 业务标志位', + rfspTip:'RFSP 索引,在 NG-RAN 中,特定 RRM 配置的索引,参数介于0到127之间', + ueTypeTip: '运营商定义的用户 UE Usage Type,整型,参数介于0到127之间', + cnFlag: '是否开启 5G Core Network 服务', + epsFlagTip: '是否开启 4G EPS 服务', + contextIdTip: '签约APN 上下文ID,必须从APN Context list 中选择。', + apnContextTip: '手机可用的APN列表,最多六个,在HSS中定义。', + staticIpTip: '指定手机用户上网时使用的静态IP地址,为"-"时表示使用动态IP地址', + epsOdbTip: 'ODB(Operator-Determined Barring)运营商决定的闭锁,即用户接入EPS网络的业务能力由运营商决定.选中 ---对应服务被允许 未选 --- 对应服务被禁止', + hplmnOdbTip: 'HPLMN-ODB归属运营商决定的闭锁,即用户接入EPS网络的业务能力由用户归宿运营商决定.选中 --- 对应服务被允许 未选 -- 对应服务被禁止', + ardTip:'接入控制标志(Access-Restriction-Data),可用于区分2G/3G/LTE用户,便于为2G/3G/LTE网络共存时,对不同类型用户进行区分服务', + smDataTip:'sm_data=1-000001&internet-1.2.3.4&ims-1.2.3.5中的IP:1.2.3.4为5G用户internet这个APN分配的静态IP,1.2.3.5为5G用户ims这个APN分配的静态IP。如果是动态分配,把IP以及前面一个连接符去掉即可。需支持多个dnn用&连接', + smDataArrTip:'SST,DNN/APN为必填项', + }, + pcf: { + neType: 'PCF网元对象', + export: '导出', + exportConfirm: '确认导出全部用户策略控制信息数据吗?', + import: '导入', + addTitle: '新增策略控制信息', + updateTitle: '{imsi} 策略控制信息', + startIMSI: '起始IMSI', + batchOper: '批量操作', + batchAddText: '批量新增', + batchDelText: '批量删除', + batchUpdateText: '批量更新', + batchNum: '批量个数', + imsiTip: 'IMSI=MCC+MNC+MSIN', + imsiTip1: 'MCC=移动国家号码, 由三位数字组成', + imsiTip2: 'MNC=移动网络号,由两位数字组成', + imsiTip3: 'MSIN=移动客户识别码,采用等长10位数字构成', + checkDel:'勾选删除', + delSure:'确认删除IMSI编号为: {imsi} 的数据项吗?', + uploadFileOk: '文件上传成功', + uploadFileErr: '文件上传失败', + pccRuleTip:'PCC策略规则模板(对应参数配置-PCC Rules)', + sessRuleTip:'会话策略规则模板(对应参数配置-Session Rules)', + qosAudioTip:'语音呼叫QoS(对应参数配置-QoS Template的QoS ID)', + qosVideoTip:'视频呼叫QoS(对应参数配置-QoS Template的QoS ID)', + hdrTip:'HTTP头增强(对应参数配置-Header Enrich Template)', + ueTip:'UE策略模板(样例: uep_001)', + sarTip1:'服务区限制', + sarTip2:'(对应参数配置-Service Area Restriction)', + rfsfTip:'无线频率选择优先级', + }, + base5G: { + neType: '网元对象', + }, + n3iwf: { + neType: 'N3IWF网元对象', + }, + ue: { + neType: 'SMF网元对象', + }, + ims: { + neType: 'IMS网元对象', + }, + nssf:{ + neType: 'NSSF网元对象', + }, + }, + perfManage: { + taskManage:{ + taskId: '任务ID', + neType: '网元类型', + size: '测量粒度', + taskStatus: '任务状态', + addUser: '创建人', + addTime: '创建时间', + granulOption:'测量粒度', + performanceList:'性能测量数据集', + period:'测量时段', + plan:'测量计划', + performanceSelect:'请选择性能测量数据集', + delPerfTip:'确认删除记录编号为 {num} 的数据项?', + delPerf:'成功删除任务 {num}', + viewTask:'查看任务', + editTask:'修改任务', + addTask:'新增任务', + stopTask:'停止', + errorTaskInfo: '获取任务信息失败', + granulOptionPlease:'请选择测量粒度', + letupSure:'确认激活编号为 【{id}】 的任务?', + stopSure:'确认挂起编号为 【{id}】 的任务?', + letUpWarning:'禁止激活已激活的任务', + stopWarning:'禁止挂起未激活的测量任务', + weekPlan:'周计划', + monthPlan:'月计划', + one:'星期一', + two:'星期二', + three:'星期三', + four:'星期四', + five:'星期五', + six:'星期六', + seven:'星期天', + }, + perfThreshold:{ + thresholdValue:'门限值', + alarmType:'告警类型', + delThre:'成功删除性能门限 {num}', + delThreTip:'确认删除记录编号为 {num} 的数据项?', + editThre:'修改性能门限', + addThre:'新增性能门限', + errorThreInfo: '获取性能门限信息失败', + staticSet:'统计设置', + threValue:'门限值', + alarmLevel:'告警级别', + status:'状态', + letupSure:'确认激活编号为 【{id}】 的性能门限?', + stopSure:'确认挂起编号为 【{id}】 的性能门限?', + letUpWarning:'禁止激活已激活的性能门限', + stopWarning:'禁止挂起未激活的性能门限', + }, + perfData:{ + taskId:'任务ID', + type:'网元类型', + neName:'网元名称', + granulOption:'颗粒度', + kpiCode:'统计编码', + kpiId:'统计指标项', + value:'值', + startTime:'开始时间', + endTime:'结束时间', + }, + goldTarget:{ + type:'网元类型', + enTitle:'黄金指标项', + value:'值', + startTime:'开始时间', + endTime:'结束时间', + interval:'颗粒度', + timeFrame:'时间范围', + nullTip:'此时间范围内没有统计数据', + kpiChartTitle:'KPI统计图表', + kpiTableTitle:'KPI统计数据', + time:'时间', + exportSure:'确认是否导出全部统计数据', + exportEmpty: "导出数据为空", + showChartSelected: "显示全部", + realTimeData: "实时数据", + }, + customTarget:{ + TourTitle1:'计算元素选择', + TourDes1:'选择已经勾选网元类型对应的指标用于计算公式', + TourTitle2:'计算符号选择', + TourDes2:'选择计算符号', + TourTitle3:'计算公式', + TourDes3:'由前面选择的计算元素和计算符号自动组成计算公式', + TourTitle4:'结果单位', + TourDes4:'单位可选可填。PS:%符号时公式自动×100%', + kpiId:'自定义指标项', + kpiIdTip:'该网元没有自定义指标', + period:'颗粒度', + title:'自定义指标项标题', + objectType:'对象类型', + expression:'计算公式', + description:'描述', + kpiSet:'统计设置', + sixHoursAgo:'6小时前', + threeHoursAgo:'3小时前', + delCustomTip:'确认删除自定义指标项为 {num} 的数据项?', + delCustom:'成功删除记录编号为 {num} 自定义指标', + addCustom:'添加自定义指标', + editCustom:'编辑自定义指标', + errorCustomInfo: '获取信息失败', + status: '状态', + active:'正常', + inactive:'停用', + symbol:"符号", + element:'元素', + granularity:'颗粒度', + unit:'单位', + expressionModal:'表达式模块', + expressionErrorTip:'请检查表达式,错误的指标为{kpiId}', + expressionNoIdTip:'请检查表达式,没有找到任何有效的指标', + }, + kpiKeyTarget:{ + "time":"时间", + "rawData":"表格数据", + "statistics":"指标", + "fullWidthLayout":"全宽布局", + "twoColumnLayout":"两列布局", + "saveLayout": "保存布局", + "restoreSaved": "恢复布局", + "saveSuccess": " {name} 保存成功", + "restoreSavedSuccess": " {name} 恢复成功", + "noSavedLayout": "没有找到保存的布局 {name}", + "layout1": "布局1", + "layout2": "布局2", + "layout3": "布局3" + }, + kpiOverView:{ + "kpiName":"指标名", + "maxValue":"最大值", + "minValue":"最小值", + "kpiChartTitle":"网元指标概览", + "changeLine":"切换为折线图", + "changeBar":"切换为柱状图", + "chooseShowMetrics":"选择需要显示的指标", + "chooseMetrics":"选择指标", + }, + }, + traceManage: { + analysis: { + imsi: 'IMSI', + imsiPlease: '请输入IMSI', + msisdn: 'MSISDN', + msisdnPlease: '请输入MSISDN', + trackTaskId: '跟踪任务标记', + srcIp: '源IP地址', + dstIp: '目标IP地址', + signalType: '信令类型', + msgDirect: '消息元', + msgType: '消息类型', + rowTime: '记录时间', + signalData: '信令数据', + signalDetail: '信令详情', + noData: '无信息内容', + taskTitle: '任务 {num}', + taskDownText: '下载HTML', + taskDownTip: '确认下载信令详情HTML文件?', + }, + pcap: { + capArgPlease: '请输入tcpdump -i any支持参数', + cmd: '命令', + execCmd: "通用命令选项", + execCmd2: "过滤协议端口命令", + execCmd3: "分割文件按时间单位秒 (-G 10 ),最多生成文件数量 (-W 7)", + execUPFCmdA: '标准版-UPF配合其他网元异常抓包分析', + execUPFCmdB: '标准版-UPF异常需要抓包分析', + batchOper: '批量操作', + batchStartText: '批量开始', + batchStopText: '批量停止', + batchDownText: '批量下载', + fileView: '历史抓包文件', + fileUPF: '标准版', + fileUPFTip: 'UPF内部抓包分析包', + textStart: "开始", + textStop: "停止", + textLog: "日志文件", + textLogMsg: "日志文件信息", + textDown: "下载", + downTip: "确认要下载 {title} 抓包数据文件吗?", + downOk: "{title} 文件下载完成", + downErr: "{title} 文件下载异常", + textSelect: "勾选的", + startTip: "确认要开始 {title} 抓包任务吗?", + startOk: "{title} 任务已开始", + startErr: "{title} 任务异常", + stopTip: "确认要停止 {title} 抓包任务吗?", + stopOk: "{title} 任务已结束", + stopErr: "{title} 任务异常", + stopNotRun: "{title} 任务未运行", + }, + task: { + traceId: '跟踪编号', + trackType: '跟踪类型', + trackTypePlease: '请选择跟踪类型', + creater: '创建人', + textStop: "停止", + status: '状态', + time: '时间', + startTime: '开始时间', + endTime: '结束时间', + msisdn: 'MSISDN', + msisdnPlease: '请输入MSISDN', + msisdnTip: '移动通信MSISDN编号', + imsi: 'IMSI', + imsiPlease: '请输入IMSI', + imsiTip: '移动通信IMSI编号', + srcIp: '源IP地址', + srcIpPlease: '请输入源IP地址', + srcIpTip: '当前发送端IPv4地址', + dstIp: '目标IP地址', + dstIpPlease: '请输入目标IP地址', + dstIpTip: '对方接收端IPv4地址', + interfaces: '信令接口', + interfacesPlease: '请输入信令接口', + signalPort: '信令端口', + signalPortPlease: '请输入信令端口', + signalPortTip: '目标IP地址或源IP地址对应一方的端口', + rangePicker: '开始结束时间', + rangePickerPlease: '请选择任务时间开始结束时间', + remark: '说明', + remarkPlease: '可输入任务说明', + addTask: '添加任务', + editTask: '修改任务', + viewTask: '查看任务', + errorTaskInfo: '获取任务信息失败', + delTaskTip: '确认删除记录编号为 {id} 的数据项?', + stopTask: '成功停止任务 {id}', + stopTaskTip: '确认停止记录编号为 {id} 的任务?', + pcapView: "跟踪数据分析", + traceFile: "跟踪文件", + errMsg: "错误信息", + imsiORmsisdn: "imsi 或 msisdn 是空值,不能开始任务", + }, + }, + faultManage: { + activeAlarm: { + all:'所有', + neType: '告警设备类型', + neName: '告警网元名称', + neId: '告警网元标识', + alarmCode: '告警编号', + origLevel: '告警级别', + eventTime: '告警产生时间', + pvFlag: '虚拟化标识', + alarmType: '告警类型', + confirm: '确认', + updateConfirm: '取消确认', + handSync: '手动同步', + clear: '清除', + mySelf: '个性化设置', + exportAll: '导出全部', + disPlayFilfter: '显示过滤', + alarmId:'告警唯一标识', + alarmTitle:'告警名称', + clearUser:'告警清除用户', + clearType:'告警清除类型', + ackState:'告警确认状态', + ackUser:'告警确认用户', + alarmSeq:'告警流水编号', + objectName:'定位对象', + locationInfo:'告警定位信息', + province:'网元服务省份', + addInfo:'告警辅助信息', + specificProblemId:'告警问题原因ID', + specificProblem:'告警问题原因', + clearTime:'告警清除时间', + alarmStatus:'告警状态', + ackTime:'告警确认时间', + ackError:'请勿重复确认', + syncMyself:'手工同步', + realTitle:'告警标题', + objectNf:'适用网元', + helpFile:'帮助文档', + set:'设置', + cancelSure:'确认是否取消确认告警', + cancelSuss:'取消告警成功', + sysncSuss:'手工同步成功', + delSuss:'清除成功', + delSure:'是否清除该告警', + showSet:'显示过滤设置', + exportSure:'确认是否导出全部活动告警信息', + viewIdInfo:'查看{alarmId} 记录信息', + closeModal:'关闭', + }, + historyAlarm:{ + exportSure:'确认是否导出全部历史告警信息?', + }, + faultSetting:{ + interfaceType:'类型', + email:'Email', + sms:'SMS', + save:'保存设置', + noChange:'告警前转接口设置无变更', + forwardSet:'告警前转接口设置', + }, + eventAlarm:{ + exportSure:'确认是否导出全部事件告警信息?', + } + }, + logManage:{ + alarm:{ + type:'网元类型', + neId:'告警网元标识', + alarmId:'告警唯一标识', + alarmSeq:'告警流水号', + alarmCode:'告警编号', + alarmStatus:'告警状态', + eventTime:'告警产生时间', + logTime:'记录时间', + status:'告警状态' + }, + mml:{ + account:'登录账号', + ip:'IP地址', + type:'网元类型', + neId:'网元唯一标识', + MML:'MML', + logTime:'记录时间', + }, + forwarding:{ + type:'网元类型', + neId:'告警网元标识', + alarmId:'告警唯一标识', + alarmSeq:'告警流水号', + alarmObj:'告警前转对象', + alarmInter:'告警前转接口', + alarmTitle:'告警标题', + alarmInfo:'操作结果', + eventTime:'告警产生时间', + logTime:'记录时间' + }, + neFile: { + neType:'网元', + neTypePlease:'请选择网元', + nePath: "目录路径", + fileMode: "文件权限", + owner: "所属用户", + group: "所属组", + size: "文件大小", + modifiedTime: "修改时间", + fileName: "文件名称", + downTip: "确认下载文件名为 【{fileName}】 文件?", + downTipErr: "文件获取失败", + dirCd: "进入目录", + viewAs: '查看操作', + reload: "重载", + follow: '监视内容变化', + tailChar: '末尾字数', + tailLines: '末尾行数', + }, + exportFile:{ + fileName:'文件来源', + downTip: "确认下载文件名为 【{fileName}】 文件?", + downTipErr: "文件获取失败", + deleteTip: "确认删除文件名为 【{fileName}】 文件?", + deleteTipErr: "文件删除失败", + selectTip:"请选择文件名", + } + }, + monitor: { + session: { + userName: "登录账号", + userNamePlease: '查询登录账号', + ipaddr: "IP地址", + ipaddrPlease: '查询IP地址', + loginTime: "登入时间", + shakeTime: "闲置时间(分钟)", + status: "状态", + online: "在线", + offline: "离线", + logoutTip: "确认强退登录账号为 {num} 的用户?", + logoutSuccess: "已强退用户 {num}", + }, + monitor:{ + filter: "全局过滤", + startTime: '开始时间', + endTime: '结束时间', + today: '今天', + yesterday: '昨天', + week: '本周', + month: '本月', + avgLoad: '平均负载', + memory: '内存', + cache: '缓存', + io: '磁盘', + network: '网络', + loadDetail: "负载率", + resourceUsage: "资源使用率", + read: '读取', + write: '写入', + readWriteCount: '读写次数', + count: '次', + readWriteTime: '读写延迟', + up: '上行', + down: '下行', + }, + online:{ + mettingId:'会话编号', + account:'登录账号', + host:'登录主机', + loginDes:'登录地点', + os:'操作系统', + lib:'浏览器', + loginTime:'登录时间', + getOut:'强退', + getOutSure:'确认强退登录账号为 {userName} 的用户?', + }, + system:{ + systemInfo:'系统信息', + runPlace:'运行平台', + placeVersion:'平台版本', + systemPlace:'系统平台', + systemArchitecture:'系统架构', + host:'主机名称', + runTime:'运行时长', + cpuInfo:'CPU信息', + model:'型号', + hz:'速率Hz', + cores:'核心数', + usage:'使用率(%)', + memory:'内存信息', + totalMemory:'总内存', + lastMemory:'剩余内存', + proMemory:'进程总内存', + heapSize:'堆的总大小', + heapUsage:'堆已分配', + libUse:'链接库占用', + timeInfo:'时间信息', + time:'时间', + timeZone:'时区', + timeZoneName:'时区名称', + networkInfo:'网络信息', + ethernet:'以太网', + localConnect:'本地连接* ', + diskInfo:'磁盘信息', + disk:'路径盘符', + totalSize:'总大小', + lastSize:'剩余大小', + usageSize:'已使用大小', + spaceUsage:'空间使用率(%)' + }, + job: { + jobName: "任务名称", + jobNamePlease: '请正确输入任务名称,限2-50个字符', + jobGroup: "任务组名", + invokeTarget: "调用目标", + invokeTargetPlease: '请正确输入调用目标,限2-50个字符', + invokeTargetTip: "参数说明:支持预设传入参数,在处理器中进行序列化处理参数", + cronExpression: "cron表达式", + cronExpressionPlease: '请输入或生成cron执行表达式', + cronExpressionTip: "表达式示例:0/20 * * * * ?", + cronExpressionTip1: "示例说明:每20秒执行任务", + cronExpressionNew: "生成表达式", + status: "状态", + statusChange: "确定要{text} {num} 任务吗?", + saveLog: "记录日志", + tipRowErr: "任务记录存在错误", + viewInfoErr: "获取任务信息失败", + viewJob: "任务信息", + addJob: "添加任务", + editJob: "修改任务", + runOne: "执行一次", + runOneTip: "确定要立即执行一次 【{num}】 任务吗?", + runOneOk: "{num} 执行成功", + delTip: "确认删除定时任务编号为 【{num}】 任务吗?", + delOk: "删除成功", + resetTip: "确定要重置并刷新调度任务吗?", + resetOk: "重置成功", + exportTip: "确认根据搜索条件导出xlsx表格文件吗?", + exportOk: "已完成导出", + resetQueue: "重置队列", + jobLog: "任务日志", + createTime: "创建时间", + targetParams: "传入参数", + targetParamsPlease: '调用目标传入参数,仅支持json字符串', + misfirePolicy: "出错策略", + misfirePolicy1: "立即执行", + misfirePolicy2: "执行一次", + misfirePolicy3: "放弃执行", + concurrent: "是否并发", + concurrent0: "禁止", + concurrent1: "允许", + remark: "备注说明", + }, + jobLog: { + jobName: "任务名称", + jobGroup: "任务组名", + invokeTarget: "调用目标", + status: "执行状态", + status0: "失败", + status1: "正常", + createTime: "记录时间", + costTime: "消耗时间", + viewLog: "调度日志信息", + delTip: "确认删除调度日志编号为 【{num}】 的数据项吗?", + delOk: "删除成功", + clearText: "清空", + clearTip: "确认清空所有调度日志数据项吗?", + clearOk: "清空成功", + exportTip: "确认根据搜索条件导出xlsx表格文件吗?", + exportOk: "已完成导出", + jobMsg: "日志信息", + targetParams: "传入参数", + }, + cache: { + cacheKey: "缓存键名", + cacheName: "缓存名称", + cacheValue: "缓存内容", + remark: "备注", + clearCacheKeyOk: "已删除缓存键名 {txt}", + clearCacheNameOk: "已清理缓存名称 {txt}", + cacheList: "缓存列表", + cacheKeyListErr: "请在缓存列表中选择数据项!", + clearCacheSafe: "安全清理", + clearCacheSafeTip: "确认要执行可安全清理的缓存下所有键名吗?", + clearCacheSafeOk: "已完成安全清理缓存", + filter: "过滤", + filterPlace: "模糊过滤 {txt}", + clearCacheNameTip: "确认要清理该缓存名称下的所有键名吗?", + keyNameList: "键名列表", + clearCacheKeyTip: "确认要删除该缓存键吗?", + keyContent: "缓存内容", + }, + cacheInfo: { + baseInfo: "基本信息", + version: "服务版本", + mode: "运行模式", + modeStandalone: "单机", + modeClusters: "集群", + port: "端口", + clients: "已删除缓存键名 {txt}", + uptimeInDays: "运行时间(天)", + memoryHuman: "使用内存", + usedCpu: "使用CPU", + maxmemory: "内存配置", + aof: "AOF是否开启", + rdb: "RDB是否成功", + dbSize: "Key数量", + kbps: "网络入口/出口", + commandstats: "命令统计", + }, + topology: { + showAllHide: "显示所有隐藏项", + collapseAll: "折叠所有群组", + expandAll: "展开集群", + foldAll: "折叠集群", + hideEdge: "隐藏边", + hideNode: "隐藏节点", + state: "状态", + normalcy: "正常", + exceptions: "异常", + refreshTime: "刷新时间", + name: "网元名称", + version: "网元版本", + serialNum: '序列号', + expiryDate: '许可证到期日期', + switchLayout: "切换布局", + noData: "找不到对应的图组数据", + }, + topologyBuild: { + graphMode: "图模式", + graphGroup: "图组名", + graphGroupTip: "已存在图组名会更新图数据,不存在则新增图组", + graphSave: "保存", + graphDelete: "删除", + noData: "暂无图组数据,可使用【图模式-编辑】进行新增图组", + groupPlease: "图组不能为空", + saveTtite: "图组信息保存", + saveOk: "保存图组【{group}】成功", + saveFail: "保存图组【{group}】失败", + delTip: "确认要删除图组名为【{group}】的数据吗?", + edgeTitleAdd: "新增边信息编辑", + edgeTitleEdit: "边信息编辑", + nodeTitleAdd: "新增节点信息编辑", + nodeTitleEdit: "节点信息编辑", + comboTitleAdd: "新增分组信息编辑", + comboTitleEdit: "分组信息编辑", + comboFormParentId: "父分组", + comboFormParentIdTip: "将当前分组点放入到另一个分组框中", + comboFormId: "分组ID", + comboFormIdPlease: "分组唯一标识 ID", + comboFormIdNot: "分组元素ID错误", + comboFormType: "分组类型", + comboFormSize: "最小尺寸", + comboFormSizeCircle: "半径", + comboFormSizeRect: "长、高", + comboFormPadding: "内边距", + comboFormPaddingRect: "上、左、下、右", + formStyleFill: "填充色", + formStyleFillOpacity: "透明值", + formStyleStroke: "边颜色", + formStyleLineWidth: "边宽度", + comboFormChildren: "分组内元素", + comboFormChildrenTip: "元素包括节点和分组", + label: "标签文本及其配置", + formLabel: "标签文本", + formLabelTip: "文本文字,如果没有则不会显示", + formLabelStyleFill: "文本颜色", + formLabelStyleFontSize: "文本大小", + formLabelRefX: "x偏移", + formLabelRefXTip: "标签在 x 方向的偏移量", + formLabelRefY: "y偏移", + formLabelRefYTip: "标签在 y 方向的偏移量", + formLabelPosition: "位置", + comboFormLabelPosition: "标签文本相对于分组内的位置", + nodeFormLabelPosition: "标签文本相对于节点的位置", + edgeFormLabelPosition: "标签文本相对于边的位置", + nodeFormLabelOffset: "文本偏移", + edgeFormLabelAutoRotate: "跟随边旋转", + edgeFormLabelAutoRotateTip: "标签文字是否跟随边旋转", + edgeFormType: "边类型", + edgeFormTypePlease: "边类型不能为空", + edgeFormSource: "起始元素", + edgeFormSourcePlease: "边起始元素不能为空", + edgeFormTarget: "结束元素", + edgeFormTargetPlease: "边结束元素不能为空", + edgeFormStartArrow: "开始端箭头", + edgeFormStartArrowTip: "边的开始端绘制默认箭头", + edgeFormEndArrow: "结束端箭头", + edgeFormEndArrowTip: "边的结束端绘制默认箭头", + nodeFormComboId: "节点分组", + nodeFormComboIdTip: "将节点放入到分组框中", + nodeFormId: "节点ID", + nodeFormIdPlease: "节点唯一 ID", + nodeFormIdNot: "节点元素ID错误", + nodeFormType: "节点类型", + nodeFormX: "x 坐标", + nodeFormY: "Y 坐标", + nodeFormSize: "节点大小", + nodeFormSizeCircle: "直径, 圆心位置对应节点的位置", + nodeFormSizeStar: "星形的大小, 星星的中心位置是节点的位置", + nodeFormSizeDonut: "直径, 圆心位置对应节点的位置", + nodeFormSizeTriangle: "边长, 三角形的中心位置是节点的位置", + nodeFormSizeEllipse: "长轴直径、短轴直径", + nodeFormSizeOhter: "宽、高", + nodeFormDirection: "方向", + nodeFormTypeImage: "图片", + nodeFormImg: "图片来源", + nodeFormClipShow: "裁剪功能", + nodeFormClipType: "裁剪的图片形状", + nodeFormClipTypeCircle: "剪裁圆形的半径", + nodeFormClipTypeRectWidth: "剪裁矩形的宽度", + nodeFormClipTypeRectHeight: "剪裁矩形的长度", + nodeFormClipTypeEllipseRx: "剪裁椭圆的长轴半径", + nodeFormClipTypeEllipseRy: "剪裁椭圆的短轴半径", + nodeFormClipX: "裁剪图形的 x 坐标", + nodeFormClipY: "裁剪图形的 y 坐标", + nodeFormIcon: "图标", + nodeFormIconShow: "是否显示", + nodeFormIconImg: "图标来源", + nodeFormIconWidth: "宽度", + nodeFormIconHeight: "高度", + nodeFormIconOffset: "偏移", + comboTypeCircle: "圆形", + comboTypeRect: "矩形", + comboLabelPositionTop: "上", + comboLabelPositionLeft: "左", + comboLabelPositionRight: "右", + comboLabelPositionBottom: "下", + comboLabelPositionCenter: "居中", + edgeFormIdPlease: "边唯一 ID", + edgeFormIdNot: "边元素ID错误", + edgeTypeLine: "直线,连接两个节点的直线", + edgeTypePolyline: "折线,多段线段构成的折线,连接两个端点", + edgeTypeArc: "圆弧线,连接两个节点的一段圆弧", + edgeTypeQuadratic: "二阶贝塞尔曲线,只有一个控制点的曲线", + edgeTypeCubic: "三阶贝塞尔曲线,有两个控制点的曲线", + edgeTypeCubicV: "垂直方向的三阶贝塞尔曲线", + edgeTypeCubicH: "水平方向的三阶贝塞尔曲线", + edgeTypeLoop: "自环", + edgeTypeCubicAnimateLineDash: "三阶贝塞尔曲线,虚线运动", + edgeTypeCubicAnimateCircleMove: "三阶贝塞尔曲线,圆点沿边运动", + edgeTypeLineAnimateState: "直线,含有状态动画", + edgeLabelPositionStart: "开头", + edgeLabelPositionMiddle: "中间", + edgeLabelPositionEnd: "末尾", + nodeTypeCircle: "圆形", + nodeTypeRect: "矩形", + nodeTypeEllipse: "椭圆", + nodeTypeDiamond: "菱形", + nodeTypeTriangle: "三角形", + nodeTypeStar: "星形", + nodeTypeImage: "图片", + nodeTypeCircleAnimateShapeR: "圆形,节点放大缩小动画", + nodeTypeCircleAnimateShapeStroke: "圆形,节点边缘扩散动画", + nodeTypeRectAnimateState: "矩形,含有状态动画", + nodeTypeImageAnimateState: "图片,含有状态动画", + nodeLabelPositionTop: "上", + nodeLabelPositionLeft: "左", + nodeLabelPositionRight: "右", + nodeLabelPositionBottom: "下", + nodeLabelPositionCenter: "居中", + nodeDirectionUp: "向上", + nodeDirectionDown: "向下", + nodeDirectionLeft: "向左", + nodeDirectionRight: "向右", + nodeImageClipCircle: "圆形", + nodeImageClipRect: "矩形", + nodeImageClipEllipse: "椭圆", + nodeImageBase: "基站", + nodeImageCloud: "云", + nodeImageService: "服务器", + nodeImageServiceDB: "数据服务器", + nodeImageFirewall: "防火墙", + nodeImageMobile: "手机", + nodeImageUser: "用户", + graphModeDefault: "默认", + graphModeEdit: "编辑", + graphNotInfo: "无信息", + graphMenuHide: "隐藏", + graphMenuHideAllShow: "显示所有隐藏项", + graphMenuEdit: "编辑", + graphMenuDel: "删除", + graphMenuAddEdge: "新增边", + graphMenuAddNode: "新增节点", + graphMenuAddCombo: "新增分组", + graphCanvas: "画布", + graphCombo: "分组", + graphNode: "节点", + graphEdge: "边", + }, + }, + system:{ + user:{ + userInfo:'用户信息', + userNum: '用户编号', + account: '登录账号', + userName: '用户昵称', + permission: '用户权限', + className: '班级名称', + loginIp: '登录地址', + loginTime: '登录时间', + status: '用户状态', + userNameTip:'账号只能包含大写字母、小写字母和数字的字符串,长度至少为6位', + passwdTip:'密码至少包含大小写字母、数字、特殊符号,且不少于6位', + nickNameTip:'昵称不少于2位', + emailTip:'请输入正确的邮箱地址', + phoneTip:'请输入正确的手机号码', + resetPwd:'重置密码', + start:'启用', + stop:'停用', + normalcy:'正常', + deactivate:'停用', + delSuss:'删除成功', + sureTip:'确定要{text} {userName} 用户吗?', + delSure:'确认删除用户编号为{userId}的数据项?', + export:'导出', + import:'导入', + exportSure:'确认根据搜索条件导出xlsx表格文件吗?', + phone:'手机号码', + createTime:'创建时间', + userTop:'用户头像', + sex:'用户性别', + email:'电子邮箱', + fromClass:'所属班级', + userWork:'用户职位', + userWorkPlease: '请选择用户职位', + userTip:'用户说明', + loginPwd:'登录密码', + updateSure:'是否更新已经存在的数据', + downloadObj:'下载模板', + importTitle:'用户导入', + importOk: '成功读取并下载导入模板', + tipRowErr: "获取用户信息失败", + viewInfoErr: "用户记录存在错误", + lock:'锁定', + inactive:'未激活', + active:'激活', + }, + config: { + configName: "参数名称", + configNamePlease: '请正确输入参数名称', + configKey: "参数键名", + configKeyPlease: '请正确输入参数键名', + configType: "系统内置", + configValue: "参数键值", + configValuePlease: '请正确输入参数键值', + remark: "参数说明", + createTime: "创建时间", + refreshCache: "刷新缓存", + viewInfo: "参数配置信息", + viewInfoErr: "获取参数配置信息失败", + addInfo: "添加参数配置", + editInfo: "修改参数配置", + tipRowErr: "参数配置记录存在错误", + delTip: "确认删除参数编号为 【{num}】 的数据项?", + delOk: "删除成功", + exportTip: "确认根据搜索条件导出xlsx表格文件吗?", + exportOk: "已完成导出", + refreshCacheTip: "确定要刷新参数配置缓存吗?", + refreshCacheOk: "刷新缓存成功", + }, + setting: { + charMaxLen: '位字符长度', + saveSubmit: '提交保存', + saveSuccess: '提交保存成功', + revert: '还原', + revertSuccess: '还原成功', + uploadFile: '上传文件', + uploadFormat: '只支持上传文件格式({format})', + uploadSize: '文件大小必须小于 {size}MB', + uploadSuccess: '文件上传成功,提交保存生效', + sysLogo: '系统LOGO', + sysLogoBrand: '全图', + sysLogoIcon: '小图', + sysLogoUpload: '上传LOGO', + sysLogoTipContent: '确认要提交当前变更的LOGO文件吗?', + sysLogoTipContentUpload: '确认要上传LOGO文件吗?', + sysLogoInstruction: '系统LOGO展示样式如预览区域所示', + sysLogoInstruction1: '如需变更请将图片进行对应处理调整后在进行上传。', + sysLogoInstruction2: '将整张图片展示到系统LOGO区域,请使用透明背景,尺寸比例大小', + sysLogoInstruction3: '以LOGO+系统名称的形式展示到系统LOGO区域。', + sysLogoInstruction4: 'LOGO尺寸比例大小', + sysName: '系统名称', + sysNameLimitation: '系统名称限制', + sysNameTipContent: '确认要提交当前变更的系统名称吗?', + sysCopyright: '版权声明', + sysCopyrightLimitation: '版权声明限制', + sysCopyrightTipContent: '确认要提交当前变更的版权声明吗?', + sysLoginBg: '登录界面背景', + sysLoginBgNone: '暂无背景图', + sysLoginBgUpload: '上传背景图', + sysLoginBgTipContentUpload: '确认要上传登录界面背景文件吗?', + sysLoginBgTipContent: '确认要提交当前变更的登录界面背景吗?', + sysLoginBgTipContentRevert: '确认要将背景图还原到系统初始默认的背景吗?', + sysLoginBgInstruction: '系统登录界面背景样式如预览区域所示,请以实际显示为准', + sysLoginBgInstruction1: '请将选择合适的图片进行进行上传。', + sysLoginBgInstruction2: '通过点击《还原》按钮,将背景图还原到系统初始默认的背景。', + sysHelpDoc: '系统使用文档', + sysHelpDocTipContentUpload: '确认要上传系统使用文档吗?', + sysHelpDocTipContent: '确认要提交当前【{lang}】变更的系统使用文档吗?', + sysHelpDocOpen: '文档查阅', + sysHelpDocInstruction: '系统功能及使用说明,PDF文档手册', + sysOfficialUrl: '官网链接', + sysOfficialUrlErrTip: '请填写有效的链接地址 http(s)://', + sysOfficialUrlTipContent: '确认要提交当前变更的官网地址吗?', + sysOfficialUrlNo: '无链接地址', + sysOfficialUrlOpen: '打开官网', + sysOfficialUrlInstruction: '官网链接地址', + sysOfficialUrlInstruction1: '开头,如需隐藏不跳转填写', + i18n: "国际化切换", + i18nOpen: "显示切换", + i18nDefault: "默认语言", + i18nInstruction: '是否显示国际化切换,设置系统默认语言', + reset: "系统重置", + resetInstruction: "系统重置将会清除当前系统内所有数据,请谨慎操作!!!", + resetTipContent: '确认要清除当前系统内所有数据并坚持继续吗?', + homeInstruction:'设置系统首页界面', + home: '系统首页', + homeTip:'确认要提交当前界面为系统界面吗?', + homeSet:'系统首页设置', + }, + role:{ + allScopeOptions:'全部数据权限', + byMyselfScopeOptions:'自定数据权限', + onlyClassScopeOptions:'本班级数据权限', + classAllScopeOptions:'本班级及以下数据权限', + myselfScopeOptions:'仅本人数据权限', + roleId:'角色编号', + roleName:'角色名称', + roleKey:'角色键值', + roleSort:'角色顺序', + roleStatus:'角色状态', + createTime:'创建时间', + trueValue:'请正确输入{msg}', + roleInfo:'角色信息', + distribute:'分配数据权限', + open:'启用', + close:'停用', + statusSure:'确定要 {text} {roleName} 角色吗?', + statusFailed:'${roleName} {text}失败', + delSure:'确认删除角色编号为 【{roleId}】 的数据项?', + distributeUser:'分配用户', + roleMark:'角色说明', + menu:'菜单权限', + roleKeyTip:"权限标识用于控制页面控件或路由接口", + openSwitch:'展开/折叠', + selAllSwitch:'全选/全不选', + relationSwitch:'节点联动', + normal:'正常', + stop:'暂停', + preScope:'权限范围', + dataPer:'数据权限', + userId:'用户编号', + account:'登录账号', + userName:'用户昵称', + phone:'手机号码', + email:'电子邮箱', + userStaus:'用户状态', + selectPls:'请选择要分配的用户', + suss:'{oper}成功', + giveUser:'授权用户', + cancelGive:'取消授权', + cancelSure:'确认取消用户编号为 【{userId}】 的数据项授权?', + batchCancel:'批量取消授权', + }, + dept:{ + classInfo:'班级信息', + className:'班级名称', + classId:'班级编号', + classSort:'班级排序', + status:'班级状态', + createTime:'创建时间', + highClass:'上级班级', + emailTip:'请输入正确的邮箱地址', + phoneTip:'请输入正确的手机号码', + node:'根节点', + delSure:'确认删除班级编号为 【{deptId}】 的数据项?', + open:'展', + close:'折', + addClass:'新增子班级', + admin:'负责人', + phone:'联系电话', + email:'邮箱', + }, + post:{ + positionInfo:'职位信息', + positionId:'职位编号', + positionCode:'职位编码', + positionName:'职位名称', + positionSort:'职位排序', + positionStatus:'职位状态', + positionMark:'职位说明', + createTime:'创建时间', + codeTip:'请正确输入职位编码', + nameTip:'请正确输入职位名称', + delSure:'确认删除职位编号为 【{postId}】 的数据项?', + }, + log:{ + operate:{ + operId:'日志编号', + moduleName:'模块名称', + workType:'操作类型', + operUser:'操作人员', + requestMe:'请求方式', + host:'请求主机', + operStatus:'操作状态', + operDate:'操作日期', + useTime:'消耗时间', + logInfo:'操作日志信息', + delSure:'确认删除访问编号为 【{ids}】 的数据项吗?', + delAllSure:'确认清空所有登录日志数据项?', + delAllSuss:'清空成功', + operModule:'操作模块', + operTime:'操作时间', + delAll:'清空', + fail:'失败', + suss:'正常', + RequestIp:'请求地址', + operMe:'操作方法', + reqParam:'请求参数', + operInfo:'操作信息', + }, + login:{ + operId:'日志编号', + account:'登录账号', + loginIp:'登录地址', + loginLoc:'登录地点', + os:'操作系统', + browser:'浏览器', + status:'登录状态', + info:'登录信息', + loginTime:'登录时间', + delSure:'确认删除访问编号为 【{ids}】 的数据项吗?', + delAllSure:'确认清空所有登录日志数据项?', + delAll:'清空', + unlock:'解锁', + unlockSuss:'{userName} 解锁成功', + unlockSure:'确认解锁用户 【{username}】 数据项?', + }, + }, + menu:{ + menuInfo:'菜单信息', + menuName:'菜单名称', + menuId:'菜单编号', + menuSort:'菜单排序', + menuTitle:'菜单图标', + perId:'权限标识', + formLoc:'组件路径', + status:'显示状态', + menuStatus:'菜单状态', + menuType:'菜单类型', + createTime:'创建时间', + highMenu:'上级菜单', + routerAdrr:'路由地址', + delSure:'确认删除菜单编号为 【{menuId}】 的数据项?', + addSon:'新增子菜单', + hidden:'隐藏', + show:'显示', + root:'目录', + menu:'菜单', + button:'按钮', + yes:'是', + no:'否', + cache:'缓存', + noCache:'不缓存', + pageCache:'页面缓存', + local:'内部地址', + mark:'菜单说明', + pathTip:`访问的路由地址,如:user、/auth 1. 如网络地址需内部访问 则以 http(s):// 开头菜单行为(根节点):当前窗口打开 菜单行为,(非根节点):内嵌窗口.2. 如网络地址需外部访问则将内部地址选项设为否菜单行为:打开新标签3. 如内嵌子页面需要隐藏页面则将显示状态选项设为隐藏地址拼接以内嵌路由地址`, + sonPage:'子页面地址', + componentTip:' 页面组件目录 views 访问的组件路径,如:system/user/index 注意:不带 .vue 文件后缀路由地址是网络地址可填入链接', + perms:`权限标识示例:monitor:server:query 后端控制器中使用权限标识,如:['monitor:server:query'] 前端vue页面中使用权限标识,如:v-perms:has="['monitor:server:query']"` + }, + dict:{ + dictInfo:'字典类型信息', + dictId:'字典编号', + dictName:'字典名称', + dictType:'字典类型', + dictSatus:'字典状态', + createTime:'创建时间', + realDictName:'请正确输入字典名称', + realDictType:'请正确输入字典类型', + delSure:'确认删除参数编号为 【{dictId}】 的数据项?', + reloadSure:'确定要刷新字典数据缓存吗?', + reloadSuss:'刷新缓存成功', + dictData:'字典数据', + reload:'刷新缓存', + mark:'字典说明', + colorSelect:'取色器', + }, + dictData: { + dictType: "字典名称", + dictCode: "数据代码", + dictLabel: "数据键名", + dictLabelPleac: "请正确输入数据键名", + dictValue: "数据键值", + dictValuePleac: "请正确输入数据键值", + dictSort: "数据排序", + status: "数据状态", + createTime: "创建时间", + tagType: "标签类型", + tagTypeShow: "回显预览", + tagClass: "样式属性", + remark: "数据说明", + viewInfo: "字典数据信息", + viewInfoErr: "获取字典数据信息失败", + addInfo: "添加字典数据", + editInfo: "修改字典数据", + delTip: "确认删除字典数据代码为 【{txt}】 的数据项?", + delOk: "删除成功", + exportTip: "确认根据搜索条件导出xlsx表格文件吗?", + exportOk: "已完成导出", + typeDataErr: "获取字典类型信息失败", + }, + quickStart: { + start: '开始设置', + skip: '跳过', + finish: '完成设置', + stepPrev: '上一步', + stepNext: '下一步', + exit: '退出', + save: '保存信息', + sysTitle: '系统配置', + sysAdmin: '管理员', + sysInfo: '系统信息', + sysLogo: '系统LOGO', + sysLogoTip: '将图片展示到系统LOGO区域查看效果,请使用透明背景,尺寸比例适应区域大小', + sysName: '系统名称', + sysNameTip: '系统名称限制20个字符长度', + sysUploadLogo: '确认要上传系统LOGO文件吗?', + sysUploadOk: '文件上传成功,请进行保存信息', + sysSave: '保存', + sysSaveOk: '信息保存成功!', + sysPrevTip: '确认要返回上一个步骤吗?', + sysNextNe: '确认要进行网元安装吗?', + sysNextDone: '确认要跳过网元安装吗?', + stepNeInfoTitle: "网元服务配置", + stepNeInfoDesc: "设置网元对应的服务终端", + stepNeInfoStepPrev: '确认要退出网元安装步骤吗?', + stepNeInfoStepNext: '确认要下一步进行网元配置参数?', + stepPara5GTitle: "网元配置参数", + stepPara5GDesc: "设置网元全局参数信息", + savePara5GOk: '保存成功!', + stepPara5GStepPrev: '确认要放弃当前变更返回上一步吗?', + stepPara5GStepNext: '确认要下一步进行网元服务安装吗?', + stepInstallTitle: "网元服务安装", + stepInstallDesc: "将网元服务安装到服务终端", + stepInstallStepPrev: '确认要放弃当前变更返回上一步吗?', + stepInstallStepNext: '确认要下一步进行网元许可授权吗?', + stepInstallText: '选择安装', + stepInstallTip: '确认安装选择的网元新版本吗?', + stepInstallModal: '网元进行安装', + stepInstallNotNewVer: '没有发现新版本', + stepInstallDone: '安装完成,服务进入初始化', + stepInstallFail: '安装失败,请检查服务终端环境是否可用!', + stepLicenseTitle: "网元许可授权", + stepLicenseDesc: "获取网元许可激活码进行授权认证", + stepLicenseReload: '选择刷新许可证', + stepLicenseReloadTip: '确认刷新选择的许可证信息吗?', + stepLicenseDownCode: '选择下载网元许可激活码', + stepLicenseDownCodeTip: '确认下载选择的网元许可激活码到文本文件吗?', + stepLicenseStepPrev: '确认要放弃当前变更返回上一步吗?', + stepLicenseStepNext: '确认要结束网元安装步骤吗?', + stepLicenseStepNext2: '请下载网元许可授权码文件保存,并联系网元厂商获取授权许可证', + stepLicenseEnd: '结束', + doneTitle: "完成配置", + doneTip: '请进入系统后,根据情况进行更多相关配置', + doneNETitle: '已经进行网元安装配置', + doneNEDesc: '如有异常网元,可在系统内重新安装授权许可', + doneSkipTitle: '未进行网元安装配置', + doneSkipDesc: '系统将会默认初始网元信息,可在系统内自行修改或进行安装', + donePrevTip: '确认要返回上一个步骤吗?', + doneOkTip: '确认完成设置并开始使用吗?', + }, + }, + mmlManage: { + cmdTitle: "命令导航", + cmdConsole: "控制台", + cmdOpTip: "左侧命令导航中选择要操作项!", + cmdNoTip: "{num} 无可选命令操作", + require: "必填参数:{num}", + requireUn: "【 {display} 】输入值是未知类型", + requireString: "【 {display} 】参数值不合理", + requireInt: "【 {display} 】参数值不在合理范围 {filter}", + requireIpv4: "【 {display} 】不是合法的IPV4地址", + requireIpv6: "【 {display} 】不是合法的IPV6地址", + requireEnum: "【 {display} 】不是合理的枚举值", + requireBool: "【 {display} 】不是合理的布尔类型的值", + requireFile: "【 {display} 】不是符合参数文件类型的值", + cmdQuickEntry: "命令快速输入", + cmdQuickEntryHelp: "换行(Shift + Enter) 执行发送(Enter)", + cmdParamPanel: "参数面板", + clearForm: "重置", + clearLog: "清除日志", + exec: "执行", + uploadFileTip: '确认要上传文件吗?', + uploadFileOk: '文件上传成功', + uploadFileErr: '文件上传失败', + neOperate:{ + mml: "通用", + mml2: "标准版", + }, + omcOperate:{ + noOMC: "暂无OMC网元", + }, + udmOpesrate:{ + noUDM: "暂无UDM网元", + }, + mmlSet: { + operationtitle: "接口设置", + saveText: "保存设置", + ipadd: "侦听IP地址", + ipaddPlease: "请输入侦听IP地址", + port: "侦听端口", + portPlease: "请输入远程端口,0~65535", + okChange: "接口设置保存成功", + noChange: "接口设置无变更", + }, + }, + tool: { + help: { + fileName: "5G核心网网管操作手册.pdf", + download: "下载", + pdfViewer: "浏览器内预览", + pdfViewerErr: "很抱歉,您的浏览器不支持 PDF 预览!", + }, + terminal: { + start: "开始页", + new: "去创建", + more: "更多", + reload: "断开重连", + reloadTip: "确认要刷新重连当前 【{num}】 终端链接?", + current: "关闭当前", + other: "关闭其他", + otherTip: "确认要关闭其他终端链接?", + all: "关闭全部", + allTip: "确认要关闭全部终端链接?", + closeTip: "确认要关闭 【{num}】 终端链接?", + hostSelectTitle: "选择已创建的主机进行连接", + hostSelectShow: "打开选择", + hostSelectMore: "加载更多 {num}", + hostSelectHeader: "主机列表", + }, + ps:{ + realTimeHigh:"高", + realTimeLow:"低", + realTimeRegular:"常规", + realTimeStop:"已暂停", + realTime:"实时更新速度", + pid:"PID", + name:"应用名称", + username:"用户名", + runTime:"运行时间", + numThreads:"线程数", + cpuPercent:"CPU使用率", + diskRead:"磁盘读取", + diskWrite:"磁盘写入", + }, + net:{ + localAddr:"本地地址", + remoteAddr:"远程地址", + status:"状态", + proto:"协议", + port:"端口", + }, + }, + }, +}; diff --git a/practical_training/views/configManage/configParamApply/index.vue b/practical_training/views/configManage/configParamApply/index.vue new file mode 100644 index 00000000..75cfa32b --- /dev/null +++ b/practical_training/views/configManage/configParamApply/index.vue @@ -0,0 +1,713 @@ + + + + + diff --git a/practical_training/views/configManage/configParamTreeTable/components/OpeateDrawer.vue b/practical_training/views/configManage/configParamTreeTable/components/OpeateDrawer.vue new file mode 100644 index 00000000..0bce5ec6 --- /dev/null +++ b/practical_training/views/configManage/configParamTreeTable/components/OpeateDrawer.vue @@ -0,0 +1,327 @@ + + + + + diff --git a/practical_training/views/configManage/configParamTreeTable/hooks/useConfigArray.ts b/practical_training/views/configManage/configParamTreeTable/hooks/useConfigArray.ts new file mode 100644 index 00000000..037ff139 --- /dev/null +++ b/practical_training/views/configManage/configParamTreeTable/hooks/useConfigArray.ts @@ -0,0 +1,342 @@ +import { + addPtNeConfigData, + delPtNeConfigData, + editPtNeConfigData, +} from '@/api/pt/neConfig'; +import { RESULT_CODE_SUCCESS } from '@/constants/result-constants'; +import { Modal } from 'ant-design-vue/lib'; +import { SizeType } from 'ant-design-vue/lib/config-provider'; +import message from 'ant-design-vue/lib/message'; +import { reactive, watch } from 'vue'; + +/** + * 参数配置array类型 + * @param param 父级传入 { t, treeState, fnActiveConfigNode, ruleVerification, modalState, fnModalCancel} + * @returns + */ +export default function useConfigArray({ + t, + treeState, + fnActiveConfigNode, + ruleVerification, + modalState, + fnModalCancel, +}: any) { + /**多列列表状态类型 */ + type ArrayStateType = { + /**紧凑型 */ + size: SizeType; + /**多列嵌套记录字段 */ + columns: Record[]; + /**表格字段列排序 */ + columnsDnd: Record[]; + /**多列记录数据 */ + columnsData: Record[]; + /**多列嵌套展开key */ + arrayChildExpandKeys: any[]; + + /**多列记录数据 */ + data: Record[]; + /**多列记录规则 */ + dataRule: Record; + }; + + /**多列列表状态 */ + let arrayState: ArrayStateType = reactive({ + size: 'small', + columns: [], + columnsDnd: [], + columnsData: [], + arrayChildExpandKeys: [], + data: [], + dataRule: {}, + }); + + /**多列表编辑 */ + function arrayEdit(rowIndex: Record) { + const item = arrayState.data.find((s: any) => s.key === rowIndex.value); + if (!item) return; + const from = arrayInitEdit(item, arrayState.dataRule); + // 处理信息 + const row: Record = {}; + for (const v of from.record) { + if (Array.isArray(v.array)) { + continue; + } + row[v.name] = Object.assign({}, v); + } + + modalState.from = row; + modalState.type = 'arrayEdit'; + modalState.title = `${treeState.selectNode.paramDisplay} ${from.title}`; + modalState.key = from.key; + modalState.data = from.record.filter((v: any) => !Array.isArray(v.array)); + modalState.open = true; + + // 关闭嵌套 + arrayState.arrayChildExpandKeys = []; + } + + /**多列表编辑关闭 */ + function arrayEditClose() { + arrayState.arrayChildExpandKeys = []; + fnModalCancel(); + } + + /**多列表编辑确认 */ + function arrayEditOk(from: Record) { + // 遍历提取属性和值 + let data: Record = {}; + for (const key in from) { + // 子嵌套的不插入 + if (from[key]['array']) { + continue; + } + // 检查规则 + const [ok, msg] = ruleVerification(from[key]); + if (!ok) { + message.warning({ + content: `${msg}`, + duration: 3, + }); + return; + } + data[key] = from[key]['value']; + } + + // 发送 + const hide = message.loading(t('common.loading'), 0); + editPtNeConfigData({ + neType: treeState.neType, + paramName: treeState.selectNode.paramName, + paramData: data, + loc: `${from['index']['value']}`, + }) + .then(res => { + if (res.code === RESULT_CODE_SUCCESS) { + message.success({ + content: t('views.configManage.configParamForm.updateItem', { + num: modalState.title, + }), + duration: 3, + }); + fnActiveConfigNode('#'); + } else { + message.warning({ + content: t('views.configManage.configParamForm.updateItemErr'), + duration: 3, + }); + } + }) + .finally(() => { + hide(); + arrayEditClose(); + }); + } + + /**多列表删除单行 */ + function arrayDelete(rowIndex: Record) { + const loc = `${rowIndex.value}`; + const title = `${treeState.selectNode.paramDisplay} Index-${loc}`; + + Modal.confirm({ + title: t('common.tipTitle'), + content: t('views.configManage.configParamForm.delItemTip', { + num: title, + }), + onOk() { + delPtNeConfigData({ + neType: treeState.neType, + paramName: treeState.selectNode.paramName, + loc: loc, + }).then(res => { + if (res.code === RESULT_CODE_SUCCESS) { + message.success({ + content: t('views.configManage.configParamForm.delItemOk', { + num: title, + }), + duration: 2, + }); + arrayEditClose(); + fnActiveConfigNode('#'); + } else { + message.error({ + content: `${res.msg}`, + duration: 2, + }); + } + }); + }, + }); + } + + /**多列表新增单行 */ + function arrayAdd() { + const from = arrayInitAdd(arrayState.data, arrayState.dataRule); + + // 处理信息 + const row: Record = {}; + for (const v of from.record) { + if (Array.isArray(v.array)) { + continue; + } + row[v.name] = Object.assign({}, v); + } + + modalState.from = row; + modalState.type = 'arrayAdd'; + modalState.title = `${treeState.selectNode.paramDisplay} ${from.title}`; + modalState.key = from.key; + modalState.data = from.record.filter((v: any) => !Array.isArray(v.array)); + modalState.open = true; + } + + /**多列表新增单行确认 */ + function arrayAddOk(from: Record) { + // 遍历提取属性和值 + let data: Record = {}; + for (const key in from) { + // 子嵌套的不插入 + if (from[key]['array']) { + continue; + } + // 检查规则 + const [ok, msg] = ruleVerification(from[key]); + if (!ok) { + message.warning({ + content: `${msg}`, + duration: 3, + }); + return; + } + data[key] = from[key]['value']; + } + + // 发送 + const hide = message.loading(t('common.loading'), 0); + addPtNeConfigData({ + neType: treeState.neType, + paramName: treeState.selectNode.paramName, + paramData: data, + loc: `${from['index']['value']}`, + }) + .then(res => { + if (res.code === RESULT_CODE_SUCCESS) { + message.success({ + content: t('views.configManage.configParamForm.addItemOk', { + num: modalState.title, + }), + duration: 3, + }); + fnActiveConfigNode('#'); + } else { + message.warning({ + content: t('views.configManage.configParamForm.addItemErr'), + duration: 3, + }); + } + }) + .finally(() => { + hide(); + arrayEditClose(); + }); + } + + /**多列表编辑行数据初始化 */ + function arrayInitEdit(data: Record, dataRule: any) { + const dataFrom = data.record; + const ruleFrom = Object.assign({}, JSON.parse(JSON.stringify(dataRule))); + for (const row of ruleFrom.record) { + // 子嵌套的不初始 + if (row.array) { + row.value = []; + continue; + } + // 查找项的值 + const item = dataFrom.find((s: any) => s.name === row.name); + if (!item) { + continue; + } + // 可选的 + row.optional = 'true'; + // 根据规则类型转值 + if (['enum', 'int'].includes(row.type)) { + row.value = Number(item.value); + } else if ('bool' === row.type) { + row.value = Boolean(item.value); + } else { + row.value = item.value; + } + } + ruleFrom.key = data.key; + ruleFrom.title = data.title; + return ruleFrom; + } + + /**多列表新增行数据初始化 */ + function arrayInitAdd(data: any[], dataRule: any) { + // 有数据时取得最后的index + let dataLastIndex = 0; + if (data.length !== 0) { + const lastFrom = Object.assign( + {}, + JSON.parse(JSON.stringify(data.at(-1))) + ); + if (lastFrom.record.length > 0) { + dataLastIndex = parseInt(lastFrom.key); + dataLastIndex += 1; + } + } + + const ruleFrom = Object.assign({}, JSON.parse(JSON.stringify(dataRule))); + for (const row of ruleFrom.record) { + // 子嵌套的不初始 + if (row.array) { + row.value = []; + continue; + } + // 可选的 + row.optional = 'true'; + // index值 + if (row.name === 'index') { + let newIndex = + dataLastIndex !== 0 ? dataLastIndex : parseInt(row.value); + if (isNaN(newIndex)) { + newIndex = 0; + } + row.value = newIndex; + ruleFrom.key = newIndex; + ruleFrom.title = `Index-${newIndex}`; + continue; + } + // 根据规则类型转值 + if (['enum', 'int'].includes(row.type)) { + row.value = Number(row.value); + } + if ('bool' === row.type) { + row.value = Boolean(row.value); + } + } + return ruleFrom; + } + + // 监听表格字段列排序变化关闭展开 + watch( + () => arrayState.columnsDnd, + () => { + arrayEditClose(); + } + ); + + return { + arrayState, + arrayEdit, + arrayEditClose, + arrayEditOk, + arrayDelete, + arrayAdd, + arrayAddOk, + arrayInitEdit, + arrayInitAdd, + }; +} diff --git a/practical_training/views/configManage/configParamTreeTable/hooks/useConfigArrayChild.ts b/practical_training/views/configManage/configParamTreeTable/hooks/useConfigArrayChild.ts new file mode 100644 index 00000000..ba61b9a9 --- /dev/null +++ b/practical_training/views/configManage/configParamTreeTable/hooks/useConfigArrayChild.ts @@ -0,0 +1,349 @@ +import { + addPtNeConfigData, + delPtNeConfigData, + editPtNeConfigData, +} from '@/api/pt/neConfig'; +import { RESULT_CODE_SUCCESS } from '@/constants/result-constants'; +import { Modal } from 'ant-design-vue/lib'; +import { SizeType } from 'ant-design-vue/lib/config-provider'; +import message from 'ant-design-vue/lib/message'; +import { nextTick, reactive } from 'vue'; + +/** + * 参数配置array类型的嵌套array + * @param param 父级传入 { t, treeState, fnActiveConfigNode, ruleVerification, modalState, arrayState, arrayInitEdit, arrayInitAdd, arrayEditClose} + * @returns + */ +export default function useConfigArrayChild({ + t, + treeState, + fnActiveConfigNode, + ruleVerification, + modalState, + arrayState, + arrayInitEdit, + arrayInitAdd, + arrayEditClose, +}: any) { + /**多列嵌套列表状态类型 */ + type ArrayChildStateType = { + /**标题 */ + title: string; + /**层级index */ + loc: string; + /**紧凑型 */ + size: SizeType; + /**多列嵌套记录字段 */ + columns: Record[]; + /**表格字段列排序 */ + columnsDnd: Record[]; + /**多列记录数据 */ + columnsData: Record[]; + + /**多列嵌套记录数据 */ + data: Record[]; + /**多列嵌套记录规则 */ + dataRule: Record; + }; + + /**多列嵌套表格状态 */ + let arrayChildState: ArrayChildStateType = reactive({ + title: '', + loc: '', + size: 'small', + columns: [], + columnsDnd: [], + columnsData: [], + data: [], + dataRule: {}, + }); + + /**多列表展开嵌套行 */ + function arrayChildExpand( + indexRow: Record, + row: Record + ) { + const loc = indexRow.value; + if (arrayChildState.loc === `${loc}/${row.name}`) { + arrayChildState.loc = ''; + arrayState.arrayChildExpandKeys = []; + return; + } + arrayChildState.loc = ''; + arrayState.arrayChildExpandKeys = []; + const from = Object.assign({}, JSON.parse(JSON.stringify(row))); + // 无数据时 + if (!Array.isArray(from.value)) { + from.value = []; + } + const dataArr = Object.freeze(from.value); + const ruleArr = Object.freeze(from.array); + + // 列表项数据 + const dataArray: Record[] = []; + for (const item of dataArr) { + const index = item['index']; + let record: Record[] = []; + for (const key of Object.keys(item)) { + // 规则为准 + for (const rule of ruleArr) { + if (rule['name'] === key) { + const ruleItem = Object.assign({ optional: 'true' }, rule, { + value: item[key], + }); + record.push(ruleItem); + break; + } + } + } + // dataArray.push(record); + dataArray.push({ title: `Index-${index}`, key: index, record }); + } + arrayChildState.data = dataArray; + + // 无数据时,用于新增 + arrayChildState.dataRule = { + title: `Index-0`, + key: 0, + record: ruleArr, + }; + + // 列表数据 + const columnsData: Record[] = []; + for (const v of arrayChildState.data) { + const row: Record = {}; + for (const item of v.record) { + row[item.name] = item; + } + columnsData.push(row); + } + arrayChildState.columnsData = columnsData; + + // 列表字段 + const columns: Record[] = []; + for (const rule of arrayChildState.dataRule.record) { + columns.push({ + title: rule.display, + dataIndex: rule.name, + align: 'left', + resizable: true, + width: 50, + minWidth: 50, + maxWidth: 250, + }); + } + columns.push({ + title: t('common.operate'), + dataIndex: 'index', + key: 'index', + align: 'center', + fixed: 'right', + width: 100, + }); + arrayChildState.columns = columns; + + nextTick(() => { + // 设置展开key + arrayState.arrayChildExpandKeys = [indexRow]; + // 层级标识 + arrayChildState.loc = `${loc}/${from['name']}`; + // 设置展开列表标题 + arrayChildState.title = `${from['display']}`; + }); + } + + /**多列表嵌套行编辑 */ + function arrayChildEdit(rowIndex: Record) { + const item = arrayChildState.data.find( + (s: any) => s.key === rowIndex.value + ); + if (!item) return; + const from = arrayInitEdit(item, arrayChildState.dataRule); + // 处理信息 + const row: Record = {}; + for (const v of from.record) { + if (Array.isArray(v.array)) { + continue; + } + row[v.name] = Object.assign({}, v); + } + + modalState.from = row; + modalState.type = 'arrayChildEdit'; + modalState.title = `${arrayChildState.title} ${from.title}`; + modalState.key = from.key; + modalState.data = from.record.filter((v: any) => !Array.isArray(v.array)); + modalState.open = true; + } + + /**多列表嵌套行编辑确认 */ + function arrayChildEditOk(from: Record) { + const loc = `${arrayChildState.loc}/${from['index']['value']}`; + + let data: Record = {}; + for (const key in from) { + // 子嵌套的不插入 + if (from[key]['array']) { + continue; + } + // 检查规则 + const [ok, msg] = ruleVerification(from[key]); + if (!ok) { + message.warning({ + content: `${msg}`, + duration: 3, + }); + return; + } + data[key] = from[key]['value']; + } + + // 发送 + const hide = message.loading(t('common.loading'), 0); + editPtNeConfigData({ + neType: treeState.neType, + paramName: treeState.selectNode.paramName, + paramData: data, + loc, + }) + .then(res => { + if (res.code === RESULT_CODE_SUCCESS) { + message.success({ + content: t('views.configManage.configParamForm.updateItem', { + num: modalState.title, + }), + duration: 3, + }); + fnActiveConfigNode('#'); + } else { + message.warning({ + content: t('views.configManage.configParamForm.updateItemErr'), + duration: 3, + }); + } + }) + .finally(() => { + hide(); + arrayEditClose(); + }); + } + + /**多列表嵌套行删除单行 */ + function arrayChildDelete(rowIndex: Record) { + const index = rowIndex.value; + const loc = `${arrayChildState.loc}/${index}`; + const title = `${arrayChildState.title} Index-${index}`; + + Modal.confirm({ + title: t('common.tipTitle'), + content: t('views.configManage.configParamForm.delItemTip', { + num: title, + }), + onOk() { + delPtNeConfigData({ + neType: treeState.neType, + paramName: treeState.selectNode.paramName, + loc, + }).then(res => { + if (res.code === RESULT_CODE_SUCCESS) { + message.success({ + content: t('views.configManage.configParamForm.delItemOk', { + num: title, + }), + duration: 2, + }); + arrayEditClose(); + fnActiveConfigNode('#'); + } else { + message.error({ + content: `${res.msg}`, + duration: 2, + }); + } + }); + }, + }); + } + + /**多列表嵌套行新增单行 */ + function arrayChildAdd() { + const from = arrayInitAdd(arrayChildState.data, arrayChildState.dataRule); + // 处理信息 + const row: Record = {}; + for (const v of from.record) { + if (Array.isArray(v.array)) { + continue; + } + row[v.name] = Object.assign({}, v); + } + + modalState.from = row; + modalState.type = 'arrayChildAdd'; + modalState.title = `${arrayChildState.title} ${from.title}`; + modalState.key = from.key; + modalState.data = from.record.filter((v: any) => !Array.isArray(v.array)); + modalState.open = true; + } + + /**多列表新增单行确认 */ + function arrayChildAddOk(from: Record) { + const loc = `${arrayChildState.loc}/${from['index']['value']}`; + + let data: Record = {}; + for (const key in from) { + // 子嵌套的不插入 + if (from[key]['array']) { + continue; + } + // 检查规则 + const [ok, msg] = ruleVerification(from[key]); + if (!ok) { + message.warning({ + content: `${msg}`, + duration: 3, + }); + return; + } + data[key] = from[key]['value']; + } + + // 发送 + const hide = message.loading(t('common.loading'), 0); + addPtNeConfigData({ + neType: treeState.neType, + paramName: treeState.selectNode.paramName, + paramData: data, + loc, + }) + .then(res => { + if (res.code === RESULT_CODE_SUCCESS) { + message.success({ + content: t('views.configManage.configParamForm.addItemOk', { + num: modalState.title, + }), + duration: 3, + }); + fnActiveConfigNode('#'); + } else { + message.warning({ + content: t('views.configManage.configParamForm.addItemErr'), + duration: 3, + }); + } + }) + .finally(() => { + hide(); + arrayEditClose(); + }); + } + + return { + arrayChildState, + arrayChildExpand, + arrayChildEdit, + arrayChildEditOk, + arrayChildDelete, + arrayChildAdd, + arrayChildAddOk, + }; +} diff --git a/practical_training/views/configManage/configParamTreeTable/hooks/useConfigList.ts b/practical_training/views/configManage/configParamTreeTable/hooks/useConfigList.ts new file mode 100644 index 00000000..ba198f68 --- /dev/null +++ b/practical_training/views/configManage/configParamTreeTable/hooks/useConfigList.ts @@ -0,0 +1,139 @@ +import { editPtNeConfigData } from '@/api/pt/neConfig'; +import { RESULT_CODE_SUCCESS } from '@/constants/result-constants'; +import { SizeType } from 'ant-design-vue/es/config-provider'; +import message from 'ant-design-vue/es/message'; +import { reactive, toRaw } from 'vue'; + +/** + * list类型参数处理 + * @param param 父级传入 {t, treeState, ruleVerification} + * @returns + */ +export default function useConfigList({ t, treeState, ruleVerification }: any) { + /**单列表状态类型 */ + type ListStateType = { + /**紧凑型 */ + size: SizeType; + /**单列记录字段 */ + columns: Record[]; + /**单列记录数据 */ + data: Record[]; + /**编辑行记录 */ + editRecord: Record; + /**确认提交等待 */ + confirmLoading: boolean; + }; + + /**单列表状态 */ + let listState: ListStateType = reactive({ + size: 'small', + columns: [ + { + title: 'Key', + dataIndex: 'display', + align: 'left', + width: '30%', + }, + { + title: 'Value', + dataIndex: 'value', + align: 'left', + width: '70%', + }, + ], + data: [], + confirmLoading: false, + editRecord: {}, + }); + + /**单列表编辑 */ + function listEdit(row: Record) { + listState.editRecord = Object.assign({}, row); + } + + /**单列表编辑关闭 */ + function listEditClose() { + listState.confirmLoading = false; + listState.editRecord = {}; + } + + /**单列表编辑确认 */ + function listEditOk() { + if (listState.confirmLoading) return; + const from = toRaw(listState.editRecord); + // 检查规则 + const [ok, msg] = ruleVerification(from); + if (!ok) { + message.warning({ + content: `${msg}`, + duration: 3, + }); + return; + } + + // 发送 + listState.confirmLoading = true; + const hide = message.loading(t('common.loading'), 0); + editPtNeConfigData({ + neType: treeState.neType, + paramName: treeState.selectNode.paramName, + paramData: { + [from['name']]: from['value'], + }, + }) + .then(res => { + if (res.code === RESULT_CODE_SUCCESS) { + message.success({ + content: t('views.configManage.configParamForm.updateValue', { + num: from['display'], + }), + duration: 3, + }); + // 改变表格数据 + const item = listState.data.find( + (item: Record) => from['name'] === item['name'] + ); + if (item) { + Object.assign(item, listState.editRecord); + } + } else { + message.warning({ + content: t('views.configManage.configParamForm.updateValueErr'), + duration: 3, + }); + } + }) + .finally(() => { + hide(); + listState.confirmLoading = false; + listState.editRecord = {}; + }); + } + + /**表格分页器参数 */ + let tablePagination = reactive({ + /**当前页数 */ + current: 1, + /**每页条数 */ + pageSize: 10, + /**默认的每页条数 */ + defaultPageSize: 10, + /**指定每页可以显示多少条 */ + pageSizeOptions: ['10', '20', '50', '100'], + /**只有一页时是否隐藏分页器 */ + hideOnSinglePage: true, + /**是否可以快速跳转至某页 */ + showQuickJumper: true, + /**是否可以改变 pageSize */ + showSizeChanger: true, + /**数据总数 */ + total: 0, + showTotal: (total: number) => t('common.tablePaginationTotal', { total }), + onChange: (page: number, pageSize: number) => { + tablePagination.current = page; + tablePagination.pageSize = pageSize; + }, + }); + + return { tablePagination, listState, listEdit, listEditClose, listEditOk }; +} diff --git a/practical_training/views/configManage/configParamTreeTable/hooks/useOptions.ts b/practical_training/views/configManage/configParamTreeTable/hooks/useOptions.ts new file mode 100644 index 00000000..b7220371 --- /dev/null +++ b/practical_training/views/configManage/configParamTreeTable/hooks/useOptions.ts @@ -0,0 +1,192 @@ +import { getNeConfigData } from '@/api/ne/neConfig'; +import { regExpIPv4, regExpIPv6, validURL } from '@/utils/regular-utils'; +import { ref } from 'vue'; + +/** + * 参数公共函数 + * @param param 父级传入 {t} + * @returns + */ +export default function useOptions({ t }: any) { + /**规则校验 */ + function ruleVerification(row: Record): (string | boolean)[] { + let result = [true, '']; + const type = row.type; + const value = row.value; + const filter = row.filter; + const display = row.display; + + // 子嵌套的不检查 + if (row.array) { + return result; + } + + // 可选的同时没有值不检查 + if (row.optional === 'true' && !value) { + return result; + } + switch (type) { + case 'int': + // filter: "0~128" + + if (filter && filter.indexOf('~') !== -1) { + const filterArr = filter.split('~'); + const minInt = parseInt(filterArr[0]); + const maxInt = parseInt(filterArr[1]); + const valueInt = parseInt(value); + if (valueInt < minInt || valueInt > maxInt) { + return [ + false, + t('views.configManage.configParamForm.requireInt', { + display, + filter, + }), + ]; + } + } + break; + case 'ipv4': + if (!regExpIPv4.test(value)) { + return [ + false, + t('views.configManage.configParamForm.requireIpv4', { display }), + ]; + } + break; + case 'ipv6': + if (!regExpIPv6.test(value)) { + return [ + false, + t('views.configManage.configParamForm.requireIpv6', { display }), + ]; + } + break; + case 'enum': + if (filter && filter.indexOf('{') === 1) { + let filterJson: Record = {}; + try { + filterJson = JSON.parse(filter); //string---json + } catch (error) { + console.error(error); + } + + if (!Object.keys(filterJson).includes(`${value}`)) { + return [ + false, + t('views.configManage.configParamForm.requireEnum', { display }), + ]; + } + } + break; + case 'bool': + // filter: '{"0":"false", "1":"true"}' + + if (filter && filter.indexOf('{') === 1) { + let filterJson: Record = {}; + try { + filterJson = JSON.parse(filter); //string---json + } catch (error) { + console.error(error); + } + + if (!Object.values(filterJson).includes(`${value}`)) { + return [ + false, + t('views.configManage.configParamForm.requireBool', { display }), + ]; + } + } + break; + case 'string': + // filter: "0~128" + + // 字符串长度判断 + if (filter && filter.indexOf('~') !== -1) { + try { + const filterArr = filter.split('~'); + let rule = new RegExp( + '^\\S{' + filterArr[0] + ',' + filterArr[1] + '}$' + ); + if (!rule.test(value)) { + return [ + false, + t('views.configManage.configParamForm.requireString', { + display, + }), + ]; + } + } catch (error) { + console.error(error); + } + } + // 字符串http判断 + if (value.startsWith('http')) { + try { + if (!validURL(value)) { + return [ + false, + t('views.configManage.configParamForm.requireString', { + display, + }), + ]; + } + } catch (error) { + console.error(error); + } + } + + break; + case 'regex': + // filter: "^[0-9]{3}$" + + if (filter) { + try { + let regex = new RegExp(filter); + if (!regex.test(value)) { + return [ + false, + t('views.configManage.configParamForm.requireString', { + display, + }), + ]; + } + } catch (error) { + console.error(error); + } + } + break; + + default: + return [ + false, + t('views.configManage.configParamForm.requireUn', { display }), + ]; + } + return result; + } + + /**upfId可选择 */ + const SMFByUPFIdOptions = ref<{ value: string; label: string }[]>([]); + /**加载smf配置的upfId */ + function getConfigSMFByUPFIds(neId: string) { + getNeConfigData({ + neType: 'SMF', + neId: neId, + paramName: 'upfConfig', + }).then(res => { + SMFByUPFIdOptions.value = []; + for (const s of res.data) { + SMFByUPFIdOptions.value.push({ + value: s.id, + label: s.id, + }); + } + }); + } + + return { + ruleVerification, + getConfigSMFByUPFIds, + SMFByUPFIdOptions, + }; +} diff --git a/practical_training/views/configManage/configParamTreeTable/hooks/usePtOptions.ts b/practical_training/views/configManage/configParamTreeTable/hooks/usePtOptions.ts new file mode 100644 index 00000000..c2d7d464 --- /dev/null +++ b/practical_training/views/configManage/configParamTreeTable/hooks/usePtOptions.ts @@ -0,0 +1,228 @@ +import { ptSaveAsDefault, ptResetAsDefault } from '@/api/pt/neConfig'; +import { + getPtClassStudents, + stuPtNeConfigApply, + updatePtNeConfigApply, +} from '@/api/pt/neConfigApply'; +import { RESULT_CODE_SUCCESS } from '@/constants/result-constants'; +import { hasRoles } from '@/plugins/auth-user'; +import { message } from 'ant-design-vue/lib'; +import { computed, onMounted, reactive } from 'vue'; + +/** + * 实训教学函数 + * @param param 父级传入 {t,fnActiveConfigNode} + * @returns + */ +export default function usePtOptions({ t, fnActiveConfigNode }: any) { + const ptConfigState = reactive({ + saveLoading: false, + restLoading: false, + applyLoading: false, + }); + /**(管理员)保存网元下所有配置为示例配置 */ + function ptConfigSave(neType: string) { + ptConfigState.saveLoading = true; + ptSaveAsDefault(neType, '001') + .then(res => { + if (res.code === RESULT_CODE_SUCCESS) { + message.success({ + content: t('common.operateOk'), + duration: 3, + }); + } else { + message.error({ + content: `${res.msg}`, + duration: 3, + }); + } + }) + .finally(() => { + ptConfigState.saveLoading = false; + fnActiveConfigNode('#'); + }); + } + + /**重置网元下所有配置 */ + function ptConfigReset(neType: string) { + ptConfigState.restLoading = true; + ptResetAsDefault(neType) + .then(res => { + if (res.code === RESULT_CODE_SUCCESS) { + message.success({ + content: t('common.operateOk'), + duration: 3, + }); + } else { + message.error({ + content: `${res.msg}`, + duration: 3, + }); + } + }) + .finally(() => { + ptConfigState.restLoading = false; + fnActiveConfigNode('#'); + }); + } + + /**配置下方应用(学生)申请撤回和(管理/教师)应用退回 */ + function ptConfigApply( + neType: string, + status: '0' | '1' | '2' | '3', + student?: string + ) { + let result: any; + if (status === '2' || status === '3') { + let from: { + neType: string; + status: string; + student?: string; + backInfo?: string; + } = { + neType, + status: '2', + }; + if (student) { + if (status === '2') { + from = { neType, status, student }; + } + if (status === '3') { + from = { neType, status, student, backInfo: '请重新检查配置' }; + } + } + result = updatePtNeConfigApply(from); + } + if (status === '0' || status === '1') { + result = stuPtNeConfigApply({ neType, status }); + } + if (!result) return; + ptConfigState.applyLoading = true; + result + .then((res: any) => { + if (res.code === RESULT_CODE_SUCCESS) { + message.success({ + content: t('common.operateOk'), + duration: 3, + }); + // 教师修改学生时改变状态 + if (student) { + const item = classState.studentOptionsDef.find( + s => s.value === classState.student + ); + if (item) { + item.applyStatus = status; + } + } + } else { + message.error({ + content: `${res.msg}`, + duration: 3, + }); + } + }) + .finally(() => { + ptConfigState.applyLoading = false; + }); + } + + const classState = reactive<{ + /**学生账号 */ + student: string | undefined; + /**学生可选择列表 */ + studentOptions: { + value: string; + label: string; + applyId: string; + applyStatus: string; + }[]; + studentOptionsDef: { + value: string; + label: string; + applyId: string; + applyStatus: string; + }[]; + }>({ + student: undefined, + studentOptions: [], + studentOptionsDef: [], + }); + + // 仅教师加载 + if (hasRoles(['teacher'])) { + onMounted(() => { + classStudents(); // 初始学生列表 + }); + } + + /**学生选择搜索 */ + function studentChange(v: any) { + if (!v) { + Object.assign(classState.studentOptions, classState.studentOptionsDef); + } + fnActiveConfigNode('#'); + } + + let timeout: any; + + /**学生选择搜索 */ + function studentSearch(val: string) { + if (timeout) { + clearTimeout(timeout); + timeout = null; + } + if (!val) { + Object.assign(classState.studentOptions, classState.studentOptionsDef); + return; + } + timeout = setTimeout(() => classStudents(val), 500); + } + + /**班级学生列表 */ + function classStudents(val?: string) { + getPtClassStudents({ userName: val }).then(res => { + classState.studentOptions = []; + if (!Array.isArray(res.data) || res.data.length <= 0) { + return; + } + for (const v of res.data) { + classState.studentOptions.push({ + value: v.userName, + label: v.userName, + applyId: v.applyId, + applyStatus: v.applyStatus, + }); + // 设为最新状态 + const item = classState.studentOptionsDef.find( + s => s.value === v.userName + ); + if (item) { + item.applyStatus = v.applyStatus; + } + } + if (!val) { + Object.assign(classState.studentOptionsDef, classState.studentOptions); + } + }); + } + + // 学生状态 + const studentStatus = computed(() => { + const item = classState.studentOptionsDef.find( + s => s.value === classState.student + ); + if (item) return item.applyStatus; + return ''; + }); + + return { + ptConfigState, + ptConfigSave, + ptConfigReset, + ptConfigApply, + classState, + studentStatus, + studentSearch, + studentChange, + }; +} diff --git a/practical_training/views/configManage/configParamTreeTable/index.vue b/practical_training/views/configManage/configParamTreeTable/index.vue new file mode 100644 index 00000000..50bac0b9 --- /dev/null +++ b/practical_training/views/configManage/configParamTreeTable/index.vue @@ -0,0 +1,1249 @@ + + + + + diff --git a/practical_training/views/configManage/neManage/index.vue b/practical_training/views/configManage/neManage/index.vue new file mode 100644 index 00000000..de374d4a --- /dev/null +++ b/practical_training/views/configManage/neManage/index.vue @@ -0,0 +1,1275 @@ + + + + + diff --git a/practical_training/views/configManage/neOverview/index.vue b/practical_training/views/configManage/neOverview/index.vue new file mode 100644 index 00000000..a2492040 --- /dev/null +++ b/practical_training/views/configManage/neOverview/index.vue @@ -0,0 +1,442 @@ + + + + + diff --git a/practical_training/views/dashboard/amfUE/index.vue b/practical_training/views/dashboard/amfUE/index.vue new file mode 100644 index 00000000..e08cf16f --- /dev/null +++ b/practical_training/views/dashboard/amfUE/index.vue @@ -0,0 +1,728 @@ + + + + + diff --git a/practical_training/views/dashboard/imsCDR/index.vue b/practical_training/views/dashboard/imsCDR/index.vue new file mode 100644 index 00000000..3405700a --- /dev/null +++ b/practical_training/views/dashboard/imsCDR/index.vue @@ -0,0 +1,839 @@ + + + + + diff --git a/practical_training/views/dashboard/mmeUE/index.vue b/practical_training/views/dashboard/mmeUE/index.vue new file mode 100644 index 00000000..b6f4f842 --- /dev/null +++ b/practical_training/views/dashboard/mmeUE/index.vue @@ -0,0 +1,742 @@ + + + + + diff --git a/practical_training/views/dashboard/smfCDR/index.vue b/practical_training/views/dashboard/smfCDR/index.vue new file mode 100644 index 00000000..23c098f1 --- /dev/null +++ b/practical_training/views/dashboard/smfCDR/index.vue @@ -0,0 +1,838 @@ + + + + + diff --git a/practical_training/views/dashboard/smscCDR/index.vue b/practical_training/views/dashboard/smscCDR/index.vue new file mode 100644 index 00000000..2c33eb78 --- /dev/null +++ b/practical_training/views/dashboard/smscCDR/index.vue @@ -0,0 +1,769 @@ + + + + + diff --git a/practical_training/views/monitor/topologyArchitecture/index.vue b/practical_training/views/monitor/topologyArchitecture/index.vue new file mode 100644 index 00000000..c436ed20 --- /dev/null +++ b/practical_training/views/monitor/topologyArchitecture/index.vue @@ -0,0 +1,551 @@ + + + + + diff --git a/practical_training/views/ne/neInfo/components/BackConfModal.vue b/practical_training/views/ne/neInfo/components/BackConfModal.vue new file mode 100644 index 00000000..367e76d9 --- /dev/null +++ b/practical_training/views/ne/neInfo/components/BackConfModal.vue @@ -0,0 +1,374 @@ + + + + + diff --git a/practical_training/views/ne/neInfo/components/EditModal.vue b/practical_training/views/ne/neInfo/components/EditModal.vue new file mode 100644 index 00000000..9b14e7f1 --- /dev/null +++ b/practical_training/views/ne/neInfo/components/EditModal.vue @@ -0,0 +1,834 @@ + + + + + diff --git a/practical_training/views/ne/neInfo/components/OAMModal.vue b/practical_training/views/ne/neInfo/components/OAMModal.vue new file mode 100644 index 00000000..9722da0a --- /dev/null +++ b/practical_training/views/ne/neInfo/components/OAMModal.vue @@ -0,0 +1,322 @@ + + + + + diff --git a/practical_training/views/ne/neInfo/hooks/useNeOptions.ts b/practical_training/views/ne/neInfo/hooks/useNeOptions.ts new file mode 100644 index 00000000..941ff9d5 --- /dev/null +++ b/practical_training/views/ne/neInfo/hooks/useNeOptions.ts @@ -0,0 +1,153 @@ +import { RESULT_CODE_SUCCESS } from '@/constants/result-constants'; +import { Modal, message } from 'ant-design-vue/es'; +import useI18n from '@/hooks/useI18n'; +import { useRouter } from 'vue-router'; +import { updateNeConfigReload } from '@/api/configManage/configParam'; +import { serviceNeAction } from '@/api/ne/neInfo'; +import useMaskStore from '@/store/modules/mask'; + +export default function useNeOptions() { + const router = useRouter(); + const { t } = useI18n(); + const maskStore = useMaskStore(); + + /** + * 网元启动 + * @param row {neName,neType,neId} + */ + function fnNeStart(row: Record) { + Modal.confirm({ + title: t('common.tipTitle'), + content: t('views.ne.common.startTip'), + onOk() { + const hide = message.loading(t('common.loading'), 0); + serviceNeAction({ + neType: row.neType, + neId: row.neId, + action: 'start', + }) + .then(res => { + if (res.code === RESULT_CODE_SUCCESS) { + message.success(t('common.operateOk'), 3); + } else { + message.error(`${res.msg}`, 3); + } + }) + .finally(() => { + hide(); + }); + }, + }); + } + + /** + * 网元重启 + * @param row {neName,neType,neId} + */ + function fnNeRestart(row: Record) { + Modal.confirm({ + title: t('common.tipTitle'), + content: t('views.ne.common.restartTip'), + onOk() { + const hide = message.loading(t('common.loading'), 0); + serviceNeAction({ + neType: row.neType, + neId: row.neId, + action: 'restart', + }) + .then(res => { + if (res.code === RESULT_CODE_SUCCESS) { + // OMC自升级 + if (row.neType.toUpperCase() === 'OMC') { + if (res.code === RESULT_CODE_SUCCESS) { + maskStore.handleMaskType('reload'); + } else { + message.error({ + content: `${res.msg}`, + duration: 3, + }); + } + return; + } + message.success(t('common.operateOk'), 3); + } else { + message.error(`${res.msg}`, 3); + } + }) + .finally(() => { + hide(); + }); + }, + }); + } + + /** + * 网元停止 + * @param row {neName,neType,neId} + */ + function fnNeStop(row: Record) { + Modal.confirm({ + title: t('common.tipTitle'), + content: t('views.ne.common.stopTip'), + onOk() { + const hide = message.loading(t('common.loading'), 0); + serviceNeAction({ + neType: row.neType, + neId: row.neId, + action: 'stop', + }) + .then(res => { + if (res.code === RESULT_CODE_SUCCESS) { + message.success(t('common.operateOk'), 3); + } else { + message.error(`${res.msg}`, 3); + } + }) + .finally(() => { + hide(); + }); + }, + }); + } + + /** + * 网元重新加载 + * @param row {neName,neType,neId} + */ + function fnNeReload(row: Record) { + Modal.confirm({ + title: t('common.tipTitle'), + content: t('views.ne.common.reloadTip'), + onOk() { + const hide = message.loading(t('common.loading'), 0); + updateNeConfigReload(row.neType, row.neId) + .then(res => { + if (res.code === RESULT_CODE_SUCCESS) { + message.success(t('common.operateOk'), 3); + } else { + message.error(`${res.msg}`, 3); + } + }) + .finally(() => { + hide(); + }); + }, + }); + } + + /** + * 跳转网元日志文件页面 + * @param row {neType,neId} + */ + function fnNeLogFile(row: Record) { + router.push({ + name: 'NeFile_2123', + query: { + neType: row.neType, + neId: row.neId, + }, + }); + } + + return { fnNeStart, fnNeRestart, fnNeStop, fnNeReload, fnNeLogFile }; +} diff --git a/practical_training/views/ne/neInfo/index.vue b/practical_training/views/ne/neInfo/index.vue new file mode 100644 index 00000000..cf4b2aba --- /dev/null +++ b/practical_training/views/ne/neInfo/index.vue @@ -0,0 +1,790 @@ + + + + + diff --git a/practical_training/views/plugins/auth-user.ts b/practical_training/views/plugins/auth-user.ts new file mode 100644 index 00000000..e2fb9efb --- /dev/null +++ b/practical_training/views/plugins/auth-user.ts @@ -0,0 +1,66 @@ +import { ADMIN_PERMISSION, ADMIN_ROLE_KEY } from '@/constants/admin-constants'; +import useUserStore from '@/store/modules/user'; + +/** + * 是否系统管理员 + * @returns true | false + */ +export function isSystemAdmin(): boolean { + const userPermissions = useUserStore().permissions; + if (userPermissions.includes(ADMIN_PERMISSION)) return true; + const userRoles = useUserStore().roles; + if (userRoles.includes(ADMIN_ROLE_KEY)) return true; + return false; +} + +/** + * 只需含有其中权限 + * @param role 权限字符数组 + * @returns true | false + */ +export function hasPermissions(permissions: string[]): boolean { + if (!permissions || permissions.length === 0) return false; + const userPermissions = useUserStore().permissions; + if (!userPermissions || userPermissions.length === 0) return false; + if (userPermissions.includes(ADMIN_PERMISSION)) return true; + return permissions.some(p => userPermissions.some(up => up === p)); +} + +/** + * 同时匹配其中权限 + * @param role 权限字符数组 + * @returns true | false + */ +export function matchPermissions(permissions: string[]): boolean { + if (!permissions || permissions.length === 0) return false; + const userPermissions = useUserStore().permissions; + if (!userPermissions || userPermissions.length === 0) return false; + if (userPermissions.includes(ADMIN_PERMISSION)) return true; + return permissions.every(p => userPermissions.some(up => up === p)); +} + +/** + * 只需含有其中角色 + * @param role 角色字符数组 + * @returns true | false + */ +export function hasRoles(roles: string[]): boolean { + if (!roles || roles.length === 0) return false; + const userRoles = useUserStore().roles; + if (!userRoles || userRoles.length === 0) return false; + if (userRoles.includes(ADMIN_ROLE_KEY)) return true; + return roles.some(r => userRoles.some(ur => ur === r)); +} + +/** + * 同时匹配其中角色 + * @param role 角色字符数组 + * @returns true | false + */ +export function matchRoles(roles: string[]): boolean { + if (!roles || roles.length === 0) return false; + const userRoles = useUserStore().roles; + if (!userRoles || userRoles.length === 0) return false; + if (userRoles.includes(ADMIN_ROLE_KEY)) return true; + return roles.every(r => userRoles.some(ur => ur === r)); +} diff --git a/practical_training/views/store/modules/user.ts b/practical_training/views/store/modules/user.ts new file mode 100644 index 00000000..3b8b5d42 --- /dev/null +++ b/practical_training/views/store/modules/user.ts @@ -0,0 +1,171 @@ +import defaultAvatar from '@/assets/images/default_avatar.png'; +import useLayoutStore from './layout'; +import { login, logout, getInfo } from '@/api/login'; +import { setToken, removeToken } from '@/plugins/auth-token'; +import { defineStore } from 'pinia'; +import { TOKEN_RESPONSE_FIELD } from '@/constants/token-constants'; +import { RESULT_CODE_SUCCESS } from '@/constants/result-constants'; +import { parseUrlPath } from '@/plugins/file-static-url'; + +/**用户信息类型 */ +type UserInfo = { + /**用户ID */ + userId: string; + /**登录账号 */ + userName: string; + /**用户角色 字符串数组 */ + roles: string[]; + /**用户权限 字符串数组 */ + permissions: string[]; + /**用户头像 */ + avatar: string; + /**用户昵称 */ + nickName: string; + /**用户手机号 */ + phonenumber: string; + /**用户邮箱 */ + email: string; + /**用户性别 */ + sex: string | undefined; + /**其他信息 */ + profile: Record; +}; + +const useUserStore = defineStore('user', { + state: (): UserInfo => ({ + userId: '', + userName: '', + roles: [], + permissions: [], + avatar: '', + nickName: '', + phonenumber: '', + email: '', + sex: undefined, + profile: {}, + }), + getters: { + /** + * 获取正确头像地址 + * @param state 内部属性不用传入 + * @returns 头像地址url + */ + getAvatar(state) { + if (!state.avatar) { + return defaultAvatar; + } + return parseUrlPath(state.avatar); + }, + /** + * 获取基础信息属性 + * @param state 内部属性不用传入 + * @returns 基础信息 + */ + getBaseInfo(state) { + return { + nickName: state.nickName, + phonenumber: state.phonenumber, + email: state.email, + sex: state.sex, + }; + }, + }, + actions: { + /** + * 更新基础信息属性 + * @param data 变更信息 + */ + setBaseInfo(data: Record) { + this.nickName = data.nickName; + this.phonenumber = data.phonenumber; + this.email = data.email; + this.sex = data.sex; + }, + /** + * 更新头像 + * @param avatar 上传后的地址 + */ + setAvatar(avatar: string) { + this.avatar = avatar; + }, + /** + * 获取正确头像地址 + * @param avatar + */ + fnAvatar(avatar: string) { + if (!avatar) { + return defaultAvatar; + } + return parseUrlPath(avatar); + }, + // 登录 + async fnLogin(loginBody: Record) { + const res = await login(loginBody); + if (res.code === RESULT_CODE_SUCCESS && res.data) { + const token = res.data[TOKEN_RESPONSE_FIELD]; + setToken(token); + } + return res; + }, + // 获取用户信息 + async fnGetInfo() { + const res = await getInfo(); + if (res.code === RESULT_CODE_SUCCESS && res.data) { + const { user, roles, permissions } = res.data; + this.userId = user.userId; + // 登录账号 + this.userName = user.userName; + // 用户头像 + this.avatar = user.avatar; + // 基础信息 + this.nickName = user.nickName; + this.phonenumber = user.phonenumber; + this.email = user.email; + this.sex = user.sex; + + // 验证返回的roles是否是一个非空数组 + if (Array.isArray(roles) && roles.length > 0) { + this.roles = roles; + this.permissions = permissions; + } else { + this.roles = ['ROLE_DEFAULT']; + this.permissions = []; + } + + // 水印文字信息=用户昵称 手机号 + let waterMarkContent = this.userName; + if (this.phonenumber) { + waterMarkContent = `${this.userName} ${this.phonenumber}`; + } + // useLayoutStore().changeWaterMark(waterMarkContent); + useLayoutStore().changeWaterMark(''); + // 学生布局用不一样的 + if (this.roles.includes('student')) { + useLayoutStore().changeConf('layout', 'side'); + useLayoutStore().changeConf('menuTheme', 'dark'); + useLayoutStore().changeConf('tabRender', false); + } + } + // 网络错误时退出登录状态 + if (res.code === 0) { + removeToken(); + window.location.reload(); + } + return res; + }, + // 退出系统 + async fnLogOut() { + try { + await logout(); + } catch (error) { + throw error; + } finally { + this.roles = []; + this.permissions = []; + removeToken(); + } + }, + }, +}); + +export default useUserStore;