778 Commits

Author SHA1 Message Date
TsMask
4c315a1548 fix: 租户管理表格操作去掉按钮权限 2025-10-27 15:50:44 +08:00
TsMask
4dfe872c27 chore: 更新版本号 2.2510.4 2025-10-24 19:59:47 +08:00
TsMask
d2e6e52fd0 fix: AMF配置WhiteList Content导入index0无效问题 2025-10-24 17:57:21 +08:00
TsMask
df7dacdc39 feat: 更新背景图片固定BA的 2025-10-23 14:31:43 +08:00
TsMask
0b54c730d7 feat: 基站状态补充randId列 2025-10-23 14:16:09 +08:00
zhongzm
70ddcb56ba feat:拖拽优化 2025-10-20 17:32:16 +08:00
zhongzm
719a08d993 feat:Roaming CDR自定义导出功能 2025-10-20 17:04:16 +08:00
zhongzm
81f287e9ff feat:冗余代码优化 2025-10-18 15:23:30 +08:00
zhongzm
cf724e8693 feat:基站名称和位置信息改为非必填 2025-10-17 18:13:03 +08:00
zhongzm
869e2b23fb feat:网元信息更新响应修复 2025-10-17 18:03:18 +08:00
TsMask
5d33611ef1 feat: UDM鉴权cnFlag添加5G/4G接入选择 2025-10-17 15:41:03 +08:00
TsMask
95c3001f35 feat: 更新getAllNeConfig函数,支持传入neId参数 2025-10-17 10:18:36 +08:00
zhongzm
6597b20ff9 feat:标签修复 2025-10-15 16:52:50 +08:00
TsMask
25538b2cc4 feat: 更新根网管节点处理逻辑,支持无OMC情况 2025-10-15 10:26:20 +08:00
TsMask
14590545f5 style: 移除ID列显示 2025-10-13 19:26:11 +08:00
TsMask
f7a9258473 style: 操作日志信息json结构格式美化 2025-10-13 17:33:22 +08:00
TsMask
49b78d9933 feat: 备份网元日志文件数据查看 2025-10-13 17:32:54 +08:00
zhongzm
b7fa412733 feat:悬浮标签修改 2025-10-13 17:10:03 +08:00
TsMask
14864cbf9b chore: 更新版本号 2.2510.2 2025-10-11 19:12:42 +08:00
TsMask
c40942694e fix: MML回车undefined问题,关闭搜索匹配 2025-10-11 17:31:24 +08:00
zhongzm
c1df7e2700 feat:自定义指标折叠优化 2025-10-10 19:08:57 +08:00
zhongzm
f6c3d730af feat:关键指标折叠优化 2025-10-10 19:08:39 +08:00
zhongzm
22cab89749 feat:黄金指标折叠优化 2025-10-10 19:08:14 +08:00
zhongzm
c85b588719 feat:图表自适应布局重构优化 2025-10-10 11:34:34 +08:00
TsMask
2ac730dfe2 style: 移除ID列显示 2025-10-09 19:36:26 +08:00
TsMask
669bdf5b7d style: UDM-鉴权数据,默认只支持导出非加密 2025-10-09 17:39:39 +08:00
TsMask
744867243f style: 移除网元版本和授权ID列显示 2025-10-09 11:46:06 +08:00
TsMask
79830b752a fix: SMSC-CDR添加结果原因说明 2025-09-28 18:16:53 +08:00
TsMask
4bb5a99b37 feat: UDM-auth数据导出按钮权限定义 2025-09-28 18:16:11 +08:00
zhongzm
dfa8539b9b feat:图表生成函数重构优化 2025-09-28 10:16:12 +08:00
TsMask
226a104417 style: UPF N3 Ping测试功能移除耗时显示 2025-09-25 17:00:51 +08:00
zhongzm
539ecbc039 feat:控制台打印注释 2025-09-25 16:59:41 +08:00
zhongzm
61adb5c8ae feat:修正时间单位显示问题 2025-09-25 16:46:14 +08:00
TsMask
be2595f49d style: MML返回多结果显示undefined 2025-09-25 15:28:20 +08:00
TsMask
63d02ab19d feat: UDM数据添加创建时间列 2025-09-23 10:50:18 +08:00
zhongzm
12d2c50248 feat:修正mos和cct查询时间范围 2025-09-22 15:44:46 +08:00
zhongzm
2bdad2db47 feat:mos和cct时间轴补0数据 2025-09-22 15:26:59 +08:00
zhongzm
33055d74ba feat:语音仪表盘样式修改 2025-09-22 11:53:24 +08:00
TsMask
702eeb9caa style: 翻译MOS Average改为MOS 2025-09-19 19:04:07 +08:00
TsMask
8d01eb48e6 fix: 更新cdr/ue时间强制转换数值类型 2025-09-19 19:03:13 +08:00
zhongzm
b98f2394b8 feat:语音仪表盘mos和cct显示修复和样式调整 2025-09-19 17:44:41 +08:00
TsMask
80f72549a2 feat: 添加系统备份功能,包括导入导出OMC的API和界面支持 2025-09-19 16:12:42 +08:00
TsMask
bd729b7437 style: CCT改为Call Connection Time 2025-09-19 15:41:01 +08:00
TsMask
3aaa90746b Merge branch 'multi-tenant' of http://192.168.2.166:3180/OMC/ems_frontend_vue3 into multi-tenant 2025-09-19 15:38:47 +08:00
TsMask
b55b4ad49d feat: 添加活动告警自动刷新功能 2025-09-19 15:38:45 +08:00
TsMask
ae171a2a82 fix: 根据搜索条件导出,去除最大记录限制 2025-09-19 15:29:54 +08:00
zhongzm
2828deaece feat:语音仪表盘增加指标 2025-09-19 09:14:52 +08:00
zhongzm
f8376c803f feat:折叠按钮样式修改 2025-09-18 16:27:23 +08:00
zhongzm
fe13f56aa1 feat:网元信息界面部分显示修改 2025-09-17 20:13:37 +08:00
zhongzm
1e27a414db feat:折叠图表按钮样式修改 2025-09-17 19:47:29 +08:00
TsMask
6edd445e3d feat: 新增kpi导出文件查看 2025-09-17 15:10:28 +08:00
TsMask
4a5008f1b5 style: 全局菜单搜索仅过滤菜单名称 2025-09-17 15:10:08 +08:00
TsMask
749e880aa7 feat: 补充UPF N3 Ping测试功能丢包耗时 2025-09-15 15:10:46 +08:00
TsMask
f0789acf42 style: IMS看板字母单词大写 2025-09-15 10:56:23 +08:00
TsMask
5acbec4c45 fix: UDM-redis连接配置展开key重复 2025-09-12 18:23:33 +08:00
TsMask
4f6ad8edc4 fix: 去掉未知变量Table.EXPAND_COLUMN 2025-09-12 18:22:54 +08:00
TsMask
4048d2b736 style: 仪表盘鼠标悬浮提示更新 2025-09-12 18:14:46 +08:00
TsMask
f919d31232 style: 仪表盘鼠标悬浮提示更新 2025-09-12 17:53:28 +08:00
TsMask
5e2184945c feat: UDM-redis连接多加从库地址 2025-09-12 17:49:30 +08:00
zhongzm
c3e046d9d9 Merge remote-tracking branch 'origin/multi-tenant' into multi-tenant 2025-09-12 16:32:32 +08:00
zhongzm
33dc7cb7dc feat:网元信息平滑自动更新,修复新增和删除问题 2025-09-12 16:32:23 +08:00
TsMask
5cbe885d7e feat: 添加UPF N3 Ping测试功能 2025-09-12 15:22:54 +08:00
zhongzm
6b45194c65 feat:还原User Activity 2025-09-12 14:55:14 +08:00
zhongzm
1d3ab0f6af feat:样式调整补 2025-09-12 14:50:55 +08:00
zhongzm
2d29bd4226 Merge remote-tracking branch 'origin/multi-tenant' into multi-tenant 2025-09-12 14:42:40 +08:00
zhongzm
6bbd5d723e feat:仪表盘自适应取消 2025-09-12 14:42:22 +08:00
TsMask
2a45acad33 fix: 修改图表标题,将“Busy Time”更改为“Busy Hour” 2025-09-12 14:22:48 +08:00
zhongzm
c7dd92d3b3 feat:neinfo表格结构修改,增加定时刷新 2025-09-12 13:34:02 +08:00
TsMask
905d8c3bb2 feat: 添加ims-cdr数据moc/cct 2025-09-11 20:11:55 +08:00
zhongzm
bb6cae1433 feat:语音仪表盘标签修改 2025-09-09 19:20:48 +08:00
zhongzm
d85889b376 feat:neInfo修改新增和编辑 2025-09-09 19:13:30 +08:00
zhongzm
d1a20296d9 feat:表格改为嵌套显示 2025-09-09 18:42:36 +08:00
zhongzm
2f8c80572b feat:大屏部分信息显示修改以及样式微调 2025-09-09 15:34:12 +08:00
zhongzm
7ef9d23e94 feat:黄金指标bytes改MB/GB 2025-09-09 14:29:44 +08:00
lai
0a130781d1 自适应功能 2025-09-09 12:06:49 +08:00
zhongzm
6ce5a24614 feat:关键仪表盘显示指标修改 2025-09-09 10:25:29 +08:00
lai
627f847d5e 新增搜索菜单按钮 2025-09-08 19:30:30 +08:00
zhongzm
89c2a61737 feat:kpi图表隐藏按钮添加 2025-09-08 17:04:18 +08:00
zhongzm
4403b06416 feat:语音仪表盘增加新指标显示 2025-09-08 15:30:40 +08:00
zhongzm
55f3e1c673 feat:大屏新模块改为UE Online Information 2025-09-08 15:29:46 +08:00
zhongzm
007b640209 feat:中文补充 2025-09-05 18:17:54 +08:00
zhongzm
59af80fe7f feat:仪表盘修复闪烁、跳转问题 2025-09-05 18:03:59 +08:00
TsMask
ed3b5bb5e8 feat: 添加权限控制到IMS用户数量显示 2025-09-05 17:47:42 +08:00
TsMask
58f78432f0 feat: 恢复UDM Auth创建时间列 2025-09-05 17:37:28 +08:00
TsMask
a2a5e52576 style: 去除udm导入模板#行 2025-09-05 17:37:25 +08:00
TsMask
b50c962201 fix: 更新模板文件,添加导入说明并修正数据格式 2025-09-05 15:44:06 +08:00
TsMask
2209a7206f feat: 实现PCAP文件分批下载,避免浏览器限制同时下载10个文件的问题 2025-09-05 15:43:52 +08:00
zhongzm
828c640307 feat:仪表盘增加volte、voip显示 2025-09-04 18:13:23 +08:00
zhongzm
4293c611be feat:Configuration、Performance、MML权限按钮添加 2025-09-04 14:25:26 +08:00
TsMask
f155a0dc8e fix: 修改表格行键为'imsi'以确保数据正确绑定 2025-09-03 17:12:17 +08:00
TsMask
dbf6dfbe26 fix: 修正导出按钮的权限标识,从'neUser:auth:export'改为'neUser:sub:export' 2025-09-03 11:50:35 +08:00
zhongzm
826e63a861 Merge remote-tracking branch 'origin/multi-tenant' into multi-tenant 2025-09-02 18:14:17 +08:00
zhongzm
357292d445 feat:指标尾缀neId改为neName 2025-09-02 18:14:05 +08:00
TsMask
87e5261942 feat: 优化图表显示逻辑,动态控制图表显示与关闭 2025-09-02 18:07:42 +08:00
zhongzm
5d60156456 feat:语音仪表盘部分文字信息修改补充 2025-09-02 17:50:16 +08:00
TsMask
ccd5edb76f feat: 优化图表显示逻辑,移除不必要的状态判断 2025-09-02 17:49:07 +08:00
zhongzm
99f7ddb760 feat:语音仪表盘部分文字信息修改 2025-09-02 17:43:44 +08:00
zhongzm
40137f182c feat:Data Usage Report图表显示状态判断 2025-09-02 16:43:22 +08:00
zhongzm
4666a0e9b3 Merge remote-tracking branch 'origin/multi-tenant' into multi-tenant 2025-09-02 14:37:34 +08:00
zhongzm
17650d134a feat:IMSI和布局修改 2025-09-02 14:37:25 +08:00
TsMask
f40107a50f style: kpiOverView指标名称修改 2025-09-02 14:32:30 +08:00
zhongzm
656dad2f3e feat:底部遮挡修复 2025-09-02 14:22:56 +08:00
TsMask
c2dac86db0 fix: 仪表盘点击alarm summary重定向至活动告警(非历史告警) 2025-09-02 10:50:57 +08:00
TsMask
858e3e6559 style: 性能-IMS KPI- VoNR改成 VoNR/VoLTE/VoIP 2025-09-02 10:45:59 +08:00
TsMask
86cb6e0ffe fix: 上传软件包版本号提取正则修改 2025-09-02 10:37:04 +08:00
TsMask
3c485dea48 style: 左侧展开宽度256px 2025-09-01 19:41:49 +08:00
TsMask
9b79fe8271 fix: udm-sub页面删除按钮perms标识错误 2025-09-01 19:40:06 +08:00
TsMask
4f854f77b7 style: MME attach request/success 改成 4g attach request/success 2025-09-01 15:34:00 +08:00
TsMask
2191db06d4 feat: 开站配置omc的ssh地址 2025-08-29 19:15:29 +08:00
TsMask
274353d016 feat: 基站状态页面添加租户名显示列 2025-08-29 18:45:03 +08:00
zhongzm
f0e63da1a2 feat:loaddata权限添加 2025-08-29 17:23:14 +08:00
TsMask
4b34db817e feat: 网元授权显示用户数/基站数 2025-08-29 16:25:13 +08:00
TsMask
a4aeb06d13 style: 网元当前版本显示是否有包存在 2025-08-29 16:24:34 +08:00
zhongzm
3389fbad53 feat:BA UE部分按钮权限分配 2025-08-29 16:18:26 +08:00
TsMask
3aa6822a72 fix: 已经添加的网元类型禁止修改neId 2025-08-28 20:59:02 +08:00
TsMask
bdfad20dd5 fix: cdr/ue导出操作事件重发判断 2025-08-28 16:15:26 +08:00
TsMask
d8c9bbc775 fix: cdr/ue去除导出条数限制 2025-08-28 14:59:08 +08:00
TsMask
5e014309cc fix: UPF流量统计字节数据格式化显示不一致问题 2025-08-28 14:58:20 +08:00
TsMask
390b9cf73e fix: kpi原始指标实时数据推送方向修正,重绘渲染问题修正 2025-08-28 11:21:37 +08:00
zhongzm
760beb0087 Merge remote-tracking branch 'origin/multi-tenant' into multi-tenant 2025-08-27 15:30:42 +08:00
zhongzm
5b2f883934 feat:大屏基站信息修改 2025-08-27 15:29:51 +08:00
TsMask
98521a3a89 feat:优化UPF实时流量统一10s刷新,切换显示下一个 2025-08-27 15:10:30 +08:00
zhongzm
51c9f7fca3 feat:自定义指标loading和title优化 2025-08-27 14:31:49 +08:00
zhongzm
d593abf718 feat:大屏部分信息修改 2025-08-27 14:17:38 +08:00
zhongzm
fdd390c389 feat:sortOrder参数修改 2025-08-27 14:10:38 +08:00
zhongzm
cfba4ecdb2 feat:黄金指标loading和title优化 2025-08-27 12:58:44 +08:00
zhongzm
e45c17c4c5 feat:关键指标loading和title优化 2025-08-27 12:03:02 +08:00
TsMask
f58a0151fe 修复: 注释掉位数据转换中的位数乘以8的代码 2025-08-27 11:52:08 +08:00
TsMask
ff9aca14b8 style: 隐藏掉auth数据创建时间列,等udm支持 2025-08-26 18:39:57 +08:00
TsMask
de74af4fec style: 关掉全局控制语言开关控制 2025-08-26 18:06:44 +08:00
zhongzm
393a90a0d0 feat:修改code常量 2025-08-26 17:07:20 +08:00
TsMask
3f06ab62b1 feat: 修改kpi查询数据排序方式为升序 2025-08-26 14:38:35 +08:00
TsMask
a148dc82a9 syste: 移除无效引用 2025-08-25 15:22:45 +08:00
zhongzm
a039fd7a3a feat:综合大屏悬浮信息修改 2025-08-22 18:38:25 +08:00
zhongzm
00485a5c7f feat:关键指标底部容器显示溢出问题 2025-08-22 18:13:19 +08:00
zhongzm
50cf5e70fb feat:语音仪表盘参数修改 2025-08-22 17:54:02 +08:00
zhongzm
7e5864b97b feat:关键指标统计需求修改 2025-08-22 17:12:26 +08:00
zhongzm
194ad023bd feat:语音仪表盘中英补充 2025-08-22 16:28:04 +08:00
zhongzm
f16b07a2d6 feat:关键指标添加MME网元指标(上一个是未中英的语音仪表盘) 2025-08-22 16:19:24 +08:00
zhongzm
7bf8bad9e4 feat:关键指标添加MME网元指标 2025-08-22 16:11:56 +08:00
zhongzm
ab1725e673 feat:自定义指标统计信息改天数显示 2025-08-22 15:38:55 +08:00
zhongzm
77631de0ff feat:黄金指标统计信息改天数显示 2025-08-22 15:38:30 +08:00
TsMask
f6bdecd877 feat: 支持kpi指标命名控制启用关闭 2025-08-20 17:02:18 +08:00
TsMask
e05084afdc fix: 增加多个导出操作的超时时间至180秒 2025-08-19 16:09:08 +08:00
TsMask
4c49640763 Merge branch 'multi-tenant' of http://192.168.2.166:3180/OMC/ems_frontend_vue3 into multi-tenant 2025-08-15 18:59:15 +08:00
TsMask
4433990878 chore: 更新版本号 2.2508.1 2025-08-15 18:59:11 +08:00
zhongzm
6d092cb3e7 feat:重复调用修正 2025-08-15 15:30:30 +08:00
TsMask
66957520f7 fix: 给config.js加随机数避免缓存 2025-08-14 20:45:57 +08:00
TsMask
3596d7815b feat: UDM鉴权用户显示创建时间 2025-08-14 20:25:59 +08:00
TsMask
b72724649e Merge branch 'multi-tenant' of http://192.168.2.166:3180/OMC/ems_frontend_vue3 into multi-tenant 2025-08-14 19:49:25 +08:00
TsMask
aed81672a2 fix: 系统用户登录主页重复刷新问题 2025-08-14 19:49:22 +08:00
zhongzm
a1c530640c Merge remote-tracking branch 'origin/multi-tenant' into multi-tenant 2025-08-14 19:31:03 +08:00
zhongzm
bcd7599676 feat:kpi自定义仪表盘需求更改 2025-08-14 19:30:53 +08:00
TsMask
5edb5932b5 fix: 租户主页暗色模式显示不一致 2025-08-14 19:17:19 +08:00
TsMask
7bd524976a fix: 租户和系统用户的主页显示差异 2025-08-14 17:15:18 +08:00
TsMask
7b7907616f fix: 图片上传取值fileName失败 2025-08-14 15:10:24 +08:00
TsMask
e763418e38 fix: 第三方用户不可删除和修改密码 2025-08-14 10:31:40 +08:00
TsMask
36e4f2d5f1 fix: 恢复显示快速PLMN修改窗口 2025-08-14 10:30:50 +08:00
TsMask
38f0b9b560 feat: 第三方登录认证功能和管理页 2025-08-12 09:53:38 +08:00
TsMask
246bb9a7e0 rev: 回退看板,修复切换upf的流量统计显示 2025-08-07 15:46:01 +08:00
TsMask
678bfce993 chore: 更新版本号 2.250725 2025-07-25 14:12:56 +08:00
TsMask
f8bc9fc622 feat: 参数配置AMF导入Index字段存在更新,不存在默认新增 2025-07-21 17:12:19 +08:00
TsMask
d37fd4deae feat: 参数配置刷新无法正常打开,导入白名单字段格式转换 2025-07-21 15:40:13 +08:00
zhongzm
394cef66c2 Merge remote-tracking branch 'origin/multi-tenant' into multi-tenant 2025-07-18 17:23:56 +08:00
zhongzm
7432f1e237 feat:Users添加默认显示,避免样式偏移 2025-07-18 17:23:45 +08:00
TsMask
8eea52c4e5 chore: 更新版本号 2.250718 2025-07-18 16:54:00 +08:00
zhongzm
4c777245fc feat:综合仪表盘样式优化 2025-07-18 16:49:33 +08:00
TsMask
42464bc5bd feat: 参数配置imeiWhitelist批量导入xlsx文件 2025-07-16 10:29:36 +08:00
zhongzm
a436efab67 feat:增加数据点,增加初始显示 2025-07-15 11:52:07 +08:00
zhongzm
5ae056cb03 Merge remote-tracking branch 'origin/multi-tenant' into multi-tenant 2025-07-11 11:11:59 +08:00
zhongzm
e37a7fb42b feat:折线效果以及图表数据点数修改 2025-07-11 11:11:41 +08:00
TsMask
e3306bab3a feat(dashboard): add overview2 component with images and functionality
- Introduced new images for the dashboard overview (rect.png, title.png).
- Created index.vue for the overview2 component, implementing various features including:
  - User activity tracking and statistics.
  - Network element state retrieval and display.
  - Integration of multiple sub-components (Topology, NeResources, UserActivity, IMSActivity, AlarnTypeBar, UPFFlow).
  - Added dropdowns for selecting UDM and NE resources.
  - Implemented periodic data fetching for network statistics.
  - Enhanced user interface with responsive design and improved styling.
2025-07-10 14:25:33 +08:00
TsMask
2cdbcd6de8 fix: 调整安装UE_POOL改到基础项 2025-07-10 10:54:51 +08:00
TsMask
fae66a2b79 feat: 在组件挂载时获取网元列表并更新授权状态 2025-07-10 10:33:26 +08:00
zhongzm
f45ad79015 feat:默认选择全部网元 2025-07-09 10:26:00 +08:00
TsMask
f9dd0964d2 chore: 更新版本号 2.250705 2025-07-05 10:27:21 +08:00
zhongzm
30ca7ae14d Merge remote-tracking branch 'origin/multi-tenant' into multi-tenant 2025-07-04 17:31:05 +08:00
zhongzm
82cb796a50 feat:kpi看板数据显示修复 2025-07-04 17:30:54 +08:00
lai
a98aeda96f 告警仪表盘 2025-07-04 17:08:48 +08:00
lai
1a10a5a9d1 修改综合仪表盘样式 2025-07-04 17:07:53 +08:00
TsMask
edd3865094 feat: 添加日期快捷选择功能并更新多个组件以使用新选择器 2025-07-04 15:14:13 +08:00
zhongzm
8990fa8dee feat:kpi看板 2025-07-03 19:26:01 +08:00
TsMask
2b624b3c04 fix: SMF-DATA图表日期显示不完整 2025-07-02 17:44:36 +08:00
TsMask
93b600affb fix: 跟踪任务编号的传入获取信息 2025-07-02 15:25:34 +08:00
TsMask
bea6f032ac fix: 英文翻译Filter out Alerts 2025-07-02 14:58:15 +08:00
TsMask
20b8531dc8 fix: 跟踪加载网元列表 2025-07-02 10:02:37 +08:00
TsMask
05c1638984 fix: 参数配置可见visible属性判断 2025-06-30 16:17:13 +08:00
TsMask
218dfef16b chore: 更新版本号 2.250627 2025-06-27 19:20:56 +08:00
TsMask
bcdb64777a fix: MME配置tai-tac数值类型 2025-06-27 17:39:43 +08:00
TsMask
dd9df3a08c Merge branch 'multi-tenant' of http://192.168.2.166:3180/OMC/ems_frontend_vue3 into multi-tenant 2025-06-27 16:58:32 +08:00
TsMask
fa12a5d3a8 fix: AMF配置slice确保sd为6位字符串 2025-06-27 16:58:30 +08:00
zhongzm
0196b322f0 Merge remote-tracking branch 'origin/multi-tenant' into multi-tenant 2025-06-27 16:57:03 +08:00
zhongzm
87cfc2ed79 feat:黄金指标界面指标显示bug修复 2025-06-27 16:56:50 +08:00
TsMask
b9bcd4c265 fix: 网元PLMN新增修改使用最后记录信息 2025-06-27 15:46:12 +08:00
TsMask
a54de8a9bb feat: 关闭UDM鉴权导出功能 2025-06-27 11:53:29 +08:00
TsMask
c5d7026fc5 fix: 修改时间范围选择器以使用当天的开始时间 2025-06-26 20:41:42 +08:00
TsMask
93841a02ea fix: 修复导出功能中时间分组字段的日期格式化 2025-06-26 20:40:31 +08:00
TsMask
42bd112649 feat: 在工具目录下添加文件管理放备份输出的文件展示 2025-06-25 10:48:53 +08:00
TsMask
d0add206ba fix: 网元配置一键plmn修改amf-tai/slice失败 2025-06-24 17:00:42 +08:00
TsMask
b9659837c2 fix: UDM-IMS数据批量新增/批量删除命令调整 2025-06-24 16:58:35 +08:00
TsMask
04f81af6c3 style: 刷新网元授权状态更新时间局部变化 2025-06-24 16:57:47 +08:00
TsMask
8bd1ea4faa fix 网元手动发送ftp备份路径多一层ne_coifig目录 2025-06-23 11:56:56 +08:00
TsMask
fa00b6bfa8 chore: 更新版本号 2.250620 2025-06-20 19:14:51 +08:00
TsMask
6a8e08a81a style: kpi菜单时间去掉当前小时加入今天选择项 2025-06-19 20:55:02 +08:00
TsMask
25a33678f2 feat: 快速修改PLMN接入数据操作 2025-06-18 11:11:15 +08:00
TsMask
1e8081e83e feat: 快速修改PLMN 2025-06-18 10:33:51 +08:00
TsMask
88aea40885 feat: kpi菜单时间选择预设1h/1d/7d/15d 2025-06-17 20:02:42 +08:00
TsMask
a341800efc fix: 修正上传文件到网元时使用错误的文件路径参数 2025-06-17 11:25:44 +08:00
TsMask
d75a2a1651 feat: 开站参数添加ausf是否存在标志 2025-06-17 11:16:16 +08:00
TsMask
38c0e3d08d fix: 返回数据参数调整,显示文件大小 2025-06-16 18:40:34 +08:00
TsMask
951d48f470 chore: 更新版本号 2.250613 2025-06-13 20:13:16 +08:00
TsMask
5f81d73c95 fix: udm-voip批量用户名数值限制导致无法填写 2025-06-12 19:35:33 +08:00
TsMask
9ee5fef458 style: 抓包文件目录列表显示文件大小 2025-06-11 20:35:27 +08:00
TsMask
1723d314c5 fix: 更新文件路径从 /tmp/omc/tcpdump 到 /usr/local/omc/tcpdump 2025-06-11 19:20:47 +08:00
TsMask
f14316256c fix: 空格内容无法编辑,提示信息显示方向 2025-06-10 18:56:47 +08:00
TsMask
a945e4dc5f feat: 网元信令跟踪代码同步 2025-06-10 18:55:54 +08:00
TsMask
8575d5d711 chore: 更新版本号 2.250607 2025-06-07 09:58:54 +08:00
TsMask
a9cb35ba4f fix: 告警清除自定义产生的改换接口 2025-06-04 15:16:45 +08:00
TsMask
7e21e25cf3 fix: 修改认证信息标签宽度和国际化文本格式 2025-05-23 20:08:24 +08:00
TsMask
ce9b8815df chore: 更新版本号 2.250523 2025-05-23 17:17:00 +08:00
lai
f2018eca30 add allNe Tooltip 2025-05-23 17:08:04 +08:00
lai
af513ba157 拓扑图修改 2025-05-22 18:32:42 +08:00
zhongzm
1aa1b471a5 feat:关键指标、黄金指标仪表盘多网元实现 2025-05-22 15:00:27 +08:00
TsMask
f42b921a50 fix: 网元授权许可证状态统一刷新功能 2025-05-22 09:56:28 +08:00
TsMask
db26e9a054 fix: 看板禁止图形交互模式 2025-05-20 17:32:42 +08:00
TsMask
1dd2ae6a4c feat: 添加KPI标题映射 2025-05-20 17:32:23 +08:00
TsMask
2d672250fd fix: 更新英文和中文翻译中的“批量刷新”文本 2025-05-20 17:31:59 +08:00
TsMask
59f959fcc2 feat: Tools-Host Terminal支持搜索过滤 2025-05-16 15:23:22 +08:00
TsMask
d35179c8ae chore: 更新版本号 2.250516 2025-05-16 09:56:19 +08:00
TsMask
9e0f6d3946 fix: 英文修改基站名称为 RAN Node Name 2025-05-13 18:31:20 +08:00
TsMask
b627b6aa83 fix: 修正文件切片相关API的URL路径格式 2025-05-12 19:16:55 +08:00
TsMask
e98c6cda51 fix: 修正文件切片相关API的URL路径格式 2025-05-12 17:14:31 +08:00
TsMask
481b099655 fix: 更新文件列表中的路径和标签值 2025-05-12 16:47:51 +08:00
TsMask
d9534b635e fix: 仪表盘数据会话属累加 2025-05-12 15:21:04 +08:00
TsMask
d7173ff737 chore: 更新版本号 2.250509 2025-05-09 19:15:59 +08:00
TsMask
571bc840ad feat: 统一FTP配置,本地备份文件浏览 2025-05-09 19:13:02 +08:00
TsMask
8664e72189 feat: 支持下载UDM Auth, UDM sub, User PCC导入模板 2025-05-09 18:48:27 +08:00
TsMask
f1aec581c7 fix: SMFByImsi删除图缩放按钮 2025-05-09 14:53:13 +08:00
TsMask
2492c7562a fix: UDM-Auth/Sub批量数名称修改 2025-05-09 12:02:37 +08:00
TsMask
83690f95d7 fix: SMF-UEl列表数量错误 2025-05-09 12:02:06 +08:00
TsMask
02b071f4a0 fix: OAM读取结构错误 2025-05-09 12:01:39 +08:00
TsMask
beca94906c fix: 仪表盘用户数据刷新时显示0闪烁 2025-05-07 16:55:33 +08:00
TsMask
d6c10050b4 chore: 更新版本号 2.250428 2025-04-28 19:44:28 +08:00
TsMask
5fc9aa7c2f fix: 主页重定向仪表盘 2025-04-28 18:28:21 +08:00
TsMask
9214474325 fix: 修正时间格式常量,添加GMT和RFC格式 2025-04-28 14:51:40 +08:00
TsMask
55008a112c feat: 添加多语言翻译结果码和结果原因字段 2025-04-28 14:50:36 +08:00
TsMask
600ee94ed9 style: 调整时间字段宽度 2025-04-28 14:48:54 +08:00
TsMask
55f5734d7b fix: 看板用户活动乱序问题 2025-04-28 14:37:58 +08:00
TsMask
a4fa53556b fix: 看板流量图确保时间以HH:mm:ss格式显示 2025-04-28 14:20:35 +08:00
TsMask
ca8f16fb0c feat: 添加CDR SIP响应代码类别类型字典 2025-04-28 14:19:47 +08:00
TsMask
6d7cde6058 fix: 优化udm-voip/ims功能页面 2025-04-22 15:49:58 +08:00
TsMask
2b8e222f23 fix: 锁屏密码dom错误 2025-04-22 14:33:58 +08:00
TsMask
00e97feac7 chore: 依赖版本更新 2025-04-22 11:46:04 +08:00
TsMask
10dd1270fc style: 补充多语言翻译 2025-04-22 11:45:45 +08:00
TsMask
94181fa0da fix: 网元OAM下发开关控制重启 2025-04-22 11:45:31 +08:00
TsMask
9203113c09 fix: 锁屏密码base处理,无密码进入 2025-04-22 11:44:59 +08:00
TsMask
e326bd1ef8 fix: 时间改用R3399格式 2025-04-22 11:44:24 +08:00
TsMask
69bae32c80 feat: ws心跳消息 2025-04-22 11:43:44 +08:00
TsMask
00c20df133 feat: 网元信令跟踪功能 2025-04-22 11:43:17 +08:00
zhongzm
bcb94ae9e7 feat:UDMims列调整,voip初始值修改 2025-04-16 11:30:30 +08:00
zhongzm
64072af7ad feat:参数修改 2025-04-16 10:28:49 +08:00
zhongzm
b9f540f1ee feat:sub界面调整tenant name列位置 2025-04-15 21:02:11 +08:00
zhongzm
cb7e3038fa feat:voip界面显示修复以及用户名限制数字输入 2025-04-15 20:54:59 +08:00
zhongzm
460a4e1b3b feat:UDMIMS界面显示修复 2025-04-15 20:22:33 +08:00
zhongzm
14495fce2b feat:显示修复,option修复 2025-04-12 17:27:41 +08:00
zhongzm
e06b7d4fd3 feat:显示修复 2025-04-12 16:14:53 +08:00
zhongzm
72bd9004cc feat:imsUDM界面添加功能修复 2025-04-11 20:52:04 +08:00
zhongzm
84b0ab50f4 feat:VOIP auth界面 2025-04-11 20:07:06 +08:00
TsMask
aaaf5679ae fix: 看板用户数初始neId传入失败,禁止选择当前项 2025-04-11 17:58:55 +08:00
zhongzm
b1bfb7a915 feat:删除remark和smdata的校验 2025-04-11 16:42:41 +08:00
zhongzm
58919ad4d4 feat:IMSSUB界面修改显示,增加参数 2025-04-11 15:43:02 +08:00
zhongzm
49f0037145 feat:上传界面按钮列文字提示(补) 2025-04-11 11:54:30 +08:00
zhongzm
d0b5ee7e75 feat:上传界面按钮列文字提示 2025-04-11 11:53:24 +08:00
zhongzm
c37552661c feat:UE的imsSub界面 2025-04-11 11:19:11 +08:00
zhongzm
d6a7d8348e feat:UE的Export界面
(cherry picked from commit 48ddafaec9)
2025-04-09 10:28:07 +08:00
TsMask
586003c9b9 fix: 修正获取UDM子项数量 2025-03-25 18:53:31 +08:00
TsMask
163ce9b64c fix: 修正获取UDM子项数量的响应数据结构并移除无用的缓存ID 2025-03-25 18:43:04 +08:00
TsMask
1d5268d348 fix: 更新IMS的KPI ID列表以包含更多项 2025-03-25 16:35:14 +08:00
TsMask
ef098b5d02 fix: 看板用户数切换展示 2025-03-25 15:56:52 +08:00
TsMask
1eabb4445e fix: 看板用户数切换展示 2025-03-25 15:56:37 +08:00
TsMask
b10aed3d14 fix: KPI总览无数据时展示title 2025-03-25 15:56:05 +08:00
TsMask
6590a0c811 fix: 禁止admin修改菜单分配 2025-03-21 17:08:20 +08:00
TsMask
8eed156143 fix: 增加文件下载超时时间至600秒 2025-03-21 15:24:29 +08:00
TsMask
0ab9a98ba9 chore: 更新版本号 2.250321 2025-03-21 15:15:27 +08:00
TsMask
72dadaf3f2 feat: 看板UPF流量总计7or30天 2025-03-21 15:13:47 +08:00
TsMask
f0079d67fd style: 用户列表时间列宽200px 2025-03-21 15:09:10 +08:00
TsMask
bc4560b8d9 fix: 自定义指标只有UPF显示sum列其他网元隐藏 2025-03-21 15:08:38 +08:00
TsMask
466e56b90f fix: 禁止admin修改菜单分配 2025-03-21 15:06:53 +08:00
TsMask
aa0397ad1a fix: pcap分析Protocol列换行问题 2025-03-19 17:59:17 +08:00
TsMask
c91f3e7927 fix: 告警事件导出异常/告警ID列移除 2025-03-17 18:40:38 +08:00
TsMask
69cf72af22 fix: 告警时间转换导致查询修改错误 2025-03-17 18:10:35 +08:00
TsMask
f3491a1a31 Merge branch 'main' into multi-tenant 2025-03-14 11:05:35 +08:00
TsMask
71ef748af8 chore: 更新版本号 2.250314 2025-03-14 11:03:32 +08:00
TsMask
5caa285ede fix: 网元快速安装移除网元历史包选择 2025-03-12 11:25:15 +08:00
TsMask
e14c1ce771 fix: 系统设置移除自定义主页 2025-03-12 11:14:16 +08:00
TsMask
8d22ab850a style:: 网元概览详细内存CPU信息 2025-03-12 11:13:50 +08:00
TsMask
82af22b997 fix: 移除IMS CDR视图中的展开信息 2025-03-12 11:12:56 +08:00
TsMask
37a1f748e7 feat: SMF数据单位转换MB显示 2025-03-12 11:12:30 +08:00
TsMask
a24122ecd7 feat: PCAP文件目录下载目录为ZIP文件功能 2025-03-12 11:09:27 +08:00
TsMask
ccbea1fc51 style: 调整告警页面表格列对齐和宽度,去掉pvfig 2025-03-12 11:05:17 +08:00
TsMask
ac7079b91a Merge remote-tracking branch 'origin/main' into multi-tenant 2025-03-11 18:24:42 +08:00
TsMask
91c9829d77 style: 优化PacketTable组件的滚动条样式和布局 2025-03-11 16:03:36 +08:00
TsMask
5304b298f6 fix: 网元许可调整表格列宽和图标样式 2025-03-11 16:01:33 +08:00
TsMask
e09369aa5a style: 多语言翻译安装-Install 2025-03-11 15:59:05 +08:00
TsMask
3363e36669 fix: 总览数值累加/基站跳转页面修改 2025-03-11 15:50:09 +08:00
TsMask
ea2ce56e52 feat: 更新数据获取逻辑并添加数据使用情况展示 2025-03-11 15:49:45 +08:00
TsMask
dee60e0699 feat: 添加带时区的时间格式支持 2025-03-11 15:41:59 +08:00
TsMask
8af7031c92 Merge branch 'main' into multi-tenant 2025-03-08 14:24:08 +08:00
TsMask
e62fc0c039 fix: 系统菜单按钮权限状态可修改 2025-03-08 14:23:54 +08:00
TsMask
ad31a52663 Merge branch 'main' into multi-tenant 2025-03-08 11:09:27 +08:00
TsMask
de16b96971 chore: 更新版本号 2.250308 2025-03-08 11:02:23 +08:00
TsMask
ed9bff5d61 Merge branch 'main' into multi-tenant 2025-03-07 18:26:24 +08:00
TsMask
f0e34726ec feat: 添加软件包文件未发现提示信息 2025-03-05 11:11:58 +08:00
TsMask
3ca8154279 Merge remote-tracking branch 'origin/main' into multi-tenant 2025-03-04 17:00:15 +08:00
TsMask
2cbd2e0aa7 fix: 看板UPF切换问题 2025-03-04 16:59:16 +08:00
TsMask
73d7d64225 Merge branch 'main' into multi-tenant 2025-03-04 16:11:01 +08:00
TsMask
16913aa721 feat: 看板权限控制部分显示 2025-03-04 16:05:30 +08:00
TsMask
ba426d7737 chore: 更新版本号 2.250228 2025-02-28 19:54:51 +08:00
TsMask
3d4d785f33 Merge remote-tracking branch 'origin/main' into multi-tenant 2025-02-25 14:55:22 +08:00
TsMask
8df5e278c8 feat: 添加时间范围选择器,支持快速选择当前小时、今天和昨天 2025-02-25 14:53:18 +08:00
TsMask
ea8fb7cad2 chore: 更新版本号 2.250221 2025-02-21 21:07:35 +08:00
TsMask
b7b8b11860 fix: 兼容3G的SGWC字段 2025-02-21 15:46:55 +08:00
TsMask
1d02b17c20 Merge remote-tracking branch 'origin/main' into multi-tenant 2025-02-21 10:41:56 +08:00
TsMask
bae61108be chore: 编译类型错误 2025-02-20 19:24:06 +08:00
TsMask
f60e530636 sytle: 多语言EN更新 2025-02-20 10:21:28 +08:00
TsMask
b3e9761305 fix: SGWC-CDR字段变更SGSN/GGSN 2025-02-20 10:20:44 +08:00
TsMask
5f75197a42 Merge remote-tracking branch 'origin/main' into multi-tenant 2025-02-14 20:16:54 +08:00
TsMask
fbd2867ad2 chore: 更新版本号 2.250214 2025-02-14 19:42:30 +08:00
TsMask
2ca23ad99a fix: 网元SMF配置选择UPF下拉框数据获取失败 2025-02-14 19:33:09 +08:00
lai
4b032d74be 优化KPI展示 2025-02-13 19:32:04 +08:00
TsMask
8bfa73a67a fix: 导出备份配置调整 2025-02-11 18:33:47 +08:00
TsMask
f188e193f3 style: 调整UDM用户数据新增表单排版 2025-02-11 17:52:02 +08:00
TsMask
b362855a60 fix: 信令pcap解析列表颜色转换问题 2025-02-11 11:28:33 +08:00
TsMask
4c28d6b98c style: 调整UDM鉴权新增表单排版 2025-02-10 10:02:13 +08:00
TsMask
2276f2281a chore: 更新版本号 2.250208 2025-02-08 19:40:36 +08:00
TsMask
7ccb580e91 feat: 基站状态导入功能 2025-02-08 19:39:47 +08:00
TsMask
0346dfd584 chore: 更新依赖版 2025-02-08 18:08:05 +08:00
TsMask
5a64afe209 feat: 基站状态记录上报和导出功能 2025-02-08 18:07:46 +08:00
TsMask
fd82d710b6 feat: UDM用户数据导入输出失败记录,UDM2.2502.58 2025-02-07 16:00:52 +08:00
TsMask
2056d7c51b fix: 看板加载拓扑图数据 2025-02-07 10:36:56 +08:00
TsMask
91866293bc fix: 租户页面CDR多语言显示 2025-02-07 10:36:16 +08:00
TsMask
2714537140 Merge remote-tracking branch 'origin/main' into multi-tenant 2025-01-24 20:51:23 +08:00
TsMask
fbc1535015 chore: 更新版本号 2.250124 2025-01-24 20:29:06 +08:00
TsMask
36de89570f fix: 网元状态切换保留List页面状态 2025-01-24 20:28:26 +08:00
TsMask
22e595131c feat: 基站状态添加MME4G状态 2025-01-24 09:38:55 +08:00
TsMask
c037660b01 Merge remote-tracking branch 'origin/main' into multi-tenant 2025-01-22 19:34:28 +08:00
TsMask
208d14d65a fix: SMF-CDR时间可选查询范围,无数据loading关闭 2025-01-20 20:23:40 +08:00
TsMask
80b9cd83fb style: 修改kpi表头提示,关闭排序 2025-01-20 20:22:02 +08:00
TsMask
721ec4a5da feat: 日志备份FTP服务配置项 2025-01-20 17:24:05 +08:00
TsMask
fb9db32da7 fix: 路由免用户登录认证判断 2025-01-17 18:42:06 +08:00
TsMask
874720b68d Merge remote-tracking branch 'origin/main' into multi-tenant 2025-01-17 18:40:15 +08:00
TsMask
34f558199a chore: 更新版本号 2.250117 2025-01-17 18:24:09 +08:00
TsMask
597883fa08 Merge remote-tracking branch 'origin/main' into multi-tenant 2025-01-17 16:47:34 +08:00
TsMask
07eab9378a fix: 接口加密参数控制开关 2025-01-17 15:54:01 +08:00
TsMask
806cbbd9ed style: KPI数据表格头提示信息 2025-01-17 15:30:22 +08:00
TsMask
8adf2a3dd0 fix: 基站状态条件查询时只显示当前状态数量 2025-01-17 15:29:44 +08:00
TsMask
2164ffc9b2 fix: SMF-CDR查询IMSI数据结果图优化,支持DNN条件 2025-01-17 15:28:33 +08:00
TsMask
73a1a4c51b Merge remote-tracking branch 'origin/main' into multi-tenant 2025-01-16 20:59:41 +08:00
TsMask
7091f1ffa6 fix: KPI指标表格头提示信息 2025-01-16 20:56:09 +08:00
TsMask
fa44f6abe0 fix: 基站状态列宽拖动,状态结果统计 2025-01-16 20:50:50 +08:00
TsMask
8586d7f1ce fix: 基站状态页面编辑判断错误 2025-01-16 14:27:51 +08:00
TsMask
b2d818fc30 style: 依赖库无类型声明定义 2025-01-15 21:08:22 +08:00
TsMask
a20d5ee99f fix: 网元信息修改局部更新状态判断 2025-01-15 21:07:44 +08:00
TsMask
74b55423d5 style: 移除l部分无用的log输出 2025-01-15 21:07:17 +08:00
TsMask
7962c7e7a8 Merge remote-tracking branch 'origin/main' into multi-tenant 2025-01-15 18:45:52 +08:00
TsMask
96acbc0919 fix: 网元状态概览页面定时刷新异常错误 2025-01-15 18:42:42 +08:00
TsMask
6f5759b5ba Merge remote-tracking branch 'origin/main' into multi-tenant 2025-01-15 17:58:06 +08:00
TsMask
322b5f18ed fix: 基站状态显示设备名和在线用户数 2025-01-15 17:55:19 +08:00
TsMask
a7df09d56f Merge remote-tracking branch 'origin/main' into multi-tenant 2025-01-15 17:22:15 +08:00
TsMask
e36dac9b81 fix: KPI指标表格头提示信息 2025-01-15 17:13:38 +08:00
TsMask
8214175890 fix: 基站状态页面翻译和部分优化 2025-01-15 17:12:51 +08:00
TsMask
bc8207d29d Merge branch 'main' into multi-tenant 2025-01-10 19:39:58 +08:00
TsMask
9e55768312 chore: 更新版本号 2.250110 2025-01-10 19:38:58 +08:00
TsMask
6bfd0f4792 style: 网元配置多语言映射缺失 2025-01-10 19:37:29 +08:00
TsMask
98ed8adfe3 feat: 网元状态3待机显示 2025-01-10 19:33:06 +08:00
TsMask
f5938110f4 fix: 去除系统用户密码重置账号校验 2025-01-10 18:45:16 +08:00
TsMask
93e00ed436 Merge remote-tracking branch 'origin/main' into multi-tenant 2025-01-03 21:53:07 +08:00
TsMask
acd8a33b4a chore: 更新版本号 2.250103 2025-01-03 21:52:54 +08:00
TsMask
33bdbd6d08 Merge remote-tracking branch 'origin/main' into multi-tenant 2025-01-03 21:34:31 +08:00
TsMask
7ab2b3b546 chore: 更新版本号 2.240103 2025-01-03 21:13:17 +08:00
TsMask
b490e4f5b9 chore: 更新依赖版 2025-01-03 21:09:51 +08:00
TsMask
fe82336937 feat: 基站状态页面及拓扑展示页面功能实现 2025-01-03 21:09:16 +08:00
TsMask
35a7ed5b35 chore: 更新版本号 2.241228 2024-12-28 10:55:43 +08:00
TsMask
56def56b58 Merge remote-tracking branch 'origin/lichang' 2024-12-28 10:55:04 +08:00
TsMask
6074078f5d fix: 网元数据接口查询超时时间改为60s 2024-12-28 10:11:24 +08:00
TsMask
428adb5186 fix: 自定义指标查询超时60s 2024-12-27 19:09:28 +08:00
TsMask
1cbce9ad03 feat: UE数据列表统一格式 2024-12-27 19:08:58 +08:00
TsMask
2138896d43 fix: 网元类型选择框警告状态修复 2024-12-27 19:07:02 +08:00
TsMask
c40ee9c8cc fix: 看板重复获取UE修复和AMF-UE数据结构变更调整 2024-12-27 19:06:12 +08:00
TsMask
d33183ca5e style: SMF-CDR流量报表页面 2024-12-26 20:11:34 +08:00
TsMask
9ff9529402 Merge remote-tracking branch 'origin/lichang' 2024-12-26 18:56:13 +08:00
TsMask
51a8d6d3a0 feat: SMF-CDR用户流量使用情况图表展示 2024-12-26 18:40:36 +08:00
TsMask
c22663505c fix: SMF-CDR去除RatingGroup区分 2024-12-26 18:39:09 +08:00
TsMask
efa30f4ee3 Merge remote-tracking branch 'origin/main' into multi-tenant 2024-12-25 17:57:34 +08:00
TsMask
9b589a0e69 Merge remote-tracking branch 'origin/lichang' 2024-12-25 17:50:10 +08:00
TsMask
401a7d65a0 feat: 同步标准版的看板页面 2024-12-25 14:21:49 +08:00
TsMask
91242e74b0 reven: 还愿网元配置 2024-12-25 10:30:49 +08:00
TsMask
b0b9c69ad2 style: 网元信息服务区域默认Area 2024-12-24 20:37:09 +08:00
TsMask
f8f2ba1f92 style: 网元信息服务区域默认Area 2024-12-24 20:35:49 +08:00
TsMask
e3792eff57 fix: 网元配置类型切换清空下拉树 2024-12-24 19:49:51 +08:00
TsMask
5a3fa2a6ba fix: 网元配置类型切换清空下拉树 2024-12-24 19:49:39 +08:00
TsMask
081c79b85b Merge remote-tracking branch 'origin/main' into multi-tenant 2024-12-24 19:45:43 +08:00
lai
5c0909e356 修改切换条件 2024-12-24 18:38:47 +08:00
TsMask
c1fdb68d96 Merge remote-tracking branch 'origin/main' into multi-tenant 2024-12-24 17:35:40 +08:00
TsMask
b7da976819 fix: 看板UDM签约数据获取x2问题 2024-12-23 20:05:13 +08:00
TsMask
41e37766b7 feat: SMSC短信内容显示,权限控制显示操作删除cdr:ne:remove 2024-12-23 19:39:06 +08:00
TsMask
44612081bc chore: 更新版本号 2.241220 2024-12-20 18:36:52 +08:00
TsMask
4929ed30bc Merge remote-tracking branch 'origin/lichang' 2024-12-20 18:31:28 +08:00
TsMask
8f1de1c396 chore: 更新版本号 2.241130 2024-12-20 18:28:06 +08:00
lai
9b84ff9452 样式修改 2024-12-20 17:18:16 +08:00
lai
e4222e7b03 去除修改删除按钮 2024-12-20 17:17:15 +08:00
TsMask
eea4e0069d feat: CDR页面切换网元重置查询 2024-12-20 16:36:33 +08:00
lai
2b69b8d72b 增加仪表盘累加及UPF下拉框 2024-12-20 15:47:17 +08:00
TsMask
1f130098ee style: 加载缺省空字符 2024-12-20 15:45:07 +08:00
TsMask
5a4ab62e97 fix: CDR数据检查格式,SGWC调试 2024-12-20 15:43:44 +08:00
TsMask
c86c498ab9 fix: 编译cjs和css方式导致切换主题色异常 2024-12-19 21:06:51 +08:00
TsMask
139a14fd3d feat: 网元总览点击状态显示页面调整 2024-12-19 20:24:46 +08:00
TsMask
6e7402fd63 feat: 网元配置多网元同时配置HA功能优化选择 2024-12-19 20:24:29 +08:00
TsMask
2e91ab319f style: 看板UDM-签约数量参数调整 2024-12-19 11:33:37 +08:00
TsMask
d537f56b9d feat: 网元配置多网元同时配置HA功能 2024-12-19 11:31:55 +08:00
TsMask
7c4710e2e7 style: CDR/UE展开详情布局调整 2024-12-19 11:30:43 +08:00
TsMask
ea368f9162 style: smsc时间显示列宽度200px 2024-12-19 11:23:23 +08:00
TsMask
7cab3f6556 chore: 编译依赖拆包manualChunks行为 2024-12-19 11:21:46 +08:00
TsMask
a53eaaf533 fix: 角色分配菜单勾选父子级联转出子节点关联根节点数组 2024-12-19 11:21:33 +08:00
TsMask
302ea84cde style: 看板UDM-签约数量参数调整 2024-12-19 11:17:06 +08:00
TsMask
7d470fd681 style: 网元列表加载同时清除缓存 2024-12-19 11:14:55 +08:00
TsMask
b64c4c66ab style: 网元类型列表静态可选排序 2024-12-19 11:11:54 +08:00
TsMask
15ac549532 feat: 新增SGWC-CDR页面 2024-12-19 11:11:16 +08:00
TsMask
9bff669769 fix: 多语言删除无用定义 2024-12-18 15:37:21 +08:00
TsMask
8a53ac8b9f feat: 网元配置多网元同时配置HA功能 2024-12-18 15:33:52 +08:00
TsMask
d3a18f95db style: CDR/UE展开详情布局调整 2024-12-18 15:32:36 +08:00
TsMask
11649c3fb1 fix: SMF-在线订阅用户列表信息 2024-12-18 15:31:27 +08:00
TsMask
09fd8bc4dc style: smsc时间显示列宽度200px 2024-12-16 11:25:30 +08:00
TsMask
5a704146a5 fix: 角色分配菜单勾选父子级联转出子节点关联根节点数组 2024-12-16 11:07:50 +08:00
TsMask
e25cd91df1 Merge remote-tracking branch 'origin/main' into lichang 2024-12-16 10:45:41 +08:00
TsMask
71f2e596fe chore: 编译依赖拆包manualChunks行为 2024-12-16 10:25:19 +08:00
TsMask
7e60f0dd05 chore: 编译依赖拆包manualChunks行为 2024-12-16 10:23:22 +08:00
TsMask
a0cc882a4b chore: 更新版本号 2.241213 2024-12-13 21:32:31 +08:00
TsMask
a94f9414a4 chore: 更新版本号 2.241213 2024-12-13 21:19:28 +08:00
TsMask
7f69bc69bc chore: 编译依赖拆包manualChunks行为 2024-12-13 18:25:52 +08:00
lai
4b1058cff3 完善表单赋值机制 2024-12-13 16:04:21 +08:00
lai
a6bab3fa0b 修复拆解smData异常问题 2024-12-13 15:28:15 +08:00
TsMask
d6c0f89de5 style: 在线基站列表网元类型切换时刷新 2024-12-11 15:48:13 +08:00
TsMask
f3ae3da2a5 style: UDM签约cag参数默认为空字符 2024-12-11 15:47:09 +08:00
TsMask
c44fae8d13 style: UDM签约cag参数默认为空字符 2024-12-11 15:46:03 +08:00
TsMask
bcb214448c style: 在线基站列表网元类型切换时刷新 2024-12-11 15:45:07 +08:00
TsMask
d5c91e733b fix: telnet终端输入回车值无法正确发出 2024-12-10 10:28:56 +08:00
TsMask
ea6dfa7558 fix: redis终端改为命令输入框,禁止窗口输入 2024-12-10 10:28:41 +08:00
TsMask
6129002b38 fix: SMF-Data隐藏RatingGroup显示 2024-12-10 10:26:40 +08:00
TsMask
65db17a319 fix: SMF-Data隐藏RatingGroup显示 2024-12-10 10:26:19 +08:00
TsMask
6969669027 fix: 拓扑网元状态15s一个周期 2024-12-10 10:25:39 +08:00
TsMask
38a698f07b fix: redis终端改为命令输入框,禁止窗口输入 2024-12-10 10:25:00 +08:00
TsMask
9f121505d1 fix: telnet终端输入回车值无法正确发出 2024-12-10 10:24:14 +08:00
TsMask
e11cb11ec9 fix: 修复 租户页面合并问题 2024-12-09 17:03:29 +08:00
TsMask
6add41254d chore: 更新版本号 2.241209 2024-12-09 10:52:54 +08:00
TsMask
85bc4aea53 fix: 页面解析错误 2024-12-09 10:51:54 +08:00
simonzhangsz
a95a96dfc0 update package 2024-12-07 11:55:35 +08:00
simonzhangsz
9167da1bc5 tsc check 2024-12-06 19:13:49 +08:00
lai
5be94b499d Merge remote-tracking branch 'origin/main' into multi-tenant 2024-12-06 18:37:56 +08:00
lai
69dfc2a1f5 event Type异常 2024-12-06 18:10:06 +08:00
TsMask
b1a699252b fix: 免登录认证参数默认值 2024-12-06 17:36:36 +08:00
TsMask
f66454256b fix: CDR时间转换问题 2024-12-05 14:50:46 +08:00
TsMask
a0886abd38 chore: 更新版本号 2.241130 2024-11-30 17:10:59 +08:00
lai
9383c17484 优化指标界面 2024-11-29 17:17:54 +08:00
zhongzm
512bd6d8eb fix:tooltip计算修复 2024-11-29 14:50:38 +08:00
zhongzm
b8b66fe610 fix:table排序 2024-11-28 20:09:19 +08:00
zhongzm
154569304c feat:添加多选 2024-11-28 18:57:35 +08:00
zhongzm
cc3432ca06 Merge remote-tracking branch 'origin/main' 2024-11-28 18:45:20 +08:00
zhongzm
68b9c5fa5e feat:添加累加值计算 2024-11-28 18:45:11 +08:00
TsMask
6620ac7279 fix: Para5G参数UPF新增网卡名 2024-11-28 15:49:23 +08:00
TsMask
a9a094d04a revet: 去除系统免登录加密参数data 2024-11-25 20:02:16 +08:00
TsMask
5d4a04ecf2 feat: 去除系统免登录加密参数data 2024-11-25 18:55:16 +08:00
TsMask
1b28260680 feat: 系统免登录参数路由跳转 2024-11-25 11:59:46 +08:00
zhongzm
83cb3f8728 test 2024-11-25 10:48:53 +08:00
zhongzm
7d69d3c21d fix:样式修复、明暗主题适应 2024-11-23 17:01:41 +08:00
TsMask
ebde50f58b chore: 更新版本号 2.241123 2024-11-23 16:40:10 +08:00
lai
b8924d161f 修正自定义指标 2024-11-22 18:05:17 +08:00
lai
ccb52ea94f 过滤无自定义指标的网元 2024-11-22 17:27:27 +08:00
lai
72abbe1c53 Merge branch 'main' of http://192.168.2.166:3180/OMC/ems_frontend_vue3 2024-11-22 17:07:55 +08:00
zhongzm
f318f61b4a fix:明暗主题随机颜色方法修复 2024-11-22 16:15:25 +08:00
zhongzm
45d8314e29 fix:暗色模式样式适应 2024-11-22 15:43:00 +08:00
zhongzm
886a1c8667 fix:修改取色范围适应暗色模式 2024-11-22 15:42:38 +08:00
lai
378729720d Merge branch 'main' of http://192.168.2.166:3180/OMC/ems_frontend_vue3 2024-11-22 10:41:11 +08:00
zhongzm
c2a3d4b8a8 fix:修改时间粒度,修改默认时间 2024-11-22 10:14:45 +08:00
zhongzm
8444de8e98 Merge remote-tracking branch 'origin/main' 2024-11-22 09:57:04 +08:00
zhongzm
874e01996a fix:样式调整,增加栅格线,曲线平滑,平均值计算 2024-11-22 09:56:51 +08:00
TsMask
fb855fd74e fix: 获取网元状态定时轮询修复 2024-11-21 18:19:07 +08:00
TsMask
78f963fbea fix: CDR-IMS去掉MOSM MTSM 2024-11-21 12:06:32 +08:00
TsMask
cf0116b5c6 fix: CDR时间的处理 2024-11-21 10:06:07 +08:00
lai
80b07c462f 避免x轴时间数组重复 2024-11-20 18:32:14 +08:00
zhongzm
5a8ab1343f fix:日期选择器属性弃用修复 2024-11-20 17:00:22 +08:00
zhongzm
67349e24d8 fix:日期选择器属性弃用修复 2024-11-20 16:59:36 +08:00
lai
f59697a2f2 Merge branch 'main' of http://192.168.2.166:3180/OMC/ems_frontend_vue3 2024-11-20 16:31:40 +08:00
lai
8c197bee04 回复 2024-11-20 16:31:28 +08:00
TsMask
f866fbf153 style: 网元总览显示用户容量 2024-11-20 12:01:12 +08:00
TsMask
d7b4fd3f71 fix: SMSC-CDR时间字段判断是否时间戳 2024-11-20 11:12:55 +08:00
TsMask
1c07167f1a fix: 看板活动事件默认加载20,改amf事件Group 2024-11-19 20:46:32 +08:00
lai
d5c42f761e 修改接口 2024-11-19 18:57:30 +08:00
zhongzm
29449cc597 Merge remote-tracking branch 'origin/main' 2024-11-19 17:21:03 +08:00
zhongzm
7615bccf04 fix:日期选择器添加快捷选项,tooltip显示修复 2024-11-19 17:20:49 +08:00
TsMask
831e7ee987 fix: 工具ipfer操作客户端host输入判断 2024-11-19 17:02:09 +08:00
TsMask
f5f27d78f1 Merge remote-tracking branch 'origin/lichang' 2024-11-19 16:58:41 +08:00
TsMask
ebc46ff7d4 fix: 工具ipfer操作客户端host输入判断 2024-11-19 16:58:07 +08:00
lai
2513baf48e 修改中英文提示 2024-11-19 14:38:06 +08:00
lai
ac2483d690 Merge branch 'main' of http://192.168.2.166:3180/OMC/ems_frontend_vue3 2024-11-19 14:24:16 +08:00
lai
a85f87f3fc 居中显示tooltip 2024-11-19 14:23:16 +08:00
lai
68e002776c 完善数据处理 2024-11-19 14:09:37 +08:00
TsMask
9322f52c9a Merge remote-tracking branch 'origin/lichang' 2024-11-19 11:52:50 +08:00
TsMask
f15e52573b fix: UDM鉴权键入Tenant Name主动重新获取列表 2024-11-19 11:36:03 +08:00
lai
2c9807f9b8 默认全选 2024-11-19 11:36:03 +08:00
TsMask
fcf32800fe fix: 非管理员角色不能设置布局样式 2024-11-19 11:30:48 +08:00
lai
f8f4dc0f2e Merge branch 'main' of http://192.168.2.166:3180/OMC/ems_frontend_vue3 2024-11-19 11:30:13 +08:00
lai
49bd59c639 回填 2024-11-19 11:28:49 +08:00
TsMask
a96c587559 fix: 修复网元概览数据饼图状态异常 2024-11-19 10:25:16 +08:00
TsMask
6bd7a28458 fix: 看板初始用户活动各20条进行排序显示 2024-11-19 10:24:32 +08:00
TsMask
053517324d fix: 修复网元概览数据饼图状态异常 2024-11-19 10:23:43 +08:00
zhongzm
256802e698 fix:修复加载显示 2024-11-18 18:15:23 +08:00
zhongzm
851e8a461e fix:修复缩放异常 2024-11-18 10:39:55 +08:00
zhongzm
d8d49f23c4 fix:样式报错修复 2024-11-18 10:02:20 +08:00
TsMask
1511792e3b fix: 快速开站网元排序进行逐个安装 2024-11-15 19:53:45 +08:00
TsMask
0544495d70 fix: 快速开站网元排序进行逐个安装 2024-11-15 19:44:03 +08:00
lai
045a25f3ae 删除漫游引导 2024-11-15 19:23:29 +08:00
TsMask
b6d1ba6766 chore: 更新版本号 2.241115 2024-11-15 18:18:42 +08:00
zhongzm
e8e0e07189 Merge remote-tracking branch 'origin/main' 2024-11-15 16:58:38 +08:00
zhongzm
1672c6c6ba feat:自定义指标漫游引导 2024-11-15 16:58:25 +08:00
TsMask
ac251c2c00 Merge remote-tracking branch 'origin/lichang' 2024-11-15 16:51:22 +08:00
TsMask
5d7334a4de fix: 非管理员角色不能设置布局样式 2024-11-15 16:47:12 +08:00
lai
9b9c0b39fd 优化界面显示 2024-11-15 15:48:54 +08:00
TsMask
802a91a96d fix: 修复TelInput组件号码无法解析问题 2024-11-15 15:20:09 +08:00
zhongzm
31bca2b98f fix:修复图表tooltip显示被遮盖的问题 2024-11-15 14:32:53 +08:00
zhongzm
bf94591035 fix:图表生成时序调整 2024-11-15 14:31:58 +08:00
TsMask
d523b60311 fix: 登录页去除头尾栏,暗色背景修改 2024-11-15 10:30:00 +08:00
zhongzm
e0990a40df fix:实时数据文本显示 2024-11-14 20:39:23 +08:00
TsMask
20c1c455c4 fix: 修复TelInput组件号码无法解析问题 2024-11-14 20:08:40 +08:00
TsMask
dab76add73 style: 网元license操作图标调整 2024-11-14 14:18:52 +08:00
TsMask
101cb70893 style: 页面样式调整 2024-11-14 11:33:49 +08:00
TsMask
348b11e201 fix: 网元切换时命令操作信息过滤 2024-11-14 11:33:17 +08:00
zhongzm
a9fdda3f5e fix:清楚旧功能的多余代码 2024-11-13 17:12:12 +08:00
zhongzm
89d22e55c7 feat:关键指标图表界面重构(grafana标准) 2024-11-13 16:56:15 +08:00
zhongzm
40f2a78717 feat:添加表格排序功能 2024-11-13 10:26:59 +08:00
zhongzm
80ee1c05ff feat:关键指标概览界面重构(grafana标准) 2024-11-12 19:01:28 +08:00
TsMask
021f9f28f6 fix; SMSC-CDR时间格式调整 2024-11-12 10:12:32 +08:00
zhongzm
d7990a6ee5 feat:添加漫游式引导 2024-11-08 18:25:11 +08:00
TsMask
3561a5dc39 Merge remote-tracking branch 'origin/main' into lichang 2024-11-08 17:40:18 +08:00
TsMask
247a009eef chore: 更新版本号 2.241108 2024-11-08 17:39:06 +08:00
TsMask
fcd4db8217 feat: 快速安装UPF配置网卡名和驱动类型 2024-11-08 16:17:44 +08:00
TsMask
3e03d47520 style: 缓存管理边距样式 2024-11-08 16:05:21 +08:00
TsMask
414afea783 style: 调整MML执行日志表格样式 2024-11-08 16:04:51 +08:00
TsMask
df7c455881 fix: 多语言切换隐藏,导致无法切换主题色 2024-11-08 16:03:33 +08:00
lai
1644765ce2 补充 2024-11-08 15:24:07 +08:00
lai
db16cdb79b 回填信息 2024-11-08 14:55:19 +08:00
lai
800547d1ef 自定义指标优化 2024-11-08 12:00:20 +08:00
TsMask
5614be7877 fix: UDM用户数据加载速度优化并提示时间 2024-11-08 10:47:39 +08:00
TsMask
0644e49161 feat: 工具>主机终端操作服务器命令支持redis 2024-11-07 19:29:59 +08:00
lai
44cd1d354a 同步主线antd3 2024-11-07 15:17:56 +08:00
lai
15b81eef97 首页菜单选择框为树状选择框 2024-11-07 14:10:00 +08:00
lai
5ddf83d1fd 改为时间戳且加上快捷时间选择 2024-11-07 14:09:26 +08:00
zhongzm
6326f46bf2 style:样式修改,暗黑色适应 2024-11-06 19:44:52 +08:00
zhongzm
f75719ca37 fix:修改日期选择器默认时间 2024-11-06 15:25:23 +08:00
TsMask
21cf86baff style: 去除console 2024-11-05 17:42:17 +08:00
TsMask
6583bc9972 style: 日志导出文件管理选择控件样式调整 2024-11-05 17:41:51 +08:00
TsMask
886ea37702 fix: iperf支持v2和v3的命令操作 2024-11-05 17:33:57 +08:00
TsMask
23116db988 fix: 终端命令显示查看组件输出命令到首行 2024-11-05 17:33:23 +08:00
zhongzm
8283523327 fix:修复实时数据显示问题 2024-11-05 17:24:42 +08:00
zhongzm
33159befc3 fix:增加并发请求,优化性能和逻辑 2024-11-05 17:11:38 +08:00
zhongzm
c567b19fb2 fix:修复template中不影响运行的报错 2024-11-04 16:48:16 +08:00
zhongzm
d8487d7cd7 fix:修复其他指标列表无法打开,文本错乱的问题 2024-11-04 16:04:11 +08:00
TsMask
347c9f1d3b Merge remote-tracking branch 'origin/lichang' 2024-11-04 11:19:59 +08:00
TsMask
a731a6408b fix: 调整默认布局mix,修复底部宽度100% 2024-11-04 11:19:25 +08:00
TsMask
c0ac1f6ed5 Merge remote-tracking branch 'origin/lichang' 2024-11-02 17:27:21 +08:00
TsMask
544c3697bd chore: 更新版本号 2.241102 2024-11-02 15:48:04 +08:00
TsMask
ae94e3bf2a fix: 编译错误 2024-11-01 11:42:07 +08:00
TsMask
2276445ff6 feat:网元指标添加其他指标选项 优化样式 2024-10-31 19:23:46 +08:00
lai
612592ec2a Merge branch 'main' into multi-tenant 2024-10-31 17:34:38 +08:00
TsMask
e04fd4077e feat:自定义网元指标概览 2024-10-31 10:36:26 +08:00
TsMask
99565dd652 fix: CDR-IMS显示呼叫-挂断时间 2024-10-31 10:02:38 +08:00
lai
2b9fa490d4 租户首页添加区分多个UPF情况 2024-10-29 18:52:51 +08:00
TsMask
7e03437ab6 fix: UDM鉴权签约用户勾选导出 2024-10-29 11:03:36 +08:00
TsMask
5f9d19ac65 fix: 静态资源文件路径解析 2024-10-28 17:21:52 +08:00
TsMask
f23d4117d7 fix: UDM签约数据参数类型转换字符串参数 2024-10-28 16:53:43 +08:00
TsMask
e4a56d68e0 fix: 网元总览接口变更 2024-10-28 16:53:34 +08:00
TsMask
e3f7b08c69 feat: 登录页面切换主题和语言类型 2024-10-28 14:52:22 +08:00
TsMask
6e3ef7e56a fix: 静态资源文件路径解析 2024-10-28 14:31:04 +08:00
TsMask
0a96fee6c3 chore: 更新版本号 2.241028 2024-10-28 11:04:04 +08:00
TsMask
dc7d24e2bf docs: 更新说明 2024-10-28 11:03:29 +08:00
TsMask
089ae12dd1 feat: 页面调整组件属性升级 2024-10-28 11:02:51 +08:00
TsMask
da0d49d306 feat: 页面调整组件属性升级 2024-10-28 11:02:39 +08:00
TsMask
670225a655 style: 关键指标概览页面占位 2024-10-28 11:01:02 +08:00
TsMask
fa35bfc340 fix: Event Type的label修改导致引用对象数据变更 2024-10-28 10:58:03 +08:00
TsMask
f4a5d28a29 feat: 展开详情显示Network Function IPv4 2024-10-28 10:55:36 +08:00
TsMask
c735aeba6d fix: 导出带取消操作按钮 2024-10-28 10:53:48 +08:00
TsMask
3c058ec107 feat: PCF补充增加online和offline字段,导出有取消操作 2024-10-28 10:53:03 +08:00
TsMask
327e82e057 fix: 布局组件升级调整 2024-10-28 10:51:11 +08:00
TsMask
012fc44f08 chore: 更新升级依赖库 2024-10-28 10:48:17 +08:00
lai
0ab04ab819 增加Network Function IPv4属性 2024-10-24 11:12:04 +08:00
lai
580b931610 增加关闭按钮 2024-10-24 11:11:20 +08:00
lai
dd7df775e2 修复mmeEVent修改label异常 2024-10-24 11:10:31 +08:00
lai
18c2a2e4dc 首页变动 2024-10-24 11:09:33 +08:00
lai
fbdd04b4dd 增加分页 2024-10-24 11:00:49 +08:00
lai
b508d4393c 首页添加 加载状态 2024-10-17 19:44:43 +08:00
lai
d257151718 首页加载顺序问题 2024-10-17 17:30:11 +08:00
lai
7b60c30548 完善搜索时带上匹配模式后的imsi 2024-10-17 14:47:40 +08:00
lai
cf5c8906c3 根据条件导出 2024-10-17 12:02:25 +08:00
lai
249c9a5a6e 调整位置 2024-10-17 11:03:57 +08:00
lai
a78b830a05 增加租户列 2024-10-17 10:27:20 +08:00
lai
879cf783b6 告警导出异常 2024-10-16 20:30:58 +08:00
lai
895a55f367 补充 2024-10-16 19:53:01 +08:00
lai
536c77ff08 与其他设置风格一致 2024-10-16 19:28:42 +08:00
lai
37e70e7af8 更改路径方式 2024-10-16 17:06:41 +08:00
lai
87e044276c 更改首页代码文件路径 2024-10-16 15:09:53 +08:00
lai
cd3e87c1c9 多租户自定义主页 2024-10-16 14:50:15 +08:00
lai
009c4cf590 修复租户基站信息网元异常情况获取 2024-10-16 11:07:56 +08:00
lai
3c45427bff 增加短信图标 2024-10-16 10:51:14 +08:00
lai
56cbe9915c 英文拼写 2024-10-16 10:45:00 +08:00
lai
cf3103db46 多租户首页添加smsc-cdr 2024-10-16 10:33:40 +08:00
lai
879499b595 新增租户SMSC-CDR 2024-10-15 14:17:58 +08:00
e199498a8e Merge branch 'main' into multi-tenant 2024-10-12 10:34:26 +08:00
lai
82ecee9941 管理员-smsc cdr 租户列 2024-10-10 19:40:48 +08:00
4ee1d87d04 fix: tenant of upf time period change to timestamp 2024-09-30 19:29:08 +08:00
lai
39268e2162 针对获取基站信息时网元异常问题 2024-09-30 11:13:34 +08:00
lai
d6b755c234 调整触发位置 2024-09-27 19:23:04 +08:00
lai
a889f97bd6 避免缓存导致 2024-09-27 19:18:28 +08:00
lai
a77b968a17 限制新增时没有租户数据时取消租户角色 2024-09-27 17:56:41 +08:00
lai
da3d712e97 实时更新租户树 2024-09-27 14:22:21 +08:00
lai
bb662aefe3 Merge branch 'multi-tenant' of http://192.168.2.166:3180/OMC/ems_frontend_vue3 into multi-tenant 2024-09-27 11:54:14 +08:00
lai
7bbffccd21 解决tenant栏弹出问题 2024-09-27 11:54:09 +08:00
TsMask
0de115ad9e fix: 多租户SMF在线用户接口 2024-09-25 16:31:27 +08:00
lai
ec67414cb6 修复多于代码 2024-09-24 17:29:38 +08:00
TsMask
c30e8b4891 Merge remote-tracking branch 'origin/main' into multi-tenant 2024-09-21 17:18:39 +08:00
TsMask
7d5d82e7fc Merge remote-tracking branch 'origin/main' into multi-tenant 2024-09-20 19:18:04 +08:00
60083183c5 fix: fnGetList change to fnGet45GList 2024-08-23 18:49:58 +08:00
8fbd4f3952 Merge branch 'main' into multi-tenant 2024-08-19 10:20:57 +08:00
lai
2048b6f2db 删除多余代码 2024-08-15 15:31:02 +08:00
TsMask
ea6fca405b Merge remote-tracking branch 'origin/main' into multi-tenant 2024-08-12 11:42:53 +08:00
lai
9bc5eba0d6 角色单选 2024-08-02 18:58:36 +08:00
lai
b8c56c8868 Merge remote-tracking branch 'origin/main' into multi-tenant 2024-08-02 10:47:33 +08:00
9785837980 Merge branch 'main' into multi-tenant 2024-08-02 10:01:53 +08:00
lai
977a4e11ee Merge remote-tracking branch 'origin/main' into multi-tenant 2024-07-24 18:36:11 +08:00
lai
21e42709a7 Merge remote-tracking branch 'origin/main' into multi-tenant 2024-07-24 18:01:08 +08:00
lai
f8a43042db 修复 修改时并未正确渲染 2024-07-24 15:01:44 +08:00
lai
a9ee7aa925 Merge branch 'multi-tenant' of http://192.168.2.166:3180/OMC/ems_frontend_vue3 into multi-tenant 2024-07-24 09:58:50 +08:00
lai
811aedaaf4 去除多余字段 2024-07-24 09:57:42 +08:00
172b4a4856 fix: remove more action of ue event 2024-07-23 21:42:20 +08:00
lai
447ee401cb 取消过滤条件 2024-07-23 19:17:45 +08:00
lai
5f8e9954fe Merge branch 'multi-tenant' of http://192.168.2.166:3180/OMC/ems_frontend_vue3 into multi-tenant 2024-07-23 19:01:16 +08:00
lai
f8a234822d 重置不清数据 2024-07-23 19:01:14 +08:00
09245fdfda fix: tip for tenant of sim card asset 2024-07-23 18:32:11 +08:00
lai
3dafe8d1f6 增加自动填充 2024-07-23 18:05:25 +08:00
lai
c7606df740 修正 2024-07-23 17:38:58 +08:00
lai
e5c40d11d3 修正 2024-07-23 17:15:14 +08:00
lai
c9d8bb87de 增加ueEVENT 模块 2024-07-23 17:14:57 +08:00
lai
f7c2adf58c 去除默认值 2024-07-23 17:14:03 +08:00
lai
363288a141 去除默认值 2024-07-23 14:43:30 +08:00
lai
b1dbacffcc 修改默认值 2024-07-23 11:27:01 +08:00
lai
3089f8911e 去除多余校验 2024-07-23 11:14:17 +08:00
lai
83ec17343a 去除打印 2024-07-23 10:27:47 +08:00
lai
ef9db9ddf6 增加MME-EVENT事件 2024-07-23 10:03:34 +08:00
lai
1e8da20c44 增加admin管理员权限 2024-07-22 19:27:47 +08:00
lai
d9b2b6b567 替换权限标识 2024-07-22 19:11:32 +08:00
lai
636c7a5939 补充 2024-07-18 11:26:15 +08:00
lai
15f6cf0b4c 新增IMSI填写方式 2024-07-17 18:05:23 +08:00
lai
c024c304d5 针对切换时异常 2024-07-17 15:44:31 +08:00
lai
a6e100b5c2 搜索框样式 2024-07-16 18:23:36 +08:00
lai
48bac47c6b 调整 2024-07-16 17:49:24 +08:00
lai
24a147afaf Merge branch 'multi-tenant' of http://192.168.2.166:3180/OMC/ems_frontend_vue3 into multi-tenant 2024-07-16 17:38:03 +08:00
lai
5b17c9e497 签约用户搜索框机制 2024-07-16 17:37:57 +08:00
lai
79f143c22c 租户管理调整 2024-07-16 17:37:42 +08:00
TsMask
a8764fe627 Merge remote-tracking branch 'origin/main' into multi-tenant 2024-07-16 10:01:47 +08:00
lai
6a0ed31cdc 添加租户自动补全 2024-07-15 17:09:49 +08:00
lai
8a2e21a794 去除默认值 2024-07-15 15:51:54 +08:00
lai
51226fbfb4 增加租户名的自动完成框 2024-07-15 15:51:46 +08:00
lai
af5ac7d29a 修改input框 2024-07-15 11:10:40 +08:00
lai
0b98a1f697 Merge branch 'multi-tenant' of http://192.168.2.166:3180/OMC/ems_frontend_vue3 into multi-tenant 2024-07-12 10:21:27 +08:00
lai
f66cd875fb 去除没必要的权限控制 2024-07-12 10:21:19 +08:00
TsMask
795a6fabee Merge remote-tracking branch 'origin/main' into multi-tenant 2024-07-11 20:44:29 +08:00
lai
1f7becef0a 全局变量销毁时还原 2024-07-11 20:24:06 +08:00
lai
aa4f11bf44 空时限制UPF图片展示 2024-07-11 20:10:46 +08:00
lai
0b6a08a977 去除租户界面选择IMS 2024-07-11 19:47:10 +08:00
lai
5089e769da Merge branch 'multi-tenant' of http://192.168.2.166:3180/OMC/ems_frontend_vue3 into multi-tenant 2024-07-11 19:36:08 +08:00
lai
c36f402528 调整租户首页 2024-07-11 19:36:05 +08:00
lai
1f6a13951f ims在线用户信息 2024-07-11 17:26:43 +08:00
4b69b44df5 fix: tenant tips 2024-07-11 16:48:56 +08:00
5643c625ef fix: tenant tip 2024-07-11 16:42:54 +08:00
1607c97b82 fix: imsi tip 2024-07-11 16:40:50 +08:00
d0ac6d4e2e fix: imsi tips 2024-07-11 16:40:04 +08:00
0ad9d546cd fix: tenant tips 2024-07-11 16:37:53 +08:00
f8d54e35c9 fix: tenant management cn&en tips 2024-07-11 16:36:37 +08:00
lai
be2a077bba 去除多余字段 2024-07-11 11:02:35 +08:00
lai
cb5dfebb59 租户cdr独立起来 2024-07-11 10:37:46 +08:00
lai
71d23cbc32 Merge branch 'multi-tenant' of http://192.168.2.166:3180/OMC/ems_frontend_vue3 into multi-tenant 2024-07-11 10:18:35 +08:00
lai
93315776da 调整显示问题 2024-07-11 10:18:31 +08:00
lai
0d5cbe6459 租户管理增加基站id 2024-07-11 10:18:18 +08:00
lai
9a88364d8b label调整 2024-07-11 10:17:54 +08:00
lai
c0ec4893c8 smfCDR的显示问题 2024-07-11 10:17:17 +08:00
TsMask
24cd0ff101 Merge remote-tracking branch 'origin/main' into multi-tenant 2024-07-09 16:24:50 +08:00
lai
7e92659217 增加点击修改时选择UPF的操作 2024-07-09 14:40:44 +08:00
lai
e8fefab74e 租户SMF在线信息无需再选具体网元 2024-07-09 10:38:14 +08:00
lai
78c86be8a0 添加UPF租赁类型时选择RMUID下拉框 2024-07-09 10:34:05 +08:00
lai
8f8c9f8395 取消不必要的代码 2024-07-09 10:33:19 +08:00
lai
7d5635560d 修复全屏时下拉框显示不出来问题 2024-07-09 10:32:52 +08:00
lai
e83bf43bc8 鉴权数据修改时不能修改IMSI 2024-07-09 10:32:29 +08:00
TsMask
f89ba87fef Merge remote-tracking branch 'origin/main' into multi-tenant 2024-07-06 15:54:53 +08:00
lai
ca8a4128fb 取消勾选 2024-07-05 19:38:04 +08:00
lai
21621c2056 默认值修改 2024-07-05 19:18:53 +08:00
lai
22797a8ae8 修改中英文 2024-07-05 18:07:32 +08:00
lai
374b6feef3 中英文以及排版 2024-07-05 17:03:04 +08:00
lai
c1902f978a 选择角色为tenant才显示框 2024-07-05 15:39:06 +08:00
lai
b431ae70a5 租户主页基站中英文 2024-07-05 15:05:05 +08:00
lai
8e57bcfd25 根据最新菜单进行修改 2024-07-05 14:58:25 +08:00
lai
9e5a000383 前缀后缀 2024-07-05 14:51:56 +08:00
lai
f4771892aa 改动变量名 2024-07-05 14:30:28 +08:00
lai
842f09cc90 增加租户目录中英文 2024-07-05 14:19:59 +08:00
lai
2cb92eaf69 中英文 2024-07-05 11:24:17 +08:00
lai
02eb368a45 调整位置 2024-07-04 18:33:03 +08:00
lai
4c7b5c8b55 租户SMF的cdr 2024-07-04 18:17:25 +08:00
lai
7aebab3734 管理员smfCDR增加租户名字段 2024-07-04 17:06:15 +08:00
lai
d26fb9af85 仪表盘中ws的改动 2024-07-04 16:51:22 +08:00
lai
28213cde43 同时获取45G基站信息 2024-07-04 16:50:58 +08:00
lai
c21af696fe 签约用户中英文 2024-07-04 16:50:02 +08:00
lai
ebd8821e64 增加imsi匹配搜索框 2024-07-04 16:19:04 +08:00
lai
361fdf6959 修改租户界面排版 2024-07-04 14:40:17 +08:00
lai
60dc02010d 改动监控页的ws文件 2024-07-01 19:22:31 +08:00
lai
7c420c7c95 自动补全 2024-07-01 19:20:23 +08:00
a78e7049cf merge main to multi-tenant 2024-06-28 14:26:06 +08:00
TsMask
ef3796c34f Merge remote-tracking branch 'origin/main' into multi-tenant 2024-06-27 20:19:46 +08:00
lai
c38855acf8 调整互动以及租户未激活时标红 2024-06-27 15:24:52 +08:00
lai
a2672d300f 添加卸载生命周期 2024-06-26 21:24:40 +08:00
lai
bfaf0e6aaf 无边框 2024-06-26 21:04:15 +08:00
lai
7fe0f5d84d 增加下拉框 2024-06-26 21:03:03 +08:00
lai
1eeddb20c5 更新用户管理的租户数据源 2024-06-26 16:10:35 +08:00
lai
52b61ec34a 误操作原始文件 2024-06-26 14:47:10 +08:00
lai
faefef7d2f 更新租户管理排版 2024-06-26 14:42:23 +08:00
lai
938679cbda 根据最新菜单进行更新 2024-06-26 14:36:01 +08:00
lai
83aefc5dde 增加刷新按钮 2024-06-25 18:02:59 +08:00
lai
0157ec50d3 悬浮按钮 2024-06-25 17:52:34 +08:00
lai
2f7c947708 租户管理 2024-06-25 16:46:47 +08:00
lai
4c16c39243 调整操作日志界面 2024-06-24 19:59:11 +08:00
lai
693ed533f9 租户界面归类 2024-06-24 10:40:08 +08:00
lai
584b25d9fc 租户UPF不带neId 2024-06-21 15:27:51 +08:00
lai
1fa59d163e 更换权限标识 2024-06-21 11:41:14 +08:00
lai
c94f9c5943 解决titile 连在一起 2024-06-20 20:36:52 +08:00
lai
2480ae1c0b 调整租户管理的界面 2024-06-20 20:36:25 +08:00
lai
440dc81182 签约用户切割为两份 2024-06-20 18:34:58 +08:00
lai
0b64302b54 提示框位置下移 2024-06-20 14:53:20 +08:00
lai
0e4e8e09e6 关闭modal框时销毁元素 2024-06-20 14:37:16 +08:00
lai
0b05f40e65 转义租赁类型 2024-06-19 16:17:27 +08:00
lai
ff0b3a40cd 补充参数类型 2024-06-19 14:41:06 +08:00
lai
fe541886d5 更换接口 2024-06-19 10:50:34 +08:00
lai
6406ed0e57 补充参数 2024-06-19 10:04:39 +08:00
lai
1aa2f2382a 部门管理代码还原 2024-06-18 18:31:41 +08:00
lai
197a962c0d 更新标识 2024-06-18 18:29:23 +08:00
lai
ac923d5943 路由地址改变 2024-06-18 17:11:17 +08:00
lai
92fe93b4dc 新增基站信息 数据隔离 2024-06-18 16:58:11 +08:00
lai
a26301af1e UE在线信息数据隔离 2024-06-18 16:38:30 +08:00
lai
6aa07dc756 添加跳转功能 2024-06-18 16:14:49 +08:00
lai
f5faa054b3 新增租赁类型 2024-06-18 15:15:03 +08:00
lai
5ada366f17 数值与名称换成白底 2024-06-18 11:00:18 +08:00
lai
80a41dd559 界面新增租户限制 2024-06-17 19:47:38 +08:00
lai
7031d4cdd4 限制操作列的显示 2024-06-17 19:19:45 +08:00
lai
f72b79c628 退出时清空表格记忆缓存 2024-06-17 19:19:23 +08:00
lai
490db476dd 取消携带tenantName 2024-06-17 16:55:56 +08:00
lai
1bae6e55e0 增加区分租户的列(搜索时没传递userName) 2024-06-17 14:06:51 +08:00
lai
d2503348fd 修改路径 2024-06-17 11:53:35 +08:00
lai
03710d6811 操作日志的搜索框区分 2024-06-14 17:20:38 +08:00
lai
322dccfbc1 租户的仪表盘 2024-06-14 17:20:24 +08:00
lai
0d0603058c 取消打印 2024-06-13 15:35:16 +08:00
lai
acef786c56 取消默认值 2024-06-13 15:34:05 +08:00
lai
4e726913f1 租户管理界面调整 2024-06-13 15:33:53 +08:00
lai
f699f6f3ba 用户管理界面调整 2024-06-13 15:11:03 +08:00
lai
e35356a8c6 租户管理异常(数据库需要把key字段改名) 2024-06-06 17:46:52 +08:00
lai
9152f14430 新增tenant接口 2024-06-06 15:54:16 +08:00
lai
faa3fa546b 租户管理界面 2024-06-06 15:51:59 +08:00
lai
5c31093c28 首页的变更(仪表盘稍后做调整) 2024-06-06 14:39:03 +08:00
lai
eee652bd1f 添加所属租户选项 2024-06-06 14:38:28 +08:00
lai
b7b66ad28d 增加权限限制 2024-06-06 14:37:27 +08:00
lai
29e092421c 中英文翻译 2024-06-06 11:33:21 +08:00
TsMask
0022e259ca Merge branch 'main' into multi-tenant 2024-06-06 11:06:23 +08:00
lai
0a711ee3ce test 2024-06-05 21:07:24 +08:00
319 changed files with 47622 additions and 11673 deletions

View File

@@ -1,5 +1,5 @@
# 历史路径-哈希带井号标识
VITE_HISTORY_HASH = false
VITE_HISTORY_HASH = true
# 历史路径-前缀URL如/h5
VITE_HISTORY_BASE_URL = "/"
@@ -11,7 +11,7 @@ VITE_APP_NAME = "Core Network OMC"
VITE_APP_CODE = "OMC"
# 应用版本
VITE_APP_VERSION = "2.241102"
VITE_APP_VERSION = "local-dev"
# 接口基础URL地址-不带/后缀
VITE_API_BASE_URL = "/omc-api"

View File

@@ -11,7 +11,7 @@ VITE_APP_NAME = "Core Network OMC"
VITE_APP_CODE = "OMC"
# 应用版本
VITE_APP_VERSION = "2.241102"
VITE_APP_VERSION = "local-prod"
# 接口基础URL地址-不带/后缀
VITE_API_BASE_URL = "/omc-api"

View File

@@ -1,5 +1,43 @@
# 版本发布日志
## 2.2510.4-20251024
- 修复 AMF配置WhiteList Content导入index0无效问题
- 新增 更新背景图片固定BA的
- 新增 基站状态补充randId列
- 新增 Roaming CDR自定义导出功能
- 优化 基站名称和位置信息改为非必填
- 修复 网元信息更新响应修复
- 新增 UDM鉴权cnFlag添加5G/4G接入选择
- 新增 更新getAllNeConfig函数支持传入neId参数
- 修复 更新根网管节点处理逻辑支持无OMC情况
- 优化 移除ID列显示
- 优化 操作日志信息json结构格式美化
- 优化 备份网元日志文件数据查看
- 优化 悬浮标签修改
## 2.2510.2-20251011
- 新增 UDM-auth数据导出按钮权限定义
- 新增 SMSC-CDR添加结果原因说明
- 优化 移除CDR/UE/网元版本/授权列表显示ID列
- 修复 MML回车undefined问题关闭搜索匹配
## 2.2408.1-20250815
- 修复 给config.js加随机数避免缓存
- 优化 UDM鉴权用户显示创建时间
- 修复 系统用户登录主页重复刷新问题
- 新增 kpi自定义仪表盘需求更改
- 修复 租户主页暗色模式显示不一致
- 修复 租户和系统用户的主页显示差异
- 修复 图片上传取值fileName失败
- 优化 第三方用户不可删除和修改密码
- 修复 恢复显示快速PLMN修改窗口
- 新增 第三方登录认证功能和管理页
- 修复 回退看板修复切换upf的流量统计显示
## 2.2404.1-20240402
- 新增 网元安装流程相关页面与操作相关接口联调

View File

@@ -5,13 +5,6 @@
- 图标来源 [@ant-design/icons-vue](https://ant.design/components/icon)
- 菜单图标使用自定义 iconfont `font_8d5l8fzk5b87iudi.js`图标文件
## 测试环境
```text
Nginx: http://192.168.2.166:3188/#/index
后端暴露端口: http://192.168.2.166:33030
```
## 程序命令
项目目录下 `.env.[环境]` 文件对应环境的一些配置,启动前请检查文件内是否配置正确。
@@ -53,5 +46,31 @@ export NODE_OPTIONS=--max-old-space-size=50000
```text
https://192.168.5.23/
admin / admin
admin
admin
```
## 多租户涉及页面
ems_frontend_vue3\src\views\dashboard\smfCDR\index.vue
ems_frontend_vue3\src\views\dashboard\imsCDR\index.vue
ems_frontend_vue3\src\views\dashboard\amfUE\index.vue
ems_frontend_vue3\src\views\dashboard\mmeUE\index.vue
ems_frontend_vue3\src\views\system\user\index.vue
ems_frontend_vue3\src\views\system\tenant\index.vue
ems_frontend_vue3\src\views\system\log\operate\index.vue
ems_frontend_vue3\src\views\neUser\sub\index.vue
ems_frontend_vue3\src\views\neUser\ims\index.vue
ems_frontend_vue3\src\views\neUser\ue\index.vue
ems_frontend_vue3\src\views\neUser\base5G\index.vue
ems_frontend_vue3\src\views\tenant\amfUE\index.vue
ems_frontend_vue3\src\views\tenant\base5G\index.vue
ems_frontend_vue3\src\views\tenant\ims\index.vue
ems_frontend_vue3\src\views\tenant\imsCDR\index.vue
ems_frontend_vue3\src\views\tenant\mmeUE\index.vue
ems_frontend_vue3\src\views\tenant\operate\index.vue
ems_frontend_vue3\src\views\tenant\smfCDR\index.vue
ems_frontend_vue3\src\views\tenant\sub\index.vue
ems_frontend_vue3\src\views\tenant\ue\index.vue

View File

@@ -2,14 +2,18 @@
<html lang="zh-CN">
<head>
<meta charset="UTF-8" />
<meta name="google" content="notranslate">
<meta name="google" content="notranslate" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>loading...</title>
<link rel="icon" href="/favicon.ico" />
<link rel="preload" href="/loading.js" as="script">
<link rel="preload" href="/loading.js" as="script"/>
<script async src="/loading.js"></script>
<link rel="preload" href="/config.js" as="script">
<script async src="/config.js"></script>
<script>
var script = document.createElement('script');
script.src = '/config.js?nocache=' + new Date().getTime();
script.async = true;
document.head.appendChild(script);
</script>
</head>
<body>
<div id="app"></div>

View File

@@ -8,54 +8,55 @@
},
"scripts": {
"dev": "vite",
"build": "vue-tsc && vite build",
"build": "vite build",
"preview": "vite preview"
},
"dependencies": {
"@ant-design/icons-vue": "^7.0.1",
"@antv/g6": "~4.8.24",
"@codemirror/lang-javascript": "^6.2.2",
"@codemirror/lang-yaml": "^6.1.1",
"@codemirror/merge": "^6.6.3",
"@codemirror/theme-one-dark": "^6.1.2",
"@tato30/vue-pdf": "^1.10.0",
"@vueuse/core": "~10.10.1",
"@xterm/addon-fit": "^0.10.0",
"@xterm/xterm": "^5.5.0",
"ant-design-vue": "^3.2.20",
"antdv-pro-layout": "~3.3.5",
"antdv-pro-modal": "^3.1.0",
"codemirror": "^6.0.1",
"crypto-js": "^4.2.0",
"dayjs": "^1.11.11",
"echarts": "~5.5.0",
"file-saver": "^2.0.5",
"grid-layout-plus": "^1.0.5",
"intl-tel-input": "^23.8.1",
"@ant-design/icons-vue": "7.0.1",
"@antv/g6": "4.8.24",
"@codemirror/lang-javascript": "6.2.3",
"@codemirror/lang-yaml": "6.1.2",
"@codemirror/merge": "6.10.0",
"@codemirror/theme-one-dark": "6.1.2",
"@tato30/vue-pdf": "1.11.3",
"@vueuse/core": "13.0.0",
"@xterm/addon-fit": "0.10.0",
"@xterm/xterm": "5.5.0",
"ant-design-vue": "4.2.6",
"antdv-pro-layout": "4.2.0",
"antdv-pro-modal": "4.0.6",
"codemirror": "6.0.1",
"crypto-js": "4.2.0",
"dayjs": "1.11.13",
"echarts": "5.6.0",
"echarts-liquidfill": "^3.1.0",
"file-saver": "2.0.5",
"grid-layout-plus": "1.0.6",
"intl-tel-input": "25.2.0",
"js-base64": "^3.7.7",
"js-cookie": "^3.0.5",
"localforage": "^1.10.0",
"nprogress": "^0.2.0",
"p-queue": "~8.0.1",
"pinia": "^2.1.7",
"vue": "~3.3.13",
"vue-i18n": "^9.13.1",
"vue-router": "^4.4.0",
"vue3-smooth-dnd": "^0.0.6",
"xlsx": "~0.18.5"
"p-queue": "8.0.1",
"pinia": "2.3.0",
"vue": "3.5.13",
"vue-i18n": "11.1.2",
"vue-router": "4.5.0",
"vue3-smooth-dnd": "0.0.6",
"xlsx": "0.18.5"
},
"devDependencies": {
"@types/crypto-js": "^4.2.2",
"@types/file-saver": "^2.0.7",
"@types/js-cookie": "^3.0.6",
"@types/crypto-js": "4.2.2",
"@types/file-saver": "2.0.7",
"@types/js-cookie": "3.0.6",
"@types/node": "^18.0.0",
"@types/nprogress": "^0.2.3",
"@vitejs/plugin-vue": "^5.0.5",
"less": "^4.2.0",
"typescript": "~5.4.5",
"unplugin-vue-components": "~0.26.0",
"vite": "~5.3.1",
"vite-plugin-compression": "~0.5.1",
"vue-tsc": "~2.0.22"
"@types/nprogress": "0.2.3",
"@vitejs/plugin-vue": "5.2.3",
"less": "4.2.2",
"typescript": "5.8.2",
"unplugin-vue-components": "0.28.0",
"vite": "6.2.2",
"vite-plugin-compression": "0.5.1",
"vue-tsc": "2.2.8"
}
}

BIN
public/background/dark.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 216 KiB

BIN
public/background/light.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 216 KiB

View File

@@ -10,12 +10,19 @@
*
*/
(function () {
// host = ip:port
// const host = '192.168.8.100:33030';
const host = `${window.location.hostname}:33030`;
// baseUrl = protocol://ip:port
// baseUrl = 'http://192.168.8.100:33030';
const protocol = window.location.protocol
let wsprotocol = "ws:"
const hostname = window.location.hostname
let host = `${hostname}:33030`;
if (protocol === 'https:') {
host = `${hostname}:33443`;
wsprotocol = "wss:"
}
// Service Address
sessionStorage.setItem('baseUrl', `http://${host}`);
sessionStorage.setItem('baseUrl', `${protocol}//${host}`);
// websocket Address
sessionStorage.setItem('wsUrl', `ws://${host}`);
sessionStorage.setItem('wsUrl', `${wsprotocol}//${host}`);
})();

BIN
public/nbStateImput/en.xlsx Normal file

Binary file not shown.

BIN
public/nbStateImput/zh.xlsx Normal file

Binary file not shown.

Binary file not shown.

View File

@@ -0,0 +1 @@
001012082101039,1234,internet|ims_sig,internet|ims_sig,321321,255,321312,32131,32131

View File

@@ -0,0 +1,2 @@
001011100001157,1234567890ABCDEF1234567890ABCDEF,0,8000,11111111111111111111111111111111
001011100001158,1234567890ABCDEF1234567890ABCDEF,0,8000,11111111111111111111111111111111

View File

@@ -0,0 +1,2 @@
001011100001157,62357000583,def_ambr,def_nssai,def_arfb,def_sar,0,3,def_snssai,1-000001&internet&ims,1,64,24,65,def_eps,1,010200000000,-
001011100001158,62357000585,def_ambr,def_nssai,def_arfb,def_sar,0,3,def_snssai,1-000001&internet&ims,1,64,24,65,def_eps,1,010200000000,-

View File

@@ -0,0 +1,2 @@
62357000580,123456
62357000581,123456

View File

@@ -0,0 +1,2 @@
001012082101039,62357000580,1,ims.mnc001.mcc001.3gppnetwork.org
62357000581,62357000581,0,ims.mnc001.mcc001.3gppnetwork.org

28
public/svg/base4G.svg Normal file
View File

@@ -0,0 +1,28 @@
<svg width="1024" height="1024" xmlns="http://www.w3.org/2000/svg">
<!-- Created with Method Draw - http://github.com/duopixel/Method-Draw/ -->
<g>
<title>background</title>
<rect fill="none" id="canvas_background" height="1026" width="1026" y="-1" x="-1"/>
<g display="none" overflow="visible" y="0" x="0" height="100%" width="100%" id="canvasGrid">
<rect fill="url(#gridpattern)" stroke-width="0" y="1" x="1" height="768" width="1024"/>
</g>
</g>
<g>
<title>Layer 1</title>
<g stroke="null" id="svg_15">
<path stroke="null" id="svg_4" fill="#B5D6FB" d="m512.094844,961.632039c-1.327621,0 -2.560412,-0.405439 -3.793202,-1.114958l-405.588164,-251.575028c-2.275921,-1.419037 -3.698372,-4.054392 -3.698372,-6.892467l0,-90.007504c0,-2.838074 1.422451,-5.473429 3.698372,-6.892467l405.588164,-255.426701c1.137961,-0.709519 2.465582,-1.114958 3.793202,-1.114958s2.655242,0.405439 3.793202,1.114958l405.493334,255.426701c2.275921,1.419037 3.698372,4.054392 3.698372,6.892467l0,90.007504c0,2.838074 -1.422451,5.473429 -3.698372,6.892467l-405.588164,251.575028c-1.137961,0.709519 -2.465582,1.114958 -3.698372,1.114958z"/>
<path stroke="null" id="svg_5" fill="#0276F7" d="m512.094844,356.615382l405.398504,255.426701l0,90.007504l-66.096551,40.94936l-339.301952,210.625668l-339.491613,-210.625668l-66.096551,-40.94936l0,-90.007504l405.588164,-255.426701m0,-16.014849c-2.655242,0 -5.215653,0.709519 -7.586405,2.229916l-405.588164,255.426701c-4.551843,2.838074 -7.396745,8.108784 -7.396745,13.784933l0,90.007504c0,5.676149 2.844902,10.946859 7.491575,13.886293l66.096551,41.05072l339.491613,210.625668c2.275921,1.419037 4.931163,2.128556 7.491575,2.128556s5.215653,-0.709519 7.491575,-2.128556l339.301952,-210.625668l66.096551,-40.94936c4.646673,-2.838074 7.491575,-8.108784 7.491575,-13.886293l0,-90.007504c0,-5.676149 -2.844902,-10.946859 -7.396745,-13.784933l-405.398504,-255.426701c-2.370751,-1.520397 -5.025993,-2.331275 -7.586405,-2.331275z"/>
<path stroke="null" id="svg_6" fill="#FFFFFF" d="m106.50668,612.042083l405.493334,253.298145l405.493334,-253.298145l-405.398504,-255.426701l-405.588164,255.426701z"/>
<path stroke="null" id="svg_7" fill="#D4E4FC" d="m501.473877,64.192353l-254.9032,498.487506l263.343075,161.162085l266.662127,-162.074323l-275.102002,-497.575268z"/>
<path stroke="null" id="svg_8" fill="#0276F7" d="m229.975417,602.311542c-1.232791,0 -2.465582,-0.304079 -3.698372,-1.013598c-3.603542,-2.128556 -4.931163,-6.993826 -2.844902,-10.845499l279.653845,-532.13896c1.327621,-2.533995 3.793202,-4.054392 6.543274,-4.054392c2.655242,0 5.120823,1.520397 6.543274,4.054392l284.395348,532.13896c2.086261,3.851672 0.75864,8.716943 -2.750072,10.946859c-3.603542,2.128556 -8.155385,0.810878 -10.241646,-2.939434l-277.852074,-519.874424l-273.205401,519.671704c-1.422451,2.635355 -3.982862,4.054392 -6.543274,4.054392z"/>
<path stroke="null" id="svg_9" fill="#0276F7" d="m509.913752,755.567562c-4.172523,0 -7.491575,-3.547593 -7.491575,-8.007424l0,-666.744777c0,-4.459831 3.319052,-8.007424 7.491575,-8.007424s7.491575,3.547593 7.491575,8.007424l0,666.846137c0,4.358471 -3.413882,7.906065 -7.491575,7.906065z"/>
<path stroke="null" id="svg_10" fill="#0276F7" d="m509.913752,731.849369c-1.327621,0 -2.560412,-0.405439 -3.698372,-1.013598l-263.343075,-161.162085c-3.603542,-2.229916 -4.836333,-7.095186 -2.750072,-10.946859c2.086261,-3.851672 6.638104,-5.16935 10.241646,-2.939434l259.549873,158.83081l262.963755,-159.844408c3.603542,-2.229916 8.155385,-0.810878 10.241646,3.040794c2.086261,3.851672 0.75864,8.716943 -2.844902,10.946859l-266.662127,162.074323c-1.137961,0.709519 -2.465582,1.013598 -3.698372,1.013598z"/>
<path stroke="null" id="svg_11" fill="#0276F7" d="m509.913752,579.708306c-1.327621,0 -2.560412,-0.405439 -3.793202,-1.114958l-201.988026,-125.686154c-3.603542,-2.229916 -4.741503,-7.095186 -2.750072,-10.946859c2.086261,-3.851672 6.638104,-5.16935 10.241646,-2.838074l198.289654,123.354879l201.798366,-122.138561c3.603542,-2.229916 8.155385,-0.810878 10.241646,3.040794c2.086261,3.851672 0.75864,8.716943 -2.844902,10.845499l-205.496739,124.469837c-1.137961,0.709519 -2.465582,1.013598 -3.698372,1.013598zm-2.465582,-157.513132c-1.232791,0 -2.370751,-0.304079 -3.508712,-0.912238l-140.917468,-79.668804c-3.698372,-2.128556 -5.025993,-6.892467 -3.129392,-10.845499c1.896601,-3.953032 6.448444,-5.37207 10.146816,-3.344873l137.503586,77.742968l143.00373,-79.871524c3.698372,-2.027196 8.155385,-0.506799 10.146816,3.344873c1.896601,3.953032 0.47415,8.716943 -3.129392,10.845499l-146.512442,81.79736c-1.232791,0.608159 -2.370751,0.912238 -3.603542,0.912238zm2.465582,-148.49211c-1.232791,0 -2.465582,-0.304079 -3.508712,-0.912238l-82.312492,-47.436387c-3.603542,-2.128556 -5.025993,-6.993826 -3.034562,-10.845499c1.991431,-3.953032 6.543274,-5.27071 10.146816,-3.243514l78.708949,45.409191l78.329629,-47.537747c3.603542,-2.229916 8.155385,-0.810878 10.241646,3.040794c2.086261,3.851672 0.75864,8.716943 -2.844902,10.946859l-81.933171,49.666303c-1.232791,0.608159 -2.560412,0.912238 -3.793202,0.912238z"/>
<path stroke="null" id="svg_12" fill="#0276F7" d="m509.913752,579.708306l-0.28449,0l-263.248245,-9.021022c-4.172523,-0.10136 -7.396745,-3.851672 -7.207085,-8.210144c0.09483,-4.459831 4.077693,-7.703345 7.681235,-7.703345l263.343075,9.021022c4.172523,0.10136 7.396745,3.851672 7.207085,8.210144c-0.18966,4.257112 -3.508712,7.703345 -7.491575,7.703345zm0,152.141063c-1.612111,0 -3.224222,-0.608159 -4.646673,-1.723117c-3.224222,-2.736715 -3.793202,-7.804705 -1.232791,-11.250938l205.496739,-276.610899c2.560412,-3.446233 7.301915,-4.054392 10.526137,-1.317677c3.224222,2.736715 3.793202,7.804705 1.232791,11.250938l-205.496739,276.610899c-1.517281,2.027196 -3.698372,3.040794 -5.879464,3.040794z"/>
<path stroke="null" id="svg_13" fill="#0276F7" d="m509.913752,579.708306c-1.422451,0 -2.750072,-0.405439 -4.077693,-1.216318c-3.508712,-2.432635 -4.457013,-7.297906 -2.275921,-11.048218l144.14169,-239.310492c2.275921,-3.750313 6.922594,-4.763911 10.336476,-2.432635c3.508712,2.432635 4.457013,7.297906 2.275921,11.048218l-144.14169,239.310492c-1.422451,2.331275 -3.793202,3.648953 -6.258784,3.648953zm-2.465582,-157.513132c-1.043131,0 -2.086261,-0.20272 -3.129392,-0.709519c-3.793202,-1.824476 -5.405313,-6.588387 -3.698372,-10.642779l84.398753,-198.158413c1.706941,-4.054392 6.069124,-5.777509 9.957156,-3.953032c3.793202,1.824476 5.405313,6.588387 3.698372,10.642779l-84.303923,198.158413c-1.327621,2.939434 -4.077693,4.662551 -6.922594,4.662551z"/>
<path stroke="null" id="svg_14" fill="#0276F7" d="m591.846924,375.062866c-2.750072,0 -5.405313,-1.621757 -6.732934,-4.459831c-1.801771,-3.953032 -0.28449,-8.716943 3.413882,-10.642779l129.253371,-67.302908l-365.759539,-178.089172l20.862613,208.091673l133.994874,-64.262114c3.698372,-1.824476 8.155385,0 9.862326,4.054392c1.706941,4.054392 0,8.716943 -3.793202,10.541419l-143.38305,68.823305c-2.181091,1.013598 -4.646673,0.912238 -6.827764,-0.405439c-2.086261,-1.317677 -3.413882,-3.547593 -3.698372,-6.081588l-23.328195,-233.026185c-0.28449,-2.838074 0.853471,-5.676149 3.034562,-7.297906c2.181091,-1.621757 5.025993,-2.027196 7.491575,-0.810878l392.217126,190.961867c2.655242,1.317677 4.362183,4.054392 4.362183,7.196546c0,3.142154 -1.612111,5.980228 -4.172523,7.297906l-143.57271,74.600814c-1.043131,0.608159 -2.181091,0.810878 -3.224222,0.810878zm-283.921198,78.959286c-3.603542,0 -6.827764,-2.838074 -7.396745,-6.791107c-0.56898,-4.358471 2.181091,-8.412864 6.258784,-9.122382l199.617275,-31.826978c4.077693,-0.608159 7.870895,2.331275 8.534705,6.689747c0.56898,4.358471 -2.181091,8.412864 -6.258784,9.122382l-199.617275,31.826978c-0.47415,0.10136 -0.853471,0.10136 -1.137961,0.10136z"/>
</g>
<text stroke="null" font-style="italic" transform="matrix(6.577099502228161,0,0,7.449448263868419,-1073.2057632249744,-908.8606073938396) " xml:space="preserve" text-anchor="start" font-family="Arvo, sans-serif" font-size="24" id="svg_16" y="177.898525" x="178.621382" stroke-width="0" fill="#B5D6FB">4G</text>
</g>
</svg>

After

Width:  |  Height:  |  Size: 7.9 KiB

28
public/svg/base5G.svg Normal file
View File

@@ -0,0 +1,28 @@
<svg width="1024" height="1024" xmlns="http://www.w3.org/2000/svg">
<!-- Created with Method Draw - http://github.com/duopixel/Method-Draw/ -->
<g>
<title>background</title>
<rect fill="none" id="canvas_background" height="1026" width="1026" y="-1" x="-1"/>
<g display="none" overflow="visible" y="0" x="0" height="100%" width="100%" id="canvasGrid">
<rect fill="url(#gridpattern)" stroke-width="0" y="1" x="1" height="768" width="1024"/>
</g>
</g>
<g>
<title>Layer 1</title>
<g stroke="null" id="svg_15">
<path stroke="null" id="svg_4" fill="#B5D6FB" d="m512.094844,961.632039c-1.327621,0 -2.560412,-0.405439 -3.793202,-1.114958l-405.588164,-251.575028c-2.275921,-1.419037 -3.698372,-4.054392 -3.698372,-6.892467l0,-90.007504c0,-2.838074 1.422451,-5.473429 3.698372,-6.892467l405.588164,-255.426701c1.137961,-0.709519 2.465582,-1.114958 3.793202,-1.114958s2.655242,0.405439 3.793202,1.114958l405.493334,255.426701c2.275921,1.419037 3.698372,4.054392 3.698372,6.892467l0,90.007504c0,2.838074 -1.422451,5.473429 -3.698372,6.892467l-405.588164,251.575028c-1.137961,0.709519 -2.465582,1.114958 -3.698372,1.114958z"/>
<path stroke="null" id="svg_5" fill="#0276F7" d="m512.094844,356.615382l405.398504,255.426701l0,90.007504l-66.096551,40.94936l-339.301952,210.625668l-339.491613,-210.625668l-66.096551,-40.94936l0,-90.007504l405.588164,-255.426701m0,-16.014849c-2.655242,0 -5.215653,0.709519 -7.586405,2.229916l-405.588164,255.426701c-4.551843,2.838074 -7.396745,8.108784 -7.396745,13.784933l0,90.007504c0,5.676149 2.844902,10.946859 7.491575,13.886293l66.096551,41.05072l339.491613,210.625668c2.275921,1.419037 4.931163,2.128556 7.491575,2.128556s5.215653,-0.709519 7.491575,-2.128556l339.301952,-210.625668l66.096551,-40.94936c4.646673,-2.838074 7.491575,-8.108784 7.491575,-13.886293l0,-90.007504c0,-5.676149 -2.844902,-10.946859 -7.396745,-13.784933l-405.398504,-255.426701c-2.370751,-1.520397 -5.025993,-2.331275 -7.586405,-2.331275z"/>
<path stroke="null" id="svg_6" fill="#FFFFFF" d="m106.50668,612.042083l405.493334,253.298145l405.493334,-253.298145l-405.398504,-255.426701l-405.588164,255.426701z"/>
<path stroke="null" id="svg_7" fill="#D4E4FC" d="m501.473877,64.192353l-254.9032,498.487506l263.343075,161.162085l266.662127,-162.074323l-275.102002,-497.575268z"/>
<path stroke="null" id="svg_8" fill="#0276F7" d="m229.975417,602.311542c-1.232791,0 -2.465582,-0.304079 -3.698372,-1.013598c-3.603542,-2.128556 -4.931163,-6.993826 -2.844902,-10.845499l279.653845,-532.13896c1.327621,-2.533995 3.793202,-4.054392 6.543274,-4.054392c2.655242,0 5.120823,1.520397 6.543274,4.054392l284.395348,532.13896c2.086261,3.851672 0.75864,8.716943 -2.750072,10.946859c-3.603542,2.128556 -8.155385,0.810878 -10.241646,-2.939434l-277.852074,-519.874424l-273.205401,519.671704c-1.422451,2.635355 -3.982862,4.054392 -6.543274,4.054392z"/>
<path stroke="null" id="svg_9" fill="#0276F7" d="m509.913752,755.567562c-4.172523,0 -7.491575,-3.547593 -7.491575,-8.007424l0,-666.744777c0,-4.459831 3.319052,-8.007424 7.491575,-8.007424s7.491575,3.547593 7.491575,8.007424l0,666.846137c0,4.358471 -3.413882,7.906065 -7.491575,7.906065z"/>
<path stroke="null" id="svg_10" fill="#0276F7" d="m509.913752,731.849369c-1.327621,0 -2.560412,-0.405439 -3.698372,-1.013598l-263.343075,-161.162085c-3.603542,-2.229916 -4.836333,-7.095186 -2.750072,-10.946859c2.086261,-3.851672 6.638104,-5.16935 10.241646,-2.939434l259.549873,158.83081l262.963755,-159.844408c3.603542,-2.229916 8.155385,-0.810878 10.241646,3.040794c2.086261,3.851672 0.75864,8.716943 -2.844902,10.946859l-266.662127,162.074323c-1.137961,0.709519 -2.465582,1.013598 -3.698372,1.013598z"/>
<path stroke="null" id="svg_11" fill="#0276F7" d="m509.913752,579.708306c-1.327621,0 -2.560412,-0.405439 -3.793202,-1.114958l-201.988026,-125.686154c-3.603542,-2.229916 -4.741503,-7.095186 -2.750072,-10.946859c2.086261,-3.851672 6.638104,-5.16935 10.241646,-2.838074l198.289654,123.354879l201.798366,-122.138561c3.603542,-2.229916 8.155385,-0.810878 10.241646,3.040794c2.086261,3.851672 0.75864,8.716943 -2.844902,10.845499l-205.496739,124.469837c-1.137961,0.709519 -2.465582,1.013598 -3.698372,1.013598zm-2.465582,-157.513132c-1.232791,0 -2.370751,-0.304079 -3.508712,-0.912238l-140.917468,-79.668804c-3.698372,-2.128556 -5.025993,-6.892467 -3.129392,-10.845499c1.896601,-3.953032 6.448444,-5.37207 10.146816,-3.344873l137.503586,77.742968l143.00373,-79.871524c3.698372,-2.027196 8.155385,-0.506799 10.146816,3.344873c1.896601,3.953032 0.47415,8.716943 -3.129392,10.845499l-146.512442,81.79736c-1.232791,0.608159 -2.370751,0.912238 -3.603542,0.912238zm2.465582,-148.49211c-1.232791,0 -2.465582,-0.304079 -3.508712,-0.912238l-82.312492,-47.436387c-3.603542,-2.128556 -5.025993,-6.993826 -3.034562,-10.845499c1.991431,-3.953032 6.543274,-5.27071 10.146816,-3.243514l78.708949,45.409191l78.329629,-47.537747c3.603542,-2.229916 8.155385,-0.810878 10.241646,3.040794c2.086261,3.851672 0.75864,8.716943 -2.844902,10.946859l-81.933171,49.666303c-1.232791,0.608159 -2.560412,0.912238 -3.793202,0.912238z"/>
<path stroke="null" id="svg_12" fill="#0276F7" d="m509.913752,579.708306l-0.28449,0l-263.248245,-9.021022c-4.172523,-0.10136 -7.396745,-3.851672 -7.207085,-8.210144c0.09483,-4.459831 4.077693,-7.703345 7.681235,-7.703345l263.343075,9.021022c4.172523,0.10136 7.396745,3.851672 7.207085,8.210144c-0.18966,4.257112 -3.508712,7.703345 -7.491575,7.703345zm0,152.141063c-1.612111,0 -3.224222,-0.608159 -4.646673,-1.723117c-3.224222,-2.736715 -3.793202,-7.804705 -1.232791,-11.250938l205.496739,-276.610899c2.560412,-3.446233 7.301915,-4.054392 10.526137,-1.317677c3.224222,2.736715 3.793202,7.804705 1.232791,11.250938l-205.496739,276.610899c-1.517281,2.027196 -3.698372,3.040794 -5.879464,3.040794z"/>
<path stroke="null" id="svg_13" fill="#0276F7" d="m509.913752,579.708306c-1.422451,0 -2.750072,-0.405439 -4.077693,-1.216318c-3.508712,-2.432635 -4.457013,-7.297906 -2.275921,-11.048218l144.14169,-239.310492c2.275921,-3.750313 6.922594,-4.763911 10.336476,-2.432635c3.508712,2.432635 4.457013,7.297906 2.275921,11.048218l-144.14169,239.310492c-1.422451,2.331275 -3.793202,3.648953 -6.258784,3.648953zm-2.465582,-157.513132c-1.043131,0 -2.086261,-0.20272 -3.129392,-0.709519c-3.793202,-1.824476 -5.405313,-6.588387 -3.698372,-10.642779l84.398753,-198.158413c1.706941,-4.054392 6.069124,-5.777509 9.957156,-3.953032c3.793202,1.824476 5.405313,6.588387 3.698372,10.642779l-84.303923,198.158413c-1.327621,2.939434 -4.077693,4.662551 -6.922594,4.662551z"/>
<path stroke="null" id="svg_14" fill="#0276F7" d="m591.846924,375.062866c-2.750072,0 -5.405313,-1.621757 -6.732934,-4.459831c-1.801771,-3.953032 -0.28449,-8.716943 3.413882,-10.642779l129.253371,-67.302908l-365.759539,-178.089172l20.862613,208.091673l133.994874,-64.262114c3.698372,-1.824476 8.155385,0 9.862326,4.054392c1.706941,4.054392 0,8.716943 -3.793202,10.541419l-143.38305,68.823305c-2.181091,1.013598 -4.646673,0.912238 -6.827764,-0.405439c-2.086261,-1.317677 -3.413882,-3.547593 -3.698372,-6.081588l-23.328195,-233.026185c-0.28449,-2.838074 0.853471,-5.676149 3.034562,-7.297906c2.181091,-1.621757 5.025993,-2.027196 7.491575,-0.810878l392.217126,190.961867c2.655242,1.317677 4.362183,4.054392 4.362183,7.196546c0,3.142154 -1.612111,5.980228 -4.172523,7.297906l-143.57271,74.600814c-1.043131,0.608159 -2.181091,0.810878 -3.224222,0.810878zm-283.921198,78.959286c-3.603542,0 -6.827764,-2.838074 -7.396745,-6.791107c-0.56898,-4.358471 2.181091,-8.412864 6.258784,-9.122382l199.617275,-31.826978c4.077693,-0.608159 7.870895,2.331275 8.534705,6.689747c0.56898,4.358471 -2.181091,8.412864 -6.258784,9.122382l-199.617275,31.826978c-0.47415,0.10136 -0.853471,0.10136 -1.137961,0.10136z"/>
</g>
<text stroke="null" font-style="italic" transform="matrix(6.577099502228161,0,0,7.449448263868419,-1073.2057632249744,-908.8606073938396) " xml:space="preserve" text-anchor="start" font-family="Arvo, sans-serif" font-size="24" id="svg_16" y="177.898525" x="178.621382" stroke-width="0" fill="#D4E4FC">5G</text>
</g>
</svg>

After

Width:  |  Height:  |  Size: 7.9 KiB

View File

@@ -1,7 +1,7 @@
// load the Wiregasm library
importScripts(
'/wiregasm/wiregasm_new.js', // self-compilation es5
'/wiregasm/wiregasm_load.js'
'wiregasm_new.js', // self-compilation es5
'wiregasm_load.js'
// 'https://cdn.jsdelivr.net/npm/@goodtools/wiregasm/dist/wiregasm.js'
);
@@ -16,11 +16,11 @@ const fetchPackages = async () => {
console.log('Fetching packages');
let [wasmBuffer, dataBuffer] = await Promise.all([
await inflateRemoteBuffer(
'/wiregasm/wiregasm.wasm'
'wiregasm.wasm'
// 'https://cdn.jsdelivr.net/npm/@goodtools/wiregasm/dist/wiregasm.wasm'
),
await inflateRemoteBuffer(
'/wiregasm/wiregasm.data'
'wiregasm.data'
// 'https://cdn.jsdelivr.net/npm/@goodtools/wiregasm/dist/wiregasm.data'
),
]);

View File

@@ -1,22 +1,51 @@
<script setup lang="ts">
import { ConfigProvider } from 'ant-design-vue/lib';
import { usePrimaryColor } from '@/hooks/useTheme';
import zhCN from 'ant-design-vue/lib/locale/zh_CN';
import enUS from 'ant-design-vue/lib/locale/en_US';
import { onBeforeMount, ref, watch } from 'vue';
import { message } from 'ant-design-vue/es';
import zhCN from 'ant-design-vue/es/locale/zh_CN';
import enUS from 'ant-design-vue/es/locale/en_US';
import { usePrefersColorScheme, viewTransitionTheme } from 'antdv-pro-layout';
import dayjs from 'dayjs';
import advancedFormat from 'dayjs/plugin/advancedFormat';
import 'dayjs/locale/zh-cn';
import { ref, watch } from 'vue';
import useLayoutStore from '@/store/modules/layout';
import useAppStore from '@/store/modules/app';
import useI18n from '@/hooks/useI18n';
import { CACHE_LOCAL_PROCONFIG } from './constants/cache-keys-constants';
import { localRemove } from './utils/cache-local-utils';
const { t, currentLocale } = useI18n();
const appStore = useAppStore();
const { themeConfig, initPrimaryColor, changeConf } = useLayoutStore();
dayjs.extend(advancedFormat);
dayjs.locale('zh-cn'); // 默认中文
usePrimaryColor(); // 载入用户自定义主题色
// dayjs.locale('zh-cn'); // 默认中文
let locale = ref(enUS); // 国际化初始中文
let locale = ref(zhCN); // 国际化初始中文
// 偏好设置
const colorScheme = usePrefersColorScheme();
watch(
() => colorScheme.value,
themeMode => {
viewTransitionTheme(() => {
changeConf('theme', themeMode);
});
}
);
onBeforeMount(() => {
// 全局message提示
message.config({
top: '100px', // 距离顶部位置100px
duration: 3,
maxCount: 15,
});
initPrimaryColor();
localRemove(CACHE_LOCAL_PROCONFIG);
// 输出应用版本号
const appStore = useAppStore();
console.info(
`%c ${t('common.desc')} %c ${appStore.appCode} - ${appStore.appVersion} `,
'color: #fadfa3; background: #030307; padding: 4px 0;',
'color: #030307; background: #fadfa3; padding: 4px 0;'
);
});
// 国际化切换语言
function fnChangeLocale(v: string) {
@@ -37,26 +66,18 @@ fnChangeLocale(currentLocale.value);
watch(currentLocale, val => {
fnChangeLocale(val);
});
// 输出应用版本号
console.info(
`%c ${t('common.title')} %c ${appStore.appCode} - ${appStore.appVersion} `,
'color: #fadfa3; background: #030307; padding: 4px 0;',
'color: #030307; background: #fadfa3; padding: 4px 0;'
);
</script>
<template>
<ConfigProvider :locale="locale">
<a-config-provider :theme="themeConfig" :locale="locale">
<RouterView />
</ConfigProvider>
</a-config-provider>
</template>
<style lang="css">
#app {
height: 100%;
}
body .ant-pro-basicLayout {
display: flex;
flex-direction: column;
@@ -86,56 +107,23 @@ body .ant-pro-basicLayout {
transform: translate(-2em, 0);
}
/**强制改表格边距 */
.ant-table.ant-table-small .ant-table-tbody > tr > td,
.ant-table.ant-table-small .ant-table-thead > tr > th {
padding: 6px !important;
::view-transition-old(root),
::view-transition-new(root) {
animation: none;
mix-blend-mode: normal;
}
/** ==== 表格头按钮区域 S === **/
/* 默认 */
.button-container {
display: flex;
flex-wrap: wrap;
justify-content: flex-start;
align-items: center;
[data-theme='dark']::view-transition-old(root) {
z-index: 1;
}
[data-theme='dark']::view-transition-new(root) {
z-index: 999;
}
.button-container > button,
.button-container > span {
margin-right: 12px;
margin-bottom: 12px;
::view-transition-old(root) {
z-index: 999;
}
.button-container > button:last-child,
.button-container > span:last-child {
margin-right: 0;
::view-transition-new(root) {
z-index: 1;
}
/* 平板端 */
@media (max-width: 992px) {
.button-container {
flex-direction: row;
align-items: flex-start;
align-items: left;
}
.button-container > button,
.button-container > span {
margin-right: 12px;
margin-bottom: 12px;
}
}
/* 手机端 */
@media (max-width: 576px) {
.button-container {
flex-direction: column;
align-items: flex-start;
align-items: left;
}
.button-container > button,
.button-container > span {
margin-right: 0px;
margin-bottom: 12px;
}
}
/** ==== 表格头按钮区域 E === **/
</style>

View File

@@ -1,7 +1,7 @@
import { RESULT_CODE_SUCCESS } from '@/constants/result-constants';
import { request } from '@/plugins/http-fetch';
import { parseObjLineToHump } from '@/utils/parse-utils';
import { parseDateToStr } from '@/utils/date-utils';
import { parseDateToStr, YYYY_MM_DD_HH_MM_SS } from '@/utils/date-utils';
import useUserStore from '@/store/modules/user';
/**
@@ -122,7 +122,7 @@ export function updateConfirm(data: Record<string, any>) {
const userName = useUserStore().userName;
let finalData = {
alarm: {
ack_time: parseDateToStr(time),
ack_time: parseDateToStr(time, YYYY_MM_DD_HH_MM_SS),
ack_user: userName,
ack_state: '1',
},
@@ -145,7 +145,7 @@ export function cancelConfirm(data: (string | number)[]) {
const userName = useUserStore().userName;
let finalData = {
alarm: {
ack_time: parseDateToStr(time),
ack_time: parseDateToStr(time, YYYY_MM_DD_HH_MM_SS),
ack_user: '',
ack_state: '0',
},
@@ -211,12 +211,12 @@ export function getPass() {
* @param data 鉴权对象
* @returns object
*/
export function clearAlarm(data: Record<string, any>) {
export function clearAlarm2(data: Record<string, any>) {
var time = new Date();
const userName = useUserStore().userName;
let finalData = {
data: {
clear_time: parseDateToStr(time),
clear_time: parseDateToStr(time, YYYY_MM_DD_HH_MM_SS),
clear_type: '2',
alarm_status: '0',
clear_user: userName,
@@ -232,6 +232,19 @@ export function clearAlarm(data: Record<string, any>) {
});
}
/**
* 清除告警信息
* @param ids 记录ID
* @returns object
*/
export function clearAlarm(ids: string[]) {
return request({
url: `/neData/alarm/clear`,
method: 'PUT',
data: { ids },
});
}
/**
* 手工同步
* @param data 鉴权对象
@@ -360,3 +373,137 @@ export async function top3Sel(filterFlag?: string) {
}
return result;
}
export async function alarmDashGetAct() {
let totalSQL = `select count(*) as total from alarm where alarm_status='1' `;
let rowsSQL = `select ne_type,alarm_id,alarm_title,orig_severity,event_time from alarm WHERE alarm_status='1' and orig_severity!='Event' order by event_time desc limit 0,10 `;
// 查询
// 发起请求
const result = await request({
url: `/api/rest/databaseManagement/v1/select/omc_db/alarm`,
method: 'get',
params: {
SQL: totalSQL,
rowsSQL: rowsSQL,
},
});
// 解析数据
if (result.code === RESULT_CODE_SUCCESS) {
const data: DataList = {
total: 0,
rows: [],
code: result.code,
msg: result.msg,
};
result.data.data.forEach((item: any) => {
const itemData = item['alarm'];
if (Array.isArray(itemData)) {
if (itemData.length === 1 && itemData[0]['total'] >= 0) {
data.total = itemData[0]['total'];
} else {
data.rows = itemData.map(v => parseObjLineToHump(v));
}
}
});
return data;
}
return result;
}
export async function alarmDashGetHis() {
let totalSQL = `select count(*) as total from alarm where alarm_status='0' `;
let rowsSQL = `select ne_type,alarm_id,alarm_title,orig_severity,event_time from alarm WHERE alarm_status='0' and orig_severity!='Event' order by event_time desc limit 0,10 `;
// 查询
// 发起请求
const result = await request({
url: `/api/rest/databaseManagement/v1/select/omc_db/alarm`,
method: 'get',
params: {
SQL: totalSQL,
rowsSQL: rowsSQL,
},
});
// 解析数据
if (result.code === RESULT_CODE_SUCCESS) {
const data: DataList = {
total: 0,
rows: [],
code: result.code,
msg: result.msg,
};
result.data.data.forEach((item: any) => {
const itemData = item['alarm'];
if (Array.isArray(itemData)) {
if (itemData.length === 1 && itemData[0]['total'] >= 0) {
data.total = itemData[0]['total'];
} else {
data.rows = itemData.map(v => parseObjLineToHump(v));
}
}
});
return data;
}
return result;
}
export async function getAlarmTrend(params: any) {
const days = Number(params.days || 1);
let groupFormat = days === 1 ? '%H:00' : '%Y-%m-%d';
let timeCondition = days === 1
? `event_time >= DATE_SUB(NOW(), INTERVAL 1 DAY)`
: `event_time >= DATE_SUB(CURDATE(), INTERVAL ${days} DAY)`;
let totalSQL = `select count(*) as total from alarm where alarm_status='0' `;
let rowsSQL = ` SELECT
DATE_FORMAT(event_time, '${groupFormat}') AS time,
SUM(CASE WHEN orig_severity='Critical' THEN 1 ELSE 0 END) AS Critical,
SUM(CASE WHEN orig_severity='Major' THEN 1 ELSE 0 END) AS Major,
SUM(CASE WHEN orig_severity='Minor' THEN 1 ELSE 0 END) AS Minor,
SUM(CASE WHEN orig_severity='Warning' THEN 1 ELSE 0 END) AS Warning
FROM alarm
WHERE alarm_status='0'
AND ${timeCondition}
GROUP BY time
ORDER BY time ASC `;
// 查询
// 发起请求
const result = await request({
url: `/api/rest/databaseManagement/v1/select/omc_db/alarm`,
method: 'get',
params: {
SQL: totalSQL,
rowsSQL: rowsSQL,
},
});
// 解析数据
if (result.code === RESULT_CODE_SUCCESS) {
const data: DataList = {
total: 0,
rows: [],
code: result.code,
msg: result.msg,
};
result.data.data.forEach((item: any) => {
const itemData = item['alarm'];
if (Array.isArray(itemData)) {
if (itemData.length === 1 && itemData[0]['total'] >= 0) {
data.total = itemData[0]['total'];
} else {
data.rows = itemData.map(v => parseObjLineToHump(v));
}
}
});
return data;
}
return result;
}

View File

@@ -1,8 +1,6 @@
import { RESULT_CODE_SUCCESS } from '@/constants/result-constants';
import { request } from '@/plugins/http-fetch';
import { parseObjLineToHump } from '@/utils/parse-utils';
import { parseDateToStr } from '@/utils/date-utils';
import useUserStore from '@/store/modules/user';
/**
* 查询列表

View File

@@ -63,7 +63,11 @@ export async function getAlarmSet() {
}
}
if (Object.keys(resultData).length === 0) {
return { code: RESULT_CODE_ERROR, msg: RESULT_MSG_ERROR[language], data: {} };
return {
code: RESULT_CODE_ERROR,
msg: RESULT_MSG_ERROR[language],
data: {},
};
}
return {
code: RESULT_CODE_SUCCESS,
@@ -117,7 +121,11 @@ export async function updateAlarmSet(data: Record<string, any>) {
}
// 无变更时
if (resultNum === 0) {
return { code: RESULT_CODE_ERROR, msg: RESULT_MSG_ERROR[language], data: 0 };
return {
code: RESULT_CODE_ERROR,
msg: RESULT_MSG_ERROR[language],
data: 0,
};
}
return {
code: RESULT_CODE_SUCCESS,
@@ -166,11 +174,10 @@ export async function getForwardSet() {
*/
export async function updateForwardSet(data: Record<string, any>) {
// return false;
console.log(data)
let obj:any=[
{interface:"Email",to_user:data.emailObj},
{interface:"SMS",to_user:data.smsObj}
]
let obj: any = [
{ interface: 'Email', to_user: data.emailObj },
{ interface: 'SMS', to_user: data.smsObj },
];
const result = await request({
url: `/api/rest/databaseManagement/v1/omc_db/config?WHERE=config_tag='forwardAlarm'`,
method: 'put',

View File

@@ -1,7 +1,7 @@
import { RESULT_CODE_SUCCESS } from '@/constants/result-constants';
import { request } from '@/plugins/http-fetch';
import { parseObjLineToHump } from '@/utils/parse-utils';
import { parseDateToStr } from '@/utils/date-utils';
import { parseDateToStr, YYYY_MM_DD_HH_MM_SS } from '@/utils/date-utils';
import useUserStore from '@/store/modules/user';
/**
@@ -79,7 +79,7 @@ export function updateConfirm(data: Record<string, any>) {
const userName = useUserStore().userName;
let finalData = {
alarm: {
ack_time: parseDateToStr(time),
ack_time: parseDateToStr(time, YYYY_MM_DD_HH_MM_SS),
ack_user: userName,
ack_state: '1',
},
@@ -101,7 +101,7 @@ export function cancelConfirm(data: (string | number)[]) {
var time = new Date();
let finalData = {
alarm: {
ack_time: parseDateToStr(time),
ack_time: parseDateToStr(time, YYYY_MM_DD_HH_MM_SS),
ack_user: '',
ack_state: '0',
},

View File

@@ -1,3 +1,5 @@
import { CACHE_SESSION_CRYPTO_API } from '@/constants/cache-keys-constants';
import { sessionGet } from '@/utils/cache-session-utils';
import { request } from '@/plugins/http-fetch';
/**
@@ -51,3 +53,43 @@ export function delFile(query: Record<string, any>) {
params: query,
});
}
/**
* 更新FTP信息
* @param data 数据
* @returns object
*/
export function updateFTPInfo(data: Record<string, any>) {
return request({
url: `/lm/table/ftp`,
method: 'post',
data: data,
crypto: sessionGet(CACHE_SESSION_CRYPTO_API) !== 'false',
});
}
/**
* 获取FTP信息
* @param data 数据
* @returns object
*/
export function getFTPInfo() {
return request({
url: `/lm/table/ftp`,
method: 'get',
crypto: sessionGet(CACHE_SESSION_CRYPTO_API) !== 'false',
});
}
/**
* 发送FTP文件
* @param data 数据
* @returns object
*/
export function putFTPInfo(filePath: string, fileName: string) {
return request({
url: `/lm/table/ftp`,
method: 'put',
data: { filePath, fileName },
});
}

View File

@@ -1,3 +1,5 @@
import { CACHE_SESSION_CRYPTO_API } from '@/constants/cache-keys-constants';
import { sessionGet } from '@/utils/cache-session-utils';
import { request } from '@/plugins/http-fetch';
// 登录方法
@@ -7,7 +9,7 @@ export function login(data: Record<string, string>) {
method: 'post',
data: data,
whithToken: false,
crypto: true,
crypto: sessionGet(CACHE_SESSION_CRYPTO_API) !== 'false',
});
}
@@ -22,7 +24,7 @@ export function register(data: Record<string, any>) {
method: 'post',
data: data,
whithToken: false,
crypto: true,
crypto: sessionGet(CACHE_SESSION_CRYPTO_API) !== 'false',
});
}
@@ -59,3 +61,69 @@ export function getCaptchaImage() {
whithToken: false,
});
}
/**
* 登录认证源
* @returns object
*/
export function getLoginSource() {
return request({
url: '/auth/login/source',
method: 'GET',
whithToken: false,
});
}
/**
* LDAP登录
* @returns object
*/
export function loginLDAP(data: Record<string, string>) {
return request({
url: '/auth/login/ldap',
method: 'POST',
data: data,
whithToken: false,
});
}
/**
* SMTP登录
* @returns object
*/
export function loginSMTP(data: Record<string, string>) {
return request({
url: '/auth/login/smtp',
method: 'POST',
data: data,
whithToken: false,
});
}
/**
* 登录认证源OAuth2跳转登录URL
* @returns object
*/
export function loginOAuth2URL(state: string): string {
// 兼容旧前端可改配置文件
const baseUrl = import.meta.env.PROD
? sessionGet('baseUrl') || import.meta.env.VITE_API_BASE_URL
: import.meta.env.VITE_API_BASE_URL;
return `${baseUrl}/auth/login/oauth2/authorize?state=${state}`;
}
/**
* 登录认证源OAuth2认证登录
* @returns object
*/
export function loginOAuth2Token(code: string, state: string) {
return request({
url: '/auth/login/oauth2/token',
method: 'POST',
data: {
code,
state,
},
whithToken: false,
});
}

View File

@@ -5,10 +5,11 @@ import { request } from '@/plugins/http-fetch';
* @param query 查询参数
* @returns object
*/
export function getAllNeConfig(neType: string) {
export function getAllNeConfig(neType: string, neId: string) {
return request({
url: `/ne/config/list/${neType}`,
method: 'get',
params: { neId },
timeout: 60_000,
});
}

View File

@@ -1,3 +1,5 @@
import { CACHE_SESSION_CRYPTO_API } from '@/constants/cache-keys-constants';
import { sessionGet } from '@/utils/cache-session-utils';
import { request } from '@/plugins/http-fetch';
/**
@@ -36,7 +38,7 @@ export function addNeInfo(data: Record<string, any>) {
url: `/ne/info`,
method: 'post',
data: data,
crypto: true,
crypto: sessionGet(CACHE_SESSION_CRYPTO_API) !== 'false',
timeout: 30_000,
});
}
@@ -51,7 +53,7 @@ export function updateNeInfo(data: Record<string, any>) {
url: `/ne/info`,
method: 'put',
data: data,
crypto: true,
crypto: sessionGet(CACHE_SESSION_CRYPTO_API) !== 'false',
timeout: 30_000,
});
}

View File

@@ -10,6 +10,7 @@ export function listAMFDataUE(query: Record<string, any>) {
url: '/neData/amf/ue/list',
method: 'get',
params: query,
timeout: 60_000,
});
}
@@ -37,6 +38,93 @@ export function exportAMFDataUE(data: Record<string, any>) {
method: 'post',
data,
responseType: 'blob',
timeout: 180_000,
});
}
/**
* AMF-接入基站信息列表
* @param query 查询参数 neId=001&id=1
* @returns object
*/
export function listAMFNblist(query: Record<string, any>) {
return request({
url: '/neData/amf/nb/list',
method: 'get',
params: query,
timeout: 60_000,
});
}
/**
* AMF-接入基站状态信息列表
* @param query 查询参数 neId=001&state=1
* @returns object
*/
export function listAMFNbStatelist(query: Record<string, any>) {
return request({
url: '/neData/amf/nb/list-cfg',
method: 'get',
params: query,
timeout: 60_000,
});
}
/**
* AMF-接入基站状态信息新增
* @param neId 网元ID
* @param data 数据 { "index": 1, "name": "Gnb", "address": "192.168.8.1", "position": "Area-B" }
* @returns object
*/
export function addAMFNbState(neId: string, data: Record<string, any>) {
return request({
url: `/ne/config/data`,
method: 'post',
data: {
neType: 'AMF',
neId: neId,
paramName: 'gnbList',
paramData: data,
loc: `${data.index}`,
},
});
}
/**
* AMF-接入基站状态信息修改
* @param neId 网元ID
* @param data 数据 { "index": 1, "name": "Gnb", "address": "192.168.8.1", "position": "Area-B" }
* @returns object
*/
export function editAMFNbState(neId: string, data: Record<string, any>) {
return request({
url: `/ne/config/data`,
method: 'put',
data: {
neType: 'AMF',
neId: neId,
paramName: 'gnbList',
paramData: data,
loc: `${data.index}`,
},
});
}
/**
* AMF-接入基站状态信息删除
* @param neId 网元ID
* @param index 数据index
* @returns object
*/
export function delAMFNbState(neId: string, index: string | number) {
return request({
url: `/ne/config/data`,
method: 'delete',
params: {
neType: 'AMF',
neId: neId,
paramName: 'gnbList',
loc: `${index}`,
},
});
}

68
src/api/neData/backup.ts Normal file
View File

@@ -0,0 +1,68 @@
import { request } from '@/plugins/http-fetch';
/**
* 备份文件-获取FTP配置
* @returns object
*/
export function getBackupFTP() {
return request({
url: '/neData/backup/ftp',
method: 'GET',
});
}
/**
* 备份文件-文件FTP发送
* @param data 对象
* @returns object
*/
export function pushBackupFTP(data: Record<string, any>) {
return request({
url: '/neData/backup/ftp',
method: 'POST',
data,
});
}
/**
* 备份文件-更新FTP配置
* @param data 对象
* @returns object
*/
export function updateBackupFTP(data: Record<string, any>) {
return request({
url: '/neData/backup/ftp',
method: 'PUT',
data,
});
}
/**
* 备份文件-导出OMC
* @returns object
*/
export function exportBackupOMC() {
return request({
url: '/neData/backup/export-omc',
method: 'POST',
responseType: 'blob',
timeout: 180_000,
});
}
/**
* 备份文件-导入OMC
* @param filePath 备份文件上传返回的/upload 路径
* @returns object
*/
export function importBackupOMC(filePath: string) {
return request({
url: '/neData/backup/import-omc',
method: 'POST',
data: {
neType: 'OMC',
path: filePath,
},
timeout: 180_000,
});
}

View File

@@ -10,6 +10,7 @@ export function listIMSDataCDR(query: Record<string, any>) {
url: '/neData/ims/cdr/list',
method: 'get',
params: query,
timeout: 60_000,
});
}
@@ -37,6 +38,6 @@ export function exportIMSDataCDR(data: Record<string, any>) {
method: 'post',
data,
responseType: 'blob',
timeout: 60_000,
timeout: 180_000,
});
}

148
src/api/neData/ims_sub.ts Normal file
View File

@@ -0,0 +1,148 @@
import { request } from '@/plugins/http-fetch';
/**
* UDM签约用户重载数据
* @param neId 网元ID
* @returns object
*/
export function resetIMSSub(neId: string) {
return request({
url: `/ue/udm/imsuser/resetData/${neId}`,
method: 'put',
timeout: 180_000,
});
}
/**
* UDM签约用户列表
* @param query 查询参数
* @returns object
*/
export function listIMSSub(query: Record<string, any>) {
return request({
url: '/ue/udm/imsuser/list',
method: 'get',
params: query,
timeout: 30_000,
});
}
/**
* UDM签约用户信息
* @param neId 网元ID
* @param imsi IMSI
* @returns object
*/
export function getIMSSub(neId: string, imsi: string) {
return request({
url: `/ue/udm/imsuser/${neId}/${imsi}`,
method: 'get',
});
}
/**
* UDM签约用户新增
* @param data 签约对象
* @returns object
*/
export function addIMSSub(data: Record<string, any>) {
return request({
url: `/ue/udm/imsuser/${data.neId}`,
method: 'post',
data: data,
timeout: 180_000,
});
}
/**
* UDM签约用户批量新增
* @param data 签约对象
* @param num 数量
* @returns object
*/
export function batchAddIMSSub(data: Record<string, any>, num: number) {
return request({
url: `/ue/udm/imsuser/${data.neId}/${num}`,
method: 'post',
data: data,
timeout: 180_000,
});
}
/**
* UDM签约用户修改
* @param data 签约对象
* @returns object
*/
// export function updateIMSSub(data: Record<string, any>) {
// return request({
// url: `/ue/udm/imsuser/${data.neId}`,
// method: 'put',
// data: data,
// timeout: 180_000,
// });
// }
/**
* UDM签约用户删除
* @param data 签约对象
* @returns object
*/
export function delIMSSub(neId: string, imsi_msisdn: string, tag: string) {
return request({
url: `/ue/udm/imsuser/${neId}/${imsi_msisdn}`,
method: 'delete',
params: { volte: tag },
timeout: 180_000,
});
}
/**
* UDM签约用户批量删除
* @param neId 网元ID
* @param imsi IMSI
* @param num 数量
* @returns object
*/
export function batchDelIMSSub(
neId: string,
imsi: string,
num: number,
tag: string
) {
return request({
url: `/ue/udm/imsuser/${neId}/${imsi}/${num}`,
method: 'delete',
params: { volte: tag },
timeout: 180_000,
});
}
/**
* UDM签约用户导出
* @param data 数据参数
* @returns bolb
*/
export function exportIMSSub(data: Record<string, any>) {
return request({
url: '/ue/udm/imsuser/export',
method: 'post',
data,
responseType: 'blob',
timeout: 180_000,
});
}
/**
* UDM签约用户导入
* @param data 表单数据对象
* @returns object
*/
export function importIMSSub(data: Record<string, any>) {
return request({
url: `/ue/udm/imsuser/import`,
method: 'post',
data,
timeout: 180_000,
});
}

View File

@@ -10,6 +10,7 @@ export function listMMEDataUE(query: Record<string, any>) {
url: '/neData/mme/ue/list',
method: 'get',
params: query,
timeout: 60_000,
});
}
@@ -37,6 +38,93 @@ export function exportMMEDataUE(data: Record<string, any>) {
method: 'post',
data,
responseType: 'blob',
timeout: 180_000,
});
}
/**
* MME-接入基站信息列表
* @param query 查询参数 neId=001&id=1
* @returns object
*/
export function listMMENblist(query: Record<string, any>) {
return request({
url: '/neData/mme/nb/list',
method: 'get',
params: query,
timeout: 60_000,
});
}
/**
* MME-接入基站状态信息列表
* @param query 查询参数 neId=001&state=1
* @returns object
*/
export function listMMENbStatelist(query: Record<string, any>) {
return request({
url: '/neData/mme/nb/list-cfg',
method: 'get',
params: query,
timeout: 60_000,
});
}
/**
* MME-接入基站状态信息新增
* @param neId 网元ID
* @param data 数据 { "index": 1, "name": "Enb", "address": "192.168.8.1", "position": "Area-B" }
* @returns object
*/
export function addMMENbState(neId: string, data: Record<string, any>) {
return request({
url: `/ne/config/data`,
method: 'post',
data: {
neType: 'MME',
neId: neId,
paramName: 'enbList',
paramData: data,
loc: `${data.index}`,
},
});
}
/**
* MME-接入基站状态信息修改
* @param neId 网元ID
* @param data 数据 { "index": 1, "name": "Enb", "address": "192.168.8.1", "position": "Area-B" }
* @returns object
*/
export function editMMENbState(neId: string, data: Record<string, any>) {
return request({
url: `/ne/config/data`,
method: 'put',
data: {
neType: 'MME',
neId: neId,
paramName: 'enbList',
paramData: data,
loc: `${data.index}`,
},
});
}
/**
* MME-接入基站状态信息删除
* @param neId 网元ID
* @param index 数据index
* @returns object
*/
export function delMMENbState(neId: string, index: string | number) {
return request({
url: `/ne/config/data`,
method: 'delete',
params: {
neType: 'MME',
neId: neId,
paramName: 'enbList',
loc: `${index}`,
},
});
}

View File

@@ -0,0 +1,30 @@
import { request } from '@/plugins/http-fetch';
/**
* 历史记录列表
* @param query 查询参数
* @returns object
*/
export function listNBState(query: Record<string, any>) {
return request({
url: '/neData/nb-state/list',
method: 'get',
params: query,
timeout: 60_000,
});
}
/**
* 历史记录列表导出
* @param data 查询列表条件
* @returns object
*/
export function exportNBState(data: Record<string, any>) {
return request({
url: '/neData/nb-state/export',
method: 'post',
data,
responseType: 'blob',
timeout: 180_000,
});
}

43
src/api/neData/sgwc.ts Normal file
View File

@@ -0,0 +1,43 @@
import { request } from '@/plugins/http-fetch';
/**
* 查询SGWC-CDR会话事件
* @param query 查询参数
* @returns object
*/
export function listSGWCDataCDR(query: Record<string, any>) {
return request({
url: '/neData/sgwc/cdr/list',
method: 'get',
params: query,
timeout: 60_000,
});
}
/**
* SGWC-CDR会话删除
* @param id 信息ID
* @returns object
*/
export function delSGWCDataCDR(cdrIds: string | number) {
return request({
url: `/neData/sgwc/cdr/${cdrIds}`,
method: 'delete',
timeout: 60_000,
});
}
/**
* SGWC-CDR会话列表导出
* @param data 查询列表条件
* @returns object
*/
export function exportSGWCDataCDR(data: Record<string, any>) {
return request({
url: '/neData/sgwc/cdr/export',
method: 'post',
data,
responseType: 'blob',
timeout: 180_000,
});
}

View File

@@ -10,6 +10,7 @@ export function listSMFDataCDR(query: Record<string, any>) {
url: '/neData/smf/cdr/list',
method: 'get',
params: query,
timeout: 60_000,
});
}
@@ -37,7 +38,20 @@ export function exportSMFDataCDR(data: Record<string, any>) {
method: 'post',
data,
responseType: 'blob',
timeout: 60_000,
timeout: 180_000,
});
}
/**
* SMF-在线订阅用户数量
* @param query 查询参数
* @returns object
*/
export function listSMFSubNum(neId: string) {
return request({
url: '/neData/smf/sub/num',
method: 'get',
params: { neId },
});
}
@@ -46,9 +60,9 @@ export function exportSMFDataCDR(data: Record<string, any>) {
* @param query 查询参数
* @returns object
*/
export function listSMFSubscribers(query: Record<string, any>) {
export function listSMFSubList(query: Record<string, any>) {
return request({
url: '/neData/smf/subscribers',
url: '/neData/smf/sub/list',
method: 'get',
params: query,
});

View File

@@ -10,6 +10,7 @@ export function listSMSCDataCDR(query: Record<string, any>) {
url: '/neData/smsc/cdr/list',
method: 'get',
params: query,
timeout: 60_000,
});
}
@@ -37,6 +38,6 @@ export function exportSMSCDataCDR(data: Record<string, any>) {
method: 'post',
data,
responseType: 'blob',
timeout: 60_000,
timeout: 180_000,
});
}

View File

@@ -23,6 +23,7 @@ export function listUDMAuth(query: Record<string, any>) {
url: '/neData/udm/auth/list',
method: 'get',
params: query,
timeout: 30_000,
});
}
@@ -139,3 +140,17 @@ export function exportUDMAuth(data: Record<string, any>) {
timeout: 180_000,
});
}
/**
* UDM鉴权用户导出DecAuth
* @param neId 网元ID
* @returns bolb
*/
export function exportUDMDecAuth(neId: string) {
return request({
url: `/neData/udm/auth/export-dec?neId=${neId}`,
method: 'get',
responseType: 'blob',
timeout: 180_000,
});
}

View File

@@ -23,6 +23,7 @@ export function listUDMSub(query: Record<string, any>) {
url: '/neData/udm/sub/list',
method: 'get',
params: query,
timeout: 30_000,
});
}

142
src/api/neData/voip_auth.ts Normal file
View File

@@ -0,0 +1,142 @@
import { request } from '@/plugins/http-fetch';
/**
* UDM鉴权用户重载数据
* @param neId 网元ID
* @returns object
*/
export function resetUDMAuth(neId: string) {
return request({
url: `/ue/udm/voipauth/resetData/${neId}`,
method: 'put',
timeout: 180_000,
});
}
/**
* UDM鉴权用户列表
* @param query 查询参数
* @returns object
*/
export function listUDMAuth(query: Record<string, any>) {
return request({
url: '/ue/udm/voipauth/list',
method: 'get',
params: query,
timeout: 30_000,
});
}
/**
* UDM鉴权用户信息
* @param neId 网元ID
* @param userName 用户名
* @returns object
*/
export function getUDMAuth(neId: string, userName: string) {
return request({
url: `/ue/udm/voipauth/${neId}/${userName}`,
method: 'get',
});
}
/**
* UDM鉴权用户新增
* @param data 鉴权对象
* @returns object
*/
export function addUDMAuth(data: Record<string, any>) {
return request({
url: `/ue/udm/voipauth/${data.neId}`,
method: 'post',
data: data,
timeout: 180_000,
});
}
/**
* UDM鉴权用户批量新增
* @param data 鉴权对象
* @param num 数量
* @returns object
*/
export function batchAddUDMAuth(data: Record<string, any>, num: number) {
return request({
url: `/ue/udm/voipauth/${data.neId}/${num}`,
method: 'post',
data: data,
timeout: 180_000,
});
}
/**
* UDM鉴权用户修改
* @param data 鉴权对象
* @returns object
*/
export function updateUDMAuth(data: Record<string, any>) {
return request({
url: `/ue/udm/voipauth/${data.neId}`,
method: 'put',
data: data,
timeout: 180_000,
});
}
/**
* UDM鉴权用户删除
* @param neId 网元ID
* @param imsi IMSI
* @returns object
*/
export function delUDMAuth(neId: string, imsi: string) {
return request({
url: `/ue/udm/voipauth/${neId}/${imsi}`,
method: 'delete',
timeout: 180_000,
});
}
/**
* UDM鉴权用户批量删除
* @param neId 网元ID
* @param imsi IMSI
* @param num 数量
* @returns object
*/
export function batchDelUDMAuth(neId: string, imsi: string, num: number) {
return request({
url: `/ue/udm/voipauth/${neId}/${imsi}/${num}`,
method: 'delete',
timeout: 180_000,
});
}
/**
* UDM鉴权用户导入
* @param data 表单数据对象
* @returns object
*/
export function importUDMAuth(data: Record<string, any>) {
return request({
url: `/ue/udm/voipauth/import`,
method: 'post',
data,
timeout: 180_000,
});
}
/**
* UDM鉴权用户导出
* @param data 数据参数
* @returns bolb
*/
export function exportUDMAuth(data: Record<string, any>) {
return request({
url: '/ue/udm/voipauth/export',
method: 'post',
data,
responseType: 'blob',
timeout: 180_000,
});
}

View File

@@ -0,0 +1,51 @@
import { CACHE_SESSION_CRYPTO_API } from '@/constants/cache-keys-constants';
import { sessionGet } from '@/utils/cache-session-utils';
import { request } from '@/plugins/http-fetch';
/**
* 获取下拉框数据
* @returns object
*/
export function getBakFile() {
return request({
url: '/ue/table/list',
method: 'get',
});
}
/**
* 获取对应类型的文件列表
* @param query 查询参数
* @returns object
*/
export function getBakFileList(query: Record<string, any>) {
return request({
url: '/ue/file/list',
method: 'get',
params: query,
});
}
/**
* 下载远端文件
* @param query 查询参数
* @returns object
*/
export function downFile(query: Record<string, any>) {
return request({
url: `/ue/file/${query.fileName}`,
method: 'get',
params: query,
responseType: 'blob',
timeout: 180_000,
});
}
/**
* 删除远端获取文件
* @param query 查询参数
* @returns object
*/
export function delFile(query: Record<string, any>) {
return request({
url: `/ue/file/${query.fileName}`,
method: 'delete',
params: query,
});
}

View File

@@ -21,12 +21,14 @@ export async function listUEInfoBySMF(query: Record<string, any>) {
};
// 解析数据
if (result.code === RESULT_CODE_SUCCESS && result.data) {
if (Array.isArray(result.data.data)) {
const rows = result.data.data;
data.total = rows.length;
data.rows = rows;
if (result.data.total && result.data.data) {
data.total = result.data.total;
data.rows = result.data.data;
} else {
Object.assign(data, result.data);
Object.assign(data, {
total: result.data.length,
rows: result.data,
});
}
}

View File

@@ -1,7 +1,4 @@
import { RESULT_CODE_SUCCESS } from '@/constants/result-constants';
import { request } from '@/plugins/http-fetch';
import { parseObjLineToHump } from '@/utils/parse-utils';
import { parseDateToStr } from '@/utils/date-utils';
/**
* 新 查询自定义指标数据
@@ -14,6 +11,7 @@ export async function listCustomData(query: Record<string, any>) {
url: `/pm/kpiC/report`,
method: 'get',
params: query,
timeout: 60_000,
});
return result;
}

View File

@@ -1,7 +1,4 @@
import { RESULT_CODE_SUCCESS } from '@/constants/result-constants';
import { request } from '@/plugins/http-fetch';
import { parseObjLineToHump } from '@/utils/parse-utils';
import { parseDateToStr } from '@/utils/date-utils';
/**
* 查询自定义指标

View File

@@ -110,78 +110,52 @@ export async function getKPITitle(neType: string) {
}
/**
* Todo 废弃
* 查询UPF上下行速率数据
* @param query 查询参数
* 查询黄金指标数据kpi.id转换title
* @param neType 网元类型
* @returns object
*/
export async function listUPFData(timeArr: any) {
const initTime: Date = new Date();
const twentyFourHoursAgo: Date = new Date(
initTime.getTime() - 10 * 60 * 1000
);
return await Promise.allSettled([
// 获取参数规则
request({
url: `/api/rest/databaseManagement/v1/select/omc_db/gold_kpi`,
method: 'get',
params: {
SQL: `SELECT gold_kpi.*,kpi_title.en_title FROM gold_kpi LEFT JOIN kpi_title on gold_kpi.kpi_id=kpi_title.kpi_id where 1=1 and gold_kpi.kpi_id ='UPF.03' AND timestamp BETWEEN DATE_SUB(NOW(), INTERVAL 10 MINUTE) AND NOW()`,
},
timeout: 60_000,
}),
// 获取对应信息
request({
url: `/api/rest/databaseManagement/v1/select/omc_db/gold_kpi`,
method: 'get',
params: {
SQL: `SELECT gold_kpi.*,kpi_title.en_title FROM gold_kpi LEFT JOIN kpi_title on gold_kpi.kpi_id=kpi_title.kpi_id where 1=1 and gold_kpi.kpi_id ='UPF.06' AND timestamp BETWEEN DATE_SUB(NOW(), INTERVAL 10 MINUTE) AND NOW()`,
},
timeout: 60_000,
}),
]).then(resArr => {
let upData: any = [];
let downData: any = [];
// 规则数据
if (resArr[0].status === 'fulfilled') {
const itemV: any = resArr[0].value;
// 解析数据
if (
itemV.code === RESULT_CODE_SUCCESS &&
Array.isArray(itemV.data?.data)
) {
let itemData = itemV.data.data;
let data = itemData[0]['gold_kpi'];
if (Array.isArray(data)) {
try {
upData = data.map(v => parseObjLineToHump(v));
} catch (error) {
console.error(error);
}
}
}
}
if (resArr[1].status === 'fulfilled') {
const itemV = resArr[1].value;
// 解析数据
if (
itemV.code === RESULT_CODE_SUCCESS &&
Array.isArray(itemV.data?.data)
) {
let itemData = itemV.data.data;
const data = itemData[0]['gold_kpi'];
if (Array.isArray(data)) {
try {
downData = data.map(v => parseObjLineToHump(v));
} catch (error) {
console.error(error);
}
}
}
}
return { upData, downData };
export async function getKPITitleList(query: Record<string, any>) {
return request({
url: '/neData/kpi/title/list',
method: 'get',
params: query,
});
}
/**
* 修改指标标题
* @param data 指标标题对象
* @returns object
*/
export function updateKPITitle(data: Record<string, any>) {
return request({
url: '/neData/kpi/title',
method: 'put',
data: data,
});
}
//忙时呼叫
export async function getbusyhour(query: Record<string, any>) {
return request({
url: '/neData/ims/kpi/busy-hour',
method: 'get',
params: query,
});
}
//MOS指标
export async function getMosHour(query: Record<string, any>) {
return request({
url: '/neData/ims/cdr/mos-hour',
method: 'get',
params: query,
});
}
//CCT指标
export async function getCctHour(query: Record<string, any>) {
return request({
url: '/neData/ims/cdr/cct-hour',
method: 'get',
params: query,
});
}

View File

@@ -1,7 +1,6 @@
import { RESULT_CODE_SUCCESS } from '@/constants/result-constants';
import { request } from '@/plugins/http-fetch';
import { parseObjLineToHump } from '@/utils/parse-utils';
import { parseDateToStr } from '@/utils/date-utils';
/**
* 查询任务列表

View File

@@ -0,0 +1,64 @@
import { request } from '@/plugins/http-fetch';
/**
* 查询登录源列表
* @param query 查询参数
* @returns object
*/
export function listLoginSource(query: Record<string, any>) {
return request({
url: '/system/login-source/list',
method: 'GET',
params: query,
});
}
/**
* 查询登录源详细
* @param id 登录源ID
* @returns object
*/
export function getLoginSource(id: string | number) {
return request({
url: `/system/login-source/${id}`,
method: 'GET',
});
}
/**
* 新增登录源
* @param data 登录源对象
* @returns object
*/
export function addLoginSource(data: Record<string, any>) {
return request({
url: '/system/login-source',
method: 'POST',
data: data,
});
}
/**
* 修改登录源
* @param data 登录源对象
* @returns object
*/
export function updateLoginSource(data: Record<string, any>) {
return request({
url: '/system/login-source',
method: 'PUT',
data: data,
});
}
/**
* 认证源删除
* @param id 登录源ID
* @returns object
*/
export function delLoginSource(id: string | number) {
return request({
url: `/system/login-source/${id}`,
method: 'DELETE',
});
}

99
src/api/system/tenant.ts Normal file
View File

@@ -0,0 +1,99 @@
import { request } from '@/plugins/http-fetch';
/**
* 查询部门列表
* @param query 查询参数
* @returns object
*/
export function listTenant(query: Record<string, any>) {
return request({
url: '/system/tenant/list',
method: 'get',
params: query,
});
}
/**
* 查询部门列表(排除节点)
* @param tenantId 部门ID
* @returns object
*/
export function listTenantExcludeChild(tenantId: string | number) {
return request({
url: `/system/tenant/list/exclude/${tenantId}`,
method: 'get',
});
}
/**
* 查询部门详细
* @param tenantId 部门ID
* @returns object
*/
export function getTenant(tenantId: string | number) {
return request({
url: `/system/tenant/${tenantId}`,
method: 'get',
});
}
/**
* 新增部门
* @param data 部门对象
* @returns object
*/
export function addTenant(data: Record<string, any>) {
return request({
url: '/system/tenant',
method: 'post',
data: data,
});
}
/**
* 修改部门
* @param data 部门对象
* @returns object
*/
export function updateTenant(data: Record<string, any>) {
return request({
url: '/system/tenant',
method: 'put',
data: data,
});
}
/**
* 删除部门
* @param TenantId 部门ID
* @returns object
*/
export function delTenant(TenantId: string | number) {
return request({
url: `/system/tenant/${TenantId}`,
method: 'delete',
});
}
/**
* 查询部门下拉树结构
* @returns object
*/
export function tenantTreeSelect() {
return request({
url: '/system/tenant/treeSelect',
method: 'get',
});
}
/**
* 部门树结构列表(指定角色)
* @param roleId 角色ID
* @returns object
*/
export function roleTenantTreeSelect(roleId: string | number) {
return request({
url: `/system/tenant/roleDeptTreeSelect/${roleId}`,
method: 'get',
});
}

View File

@@ -15,7 +15,7 @@ import { encode } from 'js-base64';
export async function downloadFile(filePath: string, range?: string) {
return request({
url: `/file/download/${encode(filePath)}`,
method: 'get',
method: 'GET',
headers: range ? { range } : {},
responseType: 'blob',
timeout: 60_000,
@@ -76,8 +76,8 @@ export async function downloadFileChunk(
*/
export function uploadFile(data: FormData) {
return request({
url: '/file/upload',
method: 'post',
url: '/file/upload2',
method: 'POST',
data,
dataType: 'form-data',
timeout: 180_000,
@@ -169,7 +169,7 @@ export async function uploadFileChunk(
export function chunkCheck(identifier: string, fileName: string) {
return request({
url: '/file/chunkCheck',
method: 'post',
method: 'POST',
data: { identifier, fileName },
timeout: 60_000,
});
@@ -189,7 +189,7 @@ export function chunkMerge(
) {
return request({
url: '/file/chunkMerge',
method: 'post',
method: 'POST',
data: { identifier, fileName, subPath },
timeout: 60_000,
});
@@ -203,13 +203,57 @@ export function chunkMerge(
export function chunkUpload(data: FormData) {
return request({
url: '/file/chunkUpload',
method: 'post',
method: 'POST',
data,
dataType: 'form-data',
timeout: 60_000,
});
}
/**
* 本地文件列表
* @param path 文件路径
* @param search search prefix
* @returns object
*/
export async function listFile(query: Record<string, any>) {
return request({
url: `/file/list`,
method: 'GET',
params: query,
});
}
/**
* 本地文件获取下载
* @param path 文件路径
* @param fileName 文件名
* @returns object
*/
export async function getFile(path: string, fileName: string) {
return request({
url: `/file`,
method: 'GET',
params: { path, fileName },
responseType: 'blob',
timeout: 60_000,
});
}
/**
* 本地文件删除
* @param path 文件路径
* @param fileName 文件名
* @returns object
*/
export async function delFile(path: string, fileName: string) {
return request({
url: `/file`,
method: 'DELETE',
params: { path, fileName },
});
}
/**
* 转存上传文件到静态资源
* @returns object
@@ -217,7 +261,7 @@ export function chunkUpload(data: FormData) {
export function transferStaticFile(data: Record<string, any>) {
return request({
url: `/file/transferStaticFile`,
method: 'post',
method: 'POST',
data,
timeout: 60_000,
});
@@ -241,11 +285,12 @@ export async function uploadFileToNE(
if (uploadChunkRes.code === RESULT_CODE_SUCCESS) {
const transferToNeFileRes = await request({
url: `/ne/action/pushFile`,
method: 'post',
method: 'POST',
data: {
uploadPath: uploadChunkRes.data.fileName,
neType,
neId,
delTemp: true,
},
timeout: 60_000,
});

View File

@@ -24,7 +24,7 @@ export function getNeFile(query: Record<string, any>) {
method: 'get',
params: query,
responseType: 'blob',
timeout: 180_000,
timeout: 600_000,
});
}
@@ -35,7 +35,7 @@ export function getNeDirZip(data: Record<string, any>) {
method: 'get',
params: data,
responseType: 'blob',
timeout: 60_000,
timeout: 600_000,
});
}
@@ -45,6 +45,6 @@ export function getNeViewFile(data: Record<string, any>) {
url: '/ne/action/viewFile',
method: 'get',
params: data,
timeout: 60_000,
timeout: 600_000,
});
}

View File

@@ -8,3 +8,12 @@ export function pingV(data: Record<string, string>) {
params: data,
});
}
// ping RTT 时延抖动
export function pingRTT(data: Record<string, string>) {
return request({
url: '/tool/ping/rtt',
method: 'POST',
data: data,
});
}

View File

@@ -1,71 +0,0 @@
import { RESULT_CODE_SUCCESS } from '@/constants/result-constants';
import { request } from '@/plugins/http-fetch';
import { parseObjLineToHump } from '@/utils/parse-utils';
/**
* 查询信令列表
* @param query 查询参数
* @returns object
*/
export async function listTraceData(query: Record<string, any>) {
let totalSQL = 'select count(*) as total from trace_data where 1=1 ';
let rowsSQL = 'select * from trace_data where 1=1 ';
// 查询
let querySQL = '';
if (query.imsi) {
querySQL += ` and imsi like '%${query.imsi}%' `;
}
if (query.msisdn) {
querySQL += ` and msisdn like '%${query.msisdn}%' `;
}
// 分页
const pageNum = (query.pageNum - 1) * query.pageSize;
const limtSql = ` limit ${pageNum},${query.pageSize} `;
// 发起请求
const result = await request({
url: `/api/rest/databaseManagement/v1/omc_db/trace_data`,
method: 'get',
params: {
totalSQL: totalSQL + querySQL,
rowsSQL: rowsSQL + querySQL + limtSql,
},
});
// 解析数据
if (result.code === RESULT_CODE_SUCCESS) {
const data: DataList = {
total: 0,
rows: [],
code: result.code,
msg: result.msg,
};
result.data.data.forEach((item: any) => {
const itemData = item['trace_data'];
if (Array.isArray(itemData)) {
if (itemData.length === 1 && itemData[0]['total'] >= 0) {
data.total = itemData[0]['total'];
} else {
data.rows = itemData.map(v => parseObjLineToHump(v));
}
}
});
return data;
}
return result;
}
/**
* 信令数据解析HTML
* @param id 任务ID
* @returns
*/
export function getTraceRawInfo(id: Record<string, string>) {
return request({
url: `/api/rest/traceManagement/v1/decMessage/${id}`,
method: 'get',
responseType: 'text',
});
}

View File

@@ -62,3 +62,18 @@ export function packetKeep(taskNo: string, duration: number = 120) {
data: { taskNo, duration },
});
}
/**
* 信令跟踪文件
* @param taskNo 对象
* @returns object
*/
export function packetPCAPFile(taskNo: string) {
return request({
url: '/trace/packet/filePull',
method: 'get',
params: { taskNo },
responseType: 'blob',
timeout: 680_000,
});
}

View File

@@ -1,6 +1,4 @@
import { RESULT_CODE_SUCCESS } from '@/constants/result-constants';
import { request } from '@/plugins/http-fetch';
import { parseObjLineToHump } from '@/utils/parse-utils';
/**
* 查询跟踪任务列表
@@ -76,29 +74,31 @@ export function filePullTask(traceId: string) {
method: 'get',
params: { traceId },
responseType: 'blob',
timeout: 60_000,
timeout: 600_000,
});
}
/**
* 获取网元跟踪接口列表
* 跟踪任务数据列表
* @param query 查询参数
* @returns object
*/
export async function getNeTraceInterfaceAll() {
// 发起请求
const result = await request({
url: `/api/rest/databaseManagement/v1/elementType/omc_db/objectType/ne_info`,
export async function listTraceData(query: Record<string, any>) {
return request({
url: '/trace/data/list',
method: 'get',
params: query,
});
}
/**
* 查询跟踪任务数据信息
* @param id ID
* @returns object
*/
export async function getTraceData(id: string | number) {
return request({
url: `/trace/data/${id}`,
method: 'get',
params: {
SQL: `SELECT ne_type,interface FROM trace_info GROUP BY ne_type,interface`,
},
});
// 解析数据
if (result.code === RESULT_CODE_SUCCESS && Array.isArray(result.data.data)) {
let data = result.data.data[0];
return Object.assign(result, {
data: parseObjLineToHump(data['trace_info']),
});
}
return result;
}

View File

@@ -78,6 +78,6 @@ export function filePullTaskHLR(query: Record<string, any>) {
method: 'get',
params: query,
responseType: 'blob',
timeout: 60_000,
timeout: 600_000,
});
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 70 KiB

View File

@@ -0,0 +1 @@
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1721721606045" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="7339" width="200" height="200"><path d="M610.6 234.24L627 294.6c90.88-24.73 184.58 28.77 209.45 119.65l60.36-16.4C862.92 273.5 734.67 200.37 610.6 234.24z m-34.42-126.22l16.4 60.36c160.51-43.83 326.13 50.81 369.96 211.33l60.36-16.4C969.94 169.45 770.03 55.18 576.18 108.02zM179.47 922.27V827.5H0v-84.83l179.47-261.74h92.22v274.24h62.38v72.33h-62.38v94.77h-92.22z m0-167.09V598.02L72.33 755.18h107.14z m0 0" p-id="7340" fill="#ffffff"></path><path d="M695.69 752.62h-89.8v-77.29h186.99v231.9c-33.34 9.95-67.35 14.92-102.17 14.92-26.62 3.37-61.57 4.97-104.72 4.97-141.29-8.33-213.62-86.44-216.97-234.31 3.36-151.24 75.69-231.9 216.97-241.85 144.65 0 216.03 49.88 214.42 149.63H695.69c0-51.49-30.79-77.3-92.23-77.3-84.83 1.62-127.98 58.21-129.59 169.52 1.61 109.7 44.9 165.49 129.59 167.1 24.87 0 54.05-3.36 87.25-9.95-1.61 1.61 0 1.61 4.98 0v-97.34z m0 0" p-id="7341" fill="#ffffff"></path></svg>

After

Width:  |  Height:  |  Size: 1.1 KiB

View File

@@ -0,0 +1 @@
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1721721630123" class="icon" viewBox="0 0 1216 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="54141" width="200" height="200"><path d="M747.264 190.912l18.368 67.328a190.272 190.272 0 0 1 233.728 133.44l67.264-18.368a260.032 260.032 0 0 0-319.36-182.4z m-38.4-140.736l18.368 67.328a336.192 336.192 0 0 1 412.8 235.776l67.328-18.368A405.952 405.952 0 0 0 708.864 50.176z m133.376 719.232h-100.16v-86.272h208.64v258.752c-37.12 11.136-75.072 16.704-114.048 16.704a984.96 984.96 0 0 1-116.864 5.568c-157.632-9.28-238.336-96.448-242.048-261.504 3.712-168.768 84.416-258.752 242.048-269.888 161.344 0 241.088 55.68 239.296 166.912H842.24c0-57.472-34.368-86.208-102.912-86.208-94.592 1.856-142.848 64.896-144.64 189.184 1.792 122.368 50.048 184.576 144.64 186.368 27.776 0 60.16-3.712 97.344-11.136-1.92 1.92 0 1.92 5.568 0v-108.48zM234.24 969.216c-86.016 0-148.992-30.72-201.216-80.64l71.424-85.248c40.704 36.864 80.64 58.368 128.256 58.368 55.296 0 89.856-26.88 89.856-74.496v-1.536c0-46.08-39.168-72.96-95.232-72.96-33.792 0-64.512 9.216-89.856 19.968L69.12 687.36l15.36-264.96h330.24v103.68H185.856l-6.144 92.928a262.976 262.976 0 0 1 70.656-9.216c104.448 0 188.16 50.688 188.16 172.032v1.536c0 113.664-80.64 185.856-204.288 185.856z" p-id="54142" fill="#ffffff"></path></svg>

After

Width:  |  Height:  |  Size: 1.4 KiB

View File

@@ -0,0 +1,3 @@
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1720074329868" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="4280" width="64" height="64"><path d="M616.5 151.3l-28.3 28.3c19.7 19.6 31.8 46.6 31.8 76.5 0 29.8-12.2 56.9-31.8 76.5l28.3 28.3c26.8-27 43.5-64 43.5-104.9s-16.7-77.9-43.5-104.7zM435.8 179.5l-28.3-28.3C380.7 178.1 364 215.1 364 256s16.7 77.9 43.5 104.7l28.3-28.3C416.2 312.9 404 285.8 404 256c0-29.9 12.2-56.9 31.8-76.5zM346.6 134.3L318.3 106c-38.5 38.4-62.3 91.5-62.3 150s23.8 111.6 62.3 150l28.3-28.3C315.3 346.6 296 303.5 296 256s19.3-90.6 50.6-121.7zM705.7 106l-28.3 28.3C708.7 165.4 728 208.5 728 256s-19.3 90.6-50.6 121.7l28.3 28.3c38.5-38.4 62.3-91.5 62.3-150s-23.8-111.6-62.3-150zM815.2 60.8l-0.1-0.1L786.7 89c0.1 0 0.1 0.1 0.2 0.1C831.5 133.7 856 193 856 256s-24.5 122.3-69.1 166.9c0 0-0.1 0.1-0.2 0.1l28.3 28.3 0.1-0.1C867.3 399 896 329.7 896 256s-28.7-143-80.8-195.2zM237.3 89L209 60.7l-0.1 0.1C156.7 113 128 182.3 128 256s28.7 143 80.8 195.2l0.1 0.1 28.3-28.3c-0.1 0-0.1-0.1-0.2-0.1-44.5-44.6-69-103.9-69-166.9s24.5-122.3 69.1-166.9c0.1 0 0.1-0.1 0.2-0.1zM511.712 256.002l0.283-0.283 0.283 0.283-0.283 0.283z" p-id="4281" fill="#ffffff"></path><path d="M511.719 256.021l0.282-0.282 0.283 0.282-0.283 0.283z" p-id="4282" fill="#ffffff"></path><path d="M708.4 616l-14.2-26.1-7.6-13.9-11.6-21.2L512 256 337.5 576l-21.8 40L128 960h74l33.8-64 28.9-53h494.6l28.9 53 33.8 64h74L708.4 616zM512 389.6L613.7 576H410.3L512 389.6zM388.5 616H569L305.6 768.1 388.5 616z m-63.4 187l313.6-181.1L737.5 803H325.1z" p-id="4283" fill="#ffffff"></path></svg>

After

Width:  |  Height:  |  Size: 1.7 KiB

1
src/assets/svg/dark.svg Normal file
View File

@@ -0,0 +1 @@
<svg width="1em" height="1em" class="icon-dark" viewBox="0 0 17 17" xmlns="http://www.w3.org/2000/svg" style="vertical-align: -0.125em;color: rgba(255, 255, 255, 0.65);"><g id="Dark-\u9875\u9762-1" stroke="none" stroke-width="1px" fill="none" fill-rule="evenodd"><g id="Dark-\u9ED8\u8BA4" transform="translate(-9.000000, -49.500000)" fill="currentColor" fill-rule="nonzero"><g id="Dark-\u7F16\u7EC4-17" transform="translate(0.000000, 42.500000)"><g id="Dark-moon" transform="translate(9.268811, 7.500000)"><rect id="Dark-\u77E9\u5F62" opacity="0" x="0" y="0" width="16" height="16"></rect><path d="M8,1.33333333 C8.14933333,1.33333333 8.29688889,1.33844444 8.44266667,1.34866666 C8.14755556,1.98422221 8,2.64577777 8,3.33333333 C8,3.96533333 8.12333333,4.56955555 8.37,5.146 C8.61666667,5.72244445 8.94822222,6.21888889 9.36466667,6.63533333 C9.78111112,7.05177777 10.2775556,7.38333332 10.854,7.63 C11.4304444,7.87666668 12.0346667,8.00000001 12.6666667,8 C13.3542222,8 14.0157778,7.85244444 14.6513333,7.55733333 C14.6615556,7.70311111 14.6666667,7.85066667 14.6666667,8 C14.6666667,8.604 14.5868889,9.19422222 14.4273333,9.77066667 C14.2677778,10.3471111 14.0446667,10.8793333 13.758,11.3673333 C13.4713333,11.8553333 13.1233333,12.3042222 12.714,12.714 C12.3046667,13.1237778 11.8557778,13.4717778 11.3673333,13.758 C10.8788889,14.0442222 10.3466667,14.2673333 9.77066667,14.4273333 C9.19466667,14.5873333 8.60444445,14.6671111 8,14.6666685 C7.39555555,14.6662222 6.80533333,14.5864444 6.22933333,14.4273333 C5.65333333,14.2682222 5.1211111,14.0451111 4.63266666,13.758 C4.14422221,13.4708889 3.69533332,13.1228889 3.28599998,12.714 C2.87666665,12.3051111 2.52866665,11.8562222 2.24199998,11.3673333 C1.95533332,10.8784444 1.73222221,10.3462222 1.57266666,9.77066667 C1.4131111,9.19511112 1.33333333,8.6048889 1.33333333,8 C1.33333333,7.3951111 1.4131111,6.80488888 1.57266666,6.22933333 C1.73222221,5.65377778 1.95533332,5.12155555 2.24199998,4.63266666 C2.52866665,4.14377776 2.87666665,3.69488887 3.28599998,3.28599998 C3.69533332,2.8771111 4.14422221,2.5291111 4.63266666,2.24199998 C5.1211111,1.95488887 5.65333333,1.73177776 6.22933333,1.57266666 C6.80533333,1.41355555 7.39555555,1.33377778 8,1.33333333 Z M6.68733333,2.828 C6.11444444,2.97377778 5.58066667,3.20977778 5.086,3.536 C4.59133333,3.86222222 4.166,4.24933333 3.81,4.69733333 C3.454,5.14533333 3.17444444,5.65488889 2.97133333,6.226 C2.76822221,6.79711111 2.66666666,7.38822222 2.66666666,7.99933333 C2.66666666,8.72155555 2.80733332,9.41155555 3.08866666,10.0693333 C3.36999999,10.7271111 3.74933332,11.2948889 4.22666666,11.7726667 C4.70399999,12.2504444 5.27177777,12.6297778 5.92999998,12.9106667 C6.5882222,13.1915556 7.2782222,13.3322222 7.99999998,13.3326667 C8.6111111,13.3326667 9.20222221,13.2311111 9.77333331,13.028 C10.3444444,12.8248889 10.854,12.5453333 11.302,12.1893333 C11.75,11.8333333 12.1371111,11.408 12.4633333,10.9133333 C12.7895555,10.4186666 13.0255555,9.88488887 13.1713333,9.31199998 C13.022,9.32577777 12.8535555,9.33266666 12.666,9.33266666 C11.8535555,9.33266666 11.0775555,9.17377777 10.338,8.85599998 C9.59844443,8.5382222 8.96044443,8.11111109 8.42399998,7.57466666 C7.88755554,7.03822222 7.46044443,6.40022222 7.14266666,5.66066666 C6.82488889,4.92111109 6.66599999,4.14511109 6.66599998,3.33266666 C6.66599998,3.1451111 6.67288888,2.97666666 6.68666666,2.82733333 L6.68733333,2.828 Z" id="Dark-\u5F62\u72B6"></path></g></g></g></g></svg>

After

Width:  |  Height:  |  Size: 3.4 KiB

1
src/assets/svg/light.svg Normal file
View File

@@ -0,0 +1 @@
<svg width="1em" height="1em" class="icon-light" viewBox="0 0 13 13" xmlns="http://www.w3.org/2000/svg" style="vertical-align: -0.125em;color: rgba(0, 0, 0, 0.88);"><g id="Light-\u9875\u9762-1" stroke="none" stroke-width="1px" fill="none" fill-rule="evenodd"><g id="Light-\u4E3B\u9898\u5305" transform="translate(-2943.000000, -292.000000)" fill="currentColor" fill-rule="nonzero"><g id="Light-\u7F16\u7EC4-12" transform="translate(2415.000000, 222.000000)"><g id="Light-\u89C6\u56FE\u5207\u6362-\u7F16\u8F91\u6001" transform="translate(518.000000, 60.000000)"><g id="Light-eye" transform="translate(8.000000, 8.000000)"><g id="Light-sun" transform="translate(2.000000, 2.000000)"><rect id="Light-\u77E9\u5F62" opacity="0" x="0" y="0" width="13" height="13"></rect><path d="M6.5,9.75 C4.7051875,9.75 3.25,8.2948125 3.25,6.5 C3.25,4.7051875 4.7051875,3.25 6.5,3.25 C8.2948125,3.25 9.75,4.7051875 9.75,6.5 C9.75,8.2948125 8.2948125,9.75 6.5,9.75 Z M6.5,8.66666667 C7.69661696,8.66666667 8.66666667,7.69661696 8.66666667,6.5 C8.66666667,5.30338304 7.69661696,4.33333333 6.5,4.33333333 C5.30338305,4.33333333 4.33333336,5.30338305 4.33333336,6.5 C4.33333336,7.69661695 5.30338305,8.66666667 6.5,8.66666667 Z M5.95833333,1.08333333 C5.95833333,0.784179087 6.20084576,0.541666658 6.5,0.541666658 C6.79915424,0.541666658 7.04166667,0.784179087 7.04166667,1.08333333 L7.04166667,2.16666667 C7.04166667,2.46582091 6.79915424,2.70833334 6.5,2.70833334 C6.20084576,2.70833334 5.95833333,2.46582091 5.95833333,2.16666667 L5.95833333,1.08333333 L5.95833333,1.08333333 Z M5.95833333,10.8333333 C5.95833333,10.5341791 6.20084576,10.2916667 6.5,10.2916667 C6.79915424,10.2916667 7.04166667,10.5341791 7.04166667,10.8333333 L7.04166667,11.9166667 C7.04166667,12.2158209 6.79915424,12.4583333 6.5,12.4583333 C6.20084576,12.4583333 5.95833333,12.2158209 5.95833333,11.9166667 L5.95833333,10.8333333 L5.95833333,10.8333333 Z M1.08333333,7.04166667 C0.784179087,7.04166667 0.541666658,6.79915424 0.541666658,6.5 C0.541666658,6.20084576 0.784179087,5.95833333 1.08333333,5.95833333 L2.16666667,5.95833333 C2.46582091,5.95833333 2.70833334,6.20084576 2.70833334,6.5 C2.70833334,6.79915424 2.46582091,7.04166667 2.16666667,7.04166667 L1.08333333,7.04166667 L1.08333333,7.04166667 Z M10.8333333,7.04166667 C10.5341791,7.04166667 10.2916667,6.79915424 10.2916667,6.5 C10.2916667,6.20084576 10.5341791,5.95833333 10.8333333,5.95833333 L11.9166667,5.95833333 C12.2158209,5.95833333 12.4583333,6.20084576 12.4583333,6.5 C12.4583333,6.79915424 12.2158209,7.04166667 11.9166667,7.04166667 L10.8333333,7.04166667 L10.8333333,7.04166667 Z M2.05454167,2.82045833 C1.84926545,2.60791971 1.85220137,2.27007933 2.06114035,2.06114035 C2.27007933,1.85220137 2.60791971,1.84926545 2.82045833,2.05454167 L3.63295833,2.86704167 C3.83823455,3.07958029 3.83529863,3.41742067 3.62635965,3.62635965 C3.41742067,3.83529863 3.07958029,3.83823455 2.86704167,3.63295833 L2.05454167,2.82045833 L2.05454167,2.82045833 Z M9.36704167,10.1329583 C9.16176545,9.92041971 9.16470137,9.58257933 9.37364035,9.37364035 C9.58257933,9.16470137 9.92041971,9.16176545 10.1329583,9.36704167 L10.9454583,10.1795417 C11.1507346,10.3920803 11.1477986,10.7299207 10.9388596,10.9388596 C10.7299207,11.1477986 10.3920803,11.1507346 10.1795417,10.9454583 L9.36704167,10.1329583 L9.36704167,10.1329583 Z M2.82045833,10.9454583 C2.60791971,11.1507346 2.27007933,11.1477986 2.06114035,10.9388596 C1.85220137,10.7299207 1.84926545,10.3920803 2.05454167,10.1795417 L2.86704167,9.36704167 C3.07958029,9.16176545 3.41742067,9.16470137 3.62635965,9.37364035 C3.83529863,9.58257933 3.83823455,9.92041971 3.63295833,10.1329583 L2.82045833,10.9454583 L2.82045833,10.9454583 Z M10.1329583,3.63295833 C9.92041971,3.83823455 9.58257933,3.83529863 9.37364035,3.62635965 C9.16470137,3.41742067 9.16176545,3.07958029 9.36704167,2.86704167 L10.1795417,2.05454167 C10.3920803,1.84926545 10.7299207,1.85220137 10.9388596,2.06114035 C11.1477986,2.27007933 11.1507346,2.60791971 10.9454583,2.82045833 L10.1329583,3.63295833 L10.1329583,3.63295833 Z" id="Light-\u5F62\u72B6"></path></g></g></g></g></g></g></svg>

After

Width:  |  Height:  |  Size: 4.0 KiB

View File

@@ -0,0 +1 @@
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1729046804258" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="1511" width="200" height="200"><path d="M958.359001 286.941198c0-64.308655-52.132334-116.440989-116.440989-116.440989L181.453678 170.500209c-64.308655 0-116.440989 52.132334-116.440989 116.440989l0 448.63995c0 64.308655 52.132334 116.440989 116.440989 116.440989l660.464333 0c64.308655 0 116.440989-52.132334 116.440989-116.440989L958.359001 286.941198zM843.814198 212.455763c12.059664 0 23.444968 3.465938 33.519418 8.598842L530.749016 549.347606c-1.227967 1.161453-1.156336 0.916882-1.752924 1.868557-1.426489 1.067308-6.055926 3.922333-15.449877 3.922333-9.397021 0-14.025435-2.75474-15.4509-3.818979-0.676405-1.077541-0.662079-0.716314-1.995447-1.940189l-353.122503-324.412624c11.609409-7.557116 25.445532-12.509918 40.300868-12.509918L843.814198 212.456786zM916.403446 736.484727c0 40.857547-31.730679 73.582879-72.589248 73.582879L183.27721 810.067606c-40.85857 0-75.28566-32.725332-75.28566-73.582879L107.99155 287.657512c0-10.630105 2.860141-20.735253 6.909363-29.882588l351.486236 322.096882c4.91187 5.302773 19.479657 17.676591 47.009663 17.676591 27.799136 0 42.303478-12.618389 47.076178-17.830087l346.800517-328.899822c6.251378 10.860349 9.129938 23.433712 9.129938 36.838L916.403446 736.484727z" fill="#ffffff" p-id="1512"></path></svg>

After

Width:  |  Height:  |  Size: 1.5 KiB

View File

@@ -3,7 +3,7 @@
:drag="true"
:destroyOnClose="true"
:title="t('components.CronModal.title')"
:visible="props.visible"
:open="props.open"
:body-style="{ padding: '0 24px' }"
@cancel="fnCronModal(false)"
@ok="fnCronModal(true)"
@@ -35,6 +35,7 @@
</ProModal>
</template>
<script lang="ts" setup>
import { ProModal } from 'antdv-pro-modal';
import CronSecond from './components/Second.vue';
import CronMinute from './components/Minute.vue';
import CronHour from './components/Hour.vue';
@@ -44,9 +45,9 @@ import { reactive, computed, watch } from 'vue';
import useI18n from '@/hooks/useI18n';
const { t } = useI18n();
const emit = defineEmits(['cancel', 'ok', 'update:visible']);
const emit = defineEmits(['cancel', 'ok', 'update:open']);
const props = defineProps({
visible: {
open: {
type: Boolean,
required: true,
},
@@ -75,7 +76,7 @@ const cronStr = computed(() => {
/**监听是否显示初始cron属性 */
watch(
() => props.visible,
() => props.open,
val => {
if (!val) return;
const arr = props.cron.split(' ');
@@ -98,7 +99,7 @@ watch(
* @param val modal触发事件
*/
function fnCronModal(val: boolean) {
emit('update:visible', false);
emit('update:open', false);
if (val) {
emit('ok', cronStr.value);
} else {

View File

@@ -0,0 +1,479 @@
<template>
<a-modal
v-model:open="visible"
:title="t('common.exportCustom')"
width="750px"
:confirm-loading="confirmLoading"
@ok="handleOk"
@cancel="handleCancel"
>
<div class="export-custom-container">
<!-- 列配置区域 -->
<div class="columns-config">
<div class="config-header">
<h4>{{ t('common.exportColumns') }}</h4>
<a-button type="link" @click="resetToDefault">
{{ t('common.resetToDefault') }}
</a-button>
</div>
<div class="columns-list">
<Container
@drop="onDrop"
:get-child-payload="getChildPayload"
drag-class="drag-ghost"
drop-class="drop-ghost"
drag-handle-selector=".drag-handle"
:non-drag-area-selector="'.column-name, .ant-checkbox-wrapper'"
>
<Draggable
v-for="(column, index) in customColumns"
:key="column.key"
class="column-item"
>
<div class="column-controls">
<a-checkbox
v-model:checked="column.visible"
@change="updateColumnVisibility(column)"
/>
<div class="drag-handle">
<HolderOutlined />
</div>
</div>
<div class="column-info">
<div class="column-name">
<a-input
v-model:value="column.title"
:placeholder="t('common.columnName')"
size="small"
/>
</div>
<!-- 隐藏col_数字标签不影响用户使用 -->
<!-- <div class="column-key">
<a-tag size="small" color="blue">{{ column.key }}</a-tag>
</div> -->
</div>
</Draggable>
</Container>
</div>
</div>
<!-- 预览区域 -->
<div class="preview-section">
<h4>{{ t('common.preview') }}</h4>
<div class="preview-table">
<a-table
:columns="previewColumns"
:data-source="previewData"
:pagination="false"
size="small"
:scroll="{ x: 400 }"
/>
</div>
</div>
</div>
</a-modal>
</template>
<script setup lang="ts">
import { ref, computed, watch, onMounted } from 'vue';
import { Modal, message } from 'ant-design-vue/es';
import { Container, Draggable } from 'vue3-smooth-dnd';
import useI18n from '@/hooks/useI18n';
import { ColumnsType } from 'ant-design-vue/es/table';
interface CustomColumn {
key: string;
title: string;
visible: boolean;
originalTitle: string;
dataIndex?: string;
customRender?: any;
columnIndex?: number; // Excel列索引
}
interface Props {
open: boolean;
originalColumns: ColumnsType;
sampleData: any[];
}
interface Emits {
(e: 'update:open', value: boolean): void;
(e: 'confirm', config: CustomColumn[]): void;
}
const props = defineProps<Props>();
const emit = defineEmits<Emits>();
const { t } = useI18n();
const visible = ref(false);
const confirmLoading = ref(false);
const customColumns = ref<CustomColumn[]>([]);
// 监听props变化
watch(() => props.open, (newVal) => {
visible.value = newVal;
if (newVal) {
initCustomColumns();
}
});
watch(visible, (newVal) => {
emit('update:open', newVal);
});
// 初始化自定义列配置
function initCustomColumns() {
// 如果传入的是完整的列配置包含columnIndex直接使用
if (props.originalColumns.length > 0 && (props.originalColumns[0] as any).columnIndex !== undefined) {
const columns: CustomColumn[] = props.originalColumns.map(col => ({
key: (col as any).key,
title: (col as any).title,
visible: true,
originalTitle: (col as any).originalTitle || (col as any).title,
dataIndex: (col as any).dataIndex,
columnIndex: (col as any).columnIndex
}));
// 尝试从本地存储加载配置
const savedConfig = localStorage.getItem('sgwc-cdr-export-config');
if (savedConfig) {
try {
const saved = JSON.parse(savedConfig);
console.log('Loaded saved config:', saved);
// 基于originalTitle匹配保存的配置
const mergedColumns = columns.map(col => {
const savedCol = saved.find((s: any) => s.originalTitle === col.originalTitle);
if (savedCol) {
console.log(`Matched column: ${col.originalTitle}, visible: ${savedCol.visible}, title: ${savedCol.title}`);
return {
...col,
visible: savedCol.visible !== undefined ? savedCol.visible : true,
title: savedCol.title || col.title
};
}
return col;
});
// 按照保存的顺序排列(如果存在)
const sortedColumns = sortColumnsByConfig(mergedColumns, saved);
console.log('Final columns after merge and sort:', sortedColumns);
customColumns.value = sortedColumns;
} catch (error) {
console.error('Failed to load saved export config:', error);
customColumns.value = columns;
}
} else {
console.log('No saved config found, using default columns');
customColumns.value = columns;
}
return;
}
// 兼容旧的表格列配置
const columns: CustomColumn[] = props.originalColumns
.filter(col => col.key !== 'id' && (col as any).dataIndex) // 过滤掉操作列
.map(col => ({
key: col.key as string,
title: col.title as string,
visible: true,
originalTitle: col.title as string,
dataIndex: (col as any).dataIndex as string,
customRender: (col as any).customRender
}));
// 尝试从本地存储加载配置
const savedConfig = localStorage.getItem('sgwc-cdr-export-config');
if (savedConfig) {
try {
const saved = JSON.parse(savedConfig);
// 合并保存的配置和当前列,只合并特定字段
const mergedColumns = columns.map(col => {
const savedCol = saved.find((s: CustomColumn) => s.key === col.key);
if (savedCol) {
return {
...col,
visible: savedCol.visible, // 只合并可见性
title: savedCol.title !== savedCol.originalTitle ? savedCol.title : col.title // 只合并自定义的标题
};
}
return col;
});
customColumns.value = mergedColumns;
} catch (error) {
console.error('Failed to load saved export config:', error);
customColumns.value = columns;
}
} else {
customColumns.value = columns;
}
}
// 按照保存的配置排序列
function sortColumnsByConfig(columns: CustomColumn[], savedConfig: CustomColumn[]): CustomColumn[] {
if (!savedConfig || savedConfig.length === 0) {
return columns;
}
// 创建一个映射originalTitle -> savedOrder
const orderMap = new Map<string, number>();
savedConfig.forEach((col, index) => {
orderMap.set(col.originalTitle, index);
});
// 排序:已保存的列按保存顺序,新列放在最后
return [...columns].sort((a, b) => {
const orderA = orderMap.has(a.originalTitle) ? orderMap.get(a.originalTitle)! : 9999;
const orderB = orderMap.has(b.originalTitle) ? orderMap.get(b.originalTitle)! : 9999;
return orderA - orderB;
});
}
// 预览列配置
const previewColumns = computed(() => {
return customColumns.value
.filter(col => col.visible)
.map(col => ({
title: col.title,
dataIndex: col.dataIndex || col.key,
key: col.key,
customRender: col.customRender
}));
});
// 预览数据只显示前2条降低预览高度
const previewData = computed(() => {
return props.sampleData.slice(0, 1);
});
// 更新列可见性
function updateColumnVisibility(column: CustomColumn) {
// 确保至少有一列可见
const visibleCount = customColumns.value.filter(col => col.visible).length;
if (visibleCount === 0) {
column.visible = true;
message.warning(t('common.atLeastOneColumn'));
}
}
// 拖拽相关函数
function getChildPayload(index: number) {
return customColumns.value[index];
}
function onDrop(dropResult: any) {
const { removedIndex, addedIndex } = dropResult;
if (removedIndex !== null && addedIndex !== null) {
const item = customColumns.value[removedIndex];
customColumns.value.splice(removedIndex, 1);
customColumns.value.splice(addedIndex, 0, item);
}
}
// 重置为默认配置
function resetToDefault() {
Modal.confirm({
title: t('common.confirm'),
content: t('common.resetConfirm'),
onOk() {
// 清除本地存储的配置
localStorage.removeItem('sgwc-cdr-export-config');
// 重新初始化
initCustomColumns();
message.success(t('common.resetSuccess'));
}
});
}
// 确认导出
function handleOk() {
const visibleColumns = customColumns.value.filter(col => col.visible);
if (visibleColumns.length === 0) {
message.error(t('common.selectAtLeastOneColumn'));
return;
}
confirmLoading.value = true;
// 保存配置到本地存储
try {
// 保存时只保存必要的字段,用于下次加载时恢复配置
const configToSave = customColumns.value.map((col, index) => ({
originalTitle: col.originalTitle || col.title, // 用于匹配列
title: col.title, // 自定义标题
visible: col.visible, // 可见性
order: index // 顺序
}));
localStorage.setItem('sgwc-cdr-export-config', JSON.stringify(configToSave));
console.log('Export config saved:', configToSave);
} catch (error) {
console.error('Failed to save export config:', error);
}
// 延迟一下让用户看到loading状态
setTimeout(() => {
emit('confirm', customColumns.value);
confirmLoading.value = false;
visible.value = false;
}, 500);
}
// 取消
function handleCancel() {
visible.value = false;
}
onMounted(() => {
if (props.open) {
initCustomColumns();
}
});
// 调试功能:清除有问题的缓存
function clearProblematicCache() {
localStorage.removeItem('sgwc-cdr-export-config');
console.log('Cleared problematic cache');
}
</script>
<style lang="less" scoped>
.export-custom-container {
.columns-config {
margin-bottom: 12px;
.config-header {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 10px;
h4 {
margin: 0;
font-size: 14px;
font-weight: 600;
}
}
.columns-list {
border: 1px solid #d9d9d9;
border-radius: 6px;
max-height: 200px;
overflow-y: auto;
.column-item {
display: flex;
align-items: center;
padding: 6px 10px;
border-bottom: 1px solid #f0f0f0;
transition: background-color 0.2s;
&:hover {
background-color: #fafafa;
}
&:last-child {
border-bottom: none;
}
.column-controls {
display: flex;
align-items: center;
margin-right: 12px;
.drag-handle {
margin-left: 8px;
cursor: grab;
color: #999;
padding: 4px;
border-radius: 4px;
transition: all 0.2s;
user-select: none;
&:hover {
color: #1890ff;
background-color: #f0f0f0;
}
&:active {
cursor: grabbing;
color: #0050b3;
background-color: #e6f7ff;
}
}
}
.column-info {
flex: 1;
display: flex;
align-items: center;
pointer-events: auto;
cursor: default;
.column-name {
flex: 1;
}
.column-key {
display: none; // 隐藏标签
}
}
// 禁止复选框触发拖拽
:deep(.ant-checkbox-wrapper) {
pointer-events: auto;
cursor: pointer;
}
}
}
}
.preview-section {
h4 {
margin: 0 0 10px 0;
font-size: 14px;
font-weight: 600;
}
.preview-table {
border: 1px solid #d9d9d9;
border-radius: 6px;
overflow: hidden;
max-height: 180px;
:deep(.ant-table-wrapper) {
.ant-table {
font-size: 12px;
}
.ant-table-thead > tr > th {
padding: 8px 8px;
font-size: 12px;
}
.ant-table-tbody > tr > td {
padding: 6px 8px;
font-size: 12px;
}
.ant-table-body {
max-height: 120px;
overflow-y: auto;
}
}
}
}
}
// 拖拽样式
.drag-ghost {
opacity: 0.5;
background: #f0f0f0;
}
.drop-ghost {
background: #e6f7ff;
}
</style>

View File

@@ -12,7 +12,7 @@ const router = useRouter();
const { t } = useI18n();
/**显示遮罩 */
const isVisible = computed(() => !['none', 'lock'].includes(maskStore.type));
const isOpen = computed(() => !['none', 'lock'].includes(maskStore.type));
// 用户无操作一段时间后进行锁屏
function idleTimeout(time: number, callback: Function) {
@@ -67,7 +67,7 @@ onUnmounted(() => {});
</script>
<template>
<a-modal
v-model:visible="isVisible"
v-model:open="isOpen"
get-container="#app"
:footer="null"
:zIndex="1008"

View File

@@ -1,9 +1,9 @@
<!-- https://github.com/jackocnr/intl-tel-input/blob/master/react/src/intl-tel-input/react.tsx -->
<script lang="ts" setup>
import intlTelInput, { Iti, SomeOptions } from 'intl-tel-input';
import { Iti } from 'intl-tel-input';
import intlTelInput from 'intl-tel-input/intlTelInputWithUtils';
import 'intl-tel-input/build/css/intlTelInput.min.css';
import 'intl-tel-input/build/js/utils.js';
import { ref, onMounted, onBeforeUnmount, nextTick, watch } from 'vue';
import { ref, onMounted, onBeforeUnmount, nextTick } from 'vue';
import useI18n from '@/hooks/useI18n';
const { currentLocale } = useI18n();
const emit = defineEmits(['update:value', 'update:change']);
@@ -45,13 +45,13 @@ const itiRef = ref<Iti | null>(null);
function fnChange() {
if (!itiRef.value) return;
const num = itiRef.value?.getNumber() || '';
const number = itiRef.value?.getNumber() || '';
const countryIso = itiRef.value?.getSelectedCountryData().iso2 || '';
// note: this number will be in standard E164 format, but any container component can use
// intlTelInputUtils.formatNumber() to convert this to another format
// as well as intlTelInputUtils.getNumberType() etc. if need be
let data = {
num,
number,
countryIso,
validity: false,
errorCode: -1,
@@ -69,21 +69,11 @@ function fnChange() {
data.errorCode = errorCode;
}
// console.log(data);
emit('update:value', num);
emit('update:value', number);
emit('update:change', data);
}
watch(
() => props.value,
v => {
if (v) {
itiRef.value?.setNumber(v);
} else {
itiRef.value?.setNumber('');
}
}
);
onMounted(() => {
nextTick(async () => {
if (inputRef.value) {
@@ -106,7 +96,13 @@ onMounted(() => {
formatOnDisplay: true,
autoPlaceholder: 'polite',
i18n: i18n,
} as SomeOptions);
});
if (props.value) {
itiRef.value.setNumber(props.value);
}
if (props.disabled) {
itiRef.value.setDisabled(props.disabled);
}
inputRef.value.addEventListener('countrychange', fnChange);
}
});
@@ -124,8 +120,7 @@ onBeforeUnmount(() => {
<input
type="tel"
class="ant-input"
ref="inputRef"
:value="value"
ref="inputRef"
:disabled="disabled"
:placeholder="placeholder"
:maxlength="maxlength"
@@ -142,4 +137,32 @@ onBeforeUnmount(() => {
.iti .iti__country-container .iti__search-input {
padding: 4px 8px;
}
.iti .ant-input {
box-sizing: border-box;
margin: 0;
font-variant: tabular-nums;
list-style: none;
font-feature-settings: 'tnum';
position: relative;
display: inline-block;
width: 100%;
min-width: 0;
padding: 4px 11px;
color: #000000d9;
font-size: 14px;
line-height: 1.5715;
background-color: transparent;
background-image: none;
border: 1px solid #424242;
border-radius: 6px;
transition: all 0.3s;
}
.iti .ant-input:focus,
.iti .ant-input-focused {
border-color: var(--ant-primary-color-hover);
box-shadow: 0 0 0 2px var(--ant-primary-color-outline);
border-right-width: 1px !important;
outline: 0;
}
</style>

View File

@@ -2,7 +2,6 @@
import { reactive, watch, onMounted, PropType, nextTick } from 'vue';
import { Container, Draggable } from 'vue3-smooth-dnd';
import useI18n from '@/hooks/useI18n';
import { type ColumnsType } from 'ant-design-vue/lib/table';
import { dbGetJSON, dbSetJSON } from '@/utils/cache-db-utils';
import { CACHE_DB_TABLE_DND } from '@/constants/cache-keys-constants';
const { t, currentLocale } = useI18n();
@@ -37,7 +36,7 @@ const props = defineProps({
});
/**表格字段列 */
const tableColumns = reactive<ColumnsType>(props.columns);
const tableColumns = reactive(props.columns);
/**表格字段列勾选状态 */
const state = reactive<{
@@ -56,7 +55,9 @@ const state = reactive<{
function fnTableColumnsCheckAllChange(e: any) {
const checked = e.target.checked;
state.indeterminate = false;
state.columnsTitleList = checked ? tableColumns.map(s => `${s.title}`) : [];
state.columnsTitleList = checked
? tableColumns.map(s => `${s.title as string}`)
: [];
}
/**表格字段列拖拽操作 */

View File

@@ -0,0 +1,289 @@
<script lang="ts" setup>
import { message } from 'ant-design-vue/es';
import { ref, reactive, onMounted, onBeforeUnmount, nextTick } from 'vue';
import { FitAddon } from '@xterm/addon-fit';
import { Terminal } from '@xterm/xterm';
import '@xterm/xterm/css/xterm.css';
import { RESULT_CODE_ERROR } from '@/constants/result-constants';
import { OptionsType, WS } from '@/plugins/ws-websocket';
const ws = new WS();
const emit = defineEmits(['connect', 'close', 'message']);
const props = defineProps({
/**终端ID必传 */
id: {
type: String,
required: true,
},
/**连接主机ID必传 */
hostId: {
type: String,
required: true,
},
/**初始发送命令 */
initCmd: {
type: [String, Boolean],
default: false,
},
});
/**终端输入DOM节点实例对象 */
const terminalDom = ref<HTMLElement | undefined>(undefined);
/**终端输入实例对象 */
const terminal = ref<any>(null);
/**终端输入文字状态 */
const terminalState = reactive<{
/**输入值 */
text: string;
/**历史 */
history: {
label?: string;
value: string;
}[];
}>({
text: '',
history: [
{
value: 'info server',
},
{
value: 'info replication',
},
{
value: 'keys ausf:*',
},
{
value: 'quit',
},
],
});
/**自动完成根据输入项进行筛选 */
function fnAutoCompleteFilter(input: string, option: any) {
return option.value.toLowerCase().indexOf(input.toLowerCase()) >= 0;
}
/**自动完成按键触发 */
function fnAutoCompleteKeydown(evt: KeyboardEvent) {
if (evt.key === 'Enter') {
// 阻止默认的换行行为
evt.preventDefault();
// 按下 Shift + Enter 键时换行
if (evt.shiftKey && evt.target) {
// 插入换行符
const textarea = evt.target as HTMLInputElement;
const start = textarea.selectionStart || 0;
const end = textarea.selectionEnd || 0;
const text = textarea.value;
textarea.value = text.substring(0, start) + '\n' + text.substring(end);
terminalState.text = textarea.value;
// 更新光标位置
textarea.selectionStart = textarea.selectionEnd = start + 1;
} else {
// ws未连接
if (ws.state() !== WebSocket.OPEN) {
message.error('disconnected');
return;
}
// 输入历史
const cmdStr = terminalState.text.trim().replace(/\n/g, '\r\n');
const hisIndex = terminalState.history.findIndex(
item => item.value === cmdStr
);
if (hisIndex === -1) {
terminalState.history.push({
value: cmdStr,
});
}
// 发送文本
terminal.value.scrollToBottom();
terminal.value.writeln('\r\n> ' + cmdStr);
ws.send({
requestId: `redis_${props.hostId}`,
type: 'redis',
data: `${cmdStr}\r\n`,
});
terminalState.text = '';
// 退出登录
if (['q', 'quit', 'exit'].includes(cmdStr)) {
setTimeout(() => {
ws.close();
}, 1000);
}
}
}
}
/**终端输入渲染 */
function handleRanderXterm(container: HTMLElement | undefined) {
if (!container) return;
const xterm = new Terminal({
lineHeight: 1.2,
fontSize: 12,
fontFamily: "Monaco, Menlo, Consolas, 'Courier New', monospace",
theme: {
background: '#000000',
},
cursorBlink: true, // 光标闪烁
cursorStyle: 'block',
scrollback: 1000,
scrollSensitivity: 15,
tabStopWidth: 4,
disableStdin: true, // 禁止输入
});
// 挂载
xterm.open(container);
// 自适应尺寸
const fitAddon = new FitAddon();
xterm.loadAddon(fitAddon);
// 创建 ResizeObserver 实例
var observer = new ResizeObserver(entries => {
fitAddon.fit();
});
// 监听元素大小变化
observer.observe(container);
terminal.value = xterm;
}
/**连接打开后回调 */
function wsOpen(ev: any) {
// console.info('wsOpen', ev);
nextTick(() => {
handleRanderXterm(terminalDom.value);
// 连接事件
emit('connect', {
timeStamp: ev.timeStamp,
cols: terminal.value.cols,
rows: terminal.value.rows,
hostId: props.hostId,
id: props.id,
});
// 初始发送命令
if (typeof props.initCmd === 'string') {
ws.send({
requestId: `redis_${props.hostId}`,
type: 'redis',
data: `${props.initCmd}\r\n`,
});
}
});
}
/**连接错误后回调 */
function wsError(ev: any) {
console.error('wsError', ev);
if (terminal.value != null) {
let message = 'disconnected';
terminal.value.write(`\x1b[31m${message}\x1b[m\r\n`);
} else if (terminalDom.value) {
terminalDom.value.style.background = '#000';
terminalDom.value.style.color = '#ff4d4f';
terminalDom.value.style.height = '60%';
terminalDom.value.innerText = 'disconnected';
}
}
/**连接关闭后回调 */
function wsClose(code: number) {
// console.warn('wsClose', code);
if (terminal.value != null) {
let message = 'disconnected';
terminal.value.write(`\x1b[31m${message}\x1b[m\r\n`);
}
// 关闭事件
emit('close', {
code: code,
hostId: props.hostId,
id: props.id,
});
}
/**接收消息后回调 */
function wsMessage(res: Record<string, any>) {
emit('message', res);
// console.log('wsMessage', res);
const { code, requestId, data } = res;
if (code === RESULT_CODE_ERROR) {
console.warn(res.msg);
return;
}
if (!requestId) return;
if (data.indexOf('is empty') > 0) return;
if (terminal.value != null) {
// terminal.value.write(data.trim().replace(/\n/g, "\r\n"));
// 是否n结尾
if (/[\r\n]$/.test(data)) {
terminal.value.writeln(data.trim().replace(/\n/g, '\r\n'));
} else {
terminal.value.write(data.replace(/\n/g, '\r\n'));
}
}
}
onMounted(() => {
if (props.hostId) {
// 建立链接
const options: OptionsType = {
url: '/ws/redis',
params: {
hostId: props.hostId,
},
onmessage: wsMessage,
onerror: wsError,
onopen: wsOpen,
onclose: wsClose,
};
ws.connect(options);
}
});
onBeforeUnmount(() => {
ws.close();
});
// 给组件设置属性 ref="xxxTerminal"
// setup内使用 const xxxTerminal = ref();
defineExpose({
/**发送方法 */
send: (data: string) => {
ws.send({
requestId: `redis_${props.hostId}`,
type: 'redis',
data: `${data}\r\n`,
});
},
});
</script>
<template>
<div class="terminal">
<div ref="terminalDom" style="height: calc(100% - 36px)" :id="id"></div>
<a-auto-complete
v-model:value="terminalState.text"
:dropdown-match-select-width="500"
style="width: 100%"
:options="terminalState.history"
:filter-option="fnAutoCompleteFilter"
:defaultActiveFirstOption="false"
>
<a-textarea
:auto-size="{ minRows: 1, maxRows: 6 }"
placeholder="Execute command. Shift+Enter to line feed, Enter to send"
@keypress="fnAutoCompleteKeydown"
/>
</a-auto-complete>
</div>
</template>
<style lang="css" scoped>
.terminal {
width: 100%;
height: 100%;
}
</style>

View File

@@ -126,7 +126,7 @@ function handleRanderXterm(container: HTMLElement | undefined) {
// console.log('尺寸', cols, rows);
ws.send({
requestId: `ssh_resize_${props.hostId}`,
type: 'ssh_resize',
type: 'resize',
data: { cols, rows },
});
});

View File

@@ -43,6 +43,11 @@ const props = defineProps({
type: String,
default: 'ssh',
},
/**消息处理函数 */
processMessages: {
type: Function,
default: undefined,
},
});
/**终端输入DOM节点实例对象 */
@@ -153,32 +158,49 @@ function wsMessage(res: Record<string, any>) {
}
if (!requestId) return;
if (terminal.value != null) {
// 查找的开始输出标记
const parts: string[] = data.split('\u001b[?2004l\r');
if (parts.length > 0) {
let text = parts[parts.length - 1];
// 找到最后输出标记
let lestIndex = text.lastIndexOf('\u001b[?2004h\u001b]0;');
if (lestIndex !== -1) {
text = text.substring(0, lestIndex);
}
if (text === '' || text === '\r\n' || text.startsWith('^C\r\n')) {
return;
}
// 是否还有最后输出标记
lestIndex = text.lastIndexOf('\u001b[?2004h');
if (lestIndex !== -1) {
text = text.substring(0, lestIndex);
}
// console.log({ parts, text });
terminal.value.write(text);
let text = '';
// 处理消息
if (props.processMessages) {
text = props.processMessages(data);
}else{
text = processMessage(data);
}
// 无消息是则不输出
if (text === '') {
return;
}
// 无标记
terminal.value.write(data);
terminal.value.write(text);
}
}
/**终端消息处理*/
function processMessage(data: string): string {
// 查找的开始输出标记
const parts: string[] = data.split('\u001b[?2004l\r');
if (parts.length > 0) {
if (parts[0].startsWith('^C') || parts[0].startsWith('\r')) {
return '';
}
let text = parts[parts.length - 1];
// 找到最后输出标记
let lestIndex = text.lastIndexOf('\u001b[?2004h\u001b]0;');
if (lestIndex !== -1) {
text = text.substring(0, lestIndex);
}
if (text === '' || text === '\r\n' || text.startsWith('^C\r\n')) {
return '';
}
// 是否还有最后输出标记
lestIndex = text.lastIndexOf('\u001b[?2004h');
if (lestIndex !== -1) {
text = text.substring(0, lestIndex);
}
// console.log({ parts, text });
return text;
}
return data;
}
onMounted(() => {
if (props.neType && props.neId) {
// 建立链接

View File

@@ -1,5 +1,5 @@
<script lang="ts" setup>
import { message } from 'ant-design-vue/lib';
import { message } from 'ant-design-vue/es';
import { ref, reactive, onMounted, onBeforeUnmount, nextTick } from 'vue';
import { FitAddon } from '@xterm/addon-fit';
import { Terminal } from '@xterm/xterm';
@@ -80,16 +80,16 @@ function fnAutoCompleteFilter(input: string, option: any) {
}
/**自动完成按键触发 */
function fnAutoCompleteKeydown(evt: any) {
function fnAutoCompleteKeydown(evt: KeyboardEvent) {
if (evt.key === 'Enter') {
// 阻止默认的换行行为
evt.preventDefault();
// 按下 Shift + Enter 键时换行
if (evt.shiftKey) {
if (evt.shiftKey && evt.target) {
// 插入换行符
const textarea = evt.target;
const start = textarea.selectionStart;
const end = textarea.selectionEnd;
const textarea = evt.target as HTMLInputElement;
const start = textarea.selectionStart || 0;
const end = textarea.selectionEnd || 0;
const text = textarea.value;
textarea.value = text.substring(0, start) + '\n' + text.substring(end);
terminalState.text = textarea.value;
@@ -121,7 +121,7 @@ function fnAutoCompleteKeydown(evt: any) {
type: 'telnet',
data: `${cmdStr}\r\n`,
});
terminalState.text = ' ';
terminalState.text = '';
// 退出登录
if (['q', 'quit', 'exit'].includes(cmdStr)) {
@@ -160,7 +160,7 @@ function handleRanderXterm(container: HTMLElement | undefined) {
// console.log('尺寸', cols, rows);
ws.send({
requestId: `telnet_resize_${props.hostId}`,
type: 'telnet_resize',
type: 'resize',
data: { cols, rows },
});
});
@@ -296,11 +296,12 @@ defineExpose({
style="width: 100%"
:options="terminalState.history"
:filter-option="fnAutoCompleteFilter"
@keydown="fnAutoCompleteKeydown"
:defaultActiveFirstOption="false"
>
<a-textarea
:auto-size="{ minRows: 1, maxRows: 6 }"
placeholder="Execute command. Shift+Enter to line feed, Enter to send"
@keypress="fnAutoCompleteKeydown"
/>
</a-auto-complete>
</div>

View File

@@ -1,97 +0,0 @@
<script lang="ts" setup>
import { ref, onMounted, onBeforeUnmount, nextTick } from 'vue';
import { FitAddon } from '@xterm/addon-fit';
import { Terminal } from '@xterm/xterm';
import '@xterm/xterm/css/xterm.css';
const emit = defineEmits(['update:value']);
const props = defineProps({
/**终端ID必传 */
id: {
type: String,
required: true,
},
/**窗口单行字符数 */
cols: {
type: Number,
default: 80,
},
/**窗口行数 */
rows: {
type: Number,
default: 40,
},
/**信息 */
value: {
type: String,
default: '',
},
});
/**终端输入DOM节点实例对象 */
const terminalDom = ref<HTMLElement | undefined>(undefined);
/**终端输入实例对象 */
const terminal = ref<any>(null);
/**终端输入渲染 */
function handleRanderXterm(container: HTMLElement | undefined) {
if (!container) return;
const xterm = new Terminal({
cols: props.cols,
rows: props.rows,
lineHeight: 1.2,
fontSize: 12,
fontFamily: "Monaco, Menlo, Consolas, 'Courier New', monospace",
theme: {
background: '#000000',
},
cursorBlink: false, // 光标闪烁
cursorStyle: 'block',
scrollback: 1000,
scrollSensitivity: 15,
tabStopWidth: 4,
disableStdin: true, // 禁止输入
});
// 挂载
xterm.open(container);
// 自适应尺寸
const fitAddon = new FitAddon();
xterm.loadAddon(fitAddon);
// 创建 ResizeObserver 实例
var observer = new ResizeObserver(entries => {
fitAddon.fit();
});
// 监听元素大小变化
observer.observe(container);
terminal.value = xterm;
}
onMounted(() => {
nextTick(() => {
handleRanderXterm(terminalDom.value);
// 初始发送命令
if (typeof props.value === 'string') {
terminal.value.write(props.value);
}
});
});
onBeforeUnmount(() => {
if (terminal.value != null) {
terminal.value.dispose();
}
});
</script>
<template>
<div ref="terminalDom" :id="id" class="terminal"></div>
</template>
<style lang="css" scoped>
.terminal {
width: 100%;
height: 100%;
}
</style>

View File

@@ -1,10 +1,11 @@
<script setup lang="ts">
import { message } from 'ant-design-vue/lib';
import { FileType } from 'ant-design-vue/lib/upload/interface';
import { UploadRequestOption } from 'ant-design-vue/lib/vc-upload/interface';
import { message } from 'ant-design-vue/es';
import { FileType } from 'ant-design-vue/es/upload/interface';
import { UploadRequestOption } from 'ant-design-vue/es/vc-upload/interface';
import { ProModal } from 'antdv-pro-modal';
import useI18n from '@/hooks/useI18n';
const { t } = useI18n();
const emit = defineEmits(['upload', 'close', 'update:visible']);
const emit = defineEmits(['upload', 'close', 'update:open']);
const props = defineProps({
/**窗口标题 */
title: {
@@ -17,7 +18,7 @@ const props = defineProps({
default: false,
},
/**是否弹出显示,必传 */
visible: {
open: {
type: Boolean,
required: true,
},
@@ -80,7 +81,7 @@ function fnUpload(up: UploadRequestOption) {
:drag="true"
:destroyOnClose="true"
:title="props.title"
:visible="props.visible"
:open="props.open"
:keyboard="false"
:mask-closable="false"
:confirm-loading="props.loading"

View File

@@ -3,3 +3,6 @@ export const ADMIN_ROLE_KEY = 'system';
/**系统管理员-系统指定权限 */
export const ADMIN_PERMISSION = '*:*:*';
/**次级系统管理员 */
export const TENANTADMIN_ROLE_KEY = 'admin';

View File

@@ -1,3 +1,6 @@
/**会话缓存-接口加密 */
export const CACHE_SESSION_CRYPTO_API = 'cache:session:cryptoApi';
/**会话缓存-网络请求 */
export const CACHE_SESSION_FATCH = 'cache:session:fatch';

View File

@@ -4,6 +4,7 @@ export const NE_TYPE_LIST = [
'IMS',
'AMF',
'AUSF',
'UDR',
'UDM',
'SMF',
'PCF',
@@ -16,7 +17,11 @@ export const NE_TYPE_LIST = [
'N3IWF',
'MOCNGW',
'SMSC',
'SMSF',
'CBC',
'CHF',
'HLR',
'SGWC',
];
/**

View File

@@ -0,0 +1,47 @@
import dayjs from 'dayjs';
/**日期快捷选择 */
export function dayjsRanges() {
return [
{
label: 'Today',
value: [dayjs().startOf('day'), dayjs()],
},
{
label: 'Last 1 hour',
value: [
dayjs().subtract(1, 'hour').startOf('hour'),
dayjs().subtract(1, 'hour').endOf('hour'),
],
},
// {
// label: 'Last 3 hour',
// value: [dayjs().subtract(3, 'hours'), dayjs()],
// },
// {
// label: 'Last 6 hour',
// value: [dayjs().subtract(6, 'hours'), dayjs()],
// },
{
label: 'Last 1 day',
value: [
dayjs().subtract(1, 'day').startOf('day'),
dayjs().subtract(1, 'day').endOf('day'),
],
},
{
label: 'Last 7 day',
value: [
dayjs().subtract(7, 'day').startOf('day'),
dayjs().subtract(1, 'day').endOf('day'),
],
},
{
label: 'Last 15 day',
value: [
dayjs().subtract(15, 'day').startOf('day'),
dayjs().subtract(1, 'day').endOf('day'),
],
},
];
}

View File

@@ -1,5 +1,5 @@
import { onBeforeMount } from 'vue';
import { ConfigProvider, message } from 'ant-design-vue/lib';
import { ConfigProvider, message } from 'ant-design-vue/es';
import { CACHE_LOCAL_PRIMARY_COLOR } from '@/constants/cache-keys-constants';
import { localGet, localSet } from '@/utils/cache-local-utils';

View File

@@ -6,17 +6,18 @@ export default {
// 通用
common: {
title: 'Core Network Management Platform',
title: 'Login Platform',
desc: 'Core Network Management Platform',
loading: 'Please wait...',
inputPlease: 'Please input',
searchPlease: 'Search menus...',
searchTip: 'Enter keywords to search menus',
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',
@@ -29,6 +30,7 @@ export default {
editText: 'Edit',
deleteText: 'Delete',
downloadText: 'Download',
CloudServerText:'Sync',
import:'Import',
export:'Export',
uploadText: 'Upload',
@@ -39,6 +41,11 @@ export default {
columnSetText: 'Column Setting',
columnSetTitle: 'Column Display / Sorting',
sizeText: 'Density',
preview:'Preview',
exportCustom:'Custom Export',
exportColumns:'Column Definition',
resetToDefault:'Reset to default columns',
exportDefault:'Export',
size: {
default: 'Default',
middle: 'Medium',
@@ -131,7 +138,7 @@ export default {
},
LockScreen: {
inputPlacePwd:'Lock Screen Password',
validSucc:'Validation Passed',
enter:'Enter',
validError:'Validation Failure',
backLogin:'Logout to Relogin',
backReload:'Restarting now, please wait...',
@@ -143,7 +150,7 @@ export default {
// 静态路由
router: {
index: "Home",
index: "Overview",
login: "Sign In",
register: 'Registrations',
page403: 'No Access',
@@ -192,6 +199,7 @@ export default {
lockPasswd: "Unlock Password",
lockPasswdTip: "No password can be set",
fullscreen: "Full Screen",
theme: "Theme light/dark mode",
logout: "Logout",
profile: "Profile",
settings: "Settings",
@@ -221,12 +229,11 @@ export default {
capability: 'Capability',
serialNum: 'Serial Number',
expiryDate: 'Expiry Date',
neStatus: 'NE status is abnormal',
runStatus:'Running Status',
mark:'Brief Information',
neStatus: 'Status Abnormal',
runStatus: 'Runing Status',
mark:'Information',
object:'Object',
versionNum:'Version',
systemStatus:'Status',
realNeStatus:'Status',
reloadTime:'Refresh Time',
Critical:'Critical',
@@ -254,12 +261,16 @@ export default {
login: {
tabPane1: 'Account password login',
tabPane2: 'Login with phone number',
registerBtn: 'Register an account',
registerBtn: 'Register Account',
loginBtn: 'Sign In',
loginSuccess: 'Login Successful',
loginMethod: 'Other login methods:',
loginMethodWX: 'WeChat Scan Login',
loginMethodQQ: 'QQ Scan Code Login',
otherMethod: 'Other Methods',
backBtn: 'Back',
backBtnLogin: 'Return Login',
authorizedNotfound: 'Authorized Not Found',
authorizedFailed: 'Authorized Failed',
authorizedSuccess: 'Authorized Successful',
redirectHome: 'Redirect to home page in {i} seconds',
},
register: {
registerBtn: 'Register',
@@ -317,6 +328,8 @@ export default {
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",
@@ -348,178 +361,39 @@ export default {
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",
},
},
dashboard: {
overview:{
title: "Core Network Dashboard",
fullscreen: "Click on the full-screen display",
fullscreen: "Full Screen Display",
toRouter: "Click to jump to the detail page",
Users:"UDM Subscription Data",
VoNR:"IMS Online Users",
sessions:"PDU Sessions in SMF",
FivegNodeN:"Online gNB in AMF",
Fiveusers:"Active users in AMF",
FourgNodeN:"Online eNB in MME",
Fourusers:"Active users in MME",
UPFjump:"Key Performance Indicators",
Networkjump:"5GC System Architecture",
Alarmjump:"Active Alarms",
IMSUsers:"UDM IMS User Data",
VoIPUsers:"UDM VoIP User Data",
skim: {
users: "Users",
userTitle:'User Information',
users: "Total Subscriber Base",
userTitle:'Subscriber Information',
imsUeNum: "VoNR/VoLTE",
smfUeNum: "Data Sessions",
smfUeNum: "User Sessions",
gnbBase: "Online gNodeB",
gnbSumBase: "Total gNodeB",
enbBase: "Online eNodeB",
enbSumBase: "Total eNodeB",
gnbUeNum:'5G Active Users',
enbUeNum:'4G Active Users',
baseTitle:'Online Information',
nodeBInfo: 'NodeB Information',
onlineinfo:'UE Online Information',
ims:'VoLTE',
voip:'VoIP'
},
upfFlow:{
title: "UPF Throughput",
@@ -549,6 +423,7 @@ export default {
},
userActivity: {
title: "User Activity",
imsTitle: "IMS Activity",
type: "Type",
duration: "Duration",
caller: "Caller",
@@ -567,23 +442,32 @@ export default {
rowInfo: "Info",
type: "Type",
duration: "Duration",
mosAverage: "MOS",
callConnectionTime: "Call Connection Time",
seizureTime: "Call Start Time",
releaseTime: "Hangup Time",
caller: "Caller",
called: "Called",
result: "Result",
resultCode: "Result Code",
resultCause: "Result Cause",
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',
tenantName: "Tenant Name",
exportTip: "Do you confirm to export the current query conditions of the CDR data?",
chargingID: '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',
durationTime: 'Duration',
invocationTime: 'Invocation Time',
sgwcServedIMSI: 'IMSI',
sgwcServedMSISDN: 'MSISDN',
sgwcVolumeGPRSUplink: 'GPRS Uplink',
sgwcVolumeGPRSDownlink: 'GPRS Downlink',
},
ue: {
eventType: "Event Type",
@@ -595,7 +479,7 @@ export default {
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.)",
exportTip: "Do you confirm to export the event data of the current query condition?",
},
},
ne: {
@@ -618,6 +502,8 @@ export default {
portTip: "Network element port default:33030",
serialNum: 'Serial Number',
expiryDate: 'Expiry Date',
ueNumber: 'UE Number',
nbNumber: 'Radio Number',
normalcy: 'Normal',
exceptions: 'Abnormal',
restart: 'Restart',
@@ -655,7 +541,7 @@ export default {
delTip: 'Confirm deletion of network element information data items?',
oam: {
title: 'OAM Configuration',
sync: 'Sync to NE',
restart: 'Restart NE',
oamEnable: 'Service',
oamPort: 'Port',
snmpEnable: 'Service',
@@ -758,14 +644,15 @@ export default {
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',
noPath: 'Package File Not Found',
},
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?",
reloadBatch: "Refresh License Status",
reloadBatchTip: "Do you perform a license status information refresh for the current list of NE?",
updateTtile: "Update License",
downCodeTop: "Confirmed to save the license activation code to a file?",
activationRequestCode: "License Activation Code",
@@ -781,7 +668,9 @@ export default {
treeSelectTip: "Select configuration item information in the left configuration navigation!",
neType: 'NE Type',
neTypePleace: "Please select the network element type",
neIdSyncPleace: "Please select the synchronized network element",
noConfigData: "No data on configuration items",
noConfigdDisabled: "The configuration item is not normal",
updateValue: "[ {num} ] parameter value modified successfully.",
updateValueErr: "Attribute value modification failure",
updateItem: "Modify Index to {num}.",
@@ -805,6 +694,19 @@ export default {
name: "Name",
downTip: 'Confirmed to download the backup file [{txt}]?',
title: "Modify Backup {txt}",
backupModal: {
pushFileOper: "Send Current File To Remote Backup",
title: "Setting Remote Backup Service",
enable: "Enable",
toIp: "Service IP",
toIpPleace: "Please input the remote backup server IP address",
toPort: "Service Port",
username: "UserName",
usernamePleace: 'Please enter the service login username',
password: "Password",
dir: "Save Dir",
dirPleace: 'Please enter the service address target file directory',
}
},
neQuickSetup: {
reloadPara5G: 'Reload',
@@ -842,7 +744,7 @@ export default {
installSourceUpload: 'New Upload',
installSelect: 'Select Record',
installUpload: 'Upload File',
installText: 'Installed',
installText: 'Install',
licenseTitle: "Licenses",
licenseDesc: "Network element service authorization certification",
licenseResultTitle: "Whether to authorize activation immediately",
@@ -855,9 +757,61 @@ export default {
licenseTip2: '2. Clicking [Finish] will end the installation process.',
},
},
neData: {
common: {
startIMSI: 'Starting IMSI',
imsi: '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.',
imsiPlease: "Please enter IMSI correctly",
msisdn: 'Mobile Customer Identification Number',
msisdnPlease: "Please enter the Mobile Customer Identification Number correctly",
loadDataConfirm: 'Confirmed to reload 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!!!!!.',
batchOper: 'Batch Operation',
batchAddText: 'Batch Addition',
batchDelText: 'Batch Deletion',
batchUpdateText: 'Batch Update',
batchNum: 'Number of releases',
checkDel:'Check Delete',
importTemplate: 'Download Template',
},
baseStation: {
list: "List",
topology: "Topology",
nbName: "RAN Node Name",
nbId: "RAN Node ID",
ueNum: "UE Number",
topologyTitle: "Radio State Graph",
name: "Name",
namePlease: "text content length 0~64",
position: "Position",
positionPlease: "location description. Prohibition of spaces, length of text content 0-64",
address: "IP Address",
addressPlease: "text content length 0~64",
state: "State",
online: "Online",
offline: "Offline",
time: "Change Time",
addRadio: "Add Radio Info",
editRadio: "Edit Radio Info",
history: "Status History",
exportTip: "Confirm exporting xlsx table files based on search criteria?",
importDataEmpty: "Imported data is empty",
},
backupData: {
auth: "UDM Authentication",
sub: "UDM Subscribers",
voip: "VoIP Authentication",
volte: "IMS Subscribers",
}
},
neUser: {
auth: {
authInfo:' Authentication Info',
authInfo:' Authentication of Info',
neTypePlease: 'Query network element Object',
neType: 'UDM Object',
export: 'Export',
@@ -865,13 +819,14 @@ export default {
checkExport : 'Check Export',
checkExportConfirm: 'Confirm exporting the checked authenticated user data?',
import: 'Import',
importFail: 'Failure Record',
loadDataConfirm: 'Are you sure you want to reload the data?',
loadData: 'Load Data',
loadDataTip: 'Successfully fetched load data: {num} entries, the system is internally updating the data. Please wait a moment!!!!',
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',
numAdd: 'Number of authentication profiles',
numDel: 'Number of deleted',
checkDel: 'Check Delete',
imsiTip: 'IMSI=MCC+MNC+MSIN',
@@ -884,19 +839,22 @@ export default {
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',
startUserName:'Start username',
},
sub: {
subInfo:' Subscription Info',
neType: 'UDM Object',
imsType:'IMS 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',
importFail: 'Failure Record',
loadDataConfirm: 'Are you sure you want to reload the data?',
loadData: 'Load Data',
loadDataTip: 'Successfully fetched load data: {num} entries, the system is internally updating the data. Please wait a moment!!!!',
numAdd: 'Number of releases',
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 subscriber profiles',
numDel: 'Number of deleted',
checkDel: 'Check Delete',
batchAddText: 'Batch Add',
@@ -916,6 +874,10 @@ export default {
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',
cnFlag0: 'No Access Allowed',
cnFlag1: 'Access Only 5G',
cnFlag2: 'Access Only 4G',
cnFlag3: 'Access 4G/5G',
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.',
@@ -925,6 +887,12 @@ export default {
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',
tenantName:'Tenant Name',
imsiMode:'IMSI Matching Mode',
fuzzyMatch:'Fuzzy Match',
prefixMatch:'Prefix Match',
fullMatch:'Full Match',
suffixMatch:'Suffix Match',
},
pcf: {
neType: 'PCF Object',
@@ -958,7 +926,9 @@ export default {
rfsfTip:'RAT Frequency Selection Priority',
},
base5G: {
neType: 'NE Object',
neType: 'Radio Type',
gnb:'5G Radios',
enb:'4G Radios',
},
n3iwf: {
neType: 'N3IWF Object',
@@ -1054,6 +1024,14 @@ export default {
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',
@@ -1062,7 +1040,14 @@ export default {
expression:'Expression',
description:' Description',
kpiSet:' Statistical Settings',
delCustomTip:'Confirm deletion of data item with record number {num}?',
ago1Hour:'Last 1 hour',
ago3Hour:'Last 3 hour',
ago6Hour:'Last 6 hour',
toDay:'Today',
ago1Day:'Last 1 day',
ago7Day:'Last 7 day',
ago15Day:'Last 15 day',
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',
@@ -1074,8 +1059,20 @@ export default {
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',
unitSelect:'To better display the image, the same unit needs to be selected. The current unit is:',
avg:'(average)',
total:'(total)',
ago1:'Past 24 hrs value',
ago7:'Past 7 days value',
ago30:'Past 30 days value',
},
kpiKeyTarget:{
"time":"Time",
"rawData":"Table Data",
"statistics":"NE metrics",
"fullWidthLayout":"Full Width",
"twoColumnLayout":"Two Column",
"saveLayout": "Save Layout",
@@ -1088,33 +1085,39 @@ export default {
"layout3": "Layout 3"
},
kpiOverView:{
"kpiName":"NE Metrics Name",
"maxValue":"Max",
"maxValueTip":"The max value of metric data within the user's filtered time range.",
"minValue":"Min",
"minValueTip":"The min value of metric data within the user's filtered time range.",
"avgValue":"Avg",
"avgValueTip":"The average value of metric data within the user's filtered time range.",
"totalValue":"Sum",
"totalValueTip":"The sum value of metric data within the user's filtered time range.",
"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",
"tips":"The percentages and rates are averages,the counts are statistical values.",
},
voiceOverView:{
"voiceTitle":"Voice Calls Dashboard",
"tips":"Voice Call Statistics Per Minute",
"ne":"NE",
"now":"Now",
"last":"Past",
"calls":"Calls",
"activeCall":"Active Calls",
"callMOMT":"MO/MT Call Success Rate",
"failedcall":"Failed Calls",
"registration":"Registrations",
"activeregistration":"Active Registrations",
"registrationsuccess":"Registration Success Rate",
"failedregistration":"Failed Registrations",
},
},
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',
@@ -1149,6 +1152,7 @@ export default {
},
task: {
traceId: 'Tracing No',
title: 'Tracing Title',
trackType: 'Tracing Type',
trackTypePlease: 'Please select a tracing type',
creater: 'Created by',
@@ -1165,30 +1169,35 @@ export default {
imsiTip: 'Mobile communication IMSI number',
srcIp: 'Source IP Address',
srcIpPlease: 'Please enter the IP address',
srcIpTip: 'Current sender IPv4 address',
srcIpTip: 'sending IPv4 address',
dstIp: 'Destination IP Address',
dstIpPlease: 'Please enter the IP address',
dstIpTip: 'IPv4 address of the receiving end of the other party',
dstIpTip: 'receiving end IPv4 address',
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',
rangePicker: 'Task 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",
pcapView: "Track Data Analysis",
traceFile: "Track File",
errMsg: "Error Message",
imsiORmsisdn: "imsi or msisdn is null, cannot start task",
dataView: "Track Data",
protocolOrInterface: "Protocol/Interface",
msgNe: 'Network Element',
msgEvent: 'Event',
msgType: 'Type',
msgDirect: 'Direction',
msgLen: 'Length',
rowTime: 'Time',
taskInfo: 'Task information',
},
},
faultManage: {
@@ -1208,7 +1217,7 @@ export default {
clear: 'Clear',
mySelf: 'Personalization',
exportAll: 'Export All',
disPlayFilfter: 'Display Filters',
disPlayFilfter: 'Filter out Alerts',
alarmId:'ID',
alarmTitle:'Title',
clearUser:'Clear User',
@@ -1298,22 +1307,30 @@ export default {
size: "Size",
modifiedTime: "Modified Time",
fileName: "File Name",
downTipZip: "Confirm downloading the directory [{fileName}] as a ZIP file?",
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',
follow: 'Enable Instant Update',
tailChar: 'End Characters',
tailLines: 'End Lines',
},
exportFile:{
fileName:'File Source',
fileSource:'File Source',
fileSourcePlease:'Please select the source of the document',
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",
sysloginLog:'System Login Log',
sysOperateLog:'System Operation Log',
neLog:'NE Log',
cdrIMS:'CDR Voice',
cdrSMF:'CDR Data',
cdrSMSC:'CDR SMS',
cdrSGWC:'CDR Roaming Data',
}
},
monitor: {
@@ -1687,6 +1704,8 @@ export default {
userName: 'Nick Name',
permission: 'Role',
className: 'Department',
userType: 'User Type',
tenntName:'Tenant Name',
loginIp: 'Login Address',
loginTime: 'Login Time',
status: 'Status',
@@ -1712,6 +1731,7 @@ export default {
sex:'User Gender',
email:'E-mail',
fromClass:'Department',
fromTenant:'Tenant',
userWork:'User position',
userWorkPlease: 'Please select user post',
userTip:'User Description',
@@ -1725,6 +1745,7 @@ export default {
lock:'Lock',
inactive:'Inactive',
active:'Active',
permissionTip:'If want to select a tenant role, make sure there is at least one tenant in the tenant management.',
},
config: {
configName: "Config Name",
@@ -1749,6 +1770,55 @@ export default {
refreshCacheTip: "Are you sure you want to refresh the parameter configuration cache?",
refreshCacheOk: "Refresh Cache Successful",
},
loginSource: {
uid: "UID",
name: "Name",
namePlease: 'Please enter the authentication source name correctly',
icon: "Icon",
iconPlease: 'You can enter the image link or upload the image path address',
type: "Type",
activeFlag: "Status",
remark: "Remark",
createTime: "Create Time",
updateTime: "Update Time",
ldapUrl: "Server Address",
ldapUrlPlease: 'Please enter the LDAP server address correctly',
ldapBaseDN: "Base DN",
baseDnPlease: 'Please enter the LDAP base DN correctly',
ldapUserFilter: "User Filter",
userFilterPlease: 'Please enter the LDAP user filter correctly',
ldapBindDN: "Bind DN",
ldapBindPassword: "Bind Password",
smtpHost: 'Server Address',
smtpHostPlease: 'Please enter the SMTP server address correctly',
smtpPort: 'Port Number',
smtpPortPlease: 'Please enter the SMTP port number correctly',
oauth2ClientID: 'Client ID',
oauth2ClientIDPlease: 'Please enter the OAuth2 client ID correctly',
oauth2ClientSecret: 'Client Secret',
oauth2ClientSecretPlease: 'Please enter the OAuth2 client secret correctly',
oauth2AuthURL: 'Authorization URL',
oauth2AuthURLPlease: 'Please enter the OAuth2 authorization URL correctly',
oauth2TokenURL: 'Token URL',
oauth2TokenURLPlease: 'Please enter the OAuth2 token URL correctly',
oauth2UserURL: 'User Info URL',
oauth2UserURLPlease: 'Please enter the OAuth2 user info URL correctly',
oauth2AccountField: 'Account Field',
oauth2AccountFieldPlease: 'Please enter the OAuth2 account field correctly',
oauth2Scopes: 'Scopes',
oauth2ScopesPlease: 'Please enter the OAuth2 scopes correctly',
oauth2RedirectURL: 'Redirect URL',
oauth2RedirectURLPlease: 'Please enter the OAuth2 redirect URL correctly',
oauth2RedirectURLTip: 'Please jump to the specified path (omchost/#/login/oauth2), redirect with code and state address parameters',
uploadFileTip: 'Confirm to upload the authentication source icon?',
uploadFileOk: 'Authentication source icon upload successful',
uploadFileErr: 'Authentication source icon upload failed',
viewInfoErr: "Failed to get authentication source information",
addInfo: "Add Authentication Source",
editInfo: "Modify Authentication Source",
delTip: "Confirm deleting the authentication source number [{num}] data item?",
delOk: "Deleted Successfully",
},
setting: {
charMaxLen: 'characters length',
saveSubmit: 'Submit&Save',
@@ -1808,6 +1878,10 @@ export default {
home: 'Home Page',
homeTip:'Do you want to submit the current interface as the system interface?',
homeSet:'Home Page Settings',
backup: 'System Backup',
backupInstruction: 'System backup will back up the net element information records and configuration files running on the current system, and can restore the system to the previous state!',
backupExportTip: 'Confirm to export system backup?',
backupImportTip: 'Confirm to import system backup?',
},
role:{
allScopeOptions:'All data permissions',
@@ -1852,6 +1926,7 @@ export default {
cancelGive:'Cancel authorization',
cancelSure:'Confirm to cancel the authorization of the data item with user number [{userId}]?',
batchCancel:'Batch cancellation of authorization',
selectUser:'Assign Users',
},
dept:{
classInfo:' Department Information',
@@ -1872,6 +1947,37 @@ export default {
phone:'Contact Number',
email:'Mail',
},
tenant:{
classInfo:' Tenant Information',
className:'Name',
classId:'Number',
classSort:'Sorting',
status:'Status',
type:' Tenancy Asset',
createTime:'Creation Time',
highClass:'Root Level',
key:'Asset Key',
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 TenantName: {title}?',
delTypeSure:'Are you sure to delete the data item with Tenancy Asset: {tenancyAsset}, Asset Key: {tenancyKey}?',
open:'Exhibition',
close:'Fold',
addClass:'Add Tenant',
admin:'Principal',
phone:'Contact Number',
email:'Mail',
SDSST:'Network Slice',
APN:'Access Point Name',
IMSI:'SIM Card',
treeSelectTip:'Please select a tenant from the tenant list on the left for configuration',
upfTip:'Please select from the drop-down list of UPF Resource UIDs',
imsiTip:'Please select the matching type and fill in the SIM card number fragment',
radioTip:'Please select from the drop-down list of radio type and radio ID',
defaultTip:'Please select from the drop-down list of Tenancy Asset, and then fill the Asset Key',
patternTip:'The Asset Key cannot contain special characters',
},
post:{
positionInfo:'Position Information',
positionId:'Position Number',
@@ -1894,7 +2000,7 @@ export default {
requestMe:'Request Method',
host:'Request Host',
operStatus:'Status',
operDate:'Time',
operDate:'Time Stamp',
useTime:'Time Lap',
logInfo:'Operation Log Information',
delSure:'Are you sure to delete the data item with access number [{ids}]?',

View File

@@ -6,17 +6,18 @@ export default {
// 通用
common: {
title: '核心网管理平台',
title: '登录平台',
desc: '核心网管理平台',
loading: '请稍等...',
inputPlease: '请输入',
searchPlease: '搜索菜单...',
searchTip: '输入关键词搜索菜单',
selectPlease: '请选择',
tipTitle: '提示',
msgSuccess: '{msg} 成功',
errorFields: '请正确填写 {num} 处必填信息!',
tablePaginationTotal: '总共 {total} 条',
noData: "暂无数据",
zebra:'表格斑马纹',
ok: '确定',
cancel: '取消',
close: '关闭',
@@ -29,6 +30,7 @@ export default {
editText: '编辑',
deleteText: '删除',
downloadText: '下载',
CloudServerText:'同步',
import:'导入',
export:'导出',
uploadText: '上传',
@@ -39,6 +41,10 @@ export default {
columnSetText: '列设置',
columnSetTitle: '列展示/排序',
sizeText: '密度',
exportCustom:'自定义导出',
exportColumns:'列定义',
resetToDefault:'重置为默认列',
exportDefault:'全部导出',
size: {
default: '默认',
middle: '中等',
@@ -131,7 +137,7 @@ export default {
},
LockScreen: {
inputPlacePwd:'请输入锁屏密码',
validSucc:'校验通过',
enter:'进入',
validError:'校验失败',
backLogin:'退出并重新登录',
backReload:'正在重启,请稍等...',
@@ -143,7 +149,7 @@ export default {
// 静态路由
router: {
index: "主页",
index: "概览",
login: "登录",
register: '注册',
page403: '没有访问权限',
@@ -192,6 +198,7 @@ export default {
lockPasswd: "解锁密码",
lockPasswdTip: "可不设置密码",
fullscreen: "全屏显示",
theme: "主题明/暗模式",
logout: "退出登录",
profile: "个人中心",
settings: "个人设置",
@@ -221,13 +228,12 @@ export default {
capability: '用户容量',
serialNum: '序列号',
expiryDate: '许可证到期日期',
neStatus:'网元状态异常',
neStatus:'状态异常',
runStatus:'运行状态',
mark:'简略信息',
mark:'信息',
object:'对象',
versionNum:'版本号',
systemStatus:'系统状态',
realNeStatus:'网元状态',
realNeStatus:'状态',
reloadTime:'刷新时间',
Critical:'严重告警',
Major:'主要告警',
@@ -257,9 +263,13 @@ export default {
registerBtn: '注册账号',
loginBtn: '登录',
loginSuccess: '登录成功',
loginMethod: '其他登录方式',
loginMethodWX: '微信扫一扫登录',
loginMethodQQ: 'QQ扫码登录',
otherMethod: '其他方式',
backBtn: '返回',
backBtnLogin: '返回登录',
authorizedNotfound: '授权无效',
authorizedFailed: '授权失败',
authorizedSuccess: '授权成功',
redirectHome: '{i} 秒后跳转主页',
},
register: {
registerBtn: '注册',
@@ -317,6 +327,8 @@ export default {
color: "风格配色",
colorActions: "整体风格配色设置",
colorRandomly: "随机",
theme: "主题明暗模式",
themeActions: "切换浅色/暗黑模式",
navTheme: "深色菜单",
navThemeActions: "只能改变导航模式的菜单",
fixedHeader: "固定顶部导航栏",
@@ -348,178 +360,39 @@ export default {
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: "展开",
},
},
dashboard: {
overview:{
title: "核心网系统看板",
fullscreen: "点击全屏显示",
toRouter: "点击跳转详情页面",
Users:"UDM 订阅数据",
VoNR:"IMS在线用户",
sessions:"SMF的PDU会话",
FivegNodeN:"5G在线基站数",
Fiveusers:"AMF在线用户数",
FourgNodeN:"4G在线基站数",
Fourusers:"MME在线用户数",
UPFjump:"点击跳转到UPF黄金指标界面",
Networkjump:"点击跳转到网元系统拓扑图",
Alarmjump:"点击跳转到活动告警",
IMSUsers:"点击跳转到 IMS 用户",
VoIPUsers:"点击跳转到 VoIP 用户",
skim: {
users: "用户数",
userTitle:'用户信息',
imsUeNum: "IMS 会话数",
smfUeNum: "Data 会话数",
gnbBase: "5G 基站数",
gnbSumBase: "5G 基站总数",
gnbUeNum:'5G 用户数',
enbBase: "4G 基站数",
enbSumBase: "4G 基站总数",
enbUeNum:'4G 用户数',
baseTitle:'在线信息',
nodeBInfo: '基站信息',
onlineinfo:'User Online Infomation',
ims:'IMS',
voip:'VoIP'
},
upfFlow:{
title: "用户面吞吐量",
@@ -549,6 +422,7 @@ export default {
},
userActivity: {
title: "用户活动",
imsTitle: "IMS 活动",
type: "类型",
duration: "时长",
caller: "主叫",
@@ -567,23 +441,32 @@ export default {
rowInfo: "记录信息",
type: "记录类型",
duration: "通话时长",
mosAverage: "MOS",
callConnectionTime: "Call Connection Time",
seizureTime: "呼叫开始时间",
releaseTime: "挂断结束时间",
caller: "主叫",
called: "被叫",
result: "结果",
resultCode: "结果码",
resultCause: "结果原因",
resultOk: "成功",
resultFail: "失败",
delTip: "确认删除编号为【{msg}】的数据项?",
exportTip: "确认导出当前查询条件的话单数据吗?(导出最大支持一万条)",
smfChargingID: '计费ID',
tenantName: "租户名称",
exportTip: "确认导出当前查询条件的话单数据吗?",
chargingID: '计费ID',
smfSubscriptionIDData: '订阅 ID 数据',
smfSubscriptionIDType: '订阅 ID 类型',
smfDataVolumeUplink: '数据量上行链路',
smfDataVolumeDownlink: '数据量下行链路',
smfDataTotalVolume: '数据总量',
smfDuration: '持续时间',
smfInvocationTime: '调用时间',
durationTime: '持续时间',
invocationTime: '调用时间',
sgwcServedIMSI: 'IMSI',
sgwcServedMSISDN: 'MSISDN',
sgwcVolumeGPRSUplink: 'GPRS 上行链路',
sgwcVolumeGPRSDownlink: 'GPRS 下行链路',
},
ue: {
eventType: "事件类型",
@@ -595,7 +478,7 @@ export default {
result: "结果",
resultOk: "成功",
delTip: "确认删除编号为【{msg}】的数据项?",
exportTip: "确认导出当前查询条件的事件数据吗?(导出最大支持一万条)",
exportTip: "确认导出当前查询条件的事件数据吗?",
},
},
ne: {
@@ -618,6 +501,8 @@ export default {
portTip: "网元服务端口,默认:33030",
serialNum: '序列号',
expiryDate: '许可证到期日期',
ueNumber: '用户数',
nbNumber: '基站数',
normalcy: '正常',
exceptions: '异常',
restart: '重启',
@@ -655,7 +540,7 @@ export default {
delTip: '确认删除网元信息数据项吗?',
oam: {
title: 'OAM配置',
sync: '同步到网元',
restart: '下发后重启网元',
oamEnable: '服务',
oamPort: '端口',
snmpEnable: '服务',
@@ -758,14 +643,15 @@ export default {
upgradeDone: '更新完成,服务正在重载',
upgradeFail: '更新失败,请检查软件文件是否存在且服务终端环境是否可用!',
upgradeModal: '网元版本更新',
noPath: '软件包文件未发现',
},
neLicense: {
status: "许可证状态",
change: "变更许可证",
reload: "刷新信息",
reloadTip: "确认要刷新许可证信息吗?",
reloadBatch: "批量刷新",
reloadBatchTip: "对勾选的记录进行信息刷新吗?",
reloadBatch: "刷新许可证状态",
reloadBatchTip: "对当前列表网元进行许可证状态信息刷新吗?",
updateTtile: "更新许可证",
downCodeTop: "确认要将许可激活码保存到文件吗?",
activationRequestCode: "许可激活码",
@@ -781,7 +667,9 @@ export default {
treeSelectTip: "左侧配置导航中选择配置项信息!",
neType: "网元类型",
neTypePleace: "请选择网元类型",
neIdSyncPleace: "请选择同步网元",
noConfigData: "暂无配置项数据",
noConfigdDisabled: "配置项网元未正常服务",
updateValue: "【 {num} 】 属性值修改成功",
updateValueErr: "属性值修改失败",
updateItem: "修改 Index 为 {num} 记录成功",
@@ -805,6 +693,19 @@ export default {
name: "名称",
downTip: '确认要下载备份文件【{txt}】吗?',
title: "修改备份信息 {txt}",
backupModal: {
pushFileOper: "将当前文件发送到远程备份",
title: "设置远程备份服务",
enable: "启用",
toIp: "服务IP",
toIpPleace: "请输入远程备份服务器 IP 地址",
toPort: "服务端口",
username: "登录用户名",
usernamePleace: '请输入服务登录用户名',
password: "登录密码",
dir: "保存目录",
dirPleace: '请输入服务地址目标文件目录',
}
},
neQuickSetup: {
reloadPara5G: '刷新',
@@ -855,6 +756,58 @@ export default {
licenseTip2: '2. 点击【结束】将结束安装过程',
},
},
neData: {
common: {
startIMSI: '起始IMSI',
imsi: 'IMSI',
imsiTip: 'IMSI=MCC+MNC+MSIN',
imsiTip1: 'MCC=移动国家号码, 由三位数字组成',
imsiTip2: 'MNC=移动网络号,由两位数字组成',
imsiTip3: 'MSIN=移动客户识别码采用等长10位数字构成',
imsiPlease: "请正确输入IMSI",
msisdn: '移动客户识别码',
msisdnPlease: "请正确输入移动客户识别码",
loadDataConfirm: '确认要重新加载数据吗?',
loadData: '加载数据',
loadDataTip: '成功获取加载数据:{num}条,系统内部正在进行数据更新,大约需要{timer}秒,请稍候!!!',
batchOper: '批量操作',
batchAddText: '批量新增',
batchDelText: '批量删除',
batchUpdateText: '批量更新',
batchNum: '批量个数',
checkDel:'勾选删除',
importTemplate: '导入模板',
},
baseStation: {
list: "列表",
topology: "拓扑图",
nbName: "设备名称",
nbId: "设备ID",
ueNum: "在线用户数",
topologyTitle: "基站状态关系图",
name: "基站名称",
namePlease: "文本内容长度0~64",
position: "基站位置",
positionPlease: "位置描述。禁止空格文本内容长度0-64",
address: "IP地址",
addressPlease: "文本内容长度0~64",
state: "基站状态",
online: "在线",
offline: "离线",
time: "变更时间",
addRadio: "添加基站信息",
editRadio: "更新基站信息",
history: "历史记录",
exportTip: "确认根据搜索条件导出xlsx表格文件吗?",
importDataEmpty: "导入数据为空",
},
backupData: {
auth: "UDM鉴权用户",
sub: "UDM签约用户",
voip: "VOIP鉴权用户",
volte: "IMS签约用户",
}
},
neUser: {
auth: {
authInfo:'鉴权信息',
@@ -865,9 +818,10 @@ export default {
checkExport : '勾选导出',
checkExportConfirm: '确认导出已勾选的鉴权用户数据吗?',
import: '导入',
importFail: '失败记录',
loadDataConfirm: '确认要重新加载数据吗?',
loadData: '加载数据',
loadDataTip: '成功获取加载数据:{num}条,系统内部正在进行数据更新,请稍候!!!',
loadDataTip: '成功获取加载数据:{num}条,系统内部正在进行数据更新,大约需要{timer}秒,请稍候!!!',
startIMSI: '起始IMSI',
batchAddText: '批量新增',
batchDelText: '批量删除',
@@ -884,18 +838,21 @@ export default {
opcTip: '鉴权秘钥OPC是由Ki和OP经过计算得来的OP为运营商的根秘钥ki是鉴权秘钥,最大长度为32',
delSure:'确认删除IMSI编号为: {imsi} 的用户吗?',
imsiConfirm:'IMSI的长度必须为15',
startUserName:'起始用户名',
},
sub: {
subInfo:'签约信息',
neType: 'UDM网元类型',
imsType:'IMS网元类型',
export: '导出',
exportConfirm: '确认导出全部签约用户数据吗?',
checkExport : '勾选导出',
checkExportConfirm: '确认导出已勾选的签约用户数据吗?',
import: '导入',
importFail: '失败记录',
loadDataConfirm: '确认要重新加载数据吗?',
loadData: '加载数据',
loadDataTip: '成功获取加载数据:{num}条,系统内部正在进行数据更新,请稍候!!!',
loadDataTip: '成功获取加载数据:{num}条,系统内部正在进行数据更新,大约需要{timer}秒,请稍候!!!',
numAdd: '放号个数',
numDel: '删除个数',
checkDel:'勾选删除',
@@ -916,6 +873,10 @@ export default {
rfspTip:'RFSP 索引,在 NG-RAN 中,特定 RRM 配置的索引,参数介于0到127之间',
ueTypeTip: '运营商定义的用户 UE Usage Type整型参数介于0到127之间',
cnFlag: '是否开启 5G Core Network 服务',
cnFlag0: '不允许接入',
cnFlag1: '只能接入 5G',
cnFlag2: '只能接入 4G',
cnFlag3: '允许接入 4G/5G',
epsFlagTip: '是否开启 4G EPS 服务',
contextIdTip: '签约APN 上下文ID必须从APN Context list 中选择。',
apnContextTip: '手机可用的APN列表最多六个在HSS中定义。',
@@ -925,6 +886,12 @@ export default {
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中的IP1.2.3.4为5G用户internet这个APN分配的静态IP1.2.3.5为5G用户ims这个APN分配的静态IP。如果是动态分配把IP以及前面一个连接符去掉即可。需支持多个dnn用&连接',
smDataArrTip:'SST,DNN/APN为必填项',
tenantName:'租户名称',
imsiMode:'IMSI匹配模式',
fuzzyMatch:'模糊匹配',
prefixMatch:'前缀匹配',
fullMatch:'全匹配',
suffixMatch:'后缀匹配',
},
pcf: {
neType: 'PCF网元对象',
@@ -959,6 +926,8 @@ export default {
},
base5G: {
neType: '网元对象',
gnb:'5G 基站',
enb:'4G 基站',
},
n3iwf: {
neType: 'N3IWF网元对象',
@@ -971,7 +940,7 @@ export default {
},
nssf:{
neType: 'NSSF网元对象',
},
}
},
perfManage: {
taskManage:{
@@ -1054,6 +1023,14 @@ export default {
realTimeData: "实时数据",
},
customTarget:{
TourTitle1:'计算元素选择',
TourDes1:'选择已经勾选网元类型对应的指标用于计算公式',
TourTitle2:'计算符号选择',
TourDes2:'选择计算符号',
TourTitle3:'计算公式',
TourDes3:'由前面选择的计算元素和计算符号自动组成计算公式',
TourTitle4:'结果单位',
TourDes4:'单位可选可填。PS%符号时公式自动×100%',
kpiId:'自定义指标项',
kpiIdTip:'该网元没有自定义指标',
period:'颗粒度',
@@ -1062,7 +1039,14 @@ export default {
expression:'计算公式',
description:'描述',
kpiSet:'统计设置',
delCustomTip:'确认删除记录编号为 {num} 的数据项?',
ago1Hour:'过去1小时',
ago3Hour:'过去3小时',
ago6Hour:'过去6小时',
toDay:'今天',
ago1Day:'过去1天',
ago7Day:'过去7天',
ago15Day:'过去15天',
delCustomTip:'确认删除自定义指标项为 {num} 的数据项?',
delCustom:'成功删除记录编号为 {num} 自定义指标',
addCustom:'添加自定义指标',
editCustom:'编辑自定义指标',
@@ -1074,8 +1058,20 @@ export default {
element:'元素',
granularity:'颗粒度',
unit:'单位',
},
expressionModal:'表达式模块',
expressionErrorTip:'请检查表达式,错误的指标为{kpiId}',
expressionNoIdTip:'请检查表达式,没有找到任何有效的指标',
unitSelect:'为更好展示图需选择相同单位,当前单位为:',
avg:'(平均)',
total:'(累计)',
ago1:'近1天值',
ago7:'近7天值',
ago30:'近30天值',
},
kpiKeyTarget:{
"time":"时间",
"rawData":"表格数据",
"statistics":"指标",
"fullWidthLayout":"全宽布局",
"twoColumnLayout":"两列布局",
"saveLayout": "保存布局",
@@ -1088,34 +1084,39 @@ export default {
"layout3": "布局3"
},
kpiOverView:{
"kpiName":"指标名",
"maxValue":"最大值",
"maxValueTip":"用户筛选时间范围内度量数据的最大值。",
"minValue":"最小值",
"minValueTip":"用户筛选时间范围内度量数据的最小值。",
"avgValue":"平均值",
"avgValueTip":"用户筛选时间范围内度量数据的平均值。",
"totalValue":"总值",
"totalValueTip":"用户筛选时间范围内度量数据的总值。",
"kpiChartTitle":"网元指标概览",
"changeLine":"切换为折线图",
"changeBar":"切换为柱状图",
"chooseShowMetrics":"选择需要显示的指标",
"chooseMetrics":"选择指标",
"tips":"百分比和比率是平均值,计数是统计值。",
},
voiceOverView:{
"voiceTitle":"语音通话仪表盘",
"tips":"每分钟数据语音统计",
"ne":"网元",
"now":"现在",
"last":"过去",
"calls":"呼叫",
"activeCall":"正在通话",
"callMOMT":"呼叫 主叫接通率/被叫接通率",
"failedcall":"失败呼叫",
"registration":"注册",
"activeregistration":"主动注册",
"registrationsuccess":"注册成功率",
"failedregistration":"失败注册",
},
},
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: '命令',
@@ -1150,6 +1151,7 @@ export default {
},
task: {
traceId: '跟踪编号',
title: '跟踪标题',
trackType: '跟踪类型',
trackTypePlease: '请选择跟踪类型',
creater: '创建人',
@@ -1166,21 +1168,17 @@ export default {
imsiTip: '移动通信IMSI编号',
srcIp: '源IP地址',
srcIpPlease: '请输入源IP地址',
srcIpTip: '当前发送端IPv4地址',
srcIpTip: '发送端IPv4地址',
dstIp: '目标IP地址',
dstIpPlease: '请输入目标IP地址',
dstIpTip: '对方接收端IPv4地址',
dstIpTip: '接收端IPv4地址',
interfaces: '信令接口',
interfacesPlease: '请输入信令接口',
signalPort: '信令端口',
signalPortPlease: '请输入信令端口',
signalPortTip: '目标IP地址或源IP地址对应一方的端口',
rangePicker: '开始结束时间',
rangePicker: '任务时间',
rangePickerPlease: '请选择任务时间开始结束时间',
remark: '说明',
remarkPlease: '可输入任务说明',
addTask: '添加任务',
editTask: '修改任务',
viewTask: '查看任务',
errorTaskInfo: '获取任务信息失败',
delTaskTip: '确认删除记录编号为 {id} 的数据项?',
@@ -1190,6 +1188,15 @@ export default {
traceFile: "跟踪文件",
errMsg: "错误信息",
imsiORmsisdn: "imsi 或 msisdn 是空值,不能开始任务",
dataView: "跟踪数据",
protocolOrInterface: "协议/接口",
msgNe: '消息网元',
msgEvent: '消息事件',
msgType: '消息类型',
msgDirect: '消息方向',
msgLen: '消息长度',
rowTime: '消息时间',
taskInfo: '任务信息',
},
},
faultManage: {
@@ -1299,6 +1306,7 @@ export default {
size: "文件大小",
modifiedTime: "修改时间",
fileName: "文件名称",
downTipZip: "确认将目录 【{fileName}】 下载为ZIP文件?",
downTip: "确认下载文件名为 【{fileName}】 文件?",
downTipErr: "文件获取失败",
dirCd: "进入目录",
@@ -1309,12 +1317,19 @@ export default {
tailLines: '末尾行数',
},
exportFile:{
fileName:'文件来源',
fileSource:'文件来源',
fileSourcePlease:'请选择文件来源',
downTip: "确认下载文件名为 【{fileName}】 文件?",
downTipErr: "文件获取失败",
deleteTip: "确认删除文件名为 【{fileName}】 文件?",
deleteTipErr: "文件删除失败",
selectTip:"请选择文件名",
sysloginLog:'系统登录日志',
sysOperateLog:'系统操作日志',
neLog:'网元日志',
cdrIMS:'语音话单',
cdrSMF:'数据话单',
cdrSMSC:'短信话单',
cdrSGWC:'漫游数据话单',
}
},
monitor: {
@@ -1335,8 +1350,8 @@ export default {
filter: "全局过滤",
startTime: '开始时间',
endTime: '结束时间',
today: '天',
yesterday: '天',
today: '天',
yesterday: '天',
week: '本周',
month: '本月',
avgLoad: '平均负载',
@@ -1686,8 +1701,10 @@ export default {
userNum: '用户编号',
account: '登录账号',
userName: '用户昵称',
permission: '用户权限',
permission: '用户角色',
className: '部门名称',
userType: '用户类型',
tenntName:'租户名称',
loginIp: '登录地址',
loginTime: '登录时间',
status: '用户状态',
@@ -1713,6 +1730,7 @@ export default {
sex:'用户性别',
email:'电子邮箱',
fromClass:'所属部门',
fromTenant:'所属租户',
userWork:'用户岗位',
userWorkPlease: '请选择用户岗位',
userTip:'用户说明',
@@ -1726,6 +1744,7 @@ export default {
lock:'锁定',
inactive:'未激活',
active:'激活',
permissionTip:'若要选择租户角色,需保证起码租户管理中有一个租户',
},
config: {
configName: "参数名称",
@@ -1750,6 +1769,55 @@ export default {
refreshCacheTip: "确定要刷新参数配置缓存吗?",
refreshCacheOk: "刷新缓存成功",
},
loginSource: {
uid: "唯一标识",
name: "名称",
namePlease: '请正确输入认证源名称',
icon: "图标",
iconPlease: '可填入图片链接或上传图片路径地址',
type: "类型",
activeFlag: "状态",
remark: "备注说明",
createTime: "创建时间",
updateTime: "更新时间",
ldapUrl: "服务器地址",
ldapUrlPlease: '请正确输入LDAP 服务器地址',
ldapBaseDN: "基础DN",
baseDnPlease: '请正确输入LDAP 基础DN',
ldapUserFilter: "用户过滤",
userFilterPlease: '请正确输入LDAP 用户过滤',
ldapBindDN: "绑定DN",
ldapBindPassword: "绑定密码",
smtpHost: '服务器地址',
smtpHostPlease: '请正确输入SMTP 服务器地址',
smtpPort: '端口号',
smtpPortPlease: '请正确输入SMTP 端口号',
oauth2ClientID: '客户端ID',
oauth2ClientIDPlease: '请正确输入OAuth2 客户端ID',
oauth2ClientSecret: '客户端密钥',
oauth2ClientSecretPlease: '请正确输入OAuth2 客户端密钥',
oauth2AuthURL: '授权URL',
oauth2AuthURLPlease: '请正确输入OAuth2 授权URL',
oauth2TokenURL: '令牌URL',
oauth2TokenURLPlease: '请正确输入OAuth2 令牌URL',
oauth2UserURL: '用户信息URL',
oauth2UserURLPlease: '请正确输入OAuth2 用户信息URL',
oauth2AccountField: '账号字段',
oauth2AccountFieldPlease: '请正确输入OAuth2 账号字段',
oauth2Scopes: '作用域',
oauth2ScopesPlease: '请正确输入OAuth2 作用域',
oauth2RedirectURL: '重定向URL',
oauth2RedirectURLPlease: '请正确输入OAuth2 重定向URL',
oauth2RedirectURLTip: '请跳转指定路径(omchost/#/login/oauth2), 重定向携带code和state地址参数',
uploadFileTip: '确认要上传认证源图标吗?',
uploadFileOk: '认证源图标上传成功',
uploadFileErr: '认证源图标上传失败',
viewInfoErr: "获取认证源信息失败",
addInfo: "添加认证源",
editInfo: "修改认证源",
delTip: "确认删除认证源编号为 【{num}】 的数据项?",
delOk: "删除成功",
},
setting: {
charMaxLen: '位字符长度',
saveSubmit: '提交保存',
@@ -1809,6 +1877,10 @@ export default {
home: '系统首页',
homeTip:'确认要提交当前界面为系统界面吗?',
homeSet:'系统首页设置',
backup: '系统备份',
backupInstruction: '系统备份将会对当前系统上运行的网元信息记录及配置文件进行备份,可进行系统的恢复操作!',
backupExportTip: '确认要导出系统备份吗?',
backupImportTip: '确认要导入系统备份吗?',
},
role:{
allScopeOptions:'全部数据权限',
@@ -1853,6 +1925,7 @@ export default {
cancelGive:'取消授权',
cancelSure:'确认取消用户编号为 【{userId}】 的数据项授权?',
batchCancel:'批量取消授权',
selectUser:'分配用户',
},
dept:{
classInfo:'部门信息',
@@ -1873,6 +1946,37 @@ export default {
phone:'联系电话',
email:'邮箱',
},
tenant:{
classInfo:'租户信息',
className:'名称',
classId:'编号',
classSort:'排序',
status:'状态',
type:'租赁类型',
createTime:'创建时间',
highClass:'根级',
key:'租赁标识',
emailTip:'请输入正确的邮箱地址',
phoneTip:'请输入正确的手机号码',
node:'根节点',
delSure:'确认删除租户名为 【{title}】 的数据项?',
delTypeSure:'确认删除租赁类型为 【{tenancyAsset}】,租赁标识为【{tenancyKey}】 的数据项?',
open:'展',
close:'折',
addClass:'新增租户',
admin:'负责人',
phone:'联系电话',
email:'邮箱',
SDSST:'网络切片',
APN:'接入点',
IMSI:'SIM卡',
treeSelectTip:'请从左侧租户列表中选择租户进行配置',
upfTip:'请选择下拉列表UPF的资源唯一标识',
imsiTip:'请选择匹配类型和填入SIM卡号段',
radioTip:'请从下拉列表选择基站类型和基站ID',
defaultTip:'请选择租赁资产类别, 然后填写资产标识',
patternTip:'租赁标识不能包含特殊字符',
},
post:{
positionInfo:'岗位信息',
positionId:'岗位编号',

View File

@@ -1,10 +1,9 @@
<script setup lang="ts">
import {
ProLayout,
WaterMark,
getMenuData,
clearMenuItem,
type MenuDataItem,
MenuDataItem,
} from 'antdv-pro-layout';
import RightContent from './components/RightContent.vue';
import Tabs from './components/Tabs.vue';
@@ -12,26 +11,26 @@ import GlobalMask from '@/components/GlobalMask/index.vue';
import { scriptUrl } from '@/assets/js/icon_font_8d5l8fzk5b87iudi';
import {
computed,
reactive,
watch,
nextTick,
onMounted,
onUnmounted,
nextTick,
reactive,
watch,
} from 'vue';
import { useRouter } from 'vue-router';
import useLayoutStore from '@/store/modules/layout';
import useAppStore from '@/store/modules/app';
import useUserStore from '@/store/modules/user';
import useRouterStore from '@/store/modules/router';
import useTabsStore from '@/store/modules/tabs';
import useAlarmStore from '@/store/modules/alarm';
import useAppStore from '@/store/modules/app';
import { useRouter } from 'vue-router';
import { MENU_PATH_INLINE } from '@/constants/menu-constants';
const { proConfig, waterMarkContent } = useLayoutStore();
import useI18n from '@/hooks/useI18n';
import useAlarmStore from '@/store/modules/alarm';
import { getServerTime } from '@/api';
import { MENU_PATH_INLINE } from '@/constants/menu-constants';
import { RESULT_CODE_SUCCESS } from '@/constants/result-constants';
import { parseDateToStr } from '@/utils/date-utils';
import { parseDateToStr, YYYY_MM_DD_HH_MM_SSZ } from '@/utils/date-utils';
import { parseUrlPath } from '@/plugins/file-static-url';
const { proConfig, waterMarkContent } = useLayoutStore();
const { t, currentLocale } = useI18n();
const routerStore = useRouterStore();
const tabsStore = useTabsStore();
@@ -39,7 +38,7 @@ const appStore = useAppStore();
const router = useRouter();
/**菜单面板 */
let layoutState = reactive({
const layoutState = reactive({
collapsed: false, // 是否展开菜单面板
openKeys: ['/'], // 打开菜单key
selectedKeys: ['/index'], // 选中高亮菜单key
@@ -66,19 +65,28 @@ watch(
{ immediate: true }
);
// 动态路由添加到菜单面板
const rootRoute = router.getRoutes().find(r => r.name === 'Root');
if (rootRoute) {
const children = routerStore.setRootRouterData(rootRoute.children);
const buildRouterData = routerStore.buildRouterData;
if (buildRouterData.length > 0) {
rootRoute.children = children.concat(buildRouterData);
} else {
rootRoute.children = children;
const menuData = computed(() => {
// 动态路由添加到菜单面板
const rootRoute = router.getRoutes().find(r => r.name === 'Root');
if (rootRoute) {
const children = routerStore.setRootRouterData(rootRoute.children);
const buildRouterData = routerStore.buildRouterData;
if (buildRouterData.length > 0) {
rootRoute.children = children.concat(buildRouterData);
} else {
rootRoute.children = children;
}
// console.log(JSON.parse(JSON.stringify(rootRoute.children)));
if (!useUserStore().roles.includes('tenant')) {
rootRoute.children = rootRoute.children.filter(
item => item.name !== 'Index'
);
}
}
}
const { menuData } = getMenuData(clearMenuItem(router.getRoutes()));
const { menuData } = getMenuData(clearMenuItem(router.getRoutes()));
return menuData;
});
/**面包屑数据对象,排除根节点和首页不显示 */
const breadcrumb = computed(() => {
@@ -200,6 +208,7 @@ let serverTime = reactive({
zone: 'UTC', // 时区 UTC
interval: null as any, // 定时器
});
let activeAlarmRefresh = 0;
// 获取服务器时间
function fnGetServerTime() {
@@ -213,10 +222,18 @@ function fnGetServerTime() {
serverTime.timestamp = parseInt(res.data.timestamp);
serverTime.interval = setInterval(() => {
serverTime.timestamp += 1000;
activeAlarmRefresh += 1;
// serverTimeStr.value = parseDateToStr(serverTime.timestamp);
// 用DOM直接修改
if (serverTimeDom) {
serverTimeDom.innerText = parseDateToStr(serverTime.timestamp);
serverTimeDom.innerText = parseDateToStr(
serverTime.timestamp,
YYYY_MM_DD_HH_MM_SSZ
);
}
if (activeAlarmRefresh === 5) {
useAlarmStore().fnGetActiveAlarmInfo();
activeAlarmRefresh = 0;
}
}, 1000);
}
@@ -247,7 +264,7 @@ onUnmounted(() => {
</script>
<template>
<WaterMark :content="waterMarkContent" :z-index="100">
<a-watermark :content="waterMarkContent" :z-index="100">
<ProLayout
v-model:collapsed="layoutState.collapsed"
v-model:selectedKeys="layoutState.selectedKeys"
@@ -257,6 +274,7 @@ onUnmounted(() => {
v-bind="proConfig"
:iconfont-url="scriptUrl"
:locale="fnLocale"
:sider-width="256"
>
<!--插槽-菜单头-->
<template #menuHeaderRender>
@@ -290,10 +308,10 @@ onUnmounted(() => {
</RouterLink>
</template>
<!--插槽-顶部左侧,只对side布局有效-->
<!--插槽-渲染顶部内容区域,仅布局side有效-->
<template #headerContentRender></template>
<!--插槽-顶部右侧-->
<!--插槽-渲染顶部内容右端区域-->
<template #headerContentRightRender>
<RightContent />
</template>
@@ -364,7 +382,7 @@ onUnmounted(() => {
<!-- 全局遮罩 -->
<GlobalMask />
</WaterMark>
</a-watermark>
</template>
<style lang="less" scoped>
@@ -413,6 +431,19 @@ onUnmounted(() => {
}
}
.theme-light.theme-menu-light .app-name {
color: #141414 !important;
}
.theme-light.theme-menu-dark .app-name {
color: #fff !important;
}
.theme-dark.theme-menu-light .app-name {
color: #fff !important;
}
.theme-dark.theme-menu-dark .app-name {
color: #fff !important;
}
.footer {
z-index: 16;
margin: 0px;
@@ -427,6 +458,7 @@ onUnmounted(() => {
flex-direction: row;
flex-wrap: nowrap;
justify-content: space-between;
align-items: center;
padding: 4px 16px;
background: #fff;
box-shadow: 0 1px 4px #0015291f;
@@ -434,6 +466,10 @@ onUnmounted(() => {
height: 32px;
}
[data-theme='dark'] &-fixed {
background: #141414;
}
& #serverTimeDom {
color: inherit;
opacity: 0.85;

View File

@@ -1,16 +1,26 @@
<script setup lang="ts">
import { MenuInfo } from 'ant-design-vue/lib/menu/src/interface';
import svgLight from '@/assets/svg/light.svg';
import svgDark from '@/assets/svg/dark.svg';
import { MenuInfo } from 'ant-design-vue/es/menu/src/interface';
import { viewTransitionTheme } from 'antdv-pro-layout';
import { ProModal } from 'antdv-pro-modal';
import SearchMenu from './SearchMenu.vue';
import { ref } from 'vue';
import { useRoute, useRouter } from 'vue-router';
import { useFullscreen } from '@vueuse/core';
import { hasPermissions } from '@/plugins/auth-user';
import useI18n from '@/hooks/useI18n';
import useLayoutStore from '@/store/modules/layout';
import useAppStore from '@/store/modules/app';
import useUserStore from '@/store/modules/user';
import useAlarmStore from '@/store/modules/alarm';
import useMaskStore from '@/store/modules/mask';
import { hasPermissions } from '@/plugins/auth-user';
import { ref } from 'vue';
import { dbClear } from '@/utils/cache-db-utils';
import { CACHE_DB_TABLE_DND } from '@/constants/cache-keys-constants';
import { TENANTADMIN_ROLE_KEY } from '@/constants/admin-constants';
const { isFullscreen, toggle } = useFullscreen();
const { t, changeLocale, optionsLocale } = useI18n();
const layoutStore = useLayoutStore();
const maskStore = useMaskStore();
const userStore = useUserStore();
const appStore = useAppStore();
@@ -27,7 +37,10 @@ function fnClick({ key }: MenuInfo) {
router.push({ name: 'Profile' });
break;
case 'logout':
userStore.fnLogOut().finally(() => router.push({ name: 'Login' }));
userStore.fnLogOut().finally(() => {
dbClear(CACHE_DB_TABLE_DND);
router.push({ name: 'Login' });
});
break;
}
}
@@ -57,6 +70,13 @@ function fnClickAlarm() {
router.push({ name: 'ActiveAlarm_2088' });
}
/**改变主题色 */
function fnClickTheme(e: any) {
viewTransitionTheme(isDarkMode => {
layoutStore.changeConf('theme', isDarkMode ? 'light' : 'dark');
}, e);
}
/**改变多语言 */
function fnChangeLocale(e: any) {
changeLocale(e.key);
@@ -65,25 +85,37 @@ function fnChangeLocale(e: any) {
<template>
<a-space :size="12" align="center">
<a-tooltip placement="bottom">
<template #title>{{ t('loayouts.rightContent.alarm') }}</template>
<a-button type="text" style="color: inherit" @click="fnClickAlarm">
<template #icon>
<a-badge
:count="useAlarmStore().activeAlarmTotal"
:overflow-count="99"
status="warning"
style="color: inherit"
>
<BellOutlined />
</a-badge>
</template>
</a-button>
</a-tooltip>
<!-- 搜索功能 -->
<span >
<SearchMenu />
</span>
<span v-roles:has="[TENANTADMIN_ROLE_KEY]">
<a-tooltip placement="bottom">
<template #title>{{ t('loayouts.rightContent.alarm') }}</template>
<a-button
type="text"
style="color: inherit"
@click="fnClickAlarm"
v-perms:has="['faultManage:active-alarm:index']"
>
<template #icon>
<a-badge
:count="useAlarmStore().activeAlarmTotal"
:overflow-count="99"
status="warning"
style="color: inherit"
>
<BellOutlined />
</a-badge>
</template>
</a-button>
</a-tooltip>
</span>
<!-- 锁屏操作 -->
<span v-perms:has="['system:setting:lock']">
<a-tooltip placement="bottom">
<a-tooltip placement="bottomRight">
<template #title>{{ t('loayouts.rightContent.lock') }}</template>
<a-button type="text" style="color: inherit" @click="fnClickLock()">
<template #icon>
@@ -92,10 +124,11 @@ function fnChangeLocale(e: any) {
</a-button>
<ProModal
:drag="true"
:center-y="true"
:width="400"
:minHeight="200"
:mask-closable="false"
v-model:visible="lockConfirm"
v-model:open="lockConfirm"
:title="t('loayouts.rightContent.lockTip')"
@ok="fnClickLockToPage()"
>
@@ -119,7 +152,7 @@ function fnChangeLocale(e: any) {
</a-tooltip>
</span>
<a-tooltip placement="bottom">
<a-tooltip placement="bottomRight">
<template #title>{{ t('loayouts.rightContent.fullscreen') }}</template>
<a-button type="text" style="color: inherit" @click="toggle">
<template #icon>
@@ -129,14 +162,27 @@ function fnChangeLocale(e: any) {
</a-button>
</a-tooltip>
<a-tooltip placement="bottomRight">
<template #title>{{ t('loayouts.rightContent.theme') }}</template>
<a-button type="text" @click="fnClickTheme">
<template #icon>
<img
v-if="layoutStore.proConfig.theme === 'dark'"
:src="svgDark"
class="theme-icon"
/>
<img v-else :src="svgLight" class="theme-icon" />
</template>
</a-button>
</a-tooltip>
<a-dropdown
placement="bottom"
placement="bottomRight"
trigger="click"
v-if="appStore.i18nOpen && hasPermissions(['system:setting:i18n'])"
>
<a-button size="small" type="default">
{{ t('i18n') }}
<DownOutlined />
<a-button type="text" style="color: inherit">
<template #icon> <TranslationOutlined /> </template>
</a-button>
<template #overlay>
<a-menu @click="fnChangeLocale">
@@ -204,4 +250,11 @@ function fnChangeLocale(e: any) {
overflow: hidden;
}
}
.theme-icon {
width: 18px;
height: 18px;
margin-bottom: 4px;
color: inherit;
}
</style>

View File

@@ -0,0 +1,380 @@
<template>
<!-- 搜索按钮 -->
<a-tooltip placement="bottom">
<template #title>{{ t('common.search') }}</template>
<a-button type="text" style="color: inherit" @click="fnClickSearch">
<template #icon>
<SearchOutlined />
</template>
</a-button>
</a-tooltip>
<!-- 搜索弹窗 -->
<ProModal
:drag="false"
:center-y="true"
:width="600"
:minHeight="400"
:mask-closable="true"
v-model:open="searchModalOpen"
:title="t('common.search')"
:footer="null"
@cancel="fnCloseSearch"
>
<div class="search-modal-content">
<a-input
ref="searchInputRef"
v-model:value="searchKeyword"
:placeholder="t('common.searchPlease')"
size="large"
style="margin-bottom: 16px"
@keydown="fnHandleKeydown"
>
<template #prefix>
<SearchOutlined style="color: #bfbfbf" />
</template>
</a-input>
<div class="search-results">
<div v-if="filteredMenus.length === 0" class="no-results">
<a-empty
:description="
searchKeyword ? t('common.noData') : t('common.searchTip')
"
:image="false"
/>
</div>
<div v-else class="menu-list">
<div
v-for="menu in filteredMenus"
:key="menu.key"
class="menu-item"
@click="fnSelectMenu(menu)"
>
<div class="menu-icon">
<!-- 处理自定义图标字体 -->
<IconFont
v-if="menu.icon && menu.icon.startsWith('icon-')"
:type="menu.icon"
class="icon"
/>
<!-- 处理Ant Design图标组件 -->
<component
:is="menu.icon"
v-else-if="menu.icon && !menu.icon.startsWith('icon-')"
class="icon"
/>
<!-- 默认图标 -->
<FolderOutlined v-else class="icon" />
</div>
<div class="menu-info">
<div class="menu-title">{{ menu.title }}</div>
</div>
<div class="menu-action">
<RightOutlined />
</div>
</div>
</div>
</div>
</div>
</ProModal>
</template>
<script setup lang="ts">
import { getMenuData, clearMenuItem } from 'antdv-pro-layout';
import { ProModal } from 'antdv-pro-modal';
import IconFont from '@/components/IconFont/index.vue';
import { ref, computed, nextTick } from 'vue';
import { useRouter } from 'vue-router';
import useI18n from '@/hooks/useI18n';
import useUserStore from '@/store/modules/user';
import useRouterStore from '@/store/modules/router';
const { t } = useI18n();
const userStore = useUserStore();
const routerStore = useRouterStore();
const router = useRouter();
// 搜索相关状态
const searchModalOpen = ref<boolean>(false);
const searchKeyword = ref<string>('');
const searchInputRef = ref();
// 获取所有可搜索的菜单项
const searchableMenus = computed(() => {
const menus: Array<{
title: string;
path: string;
icon?: string;
key: string;
routeName?: string;
}> = [];
// 使用和BasicLayout完全相同的菜单数据获取逻辑
const getMenuDataForSearch = () => {
// 动态路由添加到菜单面板
const rootRoute = router.getRoutes().find(r => r.name === 'Root');
if (rootRoute) {
const children = routerStore.setRootRouterData(rootRoute.children);
const buildRouterData = routerStore.buildRouterData;
if (buildRouterData.length > 0) {
rootRoute.children = children.concat(buildRouterData);
} else {
rootRoute.children = children;
}
// 根据用户角色过滤
if (!userStore.roles.includes('tenant')) {
rootRoute.children = rootRoute.children.filter(
item => item.name !== 'Index'
);
}
}
// 使用和BasicLayout相同的处理方法
const { menuData } = getMenuData(clearMenuItem(router.getRoutes()));
return menuData;
};
// 递归获取所有路由项
const getRouteItems = (routes: any[], parentPath = '') => {
routes.forEach((route: any) => {
// 跳过根路径和不显示的菜单
if (route.path === '/' || route.path === '' || route.meta?.hideInMenu) {
// 继续处理子路由
if (route.children && route.children.length > 0) {
getRouteItems(route.children, route.path === '/' ? '' : route.path);
}
return;
}
// 构建完整路径
let fullPath = route.path;
if (!route.path.startsWith('/') && parentPath) {
fullPath = `${parentPath}/${route.path}`;
}
// 只添加有meta.title的路由项
if (route.meta && route.meta.title) {
try {
const title = t(route.meta.title);
// 避免重复添加已存在的路由
const exists = menus.find(
m => m.routeName === route.name || m.path === fullPath
);
if (!exists) {
menus.push({
title: title,
path: fullPath,
icon: route.meta.icon,
key: route.name || fullPath,
routeName: route.name,
});
}
} catch (error) {
// 如果翻译失败,使用原始标题
const exists = menus.find(
m => m.routeName === route.name || m.path === fullPath
);
if (!exists) {
menus.push({
title: route.meta.title,
path: fullPath,
icon: route.meta.icon,
key: route.name || fullPath,
routeName: route.name,
});
}
}
}
// 处理子路由
if (route.children && route.children.length > 0) {
getRouteItems(route.children, fullPath);
}
});
};
// 使用和菜单面板相同的数据源
const menuRoutes = getMenuDataForSearch();
if (menuRoutes && menuRoutes.length > 0) {
getRouteItems(menuRoutes);
}
return menus;
});
// 过滤的菜单项
const filteredMenus = computed(() => {
if (!searchKeyword.value.trim()) {
return searchableMenus.value.slice(0, 10); // 默认显示前10个
}
// return searchableMenus.value.filter(menu =>
// menu.title.toLowerCase().includes(searchKeyword.value.toLowerCase()) ||
// menu.path.toLowerCase().includes(searchKeyword.value.toLowerCase())
// ).slice(0, 10);
const value = searchKeyword.value.toLowerCase();
return searchableMenus.value
.filter(menu => menu.title.toLowerCase().includes(value))
.slice(0, 10);
});
/**打开搜索弹窗 */
function fnClickSearch() {
searchModalOpen.value = true;
searchKeyword.value = '';
nextTick(() => {
searchInputRef.value?.focus();
});
}
/**关闭搜索弹窗 */
function fnCloseSearch() {
searchModalOpen.value = false;
searchKeyword.value = '';
}
/**选择菜单项并跳转 */
function fnSelectMenu(menu: any) {
try {
// 优先使用路由名称跳转
if (menu.routeName) {
router.push({ name: menu.routeName });
} else {
router.push(menu.path);
}
fnCloseSearch();
} catch (error) {
// 如果跳转失败,尝试直接使用路径
try {
router.push(menu.path);
fnCloseSearch();
} catch (secondError) {
// 可以在这里添加错误提示
}
}
}
/**键盘事件处理 */
function fnHandleKeydown(e: KeyboardEvent) {
if (e.key === 'Escape') {
fnCloseSearch();
}
}
</script>
<style lang="less" scoped>
.search-modal-content {
.search-results {
max-height: 400px;
overflow-y: auto;
.no-results {
text-align: center;
padding: 40px 0;
}
.menu-list {
.menu-item {
display: flex;
align-items: center;
padding: 12px 16px;
border-radius: 8px;
cursor: pointer;
transition: all 0.2s ease;
margin-bottom: 4px;
&:hover {
background-color: #f5f5f5;
.menu-action {
opacity: 1;
}
}
.menu-icon {
margin-right: 12px;
display: flex;
align-items: center;
justify-content: center;
width: 32px;
height: 32px;
background-color: #f0f2f5;
border-radius: 6px;
.icon {
font-size: 16px;
color: #666;
}
}
.menu-info {
flex: 1;
min-width: 0;
.menu-title {
font-size: 14px;
font-weight: 500;
color: #262626;
margin-bottom: 2px;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.menu-path {
font-size: 12px;
color: #8c8c8c;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
}
.menu-action {
opacity: 0;
transition: opacity 0.2s ease;
color: #bfbfbf;
font-size: 12px;
}
}
}
}
}
// 暗黑主题支持
[data-theme='dark'] {
.search-modal-content {
.search-results {
.menu-list {
.menu-item {
&:hover {
background-color: #303030;
}
.menu-icon {
background-color: #262626;
.icon {
color: #bfbfbf;
}
}
.menu-info {
.menu-title {
color: #f0f0f0;
}
.menu-path {
color: #8c8c8c;
}
}
}
}
}
}
}
</style>

View File

@@ -4,9 +4,9 @@ import { computed, watch } from 'vue';
import { useRouter } from 'vue-router';
import useTabsStore from '@/store/modules/tabs';
import useI18n from '@/hooks/useI18n';
const { t } = useI18n();
const tabsStore = useTabsStore();
const router = useRouter();
const { t } = useI18n();
defineProps({
/**标签栏宽度 */
@@ -112,7 +112,7 @@ watch(router.currentRoute, v => tabsStore.tabOpen(v), { immediate: true });
<a-tabs
class="tabs"
:class="{ 'tabs-fixed': fixedHeader }"
:style="{ width: width, top: headerRender === false ? 0 : undefined }"
:style="{ width: fixedHeader ? width : '100%', top: headerRender === false ? 0 : undefined }"
hide-add
tab-position="top"
type="editable-card"
@@ -150,7 +150,7 @@ watch(router.currentRoute, v => tabsStore.tabOpen(v), { immediate: true });
</a-tooltip>
<a-tooltip placement="topRight">
<template #title>{{ t('loayouts.tabs.more') }}</template>
<a-dropdown trigger="click" placement="bottomRight">
<a-dropdown placement="bottomRight" trigger="click">
<a-button type="ghost" shape="circle" size="small">
<template #icon><DownOutlined /></template>
</a-button>
@@ -199,7 +199,18 @@ watch(router.currentRoute, v => tabsStore.tabOpen(v), { immediate: true });
}
}
[data-theme='dark'] .tabs {
background: #141414;
}
.tabs :deep(.ant-tabs-nav:before) {
border-bottom: none;
}
.tabs :deep(.ant-tabs-nav-list .ant-tabs-tab) {
border-radius: 8px;
}
.tabs :deep(.ant-tabs-nav-list .ant-tabs-tab.ant-tabs-tab-active) {
border-bottom-right-radius: unset;
border-bottom-left-radius: unset;
}
</style>

View File

@@ -4,16 +4,15 @@ import App from './App.vue';
import router from './router';
import directive from './directive';
import i18n from './i18n';
import ProModal from "antdv-pro-modal";
import 'antdv-pro-layout/dist/style.css';
import 'antdv-pro-modal/dist/style.css';
import 'ant-design-vue/dist/antd.variable.min.css';
import 'antdv-pro-layout/dist/style.css';
import 'ant-design-vue/dist/reset.css';
const app = createApp(App);
app.use(store);
app.use(router);
app.use(directive);
app.use(i18n);
app.use(ProModal);
app.mount('#app');

View File

@@ -19,3 +19,26 @@ export function parseUrlPath(path: string) {
: import.meta.env.VITE_API_BASE_URL;
return `${baseUrl}${path}?r=${Math.random().toFixed(2)}`;
}
/**
* 解析静态文件相对路径
* @param path 静态资源文件
* @returns
*/
export function parseBasePath(path: string) {
if (!path || path === '#') {
return '#';
}
if (validHttp(path)) {
return path;
}
// 兼容旧前端可改配置文件
const baseUrl = import.meta.env.VITE_HISTORY_BASE_URL;
let scriptUrl =
baseUrl.length === 1 && baseUrl.indexOf('/') === 0
? ''
: baseUrl.indexOf('/') === -1
? '/' + baseUrl
: baseUrl;
return `${scriptUrl}${path}?r=${Math.random().toFixed(2)}`;
}

View File

@@ -61,7 +61,7 @@ type OptionsType = {
/**请求地址 */
url: string;
/**请求方法 */
method: 'get' | 'post' | 'put' | 'delete' | 'PATCH';
method: 'get' | 'post' | 'put' | 'delete' | 'PATCH' | 'GET' | 'POST' | 'PUT' | 'DELETE';
/**请求头 */
headers?: HeadersInit;
/**地址栏参数 */
@@ -198,7 +198,7 @@ function beforeRequest(options: OptionsType): OptionsType | Promise<any> {
if (options.method === 'get') return options;
// 非get参数提交
let body = options.data
let body = options.data;
if (body instanceof FormData) {
options.body = body;
} else if (body) {

View File

@@ -119,17 +119,15 @@ export class WS {
};
// 用于指定当从服务器接受到信息时的回调函数。
ws.onmessage = ev => {
if (ev.type !== 'message') return;
// 解析文本消息
if (ev.type === 'message') {
const data = ev.data;
try {
const jsonData = JSON.parse(data);
if (typeof options.onmessage === 'function') {
options.onmessage(jsonData);
}
} catch (error) {
console.error('websocket message formatting error', error);
try {
const jsonData = JSON.parse(ev.data);
if (typeof options.onmessage === 'function') {
options.onmessage(jsonData);
}
} catch (error) {
console.error('websocket message formatting error', error);
}
};
// 用于指定连接关闭后的回调函数。
@@ -221,7 +219,7 @@ export class WS {
this.heartInterval = window.setInterval(() => {
this.send({
requestId: `${Date.now()}`,
type: 'ping',
type: 'PING',
});
}, heartTimer);
}

View File

@@ -13,6 +13,8 @@ import { validHttp } from '@/utils/regular-utils';
import useUserStore from '@/store/modules/user';
import useAppStore from '@/store/modules/app';
import useRouterStore from '@/store/modules/router';
import useNeInfoStore from '@/store/modules/neinfo';
import useNeListStore from '@/store/modules/ne_list';
// NProgress Configuration
NProgress.configure({ showSpinner: false });
@@ -30,12 +32,15 @@ const constantRoutes: RouteRecordRaw[] = [
name: 'Root',
component: BasicLayout,
redirect: '/index',
// redirect: '/monitor/dashboard',
children: [
{
path: '/index',
name: 'Index',
meta: { title: 'router.index', icon: 'icon-pcduan' },
component: () => import('@/views/index.vue'),
// meta: { title: 'router.index', icon: 'icon-pcduan', hideInMenu: true },
// redirect: '/monitor/dashboard',
},
{
path: '/account',
@@ -63,11 +68,16 @@ const constantRoutes: RouteRecordRaw[] = [
},
],
},
{
path: '/login/oauth2',
name: 'LoginOAuth2', // 第三方认证重定向
component: () => import('@/views/login/oauth2.vue'),
},
{
path: '/login',
name: 'Login',
meta: { title: 'router.login' },
component: () => import('@/views/login.vue'),
component: () => import('@/views/login/index.vue'),
},
{
path: '/register',
@@ -156,7 +166,7 @@ router.afterEach((to, from, failure) => {
/**无Token可访问页面地址白名单 */
const WHITE_LIST: string[] = [
'/login',
'/auth-redirect',
'/login/oauth2',
'/help',
'/register',
'/quick-start',
@@ -182,7 +192,12 @@ router.beforeEach(async (to, from, next) => {
next({ name: 'Index' });
}
const token = getToken();
let token = getToken();
// 免用户登录认证
if (!appStore.loginAuth) {
token = '== Not Login Auth ==';
}
// 没有token
if (!token) {
@@ -205,6 +220,9 @@ router.beforeEach(async (to, from, next) => {
const user = useUserStore();
if (user.roles && user.roles.length === 0) {
try {
useNeInfoStore().fnRefreshNelist();
useNeListStore().fnNelistRefresh();
// 获取用户信息
await user.fnGetInfo();
// 获取路由信息

View File

@@ -1,9 +1,10 @@
import { getSysConf } from '@/api';
import { CACHE_LOCAL_I18N } from '@/constants/cache-keys-constants';
import { CACHE_LOCAL_I18N, CACHE_SESSION_CRYPTO_API } from '@/constants/cache-keys-constants';
import { RESULT_CODE_SUCCESS } from '@/constants/result-constants';
import { removeToken } from '@/plugins/auth-token';
import { parseUrlPath } from '@/plugins/file-static-url';
import { localGet, localSet } from '@/utils/cache-local-utils';
import { sessionSet } from '@/utils/cache-session-utils';
import { defineStore } from 'pinia';
/**应用参数类型 */
@@ -20,6 +21,10 @@ type AppStore = {
buildTime: string;
/**系统引导使用 */
bootloader: boolean;
// 用户登录认证
loginAuth: boolean;
// 用户接口加密
cryptoApi: boolean;
// 序列号
serialNum: string;
/**应用版权声明 */
@@ -52,6 +57,8 @@ const useAppStore = defineStore('app', {
version: `-`,
buildTime: `-`,
bootloader: false,
loginAuth: true,
cryptoApi: true,
serialNum: `-`,
copyright: `Copyright ©2023 For ${import.meta.env.VITE_APP_NAME}`,
logoType: 'icon',
@@ -85,6 +92,9 @@ const useAppStore = defineStore('app', {
if (this.bootloader) {
removeToken();
}
this.loginAuth = res.data.loginAuth !== 'false';
this.cryptoApi = res.data.cryptoApi !== 'false';
sessionSet(CACHE_SESSION_CRYPTO_API, res.data.cryptoApi);
this.serialNum = res.data.serialNum;
this.appName = res.data.title;
this.copyright = res.data.copyright;

View File

@@ -1,16 +1,23 @@
import { CACHE_LOCAL_PROCONFIG } from '@/constants/cache-keys-constants';
import { localGetJSON, localSetJSON } from '@/utils/cache-local-utils';
import { theme } from 'ant-design-vue/es';
import type { ThemeConfig } from 'ant-design-vue/es/config-provider/context';
import { defineStore } from 'pinia';
import {
CACHE_LOCAL_PRIMARY_COLOR,
CACHE_LOCAL_PROCONFIG,
} from '@/constants/cache-keys-constants';
import {
localGet,
localGetJSON,
localSetJSON,
} from '@/utils/cache-local-utils';
/**布局参数类型 */
type LayoutStore = {
/**布局设置抽屉显示 */
visible: boolean;
/**布局配置 */
proConfig: {
/**导航布局 */
layout: 'side' | 'top' | 'mix';
/**全局主题色,需要导入样式文件 */
/**全局主题色*/
theme: 'dark' | 'light';
/**菜单导航主题色 */
menuTheme: 'dark' | 'light';
@@ -29,10 +36,33 @@ type LayoutStore = {
/**内容区域-导航标签项 */
tabRender: any | boolean | undefined;
};
/**主题配置 */
themeConfig: ThemeConfig;
/**水印内容 */
waterMarkContent: string;
};
/**
* 获取随机颜色范围
* @returns 颜色
*/
function getRandomColor(): string {
const colors: string[] = [
'#f5222d',
'#fa541c',
'#fa8c16',
'#a0d911',
'#13c2c2',
'#1890ff',
'#722ed1',
'#eb2f96',
'#faad14',
'#52c41a',
];
const i = Math.floor(Math.random() * 10);
return colors[i];
}
/**判断是否关闭内容区域 */
const proRender = (render: any) => (render === false ? false : undefined);
@@ -50,7 +80,6 @@ const proConfigLocal: LayoutStore['proConfig'] = localGetJSON(
const useLayoutStore = defineStore('layout', {
state: (): LayoutStore => ({
visible: false,
proConfig: {
layout: proConfigLocal.layout,
theme: proConfigLocal.theme,
@@ -63,13 +92,27 @@ const useLayoutStore = defineStore('layout', {
menuHeaderRender: proRender(proConfigLocal.menuHeaderRender),
tabRender: proRender(proConfigLocal.tabRender),
},
themeConfig: {
algorithm: [theme.darkAlgorithm],
// algorithm: themeColor["dark"],
token: {
// colorBgContainer: "#fff",
colorPrimary: localGet(CACHE_LOCAL_PRIMARY_COLOR) || '#1890ff',
// borderRadius: 6,
},
},
waterMarkContent: import.meta.env.VITE_APP_NAME,
}),
actions: {
/**改变显示状态 */
changeVisibleLayoutSetting() {
this.visible = !this.visible;
getters: {
getColorPrimary(): string {
let color = '#1890ff';
if (this.themeConfig.token) {
color = this.themeConfig.token.colorPrimary || color;
}
return color;
},
},
actions: {
/**修改水印文字 */
changeWaterMark(text: string) {
this.waterMarkContent = text;
@@ -77,10 +120,48 @@ const useLayoutStore = defineStore('layout', {
/**修改布局设置 */
changeConf(key: string, value: boolean | string | number | undefined) {
if (Reflect.has(this.proConfig, key)) {
// console.log(key, value);
if (key === 'theme') {
// const themeColor = {
// light: theme.defaultAlgorithm,
// compact: theme.compactAlgorithm,
// dark: theme.darkAlgorithm,
// };
if (value === 'dark') {
document.documentElement.setAttribute('data-theme', 'dark');
this.themeConfig.algorithm = [theme.darkAlgorithm];
} else {
document.documentElement.setAttribute('data-theme', 'light');
this.themeConfig.algorithm = [theme.defaultAlgorithm];
}
}
Reflect.set(this.proConfig, key, value);
localSetJSON(CACHE_LOCAL_PROCONFIG, this.proConfig);
}
},
/**主题色初始化 */
initPrimaryColor() {
// 主题色初始化
this.changePrimaryColor(this.getColorPrimary);
// 明暗模式初始化
const themeMode = this.proConfig.theme;
document.documentElement.setAttribute('data-theme', themeMode);
this.changeConf('theme', themeMode);
},
/**
* 主题色变更
* @param color 颜色
*/
changePrimaryColor(color?: string) {
if (!color) {
color = getRandomColor();
}
if (this.themeConfig && this.themeConfig.token) {
this.themeConfig.token.colorPrimary = color;
localStorage.setItem(CACHE_LOCAL_PRIMARY_COLOR, color);
}
},
},
});

View File

@@ -20,7 +20,7 @@ type MaskStateType = {
const useMaskStore = defineStore('mask', {
state: (): MaskStateType => ({
type: (localGet(CACHE_LOCAL_MASK) || 'none') as MaskStateType['type'],
lockPasswd: localGet(CACHE_LOCAL_LOCK_PASSWD) || '',
lockPasswd: atob(localGet(CACHE_LOCAL_LOCK_PASSWD) || ''),
lockTimeout: 0,
}),
getters: {},
@@ -59,7 +59,7 @@ const useMaskStore = defineStore('mask', {
}, 5_000);
}
if (type === 'lock') {
localSet(CACHE_LOCAL_LOCK_PASSWD, this.lockPasswd);
localSet(CACHE_LOCAL_LOCK_PASSWD, btoa(this.lockPasswd));
} else {
localRemove(CACHE_LOCAL_LOCK_PASSWD);
}

View File

@@ -0,0 +1,123 @@
import { defineStore } from 'pinia';
import {
RESULT_CODE_SUCCESS,
RESULT_MSG_SUCCESS,
} from '@/constants/result-constants';
import { listAllNeInfo } from '@/api/ne/neInfo';
import { parseDataToOptions } from '@/utils/parse-tree-utils';
/**网元列表信息类型 */
type NeList = {
/**网元列表 */
neList: Record<string, any>[];
/**级联options树结构 */
neCascaderOptions: Record<string, any>[];
/**选择器单级父类型 */
neSelectOtions: Record<string, any>[];
};
const useNeListStore = defineStore('ne_list', {
state: (): NeList => ({
neList: [],
neCascaderOptions: [],
neSelectOtions: [],
}),
getters: {
/**
* 网元列表
* @param state 内部属性不用传入
* @returns 级联options
*/
getNeList(state) {
return state.neList;
},
/**
* 获取级联options树结构
* @param state 内部属性不用传入
* @returns 级联options
*/
getNeCascaderOptions(state) {
return state.neCascaderOptions;
},
/**
* 选择器单级父类型
* @param state 内部属性不用传入
* @returns 选择options
*/
getNeSelectOtions(state) {
return state.neSelectOtions;
},
},
actions: {
// 刷新网元列表
async fnNelistRefresh() {
this.neList = [];
return await this.fnNelist();
},
// 获取网元列表
async fnNelist() {
// 有数据不请求
if (this.neList.length > 0) {
return {
code: RESULT_CODE_SUCCESS,
msg: RESULT_MSG_SUCCESS['en_US'],
data: this.neList,
};
}
const res = await listAllNeInfo({
bandStatus: false,
bandHost: false,
});
if (res.code === RESULT_CODE_SUCCESS) {
// 原始列表
this.neList = JSON.parse(JSON.stringify(res.data));
// 转级联数据
const options = parseDataToOptions(
res.data,
'neType',
'neName',
'neId'
);
this.neCascaderOptions = options;
// 转选择器单级父类型
this.neSelectOtions = options.map(item => {
return {
label: item.label,
value: item.value,
};
});
}
return res;
},
/**
* 含有网元
* @param metaNeType ['udm', 'ims', 'udm+ims', 'SGWC'] 支持大小写
* @returns boolean
*/
fnHasNe(metaNeType: string[]) {
if (this.neList.length > 0) {
const neTypes = this.neSelectOtions.map(item => item.value);
let match = false; // 匹配
for (const netype of metaNeType) {
if (netype.indexOf('+') > -1) {
metaNeType = netype.split('+');
match = true;
break;
}
}
if (match) {
// 同时匹配
return metaNeType.every(item => neTypes.includes(item.toUpperCase()));
}
// 有一种
return metaNeType.some(item => neTypes.includes(item.toUpperCase()));
}
return false;
},
},
});
export default useNeListStore;

View File

@@ -2,7 +2,6 @@ import { defineStore } from 'pinia';
import { RESULT_CODE_SUCCESS } from '@/constants/result-constants';
import { listAllNeInfo } from '@/api/ne/neInfo';
import { parseDataToOptions } from '@/utils/parse-tree-utils';
import { getNeTraceInterfaceAll } from '@/api/trace/task';
import { getNePerformanceList } from '@/api/perfManage/taskManage';
/**网元信息类型 */
@@ -13,8 +12,6 @@ type NeInfo = {
neCascaderOptions: Record<string, any>[];
/**选择器单级父类型 */
neSelectOtions: Record<string, any>[];
/**跟踪接口列表 */
traceInterfaceList: Record<string, any>[];
/**性能测量数据集 */
perMeasurementList: Record<string, any>[];
};
@@ -24,7 +21,6 @@ const useNeInfoStore = defineStore('neinfo', {
neList: [],
neCascaderOptions: [],
neSelectOtions: [],
traceInterfaceList: [],
perMeasurementList: [],
}),
getters: {
@@ -61,7 +57,7 @@ const useNeInfoStore = defineStore('neinfo', {
const res = await listAllNeInfo({
bandStatus: false,
});
if (res.code === RESULT_CODE_SUCCESS && Array.isArray(res.data)) {
if (res.code === RESULT_CODE_SUCCESS) {
// 原始列表
this.neList = JSON.parse(JSON.stringify(res.data));
@@ -79,24 +75,6 @@ const useNeInfoStore = defineStore('neinfo', {
}
return res;
},
// 刷新跟踪接口列表
async fnRefreshNeTraceInterface() {
this.traceInterfaceList = [];
const res = await this.fnNeTraceInterface();
return res;
},
// 获取跟踪接口列表
async fnNeTraceInterface() {
// 有数据不请求
if (this.traceInterfaceList.length > 0) {
return { code: 1, data: this.traceInterfaceList, msg: 'success' };
}
const res = await getNeTraceInterfaceAll();
if (res.code === RESULT_CODE_SUCCESS && Array.isArray(res.data)) {
this.traceInterfaceList = res.data;
}
return res;
},
// 获取性能测量数据集列表
async fnNeTaskPerformance() {
// 有数据不请求
@@ -104,7 +82,7 @@ const useNeInfoStore = defineStore('neinfo', {
return { code: 1, data: this.perMeasurementList, msg: 'success' };
}
const res = await getNePerformanceList();
if (res.code === RESULT_CODE_SUCCESS && Array.isArray(res.data)) {
if (res.code === RESULT_CODE_SUCCESS) {
this.perMeasurementList = res.data;
}
return res;

View File

@@ -1,7 +1,7 @@
import defaultAvatar from '@/assets/images/default_avatar.png';
import useLayoutStore from './layout';
import { login, logout, getInfo } from '@/api/login';
import { getToken, setToken, removeToken } from '@/plugins/auth-token';
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';
@@ -27,8 +27,8 @@ type UserInfo = {
email: string;
/**用户性别 */
sex: string | undefined;
/**其他信息 */
profile: Record<string, any>;
/**用户类型 */
userType: string;
};
const useUserStore = defineStore('user', {
@@ -42,7 +42,7 @@ const useUserStore = defineStore('user', {
phonenumber: '',
email: '',
sex: undefined,
profile: {},
userType: 'System',
}),
getters: {
/**
@@ -122,6 +122,7 @@ const useUserStore = defineStore('user', {
this.phonenumber = user.phonenumber;
this.email = user.email;
this.sex = user.sex;
this.userType = user.userType;
// 验证返回的roles是否是一个非空数组
if (Array.isArray(roles) && roles.length > 0) {
@@ -133,10 +134,10 @@ const useUserStore = defineStore('user', {
}
// 水印文字信息=用户昵称 手机号
let waterMarkContent = this.userName;
if (this.phonenumber) {
waterMarkContent = `${this.userName} ${this.phonenumber}`;
}
// let waterMarkContent = this.userName;
// if (this.phonenumber) {
// waterMarkContent = `${this.userName} ${this.phonenumber}`;
// }
// useLayoutStore().changeWaterMark(waterMarkContent);
useLayoutStore().changeWaterMark('');
}

View File

@@ -7,4 +7,11 @@ declare module '*.vue' {
export default component;
}
// "vue3-smooth-dnd": "^0.0.6"
declare module 'vue3-smooth-dnd';
// "intl-tel-input": "^25.2.0"
declare module 'intl-tel-input/intlTelInputWithUtils' {
import intlTelInput from 'intl-tel-input';
export default intlTelInput;
}

View File

@@ -37,6 +37,24 @@ export async function dbGet(storeName: string, key: string) {
return value;
}
/**数据级缓存全部移除 */
export async function dbClear(storeName: string) {
if (!storeName ) {
return false;
}
localforage.config({
name: import.meta.env.VITE_APP_CODE,
storeName: storeName,
});
try {
await localforage.clear();
return true;
} catch (error) {
console.error(error);
}
return false;
}
/**数据级缓存移除 */
export async function dbRemove(storeName: string, key: string) {
if (!storeName || !key) {

Some files were not shown because too many files have changed in this diff Show More