275 Commits

Author SHA1 Message Date
TsMask
8f968839fa fix: 拓扑信息编辑模式控制 2023-12-29 18:43:14 +08:00
TsMask
8523b34c19 chore: 更新版本及说明 2023-12-29 18:42:29 +08:00
lai
d09171187d 更改告警详细信息展示方式 2023-12-29 18:09:24 +08:00
TsMask
7e894c4073 feat: 拓扑编辑功能绘制简单关系图 2023-12-29 18:04:58 +08:00
TsMask
6f5d02e479 fix: 打包编译类型错误导致失败 2023-12-29 18:03:56 +08:00
TsMask
b50c5250bf feat: 拓扑编辑功能操作 2023-12-29 16:20:57 +08:00
TsMask
f0ab5d5ea6 Merge branch 'main' of http://192.168.2.166:3180/OMC/ems_frontend_vue3 2023-12-29 16:19:42 +08:00
TsMask
d9c561e677 feat: 拓扑编辑多语言函数处理 2023-12-29 11:56:52 +08:00
TsMask
e4c829a46d style: 移除参数配置控制台输出 2023-12-29 11:49:07 +08:00
lai
139cc1bd0d 修改挂起英文名 2023-12-29 11:30:45 +08:00
lai
7297bd5d0f 性能提示语错误 2023-12-29 11:21:52 +08:00
TsMask
aa0c92a8d1 feat: 拓扑编辑分组功能 2023-12-29 10:17:31 +08:00
lai
a53fd939e1 新增五分钟颗粒度 2023-12-28 20:34:00 +08:00
lai
25b5212588 新增 删除网元时数据结构的处理 2023-12-28 20:33:35 +08:00
TsMask
5e463a6ce8 feat: 拓扑编辑代码优化 2023-12-28 15:20:04 +08:00
lai
fb4babf09a 活动告警中应答状态英文 2023-12-28 10:54:00 +08:00
lai
04b4c25c38 删除时未能刷新表格以及修复黄金指标警告 2023-12-28 10:53:42 +08:00
TsMask
9c61026c88 feat: 设置语言时同时设置HTML lang 2023-12-28 09:25:03 +08:00
TsMask
24816eb991 feat: 拓扑编辑节点功能 2023-12-27 20:25:08 +08:00
TsMask
b756fe9d56 style: 修改多语言key拼写错误 2023-12-27 17:42:15 +08:00
TsMask
1c8f208453 fix: 多语言key拼写错误 2023-12-27 17:41:19 +08:00
TsMask
5e8547aff8 Merge branch 'main' of http://192.168.2.166:3180/OMC/ems_frontend_vue3 2023-12-27 17:40:28 +08:00
TsMask
e6f0dd9f21 fix: 软件管理上传版本号提取 2023-12-27 17:40:04 +08:00
TsMask
5e8f65f11b fix: PCF批量删除表单校验提示异常问题 2023-12-27 17:32:32 +08:00
lai
ce86edef6c 新增首页异常网元版本号 2023-12-27 17:10:13 +08:00
lai
167cecba84 网元管理中英文 2023-12-27 17:09:36 +08:00
lai
d8d1b53027 网元管理新增同步网元开关 2023-12-27 17:09:09 +08:00
lai
9fdf13676e --黄金指标增加排序 2023-12-27 17:08:33 +08:00
TsMask
f20e9bc000 feat: 拓扑编辑边表单排版 2023-12-26 19:35:35 +08:00
TsMask
45b04975eb feat: 拓扑编辑边 2023-12-26 16:24:54 +08:00
lai
6441a1efaf 修正翻译 2023-12-26 14:14:04 +08:00
lai
7e98f35f5b 添加异常情况网元展示SN 2023-12-26 11:51:11 +08:00
lai
4f34b3bca9 自定义排序导出 2023-12-26 11:21:23 +08:00
TsMask
b8e8c07704 chore: 依赖版本升级 2023-12-26 10:13:19 +08:00
TsMask
3aea520289 feat: 拓扑编辑demo 2023-12-26 10:10:59 +08:00
TsMask
b54027bf0f style: 更多悬浮提示靠左避免遮挡 2023-12-26 10:10:16 +08:00
TsMask
0eb7bc9497 fix: 软件版本管理上传版本号截取 2023-12-26 10:09:44 +08:00
lai
7c69967148 新增导出插件的可排序功能 2023-12-26 10:03:00 +08:00
TsMask
dd14a32329 fix: 终端UDM数据勾选导出和勾选删除 2023-12-25 20:56:43 +08:00
TsMask
864be2ba3b fix: 参数配置值类型为字符串http判断 2023-12-25 20:55:59 +08:00
TsMask
e79d054ceb fix: 拓扑信息OMC默认无信息 2023-12-25 17:07:34 +08:00
TsMask
12f810d890 fix: 配置-参数配置里面的删除按钮,建议点击后增加二次确认避免误触 2023-12-25 17:05:20 +08:00
TsMask
715471f950 fix: 网元管理弹出菜单窗口设置为可移动 2023-12-25 17:04:42 +08:00
a23cfd209f fix: changelog 2.2312.9-20231222 2023-12-22 16:34:42 +08:00
TsMask
0f3df3a80b fix: 主页sn号读取配置 2023-12-22 15:54:38 +08:00
lai
04754a022f 外显SN,取消点击表头 2023-12-22 15:40:34 +08:00
lai
61df24059c 网元删除时表格锁定 2023-12-22 14:58:56 +08:00
TsMask
fbd41e2ebf style: 表格头按钮区域禁用按钮偏移 2023-12-22 12:22:47 +08:00
TsMask
cf7d234f91 chore: 版本说明 2023-12-22 10:43:13 +08:00
TsMask
b556dc36e6 Merge branch 'main' of http://192.168.2.166:3180/OMC/ems_frontend_vue3 2023-12-21 20:44:45 +08:00
TsMask
0c6ea19878 feat: 可编辑拓扑页面 2023-12-21 20:44:42 +08:00
TsMask
0c52f2cf3b fix: 拓扑变换布局 2023-12-21 20:44:05 +08:00
TsMask
2470eed417 feat: 读取服务端提供的版本号 2023-12-21 20:43:45 +08:00
lai
89c7b483d4 修正 2023-12-21 20:37:12 +08:00
lai
b26104b4bc 修正 2023-12-21 20:27:00 +08:00
acd8337606 fix: version 2023-12-21 20:06:22 +08:00
lai
eac0d957aa 优化首页echart代码 2023-12-21 16:03:19 +08:00
TsMask
eae2dd5d30 feat: 拓扑信息简览 2023-12-21 15:41:14 +08:00
TsMask
fa1bb05548 feat: 拓扑图接入数据显示状态 2023-12-21 14:45:03 +08:00
lai
6b855b8ff2 修正expend->expand 2023-12-21 14:10:21 +08:00
TsMask
11bfae8c0f fix: 日志文件切换IMS读取失败 2023-12-20 11:26:49 +08:00
lai
823114a6d0 --调整回退按钮 2023-12-20 11:22:55 +08:00
lai
99c6d233e5 Merge branch 'main' of http://192.168.2.166:3180/OMC/ems_frontend_vue3 2023-12-20 11:20:12 +08:00
TsMask
728d4b00d8 fix: 英文翻译 reload tab 2023-12-20 10:08:11 +08:00
TsMask
8288184f15 fix: 英文翻译tab/expend 2023-12-20 09:45:38 +08:00
lai
6fc9a305ce 修复历史告警-确认告警 2023-12-19 15:23:16 +08:00
lai
e8b95a594b --首页状态颜色自定义 2023-12-19 15:22:40 +08:00
TsMask
859eeda1fe fix: 告警帮助文档全屏弹窗 2023-12-19 14:00:48 +08:00
TsMask
3f20faf5be feat: 参数配置都是可选的参数 2023-12-18 20:23:17 +08:00
TsMask
208d7a4725 fix: PCF文件上传结果显示内容 2023-12-18 15:00:56 +08:00
TsMask
1c44651ad2 feat: 关系图 2023-12-15 18:30:46 +08:00
TsMask
f015f45601 feat: 关系图普通组件 2023-12-15 18:27:13 +08:00
TsMask
dfe06e2098 fix: 注释打包异常问题 2023-12-15 18:23:59 +08:00
TsMask
44c05e964e feat: G6版本使用稳定4.8 2023-12-15 18:16:58 +08:00
TsMask
e210dd7e33 Merge branch 'main' of http://192.168.2.166:3180/OMC/ems_frontend_vue3 2023-12-15 15:20:07 +08:00
TsMask
920bca7912 chore: 标记版本日期 2023-12-15 15:15:14 +08:00
TsMask
b0d7b7d539 feat: 拓扑图Dome 2023-12-15 15:15:09 +08:00
TsMask
cf9968a899 chore: 标记版本日期 2023-12-15 14:25:18 +08:00
TsMask
f67d083e10 feat: 拓扑图Dome 2023-12-15 14:24:04 +08:00
lai
5124c0c04a Merge branch 'main' of http://192.168.2.166:3180/OMC/ems_frontend_vue3 2023-12-14 11:33:49 +08:00
TsMask
d56c293ef5 fix: MML必填初始值的设置 2023-12-14 11:11:02 +08:00
TsMask
e90bc539e9 fix: udm签约用户新增必填msisdn 2023-12-14 11:01:57 +08:00
TsMask
7edcf1703e fix: 静态文件地址追加随机戳避免缓存 2023-12-14 11:01:19 +08:00
lai
8ee0a4d191 Merge branch 'main' of http://192.168.2.166:3180/OMC/ems_frontend_vue3 2023-12-14 10:05:12 +08:00
TsMask
bc1f897660 feat: 新增网元日志文件页面功能 2023-12-13 21:21:42 +08:00
lai
ba47d3a303 --调整删除请求网元超时时间 2023-12-13 19:47:41 +08:00
TsMask
38e5e4a9e0 fix: 参数配置index为0新增不累加问题 2023-12-13 12:49:24 +08:00
lai
15d7d118c4 调整英文翻译,添加活动告警的可伸缩列 2023-12-13 10:40:41 +08:00
lai
69d4348df7 媒体查询调整 2023-12-13 10:40:06 +08:00
TsMask
fe81a2d924 fix: 移动端适配样式调整 2023-12-12 19:30:44 +08:00
TsMask
cd53fab1f9 fix: 文件转存接口移动 2023-12-12 19:29:49 +08:00
lai
e6d62da386 网元列表进行特制化排序-初版 2023-12-12 16:44:56 +08:00
lai
752f8ccc70 批量新增时EPSODB转换十六进制问题 2023-12-12 15:34:53 +08:00
lai
3a0c85169e 修复设置显示过滤的sql 2023-12-12 15:22:27 +08:00
lai
f845f3f4de --修正后的小屏按钮挤兑问题 2023-12-12 14:55:07 +08:00
TsMask
63e3f352b2 style: 表格头按钮响应式 2023-12-12 12:14:20 +08:00
lai
d9ec9fd1e1 修复当小屏时按钮显示不出问题 2023-12-12 11:27:27 +08:00
lai
f198d2b9a2 新增媒体查询 2023-12-12 11:25:33 +08:00
TsMask
1c3e6db4bc fix: 参数配置修复根据规则取值导致的类型问题 2023-12-12 11:09:09 +08:00
TsMask
8199e16a17 fix: 主页的状态图表颜色默认值 2023-12-11 20:15:26 +08:00
TsMask
0d736966dd feat: 国际化切换判断权限去隐藏控件 2023-12-11 20:14:40 +08:00
TsMask
fe5905ee35 chore: 控制台版本号 2023-12-11 19:22:25 +08:00
TsMask
9c27c32e26 fix: 参数配置根据规则布尔类型转换 2023-12-11 19:21:32 +08:00
TsMask
4208ccc358 style: 拓扑基础节点 2023-12-08 21:16:37 +08:00
lai
51a190771d 调整后的黄金指标,首页状态颜色自定义 2023-12-08 19:19:06 +08:00
TsMask
3376d90b96 fix: 缓存网元类型获取数据判断 2023-12-08 18:52:33 +08:00
TsMask
4105f4ef33 fix: 缓存网元类型获取级联数据判断 2023-12-08 18:38:46 +08:00
TsMask
e6a4591fb6 fix: 缓存网元类型获取级联数据判断 2023-12-08 18:20:21 +08:00
TsMask
fafe604323 fix: 类型异常导致编译失败 2023-12-08 17:26:40 +08:00
TsMask
f110d0e697 fix: 配置文件key为字符串 2023-12-08 17:17:00 +08:00
TsMask
6210b87c84 style: 补充节点,鼠标悬浮动画 2023-12-08 16:30:20 +08:00
TsMask
5a761ece4e chore: 更新依赖包 2023-12-07 20:16:04 +08:00
TsMask
3fa2cffc82 fix: 拓扑图基础 2023-12-07 20:15:18 +08:00
TsMask
e92004a69a style: 文件上传网元端失败固定提示 2023-12-07 18:27:40 +08:00
lai
a612d05429 修正 2023-12-07 17:36:10 +08:00
TsMask
c93dabc6cf fix: PCF查询无数据清空表不提示警告 2023-12-07 17:16:27 +08:00
TsMask
5056de2c1a fix: 参数配置新增根据规则类型转值 2023-12-07 17:15:50 +08:00
8725518450 Merge branch 'main' of http://192.168.2.166:3180/OMC/ems_frontend_vue3 2023-12-07 15:06:45 +08:00
596ee0bb8d fix: prot to port 2023-12-07 15:06:43 +08:00
lai
d5f593647e 修复告警确认告警机制 2023-12-07 10:25:51 +08:00
37eb798c4a Merge branch 'main' of http://192.168.2.166:3180/OMC/ems_frontend_vue3 2023-12-07 09:46:39 +08:00
6536e8baba fix: config.js default host value 2023-12-07 09:46:35 +08:00
TsMask
90a34302a8 style: 更新batch图标 2023-12-06 19:33:32 +08:00
84bbeda7fc Merge branch 'main' of http://192.168.2.166:3180/OMC/ems_frontend_vue3 2023-12-06 19:30:22 +08:00
cbefc04ac9 fix: en locales 2023-12-06 19:30:21 +08:00
TsMask
7564d6c6ab style: n3iwf改表头名称 2023-12-06 18:49:36 +08:00
lai
36ac9d0a5f ---黄金指标初版 2023-12-06 18:13:21 +08:00
TsMask
be6e91390e style: 主页状态颜色 2023-12-06 18:11:53 +08:00
TsMask
f9016492be fix: 终端管理当前列imsi排序 2023-12-06 17:30:13 +08:00
TsMask
dd8dc63eab style: 中断执行提示中断 2023-12-06 16:59:40 +08:00
TsMask
6303aecb47 style: 登录页brand图标宽度174px 2023-12-06 16:16:47 +08:00
TsMask
0216c253d8 fix: 部门名称长度限制问题 2023-12-06 16:07:45 +08:00
1076663511 fix: to 2.2312.8 2023-12-06 15:08:12 +08:00
TsMask
8495192b83 fix: 软件管理-上传软件说明非必填 2023-12-06 14:41:07 +08:00
TsMask
88840cf88e style: UDM多语言-加载数据 2023-12-06 10:49:20 +08:00
lai
97e453d880 修改黄金指标接口 2023-12-05 19:54:16 +08:00
lai
dfc4a849f6 调整展示 2023-12-05 19:11:12 +08:00
lai
20b6c5c10a 新增黄金指标统计展示 2023-12-05 18:53:02 +08:00
lai
ab2154003e 增加黄金指标相关代码 2023-12-04 19:37:40 +08:00
TsMask
b2b837623a fix: 不用Nginx就关闭gzip压缩 2023-12-04 19:19:07 +08:00
TsMask
fb45c3fc10 fix: 补充缺失代码导致的打包异常 2023-12-04 19:06:08 +08:00
TsMask
d64c0f9e5e fix: 更新dev版本号 2023-12-04 18:20:48 +08:00
TsMask
27cc02e0d6 fix: 是否i显示国际化切换的开关 2023-12-04 18:19:11 +08:00
TsMask
12643cac12 feat: 系统设置国际化切换 2023-12-04 18:18:26 +08:00
TsMask
205e07af45 fix: 挂载前根据默认语言在设置一次 2023-12-04 18:17:28 +08:00
TsMask
a1443ebb95 fix: 修改兼容旧前端可改配置文件 2023-12-04 18:17:15 +08:00
TsMask
b6d22014ce del: 删除logo图片文件 2023-12-04 18:16:27 +08:00
TsMask
9abeb7be97 fix: 根据浏览器选择语言 2023-12-04 18:15:51 +08:00
TsMask
96d6cfcfa2 feat: 图标支持根据语言上传对应图标 2023-12-04 16:54:49 +08:00
c16a1675f0 fix: uploaded time 2023-12-02 17:33:58 +08:00
TsMask
bddba89d1e fix: mml命令后面紧跟命令结果 2023-12-01 19:40:30 +08:00
TsMask
eb49b4d29a chore": 更新版本号 2023-12-01 19:29:01 +08:00
TsMask
9d0daca765 fix: 参数配置列新增使用config_rule规制默认值 2023-12-01 19:27:34 +08:00
TsMask
cc234ee081 fix: 用户管理修改角色分配权限标识 2023-12-01 19:26:34 +08:00
TsMask
e23438d910 fix: PCF用户策略控制列表查询提示 2023-12-01 19:25:56 +08:00
TsMask
4fccb85353 fix: PCF用户策略控制导入问题 2023-12-01 17:10:36 +08:00
TsMask
3a8f6964ae feat: PCF用户策略控制导入导出 2023-12-01 16:54:27 +08:00
TsMask
5f89732a61 fix: 参数配置默认idnex+1 2023-12-01 14:11:12 +08:00
TsMask
8a7698b58f style: 表格size=small边距6px/拖拽mask穿透导致滚动失效 2023-11-30 16:49:15 +08:00
TsMask
805785ccb7 style: UE终端表格优化 2023-11-30 16:45:55 +08:00
TsMask
f2d5379506 feat: 新增PCF用户策略控制 2023-11-30 16:43:45 +08:00
134406a82c fix: alarm forwarding 2023-11-29 20:12:41 +08:00
19f4f2e1a1 Merge branch 'main' of http://192.168.2.166:3180/OMC/ems_frontend_vue3 2023-11-29 19:28:38 +08:00
fffc40b4a3 fix: logo 2023-11-29 19:28:33 +08:00
TsMask
95fbce6b0e fix: 根据配置隐藏多语言选择 2023-11-29 19:27:49 +08:00
lai
1784941670 --操作日志的中英文 2023-11-29 19:00:47 +08:00
TsMask
38c3964f5c feat: 新增终端加N3IWF页面 2023-11-29 15:12:45 +08:00
f9ab845feb Merge branch 'main' of http://192.168.2.166:3180/OMC/ems_frontend_vue3 2023-11-29 11:52:01 +08:00
48247bbb25 fix: backup management 2023-11-29 11:51:59 +08:00
TsMask
7c66d15e58 fix: 上传切片文件并发送文件到网元端 2023-11-29 10:13:56 +08:00
TsMask
1c83d7ca46 feat: 帮助文档页面多语言 2023-11-29 09:59:36 +08:00
lai
ab79f577af 黄金指标数据查询问题,添加排序 2023-11-29 09:48:42 +08:00
14a8af033c fix: en locales 2023-11-29 09:27:22 +08:00
TsMask
572551dd76 fix: 延迟加载数据 2023-11-28 21:27:35 +08:00
TsMask
c8e8cca410 chore: 更换layout依赖库 2023-11-28 21:08:26 +08:00
TsMask
642fff876a fix: 系统名称长度设置20位字符 2023-11-28 20:55:05 +08:00
TsMask
8e1edc680e feat: 帮助文档PDF查看器 2023-11-28 20:53:21 +08:00
6d9322f483 Merge branch 'main' of http://192.168.2.166:3180/OMC/ems_frontend_vue3 2023-11-28 19:42:50 +08:00
4cd896abfe fix: cell information to NodeB Information 2023-11-28 19:33:18 +08:00
lai
ac93726a0f 新增性能数据排序功能 2023-11-28 19:21:26 +08:00
TsMask
534f261bd4 fix: 修复帮助文档跳转404 2023-11-28 16:43:51 +08:00
TsMask
a22213eae3 chore: config.js说明 2023-11-28 15:22:00 +08:00
TsMask
c21fbd133a fix: 参数配置编辑只读项禁用编辑 2023-11-28 15:19:20 +08:00
TsMask
55981f8936 style: 调整UDM用户数据表格靠左 2023-11-28 15:12:51 +08:00
TsMask
252ed66ff8 style: 文件导入信息输出框 2023-11-28 14:48:02 +08:00
TsMask
44c9f0879b fix: mml管理文件上传提示多语言 2023-11-28 14:40:18 +08:00
TsMask
9f16fb3df6 feat: MML操作支持多条发送/文件上传到网元 2023-11-28 14:38:12 +08:00
TsMask
a41936a199 fix: UDM鉴权用户导入导出接口调整 2023-11-28 14:37:17 +08:00
TsMask
dff94061e2 fix: MML命令处理发送多条 2023-11-28 14:36:49 +08:00
TsMask
37d59bf7da fix: 参数配置行记录read-only ro 2023-11-27 17:19:50 +08:00
TsMask
7be72be2f8 fix: 表格列数据响应改为 ref/重新加载表格10s 2023-11-27 16:58:55 +08:00
TsMask
ec21656385 feat: 参数配置modal拖拽/表格列排序可选 2023-11-27 16:40:04 +08:00
TsMask
c1d513bc82 ref: 优化表格列排序组件 2023-11-27 16:37:56 +08:00
TsMask
a6542145e3 Merge branch 'main' of http://192.168.2.166:3180/OMC/ems_frontend_vue3 2023-11-27 16:37:21 +08:00
lai
c5c3c9be71 首页table中的网元异常正常中英文 2023-11-27 14:30:28 +08:00
TsMask
ac14a207c4 fix: 超过高度才显示滚动条 2023-11-25 19:25:19 +08:00
TsMask
a991cf3370 fix: 拖动Modal穿透复制文字挂载.ant-pro-page-container 2023-11-25 19:04:48 +08:00
TsMask
af53fe1d89 fix: UDM用户数据表格调整 2023-11-25 19:03:51 +08:00
TsMask
8370598e17 docs: 修改配置文件说明 2023-11-25 15:41:26 +08:00
TsMask
5094b91f28 del: doc.pdf 2023-11-25 15:41:00 +08:00
TsMask
4c06ddd5f9 fix: Modal拖拽参数传递 2023-11-25 15:28:31 +08:00
TsMask
133affa551 feat: 表格字段列排序可选组件 2023-11-25 15:28:04 +08:00
TsMask
03a3899377 fix: UDM用户数据表格优化 2023-11-25 15:26:56 +08:00
lai
9f5f35c79d ---告警帮助文档中英文 2023-11-24 19:36:40 +08:00
TsMask
44ee479b32 fix: UDM用户信息编辑拖动title 2023-11-24 19:16:39 +08:00
62a15150b6 fix: RatType 2023-11-24 18:35:05 +08:00
TsMask
5accdd1b31 fix: 在线用户部门列隐藏 2023-11-24 17:16:58 +08:00
TsMask
f3fc415338 feat: 新增可拖拽modal框 2023-11-24 17:06:18 +08:00
018196eb88 Merge branch 'main' of http://192.168.2.166:3180/OMC/ems_frontend_vue3 2023-11-24 14:30:18 +08:00
3e29706b26 fix: en locales 2023-11-24 14:30:16 +08:00
TsMask
627e579729 feat: 帮助文档多语言文件上传 2023-11-24 14:20:59 +08:00
030254db4e fix: en locales 2023-11-24 14:13:51 +08:00
TsMask
0e7b6fa6e4 fix: 隐藏登录页账号密码 2023-11-24 10:04:33 +08:00
57f126b5f2 Merge branch 'main' of http://192.168.2.166:3180/OMC/ems_frontend_vue3 2023-11-24 09:07:57 +08:00
8fa758d747 fix: operation 2023-11-24 09:07:55 +08:00
TsMask
2030509cbb fix: 参数配置表单样式排齐 2023-11-23 21:59:34 +08:00
TsMask
10a48af368 feat: UDM用户数据代码完善 2023-11-23 21:49:57 +08:00
TsMask
5101b1bae3 fix: 网络请求统一10秒超时 2023-11-23 21:49:07 +08:00
TsMask
c590482fa4 fix: 导出请求时使用接受语言 2023-11-23 15:05:19 +08:00
TsMask
c1c6500df2 feat: 新增系统设置帮助文档/官网设置 2023-11-23 15:04:46 +08:00
TsMask
12499e78ea fix: 请求结果msg取多语言 2023-11-22 19:33:46 +08:00
TsMask
6ada29bc9b fix: 移除mml命令页面输出字符串 2023-11-22 16:39:39 +08:00
TsMask
0f988f65e4 fix: 参数配置未知参数类型默认用文本输入框 2023-11-22 15:38:27 +08:00
TsMask
c8a53c0c0f chore: 更新版本号号 2023-11-22 15:27:53 +08:00
TsMask
d870f12daf feat: mml命令操作支持输入多行发送 2023-11-22 15:27:13 +08:00
a960e77fc6 Merge branch 'main' of http://192.168.2.166:3180/OMC/ems_frontend_vue3 2023-11-22 14:22:23 +08:00
f32d5dd06e fix: en locales 2023-11-22 14:22:21 +08:00
lai
f9bd9f7292 --网元管理 删除成功的错误提示 2023-11-22 10:27:54 +08:00
TsMask
6ecd98650b fix: 日志导出响应类型推到 2023-11-22 09:35:54 +08:00
c49da78996 fix: ... 2023-11-22 09:35:17 +08:00
c4f3eabc71 fix: alarm forwarding en locales 2023-11-22 09:32:36 +08:00
TsMask
3a6059263f fix: 调度任务状态多语言 2023-11-21 19:48:49 +08:00
TsMask
a104fbf7eb feat: 帮助手册右上侧按钮 2023-11-21 18:46:19 +08:00
TsMask
407e15ca3c fix: 底部时间导致页面重绘吃字 2023-11-21 18:38:55 +08:00
TsMask
60adbce55d fix: 软件管理下发createTime 2023-11-21 18:38:22 +08:00
TsMask
5e8049c3b3 fix: 参数配置array显示枚举值 2023-11-21 15:54:36 +08:00
TsMask
129c9085d5 fix: 告警Severity字典显示 2023-11-21 15:16:09 +08:00
TsMask
3bc4fafde7 fix: 告警列表类型改字典 2023-11-21 11:28:20 +08:00
TsMask
2e165fbcff fix: 取消参数配置number输入最大值限制 2023-11-21 09:35:19 +08:00
TsMask
474502b45b feat: 帮助文档pivew 2023-11-20 19:05:01 +08:00
TsMask
081523db42 feat: 底部显示服务器时间 2023-11-20 19:04:27 +08:00
TsMask
21cd314c46 fix: UDM用户数据接口变更 2023-11-20 19:03:51 +08:00
TsMask
5c792b9ac5 chore: 更新版本号 2023-11-20 18:16:26 +08:00
TsMask
14eabfe1fe style: 岗位填入值顺序 2023-11-20 18:14:39 +08:00
TsMask
1e5874d7e7 fix: 调度任务隐藏无用选项 2023-11-20 18:13:35 +08:00
TsMask
e9054e320f fix: 首次访问获取客户端默认语言/静态路由title 2023-11-20 18:12:29 +08:00
9fdd322757 fix: change to 2.2311.8 2023-11-20 16:36:00 +08:00
TsMask
4c9388ffcb fix: 岗位/角色表格字段靠左 2023-11-17 17:52:47 +08:00
dc4d91eb41 fix: en locales 2023-11-17 14:28:46 +08:00
86e3795693 fix: en locales 2023-11-17 13:59:26 +08:00
03411444e4 Merge branch 'main' of http://192.168.2.166:3180/OMC/ems_frontend_vue3 2023-11-17 11:33:50 +08:00
f401ded041 fix: update login page title 2023-11-17 11:33:48 +08:00
TsMask
010cb6d45b fix: 系统设置LOGO菜单多语言 2023-11-17 11:16:56 +08:00
TsMask
bb577bef0b fix: 处理router.多语言显示 2023-11-17 11:16:08 +08:00
TsMask
69bd3879b1 style: 菜单/配置表格文字靠左 2023-11-17 10:03:02 +08:00
TsMask
ae6feb15a2 fix: 参数配置嵌套展开加图标按钮类型 2023-11-17 10:02:27 +08:00
TsMask
b8feb6fa35 style: 网元新增输入端口提示-多语言 2023-11-17 10:01:12 +08:00
bb92be64fd Merge branch 'main' of http://192.168.2.166:3180/OMC/ems_frontend_vue3 2023-11-16 16:46:35 +08:00
ce556f8a57 fix: en locales 2023-11-16 16:46:32 +08:00
TsMask
6f246c5800 style: 多语言中文zebra命名错误 2023-11-16 16:43:25 +08:00
TsMask
6ceee6498f fix: mml数据过滤不激活使用的记录 2023-11-16 16:42:45 +08:00
TsMask
261806ccda style: 菜单管理新增多语言{}变量异常 2023-11-16 14:21:22 +08:00
TsMask
bfc0afdb14 feat: 参数配置四个版本排版-_-|| 2023-11-16 11:40:18 +08:00
TsMask
1238dc3a35 feat: 参数配置TreeTable组合 2023-11-15 20:42:15 +08:00
TsMask
7d5ee27bee style: 任务和字典列表字段靠左 2023-11-15 19:53:55 +08:00
TsMask
b9f8426b3f fix: 参数配置list回显 2023-11-15 19:53:21 +08:00
a5d380209e Merge branch 'main' of http://192.168.2.166:3180/OMC/ems_frontend_vue3 2023-11-15 17:48:11 +08:00
65c6571c79 fix: en locales 2023-11-15 17:48:10 +08:00
lai
2ef4261e1b ---完善国际化 2023-11-15 17:45:28 +08:00
84e7e2ef9f fix: update english locale 2023-11-15 15:28:27 +08:00
TsMask
5980c7d881 fix: en treeSelectTip 2023-11-15 15:10:03 +08:00
TsMask
de6271df00 feat: 新增参数配置Tree/调整参数配置Form 2023-11-15 14:59:43 +08:00
TsMask
4f18fe2552 fix: 默认选择AMF找不到选首个 2023-11-15 14:58:36 +08:00
TsMask
b569fa57b6 fix: 参数配置Form标签top横向 2023-11-15 10:23:19 +08:00
lai
c1a0c6f208 --完善国际化 2023-11-14 19:28:33 +08:00
188 changed files with 19787 additions and 3304 deletions

View File

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

View File

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

36
CHANGELOG.md Normal file
View File

@@ -0,0 +1,36 @@
# 版本发布日志
## 2.2312.10-20231229
- 新增 告警列表记录自定义排序导出
- 新增 黄金指标 KPI 数据列表支持排序
- 新增 黄金指标 KPI 数据支持选择五分钟颗粒度
- 新增 网元管理新增修改时可选同步网元信息的开关
- 新增 终端-UDM 数据勾选记录导出和勾选记录删除功能
- 修复 配置-参数配置里面的删除按钮,增加二次确认避免误触
- 修复 配置-参数配置值类型为字符串 http 判断
- 修复 软件版本管理上传版本号截取
- 修复 PCF 用户策略控制批量删除表单选项校验异常提示
- 修复 打包编译时类型异常问题
- 优化 网元管理弹出菜单窗口设置为可移动
- 优化 网元管理鼠标悬浮更多时提示靠左显示避免遮挡
- 优化 首页网元异常情况展示 SN
- 优化 告警详细信息展示方式
## 2.2312.9-20231222
- 新增 日志管理查看网元日志文件并下载功能页面
- 新增 国际化切换权限控制,系统设置里控制切换默认语言
- 新增 性能管理 KPI 指标集功能页面
- 新增 UE 管理 PCF 用户策略控制功能页面
- 修复 参数配置新增数据类型值不匹配导致的异常失败
- 修复 多处英文显示词义不明确的信息提示
- 修复 UE 管理 UDM 签约用户数据批量新增时 EPSODB 转换十六进制问题
- 优化 网元管理重启接口超时导致网元信息不一致问题
- 优化 参数配置新增编辑参数顺序,参数类型格式化
- 优化 主页网元状态饼图颜色选择自定义
- 优化 MML 操作 UDM 签约用户信息字段,必填项标红
- 优化 软件管理回退功能操作页面
- 优化 静态文件地址追加随机戳避免缓存
- 优化 补充移动端样式适配调整
- 主页修改增加 OMC 的序列号,点击网元信息不再覆盖右边信息框

View File

@@ -12,6 +12,11 @@
Jenkins: http://192.168.2.166:3185/
Nginx: http://192.168.2.166:3188/#/index
后端暴露端口: http://192.168.2.166:3186 \ http://192.168.2.166:3187
新网管192.168.5.13
旧网管192.168.5.14
登录账户manager/manager
```
## 程序命令
@@ -51,7 +56,8 @@ eyJhbGciOiJSUzI1NiIsImtpZCI6ImZFVUhIb1puLW04M1dfSUYyRU8zWlZueXBpNUh4T0hTRVlzU19j
```
```ssh
# https://blog.csdn.net/m0_54706625/article/details/129721121
sudo chmod 700 -/.ssh/
sudochmod 700 /home/ubuntu #这个尤其容易忽视掉,我就是从这个坑里爬出来。有木有很高兴呀!
3sudochmod 600 -/ssh/authorized keys
sudo chmod 700 /home/mask/.ssh #这个尤其容易忽视掉,我就是从这个坑里爬出来。有木有很高兴呀!
sudo chmod 600 ~/.ssh/authorized_keys
```

View File

@@ -4,7 +4,7 @@
<meta charset="UTF-8" />
<link rel="icon" href="/favicon.ico" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title> </title>
<title>loading...</title>
<link rel="preload" href="/loading.js" as="script">
<script async src="/loading.js"></script>
<link rel="preload" href="/config.js" as="script">

View File

@@ -1,7 +1,7 @@
{
"name": "ems_frontend_vue3",
"type": "module",
"description": "核心网管理系统",
"description": "核心网管理平台",
"author": "TsMask",
"engines": {
"node": ">=18.0.0"
@@ -12,12 +12,15 @@
"preview": "vite preview"
},
"dependencies": {
"@ant-design-vue/pro-layout": "^3.2.5",
"@ant-design/icons-vue": "^7.0.1",
"@antv/g6": "^4.8.24",
"@codemirror/lang-javascript": "^6.2.1",
"@codemirror/merge": "^6.1.2",
"@codemirror/merge": "^6.4.0",
"@codemirror/theme-one-dark": "^6.1.2",
"@tato30/vue-pdf": "^1.8.1",
"@vueuse/core": "^10.7.0",
"ant-design-vue": "^3.2.20",
"antdv-pro-layout": "^3.2.6",
"codemirror": "^6.0.1",
"dayjs": "^1.11.10",
"echarts": "^5.4.2",
@@ -26,23 +29,24 @@
"js-cookie": "^3.0.5",
"nprogress": "^0.2.0",
"pinia": "^2.1.7",
"vue": "^3.3.6",
"vue": "^3.3.13",
"vue-codemirror": "^6.1.1",
"vue-i18n": "^9.5.0",
"vue-i18n": "^9.8.0",
"vue-router": "^4.2.5",
"vue3-smooth-dnd": "^0.0.6",
"xlsx": "^0.18.5"
},
"devDependencies": {
"@types/file-saver": "^2.0.5",
"@types/js-cookie": "^3.0.3",
"@types/file-saver": "^2.0.7",
"@types/js-cookie": "^3.0.6",
"@types/node": "^18.0.0",
"@types/nprogress": "^0.2.0",
"@vitejs/plugin-vue": "^4.3.4",
"@types/nprogress": "^0.2.3",
"@vitejs/plugin-vue": "^4.5.2",
"less": "^4.2.0",
"typescript": "^5.2.2",
"unplugin-vue-components": "^0.25.2",
"vite": "^4.5.0",
"typescript": "^5.3.3",
"unplugin-vue-components": "^0.26.0",
"vite": "^5.0.10",
"vite-plugin-compression": "^0.5.1",
"vue-tsc": "^1.8.19"
"vue-tsc": "^1.8.25"
}
}

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -1,16 +1,27 @@
/**
* config 非Nginx部署可使用的配置参数
* Configuration parameters available for non Nginx deployments using config
* =============== Zh ===============
* - Nginx部署
* 删除loading.js同级下同名文件Nginx代理地址: /omc-api
*
* - 非Nginx部署
* 请将当前文件与loading.js同级将host变量值修改为数据服务访问地址
* !!!注意: 修改当前文件后,建议关闭浏览器后重新访问
*
* =============== En ===============
* - Nginx Deployment
* Delete the file with the same name under the same level of loading.js, Nginx proxy address: /omc-api
*
* - Non-Nginx Deployment
* Please make the current file the same level as the loading.js, change the host variable value to the data service access address
* !!! Note: After modifying the current file, it is recommended to revisit it after closing the browser.
*
*/
(function () {
// host = ip:prot
const host = "192.168.2.166:3030";
// host = ip:port
const host = '192.168.8.100:3030';
// Service Address 服务地址
const baseUrl = `http://${host}`
sessionStorage.setItem("baseUrl", baseUrl)
// websocket Address
const wsUrl = `ws://${host}`
sessionStorage.setItem("wsUrl", wsUrl)
// Service Address 服务地址
sessionStorage.setItem('baseUrl', `http://${host}`);
// websocket Address
sessionStorage.setItem('wsUrl', `ws://${host}`);
})();

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.3 KiB

After

Width:  |  Height:  |  Size: 227 B

View File

@@ -155,22 +155,30 @@
}
</style>`;
const lang = localStorage.getItem('cache:local:i18n');
// 根据浏览器选择语言
// if (!lang) {
// let preferredLanguage = navigator.language;
// if (preferredLanguage.indexOf('-')) {
// preferredLanguage = preferredLanguage.replace('-', '_');
// }
// localStorage.setItem('cache:local:i18n', preferredLanguage);
// }
let loadInfo = {
title: '正在加载资源',
titleSub: '初次加载资源可能需要较多时间',
msg: '请耐心等待',
};
document.title = "管理系统";
// document.title = "AGrandEMS";
// 判断选择语言
const lang = localStorage.getItem('cache:local:i18n') || 'zh_CN';
if (lang === 'en_US') {
loadInfo = {
title: 'Loading Resources',
titleSub: 'Loading resources for the first time may take a lot of time',
msg: 'Please be patient',
};
document.title = "Managerial System";
// document.title = "AGrandEMS";
}
const divStr = `

1
public/svg/base.svg Normal file
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="1702978675818" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="4327" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><path d="M512.1 955.7c-1.4 0-2.7-0.4-4-1.1L80.4 706.4c-2.4-1.4-3.9-4-3.9-6.8v-88.8c0-2.8 1.5-5.4 3.9-6.8l427.7-252c1.2-0.7 2.6-1.1 4-1.1s2.8 0.4 4 1.1l427.6 252c2.4 1.4 3.9 4 3.9 6.8v88.8c0 2.8-1.5 5.4-3.9 6.8L516 954.6c-1.2 0.7-2.6 1.1-3.9 1.1z" fill="#B5D6FB" p-id="4328"></path><path d="M512.1 358.8l427.5 252v88.8L869.9 740 512.1 947.8 154.1 740l-69.7-40.4v-88.8l427.7-252m0-15.8c-2.8 0-5.5 0.7-8 2.2l-427.7 252c-4.8 2.8-7.8 8-7.8 13.6v88.8c0 5.6 3 10.8 7.9 13.7l69.7 40.5 358 207.8c2.4 1.4 5.2 2.1 7.9 2.1s5.5-0.7 7.9-2.1l357.8-207.8 69.7-40.4c4.9-2.8 7.9-8 7.9-13.7v-88.8c0-5.6-3-10.8-7.8-13.6l-427.5-252c-2.5-1.5-5.3-2.3-8-2.3z" fill="#0276F7" p-id="4329"></path><path d="M84.4 610.8L512 860.7l427.6-249.9-427.5-252z" fill="#FFFFFF" p-id="4330"></path><path d="M500.9 70.3L232.1 562.1l277.7 159L791 561.2z" fill="#D4E4FC" p-id="4331"></path><path d="M214.6 601.2c-1.3 0-2.6-0.3-3.9-1-3.8-2.1-5.2-6.9-3-10.7l294.9-525c1.4-2.5 4-4 6.9-4 2.8 0 5.4 1.5 6.9 4l299.9 525c2.2 3.8 0.8 8.6-2.9 10.8-3.8 2.1-8.6 0.8-10.8-2.9l-293-512.9-288.1 512.7c-1.5 2.6-4.2 4-6.9 4z" fill="#0276F7" p-id="4332"></path><path d="M509.8 752.4c-4.4 0-7.9-3.5-7.9-7.9V86.7c0-4.4 3.5-7.9 7.9-7.9s7.9 3.5 7.9 7.9v657.9c0 4.3-3.6 7.8-7.9 7.8z" fill="#0276F7" p-id="4333"></path><path d="M509.8 729c-1.4 0-2.7-0.4-3.9-1L228.2 569c-3.8-2.2-5.1-7-2.9-10.8 2.2-3.8 7-5.1 10.8-2.9L509.8 712l277.3-157.7c3.8-2.2 8.6-0.8 10.8 3 2.2 3.8 0.8 8.6-3 10.8L513.7 728c-1.2 0.7-2.6 1-3.9 1z" fill="#0276F7" p-id="4334"></path><path d="M509.8 578.9c-1.4 0-2.7-0.4-4-1.1l-213-124c-3.8-2.2-5-7-2.9-10.8 2.2-3.8 7-5.1 10.8-2.8l209.1 121.7 212.8-120.5c3.8-2.2 8.6-0.8 10.8 3 2.2 3.8 0.8 8.6-3 10.7L513.7 577.9c-1.2 0.7-2.6 1-3.9 1zM507.2 423.5c-1.3 0-2.5-0.3-3.7-0.9L354.9 344c-3.9-2.1-5.3-6.8-3.3-10.7 2-3.9 6.8-5.3 10.7-3.3l145 76.7 150.8-78.8c3.9-2 8.6-0.5 10.7 3.3 2 3.9 0.5 8.6-3.3 10.7L511 422.6c-1.3 0.6-2.5 0.9-3.8 0.9zM509.8 277c-1.3 0-2.6-0.3-3.7-0.9l-86.8-46.8c-3.8-2.1-5.3-6.9-3.2-10.7 2.1-3.9 6.9-5.2 10.7-3.2l83 44.8 82.6-46.9c3.8-2.2 8.6-0.8 10.8 3 2.2 3.8 0.8 8.6-3 10.8l-86.4 49c-1.3 0.6-2.7 0.9-4 0.9z" fill="#0276F7" p-id="4335"></path><path d="M509.8 578.9h-0.3L231.9 570c-4.4-0.1-7.8-3.8-7.6-8.1 0.1-4.4 4.3-7.6 8.1-7.6l277.7 8.9c4.4 0.1 7.8 3.8 7.6 8.1-0.2 4.2-3.7 7.6-7.9 7.6zM509.8 729c-1.7 0-3.4-0.6-4.9-1.7-3.4-2.7-4-7.7-1.3-11.1l216.7-272.9c2.7-3.4 7.7-4 11.1-1.3 3.4 2.7 4 7.7 1.3 11.1L516 726c-1.6 2-3.9 3-6.2 3z" fill="#0276F7" p-id="4336"></path><path d="M509.8 578.9c-1.5 0-2.9-0.4-4.3-1.2-3.7-2.4-4.7-7.2-2.4-10.9l152-236.1c2.4-3.7 7.3-4.7 10.9-2.4 3.7 2.4 4.7 7.2 2.4 10.9l-152 236.1c-1.5 2.3-4 3.6-6.6 3.6zM507.2 423.5c-1.1 0-2.2-0.2-3.3-0.7-4-1.8-5.7-6.5-3.9-10.5l89-195.5c1.8-4 6.4-5.7 10.5-3.9 4 1.8 5.7 6.5 3.9 10.5l-88.9 195.5c-1.4 2.9-4.3 4.6-7.3 4.6z" fill="#0276F7" p-id="4337"></path><path d="M596.2 377c-2.9 0-5.7-1.6-7.1-4.4-1.9-3.9-0.3-8.6 3.6-10.5L729 295.7 343.3 120l22 205.3 141.3-63.4c3.9-1.8 8.6 0 10.4 4 1.8 4 0 8.6-4 10.4l-151.2 67.9c-2.3 1-4.9 0.9-7.2-0.4-2.2-1.3-3.6-3.5-3.9-6l-24.6-229.9c-0.3-2.8 0.9-5.6 3.2-7.2 2.3-1.6 5.3-2 7.9-0.8l413.6 188.4c2.8 1.3 4.6 4 4.6 7.1 0 3.1-1.7 5.9-4.4 7.2l-151.4 73.6c-1.1 0.6-2.3 0.8-3.4 0.8zM296.8 454.9c-3.8 0-7.2-2.8-7.8-6.7-0.6-4.3 2.3-8.3 6.6-9l210.5-31.4c4.3-0.6 8.3 2.3 9 6.6 0.6 4.3-2.3 8.3-6.6 9L298 454.8c-0.5 0.1-0.9 0.1-1.2 0.1z" fill="#0276F7" p-id="4338"></path></svg>

After

Width:  |  Height:  |  Size: 3.6 KiB

1
public/svg/cloud.svg Normal file
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="1702978716365" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="4633" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><path d="M817.3 505c2.7-14 4.3-28.4 4.3-43.2 0-123.8-100.4-224.2-224.2-224.2-81.9 0-153.3 44.1-192.5 109.7-15.1-5.9-31.5-9.2-48.7-9.2-72.6 0-131.6 57.6-134.3 129.5-69 18.6-119.9 81.5-119.9 156.5 0 89.6 72.7 162.3 162.3 162.3h514.3c79.2 0 143.4-64.2 143.4-143.4 0-65.8-44.3-121-104.7-138z" fill="#D4E4FC" p-id="4634"></path><path d="M778.6 793.2H264.3C171 793.2 95.2 717.3 95.2 624c0-74.5 49.2-140.3 120.2-161.8 5.3-73.9 66.2-131.1 140.9-131.1 15.6 0 30.9 2.6 45.8 7.7 42.7-67.8 115.3-108.1 195.4-108.1 127.4 0 231 103.6 231 231 0 12.7-1.1 25.6-3.3 38.4 61.3 20 103.6 77.8 103.6 142.7 0 83-67.4 150.4-150.2 150.4zM356.3 344.9c-68.9 0-124.9 54-127.4 122.9l-0.2 5.1-4.9 1.3c-67.6 18.3-114.9 79.9-114.9 149.9 0 85.7 69.7 155.4 155.4 155.4h514.3c75.3 0 136.5-61.2 136.5-136.5 0-60.9-41-114.9-99.6-131.3l-6.1-1.7 1.2-6.2c2.7-14 4.1-28.1 4.1-41.9 0-119.8-97.5-217.3-217.3-217.3-77.1 0-146.9 39.7-186.6 106.3l-3 5-5.4-2.1c-14.9-5.9-30.4-8.9-46.1-8.9z" fill="#0276F7" p-id="4635"></path></svg>

After

Width:  |  Height:  |  Size: 1.3 KiB

1
public/svg/service.svg Normal file
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="1702974353127" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="4174" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><path d="M470.9 954.6c-1.2 0-2.3-0.3-3.4-0.9l-240-132.2c-2.2-1.2-3.6-3.6-3.6-6.1V270.6c0-2.5 1.3-4.7 3.4-6L546.9 70.4c1.1-0.7 2.4-1 3.6-1 1.2 0 2.4 0.3 3.4 0.9l242.6 136.9c2.2 1.2 3.6 3.6 3.6 6.1v552.8c0 2.5-1.4 4.9-3.6 6.1L474.4 953.7c-1.1 0.6-2.3 0.9-3.5 0.9z" fill="#B5D6FB" p-id="4175"></path><path d="M550.5 76.4l242.6 136.9v552.8L470.9 947.6l-240-132.2V270.6L550.5 76.4m0-14c-2.5 0-5 0.7-7.3 2L223.6 258.6c-4.2 2.5-6.7 7.1-6.7 12v544.8c0 5.1 2.8 9.8 7.3 12.3l240 132.2c2.1 1.2 4.4 1.7 6.8 1.7 2.4 0 4.7-0.6 6.9-1.8L800 778.3c4.4-2.5 7.1-7.2 7.1-12.2V213.3c0-5.1-2.7-9.7-7.1-12.2L557.4 64.2c-2.1-1.2-4.5-1.8-6.9-1.8z" fill="#0276F7" p-id="4176"></path><path d="M550.5 76.4L230.9 270.6l240 130.5 322.2-187.8z" fill="#FFFFFF" p-id="4177"></path><path d="M470.9 916V401.1" fill="#B5D6FB" p-id="4178"></path><path d="M470.9 923.1c-3.9 0-7-3.1-7-7v-515c0-3.9 3.1-7 7-7s7 3.1 7 7V916c0 3.9-3.1 7.1-7 7.1z" fill="#0276F7" p-id="4179"></path><path d="M754.5 235.8L470.9 401.1" fill="#B5D6FB" p-id="4180"></path><path d="M470.9 408.1c-2.4 0-4.8-1.2-6.1-3.5-1.9-3.3-0.8-7.6 2.5-9.6L751 229.7c3.4-2 7.6-0.8 9.6 2.5 1.9 3.3 0.8 7.6-2.5 9.6L474.5 407.2c-1.1 0.6-2.4 0.9-3.6 0.9z" fill="#0276F7" p-id="4181"></path><path d="M261.5 287.2l209.4 113.9" fill="#B5D6FB" p-id="4182"></path><path d="M470.9 408.1c-1.1 0-2.3-0.3-3.3-0.8L258.1 293.4c-3.4-1.8-4.7-6.1-2.8-9.5 1.9-3.4 6.1-4.6 9.5-2.8L474.3 395c3.4 1.8 4.7 6.1 2.8 9.5-1.3 2.3-3.7 3.6-6.2 3.6z" fill="#0276F7" p-id="4183"></path><path d="M258.2 744.4l177.2 99.3" fill="#B5D6FB" p-id="4184"></path><path d="M435.4 850.7c-1.2 0-2.3-0.3-3.4-0.9l-177.1-99.3c-3.4-1.9-4.6-6.2-2.7-9.5 1.9-3.4 6.1-4.6 9.5-2.7l177.1 99.3c3.4 1.9 4.6 6.2 2.7 9.5-1.3 2.3-3.7 3.6-6.1 3.6z" fill="#0276F7" p-id="4185"></path><path d="M258.2 694.8l177.2 99.3" fill="#B5D6FB" p-id="4186"></path><path d="M435.4 801.1c-1.2 0-2.3-0.3-3.4-0.9l-177.1-99.3c-3.4-1.9-4.6-6.2-2.7-9.5 1.9-3.4 6.1-4.6 9.5-2.7L438.8 788c3.4 1.9 4.6 6.2 2.7 9.5-1.3 2.3-3.7 3.6-6.1 3.6z" fill="#0276F7" p-id="4187"></path><path d="M258.2 645.1l177.2 99.3" fill="#B5D6FB" p-id="4188"></path><path d="M435.4 751.4c-1.2 0-2.3-0.3-3.4-0.9l-177.1-99.3c-3.4-1.9-4.6-6.2-2.7-9.5 1.9-3.4 6.1-4.6 9.5-2.7l177.1 99.3c3.4 1.9 4.6 6.2 2.7 9.5-1.3 2.3-3.7 3.6-6.1 3.6z" fill="#0276F7" p-id="4189"></path><path d="M222.7 538.9l248.2 135.5" fill="#B5D6FB" p-id="4190"></path><path d="M219.335 545.028l6.708-12.289 248.241 135.49-6.707 12.289z" fill="#0276F7" p-id="4191"></path><path d="M393 430.7l40.3 20.1" fill="#B5D6FB" p-id="4192"></path><path d="M433.3 457.8c-1.1 0-2.1-0.2-3.1-0.7L389.9 437c-3.5-1.7-4.9-5.9-3.1-9.4 1.7-3.5 6-4.9 9.4-3.1l40.3 20.1c3.5 1.7 4.9 5.9 3.1 9.4-1.3 2.4-3.8 3.8-6.3 3.8z" fill="#0276F7" p-id="4193"></path></svg>

After

Width:  |  Height:  |  Size: 3.0 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 6.1 KiB

View File

@@ -86,4 +86,57 @@ body .ant-pro-basicLayout {
opacity: 0;
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;
}
/** ==== 表格头按钮区域 S === **/
/* 默认 */
.button-container {
display: flex;
flex-wrap: wrap;
justify-content: flex-start;
align-items: center;
}
.button-container > button,
.button-container > span {
margin-right: 12px;
margin-bottom: 12px;
}
.button-container > button:last-child,
.button-container > span:last-child {
margin-right: 0;
}
/* 平板端 */
@media (max-width: 992px) {
.button-container {
flex-direction: row;
align-items: flex-start;
align-items: left;
}
.button-container > button,
.button-container > span {
margin-right: 12px;
margin-bottom: 12px;
}
}
/* 手机端 */
@media (max-width: 576px) {
.button-container {
flex-direction: column;
align-items: flex-start;
align-items: left;
}
.button-container > button,
.button-container > span {
margin-right: 0px;
margin-bottom: 12px;
}
}
/** ==== 表格头按钮区域 E === **/
</style>

View File

@@ -3,7 +3,7 @@ import {
RESULT_CODE_SUCCESS,
RESULT_MSG_ERROR,
} from '@/constants/result-constants';
import { request } from '@/plugins/http-fetch';
import { language, request } from '@/plugins/http-fetch';
import { parseObjLineToHump } from '@/utils/parse-utils';
/**
@@ -48,7 +48,7 @@ export async function updateConfig(tag: string, data: Record<string, any>) {
delete result.data;
return result;
} else {
return { code: RESULT_CODE_ERROR, msg: RESULT_MSG_ERROR };
return { code: RESULT_CODE_ERROR, msg: RESULT_MSG_ERROR[language] };
}
}
return result;

View File

@@ -4,8 +4,8 @@ import {
RESULT_MSG_ERROR,
RESULT_MSG_SUCCESS,
} from '@/constants/result-constants';
import { request } from '@/plugins/http-fetch';
import { parseFirstLower, parseObjLineToHump } from '@/utils/parse-utils';
import { language, request } from '@/plugins/http-fetch';
import { parseObjLineToHump } from '@/utils/parse-utils';
/**
* 查询配置参数标签栏
@@ -57,6 +57,7 @@ async function getParamConfigInfo(
params: {
SQL: `SELECT param_json FROM param_config WHERE ne_type = '${neType}' AND top_tag='${topTag}'`,
},
timeout: 1_000,
}),
// 获取对应信息
request({
@@ -65,6 +66,7 @@ async function getParamConfigInfo(
params: {
ne_id: neId,
},
timeout: 1_000,
}),
]).then(resArr => {
let wrRule: Record<string, any> = {};
@@ -333,7 +335,7 @@ export async function getParamConfigInfoForm(
result.data.data = dataArray;
// 无数据时,用于新增
result.data.dataRule = { title: `Index-0`, key: 0, record : [ruleArr]} ;
result.data.dataRule = { title: `Index-0`, key: 0, record: ruleArr };
}
return result;
}
@@ -455,7 +457,7 @@ export async function updateNeConfigReload(neType: string, neId: string) {
} else if (str.indexOf('success') !== -1) {
delete result.data;
} else {
return { code: RESULT_CODE_ERROR, msg: RESULT_MSG_ERROR };
return { code: RESULT_CODE_ERROR, msg: RESULT_MSG_ERROR[language] };
}
}
return result;

View File

@@ -8,8 +8,26 @@ import { parseObjLineToHump } from '@/utils/parse-utils';
* @returns object
*/
export async function listNeInfo(query: Record<string, any>) {
let totalSQL = 'select count(*) as total from ne_info where status=0 ';
let rowsSQL = 'select * from ne_info where status=0 ';
let totalSQL = 'select count(*) as total from ne_info where (status=0 or status=3)';
let rowsSQL = 'select * from ne_info where (status=0 or status=3) ';
// 系统特定顺序
const specificOrder = [
'OMC',
'MME',
'AMF',
'AUSF',
'UDM',
'SMF',
'PCF',
'UPF',
'NRF',
'NSSF',
'IMS',
'N3IWF',
'NEF',
'LMF',
];
// 查询
let querySQL = '';
@@ -46,6 +64,14 @@ export async function listNeInfo(query: Record<string, any>) {
data.total = itemData[0]['total'];
} else {
data.rows = itemData.map(v => parseObjLineToHump(v));
//通过sort进行冒泡排序
data.rows.sort((a: any, b: any) => {
const typeA = specificOrder.indexOf(a.neType);
const typeB = specificOrder.indexOf(b.neType);
if (typeA === -1) return 1; // 如果不在特定顺序中,排到后面
if (typeB === -1) return -1; // 如果不在特定顺序中,排到后面
return typeA - typeB;
});
}
}
});
@@ -65,7 +91,7 @@ export async function getNeInfo(id: string | number) {
url: `/api/rest/databaseManagement/v1/select/omc_db/ne_info`,
method: 'get',
params: {
SQL: `select * from ne_info where status=0 and id = ${id}`,
SQL: `select * from ne_info where (status=0 or status=3) and id = ${id}`,
},
});
// 解析数据
@@ -86,7 +112,7 @@ export async function getNeInfo(id: string | number) {
export function addNeInfo(data: Record<string, any>) {
data.port = `${data.port}`;
return request({
url: `/api/rest/systemManagement/v1/elementType/${data.neType}/objectType/neInfo`,
url: `/api/rest/systemManagement/v1/elementType/${data.neType.toLowerCase()}/objectType/neInfo?sync2ne=${data.sync}`,
method: 'post',
data: data,
});
@@ -100,7 +126,7 @@ export function addNeInfo(data: Record<string, any>) {
export function updateNeInfo(data: Record<string, any>) {
data.port = `${data.port}`;
return request({
url: `/api/rest/systemManagement/v1/elementType/${data.neType}/objectType/neInfo`,
url: `/api/rest/systemManagement/v1/elementType/${data.neType}/objectType/neInfo?sync2ne=${data.sync}`,
method: 'put',
data: data,
});
@@ -115,6 +141,7 @@ export async function delNeInfo(data: Record<string, any>) {
return request({
url: `/api/rest/systemManagement/v1/elementType/${data.neType}/objectType/neInfo?ne_id=${data.neId}`,
method: 'delete',
timeout:60*1000,
});
}
@@ -123,6 +150,23 @@ export async function delNeInfo(data: Record<string, any>) {
* @returns object
*/
export async function getNelistAll() {
// 系统特定顺序
const specificOrder = [
'OMC',
'MME',
'AMF',
'AUSF',
'UDM',
'SMF',
'PCF',
'UPF',
'NRF',
'NSSF',
'IMS',
'N3IWF',
'NEF',
'LMF',
];
// 发起请求
const result = await request({
url: `/api/rest/databaseManagement/v1/elementType/omc_db/objectType/ne_info`,
@@ -134,6 +178,14 @@ export async function getNelistAll() {
// 解析数据
if (result.code === RESULT_CODE_SUCCESS && Array.isArray(result.data.data)) {
let data = result.data.data[0];
//通过sort进行冒泡排序
data['ne_info'].sort((a: any, b: any) => {
const typeA = specificOrder.indexOf(a.ne_type);
const typeB = specificOrder.indexOf(b.ne_type);
if (typeA === -1) return 1;
if (typeB === -1) return -1;
return typeA - typeB;
});
return Object.assign(result, {
data: parseObjLineToHump(data['ne_info']),
});

View File

@@ -3,7 +3,7 @@ import {
RESULT_CODE_SUCCESS,
RESULT_MSG_ERROR,
} from '@/constants/result-constants';
import { request } from '@/plugins/http-fetch';
import { language, request } from '@/plugins/http-fetch';
import { parseObjLineToHump } from '@/utils/parse-utils';
/**
@@ -117,7 +117,7 @@ export async function sendNeSoftware(data: Record<string, any>) {
delete result.data;
return result;
}
return { code: RESULT_CODE_ERROR, msg: RESULT_MSG_ERROR };
return { code: RESULT_CODE_ERROR, msg: RESULT_MSG_ERROR[language] };
}
/**
@@ -136,7 +136,7 @@ export async function runNeSoftware(data: Record<string, any>) {
delete result.data;
return result;
}
return { code: RESULT_CODE_ERROR, msg: RESULT_MSG_ERROR };
return { code: RESULT_CODE_ERROR, msg: RESULT_MSG_ERROR[language] };
}
/**
@@ -155,7 +155,7 @@ export async function backNeSoftware(data: Record<string, any>) {
delete result.data;
return result;
}
return { code: RESULT_CODE_ERROR, msg: RESULT_MSG_ERROR };
return { code: RESULT_CODE_ERROR, msg: RESULT_MSG_ERROR[language] };
}
/**

View File

@@ -169,7 +169,7 @@ export function showPass(data: Record<string, any>) {
let querySQL = '';
querySQL += data.alarm_code ? ` and alarm_code != ${data.alarm_code} ` : '';
querySQL += data.alarm_type
? ` and alarm_type !=\\' ${data.alarm_type} \\'`
? ` and alarm_type !=\\'${data.alarm_type}\\'`
: '';
querySQL += data.pv_flag ? ` and pv_flag !=\\'${data.pv_flag} \\'` : '';
querySQL += data.orig_severity

View File

@@ -4,7 +4,7 @@ import {
RESULT_MSG_ERROR,
RESULT_MSG_SUCCESS,
} from '@/constants/result-constants';
import { request } from '@/plugins/http-fetch';
import { language, request } from '@/plugins/http-fetch';
import { parseObjLineToHump } from '@/utils/parse-utils';
/**
@@ -63,7 +63,7 @@ export async function getAlarmSet() {
}
}
if (Object.keys(resultData).length === 0) {
return { code: RESULT_CODE_ERROR, msg: RESULT_MSG_ERROR, data: {} };
return { code: RESULT_CODE_ERROR, msg: RESULT_MSG_ERROR[language], data: {} };
}
return {
code: RESULT_CODE_SUCCESS,
@@ -117,7 +117,7 @@ export async function updateAlarmSet(data: Record<string, any>) {
}
// 无变更时
if (resultNum === 0) {
return { code: RESULT_CODE_ERROR, msg: RESULT_MSG_ERROR, data: 0 };
return { code: RESULT_CODE_ERROR, msg: RESULT_MSG_ERROR[language], data: 0 };
}
return {
code: RESULT_CODE_SUCCESS,
@@ -183,7 +183,7 @@ export async function updateForwardSet(data: Record<string, any>) {
delete result.data;
return result;
} else {
return { code: RESULT_CODE_ERROR, msg: RESULT_MSG_ERROR };
return { code: RESULT_CODE_ERROR, msg: RESULT_MSG_ERROR[language] };
}
}
return result;

View File

@@ -7,6 +7,23 @@ import { parseDateToStr } from '@/utils/date-utils';
* @returns object
*/
export async function listMain() {
// 系统特定顺序
const specificOrder = [
'OMC',
'MME',
'AMF',
'AUSF',
'UDM',
'SMF',
'PCF',
'UPF',
'NRF',
'NSSF',
'IMS',
'N3IWF',
'NEF',
'LMF',
];
const result = await request({
url: '/api/rest/systemManagement/v1/elementType/all/objectType/systemState',
method: 'get',
@@ -19,6 +36,10 @@ export async function listMain() {
const [key, value] = Object.entries(obj)[0];
const ipAddress = (value as any).ipAddress;
const systemState = (value as any).systemState;
const serialNum = (value as any).serialNum;
const version = (value as any).version;
const errCode = systemState && systemState['errorCode'];
var time = new Date();
// console.log(key, value);
@@ -33,9 +54,10 @@ export async function listMain() {
};
} else {
mergedObj = {
version: '-',
version,
refresh: parseDateToStr(time),
ipAddress: ipAddress,
ipAddress,
serialNum,
name: key.split('/').join('_'),
status: 'Abnormal',
};
@@ -43,8 +65,16 @@ export async function listMain() {
return mergedObj;
});
// console.log(mergedData);
// console.log(rowArr)
//通过sort进行冒泡排序
mergedData.sort((a: any, b: any) => {
const typeA = specificOrder.indexOf(a.name.split('_')[0]);
const typeB = specificOrder.indexOf(b.name.split('_')[0]);
if (typeA === -1) return 1; // 如果不在特定顺序中,排到后面
if (typeB === -1) return -1; // 如果不在特定顺序中,排到后面
return typeA - typeB;
});
//console.log(mergedData);
return mergedData;
}

View File

@@ -4,7 +4,7 @@ import {
RESULT_MSG_ERROR,
RESULT_MSG_SUCCESS,
} from '@/constants/result-constants';
import { request } from '@/plugins/http-fetch';
import { language, request } from '@/plugins/http-fetch';
import { parseObjLineToHump } from '@/utils/parse-utils';
/**
@@ -53,7 +53,7 @@ export async function getLogSet() {
}
}
if (Object.keys(resultData).length === 0) {
return { code: RESULT_CODE_ERROR, msg: RESULT_MSG_ERROR, data: {} };
return { code: RESULT_CODE_ERROR, msg: RESULT_MSG_ERROR[language], data: {} };
}
return {
@@ -100,7 +100,7 @@ export async function updateLogSet(data: Record<string, any>) {
}
// 无变更时
if (resultNum === 0) {
return { code: RESULT_CODE_ERROR, msg: RESULT_MSG_ERROR, data: 0 };
return { code: RESULT_CODE_ERROR, msg: RESULT_MSG_ERROR[language], data: 0 };
}
return {
code: RESULT_CODE_SUCCESS,
@@ -161,7 +161,7 @@ export async function updateFtpLogSet(data: Record<string, any>) {
delete result.data;
return result;
} else {
return { code: RESULT_CODE_ERROR, msg: RESULT_MSG_ERROR };
return { code: RESULT_CODE_ERROR, msg: RESULT_MSG_ERROR[language] };
}
}
return result;
@@ -216,7 +216,7 @@ export async function updateRemoteOut(data: Record<string, any>) {
delete result.data;
return result;
} else {
return { code: RESULT_CODE_ERROR, msg: RESULT_MSG_ERROR };
return { code: RESULT_CODE_ERROR, msg: RESULT_MSG_ERROR[language] };
}
}
return result;
@@ -249,7 +249,7 @@ export async function exportLog(query: Record<string, any>) {
order begin_time,end_time`;
}
if (!querySQL) {
return { code: RESULT_CODE_ERROR, msg: RESULT_MSG_ERROR };
return { code: RESULT_CODE_ERROR, msg: RESULT_MSG_ERROR[language], data: [] };
}
// 发起请求
const result = await request({
@@ -286,7 +286,7 @@ export async function backupLog(logType: string) {
result.data = v;
return result;
} else {
return { code: RESULT_CODE_ERROR, msg: RESULT_MSG_ERROR };
return { code: RESULT_CODE_ERROR, msg: RESULT_MSG_ERROR[language], data: 0 };
}
}
return result;

View File

@@ -3,7 +3,7 @@ import {
RESULT_CODE_SUCCESS,
RESULT_MSG_ERROR,
} from '@/constants/result-constants';
import { request } from '@/plugins/http-fetch';
import { language, request } from '@/plugins/http-fetch';
import { parseObjLineToHump } from '@/utils/parse-utils';
/**
@@ -55,7 +55,7 @@ export async function updateOperationSet(data: Record<string, any>) {
delete result.data;
return result;
} else {
return { code: RESULT_CODE_ERROR, msg: RESULT_MSG_ERROR };
return { code: RESULT_CODE_ERROR, msg: RESULT_MSG_ERROR[language] };
}
}
return result;

View File

@@ -13,7 +13,7 @@ export async function getMMLByNE(neType: string) {
url: `/api/rest/databaseManagement/v1/elementType/omc_db/objectType/mml_system`,
method: 'get',
params: {
SQL: `select * from mml_system where ne_type = '${neType}'`,
SQL: `select * from mml_system where ne_type = '${neType}' and status = 'Active'`,
},
});
// 解析数据
@@ -36,18 +36,18 @@ export async function getMMLByNE(neType: string) {
export async function sendMMlByNE(
neType: string,
neId: string,
cmdStr: string
cmdArr: string[]
) {
// 发起请求
const result = await request({
url: `/api/rest/operationManagement/v1/elementType/${neType}/objectType/mml?ne_id=${neId}`,
method: 'post',
data: { mml: [cmdStr] },
data: { mml: cmdArr },
timeout: 180_000,
});
// 解析数据
if (result.code === RESULT_CODE_SUCCESS && Array.isArray(result.data.data)) {
result.data = result.data.data[0];
result.data = result.data.data;
}
return result;
}

View File

@@ -12,7 +12,7 @@ export async function getMMLByOMC() {
url: `/api/rest/databaseManagement/v1/elementType/omc_db/objectType/mml_command`,
method: 'get',
params: {
SQL: `select * from mml_command where ne_type = 'OMC'`,
SQL: `select * from mml_command where ne_type = 'OMC' and status = 'Active'`,
},
});
// 解析数据
@@ -31,17 +31,17 @@ export async function getMMLByOMC() {
* @param cmdStr 命令串
* @returns
*/
export async function sendMMlByOMC(neId: string, cmdStr: string) {
export async function sendMMlByOMC(neId: string, cmdArr: string[]) {
// 发起请求
const result = await request({
url: `/api/rest/operationManagement/v1/elementType/OMC/objectType/mml?ne_id=${neId}`,
method: 'post',
data: { mml: [cmdStr] },
data: { mml: cmdArr },
timeout: 180_000,
});
// 解析数据
if (result.code === RESULT_CODE_SUCCESS && Array.isArray(result.data.data)) {
result.data = result.data.data[0];
result.data = result.data.data;
}
return result;
}

View File

@@ -12,7 +12,7 @@ export async function getMMLByUDM() {
url: `/api/rest/databaseManagement/v1/elementType/omc_db/objectType/mml_subscriber`,
method: 'get',
params: {
SQL: `select * from mml_subscriber where ne_type = 'UDM'`,
SQL: `select * from mml_subscriber where ne_type = 'UDM' and status = 'Active'`,
},
});
// 解析数据
@@ -31,17 +31,17 @@ export async function getMMLByUDM() {
* @param cmdStr 命令串
* @returns
*/
export async function sendMMlByUDM(neId: string, cmdStr: string) {
export async function sendMMlByUDM(neId: string, cmdArr: string[]) {
// 发起请求
const result = await request({
url: `/api/rest/operationManagement/v1/elementType/UDM/objectType/mml?ne_id=${neId}`,
method: 'post',
data: { mml: [cmdStr] },
data: { mml: cmdArr },
timeout: 180_000,
});
// 解析数据
if (result.code === RESULT_CODE_SUCCESS && Array.isArray(result.data.data)) {
result.data = result.data.data[0];
result.data = result.data.data;
}
return result;
}

View File

@@ -3,7 +3,7 @@ import {
RESULT_CODE_SUCCESS,
RESULT_MSG_ERROR,
} from '@/constants/result-constants';
import { request } from '@/plugins/http-fetch';
import { language, request } from '@/plugins/http-fetch';
import { parseObjLineToHump } from '@/utils/parse-utils';
/**
@@ -86,7 +86,7 @@ export async function logoutSession(id: string) {
delete result.data;
return result;
} else {
return { code: RESULT_CODE_ERROR, msg: RESULT_MSG_ERROR };
return { code: RESULT_CODE_ERROR, msg: RESULT_MSG_ERROR[language] };
}
}
return result;

29
src/api/ne/ne.ts Normal file
View File

@@ -0,0 +1,29 @@
import { request } from '@/plugins/http-fetch';
/**
* 查询网元列表
* @param query 查询参数
* @returns object
*/
export function listNe(query: Record<string, any>) {
return request({
url: '/ne/list',
method: 'get',
params: query,
timeout: 60_000,
});
}
/**
* 查询网元状态
* @param neType 网元类型
* @param neId 网元ID
* @returns object
*/
export function stateNe(neType: string, neId: string) {
return request({
url: '/ne/state',
method: 'get',
params: { neType, neId },
});
}

View File

@@ -7,7 +7,7 @@ import { request } from '@/plugins/http-fetch';
*/
export function exportAuth(query: Record<string, any>) {
return request({
url: '/api/rest/udmUserManage/v1/authExport',
url: '/ne/udm/auth/export',
method: 'post',
data: query,
responseType: 'blob',
@@ -20,9 +20,9 @@ export function exportAuth(query: Record<string, any>) {
* @param data 表单数据对象
* @returns object
*/
export function importAuthData(neId: string, data: FormData) {
export function importAuthData(data: FormData) {
return request({
url: `/api/rest/udmUserManage/v1/authImport/${neId}`,
url: `/ne/udm/auth/import`,
method: 'post',
data,
dataType: 'form-data',
@@ -36,7 +36,7 @@ export function importAuthData(neId: string, data: FormData) {
*/
export function listAuth(query: Record<string, any>) {
return request({
url: '/api/rest/udmUserManage/v1/auths',
url: '/ne/udm/auth/list',
method: 'get',
params: query,
});
@@ -49,8 +49,8 @@ export function listAuth(query: Record<string, any>) {
*/
export function loadAuth(neId: string) {
return request({
url: `/api/rest/udmUserManage/v1/authSave/${neId}`,
method: 'post',
url: `/ne/udm/auth/resetData/${neId}`,
method: 'put',
timeout: 180_000,
});
}
@@ -62,7 +62,7 @@ export function loadAuth(neId: string) {
*/
export function getAuth(neId: string, imsi: string) {
return request({
url: `/api/rest/udmUserManage/v1/auth/${neId}/${imsi}`,
url: `/ne/udm/auth/${neId}/${imsi}`,
method: 'get',
});
}
@@ -74,7 +74,7 @@ export function getAuth(neId: string, imsi: string) {
*/
export function updateAuth(data: Record<string, any>) {
return request({
url: `/api/rest/udmUserManage/v1/auth/${data.neId}`,
url: `/ne/udm/auth/${data.neId}`,
method: 'put',
data: data,
});
@@ -87,7 +87,7 @@ export function updateAuth(data: Record<string, any>) {
*/
export function addAuth(data: Record<string, any>) {
return request({
url: `/api/rest/udmUserManage/v1/auth/${data.neId}`,
url: `/ne/udm/auth/${data.neId}`,
method: 'post',
data: data,
});
@@ -98,9 +98,9 @@ export function addAuth(data: Record<string, any>) {
* @param data 鉴权对象
* @returns object
*/
export function batchAuth( data: Record<string, any>) {
export function batchAuth(data: Record<string, any>) {
return request({
url: `/api/rest/udmUserManage/v1/auth/${data.neID}/${data.num}`,
url: `/ne/udm/auth/${data.neID}/${data.num}`,
method: 'post',
data: data,
});
@@ -111,15 +111,13 @@ export function batchAuth( data: Record<string, any>) {
* @param data 鉴权对象
* @returns object
*/
export function delAuth(neId: string, data: Record<string, any>) {
export function delAuth(neId: string, imsi: string) {
return request({
url: `/api/rest/udmUserManage/v1/auth/${neId}/${data.imsi}`,
url: `/ne/udm/auth/${neId}/${imsi}`,
method: 'delete',
});
}
/**
* 批量删除鉴权
* @param data 鉴权对象
@@ -127,7 +125,7 @@ export function delAuth(neId: string, data: Record<string, any>) {
*/
export function batchDelAuth(data: Record<string, any>) {
return request({
url: `/api/rest/udmUserManage/v1/auth/${data.neID}/${data.imsi}/${data.num}`,
url: `/ne/udm/auth/${data.neID}/${data.imsi}/${data.num}`,
method: 'delete',
});
}

View File

@@ -26,5 +26,8 @@ export async function listBase5G(query: Record<string, any>) {
data.total = rows.length;
data.rows = rows;
}
// 模拟数据
// data.rows =[{"address":"192.168.1.137:38412","id":"217","name":"","ueNum":0}]
return data;
}

View File

@@ -26,5 +26,17 @@ export async function listIMS(query: Record<string, any>) {
data.total = rows.length;
data.rows = rows;
}
// 测试数据
// data.rows = [
// {
// activeTime: '2023-11-29 17:04:54',
// barring: 0,
// impu: 'sip:12307551232@ims.mnc000.mcc460.3gppnetwork.org',
// imsi: '460001230000002',
// msisdn: '12307551232',
// regState: 1,
// },
// ];
return data;
}

39
src/api/neUser/n3iwf.ts Normal file
View File

@@ -0,0 +1,39 @@
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 listN3iwf(query: Record<string, any>) {
const result = await request({
url: '/api/rest/ueManagement/v1/elementType/n3iwf/objectType/ueInfo',
method: 'get',
params: query,
});
let data: DataList = {
total: 0,
rows: [],
code: result.code,
msg: result.msg,
};
// 解析数据
if (result.code === RESULT_CODE_SUCCESS && Array.isArray(result.data.data)) {
const rows = parseObjLineToHump(result.data.data);
data.total = rows.length;
data.rows = rows;
}
// 模拟数据
// data.rows = [
// {
// "activeTime": "2023-11-29 06:35:43",
// "imsi": "460302072701181",
// "nai": "0460302072701181@nai.epc.mnc030.mcc460.3gppnetwork.org",
// "regState": 1
// }
// ]
return data;
}

217
src/api/neUser/pcf.ts Normal file
View File

@@ -0,0 +1,217 @@
import {
RESULT_CODE_ERROR,
RESULT_CODE_SUCCESS,
} from '@/constants/result-constants';
import { request } from '@/plugins/http-fetch';
import { parseObjLineToHump } from '@/utils/parse-utils';
/**
* 规则导出
* @param data 表单数据对象
* @returns bolb
*/
export function exportRule(data: Record<string, any>) {
return request({
url: `/api/rest/ueManagement/v1/elementType/pcf/objectType/ueInfo/file/export`,
method: 'get',
params: data,
responseType: 'blob',
timeout: 180_000,
});
}
/**
* 导入规则数据
* @param data 表单数据对象
* @returns object
*/
export function importRuleData(data: Record<string, any>) {
return request({
url: `/api/rest/ueManagement/v1/elementType/pcf/objectType/ueInfo/file/import?neId=${data.neId}&filePath=${data.filePath}&fileType=${data.fileType}`,
method: 'put',
data,
timeout: 60_000,
});
}
/**
* 查询规则列表
* @param query 查询参数
* @returns object
*/
export async function listRules(query: Record<string, any>) {
const result = await request({
url: '/api/rest/ueManagement/v1/elementType/pcf/objectType/ueInfo',
method: 'get',
params: query,
});
let data: DataList = {
total: 0,
rows: [],
code: result.code,
msg: result.msg,
};
// 解析数据
if (result.code === RESULT_CODE_SUCCESS) {
if (result.data?.status) {
return {
code: RESULT_CODE_ERROR,
msg: result.data?.cause,
rows: result.data,
};
}
if (Array.isArray(result.data.data)) {
const rows = parseObjLineToHump(result.data.data);
data.total = rows.length;
data.rows = rows;
}
}
// 模拟数据
// data.rows = [
// {
// "hdrEnrich": "dnn",
// "imsi": "160990100000003",
// "msisdn": "86755900011",
// "pccRules": "internet|ims_sig",
// "qosAudio": "qos_audio",
// "qosVideo": "qos_video",
// "rfsp": 0,
// "sar": "def_sar",
// "sessRules": "internet|ims_sig",
// "uePolicy": "uep_001"
// }
// ]
return data;
}
/**
* 查询规则详细
* @param neId 网元ID
* @returns object
*/
export async function getRule(neId: string, imsi: string) {
const result = await request({
url: `/api/rest/ueManagement/v1/elementType/pcf/objectType/ueInfo?neId=${neId}&imsi=${imsi}`,
method: 'get',
});
// 解析数据
if (result.code === RESULT_CODE_SUCCESS && Array.isArray(result.data.data)) {
result.data = result.data.data[0];
}
return result;
}
/**
* 修改规则
* @param data 规则对象
* @returns object
*/
export async function updateRule(data: Record<string, any>) {
const result = await request({
url: `/api/rest/ueManagement/v1/elementType/pcf/objectType/ueInfo?neId=${data.neId}`,
method: 'put',
data: data,
});
// 解析数据
if (result.code === RESULT_CODE_SUCCESS && result.data?.status) {
return {
code: RESULT_CODE_ERROR,
msg: result.data?.cause,
data: result.data,
};
}
return result;
}
/**
* 批量修改规则
* @param data 规则对象
* @returns object
*/
export async function batchUpdateRule(data: Record<string, any>) {
const result = await request({
url: `/api/rest/ueManagement/v1/elementType/pcf/objectType/ueInfo/batch/${data.num}?neId=${data.neId}`,
method: 'put',
data: data,
});
// 解析数据
if (result.code === RESULT_CODE_SUCCESS && result.data?.status) {
return {
code: RESULT_CODE_ERROR,
msg: result.data?.cause,
data: result.data,
};
}
return result;
}
/**
* 新增规则
* @param data 规则对象
* @returns object
*/
export async function addRule(data: Record<string, any>) {
const result = await request({
url: `/api/rest/ueManagement/v1/elementType/pcf/objectType/ueInfo?neId=${data.neId}`,
method: 'post',
data: data,
});
// 解析数据
if (result.code === RESULT_CODE_SUCCESS && result.data?.status) {
return {
code: RESULT_CODE_ERROR,
msg: result.data?.cause,
data: result.data,
};
}
return result;
}
/**
* 批量新增规则
* @param data 规则对象
* @returns object
*/
export async function batchAddRule(data: Record<string, any>) {
const result = await request({
url: `/api/rest/ueManagement/v1/elementType/pcf/objectType/ueInfo/batch/${data.num}?neId=${data.neId}`,
method: 'post',
data: data,
});
// 解析数据
if (result.code === RESULT_CODE_SUCCESS && result.data?.status) {
return {
code: RESULT_CODE_ERROR,
msg: result.data?.cause,
data: result.data,
};
}
return result;
}
/**
* 删除规则
* @param data 规则对象
* @returns object
*/
export function delRule(neId: string, data: Record<string, any>) {
return request({
url: `/api/rest/ueManagement/v1/elementType/pcf/objectType/ueInfo?neId=${neId}&imsi=${data.imsi}`,
method: 'delete',
});
}
/**
* 批量删除规则
* @param data 规则对象
* @returns object
*/
export async function batchDelRule(data: Record<string, any>) {
return request({
url: `/api/rest/ueManagement/v1/elementType/pcf/objectType/ueInfo/batch/${data.num}?neId=${data.neId}&imsi=${data.imsi}`,
method: 'delete',
});
}

View File

@@ -7,7 +7,7 @@ import { request } from '@/plugins/http-fetch';
*/
export function exportSub(query: Record<string, any>) {
return request({
url: '/api/rest/udmUserManage/v1/subExport',
url: '/ne/udm/sub/export',
method: 'post',
data: query,
responseType: 'blob',
@@ -21,9 +21,9 @@ export function exportSub(query: Record<string, any>) {
* @param data 表单数据对象
* @returns object
*/
export function importSubData(neId: string, data: FormData) {
export function importSubData(data: FormData) {
return request({
url: `/api/rest/udmUserManage/v1/subImport/${neId}`,
url: `/ne/udm/sub/import`,
method: 'post',
data,
dataType: 'form-data',
@@ -38,8 +38,8 @@ export function importSubData(neId: string, data: FormData) {
*/
export function loadSub(neId: string) {
return request({
url: `/api/rest/udmUserManage/v1/subSave/${neId}`,
method: 'post',
url: `/ne/udm/sub/resetData/${neId}`,
method: 'put',
timeout: 180_000,
});
}
@@ -51,7 +51,7 @@ export function loadSub(neId: string) {
*/
export function listSub(query: Record<string, any>) {
return request({
url: '/api/rest/udmUserManage/v1/subs',
url: '/ne/udm/sub/list',
method: 'get',
params: query,
});
@@ -64,7 +64,7 @@ export function listSub(query: Record<string, any>) {
*/
export function getSub(neId: string, imsi: string) {
return request({
url: `/api/rest/udmUserManage/v1/subInfo/${neId}/${imsi}`,
url: `/ne/udm/sub/${neId}/${imsi}`,
method: 'get',
});
}
@@ -77,7 +77,7 @@ export function getSub(neId: string, imsi: string) {
*/
export function updateSub(neId: string, data: Record<string, any>) {
return request({
url: `/api/rest/udmUserManage/v1/sub/${neId}`,
url: `/ne/udm/sub/${neId}`,
method: 'put',
data: data,
});
@@ -90,7 +90,7 @@ export function updateSub(neId: string, data: Record<string, any>) {
*/
export function addSub(neID: string, data: Record<string, any>) {
return request({
url: `/api/rest/udmUserManage/v1/sub/${neID}`,
url: `/ne/udm/sub/${neID}`,
method: 'post',
data: data,
});
@@ -103,7 +103,7 @@ export function addSub(neID: string, data: Record<string, any>) {
*/
export function batchAddSub(data: Record<string, any>) {
return request({
url: `/api/rest/udmUserManage/v1/sub/${data.neID}/${data.num}`,
url: `/ne/udm/sub/${data.neID}/${data.num}`,
method: 'post',
data: data,
});
@@ -116,7 +116,7 @@ export function batchAddSub(data: Record<string, any>) {
*/
export function delSub(neId: string, imsi: string) {
return request({
url: `/api/rest/udmUserManage/v1/sub/${neId}/${imsi}`,
url: `/ne/udm/sub/${neId}/${imsi}`,
method: 'delete',
});
}
@@ -128,7 +128,7 @@ export function delSub(neId: string, imsi: string) {
*/
export function batchDelSub(data: Record<string, any>) {
return request({
url: `/api/rest/udmUserManage/v1/sub/${data.neID}/${data.imsi}/${data.num}`,
url: `/ne/udm/sub/${data.neID}/${data.imsi}/${data.num}`,
method: 'delete',
});
}

View File

@@ -26,5 +26,38 @@ export async function listUE(query: Record<string, any>) {
data.total = rows.length;
data.rows = rows;
}
// 模拟数据
// data.rows = [
// {
// imsi: 'imsi-460029004200044',
// msisdn: 'msisdn-12346002044',
// pduSessionInfo: [
// {
// activeTime: '2023-11-29 18:39:06',
// dnn: 'ims',
// ipv4: '10.10.48.97',
// ipv6: '',
// pduSessionID: 6,
// ranN3IP: '192.168.8.223',
// sstSD: '1-000001',
// tai: '46000-0001',
// upfN3IP: '192.168.1.161',
// },
// {
// activeTime: '2023-11-29 18:39:05',
// dnn: 'cmnet',
// ipv4: '10.10.48.62',
// ipv6: '',
// pduSessionID: 5,
// ranN3IP: '192.168.8.223',
// sstSD: '1-000001',
// tai: '46000-0001',
// upfN3IP: '192.168.1.163',
// },
// ],
// ratType: 'EUTRAN',
// },
// ];
return data;
}

View File

@@ -15,17 +15,23 @@ export async function listgoldData(query: Record<string, any>) {
// 查询
let querySQL = '';
if (query.neType) {
querySQL += ` and ne_type like '%${query.neType}%' `;
querySQL += ` and gold_kpi.ne_type like '%${query.neType}%' `;
}
if (query.beginTime) {
querySQL += ` and start_time >= '${query.beginTime}' `;
}
if (query.endTime) {
querySQL += ` and start_time <= '${query.endTime}' `;
querySQL += ` and end_time <= '${query.endTime}' `;
}
// 排序
let sortSql = ' order by start_time ';
let sortSql = ' order by ';
if (query.sortField) {
sortSql += ` ${query.sortField} `;
} else {
sortSql += ` start_time `;
}
if (query.sortOrder === 'asc') {
sortSql += ' asc ';
} else {
@@ -69,3 +75,43 @@ export async function listgoldData(query: Record<string, any>) {
}
return result;
}
/**
* 查询黄金指标数据
* @param query 查询参数
* @returns object
*/
export async function goldData(query: Record<string, any>) {
const result = await request({
url: `/ne/kpi/data`,
method: 'get',
params: {
neType: query.neType[0],
neId: query.neType[1],
startTime: query.beginTime,
endTime: query.endTime,
interval: query.particle,
sortField:query.sortField,
sortOrder:query.sortOrder
},
timeout: 60_000,
});
return result;
}
/**
* 查询网元可用黄金指标
* @param neType 网元类型
* @returns object
*/
export async function getGoldTitleByNE(neType: string) {
// 发起请求
const result = await request({
url: `/ne/kpi/title`,
method: 'get',
params: { neType },
});
// 解析数据
return result;
}

View File

@@ -16,15 +16,24 @@ export async function listperfData(query: Record<string, any>) {
if (query.neType) {
querySQL += ` and ne_type like '%${query.neType}%' `;
}
if (query.taskId) {
querySQL += ` and task_id like '%${query.taskId}%' `;
}
if (query.beginTime) {
querySQL += ` and start_time >= '${query.beginTime}' `;
}
if (query.endTime) {
querySQL += ` and start_time <= '${query.endTime}' `;
querySQL += ` and end_time <= '${query.endTime}' `;
}
// 排序
let sortSql = ' order by start_time ';
let sortSql = ' order by ';
if (query.sortField) {
sortSql += ` ${query.sortField} `;
}else{
sortSql += ` start_time `;
}
if (query.sortOrder === 'asc') {
sortSql += ' asc ';
} else {

View File

@@ -1,4 +1,9 @@
import { request } from '@/plugins/http-fetch';
import {
RESULT_CODE_ERROR,
RESULT_CODE_SUCCESS,
RESULT_MSG_ERROR,
} from '@/constants/result-constants';
import { request, language } from '@/plugins/http-fetch';
import { encode } from 'js-base64';
/**
@@ -37,7 +42,7 @@ export async function downloadFileChunk(
async function sendRequest() {
const range = `bytes=${start}-${end}`;
const res = await downloadFile(filePath, range);
if (res.code === 200 && res.status === 206) {
if (res.code === RESULT_CODE_SUCCESS && res.status === 206) {
// 总大小
const contentRange = res.headers.get('content-range') || '0/0';
totalSize = parseInt(contentRange.split('/')[1]);
@@ -109,7 +114,7 @@ export async function uploadFileChunk(
// 检查是否已上传部分数据块
const resCheck = await chunkCheck(fileIdentifier, name);
if (resCheck.code !== 200) {
if (resCheck.code !== RESULT_CODE_SUCCESS) {
return resCheck;
}
@@ -130,7 +135,7 @@ export async function uploadFileChunk(
formData.append('identifier', fileIdentifier);
const resUpload = await chunkUpload(formData);
if (resUpload.code === 200) {
if (resUpload.code === RESULT_CODE_SUCCESS) {
uploadedSize += chunk.size;
uploadProgress = (uploadedSize / size) * 100;
console.log(`上传进度:${uploadProgress}%`);
@@ -144,7 +149,7 @@ export async function uploadFileChunk(
if (uploadedSize === size) {
return await chunkMerge(fileIdentifier, name, subPath);
}
return { code: 500, msg: '上传出错,请重试' };
return { code: RESULT_CODE_ERROR, msg: RESULT_MSG_ERROR[language] };
}
/**
@@ -193,3 +198,45 @@ export function chunkUpload(data: FormData) {
dataType: 'form-data',
});
}
/**
* 转存上传文件到静态资源
* @returns object
*/
export function transferStaticFile(data: Record<string, any>) {
return request({
url: `/file/transferStaticFile`,
method: 'post',
data,
});
}
/**
* 上传切片文件并发送文件到网元端
* @param neType 网元类型, UPF
* @param neId 网元标识, 001
* @param fileData 文件对象
* @param chunkSize 数据块大小MB默认1MB
* @returns
*/
export async function uploadFileToNE(
neType: string,
neId: string,
fileData: File,
chunkSize: number = 1
) {
const uploadChunkRes = await uploadFileChunk(fileData, chunkSize, 'import');
if (uploadChunkRes.code === RESULT_CODE_SUCCESS) {
const transferToNeFileRes = await request({
url: `/ne/action/pushFile`,
method: 'post',
data: {
uploadPath: uploadChunkRes.data.fileName,
neType,
neId,
},
});
return transferToNeFileRes;
}
return uploadChunkRes;
}

29
src/api/tool/neFile.ts Normal file
View File

@@ -0,0 +1,29 @@
import { request } from '@/plugins/http-fetch';
/**
* 查询文件列表列表
* @param query 查询参数
* @returns object
*/
export function listNeFiles(query: Record<string, any>) {
return request({
url: '/ne/action/files',
method: 'get',
params: query,
});
}
/**
* 获取文件
* @param query 查询参数
* @returns object
*/
export function getNeFile(query: Record<string, any>) {
return request({
url: '/ne/action/pullFile',
method: 'get',
params: query,
responseType: 'blob',
timeout: 180_000,
});
}

View File

@@ -1,69 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg width="1361px" height="609px" viewBox="0 0 1361 609" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<!-- Generator: Sketch 46.2 (44496) - http://www.bohemiancoding.com/sketch -->
<title>Ant-Design-Pro</title>
<desc>mask-and-vue3 By TsMask</desc>
<defs></defs>
<g id="Ant-Design-Pro" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g id="mask-and-vue3" transform="translate(-79.000000, -82.000000)">
<g id="Group-21" transform="translate(77.000000, 73.000000)">
<g id="Group-18" opacity="0.8" transform="translate(74.901416, 569.699158) rotate(-7.000000) translate(-74.901416, -569.699158) translate(4.901416, 525.199158)">
<ellipse id="Oval-11" fill="#CFDAE6" opacity="0.25" cx="63.5748792" cy="32.468367" rx="21.7830479" ry="21.766008"></ellipse>
<ellipse id="Oval-3" fill="#CFDAE6" opacity="0.599999964" cx="5.98746479" cy="13.8668601" rx="5.2173913" ry="5.21330997"></ellipse>
<path d="M38.1354514,88.3520215 C43.8984227,88.3520215 48.570234,83.6838647 48.570234,77.9254015 C48.570234,72.1669383 43.8984227,67.4987816 38.1354514,67.4987816 C32.3724801,67.4987816 27.7006688,72.1669383 27.7006688,77.9254015 C27.7006688,83.6838647 32.3724801,88.3520215 38.1354514,88.3520215 Z" id="Oval-3-Copy" fill="#CFDAE6" opacity="0.45"></path>
<path d="M64.2775582,33.1704963 L119.185836,16.5654915" id="Path-12" stroke="#CFDAE6" stroke-width="1.73913043" stroke-linecap="round" stroke-linejoin="round"></path>
<path d="M42.1431708,26.5002681 L7.71190162,14.5640702" id="Path-16" stroke="#E0B4B7" stroke-width="0.702678964" opacity="0.7" stroke-linecap="round" stroke-linejoin="round" stroke-dasharray="1.405357899873153,2.108036953469981"></path>
<path d="M63.9262187,33.521561 L43.6721326,69.3250951" id="Path-15" stroke="#BACAD9" stroke-width="0.702678964" stroke-linecap="round" stroke-linejoin="round" stroke-dasharray="1.405357899873153,2.108036953469981"></path>
<g id="Group-17" transform="translate(126.850922, 13.543654) rotate(30.000000) translate(-126.850922, -13.543654) translate(117.285705, 4.381889)" fill="#CFDAE6">
<ellipse id="Oval-4" opacity="0.45" cx="9.13482653" cy="9.12768076" rx="9.13482653" ry="9.12768076"></ellipse>
<path d="M18.2696531,18.2553615 C18.2696531,13.2142826 14.1798519,9.12768076 9.13482653,9.12768076 C4.08980114,9.12768076 0,13.2142826 0,18.2553615 L18.2696531,18.2553615 Z" id="Oval-4" transform="translate(9.134827, 13.691521) scale(-1, -1) translate(-9.134827, -13.691521) "></path>
</g>
</g>
<g id="Group-14" transform="translate(216.294700, 123.725600) rotate(-5.000000) translate(-216.294700, -123.725600) translate(106.294700, 35.225600)">
<ellipse id="Oval-2" fill="#CFDAE6" opacity="0.25" cx="29.1176471" cy="29.1402439" rx="29.1176471" ry="29.1402439"></ellipse>
<ellipse id="Oval-2" fill="#CFDAE6" opacity="0.3" cx="29.1176471" cy="29.1402439" rx="21.5686275" ry="21.5853659"></ellipse>
<ellipse id="Oval-2-Copy" stroke="#CFDAE6" opacity="0.4" cx="179.019608" cy="138.146341" rx="23.7254902" ry="23.7439024"></ellipse>
<ellipse id="Oval-2" fill="#BACAD9" opacity="0.5" cx="29.1176471" cy="29.1402439" rx="10.7843137" ry="10.7926829"></ellipse>
<path d="M29.1176471,39.9329268 L29.1176471,18.347561 C23.1616351,18.347561 18.3333333,23.1796097 18.3333333,29.1402439 C18.3333333,35.1008781 23.1616351,39.9329268 29.1176471,39.9329268 Z" id="Oval-2" fill="#BACAD9"></path>
<g id="Group-9" opacity="0.45" transform="translate(172.000000, 131.000000)" fill="#E6A1A6">
<ellipse id="Oval-2-Copy-2" cx="7.01960784" cy="7.14634146" rx="6.47058824" ry="6.47560976"></ellipse>
<path d="M0.549019608,13.6219512 C4.12262681,13.6219512 7.01960784,10.722722 7.01960784,7.14634146 C7.01960784,3.56996095 4.12262681,0.670731707 0.549019608,0.670731707 L0.549019608,13.6219512 Z" id="Oval-2-Copy-2" transform="translate(3.784314, 7.146341) scale(-1, 1) translate(-3.784314, -7.146341) "></path>
</g>
<ellipse id="Oval-10" fill="#CFDAE6" cx="218.382353" cy="138.685976" rx="1.61764706" ry="1.61890244"></ellipse>
<ellipse id="Oval-10-Copy-2" fill="#E0B4B7" opacity="0.35" cx="179.558824" cy="175.381098" rx="1.61764706" ry="1.61890244"></ellipse>
<ellipse id="Oval-10-Copy" fill="#E0B4B7" opacity="0.35" cx="180.098039" cy="102.530488" rx="2.15686275" ry="2.15853659"></ellipse>
<path d="M28.9985381,29.9671598 L171.151018,132.876024" id="Path-11" stroke="#CFDAE6" opacity="0.8"></path>
</g>
<g id="Group-10" opacity="0.799999952" transform="translate(1054.100635, 36.659317) rotate(-11.000000) translate(-1054.100635, -36.659317) translate(1026.600635, 4.659317)">
<ellipse id="Oval-7" stroke="#CFDAE6" stroke-width="0.941176471" cx="43.8135593" cy="32" rx="11.1864407" ry="11.2941176"></ellipse>
<g id="Group-12" transform="translate(34.596774, 23.111111)" fill="#BACAD9">
<ellipse id="Oval-7" opacity="0.45" cx="9.18534718" cy="8.88888889" rx="8.47457627" ry="8.55614973"></ellipse>
<path d="M9.18534718,17.4450386 C13.8657264,17.4450386 17.6599235,13.6143199 17.6599235,8.88888889 C17.6599235,4.16345787 13.8657264,0.332739156 9.18534718,0.332739156 L9.18534718,17.4450386 Z" id="Oval-7"></path>
</g>
<path d="M34.6597385,24.809694 L5.71666084,4.76878945" id="Path-2" stroke="#CFDAE6" stroke-width="0.941176471"></path>
<ellipse id="Oval" stroke="#CFDAE6" stroke-width="0.941176471" cx="3.26271186" cy="3.29411765" rx="3.26271186" ry="3.29411765"></ellipse>
<ellipse id="Oval-Copy" fill="#F7E1AD" cx="2.79661017" cy="61.1764706" rx="2.79661017" ry="2.82352941"></ellipse>
<path d="M34.6312443,39.2922712 L5.06366663,59.785082" id="Path-10" stroke="#CFDAE6" stroke-width="0.941176471"></path>
</g>
<g id="Group-19" opacity="0.33" transform="translate(1282.537219, 446.502867) rotate(-10.000000) translate(-1282.537219, -446.502867) translate(1142.537219, 327.502867)">
<g id="Group-17" transform="translate(141.333539, 104.502742) rotate(275.000000) translate(-141.333539, -104.502742) translate(129.333539, 92.502742)" fill="#BACAD9">
<circle id="Oval-4" opacity="0.45" cx="11.6666667" cy="11.6666667" r="11.6666667"></circle>
<path d="M23.3333333,23.3333333 C23.3333333,16.8900113 18.1099887,11.6666667 11.6666667,11.6666667 C5.22334459,11.6666667 0,16.8900113 0,23.3333333 L23.3333333,23.3333333 Z" id="Oval-4" transform="translate(11.666667, 17.500000) scale(-1, -1) translate(-11.666667, -17.500000) "></path>
</g>
<circle id="Oval-5-Copy-6" fill="#CFDAE6" cx="201.833333" cy="87.5" r="5.83333333"></circle>
<path d="M143.5,88.8126685 L155.070501,17.6038544" id="Path-17" stroke="#BACAD9" stroke-width="1.16666667"></path>
<path d="M17.5,37.3333333 L127.466252,97.6449735" id="Path-18" stroke="#BACAD9" stroke-width="1.16666667"></path>
<polyline id="Path-19" stroke="#CFDAE6" stroke-width="1.16666667" points="143.902597 120.302281 174.935455 231.571342 38.5 147.510847 126.366941 110.833333"></polyline>
<path d="M159.833333,99.7453842 L195.416667,89.25" id="Path-20" stroke="#E0B4B7" stroke-width="1.16666667" opacity="0.6"></path>
<path d="M205.333333,82.1372105 L238.719406,36.1666667" id="Path-24" stroke="#BACAD9" stroke-width="1.16666667"></path>
<path d="M266.723424,132.231988 L207.083333,90.4166667" id="Path-25" stroke="#CFDAE6" stroke-width="1.16666667"></path>
<circle id="Oval-5" fill="#C1D1E0" cx="156.916667" cy="8.75" r="8.75"></circle>
<circle id="Oval-5-Copy-3" fill="#C1D1E0" cx="39.0833333" cy="148.75" r="5.25"></circle>
<circle id="Oval-5-Copy-2" fill-opacity="0.6" fill="#D1DEED" cx="8.75" cy="33.25" r="8.75"></circle>
<circle id="Oval-5-Copy-4" fill-opacity="0.6" fill="#D1DEED" cx="243.833333" cy="30.3333333" r="5.83333333"></circle>
<circle id="Oval-5-Copy-5" fill="#E0B4B7" cx="175.583333" cy="232.75" r="5.25"></circle>
</g>
</g>
</g>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 8.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.0 KiB

After

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 16 KiB

View File

@@ -0,0 +1,392 @@
<template>
<div>
<div ref="chartGraphG6Dom" :style="{ height: height, width: width }"></div>
</div>
</template>
<script lang="ts" setup>
import { nextTick, watch, onMounted, onBeforeUnmount, ref } from 'vue';
import { Graph } from '@antv/g6';
const props = defineProps({
/**
* 图表主题
*
* 'dark' | 'light'
*/
theme: {
type: String,
default: 'light', // 'dark' | 'light'
},
/**宽度默认100% */
width: {
type: String,
default: '100%',
},
/**高度 */
height: {
type: String,
default: '500px',
},
});
const chartGraphG6Dom = ref<HTMLElement | undefined>(undefined);
const data = {
nodes: [
// 0 基站
{
id: '0',
x: 50,
y: 150,
size: 48,
type: 'circle',
label: '基站',
labelCfg: {
position: 'bottom',
offset: 10,
style: {
fill: '#333',
stroke: '#fff',
lineWidth: 10,
},
},
style: {
fill: '#9EC9FF',
stroke: '#5B8FF9',
lineWidth: 2,
},
icon: {
show: true,
// 可更换为其他图片地址
img: 'https://gw.alipayobjects.com/zos/basement_prod/012bcf4f-423b-4922-8c24-32a89f8c41ce.svg',
width: 24,
height: 24,
},
},
// 1 DM
{
id: '1',
x: 450,
y: 450,
label: 'DM',
labelCfg: {
position: 'center',
},
style: {
fill: '#00b050',
stroke: '#00b050',
lineWidth: 1,
},
},
// 2 O&M
{
id: '2',
x: 50,
y: 450,
label: 'O&M',
},
// 100 EMS
{
id: '100',
label: 'EMS',
comboId: 'combo-ems',
x: 300,
y: 450,
},
// 190 UPF
{
id: '190',
comboId: 'combo-upf',
x: 300,
y: 350,
label: 'UPF',
labelCfg: {
position: 'center',
},
style: {
fill: '#d580ff',
stroke: '#d580ff',
lineWidth: 1,
},
},
// EP-IMS
{
id: '110',
comboId: 'combo-ims',
x: 600,
y: 350,
label: 'IMS',
labelCfg: {
position: 'center',
},
style: {
fill: '#ed7d31',
stroke: '#ed7d31',
lineWidth: 1,
},
},
// 5GC控制面
{
id: '170',
label: 'NSSF',
comboId: 'combo-5gc',
x: 300,
y: 50,
},
{
id: '130',
label: 'AUSF',
comboId: 'combo-5gc',
x: 450,
y: 50,
},
{
id: '140',
label: 'UDM',
comboId: 'combo-5gc',
x: 600,
y: 50,
},
{
id: '120',
label: 'AMF',
comboId: 'combo-5gc',
x: 300,
y: 150,
},
{
id: '180',
label: 'NRF',
comboId: 'combo-5gc',
x: 450,
y: 150,
},
{
id: '150',
label: 'SMF',
comboId: 'combo-5gc',
x: 300,
y: 250,
},
{
id: '160',
label: 'PCF',
comboId: 'combo-5gc',
x: 700,
y: 250,
},
],
edges: [
{
id: '0-5gc',
source: '0',
target: 'combo-5gc',
},
{
id: '0-upf',
source: '0',
target: 'combo-upf',
},
{
id: 'upf-1',
source: 'combo-upf',
target: '1',
},
{
id: 'ems-2',
source: 'combo-ems',
target: '2',
},
{
id: '170-120',
source: '170',
target: '120',
},
{
id: '130-120',
source: '130',
target: '120',
},
{
id: '140-120',
source: '140',
target: '120',
},
{
id: '140-180',
source: '140',
target: '180',
},
{
id: '120-180',
source: '120',
target: '180',
},
{
id: '130-180',
source: '130',
target: '180',
},
{
id: '140-150',
source: '140',
target: '150',
},
{
id: '140-110',
source: '140',
target: '110',
},
{
id: '120-150',
source: '120',
target: '150',
data: {},
},
{
id: '150-180',
source: '150',
target: '180',
data: {},
},
{
id: '150-160',
source: '150',
target: '160',
},
{
id: '160-120',
source: '160',
target: '120',
},
{
id: '160-180',
source: '160',
target: '180',
},
{
id: '160-110',
source: '160',
target: '110',
},
{
id: '150-190',
source: '150',
target: '190',
},
{
id: 'upf-ims',
source: 'combo-upf',
target: 'combo-ims',
},
{
id: 'ems-5gc',
source: 'combo-ems',
target: 'combo-5gc',
},
{
id: 'ems-upf',
source: 'combo-ems',
target: 'combo-upf',
},
{
id: 'ems-ims',
source: 'combo-ems',
target: 'combo-ims',
},
],
combos: [
{
id: 'combo-5gc',
data: {
text: '5GC控制面',
},
},
{
id: 'combo-upf',
data: {
keyShape: {
opacity: 0.8,
padding: [20, 20, 20, 20],
radius: 4,
lineWidth: 1,
stroke: '#d580ff',
},
},
},
{
id: 'combo-ims',
data: {},
},
{
id: 'combo-ems',
data: {},
},
],
};
let graph: any = null;
/**初始化渲染图表 */
function initChart() {
if (!chartGraphG6Dom.value) return;
console.log(chartGraphG6Dom.value.clientWidth);
console.log(chartGraphG6Dom.value.clientHeight);
graph = new Graph({
container: chartGraphG6Dom.value,
height: chartGraphG6Dom.value.clientHeight,
width: chartGraphG6Dom.value.clientWidth,
fitCenter: true,
modes: {
default: ['drag-canvas', 'zoom-canvas', 'drag-node'], // 允许拖拽画布、放缩画布、拖拽节点
},
// 全局节点 矩形
defaultNode: {
type: 'rect',
size: [80, 40],
style: {
fill: '#fff',
lineWidth: 1,
radius: 8,
},
labelCfg: {},
},
// 全局边 三次贝塞尔曲线
defaultEdge: {
type: 'polyline',
style: {
offset: 20, // 拐弯处距离节点最小距离
radius: 4, // 拐弯处的圆角弧度,若不设置则为直角
lineWidth: 1,
stroke: '#87e8de',
},
},
// 全局框节点 矩形
defaultCombo: {
type: 'rect', // Combo 类型
size: [40, 40],
// ... 其他配置
style: {
lineWidth: 1,
},
},
});
graph.data(data); // 加载数据
graph.render(); // 渲染
}
onMounted(() => {
nextTick(() => {
initChart();
});
});
onBeforeUnmount(() => {});
</script>
<style lang="less" scoped></style>

View File

@@ -69,7 +69,7 @@ const props = defineProps({
const seriesStyle = [
{
color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
{
{
offset: 0,
color: 'rgba(22, 119, 255, .5)',
},
@@ -203,7 +203,7 @@ function initChart() {
},
},
grid: props.option.grid || { left: '8%', right: '8%', bottom: '20%' },
legend: {
legend: props.option.legend || {
right: 10,
itemWidth: 8,
textStyle: {

View File

@@ -0,0 +1,168 @@
<script setup lang="ts">
import { ref, watch, watchEffect, CSSProperties, computed } from 'vue';
import { useDraggable } from '@vueuse/core';
const emit = defineEmits(['update:visible', 'ok', 'cancel']);
/**于a-modal保持一致 */
const props = defineProps({
/**是否弹出显示,必传 */
visible: {
type: Boolean,
required: true,
},
/**窗口标题 */
title: {
type: String,
default: '',
},
/**窗口宽度 */
width: {
type: [String, Number],
default: '520px',
},
bodyStyle: {
type: Object,
default: {},
},
keyboard: {
type: Boolean,
default: true,
},
mask: {
type: Boolean,
default: true,
},
maskClosable: {
type: Boolean,
default: true,
},
maskStyle: {
type: Object,
default: {},
},
destroyOnClose: {
type: Boolean,
default: false,
},
confirmLoading: {
type: Boolean,
default: false,
},
footer: {
type: Object,
},
});
// 对标题进行监听
const modalTitleRef = ref<HTMLElement | null>(null);
const { x, y, isDragging } = useDraggable(modalTitleRef);
const startX = ref<number>(0);
const startY = ref<number>(0);
const startedDrag = ref(false);
const transformX = ref(0);
const transformY = ref(0);
const preTransformX = ref(0);
const preTransformY = ref(0);
const dragRect = ref({ left: 0, right: 0, top: 0, bottom: 0 });
watch([x, y], () => {
if (!startedDrag.value) {
startX.value = x.value;
startY.value = y.value;
const bodyRect = document.body.getBoundingClientRect();
const titleRectEl = modalTitleRef.value;
if (titleRectEl) {
const titleRect = titleRectEl.getBoundingClientRect();
dragRect.value.right = bodyRect.width - (titleRect.width + 24);
dragRect.value.bottom = bodyRect.height - (titleRect.height + 16);
}
preTransformX.value = transformX.value;
preTransformY.value = transformY.value;
}
startedDrag.value = true;
});
watchEffect(() => {
if (!isDragging.value) {
startedDrag.value = false;
}
if (startedDrag.value) {
const dragRectX = Math.min(
Math.max(dragRect.value.left + 24, x.value),
dragRect.value.right
);
transformX.value = preTransformX.value + dragRectX - startX.value;
const dragRectY = Math.min(
Math.max(dragRect.value.top + 16, y.value),
dragRect.value.bottom
);
transformY.value = preTransformY.value + dragRectY - startY.value;
}
});
// 位移
const transformStyle = computed<CSSProperties>(() => {
return {
transform: `translate(${transformX.value}px, ${transformY.value}px)`,
};
});
/**监听是否显示,位置还原 */
watch(
() => props.visible,
val => {
if (val) {
transformX.value = 0;
transformY.value = 0;
}
}
);
</script>
<template>
<a-modal
wrapClassName="draggable-modal"
:width="props.width"
:keyboard="props.keyboard"
:mask="props.mask"
:mask-closable="props.maskClosable"
:visible="props.visible"
:confirm-loading="props.confirmLoading"
:body-style="props.bodyStyle"
:mask-style="props.maskStyle"
:destroy-on-close="props.destroyOnClose"
:footer="props.footer"
@ok="e => emit('ok', e)"
@cancel="e => emit('cancel', e)"
>
<template #title>
<div
ref="modalTitleRef"
class="draggable-modal-title"
v-text="title"
></div>
</template>
<template #modalRender="{ originVNode }">
<div :style="transformStyle">
<component :is="originVNode" />
</div>
</template>
<slot></slot>
</a-modal>
</template>
<style lang="less">
.draggable-modal {
// 穿透选择文字
// 给a-modal设置 get-container=".ant-pro-page-container"
// 防止跳转显示
// &.ant-modal-wrap {
// pointer-events: none;
// }
&-title {
width: 100%;
cursor: move;
}
}
</style>

View File

@@ -0,0 +1,176 @@
<script setup lang="ts">
import { reactive, watch, onMounted, PropType } from 'vue';
import { Container, Draggable } from 'vue3-smooth-dnd';
import useI18n from '@/hooks/useI18n';
import { type ColumnsType } from 'ant-design-vue/lib/table';
const { t } = useI18n();
const emit = defineEmits(['update:columns-dnd']);
const props = defineProps({
/**
* 表格字段列非响应式数据,必传
*
* v-model:columns-dnd取变更的数据
*/
columns: {
type: Array<any>,
required: true,
},
/**按钮类型
* text 图标
* ghost 图标按钮带文字
*/
type: {
type: String as PropType<'text' | 'ghost'>,
default: 'text',
},
});
/**表格字段列 */
const tableColumns = reactive<ColumnsType>(props.columns);
/**表格字段列勾选状态 */
const state = reactive({
indeterminate: false,
checkAll: true,
columnsTitleList: tableColumns.map(s => `${s.title}`),
});
/**表格字段列全选操作 */
function fnTableColumnsCheckAllChange(e: any) {
const checked = e.target.checked;
state.indeterminate = false;
state.columnsTitleList = checked ? tableColumns.map(s => `${s.title}`) : [];
}
/**表格字段列拖拽操作 */
function fnTableColumnsDrop(dropResult: any) {
const { removedIndex, addedIndex, payload } = dropResult;
if (removedIndex !== null && addedIndex !== null) {
let itemToAdd = payload;
itemToAdd = tableColumns.splice(removedIndex, 1)[0];
tableColumns.splice(addedIndex, 0, itemToAdd);
fnUpdateColumns();
}
}
/**表格字段列固定操作 */
function fnTableColumnsFixed(row: Record<string, any>) {
if (row.fixed === undefined) {
return;
}
const optTitle = t('common.operate');
if (row.title === optTitle) {
const optFixed = row.fixed === 'right';
row.fixed = optFixed ? false : 'right';
} else {
row.fixed = !row.fixed;
}
}
/**表格字段列勾选字段变化 */
function fnUpdateColumns() {
let list = tableColumns.filter(s =>
state.columnsTitleList.includes(`${s.title}`)
);
// 取消全选时留第一个
if (list.length === 0) {
list = [tableColumns[0]];
}
emit('update:columns-dnd', list);
}
/**表格字段列勾选监听 */
watch(
() => state.columnsTitleList,
val => {
const len = val.length;
state.indeterminate = !!len && len < tableColumns.length;
state.checkAll = len === tableColumns.length;
fnUpdateColumns();
}
);
onMounted(() => {
fnUpdateColumns();
});
</script>
<template>
<a-tooltip>
<template #title>
{{ t('common.columnSetText') }}
</template>
<a-popover trigger="click" placement="bottomRight">
<template #title>
<div class="table-column-setting-title">
<a-checkbox
v-model:checked="state.checkAll"
:indeterminate="state.indeterminate"
@change="fnTableColumnsCheckAllChange"
>
{{ t('common.columnSetTitle') }}
</a-checkbox>
</div>
</template>
<template #content>
<a-checkbox-group
v-model:value="state.columnsTitleList"
style="width: 100%; max-height: 450px; overflow-y: auto"
>
<Container orientation="vertical" @drop="fnTableColumnsDrop">
<Draggable v-for="c in tableColumns" :key="c.title">
<div class="table-column-setting-list-item">
<HolderOutlined class="anticon" />
<a-checkbox :value="c.title">
{{ c.title }}
</a-checkbox>
<a-button
v-if="c.fixed !== undefined"
size="small"
:type="c.fixed ? 'primary' : 'dashed'"
@click="fnTableColumnsFixed(c)"
>
<template #icon><FlagOutlined /></template>
</a-button>
</div>
</Draggable>
</Container>
</a-checkbox-group>
</template>
<a-button :type="props.type" size="small">
<template #icon><TableOutlined /></template>
<span v-if="props.type === 'ghost'">
{{ t('common.columnSetText') }}
</span>
</a-button>
</a-popover>
</a-tooltip>
</template>
<style lang="less" scoped>
.table-column-setting-title {
display: flex;
align-items: center;
justify-content: space-between;
height: 32px;
margin-left: 4px;
}
.table-column-setting-list-item {
display: flex;
align-items: center;
width: 100%;
padding: 4px;
}
.table-column-setting-list-item > .anticon {
padding-right: 8px;
cursor: move;
}
.table-column-setting-list-item .ant-checkbox-wrapper {
flex: 1;
margin: 0;
}
</style>

View File

@@ -2,25 +2,46 @@
export const RESULT_CODE_SUCCESS = 1;
/**响应-msg正常成功 */
export const RESULT_MSG_SUCCESS = 'success';
export const RESULT_MSG_SUCCESS: Record<string, string> = {
zh_CN: '成功!',
en_US: 'Success!',
};
/**响应-code错误失败 */
export const RESULT_CODE_ERROR = 0;
/**响应-msg错误失败 */
export const RESULT_MSG_ERROR = 'error';
export const RESULT_MSG_ERROR: Record<string, string> = {
zh_CN: '错误!',
en_US: 'Error!',
};
/**响应-网络连接超时 */
export const RESULT_MSG_TIMEOUT = 'Network connection timeout!';
export const RESULT_MSG_TIMEOUT: Record<string, string> = {
zh_CN: '网络连接超时!',
en_US: 'Network Connection Timeout!',
};
/**响应-未知响应数据类型 */
export const RESULT_MSG_NOT_TYPE = 'Unknown response data type!';
export const RESULT_MSG_NOT_TYPE: Record<string, string> = {
zh_CN: '未知响应数据类型!',
en_US: 'Unknown Response Data Type!',
};
/**响应-服务器连接出错 */
export const RESULT_MSG_SERVER_ERROR = 'Server connection error!';
export const RESULT_MSG_SERVER_ERROR: Record<string, string> = {
zh_CN: '服务器连接出错!',
en_US: 'Server Connection Error!',
};
/**响应-请求地址未找到 */
export const RESULT_MSG_URL_NOTFOUND = 'Request address not found!';
export const RESULT_MSG_URL_NOTFOUND: Record<string, string> = {
zh_CN: '请求地址未找到!',
en_US: 'Request Address Not Found!',
};
/**响应-数据正在处理,请勿重复提交 */
export const RESULT_MSG_URL_RESUBMIT = 'Data is being processed, please do not resubmit!';
export const RESULT_MSG_URL_RESUBMIT: Record<string, string> = {
zh_CN: '数据正在处理,请勿重复提交!',
en_US: 'Data are being processed, please do not resubmit',
};

View File

@@ -1,6 +1,6 @@
import { computed } from 'vue';
import { computed, onBeforeMount } from 'vue';
import { useI18n } from 'vue-i18n';
import { localSet } from '@/utils/cache-local-utils';
import { localGet, localSet } from '@/utils/cache-local-utils';
import { CACHE_LOCAL_I18N } from '@/constants/cache-keys-constants';
export default function useLocale() {
@@ -16,10 +16,32 @@ export default function useLocale() {
const changeLocale = (value: string) => {
i18n.locale.value = value;
localSet(CACHE_LOCAL_I18N, value);
window.location.reload()
window.location.reload();
};
// 可选的语言
const optionsLocale = [
{
value: 'zh_CN',
label: '中文',
},
{
value: 'en_US',
label: 'English',
},
];
// 挂载前根据默认语言再设置一次
onBeforeMount(() => {
const localI18n = localGet(CACHE_LOCAL_I18N);
if (localI18n) {
i18n.locale.value = localI18n;
document.documentElement.lang = localI18n.replace('_', '-');
}
});
return {
optionsLocale,
currentLocale,
changeLocale,
t: i18n.t,

View File

@@ -6,7 +6,7 @@ import enUS from './locales/en-US';
const i18n = createI18n({
legacy: false, // 使用 Composition API 的方式创建 i18n 实例
locale: localGet(CACHE_LOCAL_I18N) || 'zh_CN', // 默认显示语言
locale: localGet(CACHE_LOCAL_I18N) || 'en_US', // 默认显示语言
messages: {
zh_CN: zhCN,
en_US: enUS,

View File

@@ -8,12 +8,12 @@ export default {
title: 'Core Network Management Platform',
desc: 'Core Network Management Platform',
loading: 'Please wait...',
ipnutPlease: 'Please input',
inputPlease: 'Please input',
selectPlease: 'please select',
tipTitle: 'Prompt',
msgSuccess: 'Success {msg}',
errorFields: 'Please fill in the required information in {num} correctly!',
tablePaginationTotal: 'A total of {total} items',
tablePaginationTotal: 'Total {total} items',
noData: "No Data",
zebra:'Tabular zebra pattern',
ok: 'Ok',
@@ -36,6 +36,8 @@ export default {
searchBarText: 'Search bar',
tableStripedText: 'Form Zebra',
reloadText: 'Refresh',
columnSetText: 'Column Setting',
columnSetTitle: 'Column Display / Sorting',
sizeText: 'Density',
size: {
default: 'Default',
@@ -47,11 +49,11 @@ export default {
hide: 'Hidden',
open: 'Open',
shut: 'Shut',
launch: 'Launch',
launch: 'Expand',
fold: 'Fold',
},
rowId: 'ID',
operate: 'Operate',
operate: 'Operation',
units: {
second: 'Second',
minute: 'Minute',
@@ -124,6 +126,11 @@ export default {
// 静态路由
router: {
index: "Home",
login: "Sign In",
register: 'Registrations',
page403: 'No Access',
page404: 'Match Page Not Found',
helpDoc: 'System User Documentation',
account: {
index: "Personal Center",
profile: "Personal Info",
@@ -151,18 +158,23 @@ export default {
// 布局
loayouts: {
basic: {
officialUrl: 'Official',
helpDoc: 'Doc',
},
rightContent: {
helpDoc: "System User Documentation",
fullscreen: "Full Screen",
logout: "Logout",
profile: "Profile",
settings: "Settings",
},
tabs: {
reload: "Refresh current",
reload: "Refresh Current Tab",
more: "More Options",
closeCurrent: "Close Current",
closeOther: "Close Other",
closeAll: "Close All",
closeCurrent: "Close Current Tab",
closeOther: "Close Other Tabs",
closeAll: "Close All Tabs",
}
},
@@ -186,8 +198,8 @@ export default {
runStatus:'Running Status',
mark:'Brief Information',
object:'Object',
versionNum:'Version Number',
systemStatus:'System Status',
versionNum:'Version',
systemStatus:'Status',
realNeStatus:'Status',
reloadTime:'Refresh Time',
},
@@ -211,7 +223,7 @@ export default {
tabPane1: 'Account password login',
tabPane2: 'Login with phone number',
registerBtn: 'Register an account',
loginBtn: 'Login',
loginBtn: 'Sign In',
loginSuccess: 'Login successful',
loginMethod: 'Other login methods:',
loginMethodWX: 'WeChat Scan Login',
@@ -323,6 +335,7 @@ export default {
mac:'NE MAC address',
macTip:'Able to locate the physical address (MAC) of the network element',
port:'Port',
portTip:'Maximum range 0~65535',
pvflag:'PV Flag',
pnf:'Physical Network Element',
vnf:'Virtual Network Element',
@@ -341,35 +354,38 @@ export default {
server:'Server File',
local:'Local File',
fileSelect:'Please select the current import file',
sync:'Synchronize to NE',
open:'Open',
close:'Close',
},
backupManage: {
setBackupTask: 'Set automatic backup time',
neTypePlease: 'Query network element type',
neType: 'Type',
neType: 'NE Type',
neID: 'NE ID',
fileName: 'File Name',
createAt: 'CreateAt',
remark:'Remark ',
createAt: 'Create at',
remark:'Remark',
edit:'Edit Backup File',
totalSure:'Confirm that {oper} records item number {id}?',
},
softwareManage: {
sendBtn: 'Distribute',
runBtn: 'Activation',
backBtn: 'Back',
runBtn: 'Activate',
backBtn: 'Rollback',
historyBtn: 'Distribution Record',
neTypePlease: 'Select network element type',
neType: 'Type',
neType: 'NE Type',
fileName: 'File Name',
version: 'Version',
versionPlease: 'Version number cannot be empty',
updateTime: 'Uploaded',
updateTime: 'Uploaded Time',
description: 'Description',
deleteTip: 'Are you sure to delete the data item with software [{fileName}]?',
downloadTip: 'Are you sure to download the data item with software [{fileName}]?',
updateComment: 'software documentation',
updateComment: 'Comment',
updateCommentPlease: 'Please enter the software description',
updateFile: 'Software Files',
updateFile: 'Software File',
updateFilePlease: 'Please upload the updated software file',
verifyFile: 'Verify File',
selectFile: 'SELECT FILE',
@@ -389,12 +405,13 @@ export default {
createTime:'Creation time',
onlyAble:'Only upload file format {fileText} is supported',
nullData:'No network element list data yet',
nullVersion:'There is no rollback version for the current network element.',
},
license: {
neTypePlease: 'Select network element type',
neType: 'Type',
neType: 'NE Type',
fileName: 'File Name',
createTime: 'Uploaded',
createTime: 'Uploaded Time',
comment: 'File Description',
updateComment: 'License Description',
updateCommentPlease: 'Please enter a license description',
@@ -429,6 +446,8 @@ export default {
addSure:'Are you sure to submit the new record of Index: [{value}]? '
},
configParamForm: {
treeTitle: "Navigation Configuration",
treeSelectTip: "Select configuration item information in the left configuration navigation!",
neType: 'NE Type',
neTypePleace: "Please select the network element type",
noConfigData: "No data on configuration items",
@@ -440,7 +459,7 @@ export default {
addItemOk: "Add Index as {num} Record Succeeded",
addItemErr: "Record addition failure",
requireUn: "{display} input value is of unknown type",
requireString: "The {display} parameter value does not make sense.",
requireString: "The {display} parameter value is invalid.",
requireInt: "{display} Parameter value not in reasonable range {filter}",
requireIpv4: "{display} not a legitimate IPV4 address",
requireIpv6: "{display} Not a legitimate IPV6 address.",
@@ -449,92 +468,143 @@ export default {
editOkTip: "Confirm updating the value of this {num} attribute?",
updateItemTip: "Confirm updating the data item with Index [{num}]?",
delItemTip: "Confirm deleting the data item with Index [{num}]?",
arrayMore: "commence",
arrayMore: "Expand",
},
},
neUser: {
auth: {
authInfo:' Authentication Info',
neTypePlease: 'Query network element type',
neType: 'UDM Type',
authInfo:'Authentication Info',
neTypePlease: 'Query network element Object',
neType: 'UDM Object',
export: 'Export',
exportConfirm: 'Are you sure to export all authentication user data?',
checkExport : 'Check Export',
checkExportConfirm: 'Confirm exporting the checked authenticated user data?',
import: 'Import',
loadDataConfirm: 'Are you sure you want to reload the data?',
loadData: 'LoadData',
loadDataTip: 'Successfully obtained updated data: {num} items. The system is updating the data internally. Please do not click repeatedly to obtain updates!!!',
num: 'Number allocation ',
batchAddText: 'Batch Add ',
batchDelText: 'Batch Del ',
delNum:'Number of deletions ',
imsiTip:'SUPI=MCC+MNC+MSIN MCC=mobile country code, consisting of three digits MNC=Mobile Network Number, consisting of two digits MSIN=Mobile Customer Identification Number, composed of 10 digits of equal length',
delSure:'Are you sure to delete the user with IMSI number: {imsi}?',
noListData:'No network element list data yet',
loadData: 'Load Data',
loadDataTip: 'Successfully fetched load data: {num} entries, the system is internally updating the data. You can click reset to refresh the data list after the loading is finished, please don it repeat click to get update!!!!',
startIMSI: 'Start IMSI',
batchAddText: 'Batch Add',
batchDelText: 'Batch Delete',
numAdd: 'Number of releases',
numDel: 'Number of deleted',
checkDel: 'Check Delete',
imsiTip: 'IMSI=MCC+MNC+MSIN',
imsiTip1: 'MCC=Mobile Country Code, consisting of three digits.',
imsiTip2: 'MNC = Mobile Network Number, consisting of two digits',
imsiTip3: 'MSIN = Mobile Subscriber Identification Number, consisting of 10 equal digits.',
amfTip: 'Authentication management field, maximum parameter length is 4',
algoIndexTip: 'Algorithm index, between 0 and 15',
kiTip: 'User signing key information, the maximum length of 32',
opcTip: 'The authentication key, OPC, is calculated from Ki and OP, OP is the root key of the operator, ki is the authentication key, and the maximum length is 32.',
delSure:'Are you sure you want to delete the user with IMSI number: {imsi} ?',
},
sub: {
subInfo:' Subscription Info',
neTypePlease: 'Query network element type',
neType: 'UDM Type',
subInfo:' Subscription Info',
neType: 'UDM Object',
export: 'Export',
exportConfirm: 'Are you sure to export all signed user data?',
checkExport : 'Check Export',
checkExportConfirm: 'Are you sure to export the data of the checked subscribers?',
import: 'Import',
loadDataConfirm: 'Are you sure you want to reload the data?',
loadData: 'LoadData',
loadDataTip: 'Successfully obtained updated data: {num} items. The system is updating the data internally. Please do not click repeatedly to obtain updates!!!',
num: 'Number of deletions',
batchAddText: 'Batch Add ',
batchDelText: 'Batch Del ',
loadData: 'Load Data',
loadDataTip: 'Successfully fetched load data: {num} entries, the system is internally updating the data. You can click reset to refresh the data list after the loading is finished, please don it repeat click to get update!!!!',
numAdd: 'Number of releases',
numDel: 'Number of deleted',
checkDel: 'Check Delete',
batchAddText: 'Batch Add',
batchDelText: 'Batch Delete',
enable:'Enable',
disable:'Disable',
startIMSI: 'Start IMSI',
msisdnTip:'Parameter maximum length: {msg}',
arfbTip:'Restricted area template. In the restricted area specified by the template, the UE is not allowed to communicate with the network.',
sarTip:'Service area restriction template defines the allowed areas in which the UE can communicate with the network; defines the disallowed areas in which the UE and the network are not allowed to initiate Service Request or SM signaling to obtain user services.',
micoTip:'Signed MICO business flag',
rfspTip:'RFSP index, in NG-RAN, the index of a specific RRM configuration, the parameter is between 0 and 127',
epsFlagTip:'Whether to enable 4G EPS service, 0=disable, 1=enable',
contextIdTip:'To sign up for the APN context ID, you must select it from the APN Context list.',
staticIpTip:'Specify the static IP address used by mobile phone users when surfing the Internet. If it is "-", it means using a dynamic IP address.',
epsOdbTip:"ODB (Operator-Determined Barring) operator-determined blocking, that is, the user's business ability to access the EPS network is determined by the operator. Selected --- the corresponding service is allowed Unselected --- the corresponding service is prohibited",
hplmnOdbTip:"HPLMN-ODB blocking determined by the home operator, that is, the user's service ability to access the EPS network is determined by the user's home operator. Selected --- the corresponding service is allowed Unselected -- the corresponding service is prohibited",
ardTip:'The access control flag (Access-Restriction-Data) can be used to distinguish 2G/3G/LTE users, which facilitates differentiated services for different types of users when 2G/3G/LTE networks coexist.',
imsiTip: 'IMSI=MCC+MNC+MSIN',
imsiTip1: 'MCC=Mobile Country Code, consisting of three digits.',
imsiTip2: 'MNC = Mobile Network Number, consisting of two digits',
imsiTip3: 'MSIN = Mobile Subscriber Identification Number, consisting of 10 equal digits.',
msisdnTip: 'Maximum parameter length {num}',
inputTip: 'The maximum length of the parameter is {num}',
arfbTip: 'Restricted area template, in which the UE is not allowed to communicate with the network in the restricted area specified in the template',
sarTip: 'Service Area Restriction template, defining permitted areas in which the UE can communicate with the network, and disallowed areas in which the UE and the network are not allowed to initiate Service Requests or SM signaling to obtain subscriber services',
micoTip: 'Signed MICO business flag bits',
rfspTip:'RFSP index, in NG-RAN, the index of a specific RRM configuration, parameter between 0 and 127',
ueTypeTip: 'Operator-defined subscriber UE Usage Type, integer, parameter between 0 and 127',
epsFlagTip: 'Enable or disable 4G EPS service',
contextIdTip: 'To sign up for an APN Context ID, you must select it from the APN Context list.',
apnContextTip: 'The list of APNs available to the phone, up to six, is defined in the HSS.',
staticIpTip: 'Specify the static IP address to be used by the cell phone user to access the Internet, and "-" means dynamic IP address is used.',
epsOdbTip: 'ODB (Operator-Determined Barring) Operator-determined blocking, i.e. the ability of a subscriber to access the EPS network is determined by the operator.',
hplmnOdbTip: 'HPLMN-ODB homing operator-determined blocking, i.e., the ability of a subscriber to access services in the EPS network is determined by the subscriber is homing operator',
ardTip:'Access-Restriction-Data (Access-Restriction-Data), can be used to distinguish between 2G/3G/LTE users, to facilitate the coexistence of 2G/3G/LTE network for different types of users to distinguish between the service',
},
base5G: {
neTypePlease: 'Query network element type',
neType: 'AMF Type',
pcf: {
neType: 'PCF Object',
export: 'Export',
exportConfirm: 'Confirm exporting all user policy control information data?',
import: 'Import',
addTitle: 'Adding Policy Control Information',
updateTitle: '{imsi} Policy control information',
startIMSI: 'Start IMSI',
batchAddText: 'Batch Add',
batchDelText: 'Batch Delete',
batchUpdateText: 'Batch Modify',
batchNum: 'Number of batches',
imsiTip: 'IMSI=MCC+MNC+MSIN',
imsiTip1: 'MCC=Mobile Country Code, consisting of three digits.',
imsiTip2: 'MNC = Mobile Network Number, consisting of two digits',
imsiTip3: 'MSIN = Mobile Subscriber Identification Number, consisting of 10 equal digits.',
delSure:'Are you sure you want to delete the user with IMSI number: {imsi}?',
uploadFileOk: 'File Upload Successful',
uploadFileErr: 'File Upload Failed',
},
ue: {
neTypePlease: 'Query network element type',
neType: 'SMF Type',
base5G: {
neType: 'AMF Object',
},
ims: {
neTypePlease: 'Query network element type',
neType: 'IMS Type',
n3iwf: {
neType: 'N3IWF Object',
},
ue: {
neType: 'SMF Object',
},
ims: {
neType: 'IMS Object',
},
},
perfManage: {
taskManage:{
taskId: 'Task ID',
neType: 'NE Type',
size: 'Measurement Dimensionality',
size: 'Time Granularity',
taskStatus: 'Task Status',
addUser: 'Creator',
addTime: 'Creation Time',
granulOption:'Particle',
granulOption:'Granularity',
performanceList:'Performance Set',
period:'Measurement period',
plan:'Measuring plan',
period:'Measuring Period',
plan:'Measuring Plan',
performanceSelect:'Please select a performance measurement dataset',
delPerfTip: 'Are you sure to delete the data item with record number {num}',
delPerf: 'Successfully deleted task {num}',
viewTask:'View Task',
editTask:'Edit Task',
addTask:'Add Task',
stopTask:'Stop Task',
stopTask:'Pending',
errorTaskInfo: 'Failed to obtain task information',
granulOptionPlease:'Please select the measurement granularity',
letupSure:'Confirm activation of task with number [{id}]?',
stopSure:'Confirm the pending task with number [{row.id}]?',
stopSure:'Confirm the pending task with number [{id}]?',
letUpWarning:'Prohibit activation of activated tasks',
stopWarning: 'Prohibit suspending inactive measurement tasks',
weekPlan:'Weekly Plan',
monthPlan:'Monthly Plan',
one:'Monday',
two:'Tuesday',
three:'Wednesday',
four:'Thursday',
five:'Friday',
six:'Saturday',
seven:'Sunday',
},
perfThreshold:{
thresholdValue:'Threshold Value',
@@ -546,7 +616,7 @@ export default {
errorThreInfo: 'Failed to obtain threshold information',
staticSet:'Statistical Settings',
threValue:'Threshold Value',
alarmLevel:'Alarm Level',
alarmLevel:'Severity',
status:'Status',
letupSure:'Confirm the performance threshold of activation number [{id}]?',
stopSure:'Confirm the performance threshold of the suspension number [{id}]?',
@@ -558,18 +628,25 @@ export default {
type:'NE Type',
neName:'Ne Name',
granulOption:'Granularity',
kpiCode:'Statistical Code',
kpiId:'Statistical Item',
kpiCode:'KPI Code',
kpiId:'KPI ID',
value:'Value',
startTime:'Start Time',
endTime:'End Time',
},
goldTarget:{
type:'NE Type',
enTitle:'Gold Indicator Item',
enTitle:'KPI ID',
value:'Value',
startTime:'Start Time',
endTime:'End Time',
particle: 'Granularity',
timeFrame: 'Time Range',
nullTip:'There are no statistical data within this time range',
kpiTitle:'KPI Statistics Chart',
allData:'Complete Data',
makeLine:'Statistical Chart',
time:'Time',
}
},
traceManage: {
@@ -578,11 +655,11 @@ export default {
imsiPlease: 'Please enter IMSI',
msisdn: 'MSISDN',
msisdnPlease: 'Please enter MSISDN',
trackTaskId: 'Tracking task tag',
srcIp: 'Source IP address',
dstIp: 'Destination IP address',
signalType: 'Signaling type',
msgDirect: 'Message Direct',
trackTaskId: 'Task ID',
srcIp: 'Source IP Address',
dstIp: 'Destination IP Address',
signalType: 'Signaling Type',
msgDirect: 'Message Direction',
msgType: 'Message Type',
rowTime: 'Record Time',
signalData: 'Signaling Data',
@@ -593,11 +670,11 @@ export default {
taskDownTip: 'Confirm downloading the signaling details HTML file?',
},
pcap: {
cardTitle: 'PCAP capture',
cardTitle: 'PCAP Capture',
neType: 'Type',
neTypePlease: 'Please select the type of network element',
neIp: 'IP address',
capArg: 'Capture parameters',
neIp: 'IP Address',
capArg: 'Capture Parameters',
capArgPlease: 'Please enter tcpdump any support parameters!',
capTime: 'Duration in seconds',
capTimePlease: 'Please enter the duration, up to 120 seconds',
@@ -612,7 +689,7 @@ export default {
execTimeout: 'Execution timeout',
execSuccess: 'Execution completed',
execFailed: 'Execution failed',
execBreak: 'break execution',
execBreak: 'Break Execution',
noFileName: 'Invalid file name',
execUPFStartA: 'Executed, please stop capturing packets according to the situation',
execUPFStart: 'Execution successful, please stop capturing packets according to the situation',
@@ -625,7 +702,7 @@ export default {
neTypePlease: 'Query network element type',
neType: 'NE Type',
neID: 'NE ID',
trackType: 'Tracing type',
trackType: 'Tracing Type',
trackTypePlease: 'Please select a tracing type',
creater: 'Created by',
startTime: 'Start Time',
@@ -636,20 +713,20 @@ export default {
imsi: 'IMSI',
imsiPlease: 'Please enter IMSI',
imsiTip: 'Mobile communication IMSI number',
srcIp: 'Source IP address',
srcIp: 'Source IP Address',
srcIpPlease: 'Please enter the source IP address',
srcIpTip: 'Current sender IPv4 address',
dstIp: 'Destination IP address',
dstIp: 'Destination IP Address',
dstIpPlease: 'Please enter the destination IP address',
dstIpTip: 'IPv4 address of the receiving end of the other party',
interfaces: 'Signaling interface',
interfaces: 'Signaling Interface',
interfacesPlease: 'Please enter the signaling interface',
signalPort: 'SignalPort',
signalPort: 'Signal Port',
signalPortPlease: 'Please enter the signaling port',
signalPortTip: 'Port corresponding to the interface',
rangePicker: 'Start End Time',
rangePicker: 'Start/End Time',
rangePickerPlease: 'Please select the start and end time of the task',
comment: 'Task description',
comment: 'Task Description',
commentPlease: 'Task description can be entered',
addTask: 'Add Task',
editTask: 'Modify Task',
@@ -677,17 +754,6 @@ export default {
mySelf: 'Personalization',
exportAll: 'Export All',
disPlayFilfter: 'Display Filters',
autoConfirm: 'Automatic Confirm',
critical:'Critical',
major:'Major',
minor:'Minor',
warning:'Warning',
eventAlarm:'Event',
communicationAlarm:'CommunicationAlarm',
equipmentAlarm:'EquipmentAlarm',
processingFailure:'ProcessingFailure',
environmentalAlarm:'EnvironmentalAlarm',
qualityOfServiceAlarm:'QualityOfServiceAlarm',
alarmId:'ID',
alarmTitle:'Title',
clearUser:'Clear User',
@@ -706,7 +772,7 @@ export default {
ackTime:'Ack Time',
ackError:'Please do not confirm again',
syncMyself:'Manual Synchronization',
realTitle:'Title',
realTitle:'English Title',
objectNf:'Object NE',
helpFile:'Help Documentation',
set:'Set',
@@ -723,12 +789,12 @@ export default {
exportSure:'Confirm whether to export all historical alarm information',
},
faultSetting:{
interfaceType:'Alarm forwarding interface class',
interfaceType:'Type',
email:'Email',
sms:'SMS',
save:'Save',
noChange:'There is no change in the alarm forwarding interface settings.',
forwardSet:'Alarm forwarding interface setting',
noChange:'There is no change in the alarm forwarding settings.',
forwardSet:'Alarm Forwarding Setting',
},
},
logManage:{
@@ -761,7 +827,21 @@ export default {
alarmInfo:'Alarm Content',
eventTime:'Generation Time',
logTime:'Record Time'
}
},
neFile: {
neType:'NE Type',
neTypePlease:'Please select NE Type',
nePath: "Directory Path",
fileMode: "File Mode",
owner: "Owner",
group: "Group",
size: "Size",
modifiedTime: "Modified Time",
fileName: "File Name",
downTip: "Confirm the download file name is [{fileName}] File?",
downTipErr: "Failed to get file",
dirCd: "Enter Dir",
},
},
monitor: {
session: {
@@ -792,24 +872,23 @@ export default {
network: 'Network',
loadDetail: "Load Factor",
resourceUsage: "Resource utilization rate",
read: 'retrieve',
write: 'write',
read: 'Read',
write: 'Write',
readWriteCount: 'Number of reads and writes',
count: 'substandard',
count: 'Substandard',
readWriteTime: 'Read/Write Delay',
up: 'up train',
down: 'down train',
up: 'Uplink',
down: 'Downlink',
},
online:{
mettingId:'Session Number',
account:'Account',
class:'Department',
host:'Host',
loginDes:'Login Location',
os:'OS',
lib:'Browser',
loginTime:'Log in time',
getOut:'Forced retreat',
loginTime:'Login Time',
getOut:'Forced Quit',
getOutSure:'Confirm the forced logout of the user whose login account is {userName} ?',
},
system:{
@@ -822,10 +901,10 @@ export default {
runTime:'Running Time',
cpuInfo:'CPU Information',
model:'Model',
hz:'Rate Hz',
hz:'Rate HZ',
cores:'Number of Cores',
usage:'Usage Rate (%)',
memory:'memory Information',
memory:'Memory Information',
totalMemory:'Total Memory',
lastMemory:'Remaining Memory',
proMemory:'Total process memory',
@@ -847,42 +926,38 @@ export default {
spaceUsage:'Space Usage (%)'
},
job: {
jobName: "Job Name",
jobName: "Name",
jobNamePlease: 'Please enter the task name correctly, limited to 2-50 characters',
jobGroup: "Job Group",
invokeTarget: "Invoke Target",
jobGroup: "Group",
invokeTarget: "Invoke",
invokeTargetPlease: 'Please enter the call target correctly, limited to 2-50 characters.',
invokeTargetTip: "Parameter description: support for preset incoming parameters, serialized processing parameters in the processor",
cronExpression: "Cron Expressions",
cronExpression: "Cron",
cronExpressionPlease: 'Please enter or generate a cron execution expression',
cronExpressionTip: "Example of an expression:0/20 * * * * ?",
cronExpressionTip1: "Illustrative example: Execute tasks every 20 seconds",
cronExpressionNew: "Generating Expressions",
cronExpressionNew: "Generating Expression",
status: "Status",
status0: "Disable",
status1: "Opens",
status00: "Pause",
status01: "Normalcy",
statusChange: "Are you sure you want the {text} {num} job?",
saveLog: "Recording log",
saveLog: "Log",
tipRowErr: "Errors in the recording of jobs",
viewInfoErr: "Failed to get job information",
viewJob: "Job Info",
addJob: "Add Job",
editJob: "Modify Job",
viewJob: "Task Info",
addJob: "Add Task",
editJob: "Modify Task",
runOne: "execute once",
runOneTip: "Are you sure you want to perform a [{num}] job right away?",
runOneTip: "Are you sure you want to perform a [{num}] task right away?",
runOneOk: "{num} Executed successfully",
delTip: "Are you sure you want to delete job number [{num}]?",
delTip: "Are you sure you want to delete task number [{num}]?",
delOk: "Deleted Successfully",
resetTip: "Sure you want to reset and refresh the scheduling job?",
resetTip: "Sure you want to reset and refresh the scheduling task?",
resetOk: "Reset Successful",
exportTip: "Confirm exporting xlsx table files based on search criteria?",
exportOk: "Completed Export",
resetQueue: "Reset Queue",
jobLog: "Job Log",
jobLog: "Task Log",
createTime: "CreateTime",
targetParams: "TargetParams",
targetParams: "Arguments",
targetParamsPlease: 'Call target incoming parameters, only support json strings',
misfirePolicy: "Error Strategy",
misfirePolicy1: "Immediate Implementation",
@@ -899,7 +974,7 @@ export default {
invokeTarget: "Invoke Target",
status: "Status",
status0: "Failures",
status1: "Normalcy",
status1: "Active",
createTime: "Create Time",
costTime: "Cost Time",
viewLog: "Scheduling log Info",
@@ -952,12 +1027,12 @@ export default {
},
system:{
user: {
userInfo:' User Info',
userInfo:'User Info',
userNum: 'User Number',
account: 'Account',
userName: 'User Name',
permission: 'Permission',
className: 'Class Name',
permission: 'Role',
className: 'Department',
loginIp: 'Login Address',
loginTime: 'Login Time',
status: 'Status',
@@ -968,9 +1043,9 @@ export default {
phoneTip:'Please enter the correct phone number',
resetPwd:'Reset Password',
start:'Enable',
stop:'Deactivate',
normalcy:'normalcy',
deactivate:'deactivate',
stop:'Pending',
normalcy:'Active',
deactivate:'Pending',
delSuss:'Successfully deleted',
sureTip:'Are you sure you want to {text} {userName} user?',
delSure:'Confirm deletion of data item with user ID {userId}?',
@@ -1018,13 +1093,14 @@ export default {
refreshCacheOk: "Refresh Cache Successful",
},
setting: {
charMaxLen: 'bit character length',
saveSubmit: 'Submit Save',
saveSuccess: 'Submit Save Successful',
revert: 'Vat',
revertSuccess: 'Vat Successful',
uploadFormat: 'Only the upload image format ({format}) is supported',
uploadSize: 'Image file size must be less than {size}MB',
charMaxLen: 'characters length',
saveSubmit: 'Submit&Save',
saveSuccess: 'Submit ands Save Successful',
revert: 'Reset',
revertSuccess: 'Reset Successful',
uploadFile: 'Upload File',
uploadFormat: 'Only the upload file format ({format}) is supported',
uploadSize: 'The file size must be less than {size}MB.',
uploadSuccess: 'File uploaded successfully, submit and save to take effect',
sysLogo: 'System Logo',
sysLogoBrand: 'Brand',
@@ -1034,18 +1110,16 @@ export default {
sysLogoTipContentUpload: 'Are you sure you want to upload the logo file?',
sysLogoInstruction: 'The system logo display style is shown in the preview area.',
sysLogoInstruction1: 'If you want to change the image, please adjust it accordingly before uploading.',
sysLogoInstruction2: 'Show the whole picture to the system logo area, please use transparent background, size ratio size',
sysLogoInstruction2: 'Show the whole picture to the system logo area, please use transparent background, size ratio',
sysLogoInstruction3: 'Displayed as logo + system name to the system logo area.',
sysLogoInstruction4: 'Logo size ratio size',
sysLogoInstruction4: 'Logo size ratio',
sysName: 'System Name',
sysNamePlease: 'Please enter the system name',
sysNameLimitation: 'System Name Restrictions',
sysNameTipContent: 'Confirm that you want to submit the current changed system name?',
sysCopyright: 'Copyright Notice',
sysCopyrightPlease: 'Please enter copyright notice',
sysCopyrightLimitation: 'Copyright Notice Limitation',
sysCopyrightTipContent: 'Confirmation of submitting a copyright notice for the current change?',
sysLoginBg: 'Login screen background',
sysLoginBg: 'Login Screen Background',
sysLoginBgNone: 'No background image',
sysLoginBgUpload: 'Upload background image',
sysLoginBgTipContentUpload: 'Confirmed to upload login screen background file?',
@@ -1054,6 +1128,22 @@ export default {
sysLoginBgInstruction: 'The background style of the system login interface is shown in the preview area, please refer to the actual display.',
sysLoginBgInstruction1: 'Please select the appropriate image for uploading.',
sysLoginBgInstruction2: 'Restore the background image to the initial system default background by clicking the Restore button.',
sysHelpDoc: 'System User Documentation',
sysHelpDocTipContentUpload: 'Are you sure you want to upload the system documentation?',
sysHelpDocTipContent: 'Confirm that you want to submit system usage documentation for the current [{lang}] change?',
sysHelpDocOpen: 'Document Access',
sysHelpDocInstruction: 'Description of system functions and use, PDF document manual',
sysOfficialUrl: 'Official Link',
sysOfficialUrlErrTip: 'Please fill in a valid link address http(s)://',
sysOfficialUrlTipContent: 'Do you confirm that you want to submit the current change of the official website address?',
sysOfficialUrlNo: 'No link address',
sysOfficialUrlOpen: 'Open the official website.',
sysOfficialUrlInstruction: 'Official website link address',
sysOfficialUrlInstruction1: 'start, if you need to hide do not jump to fill in the',
i18n: "Internationalization Switch",
i18nOpen: "Display Switch",
i18nDefault: "Default Languages",
i18nInstruction: 'Whether to display the internationalization switch and set the system default language',
},
role:{
allScopeOptions:'All data permissions',
@@ -1071,7 +1161,7 @@ export default {
roleInfo:'Role information',
distribute:'Assign data permissions',
open:'Enable',
close:'Deactivate',
close:'Pending',
statusSure:'Are you sure you want {text} {roleName} role?',
statusFailed:'{roleName} {text} failed',
delSure:'Confirm to delete the data item with role number [{roleId}]?',
@@ -1082,8 +1172,8 @@ export default {
openSwitch:'Expand/Collapse',
selAllSwitch:'Select all/Deselect all',
relationSwitch:'Father and son linkage',
normal:'Normal',
stop:'Pause',
normal:'Active',
stop:'Pending',
preScope:'Scope of authority',
dataPer:'Data permission',
userId:'User Number',
@@ -1134,7 +1224,7 @@ export default {
},
log:{
operate:{
operId:'Log Number',
operId:'ID',
moduleName:'Module Name',
workType:'Business Type',
operUser:'Operator',
@@ -1176,7 +1266,7 @@ export default {
},
},
menu:{
menuInfo:'Menu Information',
menuInfo:' Menu Information',
menuName:'Menu Name',
menuId:'Menu Number',
menuSort:'Menu Sort',
@@ -1206,7 +1296,7 @@ export default {
pathTip:`The accessed routing address, such as: user, /auth 1. If the network address requires internal access, start with http(s):// Menu behavior (root node): The current window opens the menu behavior, (non-root node) :Embedded window. 2. If the network address requires external access, set the internal address option to No. Menu behavior: Open a new tab 3. If the embedded subpage needs to hide the page, set the display status option to Hide address splicing to embed routing. address`,
sonPage:'Subpage address',
componentTip:' The component path accessed by views in the page component directory, such as: system/user/index Note: The routing address without the .vue file suffix is the network address and can be filled in as a link',
perms:`Permission identification example: monitor:server:query Permission identification is used in the back-end controller, such as: @PreAuthorize({ hasPermissions: ['monitor:server:query'] }) Permission identification is used in the front-end Vue page, such as: v-perms:has="['monitor:server:query']"`
perms:`Permission identification example: monitor:server:query Permission identification is used in the back-end controller, such as:['monitor:server:query'] Permission identification is used in the front-end Vue page, such as: v-perms:has="['monitor:server:query']"`
},
dict:{
dictInfo:'Dictionary Type Information',
@@ -1223,6 +1313,7 @@ export default {
dictData:'Dictionary Data',
reload:'Refresh Cache',
mark:'Dictionary Description',
colorSelect:'Color Picker',
},
dictData: {
dictType: "Dictionary name",
@@ -1250,23 +1341,27 @@ export default {
},
},
mmlManage: {
operationtitle: "Interface Settings",
cmdTitle: "Command Navigator",
cmdConsole: "consoles",
cmdOpTip: "Select the item to be operated in the left command navigation!",
cmdNoTip: "{num} no optional command operation",
require: "Mandatory parameter: {num}",
requireUn: "{display} input value is of unknown type",
requireString: "The {display} parameter value does not make sense.",
requireString: "The {display} parameter value is invalid.",
requireInt: "{display} Parameter value not in reasonable range {filter}",
requireIpv4: "{display} not a legitimate IPV4 address",
requireIpv6: "{display} Not a legitimate IPV6 address.",
requireEnum: "{display} is not a reasonable enumeration value.",
requireBool: "{display} is not a reasonable boolean value.",
clearForm: "Clear Forms",
clearLog: "Clearing logs",
cmdQuickEntry: "Command Quick Entry",
cmdParamPanel: "Parameter Panel",
clearForm: "Reset",
clearLog: "Clear Logs",
exec: "Execute",
cmdAwait: "Waiting for a command to be sent",
uploadFileTip: 'Are you sure you want to upload the file?',
uploadFileOk: 'File Upload Successful',
uploadFileErr: 'File Upload Failed',
omcOperate:{
noOMC: "No OMC network elements",
},
@@ -1274,6 +1369,7 @@ export default {
noUDM: "No UDM network elements",
},
mmlSet: {
operationtitle: "Interface Settings",
saveText: "Save Settings",
ipadd: "Listening to IP addresses",
ipaddPlease: "Please enter the listening IP address",
@@ -1283,5 +1379,12 @@ export default {
noChange: "No change in interface settings",
},
},
tool: {
help: {
download: "Download",
pdfViewer: "In-browser preview",
pdfViewerErr: "Sorry, your browser does not support PDF preview!",
}
},
},
};

View File

@@ -8,14 +8,14 @@ export default {
title: '核心网管理平台',
desc: '核心网管理平台',
loading: '请稍等...',
ipnutPlease: '请输入',
inputPlease: '请输入',
selectPlease: '请选择',
tipTitle: '提示',
msgSuccess: '{msg} 成功',
errorFields: '请正确填写 {num} 处必填信息!',
tablePaginationTotal: '总共 {total} 条',
noData: "暂无数据",
zebraL:'表格斑马纹',
zebra:'表格斑马纹',
ok: '确定',
cancel: '取消',
close: '关闭',
@@ -36,6 +36,8 @@ export default {
searchBarText: '搜索栏',
tableStripedText: '表格斑马纹',
reloadText: '刷新',
columnSetText: '列设置',
columnSetTitle: '列展示/排序',
sizeText: '密度',
size: {
default: '默认',
@@ -124,6 +126,11 @@ export default {
// 静态路由
router: {
index: "主页",
login: "登录",
register: '注册',
page403: '没有访问权限',
page404: '找不到匹配页面',
helpDoc: '系统使用文档',
account: {
index: "个人中心",
profile: "个人信息",
@@ -151,18 +158,23 @@ export default {
// 布局
loayouts: {
basic: {
officialUrl: '官网',
helpDoc: '使用手册',
},
rightContent: {
helpDoc: "系统使用文档",
fullscreen: "全屏显示",
logout: "退出登录",
profile: "个人中心",
settings: "个人设置",
},
tabs: {
reload: "刷新当前",
reload: "刷新当前标签",
more: "更多选项",
closeCurrent: "关闭当前",
closeOther: "关闭其他",
closeAll: "关闭全部",
closeCurrent: "关闭当前标签",
closeOther: "关闭其他标签",
closeAll: "关闭全部标签",
}
},
@@ -323,6 +335,7 @@ export default {
mac:'网元物理地址',
macTip:'能够定位网元的物理地址(MAC)',
port:'端口',
portTip:'最大范围0~65535',
pvflag:'网元虚拟化标识',
pnf:'物理网元',
vnf:'虚拟网元',
@@ -341,6 +354,9 @@ export default {
server:'服务器文件',
local:'本地文件',
fileSelect:'请选择当前导入文件',
sync:'同步到网元',
open:'开',
close:'关',
},
backupManage: {
setBackupTask: '设置自动备份时间',
@@ -386,9 +402,10 @@ export default {
backVersions:'回退前版本',
status:'状态',
letUpTime:'激活时间',
creatTime:'创建时间',
createTime:'创建时间',
onlyAble:'只支持上传文件格式 {fileText}',
nullData:'暂无网元列表数据',
nullVersion:'当前网元无可回退版本',
},
license: {
neTypePlease: '选择网元类型',
@@ -429,6 +446,8 @@ export default {
addSure:'确认提交新增 Index :【{value}】 的记录吗?',
},
configParamForm: {
treeTitle: "配置导航",
treeSelectTip: "左侧配置导航中选择配置项信息!",
neType: "网元类型",
neTypePleace: "请选择网元类型",
noConfigData: "暂无配置项数据",
@@ -447,8 +466,8 @@ export default {
requireEnum: "{display} 不是合理的枚举值",
requireBool: "{display} 不是合理的布尔类型的值",
editOkTip: "确认更新该{num}属性值吗?",
updateItemTip: "确认更新Index为 【{num}】 的数据项?",
delItemTip: "确认删除Index为 【{num}】 的数据项?",
updateItemTip: "确认更新Index为 【{num}】 的数据项",
delItemTip: "确认删除Index为 【{num}】 的数据项",
arrayMore: "展开",
},
},
@@ -456,58 +475,100 @@ export default {
auth: {
authInfo:'鉴权信息',
neTypePlease: '查询网元类型',
neType: 'UDM网元类型',
neType: 'UDM网元对象',
export: '导出',
exportConfirm: '确认导出全部鉴权用户数据吗?',
exportConfirm: '确认导出全部鉴权用户数据吗',
checkExport : '勾选导出',
checkExportConfirm: '确认导出已勾选的鉴权用户数据吗?',
import: '导入',
loadDataConfirm: '确认要重新加载数据吗?',
loadData: '更新数据',
loadDataTip: '成功获取更新数据:{num}条,系统内部进行数据更新,请勿重复点击获取更新!!!',
num: '放号数',
loadDataConfirm: '确认要重新加载数据吗',
loadData: '加载数据',
loadDataTip: '成功获取加载数据:{num}条,系统内部正在进行数据更新。加载结束后可点击重置刷新数据列表,请勿重复点击获取更新!!!',
startIMSI: '起始IMSI',
batchAddText: '批量新增',
batchDelText: '批量删除',
delNum:'删除个数',
imsiTip:' SUPI=MCC+MNC+MSIN MCC=移动国家号码, 由三位数字组成 MNC=移动网络号,由两位数字组成 MSIN=移动客户识别码,采用等长10位数字构成',
delSure:'确认删除IMSI编号为: {imsi} 的用户嘛?',
noListData:'暂无网元列表数据',
numAdd: '放号个数',
numDel:'删除个数',
checkDel:'勾选删除',
imsiTip: 'IMSI=MCC+MNC+MSIN',
imsiTip1: 'MCC=移动国家号码, 由三位数字组成',
imsiTip2: 'MNC=移动网络号,由两位数字组成',
imsiTip3: 'MSIN=移动客户识别码采用等长10位数字构成',
amfTip: '鉴权管理域,参数最大长度为 4',
algoIndexTip: '算法索引介于0到15之间',
kiTip: '用户签权密钥信息,最大长度为32',
opcTip: '鉴权秘钥OPC是由Ki和OP经过计算得来的OP为运营商的根秘钥ki是鉴权秘钥,最大长度为32',
delSure:'确认删除IMSI编号为: {imsi} 的用户吗?',
},
sub: {
subInfo:'签约信息',
neTypePlease: '查询网元类型',
neType: 'UDM网元类型',
export: '导出',
exportConfirm: '确认导出全部签约用户数据吗?',
exportConfirm: '确认导出全部签约用户数据吗',
checkExport : '勾选导出',
checkExportConfirm: '确认导出已勾选的签约用户数据吗?',
import: '导入',
loadDataConfirm: '确认要重新加载数据吗?',
loadData: '更新数据',
loadDataTip: '成功获取更新数据:{num}条,系统内部进行数据更新,请勿重复点击获取更新!!!',
num: '删除个数',
loadDataConfirm: '确认要重新加载数据吗',
loadData: '加载数据',
loadDataTip: '成功获取加载数据:{num}条,系统内部正在进行数据更新。加载结束后可点击重置刷新数据列表,请勿重复点击获取更新!!!',
numAdd: '放号个数',
numDel: '删除个数',
checkDel:'勾选删除',
batchAddText: '批量新增',
batchDelText: '批量删除',
enable:'开启',
disable:'关闭',
startIMSI: '起始IMSI',
msisdnTip:'参数最大长度{msg}',
arfbTip:'限制区域模板,在模板指定的限制区域中,UE 不允许与网络通信',
sarTip:'服务区域限制模板,定义允许的区域,UE在这些区域中可以和网络通信;定义不允许的区,UE和网络在这些区域中,不允许发起Service Request 或 SM信令来获取用户服务',
micoTip:'签约的MICO业务标志位',
rfspTip:'RFSP 索引,在 NG-RAN中,特定RRM配置的索引,参数介于0到127之间',
epsFlagTip:'是否开启4G EPS 服务,0=不开启,1=开启',
contextIdTip:'签约APN 上下文ID,必须从APN Context list 中选择',
staticIpTip:'指定手机用户上网时使用的静态IP地址,为"-"时表示使用动态IP地址',
epsOdbTip:'ODB(Operator-Determined Barring)运营商决定的闭锁,即用户接入EPS网络的业务能力由运营商决定.选中 ---对应服务被允许 未选 --- 对应服务被禁止',
hplmnOdbTip:'HPLMN-ODB归属运营商决定的闭锁,即用户接入EPS网络的业务能力由用户归宿运营商决定.选中 --- 对应服务被允许 未选 -- 对应服务被禁止',
imsiTip: 'IMSI=MCC+MNC+MSIN',
imsiTip1: 'MCC=移动国家号码, 由三位数字组成',
imsiTip2: 'MNC=移动网络号,由两位数字组成',
imsiTip3: 'MSIN=移动客户识别码采用等长10位数字构成',
msisdnTip: '参数最大长度 {num}',
inputTip: '参数最大长度为 {num}',
arfbTip: '限制区域模板在模板指定的限制区域中UE 不允许与网络通信',
sarTip: '服务区域限制模板定义允许的区域UE 在这些区域中可以和网络通信定义不允许的区UE 和网络在这些区域中不允许发起Service Request 或 SM 信令来获取用户服务',
micoTip: '签约的 MICO 业务标志位',
rfspTip:'RFSP 索引,在 NG-RAN 中,特定 RRM 配置的索引,参数介于0到127之间',
ueTypeTip: '运营商定义的用户 UE Usage Type整型参数介于0到127之间',
epsFlagTip: '是否开启4G EPS 服务',
contextIdTip: '签约APN 上下文ID必须从APN Context list 中选择。',
apnContextTip: '手机可用的APN列表最多六个在HSS中定义。',
staticIpTip: '指定手机用户上网时使用的静态IP地址,为"-"时表示使用动态IP地址',
epsOdbTip: 'ODB(Operator-Determined Barring)运营商决定的闭锁,即用户接入EPS网络的业务能力由运营商决定.选中 ---对应服务被允许 未选 --- 对应服务被禁止',
hplmnOdbTip: 'HPLMN-ODB归属运营商决定的闭锁,即用户接入EPS网络的业务能力由用户归宿运营商决定.选中 --- 对应服务被允许 未选 -- 对应服务被禁止',
ardTip:'接入控制标志(Access-Restriction-Data),可用于区分2G/3G/LTE用户,便于为2G/3G/LTE网络共存时,对不同类型用户进行区分服务',
},
pcf: {
neType: 'PCF网元对象',
export: '导出',
exportConfirm: '确认导出全部用户策略控制信息数据吗?',
import: '导入',
addTitle: '新增策略控制信息',
updateTitle: '{imsi} 策略控制信息',
startIMSI: '起始IMSI',
batchAddText: '批量新增',
batchDelText: '批量删除',
batchUpdateText: '批量更新',
batchNum: '批量个数',
imsiTip: 'IMSI=MCC+MNC+MSIN',
imsiTip1: 'MCC=移动国家号码, 由三位数字组成',
imsiTip2: 'MNC=移动网络号,由两位数字组成',
imsiTip3: 'MSIN=移动客户识别码采用等长10位数字构成',
delSure:'确认删除IMSI编号为: {imsi} 的用户吗?',
uploadFileOk: '文件上传成功',
uploadFileErr: '文件上传失败',
},
base5G: {
neTypePlease: '查询网元类型',
neType: 'AMF网元类型',
neType: 'AMF网元对象',
},
n3iwf: {
neType: 'N3IWF网元对象',
},
ue: {
neTypePlease: '查询网元类型',
neType: 'SMF网元类型',
neType: 'SMF网元对象',
},
ims: {
neTypePlease: '查询网元类型',
neType: 'IMS网元类型',
neType: 'IMS网元对象',
},
},
perfManage: {
@@ -535,6 +596,15 @@ export default {
stopSure:'确认挂起编号为 【{id}】 的任务?',
letUpWarning:'禁止激活已激活的任务',
stopWarning:'禁止挂起未激活的测量任务',
weekPlan:'周计划',
monthPlan:'月计划',
one:'星期一',
two:'星期二',
three:'星期三',
four:'星期四',
five:'星期五',
six:'星期六',
seven:'星期天',
},
perfThreshold:{
thresholdValue:'门限值',
@@ -569,7 +639,14 @@ export default {
enTitle:'黄金指标项',
value:'值',
startTime:'开始时间',
endTime:'结束时间'
endTime:'结束时间',
particle:'颗粒度',
timeFrame:'时间范围',
nullTip:'此时间范围内没有统计数据',
kpiTitle:'KPI统计图表',
allData:'完整统计数据',
makeLine:'统计图',
time:'时间',
}
},
traceManage: {
@@ -677,17 +754,6 @@ export default {
mySelf: '个性化设置',
exportAll: '导出全部',
disPlayFilfter: '显示过滤',
autoConfirm: '自动确认配置',
critical:'严重告警',
major:'主要告警',
minor:'次要告警',
warning:'警告告警',
eventAlarm:'事件告警',
communicationAlarm:'通信告警',
equipmentAlarm:'设备告警',
processingFailure:'处理错误告警',
environmentalAlarm:'环境告警',
qualityOfServiceAlarm:'服务质量告警',
alarmId:'告警唯一标识',
alarmTitle:'告警名称',
clearUser:'告警清除用户',
@@ -723,7 +789,7 @@ export default {
exportSure:'确认是否导出全部历史告警信息?',
},
faultSetting:{
interfaceType:'告警前转接口类型',
interfaceType:'类型',
email:'Email',
sms:'SMS',
save:'保存设置',
@@ -761,7 +827,21 @@ export default {
alarmInfo:'告警内容',
eventTime:'告警产生时间',
logTime:'记录时间'
}
},
neFile: {
neType:'网元',
neTypePlease:'请选择网元',
nePath: "目录路径",
fileMode: "文件权限",
owner: "所属用户",
group: "所属组",
size: "文件大小",
modifiedTime: "修改时间",
fileName: "文件名称",
downTip: "确认下载文件名为 【{fileName}】 文件?",
downTipErr: "文件获取失败",
dirCd: "进入目录",
},
},
monitor: {
session: {
@@ -803,7 +883,6 @@ export default {
online:{
mettingId:'会话编号',
account:'登录账号',
class:'所属部门',
host:'登录主机',
loginDes:'登录地点',
os:'操作系统',
@@ -859,10 +938,6 @@ export default {
cronExpressionTip1: "示例说明每20秒执行任务",
cronExpressionNew: "生成表达式",
status: "状态",
status0: "关闭",
status1: "开启",
status00: "暂停",
status01: "正常",
statusChange: "确定要{text} {num} 任务吗?",
saveLog: "记录日志",
tipRowErr: "任务记录存在错误",
@@ -1023,8 +1098,9 @@ export default {
saveSuccess: '提交保存成功',
revert: '还原',
revertSuccess: '还原成功',
uploadFormat: '只支持上传图片格式({format}',
uploadSize: '图片文件大小必须小于 {size}MB',
uploadFile: '上传文件',
uploadFormat: '只支持上传文件格式({format}',
uploadSize: '文件大小必须小于 {size}MB',
uploadSuccess: '文件上传成功,提交保存生效',
sysLogo: '系统LOGO',
sysLogoBrand: '全图',
@@ -1038,11 +1114,9 @@ export default {
sysLogoInstruction3: '以LOGO+系统名称的形式展示到系统LOGO区域。',
sysLogoInstruction4: 'LOGO尺寸比例大小',
sysName: '系统名称',
sysNamePlease: '请输入系统名称',
sysNameLimitation: '系统名称限制',
sysNameTipContent: '确认要提交当前变更的系统名称吗?',
sysCopyright: '版权声明',
sysCopyrightPlease: '请输入版权声明',
sysCopyrightLimitation: '版权声明限制',
sysCopyrightTipContent: '确认要提交当前变更的版权声明吗?',
sysLoginBg: '登录界面背景',
@@ -1054,6 +1128,22 @@ export default {
sysLoginBgInstruction: '系统登录界面背景样式如预览区域所示,请以实际显示为准',
sysLoginBgInstruction1: '请将选择合适的图片进行进行上传。',
sysLoginBgInstruction2: '通过点击《还原》按钮,将背景图还原到系统初始默认的背景。',
sysHelpDoc: '系统使用文档',
sysHelpDocTipContentUpload: '确认要上传系统使用文档吗?',
sysHelpDocTipContent: '确认要提交当前【{lang}】变更的系统使用文档吗?',
sysHelpDocOpen: '文档查阅',
sysHelpDocInstruction: '系统功能及使用说明PDF文档手册',
sysOfficialUrl: '官网链接',
sysOfficialUrlErrTip: '请填写有效的链接地址 http(s)://',
sysOfficialUrlTipContent: '确认要提交当前变更的官网地址吗?',
sysOfficialUrlNo: '无链接地址',
sysOfficialUrlOpen: '打开官网',
sysOfficialUrlInstruction: '官网链接地址',
sysOfficialUrlInstruction1: '开头,如需隐藏不跳转填写',
i18n: "国际化切换",
i18nOpen: "显示切换",
i18nDefault: "默认语言",
i18nInstruction: '是否显示国际化切换,设置系统默认语言',
},
role:{
allScopeOptions:'全部数据权限',
@@ -1206,7 +1296,7 @@ export default {
pathTip:`访问的路由地址,如:user、/auth 1. 如网络地址需内部访问 则以 http(s):// 开头菜单行为(根节点):当前窗口打开 菜单行为,(非根节点):内嵌窗口.2. 如网络地址需外部访问则将内部地址选项设为否菜单行为:打开新标签3. 如内嵌子页面需要隐藏页面则将显示状态选项设为隐藏地址拼接以内嵌路由地址`,
sonPage:'子页面地址',
componentTip:' 页面组件目录 views 访问的组件路径,如:system/user/index 注意:不带 .vue 文件后缀路由地址是网络地址可填入链接',
perms:`权限标识示例:monitor:server:query 后端控制器中使用权限标识,如:@PreAuthorize({ hasPermissions: ['monitor:server:query'] }) 前端vue页面中使用权限标识,如:v-perms:has="['monitor:server:query']"`
perms:`权限标识示例:monitor:server:query 后端控制器中使用权限标识,如:['monitor:server:query'] 前端vue页面中使用权限标识,如:v-perms:has="['monitor:server:query']"`
},
dict:{
dictInfo:'字典类型信息',
@@ -1223,6 +1313,7 @@ export default {
dictData:'字典数据',
reload:'刷新缓存',
mark:'字典说明',
colorSelect:'取色器',
},
dictData: {
dictType: "字典名称",
@@ -1262,10 +1353,15 @@ export default {
requireIpv6: "{display} 不是合法的IPV6地址",
requireEnum: "{display} 不是合理的枚举值",
requireBool: "{display} 不是合理的布尔类型的值",
clearForm: "清除表单",
cmdQuickEntry: "命令快速输入",
cmdParamPanel: "参数面板",
clearForm: "重置",
clearLog: "清除日志",
exec: "执行",
cmdAwait: "等待发送命令",
uploadFileTip: '确认要上传文件吗?',
uploadFileOk: '文件上传成功',
uploadFileErr: '文件上传失败',
omcOperate:{
noOMC: "暂无OMC网元",
},
@@ -1283,5 +1379,12 @@ export default {
noChange: "接口设置无变更",
},
},
tool: {
help: {
download: "下载",
pdfViewer: "浏览器内预览",
pdfViewerErr: "很抱歉,您的浏览器不支持 PDF 预览!",
}
},
},
};

View File

@@ -4,7 +4,8 @@ import {
WaterMark,
getMenuData,
clearMenuItem,
} from '@ant-design-vue/pro-layout';
MenuDataItem,
} from 'antdv-pro-layout';
import RightContent from './components/RightContent.vue';
import Tabs from './components/Tabs.vue';
import { scriptUrl } from '@/assets/js/icon_font_8d5l8fzk5b87iudi';
@@ -22,7 +23,8 @@ import { getServerTime } from '@/api';
import { RESULT_CODE_SUCCESS } from '@/constants/result-constants';
import { onMounted } from 'vue';
import { parseDateToStr } from '@/utils/date-utils';
const { t } = useI18n();
import { parseUrlPath } from '@/plugins/file-static-url';
const { t, currentLocale } = useI18n();
const routerStore = useRouterStore();
const tabsStore = useTabsStore();
const appStore = useAppStore();
@@ -85,7 +87,7 @@ const breadcrumb = computed(() => {
.map(item => {
return {
path: item.path,
breadcrumbName: fnLocale(item.meta.title || '-'),
breadcrumbName: fnLocale(item),
};
});
});
@@ -120,10 +122,51 @@ function fnComponentSetName(component: any, to: any) {
// 清空导航栏标签
tabsStore.clear();
// LOGO地址
const logoUrl = computed(() => {
let url =
appStore.logoType === 'brand'
? parseUrlPath(appStore.filePathBrand)
: parseUrlPath(appStore.filePathIcon);
if (url.indexOf('{language}') === -1) {
return url;
}
// 语言参数替换
const local = currentLocale.value;
const lang = local.split('_')[0];
return url.replace('{language}', lang);
});
// 系统使用手册地址
const helpDocUrl = computed(() => {
let url = parseUrlPath(appStore.helpDoc);
if (url.indexOf('{language}') === -1) {
return url;
}
// 语言参数替换
const local = currentLocale.value;
const lang = local.split('_')[0];
return url.replace('{language}', lang);
});
/**系统使用手册跳转 */
function fnClickHelpDoc(language?: string) {
const routeData = router.resolve({ name: 'HelpDoc' });
let href = routeData.href;
if (language) {
href = `${routeData.href}?language=${language}`;
}
window.open(href, '_blank');
}
/**
* 国际化翻译转换
*/
function fnLocale(title: string) {
function fnLocale(m: MenuDataItem) {
if (!m.meta) return;
let title = m.meta?.title ?? '';
if (title.indexOf('router.') !== -1) {
title = t(title);
}
@@ -132,52 +175,50 @@ function fnLocale(title: string) {
//
onMounted(() => {
// fnGetServerTime();
fnGetServerTime();
useAlarmStore().fnGetActiveAlarmInfo();
});
// ==== 服务器时间显示 start
// let serverTime = reactive({
// timestamp: 0,
// zone: '', // 时区 UTC
// str: '', // 年月日时分秒
// interval: 0 as any, // 定时器
// });
let serverTime = reactive({
timestamp: 0,
zone: 'UTC', // 时区 UTC
interval: 0 as any, // 定时器
});
// // 获取服务器时间
// function fnGetServerTime() {
// getServerTime().then(res => {
// if (res.code === RESULT_CODE_SUCCESS && res.data) {
// // 时间戳
// serverTime.timestamp = parseInt(res.data.timestamp);
// serverTime.interval = setInterval(() => {
// serverTime.timestamp += 1000;
// serverTime.str = parseDateToStr(serverTime.timestamp);
// }, 1000);
// 获取服务器时间
function fnGetServerTime() {
getServerTime().then(res => {
if (res.code === RESULT_CODE_SUCCESS && res.data) {
const serverTimeDom = document.getElementById('serverTimeDom');
// 时间戳
serverTime.timestamp = parseInt(res.data.timestamp);
serverTime.interval = setInterval(() => {
serverTime.timestamp += 1000;
// serverTimeStr.value = parseDateToStr(serverTime.timestamp);
// 用DOM直接修改
if (serverTimeDom) {
serverTimeDom.innerText = parseDateToStr(serverTime.timestamp);
}
}, 1000);
// // 时区
// const offsetHours = res.data.timeZone / 3600;
// if (offsetHours === 0) {
// serverTime.zone = 'UTC';
// } else if (offsetHours > 0) {
// serverTime.zone = `UTC +${offsetHours}`;
// } else {
// serverTime.zone = `UTC ${offsetHours}`;
// }
// }
// });
// }
// 时区
const offsetHours = res.data.timeZone / 3600;
serverTime.zone = `UTC ${offsetHours}`;
}
});
}
// 监听可视改变
document.addEventListener('visibilitychange', function () {
if (document.visibilityState == 'hidden') {
//切离该页面时执行
// clearInterval(serverTime.interval);
clearInterval(serverTime.interval);
}
if (document.visibilityState == 'visible') {
//切换到该页面时执行
// clearInterval(serverTime.interval);
// fnGetServerTime();
clearInterval(serverTime.interval);
fnGetServerTime();
useAlarmStore().fnGetActiveAlarmInfo();
}
});
@@ -191,7 +232,7 @@ document.addEventListener('visibilitychange', function () {
v-model:selectedKeys="layoutState.selectedKeys"
v-model:openKeys="layoutState.openKeys"
:menu-data="menuData"
:breadcrumb="{ routes: breadcrumb }"
:breadcrumb="{ routes: breadcrumb } as any"
disable-content-margin
v-bind="proConfig"
:iconfont-url="scriptUrl"
@@ -209,7 +250,7 @@ document.addEventListener('visibilitychange', function () {
>
<img
class="logo-icon"
:src="appStore.getLOGOIcon"
:src="logoUrl"
:alt="appStore.appName"
:title="appStore.appName"
/>
@@ -220,7 +261,7 @@ document.addEventListener('visibilitychange', function () {
<template v-if="appStore.logoType === 'brand'">
<img
class="logo-brand"
:src="appStore.getLOGOBrand"
:src="logoUrl"
:alt="appStore.appName"
:title="appStore.appName"
/>
@@ -270,16 +311,25 @@ document.addEventListener('visibilitychange', function () {
<!--插槽-内容底部-->
<template #footerRender="{ width }">
<footer class="footer">
&nbsp;
<div class="footer-fixed" :style="{ width }">
<div>
<div style="flex: 1;">
<span>{{ appStore.copyright }}</span>
</div>
<div>
<span class="footer-time">
<!-- {{ serverTime.str }} {{ serverTime.zone }} -->
</span>
</div>
<a-space direction="horizontal" :size="8">
<span id="serverTimeDom"></span>
<a-button
type="link"
:href="appStore.officialUrl"
target="_blank"
size="small"
v-if="appStore.officialUrl !== '#'"
>
{{ t('loayouts.basic.officialUrl') }}
</a-button>
<a-button type="link" size="small" @click="fnClickHelpDoc()">
{{ t('loayouts.basic.helpDoc') }}
</a-button>
</a-space>
</div>
</footer>
</template>
@@ -314,9 +364,8 @@ document.addEventListener('visibilitychange', function () {
.footer {
z-index: 16;
margin: 0px;
width: auto;
margin-top: 48px;
padding: 4px 16px;
width: auto;
margin-top: 52px;
&-fixed {
position: fixed;
bottom: 0;
@@ -330,9 +379,10 @@ document.addEventListener('visibilitychange', function () {
background: #fff;
box-shadow: 0 1px 4px #0015291f;
transition: background 0.3s, width 0.2s;
height: 32px;
}
&-time {
& #serverTimeDom {
color: #00000085;
transition: all 0.3s;
}

View File

@@ -1,12 +1,15 @@
<script setup lang="ts">
import { MenuInfo } from 'ant-design-vue/lib/menu/src/interface';
import { useRouter } from 'vue-router';
import { toggle, isFullscreen } from '@/utils/fullscreen-utils';
import { useFullscreen } from '@vueuse/core';
import useI18n from '@/hooks/useI18n';
import useAppStore from '@/store/modules/app';
import useUserStore from '@/store/modules/user';
import useAlarmStore from '@/store/modules/alarm';
const { t, changeLocale } = useI18n();
const { isFullscreen, toggle } = useFullscreen();
const { t, changeLocale, optionsLocale } = useI18n();
const userStore = useUserStore();
const appStore = useAppStore();
const router = useRouter();
/**头像展开项点击 */
@@ -29,6 +32,16 @@ function fnClickAlarm() {
router.push({ path: '/faultManage/active-alarm' });
}
/**系统使用手册跳转 */
function fnClickHelpDoc(language?: string) {
const routeData = router.resolve({ name: 'HelpDoc' });
let href = routeData.href;
if (language) {
href = `${routeData.href}?language=${language}`;
}
window.open(href, '_blank');
}
/**改变多语言 */
function fnChangeLocale(e: any) {
changeLocale(e.key);
@@ -49,25 +62,39 @@ function fnChangeLocale(e: any) {
</template>
</a-button>
<a-tooltip>
<a-tooltip placement="bottom">
<template #title>{{ t('loayouts.rightContent.helpDoc') }}</template>
<a-button type="text" @click="fnClickHelpDoc()">
<template #icon>
<QuestionCircleOutlined />
</template>
</a-button>
</a-tooltip>
<a-tooltip placement="bottom">
<template #title>{{ t('loayouts.rightContent.fullscreen') }}</template>
<a-button type="text" @click="toggle">
<template #icon>
<FullscreenExitOutlined v-if="isFullscreen()" />
<FullscreenExitOutlined v-if="isFullscreen" />
<FullscreenOutlined v-else />
</template>
</a-button>
</a-tooltip>
<a-dropdown :trigger="['click', 'hover']">
<a-dropdown
placement="bottom"
:trigger="['click', 'hover']"
v-if="appStore.i18nOpen"
>
<a-button size="small" type="default">
{{ t('i18n') }}
<DownOutlined />
</a-button>
<template #overlay>
<a-menu @click="fnChangeLocale">
<a-menu-item key="zh_CN">中文</a-menu-item>
<a-menu-item key="en_US">English</a-menu-item>
<a-menu-item v-for="opt in optionsLocale" :key="opt.value">
{{ opt.label }}
</a-menu-item>
</a-menu>
</template>
</a-dropdown>

View File

@@ -4,7 +4,7 @@ import App from './App.vue';
import router from './router';
import directive from './directive';
import i18n from './i18n';
import '@ant-design-vue/pro-layout/dist/style.css';
import 'antdv-pro-layout/dist/style.css';
import 'ant-design-vue/dist/antd.variable.min.css';
const app = createApp(App);

View File

@@ -0,0 +1,21 @@
import { sessionGet } from '@/utils/cache-session-utils';
import { validHttp } from '@/utils/regular-utils';
/**
* 解析资源文件绝对路径 http
* @param path 服务端资源文件
* @returns
*/
export function parseUrlPath(path: string) {
if (!path || path === '#') {
return '#';
}
if (validHttp(path)) {
return path;
}
// 兼容旧前端可改配置文件
const baseUrl = import.meta.env.PROD
? sessionGet('baseUrl') || import.meta.env.VITE_API_BASE_URL
: import.meta.env.VITE_API_BASE_URL;
return `${baseUrl}${path}?r=${Math.random().toFixed(2)}`;
}

View File

@@ -82,6 +82,9 @@ type OptionsType = {
signal?: AbortSignal;
};
// 多语言处理
export const language = localGet(CACHE_LOCAL_I18N) || 'en_US';
// 兼容旧前端可改配置文件
const baseUrl = import.meta.env.PROD
? sessionGet('baseUrl') || import.meta.env.VITE_API_BASE_URL
@@ -90,7 +93,7 @@ const baseUrl = import.meta.env.PROD
/**默认请求参数 */
const FATCH_OPTIONS: OptionsType = {
baseUrl: baseUrl,
timeout: 30_000,
timeout: 10_000,
url: '',
method: 'get',
headers: {
@@ -121,11 +124,7 @@ function beforeRequest(options: OptionsType): OptionsType | Promise<any> {
}
// 客户端接受语言
Reflect.set(
options.headers,
'Accept-Language',
`${localGet(CACHE_LOCAL_I18N) || 'en_US'};q=0.9`
);
Reflect.set(options.headers, 'Accept-Language', `${language};q=0.9`);
// 是否需要设置 token
const token = getToken();
@@ -153,7 +152,7 @@ function beforeRequest(options: OptionsType): OptionsType | Promise<any> {
requestObj.data === data &&
requestObj.time - time < interval
) {
const message = RESULT_MSG_URL_RESUBMIT;
const message = RESULT_MSG_URL_RESUBMIT[language];
return Promise.resolve({
code: RESULT_CODE_ERROR,
msg: message,
@@ -204,14 +203,14 @@ function interceptorResponse(res: ResultType): ResultType | Promise<any> {
if (!Reflect.has(res, 'code')) {
return Promise.resolve({
code: RESULT_CODE_SUCCESS,
msg: RESULT_MSG_SUCCESS,
msg: RESULT_MSG_SUCCESS[language],
data: res,
});
}
if (Reflect.has(res, 'error')) {
return Promise.resolve({
code: RESULT_CODE_ERROR,
msg: RESULT_MSG_ERROR,
msg: RESULT_MSG_ERROR[language],
data: res.error,
});
}
@@ -291,7 +290,7 @@ export async function request(options: OptionsType): Promise<ResultType> {
: await res.arrayBuffer();
return {
code: RESULT_CODE_SUCCESS,
msg: RESULT_MSG_SUCCESS,
msg: RESULT_MSG_SUCCESS[language],
data: data,
status: res.status,
headers: res.headers,
@@ -299,7 +298,7 @@ export async function request(options: OptionsType): Promise<ResultType> {
default:
return {
code: RESULT_CODE_ERROR,
msg: RESULT_MSG_NOT_TYPE,
msg: RESULT_MSG_NOT_TYPE[language],
};
}
} catch (error: any) {
@@ -307,7 +306,7 @@ export async function request(options: OptionsType): Promise<ResultType> {
if (error.name === 'AbortError') {
return {
code: RESULT_CODE_ERROR,
msg: RESULT_MSG_TIMEOUT,
msg: RESULT_MSG_TIMEOUT[language],
};
}
throw error;
@@ -326,21 +325,21 @@ function stateCode(res: Response) {
if (res.status === 500) {
return {
code: RESULT_CODE_ERROR,
msg: RESULT_MSG_SERVER_ERROR,
msg: RESULT_MSG_SERVER_ERROR[language],
};
}
// 上传文件成功无内容返回
if (res.status === 204 && res.statusText === 'No Content') {
return {
code: RESULT_CODE_SUCCESS,
msg: RESULT_MSG_SUCCESS,
msg: RESULT_MSG_SUCCESS[language],
};
}
// 地址找不到
if (res.status === 404 || res.status === 405) {
return {
code: RESULT_CODE_ERROR,
msg: RESULT_MSG_URL_NOTFOUND,
msg: RESULT_MSG_URL_NOTFOUND[language],
};
}
// 身份授权

View File

@@ -17,7 +17,7 @@ import useRouterStore from '@/store/modules/router';
// NProgress Configuration
NProgress.configure({ showSpinner: false });
// import { MetaRecord, MenuDataItem } from '@ant-design-vue/pro-layout';
// import { MetaRecord, MenuDataItem } from 'antdv-pro-layout';
// mate数据类型 MetaRecord
// 根据/路径构建菜单列表,列表项类型 MenuDataItem
// https://github.com/vueComponent/pro-components/blob/a19279f3a28190bf11e8c36f316c92dbd3387a6d/packages/pro-layout/src/typings.ts#L16
@@ -66,18 +66,27 @@ const constantRoutes: RouteRecordRaw[] = [
{
path: '/login',
name: 'Login',
meta: { title: 'router.login' },
component: () => import('@/views/login.vue'),
},
{
path: '/register',
name: 'Register',
meta: { title: 'router.register' },
component: () => import('@/views/register.vue'),
},
{
path: '/403',
name: 'NotPermission',
meta: { title: 'router.page403' },
component: () => import('@/views/error/403.vue'),
},
{
path: '/help',
name: 'HelpDoc',
meta: { title: 'router.helpDoc' },
component: () => import('@/views/tool/help/index.vue'),
},
{
path: '/redirect',
name: 'Redirect',
@@ -91,6 +100,7 @@ const constantRoutes: RouteRecordRaw[] = [
},
{
path: '/:pathMatch(.*)*',
meta: { title: 'router.page404' },
component: () => import('@/views/error/404.vue'),
},
];
@@ -118,21 +128,22 @@ const router = createRouter({
/**全局路由-后置守卫 */
router.afterEach((to, from, failure) => {
NProgress.done();
const title = to.meta?.title
// 设置标题
if (to.meta?.title) {
if (!failure && title) {
useAppStore().setTitle(to.meta.title);
}
});
/**无Token可访问页面地址白名单 */
const WHITE_LIST: string[] = ['/login', '/auth-redirect', '/bind', '/register'];
const WHITE_LIST: string[] = ['/login', '/auth-redirect', '/help', '/register'];
/**全局路由-前置守卫 */
router.beforeEach((to, from, next) => {
NProgress.start();
const token = getToken();
// 获取系统配置信息
const appStore = useAppStore();
const appStore =useAppStore()
if (!appStore.loginBackground) {
appStore.fnSysConf();
}

View File

@@ -1,10 +1,9 @@
import { getSysConf } from '@/api';
import defaultLOGOIcon from '@/assets/logo_icon.png';
import defaultLOGOBrand from '@/assets/logo_brand.png';
import { CACHE_LOCAL_I18N } from '@/constants/cache-keys-constants';
import { RESULT_CODE_SUCCESS } from '@/constants/result-constants';
import { validHttp } from '@/utils/regular-utils';
import { parseUrlPath } from '@/plugins/file-static-url';
import { localGet, localSet } from '@/utils/cache-local-utils';
import { defineStore } from 'pinia';
import { sessionGet } from '@/utils/cache-session-utils';
/**应用参数类型 */
type AppStore = {
@@ -14,6 +13,12 @@ type AppStore = {
appCode: string;
/**应用版本 */
appVersion: string;
/**服务版本 */
version: string;
buildTime: string;
// 序列号
serialNum: string;
/**应用版权声明 */
copyright: string;
/**LOGO显示类型 */
@@ -25,6 +30,14 @@ type AppStore = {
registerUser: boolean;
/**登录界面背景 */
loginBackground: string;
/**系统使用手册 */
helpDoc: string;
/**官方网址 */
officialUrl: string;
/**国际化切换 */
i18nOpen: boolean;
/**国际化默认语言 */
i18nDefault: string;
};
const useAppStore = defineStore('app', {
@@ -32,76 +45,26 @@ const useAppStore = defineStore('app', {
appName: import.meta.env.VITE_APP_NAME,
appCode: import.meta.env.VITE_APP_CODE,
appVersion: import.meta.env.VITE_APP_VERSION,
copyright: 'Copyright ©2023 For AGrandTech',
version: `-`,
buildTime: `-`,
serialNum: `-`,
copyright: `Copyright ©2023 For ${import.meta.env.VITE_APP_NAME}`,
logoType: 'icon',
filePathIcon: '',
filePathBrand: '',
registerUser: false,
loginBackground: '',
helpDoc: '',
officialUrl: '',
i18nOpen: true,
i18nDefault: 'en_US',
}),
getters: {
/**
* 获取正确LOGO地址-icon
* @param state 内部属性不用传入
* @returns LOGO地址url
*/
getLOGOIcon(state) {
const path = state.filePathIcon;
if (!path) {
return defaultLOGOIcon;
}
if (validHttp(path)) {
return path;
}
// 兼容旧前端可改配置文件
const baseUrl = import.meta.env.PROD
? sessionGet('baseUrl') || import.meta.env.VITE_API_BASE_URL
: import.meta.env.VITE_API_BASE_URL;
return `${baseUrl}${path}`;
},
/**
* 获取正确LOGO地址-brand
* @param state 内部属性不用传入
* @returns LOGO地址url
*/
getLOGOBrand(state) {
const path = state.filePathBrand;
if (!path) {
return defaultLOGOBrand;
}
if (validHttp(path)) {
return path;
}
// 兼容旧前端可改配置文件
const baseUrl = import.meta.env.PROD
? sessionGet('baseUrl') || import.meta.env.VITE_API_BASE_URL
: import.meta.env.VITE_API_BASE_URL;
return `${baseUrl}${path}`;
},
/**
* 获取正确登录背景地址
* @param state 内部属性不用传入
* @returns 背景地址url
*/
getLoginBackground(state) {
const path = state.loginBackground;
if (!path || path === '#') {
return '#';
}
if (validHttp(path)) {
return path;
}
// 兼容旧前端可改配置文件
const baseUrl = import.meta.env.PROD
? sessionGet('baseUrl') || import.meta.env.VITE_API_BASE_URL
: import.meta.env.VITE_API_BASE_URL;
return `${baseUrl}${path}`;
},
},
getters: {},
actions: {
/**设置网页标题 */
setTitle(title?: string) {
if (title) {
if (title && title.indexOf('router.') === -1) {
document.title = `${title} - ${this.appName}`;
} else {
document.title = this.appName;
@@ -111,39 +74,42 @@ const useAppStore = defineStore('app', {
setCopyright(text: string) {
this.copyright = text;
},
/**设置LOGO */
setLOGO(type: 'brand' | 'icon', filePath: string) {
this.logoType = type;
if (type === 'brand') {
this.filePathBrand = filePath;
}
if (type === 'icon') {
this.filePathIcon = filePath;
}
},
// 获取系统配置信息
async fnSysConf() {
const res = await getSysConf();
if (res.code === RESULT_CODE_SUCCESS && res.data) {
if (res.data.title) {
this.appName = res.data.title;
}
if (res.data.copyright) {
this.copyright = res.data.copyright;
}
this.version = res.data.version;
this.buildTime = res.data.buildTime;
this.serialNum = res.data.serialNum;
this.appName = res.data.title;
this.copyright = res.data.copyright;
this.logoType = res.data.logoType;
this.filePathIcon = res.data.filePathIcon;
this.filePathBrand = res.data.filePathBrand;
if (res.data.logoType) {
this.logoType = res.data.logoType;
// 修改html内容-小图当作favicon.ico
// 修改html内容-小图当作favicon.ico
if (this.logoType) {
const iconDom = document.querySelector("link[rel~='icon']");
if (iconDom) {
iconDom.setAttribute('href', this.getLOGOIcon);
let url = parseUrlPath(this.filePathIcon);
// 语言参数替换
if (url.indexOf('{language}') !== -1) {
const local = localGet(CACHE_LOCAL_I18N) || 'en_US';
const lang = local.split('_')[0];
url = url.replace('{language}', lang);
}
iconDom.setAttribute('href', url);
}
}
this.registerUser = res.data.registerUser === 'true';
if (res.data.loginBackground) {
this.loginBackground = res.data.loginBackground;
this.loginBackground = res.data.loginBackground;
this.helpDoc = res.data.helpDoc;
this.officialUrl = res.data.officialUrl;
this.i18nOpen = res.data.i18nOpen === 'true';
this.i18nDefault = res.data.i18nDefault;
// 切换禁用时,设置默认语言
const localI18n = localGet(CACHE_LOCAL_I18N);
if (localI18n == null || (!this.i18nOpen && this.i18nDefault)) {
localSet(CACHE_LOCAL_I18N, this.i18nDefault);
}
}
return res;

View File

@@ -10,7 +10,7 @@ type NeInfo = {
/**网元列表 */
neList: Record<string, any>[];
/**级联options树结构 */
neCascaderOtions: Record<string, any>[];
neCascaderOptions: Record<string, any>[];
/**选择器单级父类型 */
neSelectOtions: Record<string, any>[];
/**跟踪接口列表 */
@@ -22,7 +22,7 @@ type NeInfo = {
const useNeInfoStore = defineStore('neinfo', {
state: (): NeInfo => ({
neList: [],
neCascaderOtions: [],
neCascaderOptions: [],
neSelectOtions: [],
traceInterfaceList: [],
perMeasurementList: [],
@@ -33,8 +33,8 @@ const useNeInfoStore = defineStore('neinfo', {
* @param state 内部属性不用传入
* @returns 级联options
*/
getNeCascaderOtions(state) {
return state.neCascaderOtions;
getNeCascaderOptions(state) {
return state.neCascaderOptions;
},
/**
* 选择器单级父类型
@@ -70,7 +70,7 @@ const useNeInfoStore = defineStore('neinfo', {
'neName',
'neId'
);
this.neCascaderOtions = options;
this.neCascaderOptions = options;
// 转选择器单级父类型
this.neSelectOtions = options.map(item => item);

View File

@@ -1,5 +1,5 @@
import 'vue-router';
import { MetaRecord, MenuDataItem } from '@ant-design-vue/pro-layout';
import { MetaRecord, MenuDataItem } from 'antdv-pro-layout';
declare module 'vue-router' {
interface RouteMeta extends MetaRecord {

View File

@@ -6,3 +6,5 @@ declare module '*.vue' {
const component: DefineComponent<{}, {}, any>;
export default component;
}
declare module 'vue3-smooth-dnd';

View File

@@ -1,4 +1,4 @@
import { read, utils, write } from 'xlsx';
import { JSON2SheetOpts, read, utils, write } from 'xlsx';
// 静态资源路径
const baseUrl = import.meta.env.VITE_HISTORY_BASE_URL;
@@ -19,8 +19,11 @@ export const xlsxUrl = `${
* console.log(res)
* });
*/
export async function readLoalXlsx(id: string): Promise<Record<string, any>[]> {
let result = await fetch(`${xlsxUrl}/${id}.xlsx`);
export async function readLoalXlsx(
lang: string,
id: string
): Promise<Record<string, any>[]> {
let result = await fetch(`${xlsxUrl}/${lang}/${id}.xlsx`);
let fileBuffer = await result.arrayBuffer();
// 判断是否xlsx文件
const data = new Uint8Array(fileBuffer);
@@ -30,7 +33,7 @@ export async function readLoalXlsx(id: string): Promise<Record<string, any>[]> {
data[2] === 0x03 &&
data[3] === 0x04;
if (!isXlsxFile) {
result = await fetch(`${xlsxUrl}/all.xlsx`);
result = await fetch(`${xlsxUrl}/${lang}/all.xlsx`);
fileBuffer = await result.arrayBuffer();
}
return readSheet(fileBuffer, 0);
@@ -62,11 +65,17 @@ export async function readSheet(
* );
*
*/
export async function writeSheet(data: any[], sheetName: string) {
export async function writeSheet(
data: any[],
sheetName: string,
opts?: JSON2SheetOpts
) {
if (data.length === 0) {
return new Blob([], { type: 'application/octet-stream' });
}
const workSheet = utils.json_to_sheet(data);
const workSheet = utils.json_to_sheet(data, opts);
// 设置列宽度,单位厘米
workSheet['!cols'] = Object.keys(data[0]).map(() => {
return { wch: 20 };

View File

@@ -1,25 +0,0 @@
/**进入全屏 */
function enterFullscreen() {
const element = document.documentElement;
if (element.requestFullscreen) {
element.requestFullscreen();
}
}
/**退出全屏 */
function exitFullscreen() {
if (document.exitFullscreen) {
document.exitFullscreen();
}
}
/**是否全屏 */
export function isFullscreen() {
return !!document.fullscreenElement;
}
/**变更 */
export function toggle() {
return isFullscreen() ? exitFullscreen() : enterFullscreen();
}

View File

@@ -28,7 +28,8 @@ export const regExpUserName = /^[a-zA-Z][a-z0-9A-Z]{4,}$/;
*
* 密码至少包含大小写字母、数字、特殊符号且不少于6位
*/
export const regExpPasswd = /^(?![A-Za-z0-9]+$)(?![a-z0-9\W]+$)(?![A-Za-z\W]+$)(?![A-Z0-9\W]+$)[a-zA-Z0-9\W]{6,}$/;
export const regExpPasswd =
/^(?![A-Za-z0-9]+$)(?![a-z0-9\W]+$)(?![A-Za-z\W]+$)(?![A-Z0-9\W]+$)[a-zA-Z0-9\W]{6,}$/;
/**
* 有效手机号格式
@@ -63,6 +64,44 @@ export function validHttp(link: string): boolean {
return regExpHttp.test(link);
}
/**
* 判断是否有效URL地址
* @param str 网络链接
* @returns true | false
*/
export function validURL(str: string) {
if (
str === '' ||
str.length >= 2083 ||
str.length <= 3 ||
str.startsWith('.')
) {
return false;
}
let strTemp = str;
if (str.includes(':') && !str.includes('://')) {
// support no indicated urlscheme but with colon for port number
// http:// is appended so url.Parse will succeed, strTemp used so it does not impact rxURL.MatchString
strTemp = 'http://' + str;
}
debugger;
try {
new URL(strTemp);
} catch (error) {
return false;
}
const u = new URL(strTemp);
if (u.host.startsWith('.')) {
return false;
}
if (u.host === '' && u.pathname !== '' && !u.pathname.includes('.')) {
return false;
}
// 正则表达式模式(rxURL)未提供,无法进行具体判断
return true;
}
/**
* 判断是否为有效手机号格式
* @param mobile 手机号字符串

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