Compare 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 33a8ce97d3 chore: 更新版本号 2.241102 2024-11-02 15:47:18 +08:00
TsMask 6ee9d464fb feat: PCF导出有取消操作 2024-11-02 15:46:26 +08:00
TsMask df5072bae7 fix: CDR-IMS显示呼叫-挂断时间 2024-11-02 15:46:05 +08:00
TsMask ae94e3bf2a fix: 编译错误 2024-11-01 11:42:07 +08:00
TsMask 2276445ff6 feat:网元指标添加其他指标选项 优化样式 2024-10-31 19:23:46 +08:00
zhongzm e12dce1f0f feat:网元指标添加其他指标选项 优化样式 2024-10-31 18:35:26 +08:00
lai 612592ec2a Merge branch 'main' into multi-tenant 2024-10-31 17:34:38 +08:00
TsMask d0457fc285 fix: UDM鉴权签约用户勾选导出 2024-10-31 16:32:14 +08:00
TsMask e04fd4077e feat:自定义网元指标概览 2024-10-31 10:36:26 +08:00
zhongzm 63d32f0a39 feat:自定义网元指标概览 2024-10-31 10:30:16 +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 cf5d08aaab chore: 更新版本号 2.241028 2024-10-28 16:53:21 +08:00
TsMask 7ad566d74f fix: 网元总览接口变更 2024-10-28 16:52:41 +08:00
TsMask c312186d91 fix: UDM签约数据参数类型转换字符串参数 2024-10-28 16:52:05 +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 72fd372fe0 增加关闭按钮 2024-10-24 10:40:54 +08:00
lai acdadcbb6f 增加Network Function IPv4地址 2024-10-24 10:40:20 +08:00
lai 7a49de71ea 修复 修改Event Type的label 2024-10-24 10:38:28 +08:00
zhongzm 56e4419e77 Revert "Revert "fix:中英提示修复""
This reverts commit 3abb4dd4bd.
2024-10-24 10:12:51 +08:00
zhongzm 3abb4dd4bd Revert "fix:中英提示修复"
This reverts commit a45243390b.
2024-10-24 10:12:09 +08:00
zhongzm 726a284ab5 Merge remote-tracking branch 'origin/main' 2024-10-24 10:11:28 +08:00
zhongzm a45243390b fix:中英提示修复 2024-10-24 10:11:08 +08:00
TsMask 1faed9bc3d style: 关键指标概览页面占位 2024-10-23 18:48:29 +08:00
TsMask 9bd700eeb7 feat: PCF补充增加online和offline字段 2024-10-23 10:44:15 +08:00
zhongzm 5cc3b9c8cf fix:css样式报错修复 2024-10-22 18:54:35 +08:00
zhongzm 208895c7d5 feat:快速布局功能以及ws连接修复 2024-10-22 16:01:53 +08:00
TsMask 46578ce97b feat: 快速开站SMSC的IP赋值 2024-10-18 20:16:06 +08:00
TsMask 0ff5bd5e20 style: UDM用户数据根据网元类型变更刷新列表 2024-10-18 11:42:21 +08:00
TsMask f08e637e69 fix: 版权信息文本长度128 2024-10-18 11:34:37 +08:00
TsMask a600e056b8 chore: 更新版本号 2.241018 2024-10-18 10:36:06 +08:00
zhongzm 671c80972e fix:多选改checkbox 2024-10-18 10:32:55 +08:00
TsMask d07230b582 Merge remote-tracking branch 'origin/main' into lichang 2024-10-18 10:20:54 +08:00
TsMask 35c24407ac Merge remote-tracking branch 'origin/lichang' 2024-10-18 10:18:48 +08:00
TsMask cf33756548 Merge remote-tracking branch 'origin/main' into lichang 2024-10-18 10:17:53 +08:00
TsMask 1ef98298bc style: 移除port/dbinfo/capability属性信息 2024-10-17 19:55:09 +08:00
zhongzm b1c2a95ec4 Merge remote-tracking branch 'origin/lichang' into lichang 2024-10-17 19:54:55 +08:00
zhongzm 147b2fad8d fix:网元响应式数组添加防抖 2024-10-17 19:54:40 +08:00
TsMask b629088406 Merge remote-tracking branch 'origin/lichang' 2024-10-17 19:51:43 +08:00
lai b508d4393c 首页添加 加载状态 2024-10-17 19:44:43 +08:00
TsMask 430a067280 Merge remote-tracking branch 'origin/main' into lichang 2024-10-17 18:27:09 +08:00
TsMask 8a71e8f773 Merge remote-tracking branch 'origin/lichang' 2024-10-17 18:26:49 +08:00
lai ff556ce1ec 添加首页加载状态 2024-10-17 18:18:37 +08:00
zhongzm 9ed7aed4b4 feat:自定义布局保存,WS数据追加 2024-10-17 18:07:39 +08:00
lai d257151718 首页加载顺序问题 2024-10-17 17:30:11 +08:00
TsMask 9e14297488 Merge remote-tracking branch 'origin/main' into lichang 2024-10-17 15:55:15 +08:00
TsMask 8e70706ed5 fix: 网元日志实时查看组件参数调整 2024-10-17 15:07:04 +08:00
TsMask 3e0529cf87 fix: 终端SSH视图组件调整参数配置外部地址 2024-10-17 15:06:34 +08:00
TsMask 91af2bed92 feat: 工具iperf/ping功能页面 2024-10-17 15:05:21 +08:00
lai 1ecefb91dc 增加导出时携带完整搜索条件 2024-10-17 14:51:55 +08:00
lai 7b60c30548 完善搜索时带上匹配模式后的imsi 2024-10-17 14:47:40 +08:00
lai cf5c8906c3 根据条件导出 2024-10-17 12:02:25 +08:00
TsMask 72d9895902 fix: UDM用户数据按查询条件导出 2024-10-17 11:39:17 +08:00
lai 249c9a5a6e 调整位置 2024-10-17 11:03:57 +08:00
lai 41fa214137 完善自定义首页设置 2024-10-17 10:30:21 +08:00
TsMask 1565f25a03 del: 移除debugger标记 2024-10-17 10:29:39 +08:00
lai c5c2926d99 修改告警导出异常 2024-10-17 10:29:22 +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 55456f9220 自定义主页 2024-10-16 19:28:05 +08:00
lai 37e70e7af8 更改路径方式 2024-10-16 17:06:41 +08:00
TsMask cf1686c348 Merge branch 'lichang' of http://192.168.2.166:3180/OMC/ems_frontend_vue3 into lichang 2024-10-16 16:47:01 +08:00
TsMask f7833bcd9f fix: UDM数据load失败无法重试 2024-10-16 16:46:57 +08:00
TsMask 5a621053a4 feat: 网元连接配置UDM支持Redis 2024-10-16 16:46:14 +08:00
lai 2a6451ef2a 更改首页代码文件路径 2024-10-16 15:11:26 +08:00
lai 87e044276c 更改首页代码文件路径 2024-10-16 15:09:53 +08:00
lai f1b440c8dd 补充 2024-10-16 14:50:47 +08:00
lai cd3e87c1c9 多租户自定义主页 2024-10-16 14:50:15 +08:00
lai a67e54ca6e 补充 2024-10-16 14:23:32 +08:00
lai 53d9e63c36 新增自定义首页 2024-10-16 14:12:31 +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
zhongzm b4623d19e5 fix:关键指标界面拖拽块设为图标,优化样式 2024-10-15 18:26:02 +08:00
zhongzm 700bff6e38 fix:关键指标界面自定义布局功能 2024-10-15 17:48:35 +08:00
TsMask d77c4e43d4 feat: 信令跟踪保活续期 2024-10-15 15:14:38 +08:00
TsMask 6e11d2b16a feat: 网元日志文件获取查看,抓包单独查看 2024-10-15 14:55:41 +08:00
TsMask 405842bc0b fix: 看板用户事件AMF订阅编号无neId 2024-10-15 14:38:29 +08:00
lai 879499b595 新增租户SMSC-CDR 2024-10-15 14:17:58 +08:00
zhongzm bf8d7f2124 fix:代码优化-方法封装-拖拽保存-大小自适应 2024-10-14 18:52:47 +08:00
TsMask ba98b37306 feat: 优化PCF参数可选请求数据处理 2024-10-12 19:10:52 +08:00
TsMask aa8ed65fd8 del: 删除旧License页面相关接口请求 2024-10-12 19:10:21 +08:00
TsMask 936a4410b3 del: 删除旧参数配置页面相关接口请求 2024-10-12 19:10:04 +08:00
TsMask 58ec76f9e5 Merge remote-tracking branch 'origin/main' into lichang 2024-10-12 15:43:09 +08:00
TsMask c1a77c8e48 chore: 更新版本号 241012 2024-10-12 15:42:29 +08:00
TsMask 477e8e4631 feat: 工具iperf/ping页面占位 2024-10-12 15:39:53 +08:00
TsMask 4f9d65a3a7 feat: UDM签约支持MICO和RAT修改 2024-10-12 15:07:06 +08:00
simonzhangsz e199498a8e Merge branch 'main' into multi-tenant 2024-10-12 10:34:26 +08:00
TsMask b1799d8ccb style: 首页-网元详细信息-删除数据库以及端口字段显示 2024-10-12 09:50:57 +08:00
TsMask 86833e7d6b feat: 关键指标报表页面 2024-10-11 18:48:46 +08:00
TsMask 59cf57898b Merge branch 'lichang' of http://192.168.2.166:3180/OMC/ems_frontend_vue3 into lichang 2024-10-11 18:14:31 +08:00
zhongzm fb9382e3a0 Merge remote-tracking branch 'origin/lichang' into lichang 2024-10-11 18:05:32 +08:00
zhongzm dae4697cd2 feat:多图表网元指标界面实时数据连接修复和拖拽功能实现 2024-10-11 17:57:51 +08:00
TsMask 1b2e892f74 fix: 看板总流量24小时切换类型声明 2024-10-11 16:50:46 +08:00
TsMask c66c640f75 fix: 看板总流量24小时实时累加 2024-10-11 15:47:26 +08:00
TsMask 30849416b6 fix: 工具ps/net页面定时器清除 2024-10-11 14:12:57 +08:00
TsMask 5edcee8da5 style: 隐藏跳转主机添加页面 2024-10-11 14:12:08 +08:00
TsMask 311beed2a7 fix: UPF总量数据格式化单位问题 2024-10-11 14:11:18 +08:00
TsMask eb5fdfb635 fix: 修复工具ps/net资源列表 2024-10-11 09:53:13 +08:00
TsMask 78bcde9ef2 style: 信令跟踪根据状态隐藏操作 2024-10-10 21:06:56 +08:00
lai 630e2a16ad 限制自定义指标输入长度 2024-10-10 19:45:45 +08:00
lai 82ecee9941 管理员-smsc cdr 租户列 2024-10-10 19:40:48 +08:00
TsMask e1fe031f25 Merge branch 'lichang' of http://192.168.2.166:3180/OMC/ems_frontend_vue3 into lichang 2024-10-09 18:56:28 +08:00
zhongzm 855ba7dc9e feat:net界面修复:F12后的报错消除 2024-10-09 12:04:16 +08:00
TsMask 3a72e73d5d style: 拓扑图smsc图标 2024-10-09 10:53:47 +08:00
TsMask 4cb13a1419 feat: 网元快速安装添加SMSC的ip填充 2024-10-09 09:50:31 +08:00
TsMask 8dd84a5255 fix: 网元抓包loading状态禁止重复开始任务 2024-10-08 16:49:14 +08:00
TsMask c0e62f48b7 fix: wiregasm去除gz压缩文件 2024-10-01 14:10:22 +08:00
TsMask b992225e28 fix: 网元快速安装多语言识别 2024-10-01 13:02:06 +08:00
TsMask 2f04562a34 feat: 信令跟踪功能页面 2024-09-30 21:02:01 +08:00
simonzhangsz 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 d3a452cfd8 Merge remote-tracking branch 'origin/main' into lichang 2024-09-27 11:14:26 +08:00
TsMask d81b8cdf38 chore: 更新版本号 240927 2024-09-27 11:13:25 +08:00
TsMask 39a417368a docs: 更新说明 2024-09-27 11:11:54 +08:00
TsMask adfce5d2f7 style: SMSC-CDR结果带result,cause 2024-09-27 10:05:45 +08:00
TsMask 977286d6b3 fix: 驼峰和划线互转函数去除非对象转换 2024-09-26 17:31:57 +08:00
TsMask c33000045a fix: 消息进行wg关闭销毁 2024-09-26 17:23:24 +08:00
TsMask b995ac378a fix: 网元版本同版本号进行确认继续操作 2024-09-26 17:20:01 +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 6bea64f345 style: 多语言views.traceManage.task取值变更views.ne.common 2024-09-24 10:53:33 +08:00
TsMask 94886e255e feat: 网元跟踪数据支持下载pcap文件 2024-09-24 10:52:28 +08:00
TsMask 45f66afe52 fix: 网元配置更新下发配置失败时不更新状态 2024-09-23 17:44:16 +08:00
TsMask b9105c1e77 style: 注释信息解析html请求 2024-09-23 17:25:26 +08:00
TsMask 909d306942 perf: wg优化代码封装hooks 2024-09-23 17:24:55 +08:00
TsMask f7273457e9 feat: 跟踪任务查看pcap内容信息 2024-09-23 17:24:02 +08:00
TsMask c30e8b4891 Merge remote-tracking branch 'origin/main' into multi-tenant 2024-09-21 17:18:39 +08:00
TsMask 2e5ad2f65d fix: 看板MME-CDR的ECM State 2024-09-21 15:52:54 +08:00
TsMask 7d5d82e7fc Merge remote-tracking branch 'origin/main' into multi-tenant 2024-09-20 19:18:04 +08:00
TsMask 776e9c5837 chore: 更新版本号 240920 2024-09-20 18:23:12 +08:00
TsMask 0d4979d3d9 style: 注释和代码格式化 2024-09-20 18:22:22 +08:00
TsMask 686c7dd273 fix: 驼峰和划线互转函数 2024-09-20 18:21:03 +08:00
TsMask d41b308c6d fix: 性能管理报表页面未开发 2024-09-20 18:20:34 +08:00
TsMask 84dac247d2 perf: 重构跟踪任务 2024-09-20 18:20:01 +08:00
TsMask f8439bb40a feat: HLR跟踪任务页面免登录/trace-task-hlr 2024-09-20 12:05:16 +08:00
TsMask d268d920e7 chore: 更新版本号 240919 2024-09-19 11:50:51 +08:00
TsMask f730ef1e3a style: 调整勾选按钮顺序 2024-09-19 11:50:06 +08:00
TsMask af1ce32063 feat: 调整SMF在线用户列表数据补充显示imsi备注标记 2024-09-19 11:49:30 +08:00
TsMask 678ff2d09d feat: UDM签约补充CAG参数和备注标记参数 2024-09-19 11:48:16 +08:00
TsMask 48f674b6ef Merge remote-tracking branch 'origin/main' into lichang 2024-09-13 09:59:13 +08:00
TsMask 02f0820a69 fix: telnet终端命令多‘号导致命令无效 2024-09-13 09:58:13 +08:00
TsMask ca8605fd6e fix: 跟踪任务HLR操作 2024-09-12 17:12:41 +08:00
TsMask 6d5e96421b style: 多语言zh去除行头 2024-09-12 17:12:13 +08:00
TsMask bcc29007bf fix: 4G的MME显示ECM 2024-09-12 17:11:10 +08:00
TsMask bdf904078d style: 多语言zh去除行头 2024-09-12 17:10:43 +08:00
TsMask e37cfa5066 Merge remote-tracking branch 'origin/main' into lichang 2024-09-10 09:42:40 +08:00
lai f1bff23bbc Merge branch 'main' of http://192.168.2.166:3180/OMC/ems_frontend_vue3 2024-09-09 19:25:26 +08:00
lai 53106ddb5c 调换位置 2024-09-09 19:25:22 +08:00
TsMask 3a04882fe5 Merge remote-tracking branch 'origin/main' into lichang 2024-09-09 19:14:04 +08:00
TsMask 19202a5e81 Merge branch 'main' of http://192.168.2.166:3180/OMC/ems_frontend_vue3 2024-09-09 19:11:37 +08:00
TsMask 7b311ff673 fix: SMSC添加CDR响应错误原因码 2024-09-09 19:11:34 +08:00
lai 9dba98e0ee 重新排版表单 2024-09-09 19:06:53 +08:00
lai 71338670f0 重新排版表单 2024-09-09 18:12:23 +08:00
lai 7dcdfabce2 增加单位显示的限制 2024-09-09 16:23:18 +08:00
lai ddfe1723c9 自定义指标 2024-09-09 15:01:04 +08:00
TsMask 57b5f76db7 fix: 重构tool的ps页面 2024-09-06 19:57:10 +08:00
lai 9ac3524877 自定义指标 2024-09-06 19:22:25 +08:00
lai ca82a0a74b 更改中英文 2024-09-06 19:21:57 +08:00
zhongzm 23007c3bf2 feat:ps界面和net界面 2024-09-06 17:27:38 +08:00
TsMask 5d69d7612a chore: 更新版本号 2.240906 2024-09-06 16:14:16 +08:00
TsMask ddd8930af4 feat: 跟踪任务功能详情文件页面 2024-09-06 16:12:33 +08:00
lai 757f2ec20a 导出文件管理 2024-09-06 10:15:20 +08:00
lai 30caa79424 Merge branch 'main' of http://192.168.2.166:3180/OMC/ems_frontend_vue3 2024-09-05 20:22:07 +08:00
TsMask e3f83a0b98 feat: 跟踪任务功能页面 2024-09-05 17:30:31 +08:00
TsMask 147a3ed77b style: 跟踪任务多语言翻译 2024-09-05 17:30:11 +08:00
TsMask 5d35d950b3 feat: 网元参数配置特殊SMF-upfid选择 2024-09-05 17:29:12 +08:00
lai 6874508d3f neType空时则获取全部基站信息 2024-09-05 16:42:43 +08:00
lai 33f468209a 告警根据中英文导出 2024-09-05 16:38:06 +08:00
lai e8ef2816df 增加IMSI,ki限制位数以及合并新增批量新增按钮 2024-09-05 16:36:05 +08:00
TsMask e38d7bbffa fix: 网元信息新增监听neType+neId拼接rmUID 2024-09-03 16:59:06 +08:00
TsMask 2f1265c47a fix: 编译类型缺失 2024-09-03 16:57:43 +08:00
TsMask 66b6b60505 fix: 右上角气泡提示活动告警 2024-09-03 11:28:41 +08:00
TsMask 249d14320d fix: 删除右上角系统用户手册 2024-09-03 11:22:56 +08:00
TsMask 313b90ad31 fix: MME事件类型cm显示改为ECM 2024-09-03 11:19:39 +08:00
TsMask 2ebc90e974 Merge branch 'main' of http://192.168.2.166:3180/OMC/ems_frontend_vue3 2024-09-03 11:06:50 +08:00
TsMask 640257dd55 feat: 信令抓包数据监控 2024-09-03 11:06:40 +08:00
TsMask c1a3ce8068 feat: 信令抓包tshark解析pcap 2024-09-03 11:05:58 +08:00
TsMask 0080e9c26e feat: 公共组件-虚拟滚动列表 2024-09-03 11:00:00 +08:00
TsMask 2ccafe622d feat: 插件新增-Web Workers 2024-09-03 10:59:05 +08:00
TsMask d7a515ed9a feat: 工具函数-格式化文件大小 2024-09-03 10:54:15 +08:00
simonzhangsz cd82b71b77 fix: remove OMC limit from parameter config NE list 2024-09-02 16:52:49 +08:00
TsMask 9d6a7dcd9c chore: 更新版本号 2.240831 2024-08-31 10:17:36 +08:00
TsMask 46c2affcc8 fix: 网元信息资源百分比 2024-08-30 19:50:12 +08:00
TsMask 3d00a80588 fix: 手工同步超时时间180s 2024-08-30 18:02:47 +08:00
TsMask a3c1fe154f chore: 更新版本号 2.240823 2024-08-23 19:06:32 +08:00
TsMask 07dce5a27e style: 暗黑模式下文字反色 2024-08-23 19:05:35 +08:00
simonzhangsz 60083183c5 fix: fnGetList change to fnGet45GList 2024-08-23 18:49:58 +08:00
TsMask 255cf026a6 style: 编译类型错误 2024-08-22 10:28:35 +08:00
TsMask 840ea56c42 chore: 更新版本号 2.240822 2024-08-22 10:20:45 +08:00
TsMask 09917cc9c9 feat: 补充CBC网元选择 2024-08-22 10:19:52 +08:00
TsMask 4c9fe192f2 feat: 历史抓包文件页面 2024-08-22 10:19:23 +08:00
TsMask 32ec55d44e feat: 网元文件下载支持删除临时缓存文件 2024-08-22 10:18:42 +08:00
TsMask 527cf89d1a fix: 避免get请求带body错误 2024-08-21 17:38:10 +08:00
TsMask ac7b57c0ae fix: 内嵌地址标识菜单展开高亮 2024-08-21 17:37:06 +08:00
TsMask 8be1a8968e fix: 标签名称修改导致全局标签 2024-08-21 17:36:04 +08:00
TsMask 999ccf64ad perf: 抓包功能优化 2024-08-20 15:49:03 +08:00
simonzhangsz 8fbd4f3952 Merge branch 'main' into multi-tenant 2024-08-19 10:20:57 +08:00
TsMask 03352f3aa8 style: 网元快速安装操作Nest放后面 2024-08-17 12:22:38 +08:00
lai 61a58fc661 默认neType为空时显示45G信息 2024-08-16 17:11:39 +08:00
TsMask 4268fa3198 fix: 网元IMS参数配置plmn禁止删除index0 2024-08-15 18:05:56 +08:00
lai 2048b6f2db 删除多余代码 2024-08-15 15:31:02 +08:00
TsMask f6b62c6c7e fix: 构建目标改为esnext,兼容pdf-js编译 2024-08-15 10:22:39 +08:00
TsMask b4cbc1c190 chore: 更新版本号 2.240815 2024-08-15 10:11:22 +08:00
TsMask 1871f6f656 chore: 新增crypto-js依赖库 2024-08-15 10:10:50 +08:00
TsMask 409f9836a6 fix: 对登录,网元信息新增更新数据加密 2024-08-15 10:10:09 +08:00
TsMask b3f40ee683 fix: 网元信息列表不带状态导致无法正常显示 2024-08-15 10:09:11 +08:00
TsMask aa07b51663 feat: 请求http工具支持接口加解密 2024-08-15 10:08:12 +08:00
TsMask 19b77ed005 style: 监控资源数据超时设为60s 2024-08-15 09:49:44 +08:00
TsMask ea6fca405b Merge remote-tracking branch 'origin/main' into multi-tenant 2024-08-12 11:42:53 +08:00
TsMask 06503fd079 fix: 拓扑图组名变更 2024-08-09 19:46:20 +08:00
TsMask 2321dacd2a chore: 更新版本号 2.240809 2024-08-09 18:48:44 +08:00
TsMask a8b4e91b95 feat: 文本日志文件实时查看功能 2024-08-09 18:47:45 +08:00
TsMask a5075bef43 feat: SMSC功能接口补充 2024-08-08 20:58:47 +08:00
TsMask f4ffbc1c86 style: CDR数据页面格式优化 2024-08-08 20:58:06 +08:00
TsMask 6cafa284c7 feat: SMSC-CDR数据列表查询 2024-08-08 20:56:40 +08:00
TsMask 049c0e7a0f fix: 终端面板telnet内容行列数自适应调整 2024-08-08 10:40:19 +08:00
TsMask 377ffc6e10 fix: CDR/Event上报数据对应发网元 2024-08-06 16:56:37 +08:00
TsMask 858431e86e perf: 替换旧网元参数配置页面 2024-08-05 17:51:11 +08:00
TsMask 70fca5ca41 fix: 网元信息OAM配置支持修改omc ip,排除omc编辑OAM信息 2024-08-05 17:44:41 +08:00
lai e972d14a9a 调整表格字段列 2024-08-05 15:28:16 +08:00
TsMask c1187383b6 fix: 系统引导跳转不重复引导 2024-08-03 10:09:16 +08:00
lai 9bc5eba0d6 角色单选 2024-08-02 18:58:36 +08:00
lai 8d8605e0cd 调整网元配置模块 2024-08-02 18:55:53 +08:00
lai b8c56c8868 Merge remote-tracking branch 'origin/main' into multi-tenant 2024-08-02 10:47:33 +08:00
TsMask 8af48936e5 chore: 更新版本号 2.240801 2024-08-02 10:11:42 +08:00
simonzhangsz 9785837980 Merge branch 'main' into multi-tenant 2024-08-02 10:01:53 +08:00
TsMask e21a8dc898 perf: 优化快速安装配置公共参数页面 2024-08-01 17:34:16 +08:00
TsMask 3c1ee63359 fix: 开站网元安装信息保存触发操作不一致 2024-07-30 18:23:51 +08:00
TsMask bc3940016a perf: 网元公共参数合并到网元快速安装,移除相关多语言翻译 2024-07-30 18:22:32 +08:00
TsMask 6ab4fbea6f fix: UDM签约数据cnType改5GC Flag 2024-07-30 11:27:12 +08:00
TsMask c73fcbd91c chore: 更新版本号 2.240729 2024-07-29 18:27:15 +08:00
TsMask 023e317b0d feat: 网元配置备份操作权限控制删除/编辑按钮 2024-07-29 14:36:19 +08:00
lai 543a2b7434 新增 统一配置网元 2024-07-29 10:38:14 +08:00
TsMask 4ae9051411 style: 系统设置LOGO和文档判断是否开启语言切换显示控件 2024-07-27 15:01:56 +08:00
TsMask 532546c3f5 chore: 更新版本号 2.240727 2024-07-27 10:28:23 +08:00
TsMask ab0d26513c perf: 网元备份导入导出弹窗表单重构 2024-07-26 18:27:15 +08:00
TsMask 8e9498ec83 feat: 网元备份文件表格页面 2024-07-26 18:25:15 +08:00
TsMask ca048f223c feat: UDM鉴权文件导入K4文件支持 2024-07-26 15:28:45 +08:00
TsMask e9ff6493dd fix: 看板UPF流量吞吐初始查询和ws监听12_neId 2024-07-25 18:48:01 +08:00
TsMask 396fb0b124 fix: KPI接收指定对应neId,实时数据不支持搜索 2024-07-25 18:23:28 +08:00
TsMask 3a854be8fe fix: 查询IMS在线用户数接口数据格式兼容 2024-07-25 10:50:54 +08:00
lai 977a4e11ee Merge remote-tracking branch 'origin/main' into multi-tenant 2024-07-24 18:36:11 +08:00
TsMask c1f34f56ac fix: 对使用手册,官网进行限制 2024-07-24 18:10:38 +08:00
lai 21e42709a7 Merge remote-tracking branch 'origin/main' into multi-tenant 2024-07-24 18:01:08 +08:00
lai b80bae0126 Merge branch 'main' of http://192.168.2.166:3180/OMC/ems_frontend_vue3 2024-07-24 17:18:18 +08:00
lai 6c383b58c8 对使用手册,官网进行限制 2024-07-24 17:18:15 +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
simonzhangsz 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
simonzhangsz 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
TsMask 06db1344c3 fix: 日志事件cm结果多语言显示错误 2024-07-23 14:48:53 +08:00
lai 363288a141 去除默认值 2024-07-23 14:43:30 +08:00
TsMask fac47279b5 fix: 日志IMS-CDR类型查询默认空进行全查询,表格宽度增加 2024-07-23 14:26:09 +08:00
TsMask a36a12f783 fix: 日志事件类型查询默认空进行全查询 2024-07-23 14:25:08 +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
TsMask acd19ebdbd style: 看板基站数量分开展示避免分不清数 2024-07-19 14:41:40 +08:00
TsMask d53c4c34f0 style: 新增网元信息时ssh默认密码初始 2024-07-18 15:44:35 +08:00
lai 636c7a5939 补充 2024-07-18 11:26:15 +08:00
TsMask 2d9011cf6b fix: 看板资源图无网元状体数据取值异常 2024-07-17 18:11:22 +08:00
TsMask fcf53d0995 fix: 网元删除记录自动移除不要刷新列表 2024-07-17 18:06:59 +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 a2d93ddafe fix: 系统名称横向滚动衔接动画 2024-07-16 11:21:16 +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
TsMask 79920542c1 chore: 更新版本号240712 2024-07-12 21:23:12 +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
TsMask 6efd9cb61a fix: 根据浏览器地址栏hostname加33030端口连接后端服务 2024-07-11 17:56:24 +08:00
lai 1f6a13951f ims在线用户信息 2024-07-11 17:26:43 +08:00
simonzhangsz 4b69b44df5 fix: tenant tips 2024-07-11 16:48:56 +08:00
simonzhangsz 5643c625ef fix: tenant tip 2024-07-11 16:42:54 +08:00
simonzhangsz 1607c97b82 fix: imsi tip 2024-07-11 16:40:50 +08:00
simonzhangsz d0ac6d4e2e fix: imsi tips 2024-07-11 16:40:04 +08:00
simonzhangsz 0ad9d546cd fix: tenant tips 2024-07-11 16:37:53 +08:00
simonzhangsz f8d54e35c9 fix: tenant management cn&en tips 2024-07-11 16:36:37 +08:00
TsMask 4dc6699974 style: UDM用户数据限制imsi长度输入 2024-07-11 15:02:53 +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 3bdae264e1 fix: 网元信息单行更新局部信息变更失效 2024-07-10 15:47:28 +08:00
TsMask 9e0a99d160 style: 数据CDR的表头宽度调整 2024-07-09 19:02:54 +08:00
TsMask 5ac0ca41eb style: 签约用户IMSI编辑时禁止修改,cnType添加提示 2024-07-09 18:36:27 +08:00
TsMask 24cd0ff101 Merge remote-tracking branch 'origin/main' into multi-tenant 2024-07-09 16:24:50 +08:00
TsMask a7de701d4d fix: 支持kvdb依赖包安装,db_ip默认0.0.0.0 2024-07-09 16:11:58 +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 f0561242ca fix: fetch请求拼接地址栏参数不区分请求方法 2024-07-09 10:04:46 +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
simonzhangsz 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
355 changed files with 251212 additions and 17023 deletions

No files matched your search

+4 -4
View File
@@ -1,17 +1,17 @@
# 历史路径-哈希带井号标识
VITE_HISTORY_HASH = false
VITE_HISTORY_HASH = true
# 历史路径-前缀URL如:/h5
VITE_HISTORY_BASE_URL = "/"
# 应用名称
VITE_APP_NAME = "Core Network EMS"
VITE_APP_NAME = "Core Network OMC"
# 应用标识
VITE_APP_CODE = "CN EMS"
VITE_APP_CODE = "OMC"
# 应用版本
VITE_APP_VERSION = "2.240704"
VITE_APP_VERSION = "local-dev"
# 接口基础URL地址-不带/后缀
VITE_API_BASE_URL = "/omc-api"
+3 -3
View File
@@ -5,13 +5,13 @@ VITE_HISTORY_HASH = true
VITE_HISTORY_BASE_URL = "/"
# 应用名称
VITE_APP_NAME = "Core Network EMS"
VITE_APP_NAME = "Core Network OMC"
# 应用标识
VITE_APP_CODE = "CN EMS"
VITE_APP_CODE = "OMC"
# 应用版本
VITE_APP_VERSION = "2.240704"
VITE_APP_VERSION = "local-prod"
# 接口基础URL地址-不带/后缀
VITE_API_BASE_URL = "/omc-api"
+38
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
- 新增 网元安装流程相关页面与操作相关接口联调
+21 -19
View File
@@ -5,19 +5,6 @@
- 图标来源 [@ant-design/icons-vue](https://ant.design/components/icon)
- 菜单图标使用自定义 iconfont `font_8d5l8fzk5b87iudi.js`图标文件
## 测试环境
```text
Jenkins: http://192.168.2.166:3185/
Nginx: http://192.168.2.166:3188/#/index
后端暴露端口: http://192.168.2.166:33030
新网管:192.168.5.13
旧网管:192.168.5.14
登录账户:manager/manager
```
## 程序命令
项目目录下 `.env.[环境]` 文件对应环境的一些配置,启动前请检查文件内是否配置正确。
@@ -63,12 +50,27 @@ admin
admin
```
## k8s
master 192.168.5.27 agtuser/admin123
https://192.168.5.27:31325/#/workloads?namespace=default
## 多租户涉及页面
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
```text
eyJhbGciOiJSUzI1NiIsImtpZCI6ImZFVUhIb1puLW04M1dfSUYyRU8zWlZueXBpNUh4T0hTRVlzU19jNlVGQ0kifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlcm5ldGVzLWRhc2hib2FyZCIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJhZG1pbi11c2VyLXRva2VuLW44ZzRtIiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQubmFtZSI6ImFkbWluLXVzZXIiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC51aWQiOiI2M2NmYjAyNS01ZmQ0LTQ0ZTgtOTdiNC0yYWRiYWIxNzc5M2MiLCJzdWIiOiJzeXN0ZW06c2VydmljZWFjY291bnQ6a3ViZXJuZXRlcy1kYXNoYm9hcmQ6YWRtaW4tdXNlciJ9.R3GRygFOjngTj-mEMBAHDeBxm3lpsXZYvC6cdTxByONtLrcMXDebwNVeKtAZ1V9qh2OrjD8n9CIygjULGPdfV6S520vjMh7Oa2q68nOyW49DNWQyYD8xLo-dQ6sX07fI7X_I3H35YUWW80jJAXjJawqIGXBSMG5intlo4tLTUSXmjCfhoQvFsgeRWu0j76pDvhMAvLPcgEXfTCi9tyL3yqJBIKONcKwmMlJeaKSR3pQk3KiibqrBO0MZclRozpke6J0ulfzTemwDDyCqBZmLsRPZ2yDd5hVBIJ9bHEcK0a25NmSFFzmd8XWQPZwg3Y4IbbY-8UhByGq0p9xS-7pGCQ
```
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
+8 -4
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>
+40 -36
View File
@@ -8,51 +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.9.7",
"@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",
"dayjs": "^1.11.11",
"echarts": "~5.5.0",
"file-saver": "^2.0.5",
"intl-tel-input": "~23.0.12",
"@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/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"
}
}
Binary file not shown.

After

Width:  |  Height:  |  Size: 217 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 217 KiB

+13 -5
View File
@@ -10,11 +10,19 @@
*
*/
(function () {
// host = ip:port
const host = '192.168.8.100: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}`);
})();
Binary file not shown.
Binary file not shown.
+1
View File
@@ -0,0 +1 @@
001012082101039,1234,internet|ims_sig,internet|ims_sig,321321,255,321312,32131,32131
+2
View File
@@ -0,0 +1,2 @@
001011100001157,1234567890ABCDEF1234567890ABCDEF,0,8000,11111111111111111111111111111111
001011100001158,1234567890ABCDEF1234567890ABCDEF,0,8000,11111111111111111111111111111111
+2
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,-
+2
View File
@@ -0,0 +1,2 @@
62357000580,123456
62357000581,123456
@@ -0,0 +1,2 @@
001012082101039,62357000580,1,ims.mnc001.mcc001.3gppnetwork.org
62357000581,62357000581,0,ims.mnc001.mcc001.3gppnetwork.org
+28
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
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

File renamed without changes.
Binary file not shown.
File diff suppressed because it is too large. Load diff
Binary file not shown.
File diff suppressed because it is too large. Load diff
+166
View File
@@ -0,0 +1,166 @@
/**
* Wraps the WiregasmLib lib functionality and manages a single DissectSession
*/
class Wiregasm {
constructor() {
this.initialized = false;
this.session = null;
}
/**
* Initialize the wrapper and the Wiregasm module
*
* @param loader Loader function for the Emscripten module
* @param overrides Overrides
*/
async init(loader, overrides = {}, beforeInit = null) {
if (this.initialized) {
return;
}
this.lib = await loader(overrides);
this.uploadDir = this.lib.getUploadDirectory();
this.pluginsDir = this.lib.getPluginsDirectory();
if (beforeInit !== null) {
await beforeInit(this.lib);
}
this.lib.init();
this.initialized = true;
}
list_modules() {
return this.lib.listModules();
}
list_prefs(module) {
return this.lib.listPreferences(module);
}
apply_prefs() {
this.lib.applyPreferences();
}
set_pref(module, key, value) {
const ret = this.lib.setPref(module, key, value);
if (ret.code != PrefSetResult.PREFS_SET_OK) {
const message =
ret.error != '' ? ret.error : preferenceSetCodeToError(ret.code);
throw new Error(
`Failed to set preference (${module}.${key}): ${message}`
);
}
}
get_pref(module, key) {
const response = this.lib.getPref(module, key);
if (response.code != 0) {
throw new Error(`Failed to get preference (${module}.${key})`);
}
return response.data;
}
/**
* Check the validity of a filter expression.
*
* @param filter A display filter expression
*/
test_filter(filter) {
return this.lib.checkFilter(filter);
}
complete_filter(filter) {
const out = this.lib.completeFilter(filter);
return {
err: out.err,
fields: vectorToArray(out.fields),
};
}
reload_lua_plugins() {
this.lib.reloadLuaPlugins();
}
add_plugin(name, data, opts = {}) {
const path = this.pluginsDir + '/' + name;
this.lib.FS.writeFile(path, data, opts);
}
/**
* Load a packet trace file for analysis.
*
* @returns Response containing the status and summary
*/
load(name, data, opts = {}) {
if (this.session != null) {
this.session.delete();
}
const path = this.uploadDir + '/' + name;
this.lib.FS.writeFile(path, data, opts);
this.session = new this.lib.DissectSession(path);
return this.session.load();
}
/**
* Get Packet List information for a range of packets.
*
* @param filter Output those frames that pass this filter expression
* @param skip Skip N frames
* @param limit Limit the output to N frames
*/
frames(filter, skip = 0, limit = 0) {
return this.session.getFrames(filter, skip, limit);
}
/**
* Get full information about a frame including the protocol tree.
*
* @param number Frame number
*/
frame(num) {
return this.session.getFrame(num);
}
follow(follow, filter) {
return this.session.follow(follow, filter);
}
destroy() {
if (this.initialized) {
if (this.session !== null) {
this.session.delete();
this.session = null;
}
this.lib.destroy();
this.initialized = false;
}
}
/**
* Returns the column headers
*/
columns() {
const vec = this.lib.getColumns();
// convert it from a vector to array
return vectorToArray(vec);
}
}
/**
* Converts a Vector to a JS array
*
* @param vec Vector
* @returns JS array of the Vector contents
*/
function vectorToArray(vec) {
return new Array(vec.size()).fill(0).map((_, id) => vec.get(id));
}
function preferenceSetCodeToError(code) {
switch (code) {
case PrefSetResult.PREFS_SET_SYNTAX_ERR:
return 'Syntax error in string';
case PrefSetResult.PREFS_SET_NO_SUCH_PREF:
return 'No such preference';
case PrefSetResult.PREFS_SET_OBSOLETE:
return 'Preference used to exist but no longer does';
default:
return 'Unknown error';
}
}
if (typeof exports === 'object' && typeof module === 'object') {
module.exports = Wiregasm;
module.exports = vectorToArray;
} else if (typeof define === 'function' && define['amd']) {
define([], function () {
return Wiregasm;
});
define([], function () {
return vectorToArray;
});
} else if (typeof exports === 'object') {
exports['loadWiregasm'] = Wiregasm;
exports['vectorToArray'] = vectorToArray;
}
+162
View File
@@ -0,0 +1,162 @@
// load the Wiregasm library
importScripts(
'wiregasm_new.js', // self-compilation es5
'wiregasm_load.js'
// 'https://cdn.jsdelivr.net/npm/@goodtools/wiregasm/dist/wiregasm.js'
);
const wg = new Wiregasm();
const inflateRemoteBuffer = async url => {
const res = await fetch(url);
return await res.arrayBuffer();
};
const fetchPackages = async () => {
console.log('Fetching packages');
let [wasmBuffer, dataBuffer] = await Promise.all([
await inflateRemoteBuffer(
'wiregasm.wasm'
// 'https://cdn.jsdelivr.net/npm/@goodtools/wiregasm/dist/wiregasm.wasm'
),
await inflateRemoteBuffer(
'wiregasm.data'
// 'https://cdn.jsdelivr.net/npm/@goodtools/wiregasm/dist/wiregasm.data'
),
]);
return { wasmBuffer, dataBuffer };
};
// Load the Wiregasm Wasm data
fetchPackages()
.then(({ wasmBuffer, dataBuffer }) => {
return wg.init(loadWiregasm, {
wasmBinary: wasmBuffer,
getPreloadedPackage() {
return dataBuffer;
},
handleStatus: (type, status) => {
postMessage({ type: 'status', code: type, status: status });
},
printErr: error => {
postMessage({ type: 'error', error: error });
},
});
})
.then(() => {
postMessage({ type: 'init' });
})
.catch(e => {
postMessage({ type: 'error', error: e });
});
/**Converts a Vector to a JS array */
function replacer(key, value) {
if (value.constructor.name.startsWith('Vector')) {
return vectorToArray(value);
}
return value;
}
// Event listener to receive messages from the main script
this.onmessage = ev => {
const data = ev.data;
switch (data.type) {
case 'close':
wg.destroy();
break;
case 'columns':
const columns = wg.columns();
if (Array.isArray(columns)) {
this.postMessage({ type: 'columns', data: columns });
}
break;
case 'select': // select a frame
const number = data.number;
const frameData = wg.frame(number);
const frameDataToJSON = JSON.parse(JSON.stringify(frameData, replacer));
this.postMessage({
type: 'selected',
data: frameDataToJSON,
});
break;
case 'frames': // get frames list
const skip = data.skip;
const limit = data.limit;
const filter = data.filter;
const framesData = wg.frames(filter, skip, limit);
const framesDataToJSON = JSON.parse(JSON.stringify(framesData, replacer));
this.postMessage({
type: 'frames',
data: framesDataToJSON,
});
break;
case 'process-data':
const loadData = wg.load(data.name, new Uint8Array(data.data));
this.postMessage({ type: 'processed', data: loadData });
break;
case 'process':
const f = data.file;
const reader = new FileReader();
reader.addEventListener('load', event => {
// XXX: this blocks the worker thread
const loadData = wg.load(f.name, new Uint8Array(event.target.result));
postMessage({ type: 'processed', data: loadData });
});
reader.readAsArrayBuffer(f);
break;
case 'check-filter':
const filterStr = data.filter;
const checkFilterRes = wg.lib.checkFilter(filterStr);
this.postMessage({ type: 'filter', data: checkFilterRes });
break;
}
if (data.type === 'reload-quick') {
if (wg.session) {
// TODO: this is a hack, we should be able to reload the session
const name = data.name;
const res = wg.session.load();
postMessage({ type: 'processed', name: name, data: res });
}
} else if (data.type === 'module-tree') {
const res = wg.list_modules();
// send it to the correct port
event.ports[0].postMessage({
result: JSON.parse(JSON.stringify(res, replacer)),
});
} else if (data.type === 'module-prefs') {
const res = wg.list_prefs(data.name);
// send it to the correct port
event.ports[0].postMessage({
result: JSON.parse(JSON.stringify(res, replacer)),
});
} else if (data.type === 'upload-file') {
const f = data.file;
const reader = new FileReader();
reader.addEventListener('load', e => {
// XXX: this blocks the worker thread
const path = '/uploads/' + f.name;
wg.lib.FS.writeFile(path, Buffer.from(e.target.result));
event.ports[0].postMessage({ result: path });
});
reader.readAsArrayBuffer(f);
} else if (data.type === 'update-pref') {
try {
console.log(`set_pref(${data.module}, ${data.key}, ${data.value})`);
wg.set_pref(data.module, data.key, data.value);
event.ports[0].postMessage({ result: 'ok' });
} catch (e) {
console.error(
`set_pref(${data.module}, ${data.key}, ${data.value}) failed: ${e.message}`
);
event.ports[0].postMessage({ error: e.message });
}
} else if (data.type === 'apply-prefs') {
console.log(`apply_prefs()`);
wg.apply_prefs();
event.ports[0].postMessage({ result: 'ok' });
}
};
+55 -67
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>
-55
View File
@@ -1,55 +0,0 @@
import {
RESULT_CODE_ERROR,
RESULT_CODE_SUCCESS,
RESULT_MSG_ERROR,
} from '@/constants/result-constants';
import { language, request } from '@/plugins/http-fetch';
import { parseObjLineToHump } from '@/utils/parse-utils';
/**
* 查询配置详细
* @param tag 配置ID
* @returns object
*/
export async function getConfigInfo(tag: string) {
// 发起请求
const result = await request({
url: `/api/rest/databaseManagement/v1/omc_db/config`,
method: 'get',
params: {
SQL: `SELECT * FROM config WHERE config_tag = '${tag}'`,
},
});
// 解析数据
if (result.code === RESULT_CODE_SUCCESS && Array.isArray(result.data.data)) {
let data = result.data.data[0];
return Object.assign(result, {
data: parseObjLineToHump(data['config'][0]),
});
}
return result;
}
/**
* 修改配置
* @param data 配置对象
* @returns object
*/
export async function updateConfig(tag: string, data: Record<string, any>) {
const result = await request({
url: `/api/rest/databaseManagement/v1/omc_db/config?WHERE=config_tag='${tag}'`,
method: 'put',
data: { data },
});
// 解析数据
if (result.code === RESULT_CODE_SUCCESS && result.data.data) {
let rows = result.data.data.affectedRows;
if (rows) {
delete result.data;
return result;
} else {
return { code: RESULT_CODE_ERROR, msg: RESULT_MSG_ERROR[language] };
}
}
return result;
}
+39 -437
View File
@@ -2,315 +2,8 @@ import {
RESULT_CODE_ERROR,
RESULT_CODE_SUCCESS,
RESULT_MSG_ERROR,
RESULT_MSG_SUCCESS,
} from '@/constants/result-constants';
import { language, request } from '@/plugins/http-fetch';
import { parseObjLineToHump } from '@/utils/parse-utils';
/**
* 查询配置参数标签栏
* @param neType 网元类型
* @returns object
*/
export async function getParamConfigTopTab(neType: string) {
// 发起请求
const result = await request({
url: `/api/rest/databaseManagement/v1/elementType/omc_db/objectType/param_config`,
method: 'get',
params: {
SQL: `SELECT id,top_display,top_tag,method FROM param_config WHERE ne_type = '${neType}' ORDER BY id ASC`,
},
});
// 解析数据
if (result.code === RESULT_CODE_SUCCESS && Array.isArray(result.data.data)) {
let data = result.data.data[0];
data = data['param_config'];
if (Array.isArray(data)) {
return Object.assign(result, {
data: parseObjLineToHump(data),
});
}
return Object.assign(result, {
data: [],
});
}
return result;
}
/**
* 查询配置参数标签栏对应信息和规则
* @param neType 网元类型
* @param topTag
* @param neId
* @returns object { wrRule, dataArr }
*/
async function getParamConfigInfoAndRule(
neType: string,
topTag: string,
neId: string
) {
return await Promise.allSettled([
// 获取参数规则
request({
url: `/api/rest/databaseManagement/v1/elementType/omc_db/objectType/param_config`,
method: 'get',
params: {
SQL: `SELECT param_json FROM param_config WHERE ne_type = '${neType}' AND top_tag='${topTag}'`,
},
}),
// 获取对应信息
request({
url: `/api/rest/systemManagement/v1/elementType/${neType.toLowerCase()}/objectType/config/${topTag}`,
method: 'get',
params: {
ne_id: neId,
},
}),
]).then(resArr => {
let wrRule: Record<string, any> = {};
// 规则数据
if (resArr[0].status === 'fulfilled') {
const itemV = resArr[0].value;
// 解析数据
if (
itemV.code === RESULT_CODE_SUCCESS &&
Array.isArray(itemV.data?.data)
) {
let itemData = itemV.data.data;
const data = itemData[0]['param_config'];
if (Array.isArray(data)) {
const v = data[0]['param_json'];
try {
itemData = parseObjLineToHump(JSON.parse(v));
wrRule = itemData;
} catch (error) {
console.error(error);
}
}
}
}
let dataArr: Record<string, any>[] = [];
// 对应信息
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;
dataArr = parseObjLineToHump(itemData);
}
}
return { wrRule, dataArr };
});
}
/**
* 查询配置参数标签栏对应信息-表单结构处理
* @param neType 网元类型
* @param topTag
* @param neId
* @returns object
*/
export async function getParamConfigInfoForm(
neType: string,
topTag: string,
neId: string
) {
const { wrRule, dataArr } = await getParamConfigInfoAndRule(
neType,
topTag,
neId
);
// 拼装数据
const result = {
code: RESULT_CODE_SUCCESS,
msg: RESULT_MSG_SUCCESS,
data: {
type: 'list' as 'list' | 'array',
data: [] as Record<string, any>[],
dataRule: {},
},
};
// kv单列表
if (Reflect.has(wrRule, 'list')) {
result.data.type = 'list';
const ruleArr = Object.freeze(wrRule['list']);
// 列表项数据
const dataList = [];
for (const item of dataArr) {
for (const key in item) {
// 规则为准
for (const rule of ruleArr) {
if (rule['name'] === key) {
const ruleItem = Object.assign({ optional: 'true' }, rule, {
value: item[key],
});
dataList.push(ruleItem);
break;
}
}
}
}
result.data.data = dataList;
}
// 多列表
if (Reflect.has(wrRule, 'array')) {
result.data.type = 'array';
const ruleArr = Object.freeze(wrRule['array']);
// 列表项数据
const dataArray = [];
for (const item of dataArr) {
const index = item['index'];
let record: Record<string, any>[] = [];
for (const key in item) {
// 规则为准
for (const rule of ruleArr) {
if (rule['name'] === key) {
const ruleItem = Object.assign({ optional: 'true' }, rule, {
value: item[key],
});
record.push(ruleItem);
break;
}
}
}
dataArray.push({ title: `Index-${index}`, key: index, record });
}
result.data.data = dataArray;
// 无数据时,用于新增
result.data.dataRule = { title: `Index-0`, key: 0, record: ruleArr };
}
return result;
}
/**
* 查询配置参数标签栏对应信息
* @param neType 网元类型
* @param topTag
* @param neId
* @returns object
*/
export async function getParamConfigInfo(
neType: string,
topTag: string,
neId: string
) {
// 发起请求
const result = await request({
url: `/api/rest/systemManagement/v1/elementType/${neType.toLowerCase()}/objectType/config/${topTag}`,
method: 'get',
params: {
ne_id: neId,
},
});
// 解析数据
if (result.code === RESULT_CODE_SUCCESS && Array.isArray(result.data.data)) {
return Object.assign(result, {
data: parseObjLineToHump(result.data.data),
});
}
return result;
}
/**
* 查询配置参数标签栏对应信息子节点
* @param neType 网元类型
* @param topTag
* @param neId
* @param loc 子节点(index/字段) 1/dnnList
* @returns
*/
export async function getParamConfigInfoChild(
neType: string,
topTag: string,
neId: string,
loc: string
) {
// 发起请求
const result = await request({
url: `/api/rest/systemManagement/v1/elementType/${neType.toLowerCase()}/objectType/config/${topTag}`,
method: 'get',
params: {
ne_id: neId,
loc: loc,
},
});
// 解析数据
if (result.code === RESULT_CODE_SUCCESS && Array.isArray(result.data.data)) {
return Object.assign(result, {
data: parseObjLineToHump(result.data.data),
});
}
return result;
}
/**
* 修改配置参数标签栏对应信息
* @param args 对象 {neType,neId,topTag,loc}
* @param data 对象 {修改的数据kv}
* @returns object
*/
export function updateParamConfigInfo(
type: 'list' | 'array',
args: Record<string, any>,
data: Record<string, any>
) {
let url = `/api/rest/systemManagement/v1/elementType/${args.neType.toLowerCase()}/objectType/config/${
args.topTag
}?ne_id=${args.neId}`;
// 多列表需要loc
if (type === 'array') {
url += `&loc=${args.loc}`;
}
return request({
url,
method: 'put',
data: data,
});
}
/**
* 新增配置参数标签栏对应信息
* @param args 对象 {neType,neId,topTag,loc}
* @param data 行记录对象
* @returns object
*/
export function addParamConfigInfo(
args: Record<string, any>,
data: Record<string, any>
) {
return request({
url: `/api/rest/systemManagement/v1/elementType/${args.neType.toLowerCase()}/objectType/config/${
args.topTag
}?ne_id=${args.neId}&loc=${args.loc}`,
method: 'post',
data: data,
});
}
/**
* 删除配置参数标签栏对应信息
* @param args 对象 {neType,neId,topTag,loc}
* loc 多层表的定位信息{index0}/{paraName1}/{index1}
* @param data 行记录对象
* @returns object
*/
export function delParamConfigInfo(args: Record<string, any>) {
return request({
url: `/api/rest/systemManagement/v1/elementType/${args.neType.toLowerCase()}/objectType/config/${
args.topTag
}?ne_id=${args.neId}&loc=${args.loc}`,
method: 'delete',
});
}
/**
* 更新网元配置重新载入
@@ -343,141 +36,50 @@ export async function updateNeConfigReload(neType: string, neId: string) {
/**
* 从参数配置PCF中获取对应信息提供给PCC用户策略输入框
* @param neType 网元类型
* @param topTag
* @param neId
* @returns object { wrRule, dataArr }
* @returns object {pccRules,sessionRules,qosTemplate,headerEnrichTemplate,serviceAreaRestriction}
*/
export async function getPCCRule(neId: any) {
return await Promise.allSettled([
// 获取参数规则
request({
url: `/api/rest/systemManagement/v1/elementType/pcf/objectType/config/pccRules`,
method: 'get',
params: {
ne_id: neId,
},
timeout: 1_000,
}),
// 获取对应信息
request({
url: `/api/rest/systemManagement/v1/elementType/pcf/objectType/config/sessionRules`,
method: 'get',
params: {
ne_id: neId,
},
timeout: 1_000,
}),
request({
url: `/api/rest/systemManagement/v1/elementType/pcf/objectType/config/qosTemplate`,
method: 'get',
params: {
ne_id: neId,
},
timeout: 1_000,
}),
request({
url: `/api/rest/systemManagement/v1/elementType/pcf/objectType/config/headerEnrichTemplate`,
method: 'get',
params: {
ne_id: neId,
},
timeout: 1_000,
}),
request({
url: `/api/rest/systemManagement/v1/elementType/pcf/objectType/config/serviceAreaRestriction`,
method: 'get',
params: {
ne_id: neId,
},
timeout: 1_000,
}),
]).then(resArr => {
let pccJson: any = new Map();
let sessJson: any = new Map();
let qosJson: any = new Map();
let headerJson: any = new Map();
let sarJson: any = new Map();
const paramNameArr = [
'pccRules',
'sessionRules',
'qosTemplate',
'headerEnrichTemplate',
'serviceAreaRestriction',
];
const reqArr = [];
for (const paramName of paramNameArr) {
reqArr.push(
request({
url: `/ne/config/data`,
params: { neType: 'PCF', neId, paramName },
method: 'get',
})
);
}
return await Promise.allSettled(reqArr).then(resArr => {
// 规则数据
if (resArr[0].status === 'fulfilled') {
const itemV = resArr[0].value;
// 解析数据
if (
itemV.code === RESULT_CODE_SUCCESS &&
Array.isArray(itemV.data?.data)
) {
let itemData = itemV.data.data;
itemData.forEach((item: any) => {
pccJson.set(item.ruleId, { value: item.ruleId, label: item.ruleId });
});
}
}
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;
itemData.forEach((item: any) => {
sessJson.set(item.ruleId, { value: item.ruleId, label: item.ruleId });
});
}
}
if (resArr[2].status === 'fulfilled') {
const itemV = resArr[2].value;
// 解析数据
if (
itemV.code === RESULT_CODE_SUCCESS &&
Array.isArray(itemV.data?.data)
) {
let itemData = itemV.data.data;
itemData.forEach((item: any) => {
qosJson.set(item.qosId, { value: item.qosId, label: item.qosId });
});
}
}
if (resArr[3].status === 'fulfilled') {
const itemV = resArr[3].value;
// 解析数据
if (
itemV.code === RESULT_CODE_SUCCESS &&
Array.isArray(itemV.data?.data)
) {
let itemData = itemV.data.data;
itemData.forEach((item: any) => {
headerJson.set(item.templateName, {
value: item.templateName,
label: item.templateName,
const obj: any = {};
resArr.forEach((item, i: number) => {
if (item.status === 'fulfilled') {
const res = item.value;
if (res.code === RESULT_CODE_SUCCESS && Array.isArray(res.data)) {
const key = paramNameArr[i];
obj[key] = res.data.map((item: any) => {
if ('qosTemplate' === key) {
return { value: item.qosId, label: item.qosId };
}
if ('headerEnrichTemplate' === key) {
return { value: item.templateName, label: item.templateName };
}
if ('serviceAreaRestriction' === key) {
return { value: item.name, label: item.name };
}
return { value: item.ruleId, label: item.ruleId };
});
});
}
}
}
if (resArr[4].status === 'fulfilled') {
const itemV = resArr[4].value;
// 解析数据
if (
itemV.code === RESULT_CODE_SUCCESS &&
Array.isArray(itemV.data?.data)
) {
let itemData = itemV.data.data;
itemData.forEach((item: any) => {
sarJson.set(item.name, { value: item.name, label: item.name });
});
}
}
pccJson = Array.from(pccJson.values());
sessJson = Array.from(sessJson.values());
qosJson = Array.from(qosJson.values());
headerJson = Array.from(headerJson.values());
sarJson = Array.from(sarJson.values());
return { pccJson, sessJson, qosJson, headerJson, sarJson };
});
return obj;
});
}
-72
View File
@@ -1,72 +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 listLicense(query: Record<string, any>) {
let totalSQL = 'select count(id) as total from ne_license ';
let rowsSQL = ' select * from ne_license ';
// 查询
let querySQL = 'where 1=1';
if (query.neType) {
querySQL += ` and ne_type like '%${query.neType}%' `;
}
// 分页
const pageNum = (query.pageNum - 1) * query.pageSize;
const limtSql = ` order by create_time desc limit ${pageNum},${query.pageSize} `;
// 发起请求
const result = await request({
url: `/api/rest/databaseManagement/v1/select/omc_db/ne_license`,
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['ne_license'];
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;
}
/**
* 上传文件
* @param data 表单数据对象
* @returns object
*/
export function uploadLicense(data: FormData) {
return request({
url: `/api/rest/systemManagement/v1/elementType/${data.get(
'nfType'
)}/objectType/license?neId=${data.get('nfId')}`,
method: 'post',
data,
dataType: 'form-data',
timeout: 180_000,
});
}
+153 -5
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 鉴权对象
@@ -241,6 +254,7 @@ export function listSync() {
return request({
url: `/api/rest/faultManagement/v1/elementType/all/objectType/alarms`,
method: 'get',
timeout: 180_000,
});
}
@@ -359,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;
}
-17
View File
@@ -1,10 +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';
/**
* 查询列表
@@ -28,8 +24,6 @@ export async function listAct(query: Record<string, any>) {
querySQL += ` and pv_flag = '${query.pvFlag}' `;
}
if (query.neId) {
querySQL += ` and ne_id like '%${query.neId}%' `;
}
@@ -69,7 +63,6 @@ export async function listAct(query: Record<string, any>) {
msg: result.msg,
};
result.data.data.forEach((item: any) => {
console.log(item)
const itemData = item['alarm_event'];
if (Array.isArray(itemData)) {
if (itemData.length === 1 && itemData[0]['total'] >= 0) {
@@ -84,12 +77,6 @@ export async function listAct(query: Record<string, any>) {
return result;
}
/**
* 事件告警导出
* @param query 查询参数
@@ -133,7 +120,3 @@ export async function exportAll(query: Record<string, any>) {
}
return result;
}
+14 -7
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',
+3 -3
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',
},
+95
View File
@@ -0,0 +1,95 @@
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: '/lm/table/list',
method: 'get',
});
}
/**
* 获取对应类型的文件列表
* @param query 查询参数
* @returns object
*/
export function getBakFileList(query: Record<string, any>) {
return request({
url: '/lm/file/list',
method: 'get',
params: query,
});
}
/**
* 下载远端文件
* @param query 查询参数
* @returns object
*/
export function downFile(query: Record<string, any>) {
return request({
url: `/lm/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: `/lm/file/${query.fileName}`,
method: 'delete',
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 },
});
}
+70
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,6 +9,7 @@ export function login(data: Record<string, string>) {
method: 'post',
data: data,
whithToken: false,
crypto: sessionGet(CACHE_SESSION_CRYPTO_API) !== 'false',
});
}
@@ -21,6 +24,7 @@ export function register(data: Record<string, any>) {
method: 'post',
data: data,
whithToken: false,
crypto: sessionGet(CACHE_SESSION_CRYPTO_API) !== 'false',
});
}
@@ -57,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,
});
}
+1
View File
@@ -6,5 +6,6 @@ export function getLoad(query: Record<string, any>) {
url: '/monitor/load',
method: 'get',
params: query,
timeout: 60_000,
});
}
+1
View File
@@ -5,5 +5,6 @@ export function getSystemInfo() {
return request({
url: '/monitor/system-info',
method: 'get',
timeout: 60_000,
});
}
+67
View File
@@ -0,0 +1,67 @@
import { request } from '@/plugins/http-fetch';
/**
* 网元参数配置可用属性值列表指定网元类型全部无分页
* @param query 查询参数
* @returns object
*/
export function getAllNeConfig(neType: string, neId: string) {
return request({
url: `/ne/config/list/${neType}`,
method: 'get',
params: { neId },
timeout: 60_000,
});
}
/**
* 网元参数配置数据信息
* @param params 数据 {neType,neId,paramName}
* @returns object
*/
export function getNeConfigData(params: Record<string, any>) {
return request({
url: `/ne/config/data`,
params,
method: 'get',
});
}
/**
* 网元参数配置数据更新
* @param data 数据 {neType,neId,paramName:"参数名",paramData:{参数},loc:"层级index仅array"}
* @returns object
*/
export function editNeConfigData(data: Record<string, any>) {
return request({
url: `/ne/config/data`,
method: 'put',
data: data,
});
}
/**
* 网元参数配置数据新增(array)
* @param data 数据 {neType,neId,paramName:"参数名",paramData:{参数},loc:"层级index"}
* @returns object
*/
export function addNeConfigData(data: Record<string, any>) {
return request({
url: `/ne/config/data`,
method: 'post',
data: data,
});
}
/**
* 网元参数配置数据删除(array)
* @param params 数据 {neType,neId,paramName:"参数名",loc:"层级index"}
* @returns object
*/
export function delNeConfigData(params: Record<string, any>) {
return request({
url: `/ne/config/data`,
method: 'delete',
params,
});
}
+83
View File
@@ -0,0 +1,83 @@
import { request } from '@/plugins/http-fetch';
/**
* 网元配置文件备份记录列表
* @param query 查询参数
* @returns object
*/
export function listNeConfigBackup(query: Record<string, any>) {
return request({
url: '/ne/config/backup/list',
method: 'get',
params: query,
});
}
/**
* 网元配置文件备份记录修改
* @param data 数据 { id, name, remark }
* @returns object
*/
export function updateNeConfigBackup(data: Record<string, any>) {
return request({
url: '/ne/config/backup',
method: 'put',
data: data,
});
}
/**
* 网元配置文件备份记录下载
* @param id 记录ID
* @returns object
*/
export async function downNeConfigBackup(id: string) {
return await request({
url: '/ne/config/backup/download',
method: 'get',
params: { id },
responseType: 'blob',
timeout: 180_000,
});
}
/**
* 网元配置文件备份记录删除
* @param id 记录ID
* @returns object
*/
export async function delNeConfigBackup(id: string) {
return request({
url: '/ne/config/backup',
method: 'delete',
params: { id },
});
}
/**
* 网元配置文件备份导出
* @param data 数据 { neType, neId }
* @returns object
*/
export function exportNeConfigBackup(data: Record<string, any>) {
return request({
url: '/ne/config/backup/export',
method: 'post',
data: data,
responseType: 'blob',
timeout: 180_000,
});
}
/**
* 网元配置文件备份导入
* @param data 数据 { neType, neId, type, path }
* @returns object
*/
export function importNeConfigBackup(data: Record<string, any>) {
return request({
url: '/ne/config/backup/import',
method: 'post',
data: data,
});
}
+6
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,6 +38,8 @@ export function addNeInfo(data: Record<string, any>) {
url: `/ne/info`,
method: 'post',
data: data,
crypto: sessionGet(CACHE_SESSION_CRYPTO_API) !== 'false',
timeout: 30_000,
});
}
@@ -49,6 +53,8 @@ export function updateNeInfo(data: Record<string, any>) {
url: `/ne/info`,
method: 'put',
data: data,
crypto: sessionGet(CACHE_SESSION_CRYPTO_API) !== 'false',
timeout: 30_000,
});
}
+88
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
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,
});
}
+2 -1
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
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,
});
}
+88
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}`,
},
});
}
+30
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
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,
});
}
+28 -1
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,6 +38,32 @@ 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 },
});
}
/**
* SMF-在线订阅用户列表信息
* @param query 查询参数
* @returns object
*/
export function listSMFSubList(query: Record<string, any>) {
return request({
url: '/neData/smf/sub/list',
method: 'get',
params: query,
});
}
+43
View File
@@ -0,0 +1,43 @@
import { request } from '@/plugins/http-fetch';
/**
* 查询SMSC-CDR会话事件
* @param query 查询参数
* @returns object
*/
export function listSMSCDataCDR(query: Record<string, any>) {
return request({
url: '/neData/smsc/cdr/list',
method: 'get',
params: query,
timeout: 60_000,
});
}
/**
* SMSC-CDR会话删除
* @param id 信息ID
* @returns object
*/
export function delSMSCDataCDR(cdrIds: string | number) {
return request({
url: `/neData/smsc/cdr/${cdrIds}`,
method: 'delete',
timeout: 60_000,
});
}
/**
* SMSC-CDR会话列表导出
* @param data 查询列表条件
* @returns object
*/
export function exportSMSCDataCDR(data: Record<string, any>) {
return request({
url: '/neData/smsc/cdr/export',
method: 'post',
data,
responseType: 'blob',
timeout: 180_000,
});
}
+15 -1
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,
});
}
@@ -113,7 +114,6 @@ export function batchDelUDMAuth(neId: string, imsi: string, num: number) {
/**
* UDM鉴权用户导入
* @param neId 网元ID
* @param data 表单数据对象
* @returns object
*/
@@ -140,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,
});
}
+1
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
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,
});
}
+51
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,
});
}
+5 -3
View File
@@ -52,9 +52,11 @@ export async function listUENumByIMS(neId: String) {
method: 'get',
});
if (result.code === RESULT_CODE_SUCCESS) {
return Object.assign(result, {
data: result.data['ueNum'],
});
let num = result.data['ueNum'] || 0;
if (num === 0) {
num = result.data.data['ueNum'] || 0;
}
return Object.assign(result, { data: num });
}
// 模拟数据
+7 -5
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,
});
}
}
+17
View File
@@ -0,0 +1,17 @@
import { request } from '@/plugins/http-fetch';
/**
* 新 查询自定义指标数据
* @param query 查询参数
* @returns object
*/
export async function listCustomData(query: Record<string, any>) {
// 发起请求
const result = await request({
url: `/pm/kpiC/report`,
method: 'get',
params: query,
timeout: 60_000,
});
return result;
}
+66 -88
View File
@@ -1,64 +1,76 @@
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';
/**
* 查询自定义指标
* @param query 查询参数
* @returns object
*/
export async function listCustom(query: Record<string, any>) {
let totalSQL = 'select count(*) as total from pm_custom_title where 1=1 ';
let rowsSQL = 'select * from pm_custom_title where 1=1 ';
// export async function listCustom(query: Record<string, any>) {
// let totalSQL = 'select count(*) as total from pm_custom_title where 1=1 ';
// let rowsSQL = 'select * from pm_custom_title where 1=1 ';
// 查询
let querySQL = '';
if (query.neType) {
querySQL += ` and ne_type like '%${query.neType}%' `;
}
// // 查询
// let querySQL = '';
// if (query.neType) {
// querySQL += ` and ne_type like '%${query.neType}%' `;
// }
// 排序
let sortSql = ' order by update_time ';
if (query.sortOrder === 'asc') {
sortSql += ' asc ';
} else {
sortSql += ' desc ';
}
// 分页
const pageNum = (query.pageNum - 1) * query.pageSize;
const limtSql = ` limit ${pageNum},${query.pageSize} `;
// // 排序
// let sortSql = ' order by update_time ';
// if (query.sortOrder === 'asc') {
// sortSql += ' asc ';
// } else {
// sortSql += ' desc ';
// }
// // 分页
// const pageNum = (query.pageNum - 1) * query.pageSize;
// const limtSql = ` limit ${pageNum},${query.pageSize} `;
// // 发起请求
// const result = await request({
// url: `/api/rest/databaseManagement/v1/select/omc_db/pm_custom_title`,
// method: 'get',
// params: {
// totalSQL: totalSQL + querySQL,
// rowsSQL: rowsSQL + querySQL + sortSql + 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['pm_custom_title'];
// 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;
// }
/**
* 新 查询自定义指标
* @param query 查询参数
* @returns object
*/
export async function listCustom(query?: Record<string, any>) {
// 发起请求
const result = await request({
url: `/api/rest/databaseManagement/v1/select/omc_db/pm_custom_title`,
url: `/pm/kpiC/title/totalList`,
method: 'get',
params: {
totalSQL: totalSQL + querySQL,
rowsSQL: rowsSQL + querySQL + sortSql + limtSql,
},
params: query,
});
// 解析数据
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['pm_custom_title'];
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;
}
@@ -68,22 +80,10 @@ export async function listCustom(query: Record<string, any>) {
* @returns object
*/
export async function getCustom(id: string | number) {
// 发起请求
const result = await request({
url: `/api/rest/databaseManagement/v1/select/omc_db/pm_custom_title`,
return request({
url: `/pm/kpiC/title/${id}`,
method: 'get',
params: {
SQL: `select * from pm_custom_title where id = ${id}`,
},
});
// 解析数据
if (result.code === RESULT_CODE_SUCCESS && Array.isArray(result.data.data)) {
let data = result.data.data[0];
return Object.assign(result, {
data: parseObjLineToHump(data['pm_custom_title'][0]),
});
}
return result;
}
/**
@@ -92,21 +92,10 @@ export async function getCustom(id: string | number) {
* @returns object
*/
export function addCustom(data: Record<string, any>) {
let obj: any = {
title: data.title,
ne_type: data.neType,
kpi_id: data.kpiId,
object_type: data.objectType,
expression: data.expression,
period: data.period,
description: data.description,
kpi_set: data.kpiSet,
};
return request({
url: `/api/rest/databaseManagement/v1/omc_db/pm_custom_title`,
url: `/pm/kpiC/title`,
method: 'post',
data: { 'data': [obj] },
data: data,
});
}
@@ -116,20 +105,10 @@ export function addCustom(data: Record<string, any>) {
* @returns object
*/
export function updateCustom(data: Record<string, any>) {
let obj: any = {
title: data.title,
ne_type: data.neType,
kpi_id: data.kpiId,
object_type: data.objectType,
expression: data.expression,
period: data.period,
description: data.description,
kpi_set: data.kpiSet,
};
return request({
url: `/api/rest/databaseManagement/v1/omc_db/pm_custom_title?WHERE=id=${data.id}`,
url: `/pm/kpiC/title/${data.id}`,
method: 'put',
data: { data: obj },
data: data,
});
}
@@ -139,8 +118,7 @@ export function updateCustom(data: Record<string, any>) {
*/
export async function delCustom(data: Record<string, any>) {
return request({
url: `/api/rest/databaseManagement/v1/omc_db/pm_custom_title?WHERE=id=${data.id}`,
url: `/pm/kpiC/title/${data.id}`,
method: 'delete',
});
}
+43 -69
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
);
export async function getKPITitleList(query: Record<string, any>) {
return request({
url: '/neData/kpi/title/list',
method: 'get',
params: query,
});
}
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 = [];
/**
* 修改指标标题
* @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,
});
}
// 规则数据
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 };
//CCT指标
export async function getCctHour(query: Record<string, any>) {
return request({
url: '/neData/ims/cdr/cct-hour',
method: 'get',
params: query,
});
}
-1
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';
/**
* 查询任务列表
+64
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
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',
});
}
+53 -8
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,
});
+20
View File
@@ -0,0 +1,20 @@
import { request } from '@/plugins/http-fetch';
// iperf 版本信息
export function iperfV(data: Record<string, string>) {
return request({
url: '/tool/iperf/v',
method: 'get',
params: data,
});
}
// iperf 软件安装
export function iperfI(data: Record<string, string>) {
return request({
url: '/tool/iperf/i',
method: 'post',
data: data,
timeout: 60_000,
});
}
+24 -3
View File
@@ -1,7 +1,7 @@
import { request } from '@/plugins/http-fetch';
/**
* 查询文件列表列表
* 查询网元端文件列表
* @param query 查询参数
* @returns object
*/
@@ -14,7 +14,7 @@ export function listNeFiles(query: Record<string, any>) {
}
/**
* 从网元端获取文件
* 从网元到本地获取文件
* @param query 查询参数
* @returns object
*/
@@ -24,6 +24,27 @@ export function getNeFile(query: Record<string, any>) {
method: 'get',
params: query,
responseType: 'blob',
timeout: 180_000,
timeout: 600_000,
});
}
// 从网元到本地获取目录压缩为ZIP
export function getNeDirZip(data: Record<string, any>) {
return request({
url: '/ne/action/pullDirZip',
method: 'get',
params: data,
responseType: 'blob',
timeout: 600_000,
});
}
// 查看网元端文件内容
export function getNeViewFile(data: Record<string, any>) {
return request({
url: '/ne/action/viewFile',
method: 'get',
params: data,
timeout: 600_000,
});
}
+19
View File
@@ -0,0 +1,19 @@
import { request } from '@/plugins/http-fetch';
// ping 网元端版本信息
export function pingV(data: Record<string, string>) {
return request({
url: '/tool/ping/v',
method: 'get',
params: data,
});
}
// ping RTT 时延抖动
export function pingRTT(data: Record<string, string>) {
return request({
url: '/tool/ping/rtt',
method: 'POST',
data: data,
});
}
+79
View File
@@ -0,0 +1,79 @@
import { request } from '@/plugins/http-fetch';
/**
* 信令跟踪网卡设备列表
* @returns
*/
export function packetDevices() {
return request({
url: '/trace/packet/devices',
method: 'get',
});
}
/**
* 信令跟踪开始
* @param data 对象
* @returns
*/
export function packetStart(data: Record<string, any>) {
return request({
url: '/trace/packet/start',
method: 'post',
data: data,
});
}
/**
* 信令跟踪结束
* @param data 对象
* @returns
*/
export function packetStop(taskNo: string) {
return request({
url: '/trace/packet/stop',
method: 'post',
data: { taskNo },
});
}
/**
* 信令跟踪过滤
* @param data 对象
* @returns
*/
export function packetFilter(taskNo: string, expr: string) {
return request({
url: '/trace/packet/filter',
method: 'put',
data: { taskNo, expr },
});
}
/**
* 信令跟踪续期保活
* @param data 对象
* @returns
*/
export function packetKeep(taskNo: string, duration: number = 120) {
return request({
url: '/trace/packet/keep-alive',
method: 'put',
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,
});
}
@@ -6,6 +6,7 @@ export function dumpStart(data: Record<string, string>) {
url: '/trace/tcpdump/start',
method: 'post',
data: data,
timeout: 60_000,
});
}
@@ -15,14 +16,16 @@ export function dumpStop(data: Record<string, string>) {
url: '/trace/tcpdump/stop',
method: 'post',
data: data,
timeout: 60_000,
});
}
// UPF标准版内部抓包
export function traceUPF(data: Record<string, string>) {
return request({
url: '/trace/tcpdump/traceUPF',
url: '/trace/tcpdump/upf',
method: 'post',
data: data,
timeout: 60_000,
});
}
+104
View File
@@ -0,0 +1,104 @@
import { request } from '@/plugins/http-fetch';
/**
* 查询跟踪任务列表
* @param query 查询参数
* @returns object
*/
export async function listTraceTask(query: Record<string, any>) {
return request({
url: '/trace/task/list',
method: 'get',
params: query,
});
}
/**
* 查询跟踪任务信息
* @param id 网元ID
* @returns object
*/
export async function getTraceTask(id: string | number) {
return request({
url: `/trace/task/${id}`,
method: 'get',
});
}
/**
* 新增任务
* @param data 网元对象
* @returns object
*/
export function addTraceTask(data: Record<string, any>) {
return request({
url: `/trace/task`,
method: 'post',
data: data,
});
}
/**
* 修改任务
* @param data 网元对象
* @returns object
*/
export function updateTraceTask(data: Record<string, any>) {
return request({
url: `/trace/task`,
method: 'put',
data: data,
});
}
/**
* 跟踪任务删除
* @param ids ID多个逗号分隔
* @returns object
*/
export async function delTraceTask(ids: string) {
return request({
url: `/trace/task/${ids}`,
method: 'delete',
});
}
/**
* 跟踪任务文件
* @param query 对象
* @returns object
*/
export function filePullTask(traceId: string) {
return request({
url: '/trace/task/filePull',
method: 'get',
params: { traceId },
responseType: 'blob',
timeout: 600_000,
});
}
/**
* 跟踪任务数据列表
* @param query 查询参数
* @returns object
*/
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',
});
}
+83
View File
@@ -0,0 +1,83 @@
import { request } from '@/plugins/http-fetch';
/**
* 查询跟踪任务列表
* @param query 查询参数
* @returns object
*/
export function listTaskHLR(query: Record<string, any>) {
return request({
url: '/trace/task/hlr/list',
method: 'get',
params: query,
});
}
/**
* 跟踪任务删除
* @param ids 任务ID
* @returns object
*/
export function delTaskHLR(ids: string | number) {
return request({
url: `/trace/task/hlr/${ids}`,
method: 'delete',
timeout: 60_000,
});
}
/**
* 跟踪任务创建
* @param data 对象
* @returns object
*/
export function startTaskHLR(data: Record<string, any>) {
return request({
url: '/trace/task/hlr/start',
method: 'post',
data: data,
timeout: 60_000,
});
}
/**
* 跟踪任务停止
* @param data 对象
* @returns object
*/
export function stopTaskHLR(data: Record<string, any>) {
return request({
url: '/trace/task/hlr/stop',
method: 'post',
data: data,
timeout: 60_000,
});
}
/**
* 跟踪任务文件
* @param data 对象
* @returns object
*/
export function fileTaskHLR(data: Record<string, any>) {
return request({
url: '/trace/task/hlr/file',
method: 'post',
data: data,
});
}
/**
* 跟踪任务文件从网元到本地
* @param query 对象
* @returns object
*/
export function filePullTaskHLR(query: Record<string, any>) {
return request({
url: '/trace/task/hlr/filePull',
method: 'get',
params: query,
responseType: 'blob',
timeout: 600_000,
});
}
-71
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',
});
}
-154
View File
@@ -1,154 +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 listTraceTask(query: Record<string, any>) {
let totalSQL = 'select count(*) as total from trace_task where 1=1 ';
let rowsSQL = 'select * from trace_task where 1=1 ';
// 查询
let querySQL = '';
if (query.imsi) {
querySQL += ` and imsi like '%${query.imsi}%' `;
}
if (query.beginTime) {
querySQL += ` and start_time >= '${query.beginTime}' `;
}
if (query.endTime) {
querySQL += ` and end_time <= '${query.endTime}' `;
}
// 分页
const pageNum = (query.pageNum - 1) * query.pageSize;
const limtSql = ` limit ${pageNum},${query.pageSize} `;
// 排序
let sortSql = ' order by start_time ';
if (query.sortOrder === 'asc') {
sortSql += ' asc ';
} else {
sortSql += ' desc ';
}
// 发起请求
const result = await request({
url: `/api/rest/databaseManagement/v1/select/omc_db/trace_task`,
method: 'get',
params: {
totalSQL: totalSQL + querySQL,
rowsSQL: rowsSQL + querySQL + sortSql + 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_task'];
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;
}
/**
* 查询任务详细
* @param id 网元ID
* @returns object
*/
export async function getTraceTask(id: string | number) {
// 发起请求
const result = await request({
url: `/api/rest/databaseManagement/v1/select/omc_db/trace_task`,
method: 'get',
params: {
SQL: `select * from trace_task where id = ${id}`,
},
});
// 解析数据
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_task'][0]),
});
}
return result;
}
/**
* 新增任务
* @param data 网元对象
* @returns object
*/
export function addTraceTask(data: Record<string, any>) {
return request({
url: `/api/rest/traceManagement/v1/subscriptions`,
method: 'post',
data: data,
});
}
/**
* 修改任务
* @param data 网元对象
* @returns object
*/
export function updateTraceTask(data: Record<string, any>) {
return request({
url: `/api/rest/traceManagement/v1/subscriptions`,
method: 'put',
data: data,
});
}
/**
* 删除任务
* @param noticeId 网元ID
* @returns object
*/
export async function delTraceTask(id: string) {
return request({
url: `/api/rest/traceManagement/v1/subscriptions?id=${id}`,
method: 'delete',
});
}
/**
* 获取网元跟踪接口列表
* @returns object
*/
export async function getNeTraceInterfaceAll() {
// 发起请求
const result = await request({
url: `/api/rest/databaseManagement/v1/elementType/omc_db/objectType/ne_info`,
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;
}
Binary file not shown.

Before

Width:  |  Height:  |  Size: 70 KiB

+11
View File
@@ -0,0 +1,11 @@
/**
* worker文件-静态资源文件路径
*/
const baseUrl = import.meta.env.VITE_HISTORY_BASE_URL;
export const scriptUrl = `${
baseUrl.length === 1 && baseUrl.indexOf('/') === 0
? ''
: baseUrl.indexOf('/') === -1
? '/' + baseUrl
: baseUrl
}/wiregasm/worker.js`;
+1
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

+1
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

+3
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
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
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

+1
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

+6 -5
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 {
+479
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>
+2 -2
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"
+43 -20
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>
+4 -3
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}`)
: [];
}
/**表格字段列拖拽操作 */
+289
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>
+1 -1
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 },
});
});
+264
View File
@@ -0,0 +1,264 @@
<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';
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,
},
/**ws连接地址,必传 如/ws/view */
url: {
type: String,
required: true,
},
/**网元类型,必传 */
neType: {
type: String,
required: true,
},
/**网元ID,必传 */
neId: {
type: String,
required: true,
},
/**窗口单行字符数 */
cols: {
type: Number,
default: 80,
},
/**窗口行数 */
rows: {
type: Number,
default: 40,
},
/**ws发送requestId前缀 如ssh_id */
prefix: {
type: String,
default: 'ssh',
},
/**消息处理函数 */
processMessages: {
type: Function,
default: undefined,
},
});
/**终端输入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: true, // 光标闪烁
cursorStyle: 'block',
scrollback: 1000, // 设置历史缓冲区大小为 1000 行
scrollSensitivity: 15,
tabStopWidth: 4,
disableStdin: true, // 禁止输入
});
// 挂载
xterm.open(container);
// 自适应尺寸
const fitAddon = new FitAddon();
xterm.loadAddon(fitAddon);
// 终端尺寸变化触发
xterm.onResize(({ cols, rows }) => {
// console.log('尺寸', cols, rows);
ws.send({
requestId: `resize_${props.id}`,
type: 'resize',
data: { cols, rows },
});
});
// 创建 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,
neType: props.neType,
neId: props.neId,
id: props.id,
});
});
}
/**连接错误后回调 */
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 ' + code;
terminal.value.write(`\x1b[31m${message}\x1b[m\r\n`);
}
// 关闭事件
emit('close', {
code: code,
neType: props.neType,
neId: props.neId,
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 (terminal.value != null) {
let text = '';
// 处理消息
if (props.processMessages) {
text = props.processMessages(data);
}else{
text = processMessage(data);
}
// 无消息是则不输出
if (text === '') {
return;
}
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) {
// 建立链接
const options: OptionsType = {
url: props.url,
params: {
neType: props.neType,
neId: props.neId,
cols: props.cols,
rows: props.rows,
},
onmessage: wsMessage,
onerror: wsError,
onopen: wsOpen,
onclose: wsClose,
};
ws.connect(options);
}
});
onBeforeUnmount(() => {
if (ws.state() === WebSocket.OPEN) ws.close();
});
// 给组件设置属性 ref="xxxTerminal"
// setup内使用 const xxxTerminal = ref();
defineExpose({
/**清除 */
clear: () => {
if (terminal.value != null) {
terminal.value.clear();
}
},
/**发送命令 */
send: (type: string, data: Record<string, any>) => {
ws.send({
requestId: `${props.prefix}_${props.id}`,
type,
data,
});
},
/**模拟按下 Ctrl+C */
ctrlC: () => {
ws.send({
requestId: `${props.prefix}_${props.id}`,
type: 'ctrl-c',
});
},
});
</script>
<template>
<div ref="terminalDom" :id="id" class="terminal"></div>
</template>
<style lang="css" scoped>
.terminal {
width: 100%;
height: 100%;
}
</style>
+20 -10
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;
@@ -119,9 +119,9 @@ function fnAutoCompleteKeydown(evt: any) {
ws.send({
requestId: `telnet_${props.hostId}`,
type: 'telnet',
data: `${cmdStr}\r\n'`,
data: `${cmdStr}\r\n`,
});
terminalState.text = ' ';
terminalState.text = '';
// 退出登录
if (['q', 'quit', 'exit'].includes(cmdStr)) {
@@ -155,6 +155,15 @@ function handleRanderXterm(container: HTMLElement | undefined) {
// 自适应尺寸
const fitAddon = new FitAddon();
xterm.loadAddon(fitAddon);
// 终端尺寸变化触发
xterm.onResize(({ cols, rows }) => {
// console.log('尺寸', cols, rows);
ws.send({
requestId: `telnet_resize_${props.hostId}`,
type: 'resize',
data: { cols, rows },
});
});
// 创建 ResizeObserver 实例
var observer = new ResizeObserver(entries => {
@@ -280,18 +289,19 @@ defineExpose({
<template>
<div class="terminal">
<div ref="terminalDom" style="height: 78%" :id="id"></div>
<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"
@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>
-97
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>
+7 -6
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"
+204
View File
@@ -0,0 +1,204 @@
<script lang="ts" setup>
import { reactive, ref, computed, unref, onUpdated, watchEffect } from 'vue';
const props = defineProps({
/**列表高度 */
height: {
type: Number,
default: 300,
},
/**列表项高度 */
itemHeight: {
type: Number,
default: 30,
},
/**数据 */
data: {
type: Array,
default: () => [],
},
/**预先兜底缓存数量 */
cache: {
type: Number,
default: 2,
},
/**是否动态加载 */
dynamic: {
type: Boolean,
default: false,
},
});
const state = reactive<any>({
start: 0,
end: 10,
scrollOffset: 0,
cacheData: [],
});
const virtualListRef = ref();
const getWrapperStyle = computed(() => {
const { height } = props;
return {
height: `${height}px`,
};
});
const getInnerStyle = computed(() => {
return {
height: `${unref(getTotalHeight)}px`,
width: '100%',
};
});
const getListStyle = computed(() => {
return {
willChange: 'transform',
transform: `translateY(${state.scrollOffset}px)`,
};
});
// 数据数量
const total = computed(() => {
return props.data.length;
});
// 总体高度
const getTotalHeight = computed(() => {
if (!props.dynamic) return unref(total) * props.itemHeight;
return getCurrentTop(unref(total));
});
// 当前屏幕显示的数量
const clientCount = computed(() => {
return Math.ceil(props.height / props.itemHeight);
});
// 当前屏幕显示的数据
const clientData = computed(() => {
return props.data.slice(state.start, state.end);
});
const onScroll = (e: any) => {
const { scrollTop } = e.target;
if (state.scrollOffset === scrollTop) return;
const { cache, dynamic, itemHeight } = props;
const cacheCount = Math.max(1, cache);
let startIndex = dynamic
? getStartIndex(scrollTop)
: Math.floor(scrollTop / itemHeight);
const endIndex = Math.max(
0,
Math.min(unref(total), startIndex + unref(clientCount) + cacheCount)
);
if (startIndex > cacheCount) {
startIndex = startIndex - cacheCount;
}
// 偏移量
const offset = dynamic
? getCurrentTop(startIndex)
: scrollTop - (scrollTop % itemHeight);
Object.assign(state, {
start: startIndex,
end: endIndex,
scrollOffset: offset,
});
};
// 二分法去查找对应的index
const getStartIndex = (scrollTop = 0): number => {
let low = 0;
let high = state.cacheData.length - 1;
while (low <= high) {
const middle = low + Math.floor((high - low) / 2);
const middleTopValue = getCurrentTop(middle);
const middleBottomValue = getCurrentTop(middle + 1);
if (middleTopValue <= scrollTop && scrollTop <= middleBottomValue) {
return middle;
} else if (middleBottomValue < scrollTop) {
low = middle + 1;
} else if (middleBottomValue > scrollTop) {
high = middle - 1;
}
}
return Math.min(
unref(total) - unref(clientCount),
Math.floor(scrollTop / props.itemHeight)
);
};
const getCurrentTop = (index: number) => {
const lastIndex = state.cacheData.length - 1;
if (Object.hasOwn(state.cacheData, index)) {
return state.cacheData[index].top;
} else if (Object.hasOwn(state.cacheData, index - 1)) {
return state.cacheData[index - 1].bottom;
} else if (index > lastIndex) {
return (
state.cacheData[lastIndex].bottom +
Math.max(0, index - state.cacheData[lastIndex].index) * props.itemHeight
);
} else {
return index * props.itemHeight;
}
};
onUpdated(() => {
if (!props.dynamic) return;
const childrenList = virtualListRef.value.children || [];
[...childrenList].forEach((node: any, index: number) => {
const height = node.getBoundingClientRect().height;
const currentIndex = state.start + index;
if (state.cacheData[currentIndex].height === height) return;
state.cacheData[currentIndex].height = height;
state.cacheData[currentIndex].top = getCurrentTop(currentIndex);
state.cacheData[currentIndex].bottom =
state.cacheData[currentIndex].top + state.cacheData[currentIndex].height;
});
});
watchEffect(() => {
clientData.value.forEach((_, index) => {
const currentIndex = state.start + index;
if (Object.hasOwn(state.cacheData, currentIndex)) return;
state.cacheData[currentIndex] = {
top: currentIndex * props.itemHeight,
height: props.itemHeight,
bottom: (currentIndex + 1) * props.itemHeight,
index: currentIndex,
};
});
});
</script>
<template>
<div
class="virtual-list-wrapper"
ref="wrapperRef"
:style="getWrapperStyle"
@scroll="onScroll"
>
<div class="virtual-list-inner" ref="innerRef" :style="getInnerStyle">
<div class="virtual-list" :style="getListStyle" ref="virtualListRef">
<div v-for="(item, index) in clientData" :key="index + state.start">
<slot name="default" :item="item"></slot>
</div>
</div>
</div>
</div>
</template>
<style lang="css" scoped>
.virtual-list-wrapper {
position: relative;
overflow-y: auto;
}
</style>
+3
View File
@@ -3,3 +3,6 @@ export const ADMIN_ROLE_KEY = 'system';
/**系统管理员-系统指定权限 */
export const ADMIN_PERMISSION = '*:*:*';
/**次级系统管理员 */
export const TENANTADMIN_ROLE_KEY = 'admin';
+3
View File
@@ -3,3 +3,6 @@ export const APP_REQUEST_HEADER_CODE = 'X-App-Code';
/**应用-请求头-系统版本 */
export const APP_REQUEST_HEADER_VERSION = 'X-App-Version';
/**应用-请求数据-密钥 */
export const APP_DATA_API_KEY = 'T9ox2DCzpLfJIPzkH9pKhsOTMOEMJcFv';
+3
View File
@@ -1,3 +1,6 @@
/**会话缓存-接口加密 */
export const CACHE_SESSION_CRYPTO_API = 'cache:session:cryptoApi';
/**会话缓存-网络请求 */
export const CACHE_SESSION_FATCH = 'cache:session:fatch';
+9 -3
View File
@@ -4,6 +4,7 @@ export const NE_TYPE_LIST = [
'IMS',
'AMF',
'AUSF',
'UDR',
'UDM',
'SMF',
'PCF',
@@ -16,11 +17,16 @@ export const NE_TYPE_LIST = [
'N3IWF',
'MOCNGW',
'SMSC',
'SMSF',
'CBC',
'CHF',
'HLR',
'SGWC',
];
/**
* 网元拓展包列表,默认顺序
* IMS-adb/rtproxy/mf
* UDM-adb
* IMS-adb/kvdb/rtproxy/mf
* UDM-adb/kvdb
*/
export const NE_EXPAND_LIST = ['ADB', 'RTPROXY', 'MF'];
export const NE_EXPAND_LIST = ['ADB', 'KVDB', 'RTPROXY', 'MF'];
+9
View File
@@ -1,3 +1,12 @@
/**响应-code加密数据 */
export const RESULT_CODE_ENCRYPT = 2;
/**响应-msg加密数据 */
export const RESULT_MSG_ENCRYPT: Record<string, string> = {
zh_CN: '加密!',
en_US: 'encrypt!',
};
/**响应-code正常成功 */
export const RESULT_CODE_SUCCESS = 1;
+47
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'),
],
},
];
}
Loaded 100 of 355 files, more files were not shown because too many files have changed in this diff. Show more