Эх сурвалжийг харах

Merge branch 'professional2' of http://git.mydig.net/Sagoo-Cloud/sagoo-admin-ui into professional2

vera_min 2 сар өмнө
parent
commit
db2181db0a
93 өөрчлөгдсөн 1657 нэмэгдсэн , 887 устгасан
  1. 1 1
      src/components/vue3cron/vue3cron.vue
  2. 15 4
      src/i18n/index.ts
  3. 5 0
      src/i18n/lang/en.ts
  4. 5 0
      src/i18n/lang/zh-cn.ts
  5. 5 0
      src/i18n/lang/zh-tw.ts
  6. 222 0
      src/i18n/pages/iotCard/en.ts
  7. 222 0
      src/i18n/pages/iotCard/zh-cn.ts
  8. 222 0
      src/i18n/pages/iotCard/zh-tw.ts
  9. 0 1
      src/layout/navBars/breadcrumb/user.vue
  10. 2 0
      src/main.ts
  11. 4 0
      src/theme/dark.scss
  12. 2 2
      src/views/apihub/plugin.vue
  13. 1 1
      src/views/designer/index.vue
  14. 1 1
      src/views/iot/alarm/log/index.vue
  15. 3 3
      src/views/iot/cascade/index.vue
  16. 1 1
      src/views/iot/certificate/index.vue
  17. 1 1
      src/views/iot/configuration/list/index.vue
  18. 1 1
      src/views/iot/configuration/screen/index.vue
  19. 1 1
      src/views/iot/dataAnalysis/IndicatorAggregation/index.vue
  20. 1 1
      src/views/iot/dataAnalysis/exponentialTrend/index.vue
  21. 2 2
      src/views/iot/device-tree/tree/index.vue
  22. 1 1
      src/views/iot/device/category/index.vue
  23. 1 1
      src/views/iot/device/channel/index.vue
  24. 1 1
      src/views/iot/device/instance/detail.vue
  25. 1 1
      src/views/iot/device/instance/index.vue
  26. 1 1
      src/views/iot/device/product/detail.vue
  27. 1 1
      src/views/iot/device/product/index.vue
  28. 1 1
      src/views/iot/device/template/index.vue
  29. 1 1
      src/views/iot/ice104/device/index.vue
  30. 1 1
      src/views/iot/ice104/template/index.vue
  31. 1 1
      src/views/iot/network/server/index.vue
  32. 1 1
      src/views/iot/network/tunnel/index.vue
  33. 1 1
      src/views/iot/noticeservices/config/index.vue
  34. 1 1
      src/views/iot/noticeservices/config/setting.vue
  35. 1 1
      src/views/iot/noticeservices/log/index.vue
  36. 1 1
      src/views/iot/operate/remoteconf/index.vue
  37. 1 1
      src/views/iot/ota-update/data/index.vue
  38. 1 1
      src/views/iot/ota-update/module/index.vue
  39. 2 2
      src/views/iot/ota-update/update/component/batch.vue
  40. 1 1
      src/views/iot/ota-update/update/component/device.vue
  41. 3 3
      src/views/iot/ota-update/update/index.vue
  42. 1 1
      src/views/iot/projects/detail/index.vue
  43. 1 1
      src/views/iot/projects/filter/index.vue
  44. 1 1
      src/views/iot/projects/list/index.vue
  45. 2 2
      src/views/iot/property/attribute/index.vue
  46. 2 2
      src/views/iot/property/dossier/index.vue
  47. 2 2
      src/views/iot/property/relationship/index.vue
  48. 2 2
      src/views/iot/rule-engine/index.vue
  49. 1 1
      src/views/iot/rule-engine/log.vue
  50. 1 1
      src/views/iot/scene/list/index.vue
  51. 4 4
      src/views/iot/scene/manage/detail.vue
  52. 1 1
      src/views/iot/scene/manage/index.vue
  53. 3 3
      src/views/limits/frontEnd/btn/index.vue
  54. 1 1
      src/views/limits/frontEnd/page/index.vue
  55. 388 299
      src/views/login/index.vue
  56. 1 1
      src/views/modules/assess/index.vue
  57. 332 369
      src/views/modules/iotCard/dashboard.vue
  58. 32 27
      src/views/modules/iotCard/index/detail.vue
  59. 38 33
      src/views/modules/iotCard/index/index.vue
  60. 31 29
      src/views/modules/iotCard/platformManage/addOrEditItem.vue
  61. 29 20
      src/views/modules/iotCard/platformManage/index.vue
  62. 1 1
      src/views/modules/policy/index/index.vue
  63. 1 1
      src/views/modules/policy/runLog/index.vue
  64. 1 1
      src/views/modules/tenant/index.vue
  65. 1 1
      src/views/personal/index.vue
  66. 1 1
      src/views/system/api/index.vue
  67. 1 1
      src/views/system/application/index.vue
  68. 2 2
      src/views/system/basicConfig/index.vue
  69. 1 1
      src/views/system/city/index.vue
  70. 1 1
      src/views/system/config/index.vue
  71. 1 1
      src/views/system/datahub/modeling/index.vue
  72. 1 1
      src/views/system/datahub/source/detail.vue
  73. 1 1
      src/views/system/datahub/source/index.vue
  74. 1 1
      src/views/system/dict/dataList.vue
  75. 1 1
      src/views/system/dict/index.vue
  76. 1 1
      src/views/system/manage/blacklist/index.vue
  77. 1 1
      src/views/system/manage/dept/index.vue
  78. 1 1
      src/views/system/manage/org/index.vue
  79. 1 1
      src/views/system/manage/post/index.vue
  80. 1 1
      src/views/system/manage/role/index.vue
  81. 2 2
      src/views/system/manage/user/index.vue
  82. 1 1
      src/views/system/menu/index.vue
  83. 5 5
      src/views/system/monitor/cache/index.vue
  84. 1 1
      src/views/system/monitor/loginLog/index.vue
  85. 1 1
      src/views/system/monitor/notice/index.vue
  86. 1 1
      src/views/system/monitor/online/index.vue
  87. 1 1
      src/views/system/monitor/operLog/index.vue
  88. 1 1
      src/views/system/monitor/plugin/index.vue
  89. 7 7
      src/views/system/monitor/server/index.vue
  90. 1 1
      src/views/system/monitor/task-logs/index.vue
  91. 1 1
      src/views/system/monitor/upgrade/index.vue
  92. 1 1
      src/views/system/sso/index.vue
  93. 1 1
      src/views/system/task/index.vue

+ 1 - 1
src/components/vue3cron/vue3cron.vue

@@ -252,7 +252,7 @@
     <div class="bottom">
       <div class="value" style="margin: 10px;">
         <span> cron预览: </span>
-        <el-tag type="primary">
+        <el-tag>
           {{ state.cron }}
         </el-tag> <span>{秒数} {分钟} {小时} {日期} {月份} {?}</span>
       </div>

+ 15 - 4
src/i18n/index.ts

@@ -30,6 +30,10 @@ import pagesIotmanagerZhcn from './pages/iotmanagerI18n/zh-cn';
 import pagesIotmanagerEn from './pages/iotmanagerI18n/en';
 import pagesIotmanagerZhtw from './pages/iotmanagerI18n/zh-tw';
 
+import pagesIotcardZhcn from './pages/iotCard/zh-cn';
+import pagesIotcardEn from './pages/iotCard/en';
+import pagesIotcardZhtw from './pages/iotCard/zh-tw';
+
 // 定义语言国际化内容
 /**
  * 说明:
@@ -44,7 +48,8 @@ const messages = {
 			...pagesLoginZhcn,
 			...pagesFormI18nZhcn,
 			...pagesTable18nZhcn,
-			...pagesIotmanagerZhcn
+			...pagesIotmanagerZhcn,
+			iotCard: pagesIotcardZhcn
 		}
 	},
 	[enLocale.name]: {
@@ -54,8 +59,9 @@ const messages = {
 			...pagesLoginEn,
 			...pagesFormI18nEn,
 			...pagesTable18nEn,
-			...pagesIotmanagerEn
-		},
+			...pagesIotmanagerEn,
+			iotCard: pagesIotcardEn
+		},	
 	},
 	[zhtwLocale.name]: {
 		...zhtwLocale,
@@ -64,7 +70,8 @@ const messages = {
 			...pagesLoginZhtw,
 			...pagesFormI18nZhtw,
 			...pagesTable18nZhtw,
-			...pagesIotmanagerZhtw
+			...pagesIotmanagerZhtw,
+			iotCard: pagesIotcardZhtw
 		},
 	},
 };
@@ -74,4 +81,8 @@ export const i18n = createI18n({
 	locale: store.state.themeConfig.themeConfig.globalI18n,
 	fallbackLocale: zhcnLocale.name,
 	messages,
+	silentTranslationWarn: true,
+	missingWarn: false,
+	silentFallbackWarn: true,
+	fallbackWarn: false
 });

+ 5 - 0
src/i18n/lang/en.ts

@@ -107,6 +107,11 @@ export default {
 		logOutExit: 'Exiting',
 		logOutSuccess: 'Exit successfully!',
 	},
+	login: {
+		title: 'Login',
+		serverVersion: 'Server Version',
+		frontendVersion: 'Frontend Version',
+	},
 	tagsView: {
 		refresh: 'refresh',
 		close: 'close',

+ 5 - 0
src/i18n/lang/zh-cn.ts

@@ -108,6 +108,11 @@ export default {
 		logOutExit: '退出中',
 		logOutSuccess: '安全退出成功!',
 	},
+	login: {
+		title: '登录',
+		serverVersion: '服务端版本',
+		frontendVersion: '前端版本',
+	},
 	tagsView: {
 		refresh: '刷新',
 		close: '关闭',

+ 5 - 0
src/i18n/lang/zh-tw.ts

@@ -115,6 +115,11 @@ export default {
 		logOutExit: '退出中',
 		logOutSuccess: '安全退出成功!',
 	},
+	login: {
+		title: '登入',
+		serverVersion: '伺服器版本',
+		frontendVersion: '前端版本',
+	},
 	tagsView: {
 		refresh: '重繪',
 		close: '關閉',

+ 222 - 0
src/i18n/pages/iotCard/en.ts

@@ -0,0 +1,222 @@
+export default {
+  dashboard: {
+    title: 'Data Statistics',
+    carrier: {
+      placeholder: 'Please select',
+      telecom: 'Telecom',
+      unicom: 'Unicom',
+      mobile: 'Mobile'
+    },
+    statistics: {
+      yesterdayFlow: 'Yesterday Flow Consumption',
+      monthFlow: 'This Month Flow Consumption',
+      yearFlow: 'This Year Flow Consumption'
+    },
+    flowChart: {
+      title: 'Flow Statistics',
+      buttons: {
+        yesterday: 'Yesterday',
+        week: 'This Week',
+        month: 'This Month',
+        year: 'This Year'
+      },
+      datePicker: {
+        rangeSeparator: 'to',
+        startPlaceholder: 'Start Time',
+        endPlaceholder: 'End Time'
+      }
+    },
+    top10: {
+      title: 'Top 10 Flow Usage',
+      datePicker: {
+        rangeSeparator: 'to',
+        startPlaceholder: 'Start Date',
+        endPlaceholder: 'End Date'
+      }
+    },
+    charts: {
+      tooltip: {
+        traffic: 'Traffic'
+      },
+      series: {
+        traffic: 'Traffic'
+      }
+    }
+  },
+  index: {
+    search: {
+      placeholder: 'Enter ICCID or Card Number',
+      query: 'Query',
+      reset: 'Reset'
+    },
+    table: {
+      columns: {
+        cardNumber: 'Card Number',
+        iccid: 'ICCID',
+        bindDevice: 'Bind Device',
+        platform: 'Platform',
+        operator: 'Operator',
+        type: 'Type',
+        totalFlow: 'Total Flow',
+        usedFlow: 'Used Flow',
+        remainFlow: 'Remain Flow',
+        activationDate: 'Activation Date',
+        updateTime: 'Update Time',
+        status: 'Status',
+        actions: 'Actions'
+      },
+      actions: {
+        detail: 'Detail',
+        delete: 'Delete'
+      }
+    },
+    operators: {
+      telecom: 'China Telecom',
+      unicom: 'China Unicom',
+      mobile: 'China Mobile'
+    },
+    types: {
+      monthly: 'Monthly',
+      quarterly: 'Quarterly',
+      yearly: 'Yearly',
+      other: 'Other'
+    },
+    status: {
+      activatable: 'Activatable',
+      testActivated: 'Test Activated',
+      testDeactivated: 'Test Deactivated',
+      inUse: 'In Use',
+      suspended: 'Suspended',
+      operatorManaged: 'Operator Managed'
+    },
+    messages: {
+      deleteConfirm: 'This operation will delete the card number: "{cardNumber}", continue?',
+      tip: 'Tip',
+      confirm: 'Confirm',
+      cancel: 'Cancel',
+      deleteSuccess: 'Delete Success'
+    }
+  },
+  detail: {
+    basicInfo: {
+      title: 'Basic Information',
+      cardNumber: 'Card Number',
+      iccid: 'ICCID',
+      bindDevice: 'Bind Device',
+      platformType: 'Platform Type',
+      platformName: 'Platform Name',
+      operator: 'Operator',
+      type: 'Type',
+      activationDate: 'Activation Date',
+      updateTime: 'Update Time',
+      totalFlow: 'Total Flow',
+      usedFlow: 'Used Flow',
+      remainFlow: 'Remain Flow',
+      status: 'Status',
+      description: 'Description'
+    },
+    flowChart: {
+      title: 'Flow Statistics',
+      buttons: {
+        yesterday: 'Yesterday',
+        week: 'Last Week',
+        month: 'Last Month',
+        year: 'Last Year'
+      },
+      datePicker: {
+        rangeSeparator: 'to',
+        startPlaceholder: 'Start Time',
+        endPlaceholder: 'End Time'
+      }
+    },
+    dataStatistics: {
+      title: 'Data Statistics',
+      yesterdayFlow: 'Yesterday Flow Consumption',
+      monthFlow: 'Current Month Flow Consumption',
+      yearFlow: 'Current Year Flow Consumption'
+    }
+  },
+  platformManage: {
+    search: {
+      placeholder: 'Enter keyword to search',
+      query: 'Query',
+      reset: 'Reset',
+      add: 'Add'
+    },
+    table: {
+      columns: {
+        name: 'Name',
+        platformType: 'Platform Type',
+        appId: 'App ID',
+        status: 'Status',
+        description: 'Description',
+        actions: 'Actions'
+      },
+      actions: {
+        edit: 'Edit',
+        delete: 'Delete'
+      }
+    },
+    status: {
+      disabled: 'Disabled',
+      enabled: 'Enabled'
+    },
+    messages: {
+      deleteConfirm: 'This operation will delete the card number: "{cardNumber}", continue?',
+      tip: 'Tip',
+      confirm: 'Confirm',
+      cancel: 'Cancel',
+      deleteSuccess: 'Delete Success'
+    },
+    addOrEdit: {
+      title: {
+        add: 'Add',
+        edit: 'Edit'
+      },
+      form: {
+        platformType: 'Platform Type',
+        name: 'Name',
+        appId: 'App ID',
+        secretKey: 'Secret Key',
+        userId: 'User ID',
+        interfaceUrl: 'Interface URL',
+        status: 'Status',
+        description: 'Description'
+      },
+      placeholders: {
+        select: 'Please select',
+        name: 'Please enter name',
+        appId: 'Please enter App ID',
+        secretKey: 'Please enter secret key',
+        userId: 'Please enter user ID',
+        interfaceUrl: 'Please enter interface URL',
+        description: 'Please enter description'
+      },
+      operators: {
+        telecom: 'China Telecom',
+        unicom: 'China Unicom',
+        mobile: 'China Mobile'
+      },
+      switch: {
+        enabled: 'On',
+        disabled: 'Off'
+      },
+      buttons: {
+        cancel: 'Cancel',
+        confirm: 'Confirm'
+      },
+      validation: {
+        platformType: 'Please select platform type',
+        name: 'Please enter name',
+        userId: 'Please enter user ID',
+        secretKey: 'Please enter secret key',
+        appId: 'Please enter App ID',
+        interfaceUrl: 'Please enter interface URL'
+      },
+      messages: {
+        editSuccess: 'Edit Success',
+        addSuccess: 'Add Success'
+      }
+    }
+  }
+};

+ 222 - 0
src/i18n/pages/iotCard/zh-cn.ts

@@ -0,0 +1,222 @@
+export default {
+	dashboard: {
+		title: '数据统计',
+		carrier: {
+			placeholder: '请选择',
+			telecom: '电信',
+			unicom: '联通',
+			mobile: '移动'
+		},
+		statistics: {
+			yesterdayFlow: '昨日流量消耗',
+			monthFlow: '当月流量消耗',
+			yearFlow: '本年流量消耗'
+		},
+		flowChart: {
+			title: '流量统计',
+			buttons: {
+				yesterday: '昨日',
+				week: '近一周',
+				month: '近一月',
+				year: '近一年'
+			},
+			datePicker: {
+				rangeSeparator: '至',
+				startPlaceholder: '开始时间',
+				endPlaceholder: '结束时间'
+			}
+		},
+		top10: {
+			title: '流量使用TOP10',
+			datePicker: {
+				rangeSeparator: '至',
+				startPlaceholder: '开始日期',
+				endPlaceholder: '结束日期'
+			}
+		},
+		charts: {
+			tooltip: {
+				traffic: '流量'
+			},
+			series: {
+				traffic: '流量'
+			}
+		}
+	},
+	index: {
+		search: {
+			placeholder: '请输入ICCID或卡号',
+			query: '查询',
+			reset: '重置'
+		},
+		table: {
+			columns: {
+				cardNumber: '卡号',
+				iccid: 'ICCID',
+				bindDevice: '绑定设备',
+				platform: '平台对接',
+				operator: '运营商',
+				type: '类型',
+				totalFlow: '总流量',
+				usedFlow: '使用流量',
+				remainFlow: '剩余流量',
+				activationDate: '激活日期',
+				updateTime: '更新时间',
+				status: '状态',
+				actions: '操作'
+			},
+			actions: {
+				detail: '详情',
+				delete: '删除'
+			}
+		},
+		operators: {
+			telecom: '电信',
+			unicom: '联通',
+			mobile: '移动'
+		},
+		types: {
+			monthly: '月卡',
+			quarterly: '季卡',
+			yearly: '年卡',
+			other: '其他'
+		},
+		status: {
+			activatable: '可激活',
+			testActivated: '测试激活',
+			testDeactivated: '测试去激活',
+			inUse: '在用',
+			suspended: '停机',
+			operatorManaged: '运营商管理状态'
+		},
+		messages: {
+			deleteConfirm: '此操作将卡号为:“{cardNumber}”进行删除,是否继续?',
+			tip: '提示',
+			confirm: '确认',
+			cancel: '取消',
+			deleteSuccess: '删除成功'
+		}
+	},
+	detail: {
+		basicInfo: {
+			title: '基本信息',
+			cardNumber: '卡号',
+			iccid: 'ICCID',
+			bindDevice: '绑定设备',
+			platformType: '平台类型',
+			platformName: '平台名称',
+			operator: '运营商',
+			type: '类型',
+			activationDate: '激活日期',
+			updateTime: '更新时间',
+			totalFlow: '总流量',
+			usedFlow: '使用流量',
+			remainFlow: '剩余流量',
+			status: '状态',
+			description: '说明'
+		},
+		flowChart: {
+			title: '流量统计',
+			buttons: {
+				yesterday: '昨日',
+				week: '近一周',
+				month: '近一月',
+				year: '近一年'
+			},
+			datePicker: {
+				rangeSeparator: '至',
+				startPlaceholder: '开始时间',
+				endPlaceholder: '结束时间'
+			}
+		},
+		dataStatistics: {
+			title: '数据统计',
+			yesterdayFlow: '昨日流量消耗',
+			monthFlow: '当月流量消耗',
+			yearFlow: '本年流量消耗'
+		}
+	},
+	platformManage: {
+		search: {
+			placeholder: '请输入关键字搜索',
+			query: '查询',
+			reset: '重置',
+			add: '新增'
+		},
+		table: {
+			columns: {
+				name: '名称',
+				platformType: '平台类型',
+				appId: 'App ID',
+				status: '状态',
+				description: '说明',
+				actions: '操作'
+			},
+			actions: {
+				edit: '编辑',
+				delete: '删除'
+			}
+		},
+		status: {
+			disabled: '禁用',
+			enabled: '开启'
+		},
+		messages: {
+			deleteConfirm: '此操作将卡号为:“{cardNumber}”,是否继续?',
+			tip: '提示',
+			confirm: '确认',
+			cancel: '取消',
+			deleteSuccess: '删除成功'
+		},
+		addOrEdit: {
+			title: {
+				add: '新增',
+				edit: '编辑'
+			},
+			form: {
+				platformType: '平台类型',
+				name: '名称',
+				appId: 'App ID',
+				secretKey: 'secretKey',
+				userId: '用户id',
+				interfaceUrl: '接口地址',
+				status: '状态',
+				description: '说明'
+			},
+			placeholders: {
+				select: '请选择',
+				name: '请输入名称',
+				appId: '请输入App ID',
+				secretKey: '请输入secretKey',
+				userId: '请输入用户id',
+				interfaceUrl: '请输入接口地址',
+				description: '请输入说明'
+			},
+			operators: {
+				telecom: '电信',
+				unicom: '联通',
+				mobile: '移动'
+			},
+			switch: {
+				enabled: '启',
+				disabled: '禁'
+			},
+			buttons: {
+				cancel: '取 消',
+				confirm: '确定'
+			},
+			validation: {
+				platformType: '请选择平台类型',
+				name: '请输入名称',
+				userId: '请输入用户id',
+				secretKey: '请输入secretKey',
+				appId: '请输入App ID',
+				interfaceUrl: '请输入接口地址'
+			},
+			messages: {
+				editSuccess: '修改成功',
+				addSuccess: '添加成功'
+			}
+		}
+	}
+};

+ 222 - 0
src/i18n/pages/iotCard/zh-tw.ts

@@ -0,0 +1,222 @@
+export default {
+	dashboard: {
+		title: '數據統計',
+		carrier: {
+			placeholder: '請選擇',
+			telecom: '電信',
+			unicom: '聯通',
+			mobile: '移動'
+		},
+		statistics: {
+			yesterdayFlow: '昨日流量消耗',
+			monthFlow: '當月流量消耗',
+			yearFlow: '本年流量消耗'
+		},
+		flowChart: {
+			title: '流量統計',
+			buttons: {
+				yesterday: '昨日',
+				week: '近一週',
+				month: '近一月',
+				year: '近一年'
+			},
+			datePicker: {
+				rangeSeparator: '至',
+				startPlaceholder: '開始時間',
+				endPlaceholder: '結束時間'
+			}
+		},
+		top10: {
+			title: '流量使用TOP10',
+			datePicker: {
+				rangeSeparator: '至',
+				startPlaceholder: '開始日期',
+				endPlaceholder: '結束日期'
+			}
+		},
+		charts: {
+			tooltip: {
+				traffic: '流量'
+			},
+			series: {
+				traffic: '流量'
+			}
+		}
+	},
+	index: {
+		search: {
+			placeholder: '請輸入ICCID或卡號',
+			query: '查詢',
+			reset: '重置'
+		},
+		table: {
+			columns: {
+				cardNumber: '卡號',
+				iccid: 'ICCID',
+				bindDevice: '綁定設備',
+				platform: '平台對接',
+				operator: '運營商',
+				type: '類型',
+				totalFlow: '總流量',
+				usedFlow: '使用流量',
+				remainFlow: '剩餘流量',
+				activationDate: '激活日期',
+				updateTime: '更新時間',
+				status: '狀態',
+				actions: '操作'
+			},
+			actions: {
+				detail: '詳情',
+				delete: '刪除'
+			}
+		},
+		operators: {
+			telecom: '電信',
+			unicom: '聯通',
+			mobile: '移動'
+		},
+		types: {
+			monthly: '月卡',
+			quarterly: '季卡',
+			yearly: '年卡',
+			other: '其他'
+		},
+		status: {
+			activatable: '可激活',
+			testActivated: '測試激活',
+			testDeactivated: '測試去激活',
+			inUse: '在用',
+			suspended: '停機',
+			operatorManaged: '運營商管理狀態'
+		},
+		messages: {
+			deleteConfirm: '此操作將卡號為:「{cardNumber}」進行刪除,是否繼續?',
+			tip: '提示',
+			confirm: '確認',
+			cancel: '取消',
+			deleteSuccess: '刪除成功'
+		}
+	},
+	detail: {
+		basicInfo: {
+			title: '基本信息',
+			cardNumber: '卡號',
+			iccid: 'ICCID',
+			bindDevice: '綁定設備',
+			platformType: '平台類型',
+			platformName: '平台名稱',
+			operator: '運營商',
+			type: '類型',
+			activationDate: '激活日期',
+			updateTime: '更新時間',
+			totalFlow: '總流量',
+			usedFlow: '使用流量',
+			remainFlow: '剩餘流量',
+			status: '狀態',
+			description: '說明'
+		},
+		flowChart: {
+			title: '流量統計',
+			buttons: {
+				yesterday: '昨日',
+				week: '近一週',
+				month: '近一月',
+				year: '近一年'
+			},
+			datePicker: {
+				rangeSeparator: '至',
+				startPlaceholder: '開始時間',
+				endPlaceholder: '結束時間'
+			}
+		},
+		dataStatistics: {
+			title: '數據統計',
+			yesterdayFlow: '昨日流量消耗',
+			monthFlow: '當月流量消耗',
+			yearFlow: '本年流量消耗'
+		}
+	},
+	platformManage: {
+		search: {
+			placeholder: '請輸入關鍵字搜索',
+			query: '查詢',
+			reset: '重置',
+			add: '新增'
+		},
+		table: {
+			columns: {
+				name: '名稱',
+				platformType: '平台類型',
+				appId: 'App ID',
+				status: '狀態',
+				description: '說明',
+				actions: '操作'
+			},
+			actions: {
+				edit: '編輯',
+				delete: '刪除'
+			}
+		},
+		status: {
+			disabled: '禁用',
+			enabled: '開啟'
+		},
+		messages: {
+			deleteConfirm: '此操作將卡號為:「{cardNumber}」,是否繼續?',
+			tip: '提示',
+			confirm: '確認',
+			cancel: '取消',
+			deleteSuccess: '刪除成功'
+		},
+		addOrEdit: {
+			title: {
+				add: '新增',
+				edit: '編輯'
+			},
+			form: {
+				platformType: '平台類型',
+				name: '名稱',
+				appId: 'App ID',
+				secretKey: 'secretKey',
+				userId: '用戶id',
+				interfaceUrl: '接口地址',
+				status: '狀態',
+				description: '說明'
+			},
+			placeholders: {
+				select: '請選擇',
+				name: '請輸入名稱',
+				appId: '請輸入App ID',
+				secretKey: '請輸入secretKey',
+				userId: '請輸入用戶id',
+				interfaceUrl: '請輸入接口地址',
+				description: '請輸入說明'
+			},
+			operators: {
+				telecom: '電信',
+				unicom: '聯通',
+				mobile: '移動'
+			},
+			switch: {
+				enabled: '啟',
+				disabled: '禁'
+			},
+			buttons: {
+				cancel: '取 消',
+				confirm: '確定'
+			},
+			validation: {
+				platformType: '請選擇平台類型',
+				name: '請輸入名稱',
+				userId: '請輸入用戶id',
+				secretKey: '請輸入secretKey',
+				appId: '請輸入App ID',
+				interfaceUrl: '請輸入接口地址'
+			},
+			messages: {
+				editSuccess: '修改成功',
+				addSuccess: '添加成功'
+			}
+		}
+	}
+};

+ 0 - 1
src/layout/navBars/breadcrumb/user.vue

@@ -218,7 +218,6 @@ export default defineComponent({
       proxy.$i18n.locale = lang;
       initI18n();
       other.useTitle();
-      console.log('切换语言成功')
     };
     // 设置 element plus 组件的国际化
     const setI18nConfig = (locale: string) => {

+ 2 - 0
src/main.ts

@@ -23,6 +23,8 @@ import copy from '/@/components/copy/index.vue'
 import JsonViewer from "vue3-json-viewer"
 
 const app = createApp(App);
+// 取消 vue warn
+app.config.warnHandler = function () { }
 
 directive(app);
 other.elSvg(app);

+ 4 - 0
src/theme/dark.scss

@@ -67,6 +67,10 @@
 		}
 	}
 
+	.el-table__header-wrapper tr th.el-table-fixed-column--right {
+		background-color: #343435 !important;
+	}
+
 	// 高亮时
 	.el-menu-item.is-active {
 		color: var(--next-color-menu-text-blue) !important;

+ 2 - 2
src/views/apihub/plugin.vue

@@ -48,7 +48,7 @@
           <el-table-column prop="type" label="类型" v-col="'type'" width="120" align="center">
             <template #default="scope">
               <el-tag size="small" type="success" v-if="scope.row.type === 'Go'">Go</el-tag>
-              <el-tag size="small" type="primary" v-else-if="scope.row.type === 'JavaScript'">JavaScript</el-tag>
+              <el-tag size="small" v-else-if="scope.row.type === 'JavaScript'">JavaScript</el-tag>
               <el-tag size="small" type="warning" v-else-if="scope.row.type === 'LUA'">LUA</el-tag>
               <span v-else>{{ scope.row.type }}</span>
             </template>
@@ -121,7 +121,7 @@
         <el-descriptions-item label="插件名称">{{ detail.name }}</el-descriptions-item>
         <el-descriptions-item label="插件类型">
           <el-tag size="small" type="success" v-if="detail.type === 'Go'">Go</el-tag>
-          <el-tag size="small" type="primary" v-else-if="detail.type === 'JavaScript'">JavaScript</el-tag>
+          <el-tag size="small" v-else-if="detail.type === 'JavaScript'">JavaScript</el-tag>
           <el-tag size="small" type="warning" v-else-if="detail.type === 'LUA'">LUA</el-tag>
           <span v-else>{{ detail.type }}</span>
         </el-descriptions-item>

+ 1 - 1
src/views/designer/index.vue

@@ -1,6 +1,6 @@
 <template>
 	<div class="page">
-		<el-card shadow="nover">
+		<el-card shadow="never">
 			<div class="search">
 				<el-form inline>
 					<el-form-item>

+ 1 - 1
src/views/iot/alarm/log/index.vue

@@ -1,6 +1,6 @@
 <template>
 	<div class="page">
-		<el-card shadow="nover">
+		<el-card shadow="never">
 			<el-form :model="tableData.param" ref="queryRef" inline label-width="68px">
 				<!-- 创建时间 -->
 				<el-form-item :label="$t('message.formI18nLabel.createdTime')" prop="dateRange" :label-width="labelWidth">

+ 3 - 3
src/views/iot/cascade/index.vue

@@ -1,7 +1,7 @@
 <template>
   <div class="page-full">
     <div class="search flex-row mb-4 gap-4">
-      <el-card shadow="nover" class="home-card-top-part flex1">
+      <el-card shadow="never" class="home-card-top-part flex1">
         <div class="top">
           <div class="label">子平台</div>
           <span class="font30">{{ count.PlatformTotal }}</span>
@@ -21,7 +21,7 @@
           </div>
         </div>
       </el-card>
-      <el-card shadow="nover" class="home-card-top-part flex1">
+      <el-card shadow="never" class="home-card-top-part flex1">
         <div class="top">
           <div class="label">设备总数</div>
           <span class="font30">{{ count.DeviceTotal }}</span>
@@ -42,7 +42,7 @@
         </div>
       </el-card>
     </div>
-    <el-card shadow="nover" class="page-full-part">
+    <el-card shadow="never" class="page-full-part">
       <el-table :data="tableData" style="width: 100%" row-key="id" v-loading="loading">
         <el-table-column type="index" label="序号" width="100" align="center"></el-table-column>
         <el-table-column prop="name" label="子平台" show-overflow-tooltip v-col="'name'" align="center"></el-table-column>

+ 1 - 1
src/views/iot/certificate/index.vue

@@ -1,6 +1,6 @@
 <template>
 	<div class="page">
-		<el-card shadow="nover">
+		<el-card shadow="never">
 			<el-form :model="state.tableData.param" ref="queryRef" inline @submit.prevent @keyup.enter="queryList">
 				<el-form-item label="证书名称" prop="keyWord">
 					<el-input v-model="state.tableData.param.name" placeholder="请输入证书名称" clearable />

+ 1 - 1
src/views/iot/configuration/list/index.vue

@@ -1,6 +1,6 @@
 <template>
   <div class="page">
-    <el-card shadow="nover">
+    <el-card shadow="never">
       <div class="search">
         <el-form inline>
           <el-form-item label="关键字">

+ 1 - 1
src/views/iot/configuration/screen/index.vue

@@ -1,6 +1,6 @@
 <template>
   <div class="page">
-    <el-card shadow="nover">
+    <el-card shadow="never">
       <div class="search">
         <el-form inline>
           <el-form-item label="关键字">

+ 1 - 1
src/views/iot/dataAnalysis/IndicatorAggregation/index.vue

@@ -1,6 +1,6 @@
 <template>
 	<div class="page">
-		<el-card shadow="nover">
+		<el-card shadow="never">
 			<el-form inline>
 				<el-form-item label="选择产品:" prop="productKey">
 					<el-select v-model="params.productKey" filterable placeholder="请选择产品" @change="productChange">

+ 1 - 1
src/views/iot/dataAnalysis/exponentialTrend/index.vue

@@ -1,6 +1,6 @@
 <template>
   <div class="page">
-    <el-card shadow="nover">
+    <el-card shadow="never">
       <el-form inline>
         <el-form-item label="选择产品:" prop="productKey">
           <el-select v-model="params.productKey" filterable placeholder="请选择产品" @change="productChange">

+ 2 - 2
src/views/iot/device-tree/tree/index.vue

@@ -2,7 +2,7 @@
   <div class="page page-full">
     <el-row :gutter="15" class="h-full">
       <el-col :span="6" class="h-full">
-        <el-card shadow="nover" class="h-full">
+        <el-card shadow="never" class="h-full">
           <el-scrollbar v-loading="treeLoading">
             <el-input :prefix-icon="Search" v-model="searchVal" placeholder="请输入设备树名称" clearable style="width: 100%;" />
             <el-button v-if="!treeLoading && !treeData.length" type="primary" v-auth="'add'" class="mt-2" @click="operateCmd('add', {})" style="width: 100%">新建节点</el-button>
@@ -51,7 +51,7 @@
         </el-card>
       </el-col>
       <el-col :span="18" class="h-full">
-        <el-card shadow="nover" class="h-full" v-if="treeDetail.name">
+        <el-card shadow="never" class="h-full" v-if="treeDetail.name">
           <el-form :model="ruleForm" ref="formRef" label-width="80px">
             <el-tabs v-model="tabName" @tab-click="onTabClick">
               <el-tab-pane label="设备树信息" name="1">

+ 1 - 1
src/views/iot/device/category/index.vue

@@ -1,6 +1,6 @@
 <template>
   <div class="page">
-    <el-card shadow="nover">
+    <el-card shadow="never">
       <el-form inline>
         <el-form-item :label="$t('message.formI18nLabel.categoryName')">
           <el-input v-model="tableData.param.name" :placeholder="$t('message.formI18nPlaceholder.categoryName')" @keyup.enter.native="getCateList" class="w-50" clearable :style="{width: currentLang === 'en' ? '220px' : '150px' }" />

+ 1 - 1
src/views/iot/device/channel/index.vue

@@ -1,6 +1,6 @@
 <template>
 	<div class="page">
-		<el-card shadow="nover">
+		<el-card shadow="never">
 			<div class="search">
 				<el-form :model="params" inline ref="queryRef" @keyup.enter.native="getList(1)">
 					<el-form-item label="通道名称" prop="title">

+ 1 - 1
src/views/iot/device/instance/detail.vue

@@ -194,7 +194,7 @@
                 <el-table-column label="名称" prop="name" show-overflow-tooltip />
                 <el-table-column prop="level" label="事件级别" width="120" align="center">
                   <template #default="scope">
-                    <el-tag type="primary" size="small" v-if="scope.row.level == 0">普通</el-tag>
+                    <el-tag size="small" v-if="scope.row.level == 0">普通</el-tag>
                     <el-tag type="warning" size="small" v-if="scope.row.level == 1">警告</el-tag>
                     <el-tag type="danger" size="small" v-if="scope.row.level == 2">紧急</el-tag>
                   </template>

+ 1 - 1
src/views/iot/device/instance/index.vue

@@ -1,6 +1,6 @@
 <template>
   <div class="page">
-    <el-card shadow="nover" v-loading="batchLoading">
+    <el-card shadow="never" v-loading="batchLoading">
       <div class="system-user-search mb15">
         <el-form :model="tableData.param" ref="queryRef" inline class="search-form">
           <div class="search-conditions">

+ 1 - 1
src/views/iot/device/product/detail.vue

@@ -109,7 +109,7 @@
 							<el-table-column label="名称" prop="name" show-overflow-tooltip />
 							<el-table-column prop="level" label="事件级别" width="120" align="center">
 								<template #default="scope">
-									<el-tag type="primary" size="small" v-if="scope.row.level == 0">普通</el-tag>
+									<el-tag size="small" v-if="scope.row.level == 0">普通</el-tag>
 									<el-tag type="warning" size="small" v-if="scope.row.level == 1">警告</el-tag>
 									<el-tag type="danger" size="small" v-if="scope.row.level == 2">紧急</el-tag>
 								</template>

+ 1 - 1
src/views/iot/device/product/index.vue

@@ -1,6 +1,6 @@
 <template>
   <div class="page">
-    <el-card shadow="nover">
+    <el-card shadow="never">
       <el-form :model="tableData.param" ref="queryRef" inline label-width="68px">
         <!-- 关键字 -->
         <el-form-item :label="$t('message.device.formI18nLabel.keyword')" prop="name">

+ 1 - 1
src/views/iot/device/template/index.vue

@@ -1,6 +1,6 @@
 <template>
 	<div class="page">
-		<el-card shadow="nover">
+		<el-card shadow="never">
 			<div class="search">
 				<el-form :model="params" inline ref="queryRef">
 					<el-form-item label="模板名称" prop="title">

+ 1 - 1
src/views/iot/ice104/device/index.vue

@@ -1,6 +1,6 @@
 <template>
 	<div class="page">
-		<el-card shadow="nover">
+		<el-card shadow="never">
 			<el-form :model="params" inline ref="queryRef" @submit.prevent>
 				<el-form-item label="设备名称" prop="title">
 					<el-input v-model="params.title" placeholder="请输入设备名称" clearable style="width: 240px" @keyup.enter.native="getList(1)" />

+ 1 - 1
src/views/iot/ice104/template/index.vue

@@ -1,7 +1,7 @@
 
 <template>
 	<div class="page">
-		<el-card shadow="nover">
+		<el-card shadow="never">
 			<el-form :model="params" inline ref="queryRef">
 				<el-form-item label="模版名称" prop="title">
 					<el-input v-model="params.title" placeholder="请输入模版名称" clearable style="width: 240px" @keyup.enter.native="getList(1)" />

+ 1 - 1
src/views/iot/network/server/index.vue

@@ -1,6 +1,6 @@
 <template>
   <div class="page">
-    <el-card shadow="nover">
+    <el-card shadow="never">
       <el-form inline label-width="auto" @keyup.enter="searchData">
         <el-form-item label="服务器名称">
           <el-input style="width: 200px;" class="search-input" v-model="key" placeholder="请输入搜索关键字" clearable>

+ 1 - 1
src/views/iot/network/tunnel/index.vue

@@ -1,6 +1,6 @@
 <template>
   <div class="page">
-    <el-card shadow="nover">
+    <el-card shadow="never">
       <el-form inline label-width="68px">
         <el-form-item label="通道名称" @keyup.enter.native="searchData()">
           <el-input style="width: 200px;margin-left: 20px;" class="search-input" v-model="key" placeholder="请输入搜索关键字" clearable>

+ 1 - 1
src/views/iot/noticeservices/config/index.vue

@@ -1,6 +1,6 @@
 <template>
   <div class="page">
-    <el-card shadow="nover">
+    <el-card shadow="never">
       <el-row>
         <el-col :span="12" v-for="item in notice_send_gateway">
           <div class="ant-cards " v-if="item.status == 1">

+ 1 - 1
src/views/iot/noticeservices/config/setting.vue

@@ -1,5 +1,5 @@
 <template>
-	<el-card shadow="nover" class="page">
+	<el-card shadow="never" class="page">
 		<div class="system-user-search">
 			<el-form :model="tableData.param" ref="queryRef" inline @keyup.enter.native="dataList">
 				<el-form-item label="配置名称" prop="keyWord">

+ 1 - 1
src/views/iot/noticeservices/log/index.vue

@@ -1,6 +1,6 @@
 <template>
 	<div class="page">
-		<el-card shadow="nover">
+		<el-card shadow="never">
 			<el-form :model="tableData.param" ref="queryRef" inline label-width="68px">
 				<el-form-item label="发送时间" prop="dateRange">
 					<el-date-picker v-model="tableData.param.dateRange" style="width: 240px" value-format="YYYY-MM-DD" type="daterange" range-separator="-" start-placeholder="开始日期" end-placeholder="结束日期"></el-date-picker>

+ 1 - 1
src/views/iot/operate/remoteconf/index.vue

@@ -1,6 +1,6 @@
 <template>
   <div class="page">
-    <el-card shadow="nover">
+    <el-card shadow="never">
       <h2>远程配置</h2>
       <div class="container">
         <div class="selectContainer">

+ 1 - 1
src/views/iot/ota-update/data/index.vue

@@ -1,5 +1,5 @@
 <template>
-	<el-card shadow="nover">
+	<el-card shadow="never">
 		<el-tabs v-model="activeTab">
 			<el-tab-pane label="版本分布" name="tab1">
 				<div class="flex">

+ 1 - 1
src/views/iot/ota-update/module/index.vue

@@ -1,6 +1,6 @@
 <template>
   <div class="page">
-    <el-card shadow="nover">
+    <el-card shadow="never">
       <el-form :model="tableData.param" ref="queryRef" inline label-width="68px" @keyup.enter.native="getList(1)">
         <el-form-item label="模块名称" prop="name">
           <el-input v-model="tableData.param.name" placeholder="请输入模块名称" clearable style="width: 200px;" />

+ 2 - 2
src/views/iot/ota-update/update/component/batch.vue

@@ -32,13 +32,13 @@
       <el-table-column label="类型" prop="types" width="120" align="center">
         <template #default="scope">
           <el-tag type="success" size="small" v-if="scope.row.types == 0">验证</el-tag>
-          <el-tag type="primary" size="small" v-else>升级</el-tag>
+          <el-tag size="small" v-else>升级</el-tag>
         </template>
       </el-table-column>
       <el-table-column label="状态" prop="status" width="120" align="center">
         <template #default="scope">
           <!-- 0待升级 1升级中,2完成 -->
-          <el-tag type="primary" size="small" v-if="scope.row.status === 1">升级中</el-tag>
+          <el-tag size="small" v-if="scope.row.status === 1">升级中</el-tag>
           <el-tag type="success" size="small" v-else-if="scope.row.status === 2">完成</el-tag>
           <el-tag type="warning" size="small" v-else>待升级</el-tag>
         </template>

+ 1 - 1
src/views/iot/ota-update/update/component/device.vue

@@ -1,6 +1,6 @@
 <template>
 	<div>
-		<el-card shadow="nover">
+		<el-card shadow="never">
 			<div class="search">
 				<el-form inline ref="queryRef">
 					<el-form-item label="设备名称:" prop="name">

+ 3 - 3
src/views/iot/ota-update/update/index.vue

@@ -1,6 +1,6 @@
 <template>
 	<div class="page">
-		<el-card shadow="nover">
+		<el-card shadow="never">
 			<el-form :model="tableData.param" ref="queryRef" inline>
 				<el-form-item label="升级包名称" prop="keyWord">
 					<el-input
@@ -58,14 +58,14 @@
 				<el-table-column label="需要验证" prop="check" v-col="'check'" width="120" align="center">
 					<template #default="scope">
 						<!-- 1需要,2不需要  -->
-						<el-tag type="primary" size="small" v-if="scope.row.check === 1">需要</el-tag>
+						<el-tag size="small" v-if="scope.row.check === 1">需要</el-tag>
 						<el-tag type="danger" size="small" v-if="scope.row.check === 2">不需要</el-tag>
 					</template>
 				</el-table-column>
 				<el-table-column label="状态" prop="checkres" v-col="'checkres'" width="120" align="center">
 					<template #default="scope">
 						<!-- 升级包验证 0未验证,1验证中 2已验证 -->
-						<el-tag type="primary" size="small" v-if="scope.row.checkres === 1">验证中</el-tag>
+						<el-tag size="small" v-if="scope.row.checkres === 1">验证中</el-tag>
 						<el-tag type="success" size="small" v-if="scope.row.checkres === 2">已验证</el-tag>
 						<el-tag type="danger" size="small" v-if="scope.row.checkres === 0">未验证</el-tag>
 					</template>

+ 1 - 1
src/views/iot/projects/detail/index.vue

@@ -1,6 +1,6 @@
 <template>
   <div class="page">
-    <el-card shadow="nover" class="small-padding">
+    <el-card shadow="never" class="small-padding">
       <el-tabs :model-value="'0'" size="small" class="h-full">
         <el-tab-pane label="项目概况" name="0" lazy>
           <InfoVue></InfoVue>

+ 1 - 1
src/views/iot/projects/filter/index.vue

@@ -1,6 +1,6 @@
 <template>
   <div class="page">
-    <el-card shadow="nover">
+    <el-card shadow="never">
       <div class="search">
         <el-form inline>
           <el-form-item>

+ 1 - 1
src/views/iot/projects/list/index.vue

@@ -1,6 +1,6 @@
 <template>
   <div class="page">
-    <el-card shadow="nover">
+    <el-card shadow="never">
       <div class="search">
         <el-form inline>
           <el-form-item>

+ 2 - 2
src/views/iot/property/attribute/index.vue

@@ -28,7 +28,7 @@
 			</el-form-item>
 		</el-form>
 		<div class="page page-full-part flex-row gap-4">
-			<el-card style="width: 250px" shadow="nover">
+			<el-card style="width: 250px" shadow="never">
 				<el-tree
 					:data="mergedData"
 					:props="defaultProps"
@@ -51,7 +51,7 @@
 					</template>
 				</el-tree>
 			</el-card>
-			<el-card class="flex1" shadow="nover">
+			<el-card class="flex1" shadow="never">
 				<div class="page page-full">
 					<el-table :data="tableData" @selection-change="handleSelectionChange" style="width: 100%" row-key="id" v-loading="loading">
 						<el-table-column type="selection" width="55" align="center" />

+ 2 - 2
src/views/iot/property/dossier/index.vue

@@ -23,7 +23,7 @@
 			</el-form-item>
 		</el-form>
 		<div class="page page-full-part flex-row gap-4">
-			<el-card style="width: 250px;" shadow="nover">
+			<el-card style="width: 250px;" shadow="never">
 				<el-tree :data="mergedData" :props="defaultProps" accordion default-expand-all @node-click="handleNodeClick" :node-key="'id'" highlight-current>
 					<template #default="{ node, data }">
 						<div class="custom-tree-node">
@@ -38,7 +38,7 @@
 					</template>
 				</el-tree>
 			</el-card>
-			<el-card class="flex1" shadow="nover">
+			<el-card class="flex1" shadow="never">
 				<div class="page page-full">
 					<el-table :data="tableData" style="width: 100%" @selection-change="handleSelectionChange" row-key="id" v-loading="loading">
 						<el-table-column type="selection" width="55" align="center" />

+ 2 - 2
src/views/iot/property/relationship/index.vue

@@ -28,7 +28,7 @@
 			</el-form-item>
 		</el-form>
 		<div class="page page-full-part flex-row gap-4">
-			<el-card style="width: 250px;" shadow="nover">
+			<el-card style="width: 250px;" shadow="never">
 				<el-tree :data="treeData" :props="defaultProps" accordion default-expand-all @node-click="handleNodeClick" :node-key="'id'" highlight-current>
 					<template #default="{ node, data }">
 						<div class="custom-tree-node">
@@ -37,7 +37,7 @@
 					</template>
 				</el-tree>
 			</el-card>
-			<el-card class="flex1" shadow="nover">
+			<el-card class="flex1" shadow="never">
 				<div class="page page-full">
 					<el-table :data="tableData" style="width: 100%" @selection-change="handleSelectionChange" row-key="id" v-loading="loading">
 						<el-table-column type="selection" width="55" align="center" />

+ 2 - 2
src/views/iot/rule-engine/index.vue

@@ -1,6 +1,6 @@
 <template>
   <div class="page">
-    <el-card shadow="nover">
+    <el-card shadow="never">
       <el-form inline>
         <el-form-item label="名称">
           <el-input v-model="searchParams.keyWord" placeholder="请输入关键字" clearable @keyup.enter="handleSearch" />
@@ -42,7 +42,7 @@
         <el-table-column type="index" label="序号" width="80" align="center" />
         <el-table-column prop="types" label="类型" width="70" align="center">
           <template #default="scope">
-            <el-tag type="primary" size="small" v-if="scope.row.types == 1">主链</el-tag>
+            <el-tag size="small" v-if="scope.row.types == 1">主链</el-tag>
             <el-tag type="success" size="small" v-else>子链</el-tag>
           </template>
         </el-table-column>

+ 1 - 1
src/views/iot/rule-engine/log.vue

@@ -1,5 +1,5 @@
 <template>
-	<el-card shadow="nover" class="page">
+	<el-card shadow="never" class="page">
 		<el-table :data="tableData" style="width: 100%" row-key="id" v-loading="loading">
 			<el-table-column prop="id" label="ID" width="100" show-overflow-tooltip v-col="'id'"></el-table-column>
 			<el-table-column label="操作" align="center"></el-table-column>

+ 1 - 1
src/views/iot/scene/list/index.vue

@@ -1,6 +1,6 @@
 <template>
 	<div class="page">
-		<el-card shadow="nover">
+		<el-card shadow="never">
 			<el-form inline ref="queryRef" @submit.prevent @keyup.enter.native="getList(1)">
 				<el-form-item label="场景名称" prop="name">
 					<el-input v-model="params.keyWord" placeholder="请输入" clearable style="width: 220px" />

+ 4 - 4
src/views/iot/scene/manage/detail.vue

@@ -1,6 +1,6 @@
 <template>
 	<div v-loading="loading">
-		<el-card class="system-dic-container" shadow="nover" style="position: relative;">
+		<el-card class="system-dic-container" shadow="never" style="position: relative;">
 			<div class="content">
 				<div class="flex cont_box">
 					<div class="font26">场景名称:{{ detail.name }}</div>
@@ -16,11 +16,11 @@
 				</div>
 			</div>
 		</el-card>
-		<el-card shadow="nover" style="margin-top: 15px;" v-if="detail.sceneType === 'device'">
+		<el-card shadow="never" style="margin-top: 15px;" v-if="detail.sceneType === 'device'">
 			<div class="font20">场景定义</div>
 			<SceneItem v-if="showstatus && sourceData.length > 0" :sceneList="sceneList" :sourceData="sourceData" :sceneType="detail.sceneType" @addScenesDetail="addScenesDetail" @delScenesDetail="delScenesDetail" @editScenesDetail="editScenesDetail"></SceneItem>
 		</el-card>
-		<el-card shadow="nover" style="  margin-top: 15px;" v-if="detail.sceneType === 'timer'">
+		<el-card shadow="never" style="  margin-top: 15px;" v-if="detail.sceneType === 'timer'">
 			<el-form-item label="定时触发" style="margin-bottom: 0;">
 				<div style="display:flex">
 					<el-input v-model="timerData.timer" placeholder="请输入cron表达式" />
@@ -31,7 +31,7 @@
 				</div>
 			</el-form-item>
 		</el-card>
-		<el-card shadow="nover" style="margin-top: 15px;">
+		<el-card shadow="never" style="margin-top: 15px;">
 			<div class="font20">场景动作</div>
 			<ActionItem v-if="detail.id && sourceData.length > 0" :scene_id="detail.id" :sourceData="sourceData"></ActionItem>
 		</el-card>

+ 1 - 1
src/views/iot/scene/manage/index.vue

@@ -1,6 +1,6 @@
 <template>
 	<div class="page">
-		<el-card shadow="nover">
+		<el-card shadow="never">
 			<div class="search">
 				<el-form inline ref="queryRef" @keyup.enter="getList(1)">
 					<el-form-item label="关键字" prop="keyWord">

+ 3 - 3
src/views/limits/frontEnd/btn/index.vue

@@ -2,7 +2,7 @@
 	<div>
 		<LimitsFrontEndPage />
 		<!-- 演示1:组件方式 -->
-		<el-card shadow="nover" header="演示1:组件方式" class="mt15">
+		<el-card shadow="never" header="演示1:组件方式" class="mt15">
 			<el-row class="mb10" style="color: #808080">单个权限验证(:value="xxx"):</el-row>
 			<div class="flex-warp">
 				<Auth :value="'btn.add'">
@@ -161,7 +161,7 @@
 		</el-card>
 
 		<!-- 演示2:指令方式 -->
-		<el-card shadow="nover" header="演示2:指令方式(页面初始化时执行)" class="mt15">
+		<el-card shadow="never" header="演示2:指令方式(页面初始化时执行)" class="mt15">
 			<el-row class="mb10" style="color: #808080">单个权限验证(v-auth="xxx"):</el-row>
 			<div class="flex-warp">
 				<div class="flex-warp-item" v-auth="'btn.add'">
@@ -296,7 +296,7 @@
 		</el-card>
 
 		<!-- 演示3:函数方式 -->
-		<el-card shadow="nover" header="演示3:函数方式(点击按钮查看有无权限,用于判断)" class="mt15">
+		<el-card shadow="never" header="演示3:函数方式(点击按钮查看有无权限,用于判断)" class="mt15">
 			<el-row class="mb10" style="color: #808080">auth('xxx')、auths(['xxx','xxx'])、authAll(['xxx','xxx']):</el-row>
 			<div class="flex-warp">
 				<div class="flex-warp-item">

+ 1 - 1
src/views/limits/frontEnd/page/index.vue

@@ -13,7 +13,7 @@
 			:closable="false"
 			class="mt15"
 		></el-alert>
-		<el-card shadow="nover" header="切换用户演示,前端控制不同用户显示不同页面、按钮权限" class="mt15">
+		<el-card shadow="never" header="切换用户演示,前端控制不同用户显示不同页面、按钮权限" class="mt15">
 			<el-radio-group v-model="userAuth" @change="onRadioChange">
 				<el-radio-button label="admin"></el-radio-button>
 				<el-radio-button label="common"></el-radio-button>

+ 388 - 299
src/views/login/index.vue

@@ -1,327 +1,416 @@
 <template>
-	<div class="login-container flex-row" v-if="showImg">
-		<el-switch class="switch" v-model="getThemeConfig.isIsDark" size="large" inline-prompt @change="onAddDarkChange" :active-icon="Sunny" :inactive-icon="Moon" style="--el-switch-on-color: #fff; --el-switch-off-color: #151515"></el-switch>
-		<div class="part left">
-			<div class="flex logo">
-				<el-image class="logoimg" :src="sysinfo.systemLogo" />
-				{{ sysinfo.systemName }}
-			</div>
-			<el-image class="img" :src="sysinfo.systemLoginPIC" />
-			<div>
-				<span class="text" v-if="sysinfo.buildTime" style="margin-right: 5px">服务端版本:{{ sysinfo.buildVersion }} </span>
-				<span class="text" v-if="sysinfo.buildTime">{{ dayjs(sysinfo.buildTime).format('YYYY-MM-DD HH:mm:ss') }}</span>
-				<div style="height: 10px;"></div>
-				<span class="text" v-if="versionInfo.version" style="margin-right: 5px">前端版本:{{ versionInfo.version }} </span>
-				<span class="text" v-if="versionInfo.updateTime">{{ versionInfo.updateTime }}</span>
-			</div>
-		</div>
-		<div class="part">
-			<div class="title">登录</div>
-			<Account :showSSO="showSSO" />
-		</div>
-	</div>
+  <div class="login-container flex-row" v-if="showImg">
+    <!-- 多语言切换 -->
+    <el-dropdown class="language-switch" :show-timeout="70" :hide-timeout="50" trigger="click" @command="onLanguageChange">
+      <div class="language-switch-icon">
+        <i class="iconfont" :class="disabledI18n === 'en' ? 'icon-fuhao-yingwen' : 'icon-fuhao-zhongwen'" :title="$t('message.user.title1')"></i>
+      </div>
+      <template #dropdown>
+        <el-dropdown-menu>
+          <el-dropdown-item command="zh-cn" :disabled="disabledI18n === 'zh-cn'">简体中文</el-dropdown-item>
+          <el-dropdown-item command="en" :disabled="disabledI18n === 'en'">English</el-dropdown-item>
+          <el-dropdown-item command="zh-tw" :disabled="disabledI18n === 'zh-tw'">繁體中文</el-dropdown-item>
+        </el-dropdown-menu>
+      </template>
+    </el-dropdown>
+    <!-- 深色模式切换 -->
+    <el-switch class="switch" v-model="getThemeConfig.isIsDark" size="large" inline-prompt @change="onAddDarkChange" :active-icon="Sunny" :inactive-icon="Moon" style="--el-switch-on-color: #fff; --el-switch-off-color: #151515"></el-switch>
+    <div class="part left">
+      <div class="flex logo">
+        <el-image class="logoimg" :src="sysinfo.systemLogo" />
+        {{ sysinfo.systemName }}
+      </div>
+      <el-image class="img" :src="sysinfo.systemLoginPIC" />
+      <div>
+        <span class="text" v-if="sysinfo.buildTime" style="margin-right: 5px">{{ $t('message.login.serverVersion') }}:{{ sysinfo.buildVersion }} </span>
+        <span class="text" v-if="sysinfo.buildTime">{{ dayjs(sysinfo.buildTime).format("YYYY-MM-DD HH:mm:ss") }}</span>
+        <div style="height: 10px"></div>
+        <span class="text" v-if="versionInfo.version" style="margin-right: 5px">{{ $t('message.login.frontendVersion') }}:{{ versionInfo.version }} </span>
+        <span class="text" v-if="versionInfo.updateTime">{{ versionInfo.updateTime }}</span>
+      </div>
+    </div>
+    <div class="part">
+      <div class="title">{{ $t('message.login.title') }}</div>
+      <Account :showSSO="showSSO" />
+    </div>
+  </div>
 </template>
 
 <script lang="ts">
-import { toRefs, reactive, computed, defineComponent } from 'vue';
-import Account from '/@/views/login/component/account.vue';
-import { useStore } from '/@/store/index';
-import logoMini from '/imgs/logo.png';
-import { Sunny, Moon } from '@element-plus/icons-vue';
-import dayjs from 'dayjs';
-import api from '/@/api/system';
-import axios from 'axios';
-import { setSystemInfo, setTenantInfo } from '/@/utils/auth';
+import { toRefs, reactive, computed, defineComponent, getCurrentInstance } from "vue";
+import Account from "/@/views/login/component/account.vue";
+import { useStore } from "/@/store/index";
+import logoMini from "/imgs/logo.png";
+import { Sunny, Moon } from "@element-plus/icons-vue";
+import dayjs from "dayjs";
+import api from "/@/api/system";
+import axios from "axios";
+import { setSystemInfo, setTenantInfo } from "/@/utils/auth";
+import { Local } from "/@/utils/storage";
+import other from "/@/utils/other";
 // import PackageJson from '/public/version.json';
 // 定义接口来定义对象的类型
 interface LoginState {
-	tabsActiveName: string;
-	isScan: boolean;
+  tabsActiveName: string;
+  isScan: boolean;
+  disabledI18n: string;
 }
 
 export default defineComponent({
-	name: 'loginIndex',
-	components: {
-		Account,
-	},
-	data: function () {
-		return {
-			Sunny,
-			Moon,
-			dayjs,
-			showImg: false,
-			showSSO: false,
-			sysinfo: {
-				buildVersion: '',
-				systemName: '',
-				buildTime: '',
-				systemCopyright: '',
-				systemLogo: '',
-				systemLoginPIC: '',
-			},
-		};
-	},
-	created() {
-		setTenantInfo();
-	},
-	mounted() {
-		api.sysinfo().then((res: any) => {
-			setSystemInfo(res);
-			this.sysinfo = res
-			const isSSOEnabled = window.atob(res.target).split('|')[4]
-			if (isSSOEnabled == '1') {
-				this.showSSO = true
-			}
-		}).finally(() => this.showImg = true)
-	},
-	setup() {
-		const store = useStore();
-		const state = reactive<LoginState>({
-			tabsActiveName: 'account',
-			isScan: false,
-		});
-		// 获取布局配置信息
-		const getThemeConfig = computed(() => {
-			return store.state.themeConfig.themeConfig;
-		});
-
-		const versionInfo = reactive({
-			version: '',
-			updateTime: '',
-		})
-		// 加载版本信息
-		axios.get('/versionInfo.json').then(res => {
-			versionInfo.version = res.data.version
-			versionInfo.updateTime = res.data.updateTime
-		})
-
-		// 4、界面显示 --> 深色模式
-		const onAddDarkChange = () => {
-			const body = document.documentElement as HTMLElement;
-			if (getThemeConfig.value.isIsDark) {
-				body.setAttribute('data-theme', 'dark');
-				document.querySelector('html')!.className = 'dark'
-			} else {
-				body.setAttribute('data-theme', '');
-				document.querySelector('html')!.className = ''
-			}
-			store.dispatch('themeConfig/setThemeConfig', getThemeConfig.value);
-		};
-
-		return {
-			onAddDarkChange,
-			logoMini,
-			getThemeConfig,
-			versionInfo,
-			...toRefs(state),
-		};
-	},
+  name: "loginIndex",
+  components: {
+    Account,
+  },
+  data: function () {
+    return {
+      Sunny,
+      Moon,
+      dayjs,
+      showImg: false,
+      showSSO: false,
+      sysinfo: {
+        buildVersion: "",
+        systemName: "",
+        buildTime: "",
+        systemCopyright: "",
+        systemLogo: "",
+        systemLoginPIC: "",
+      },
+    };
+  },
+  created() {
+    setTenantInfo();
+  },
+  mounted() {
+    api
+      .sysinfo()
+      .then((res: any) => {
+        setSystemInfo(res);
+        this.sysinfo = res;
+        const isSSOEnabled = window.atob(res.target).split("|")[4];
+        if (isSSOEnabled == "1") {
+          this.showSSO = true;
+        }
+      })
+      .finally(() => (this.showImg = true));
+  },
+  setup() {
+    const store = useStore();
+    const { proxy } = <any>getCurrentInstance();
+    const state = reactive<LoginState>({
+      tabsActiveName: "account",
+      isScan: false,
+      disabledI18n: "zh-cn",
+    });
+    // 获取布局配置信息
+    const getThemeConfig = computed(() => {
+      return store.state.themeConfig.themeConfig;
+    });
+
+    const versionInfo = reactive({
+      version: "",
+      updateTime: "",
+    });
+    // 加载版本信息
+    axios.get("/versionInfo.json").then((res) => {
+      versionInfo.version = res.data.version;
+      versionInfo.updateTime = res.data.updateTime;
+    });
+
+    // 语言切换
+    const onLanguageChange = (lang: string) => {
+      Local.remove("themeConfig");
+      getThemeConfig.value.globalI18n = lang;
+      Local.set("themeConfig", getThemeConfig.value);
+      proxy.$i18n.locale = lang;
+      initI18n();
+      other.useTitle();
+    };
+
+    // 设置 element plus 组件的国际化
+    const setI18nConfig = (locale: string) => {
+      proxy.mittBus.emit("getI18nConfig", proxy.$i18n.messages[locale]);
+    };
+    // 初始化言语国际化
+    const initI18n = () => {
+      switch (Local.get("themeConfig").globalI18n) {
+        case "zh-cn":
+          state.disabledI18n = "zh-cn";
+          setI18nConfig("zh-cn");
+          break;
+        case "en":
+          state.disabledI18n = "en";
+          setI18nConfig("en");
+          break;
+        case "zh-tw":
+          state.disabledI18n = "zh-tw";
+          setI18nConfig("zh-tw");
+          break;
+      }
+    };
+
+    // 4、界面显示 --> 深色模式
+    const onAddDarkChange = () => {
+      const body = document.documentElement as HTMLElement;
+      if (getThemeConfig.value.isIsDark) {
+        body.setAttribute("data-theme", "dark");
+        document.querySelector("html")!.className = "dark";
+      } else {
+        body.setAttribute("data-theme", "");
+        document.querySelector("html")!.className = "";
+      }
+      store.dispatch("themeConfig/setThemeConfig", getThemeConfig.value);
+    };
+
+    // 初始化当前语言状态
+    state.disabledI18n = getThemeConfig.value.globalI18n || "zh-cn";
+
+    return {
+      onAddDarkChange,
+      onLanguageChange,
+      logoMini,
+      getThemeConfig,
+      versionInfo,
+      ...toRefs(state),
+    };
+  },
 });
 </script>
 
 <style scoped lang="scss">
-html[data-theme='dark'] {
-	.login-container {
-		background: #293146;
-	}
-
-	.left {
-		background-image: url(/@/assets/login-bg-dark.svg);
-	}
-
-	.title {
-		color: #aaa;
-	}
+html[data-theme="dark"] {
+  .login-container {
+    background: #293146;
+  }
+
+  .left {
+    background-image: url(/@/assets/login-bg-dark.svg);
+  }
+
+  .title {
+    color: #aaa;
+  }
 }
 
 .flex {
-	display: flex;
-	align-items: center;
+  display: flex;
+  align-items: center;
 }
 
 .text {
-	color: #fff;
+  color: #fff;
+}
+
+.language-switch {
+  position: fixed;
+  right: 80px;
+  top: 20px;
+  z-index: 1000;
+
+  .language-switch-icon {
+    width: 40px;
+    height: 40px;
+    display: flex;
+    align-items: center;
+    justify-content: center;
+    border-radius: 50%;
+    background: rgba(255, 255, 255, 0.1);
+    backdrop-filter: blur(10px);
+    border: 1px solid rgba(255, 255, 255, 0.2);
+    cursor: pointer;
+    transition: all 0.3s ease;
+
+    &:hover {
+      background: rgba(255, 255, 255, 0.2);
+      transform: scale(1.05);
+    }
+
+    i {
+      font-size: 20px;
+      color: #fff;
+    }
+  }
 }
 
 .switch {
-	position: fixed;
-	right: 20px;
-	top: 20px;
+  position: fixed;
+  right: 20px;
+  top: 20px;
 }
 
 .login-container {
-	width: 100vw;
-	height: 100vh;
-	position: relative;
-	background: #fff;
-
-	.title {
-		font-size: 30px;
-		color: #333;
-		font-weight: bold;
-		letter-spacing: 20px;
-	}
-
-	.logo {
-		font-size: 30px;
-		color: #fff;
-
-		.logoimg {
-			height: 50px;
-			display: block;
-			margin-right: 12px;
-		}
-	}
-
-	.img {
-		max-width: 50%;
-		display: block;
-		max-height: 40vh;
-	}
-
-	.part {
-		flex: 1;
-		display: flex;
-		flex-flow: column nowrap;
-		justify-content: center;
-		align-items: center;
-	}
-
-	.left {
-		height: 100vh;
-		background-image: url(/@/assets/login-bg.svg);
-		background-repeat: no-repeat;
-		background-size: auto 100%;
-		background-position: right center;
-		align-items: flex-start;
-		padding-left: 8%;
-		justify-content: space-around;
-		padding-top: 10vh;
-		padding-bottom: 10vh;
-	}
-
-	.login-icon-group {
-		width: 100%;
-		height: 100%;
-		position: relative;
-
-		.login-icon-group-title {
-			display: flex;
-			align-items: center;
-			justify-content: center;
-			margin: 12px 0;
-
-			img {
-				width: auto;
-				height: 40px;
-			}
-
-			&-text {
-				padding-left: 20px;
-				color: var(--el-color-primary);
-			}
-		}
-
-		&-icon {
-			width: 60%;
-			height: 70%;
-			position: absolute;
-			left: 0;
-			bottom: 0;
-		}
-	}
-
-	.login-content-out {
-		width: 100%;
-		height: 100%;
-		padding-top: calc(50vh - 227px);
-	}
-
-	.login-content {
-		width: 500px;
-		padding: 20px;
-		margin-left: calc(50% - 500px);
-		background-color: rgba(255, 255, 255, 0.8);
-		border: 5px solid var(--el-color-primary-light-8);
-		border-radius: 5px;
-		overflow: hidden;
-		z-index: 1;
-		position: relative;
-
-		.login-content-main {
-			margin: 0 auto;
-			width: 80%;
-
-			.login-content-title {
-				color: var(--el-text-color-primary);
-				font-weight: 500;
-				font-size: 22px;
-				text-align: center;
-				letter-spacing: 4px;
-				margin: 15px 0 30px;
-				white-space: nowrap;
-				z-index: 5;
-				position: relative;
-				transition: all 0.3s ease;
-			}
-		}
-
-		.login-content-main-sacn {
-			position: absolute;
-			top: 0;
-			right: 0;
-			width: 50px;
-			height: 50px;
-			overflow: hidden;
-			cursor: pointer;
-			transition: all ease 0.3s;
-			color: var(--el-text-color-primary);
-
-			&-delta {
-				position: absolute;
-				width: 35px;
-				height: 70px;
-				z-index: 2;
-				top: 2px;
-				right: 21px;
-				background: var(--el-color-white);
-				transform: rotate(-45deg);
-			}
-
-			&:hover {
-				opacity: 1;
-				transition: all ease 0.3s;
-				color: var(--el-color-primary) !important;
-			}
-
-			i {
-				width: 47px;
-				height: 50px;
-				display: inline-block;
-				font-size: 48px;
-				position: absolute;
-				right: 2px;
-				top: -1px;
-			}
-		}
-	}
-
-	.login-footer {
-		position: absolute;
-		bottom: 5px;
-		width: 100%;
-
-		&-content {
-			width: 100%;
-			display: flex;
-
-			&-warp {
-				margin: auto;
-				color: #e0e3e9;
-				text-align: center;
-				animation: error-num 1s ease-in-out;
-			}
-		}
-	}
+  width: 100vw;
+  height: 100vh;
+  position: relative;
+  background: #fff;
+
+  .title {
+    font-size: 30px;
+    color: #333;
+    font-weight: bold;
+    letter-spacing: 20px;
+  }
+
+  .logo {
+    font-size: 30px;
+    color: #fff;
+
+    .logoimg {
+      height: 50px;
+      display: block;
+      margin-right: 12px;
+    }
+  }
+
+  .img {
+    max-width: 50%;
+    display: block;
+    max-height: 40vh;
+  }
+
+  .part {
+    flex: 1;
+    display: flex;
+    flex-flow: column nowrap;
+    justify-content: center;
+    align-items: center;
+  }
+
+  .left {
+    height: 100vh;
+    background-image: url(/@/assets/login-bg.svg);
+    background-repeat: no-repeat;
+    background-size: auto 100%;
+    background-position: right center;
+    align-items: flex-start;
+    padding-left: 8%;
+    justify-content: space-around;
+    padding-top: 10vh;
+    padding-bottom: 10vh;
+  }
+
+  .login-icon-group {
+    width: 100%;
+    height: 100%;
+    position: relative;
+
+    .login-icon-group-title {
+      display: flex;
+      align-items: center;
+      justify-content: center;
+      margin: 12px 0;
+
+      img {
+        width: auto;
+        height: 40px;
+      }
+
+      &-text {
+        padding-left: 20px;
+        color: var(--el-color-primary);
+      }
+    }
+
+    &-icon {
+      width: 60%;
+      height: 70%;
+      position: absolute;
+      left: 0;
+      bottom: 0;
+    }
+  }
+
+  .login-content-out {
+    width: 100%;
+    height: 100%;
+    padding-top: calc(50vh - 227px);
+  }
+
+  .login-content {
+    width: 500px;
+    padding: 20px;
+    margin-left: calc(50% - 500px);
+    background-color: rgba(255, 255, 255, 0.8);
+    border: 5px solid var(--el-color-primary-light-8);
+    border-radius: 5px;
+    overflow: hidden;
+    z-index: 1;
+    position: relative;
+
+    .login-content-main {
+      margin: 0 auto;
+      width: 80%;
+
+      .login-content-title {
+        color: var(--el-text-color-primary);
+        font-weight: 500;
+        font-size: 22px;
+        text-align: center;
+        letter-spacing: 4px;
+        margin: 15px 0 30px;
+        white-space: nowrap;
+        z-index: 5;
+        position: relative;
+        transition: all 0.3s ease;
+      }
+    }
+
+    .login-content-main-sacn {
+      position: absolute;
+      top: 0;
+      right: 0;
+      width: 50px;
+      height: 50px;
+      overflow: hidden;
+      cursor: pointer;
+      transition: all ease 0.3s;
+      color: var(--el-text-color-primary);
+
+      &-delta {
+        position: absolute;
+        width: 35px;
+        height: 70px;
+        z-index: 2;
+        top: 2px;
+        right: 21px;
+        background: var(--el-color-white);
+        transform: rotate(-45deg);
+      }
+
+      &:hover {
+        opacity: 1;
+        transition: all ease 0.3s;
+        color: var(--el-color-primary) !important;
+      }
+
+      i {
+        width: 47px;
+        height: 50px;
+        display: inline-block;
+        font-size: 48px;
+        position: absolute;
+        right: 2px;
+        top: -1px;
+      }
+    }
+  }
+
+  .login-footer {
+    position: absolute;
+    bottom: 5px;
+    width: 100%;
+
+    &-content {
+      width: 100%;
+      display: flex;
+
+      &-warp {
+        margin: auto;
+        color: #e0e3e9;
+        text-align: center;
+        animation: error-num 1s ease-in-out;
+      }
+    }
+  }
 }
 </style>

+ 1 - 1
src/views/modules/assess/index.vue

@@ -1,6 +1,6 @@
 <template>
   <div class="page">
-    <el-card shadow="nover">
+    <el-card shadow="never">
       <div class="system-user-search mb15">
         <!-- <el-input placeholder="请输入用户名称" style="max-width: 180px"> </el-input>
 				<el-button type="success" class="ml10">

+ 332 - 369
src/views/modules/iotCard/dashboard.vue

@@ -1,142 +1,134 @@
 <!-- 物联网卡-详情 -->
 <template>
   <div class="page">
-		<el-card shadow="nover" class="page-full-part">
-      <div shadow="nover" class="top-wrap">
+    <el-card shadow="never" class="page-full-part">
+      <div shadow="never" class="top-wrap">
         <div class="title flex">
-          数据统计
+          {{ $t("message.iotCard.dashboard.title") }}
           <div class="select-wrap">
-            <el-select v-model="types" placeholder="请选择" style="width: 120px" @change="typeChange()">
+            <el-select v-model="types" :placeholder="$t('message.iotCard.dashboard.carrier.placeholder')" style="width: 120px" @change="typeChange()">
               <!-- 1电信,2联通,3移动 -->
-              <el-option label="电信" :value="1" />
-<!--              <el-option label="联通" :value="2" disabled/>-->
-<!--              <el-option label="移动" :value="3" disabled/>-->
+              <el-option :label="$t('message.iotCard.dashboard.carrier.telecom')" :value="1" />
+              <!--              <el-option :label="$t('message.iotCard.dashboard.carrier.unicom')" :value="2" disabled/>-->
+              <!--              <el-option :label="$t('message.iotCard.dashboard.carrier.mobile')" :value="3" disabled/>-->
             </el-select>
           </div>
         </div>
         <div class="top-inner-wrap">
           <div class="line-wrap flow-line-wrap">
             <div class="text-wrap">
-              <div class="text">昨日流量消耗</div>
-              <div>{{formatSize(statisticsData.yesterdayTotal * 1024 * 1024)}}</div>
+              <div class="text">{{ $t("message.iotCard.dashboard.statistics.yesterdayFlow") }}</div>
+              <div>{{ formatSize(statisticsData.yesterdayTotal * 1024 * 1024) }}</div>
             </div>
             <div class="line-inner-wrap" ref="yesterdayLine"></div>
           </div>
           <div class="line-wrap flow-line-wrap">
             <div class="text-wrap">
-              <div class="text">当月流量消耗</div>
-              <div>{{formatSize(statisticsData.realMonthTotal * 1024 * 1024)}}</div>
+              <div class="text">{{ $t("message.iotCard.dashboard.statistics.monthFlow") }}</div>
+              <div>{{ formatSize(statisticsData.realMonthTotal * 1024 * 1024) }}</div>
             </div>
             <div class="line-inner-wrap" ref="monthLine"></div>
           </div>
 
           <div class="line-wrap flow-line-wrap">
             <div class="text-wrap">
-              <div class="text">本年流量消耗</div>
-              <div>{{formatSize(statisticsData.yearTotal * 1024 * 1024)}}</div>
+              <div class="text">{{ $t("message.iotCard.dashboard.statistics.yearFlow") }}</div>
+              <div>{{ formatSize(statisticsData.yearTotal * 1024 * 1024) }}</div>
             </div>
             <div class="line-inner-wrap" ref="yearLine"></div>
           </div>
         </div>
-
-        
       </div>
-			<div class="statistics-wrap">
-				<el-card shadow="nover" class="left-wrap">
-					<div class="top-title-wrap">
-							<div class="title">流量统计</div>
-							<div class="operate-wrap">
-								<el-button-group>
-									<el-button @click="changeDate(1)" :type="activeIndex == 1 ?  'primary' : ''">昨日</el-button>
-									<el-button @click="changeDate(2)" :type="activeIndex == 2 ?  'primary' : ''">近一周</el-button>
-									<el-button @click="changeDate(3)" :type="activeIndex == 3 ?  'primary' : ''">近一月</el-button>
-									<el-button @click="changeDate(4)" :type="activeIndex == 4 ?  'primary' : ''">近一年</el-button>
-								</el-button-group>
-									<el-date-picker
-										class="date-picker-wrap"
-										v-model="dateTimeRange"
-										:disabled-date="disabledDate"
-										type="datetimerange"
-										range-separator="至"
-										start-placeholder="开始时间"
-										end-placeholder="结束时间"
-										format="YYYY-MM-DD HH:mm:ss"
-										date-format="YYYY/MM/DD"
-										time-format="hh:mm:ss"
-                    @change="handleDateChange"
-									/>
-							</div>
-					</div>
-					<div style="height: 508px;" ref="flowLine"></div>
-				</el-card>
-
-				<el-card shadow="nover" class="right-wrap">
-					<div class="top-title-wrap">
-						<div class="title">流量使用TOP10</div>
-						<el-date-picker
-							class="date-picker-wrap"
-							v-model="dateRange"
-							:disabled-date="disabledDate"
-							type="daterange"
-							range-separator="至"
-							start-placeholder="开始日期"
-							end-placeholder="结束日期"
-							format="YYYY-MM-DD"
-							date-format="YYYY/MM/DD"
+      <div class="statistics-wrap">
+        <el-card shadow="never" class="left-wrap">
+          <div class="top-title-wrap">
+            <div class="title">{{ $t("message.iotCard.dashboard.flowChart.title") }}</div>
+            <div class="operate-wrap">
+              <el-button-group>
+                <el-button @click="changeDate(1)" :type="activeIndex == 1 ? 'primary' : ''">{{ $t("message.iotCard.dashboard.flowChart.buttons.yesterday") }}</el-button>
+                <el-button @click="changeDate(2)" :type="activeIndex == 2 ? 'primary' : ''">{{ $t("message.iotCard.dashboard.flowChart.buttons.week") }}</el-button>
+                <el-button @click="changeDate(3)" :type="activeIndex == 3 ? 'primary' : ''">{{ $t("message.iotCard.dashboard.flowChart.buttons.month") }}</el-button>
+                <el-button @click="changeDate(4)" :type="activeIndex == 4 ? 'primary' : ''">{{ $t("message.iotCard.dashboard.flowChart.buttons.year") }}</el-button>
+              </el-button-group>
+              <el-date-picker
+                class="date-picker-wrap"
+                v-model="dateTimeRange"
+                :disabled-date="disabledDate"
+                type="datetimerange"
+                :range-separator="$t('message.iotCard.dashboard.flowChart.datePicker.rangeSeparator')"
+                :start-placeholder="$t('message.iotCard.dashboard.flowChart.datePicker.startPlaceholder')"
+                :end-placeholder="$t('message.iotCard.dashboard.flowChart.datePicker.endPlaceholder')"
+                format="YYYY-MM-DD HH:mm:ss"
+                date-format="YYYY/MM/DD"
+                time-format="hh:mm:ss"
+                @change="handleDateChange"
+              />
+            </div>
+          </div>
+          <div style="height: 508px" ref="flowLine"></div>
+        </el-card>
+
+        <el-card shadow="never" class="right-wrap">
+          <div class="top-title-wrap">
+            <div class="title">{{ $t("message.iotCard.dashboard.top10.title") }}</div>
+            <el-date-picker
+              class="date-picker-wrap"
+              v-model="dateRange"
+              :disabled-date="disabledDate"
+              type="daterange"
+              :range-separator="$t('message.iotCard.dashboard.top10.datePicker.rangeSeparator')"
+              :start-placeholder="$t('message.iotCard.dashboard.top10.datePicker.startPlaceholder')"
+              :end-placeholder="$t('message.iotCard.dashboard.top10.datePicker.endPlaceholder')"
+              format="YYYY-MM-DD"
+              date-format="YYYY/MM/DD"
               @change="handleTop10DataChange"
-						/>
-					</div>
-					<div class="ranking-list">
-						<div class="rank-item" v-for="(item, index) in rankList" :key="index">
-							<div :class="`number-item-${++index}`" class="number">{{index++}}</div>
-							<div class="card-num">{{item.accessNumber}}</div>
-							<el-progress class="progress-wrap" :text-inside="true" :stroke-width="16" :percentage="totalNum ? (item.value / totalNum * 100).toFixed(2) : 0" />
-							<div class="flow-num">{{formatSize(item.value * 1024 * 1024)}}</div>
-						</div>
-					</div>
-					
-				</el-card>
-			</div>
-		</el-card>
+            />
+          </div>
+          <div class="ranking-list">
+            <div class="rank-item" v-for="(item, index) in rankList" :key="index">
+              <div :class="`number-item-${index + 1}`" class="number">{{ index + 1 }}</div>
+              <div class="card-num">{{ item.accessNumber }}</div>
+              <el-progress class="progress-wrap" :text-inside="true" :stroke-width="16" :percentage="totalNum ? ((item.value / totalNum) * 100).toFixed(2) : 0" />
+              <div class="flow-num">{{ formatSize(item.value * 1024 * 1024) }}</div>
+            </div>
+          </div>
+        </el-card>
+      </div>
+    </el-card>
   </div>
 </template>
 
 <script lang="ts" setup>
-import { ref, reactive, nextTick, watch, markRaw } from "vue"
+import { ref, reactive, nextTick, watch, markRaw } from "vue";
+import { useI18n } from "vue-i18n";
 import { formatSize } from "/@/utils/common";
-import api from '/@/api/modules/iotCard';
-import { useStore } from '/@/store/index';
-import * as echarts from 'echarts';
-import dayjs from 'dayjs';
+import api from "/@/api/modules/iotCard";
+import { useStore } from "/@/store/index";
+import * as echarts from "echarts";
+import dayjs from "dayjs";
 
 const store = useStore();
+const { t } = useI18n();
 
 const types = ref(1);
 const statisticsData = ref({
-	realMonthTotal: 0,
-	yearTotal: 0,
-	yesterdayTotal: 0
-})
+  realMonthTotal: 0,
+  yearTotal: 0,
+  yesterdayTotal: 0,
+});
 
 const flowLine = ref();
 const yesterdayLine = ref();
 const monthLine = ref();
 const yearLine = ref();
 
-const dateRange = ref<any>([
-  dayjs(new Date()).subtract(1, 'month'),
-  dayjs(new Date()),
-])
-
+const dateRange = ref<any>([dayjs(new Date()).subtract(1, "month"), dayjs(new Date())]);
 
-const dateTimeRange = ref<any>([
-  dayjs(new Date()).subtract(6, 'day'),
-  dayjs(new Date()),
-])
+const dateTimeRange = ref<any>([dayjs(new Date()).subtract(6, "day"), dayjs(new Date())]);
 
 const totalNum = ref(0);
 
-const activeIndex= ref(2);
+const activeIndex = ref(2);
 
 const rankList = ref([]);
 
@@ -149,176 +141,150 @@ const yearLineData = ref<any>([]);
 const monthLineXAxisData = ref<any>([]);
 const monthLineData = ref<any>([]);
 
-const yesterdayLineXAxisData = ref<any>([dayjs(new Date()).subtract(1, 'day').format('YYYY-MM-DD')]);
+const yesterdayLineXAxisData = ref<any>([dayjs(new Date()).subtract(1, "day").format("YYYY-MM-DD")]);
 const yesterdayLineData = ref<any>([]);
 
-
-
 const state = reactive({
-	global: {
-		yesterdayLine: null,
+  global: {
+    yesterdayLine: null,
     monthLine: null,
     yearLine: null,
-		dispose: [null, '', undefined],
-	} as any,
-	myCharts: [],
-	charts: {
-		theme: '',
-		bgColor: '',
-		color: '#303133',
-	},
+    dispose: [null, "", undefined],
+  } as any,
+  myCharts: [],
+  charts: {
+    theme: "",
+    bgColor: "",
+    color: "#303133",
+  },
 });
 
 const disabledDate = (time: Date) => {
-  return time.getTime() > Date.now()
-}
+  return time.getTime() > Date.now();
+};
 
 // 仪表盘折线
-const getFlowDataByDateRange = async (dateRangeData:any) => {
+const getFlowDataByDateRange = async (dateRangeData: any) => {
   const simFlowRes = await api.dashboard.getFlowDataByDateRange({
-    sdate: dayjs(dateRangeData[0]).format('YYYY-MM-DD HH:mm:ss'),
-    edate: dayjs(dateRangeData[1]).format('YYYY-MM-DD HH:mm:ss'),
-    types: types.value
-  })
-	return simFlowRes.data;
-}
+    sdate: dayjs(dateRangeData[0]).format("YYYY-MM-DD HH:mm:ss"),
+    edate: dayjs(dateRangeData[1]).format("YYYY-MM-DD HH:mm:ss"),
+    types: types.value,
+  });
+  return simFlowRes.data;
+};
 
 // 昨日仪表盘折线
 const getYesterdayFlowData = async () => {
-  const yesterday = dayjs(new Date()).subtract(1, 'day').format('YYYY-MM-DD')
-  const res = await getFlowDataByDateRange([
-    yesterday + " 00:00:00",
-    yesterday + " 23:59:59"
-  ])
+  const yesterday = dayjs(new Date()).subtract(1, "day").format("YYYY-MM-DD");
+  const res = await getFlowDataByDateRange([yesterday + " 00:00:00", yesterday + " 23:59:59"]);
   yesterdayLineData.value = [res[0].value];
   initYesterdayLineChart();
-}
+};
 
 // 近一月仪表盘折线
 const getMonthFlowData = async () => {
   monthLineXAxisData.value = [];
   monthLineData.value = [];
-  const monthDay1 = dayjs(new Date()).startOf('month').format('YYYY-MM-DD');
-  const monthDay2 = dayjs(new Date()).endOf('month').format('YYYY-MM-DD');
-  const res = await getFlowDataByDateRange([monthDay1, monthDay2])
-  res.reverse().forEach((item:any) => {
+  const monthDay1 = dayjs(new Date()).startOf("month").format("YYYY-MM-DD");
+  const monthDay2 = dayjs(new Date()).endOf("month").format("YYYY-MM-DD");
+  const res = await getFlowDataByDateRange([monthDay1, monthDay2]);
+  res.reverse().forEach((item: any) => {
     monthLineXAxisData.value.push(item.date);
     monthLineData.value.push(item.value);
-  })
+  });
 
   initMonthLineChart();
-}
+};
 
 // 近一年仪表盘折线
 const getYearFlowData = async () => {
-	yearLineXAxisData.value = [];
-	yearLineData.value = [];
-	const year = dayjs(new Date()).startOf('year').format('YYYY');
-	const res = await getFlowDataByDateRange([
-		year + '-01-01',
-		year + '-12-31'
-	])
-	res.reverse().forEach((item:any) => {
-		yearLineXAxisData.value.push(item.date);
-		yearLineData.value.push(item.value);
-	})
-	initYearLineChart();
-}
+  yearLineXAxisData.value = [];
+  yearLineData.value = [];
+  const year = dayjs(new Date()).startOf("year").format("YYYY");
+  const res = await getFlowDataByDateRange([year + "-01-01", year + "-12-31"]);
+  res.reverse().forEach((item: any) => {
+    yearLineXAxisData.value.push(item.date);
+    yearLineData.value.push(item.value);
+  });
+  initYearLineChart();
+};
 
 // 按钮切换统一调用方法
 const getFlowData = async () => {
-	flowLineXAxisData.value = [];
+  flowLineXAxisData.value = [];
   flowLineData.value = [];
-	const res = await getFlowDataByDateRange(dateTimeRange.value)
-	res.reverse().forEach((item:any) => {
-		flowLineXAxisData.value.push(item.date);
-		flowLineData.value.push(item.value);
-	})
-	iniFlowLineChart();
-}
+  const res = await getFlowDataByDateRange(dateTimeRange.value);
+  res.reverse().forEach((item: any) => {
+    flowLineXAxisData.value.push(item.date);
+    flowLineData.value.push(item.value);
+  });
+  iniFlowLineChart();
+};
 
 // 仪表盘折线按钮
-const changeDate = (key:number) => {
+const changeDate = (key: number) => {
   // 1 昨天 2近一周 3近一月 4近一年
   activeIndex.value = key;
-  if(key === 1) {
+  if (key === 1) {
     // 昨天
-    const yesterday = dayjs(new Date()).subtract(1, 'day').format('YYYY-MM-DD')
-    dateTimeRange.value = [
-      yesterday + " 00:00:00",
-      yesterday + " 23:59:59"
-    ]
-  }else if(key === 2) {
+    const yesterday = dayjs(new Date()).subtract(1, "day").format("YYYY-MM-DD");
+    dateTimeRange.value = [yesterday + " 00:00:00", yesterday + " 23:59:59"];
+  } else if (key === 2) {
     // 近一周
-    dateTimeRange.value = [
-      dayjs(new Date()).subtract(6, 'day'),
-      dayjs(new Date()),
-    ]
-  }else if(key === 3) {
+    dateTimeRange.value = [dayjs(new Date()).subtract(6, "day"), dayjs(new Date())];
+  } else if (key === 3) {
     // 近一月
-    dateTimeRange.value = [
-      dayjs(new Date()).subtract(1, 'month'),
-      dayjs(new Date()),
-    ]
-  }else if(key === 4) {
+    dateTimeRange.value = [dayjs(new Date()).subtract(1, "month"), dayjs(new Date())];
+  } else if (key === 4) {
     // 近一年
-    dateTimeRange.value = [
-      dayjs(new Date()).subtract(1, 'year'),
-      dayjs(new Date()),
-    ]
+    dateTimeRange.value = [dayjs(new Date()).subtract(1, "year"), dayjs(new Date())];
   }
   getFlowData();
-}
+};
 
 // 流量统计时间筛选
-const handleDateChange = async (value:any) => {
-  dateTimeRange.value = [
-    value[0],
-    value[1]
-  ]
+const handleDateChange = async (value: any) => {
+  dateTimeRange.value = [value[0], value[1]];
   // 这里可以添加相应的处理逻辑
   getFlowData();
-}
+};
 
 // 流量使用Top10时间筛选
-const handleTop10DataChange = async (value:any) => {
-  dateTimeRange.value = [
-    value[0],
-    value[1]
-  ]
+const handleTop10DataChange = async (value: any) => {
+  dateTimeRange.value = [value[0], value[1]];
   getTop10Data();
   // 这里可以添加相应的处理逻辑
-}
+};
 
 const typeChange = () => {
-	getYesterdayFlowData();
-	getMonthFlowData();
-	getYearFlowData();
-	getFlowData();
-	getTop10Data();
+  getYesterdayFlowData();
+  getMonthFlowData();
+  getYearFlowData();
+  getFlowData();
+  getTop10Data();
   getFlowAllData();
-}
+};
 
 const getTop10Data = async () => {
   const top10Res = await api.dashboard.getTop10Data({
-    sdate: dayjs(dateRange.value[0]).format('YYYY-MM-DD'),
-    edate: dayjs(dateRange.value[1]).format('YYYY-MM-DD'),
-    types: types.value
-  })
-	rankList.value = top10Res.data || [];
-	totalNum.value = top10Res.data ? top10Res.data[0].value : 0;
-}
+    sdate: dayjs(dateRange.value[0]).format("YYYY-MM-DD"),
+    edate: dayjs(dateRange.value[1]).format("YYYY-MM-DD"),
+    types: types.value,
+  });
+  rankList.value = top10Res.data || [];
+  totalNum.value = top10Res.data ? top10Res.data[0].value : 0;
+};
 const getFlowAllData = async () => {
   const res = await api.dashboard.getFlowData({
-    types: types.value
-  })
-	statisticsData.value = res
-}
+    types: types.value,
+  });
+  statisticsData.value = res;
+};
 
 // 折线图 - 昨日流量消耗
 const initYesterdayLineChart = () => {
   if (!state.global.dispose.some((b: any) => b === state.global.yesterdayLine)) state.global.yesterdayLine.dispose();
-	state.global.yesterdayLine = markRaw(echarts.init(yesterdayLine.value, state.charts.theme));
+  state.global.yesterdayLine = markRaw(echarts.init(yesterdayLine.value, state.charts.theme));
   const option = {
     backgroundColor: state.charts.bgColor,
     xAxis: {
@@ -327,48 +293,47 @@ const initYesterdayLineChart = () => {
     },
     yAxis: [
       {
-        type: 'value',
-        name: '',
+        type: "value",
+        name: "",
         show: false,
-        splitLine: { show: false, lineStyle: { type: 'dashed', color: '#f5f5f5' } },
+        splitLine: { show: false, lineStyle: { type: "dashed", color: "#f5f5f5" } },
       },
     ],
-    tooltip: { 
-			trigger: 'axis',
-			formatter: function (params:any) {
-					var relVal = params[0].name
-					let circle = `<i style="margin-right:4px;display: inline-block;width: 10px;height: 10px;border-radius: 50%;background-color:${params[0].color}"></i>`
-					relVal += '<br/>' + circle + ' 流量: ' + formatSize(params[0].value*1024*1024)
-					return relVal;
-				}
-		},
+    tooltip: {
+      trigger: "axis",
+      formatter: function (params: any) {
+        var relVal = params[0].name;
+        let circle = `<i style="margin-right:4px;display: inline-block;width: 10px;height: 10px;border-radius: 50%;background-color:${params[0].color}"></i>`;
+        relVal += "<br/>" + circle + " " + t("message.iotCard.dashboard.charts.tooltip.traffic") + ": " + formatSize(params[0].value * 1024 * 1024);
+        return relVal;
+      },
+    },
     grid: { top: 10, right: 10, bottom: 10, left: 10 },
     series: [
       {
-        name: '流量',
-        type: 'line',
+        name: t("message.iotCard.dashboard.charts.series.traffic"),
+        type: "line",
         smooth: true,
         data: yesterdayLineData.value,
-        lineStyle: { color: '#fe9a8b' },
-        itemStyle: { color: '#fe9a8b', borderColor: '#fe9a8b' },
+        lineStyle: { color: "#fe9a8b" },
+        itemStyle: { color: "#fe9a8b", borderColor: "#fe9a8b" },
         areaStyle: {
           color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
-            { offset: 0, color: '#fe9a8bb3' },
-            { offset: 1, color: '#fe9a8b03' },
+            { offset: 0, color: "#fe9a8bb3" },
+            { offset: 1, color: "#fe9a8b03" },
           ]),
         },
-      }
+      },
     ],
   };
   (<any>state.global.yesterdayLine).setOption(option);
   (<any>state.myCharts).push(state.global.yesterdayLine);
 };
 
-
 // 折线图 - 当月流量消耗
 const initMonthLineChart = () => {
   if (!state.global.dispose.some((b: any) => b === state.global.monthLine)) state.global.monthLine.dispose();
-	state.global.monthLine = markRaw(echarts.init(monthLine.value, state.charts.theme));
+  state.global.monthLine = markRaw(echarts.init(monthLine.value, state.charts.theme));
   const option = {
     backgroundColor: state.charts.bgColor,
     xAxis: {
@@ -377,36 +342,36 @@ const initMonthLineChart = () => {
     },
     yAxis: [
       {
-        type: 'value',
-        name: '',
+        type: "value",
+        name: "",
         show: false,
       },
     ],
-    tooltip: { 
-			trigger: 'axis',
-			formatter: function (params:any) {
-					var relVal = params[0].name
-					let circle = `<i style="margin-right:4px;display: inline-block;width: 10px;height: 10px;border-radius: 50%;background-color:${params[0].color}"></i>`
-					relVal += '<br/>' + circle + ' 流量: ' + formatSize(params[0].value*1024*1024)
-					return relVal;
-				}
-		},
+    tooltip: {
+      trigger: "axis",
+      formatter: function (params: any) {
+        var relVal = params[0].name;
+        let circle = `<i style="margin-right:4px;display: inline-block;width: 10px;height: 10px;border-radius: 50%;background-color:${params[0].color}"></i>`;
+        relVal += "<br/>" + circle + " " + t("message.iotCard.dashboard.charts.tooltip.traffic") + ": " + formatSize(params[0].value * 1024 * 1024);
+        return relVal;
+      },
+    },
     grid: { top: 10, right: 10, bottom: 10, left: 10 },
     series: [
       {
-        name: '流量',
-        type: 'line',
+        name: t("message.iotCard.dashboard.charts.series.traffic"),
+        type: "line",
         smooth: true,
         data: monthLineData.value,
-        lineStyle: { color: '#9E87FF' },
-        itemStyle: { color: '#9E87FF', borderColor: '#9E87FF' },
-				areaStyle: {
-					color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
-						{ offset: 0, color: '#9E87FFb3' },
-						{ offset: 1, color: '#9E87FF03' },
-					]),
-				},
-      }
+        lineStyle: { color: "#9E87FF" },
+        itemStyle: { color: "#9E87FF", borderColor: "#9E87FF" },
+        areaStyle: {
+          color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
+            { offset: 0, color: "#9E87FFb3" },
+            { offset: 1, color: "#9E87FF03" },
+          ]),
+        },
+      },
     ],
   };
   (<any>state.global.monthLine).setOption(option);
@@ -416,7 +381,7 @@ const initMonthLineChart = () => {
 // 折线图 - 本年流量消耗
 const initYearLineChart = () => {
   if (!state.global.dispose.some((b: any) => b === state.global.yearLine)) state.global.yearLine.dispose();
-	state.global.yearLine = markRaw(echarts.init(yearLine.value, state.charts.theme));
+  state.global.yearLine = markRaw(echarts.init(yearLine.value, state.charts.theme));
   const option = {
     backgroundColor: state.charts.bgColor,
     xAxis: {
@@ -425,37 +390,37 @@ const initYearLineChart = () => {
     },
     yAxis: [
       {
-        type: 'value',
-        name: '',
+        type: "value",
+        name: "",
         show: false,
-        splitLine: { show: false, lineStyle: { type: 'dashed', color: '#f5f5f5' } }
-			}
+        splitLine: { show: false, lineStyle: { type: "dashed", color: "#f5f5f5" } },
+      },
     ],
-    tooltip: { 
-			trigger: 'axis',
-			formatter: function (params:any) {
-					var relVal = params[0].name
-					let circle = `<i style="margin-right:4px;display: inline-block;width: 10px;height: 10px;border-radius: 50%;background-color:${params[0].color}"></i>`
-					relVal += '<br/>' + circle + ' 流量: ' + formatSize(params[0].value*1024*1024)
-					return relVal;
-				}
-		},
+    tooltip: {
+      trigger: "axis",
+      formatter: function (params: any) {
+        var relVal = params[0].name;
+        let circle = `<i style="margin-right:4px;display: inline-block;width: 10px;height: 10px;border-radius: 50%;background-color:${params[0].color}"></i>`;
+        relVal += "<br/>" + circle + " " + t("message.iotCard.dashboard.charts.tooltip.traffic") + ": " + formatSize(params[0].value * 1024 * 1024);
+        return relVal;
+      },
+    },
     grid: { top: 10, right: 10, bottom: 10, left: 10 },
     series: [
       {
-        name: '流量',
-        type: 'line',
+        name: t("message.iotCard.dashboard.charts.series.traffic"),
+        type: "line",
         smooth: true,
         data: yearLineData.value,
-        lineStyle: { color: '#fe9a8b' },
-        itemStyle: { color: '#fe9a8b', borderColor: '#fe9a8b' },
-				areaStyle: {
-					color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
-						{ offset: 0, color: '#fe9a8bb3' },
-						{ offset: 1, color: '#fe9a8b03' },
-					]),
-				},
-      }
+        lineStyle: { color: "#fe9a8b" },
+        itemStyle: { color: "#fe9a8b", borderColor: "#fe9a8b" },
+        areaStyle: {
+          color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
+            { offset: 0, color: "#fe9a8bb3" },
+            { offset: 1, color: "#fe9a8b03" },
+          ]),
+        },
+      },
     ],
   };
   (<any>state.global.yearLine).setOption(option);
@@ -465,73 +430,73 @@ const initYearLineChart = () => {
 // 折线图 - 流量统计
 const iniFlowLineChart = async () => {
   if (!state.global.dispose.some((b: any) => b === state.global.flowLine)) state.global.flowLine.dispose();
-	state.global.flowLine = markRaw(echarts.init(flowLine.value, state.charts.theme));
+  state.global.flowLine = markRaw(echarts.init(flowLine.value, state.charts.theme));
   const option = {
     backgroundColor: state.charts.bgColor,
     grid: { top: 70, right: 20, bottom: 30, left: 30 },
-    tooltip: { 
-			trigger: 'axis',
-			formatter: function (params:any) {
-					var relVal = params[0].name
-					let circle = `<i style="margin-right:4px;display: inline-block;width: 10px;height: 10px;border-radius: 50%;background-color:${params[0].color}"></i>`
-					relVal += '<br/>' + circle + ' 流量: ' + params[0].value + 'MB'
-					return relVal;
-				}
-		},
+    tooltip: {
+      trigger: "axis",
+      formatter: function (params: any) {
+        var relVal = params[0].name;
+        let circle = `<i style="margin-right:4px;display: inline-block;width: 10px;height: 10px;border-radius: 50%;background-color:${params[0].color}"></i>`;
+        relVal += "<br/>" + circle + " " + t("message.iotCard.dashboard.charts.tooltip.traffic") + ": " + params[0].value + "MB";
+        return relVal;
+      },
+    },
     xAxis: {
       data: flowLineXAxisData.value,
     },
     yAxis: [
       {
-        type: 'value',
-        name: '',
-        splitLine: { show: true, lineStyle: { type: 'dashed', color: '#f5f5f5' } },
+        type: "value",
+        name: "",
+        splitLine: { show: true, lineStyle: { type: "dashed", color: "#f5f5f5" } },
         axisLabel: {
           margin: 2,
-          formatter: function (value:any) {
+          formatter: function (value: any) {
             if (value >= 10000 && value < 10000000) {
               value = value / 10000 + "W";
             } else if (value >= 10000000) {
               value = value / 10000000 + "KW";
             }
             return value;
-          }
+          },
         },
       },
     ],
     series: [
       {
-        name: '流量',
-        type: 'line',
+        name: t("message.iotCard.dashboard.charts.series.traffic"),
+        type: "line",
         symbolSize: 6,
-        symbol: 'circle',
+        symbol: "circle",
         smooth: true,
         data: flowLineData.value,
-        lineStyle: { color: '#9E87FF' },
-        itemStyle: { color: '#9E87FF', borderColor: '#9E87FF' },
+        lineStyle: { color: "#9E87FF" },
+        itemStyle: { color: "#9E87FF", borderColor: "#9E87FF" },
         areaStyle: {
           color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
-            { offset: 0, color: '#9E87FFb3' },
-            { offset: 1, color: '#9E87FF03' },
+            { offset: 0, color: "#9E87FFb3" },
+            { offset: 1, color: "#9E87FF03" },
           ]),
         },
         emphasis: {
           itemStyle: {
             color: {
-              type: 'radial',
+              type: "radial",
               x: 0.5,
               y: 0.5,
               r: 0.5,
               colorStops: [
-                { offset: 0, color: '#9E87FF' },
-                { offset: 0.4, color: '#9E87FF' },
-                { offset: 0.5, color: '#fff' },
-                { offset: 0.7, color: '#fff' },
-                { offset: 0.8, color: '#fff' },
-                { offset: 1, color: '#fff' },
+                { offset: 0, color: "#9E87FF" },
+                { offset: 0.4, color: "#9E87FF" },
+                { offset: 0.5, color: "#fff" },
+                { offset: 0.7, color: "#fff" },
+                { offset: 0.8, color: "#fff" },
+                { offset: 1, color: "#fff" },
               ],
             },
-            borderColor: '#9E87FF',
+            borderColor: "#9E87FF",
             borderWidth: 2,
           },
         },
@@ -554,9 +519,9 @@ watch(
   () => store.state.themeConfig.themeConfig.isIsDark,
   (isIsDark) => {
     nextTick(() => {
-      state.charts.theme = isIsDark ? 'dark' : '';
-      state.charts.bgColor = isIsDark ? 'transparent' : '';
-      state.charts.color = isIsDark ? '#dadada' : '#303133';
+      state.charts.theme = isIsDark ? "dark" : "";
+      state.charts.bgColor = isIsDark ? "transparent" : "";
+      state.charts.color = isIsDark ? "#dadada" : "#303133";
       setTimeout(() => {
         iniFlowLineChart();
         initYesterdayLineChart();
@@ -574,58 +539,57 @@ watch(
 
 <style lang="scss" scoped>
 .select-wrap {
-	text-align: right;
+  text-align: right;
 }
 .top-wrap {
-	width: 100%;
+  width: 100%;
   .flex {
     justify-content: space-between;
   }
-	.top-inner-wrap {
-		display: flex;
-		margin-top: 10px;
-
-	}
-	.line-wrap {
-		flex: 1;
-		background-color: #fff;
-		background: #fcfcfc;
-		border: 1px solid #e0e4e8;
-		display: flex;
-		justify-content: space-between;
-		align-items: center;
-		padding: 20px;
-		position: relative;
-		.text-wrap {
-			position: absolute;
-			left: 20px;
-			top: 40px;
-			.text {
-				font-size: 14px;
-				color: #000000a3;
-			}
-			div:nth-child(2) {
-				font-size: 32px;
-				font-weight: 700;
-				overflow: hidden;
-				white-space: nowrap;
-				text-overflow: ellipsis;
-			}
-		}
-		.line-inner-wrap {
-			height: 100px;
-			width: calc(100% - 150px);
-			margin-left: 150px;
-		}
-	}
-	.line-wrap:not(:nth-child(1)) {
-		margin-left: 20px;
-	}
+  .top-inner-wrap {
+    display: flex;
+    margin-top: 10px;
+  }
+  .line-wrap {
+    flex: 1;
+    background-color: #fff;
+    background: #fcfcfc;
+    border: 1px solid #e0e4e8;
+    display: flex;
+    justify-content: space-between;
+    align-items: center;
+    padding: 20px;
+    position: relative;
+    .text-wrap {
+      position: absolute;
+      left: 20px;
+      top: 40px;
+      .text {
+        font-size: 14px;
+        color: #000000a3;
+      }
+      div:nth-child(2) {
+        font-size: 32px;
+        font-weight: 700;
+        overflow: hidden;
+        white-space: nowrap;
+        text-overflow: ellipsis;
+      }
+    }
+    .line-inner-wrap {
+      height: 100px;
+      width: calc(100% - 150px);
+      margin-left: 150px;
+    }
+  }
+  .line-wrap:not(:nth-child(1)) {
+    margin-left: 20px;
+  }
 }
 .title {
-	color: var(--el-text-color-primary);
-	font-size: 16px;
-	font-weight: 700;
+  color: var(--el-text-color-primary);
+  font-size: 16px;
+  font-weight: 700;
 }
 .statistics-wrap {
   display: flex;
@@ -642,7 +606,7 @@ watch(
       align-items: center;
       margin-bottom: 16px;
       :deep(.el-date-editor.el-input__wrapper) {
-        width: 360px!important;
+        width: 360px !important;
         margin-left: 12px;
       }
       .operate-wrap {
@@ -655,23 +619,23 @@ watch(
   .right-wrap {
     width: calc(33.7% - 20px);
     margin-left: 20px;
-		.top-title-wrap {
+    .top-title-wrap {
       display: flex;
       justify-content: space-between;
       align-items: center;
       margin-bottom: 16px;
       :deep(.el-date-editor.el-input__wrapper) {
-        max-width: 220px!important;
+        max-width: 220px !important;
       }
     }
-		.ranking-list {
-			width: 100%;
-			.rank-item {
-				width: 100%;
-				display: flex;
-				justify-content: space-between;
-				align-items: center;
-				margin-bottom: 24px;
+    .ranking-list {
+      width: 100%;
+      .rank-item {
+        width: 100%;
+        display: flex;
+        justify-content: space-between;
+        align-items: center;
+        margin-bottom: 24px;
 
         .number {
           flex: 0 0 24px;
@@ -694,19 +658,18 @@ watch(
           color: #597ef7;
           background-color: #597ef71a;
         }
-				.card-num {
-					width: 110px;
-				}
-				.progress-wrap {
-					width: 32%;
-				}
-				.flow-num {
-					width: 90px;
-					text-align: right;
-				}
-			}
-		}
+        .card-num {
+          width: 110px;
+        }
+        .progress-wrap {
+          width: 32%;
+        }
+        .flow-num {
+          width: 90px;
+          text-align: right;
+        }
+      }
+    }
   }
 }
-  
-</style>
+</style>

+ 32 - 27
src/views/modules/iotCard/index/detail.vue

@@ -1,7 +1,7 @@
 <!-- 物联网卡-详情 -->
 <template>
   <div>
-    <el-card shadow="nover">
+    <el-card shadow="never">
        <el-descriptions class="margin-top" title="基本信息" :column="3" :size="size" border>
         <!-- 卡号 -->
         <el-descriptions-item>
@@ -189,23 +189,23 @@
     </el-card>
 
     <div class="statistics-wrap gap-3">
-      <el-card shadow="nover" class="left-wrap">
+      <el-card shadow="never" class="left-wrap">
         <div class="top-title-wrap">
-            <div class="title">流量统计</div>
+            <div class="title">{{ $t('message.iotCard.detail.flowChart.title') }}</div>
             <div class="operate-wrap">
               <el-button-group>
-                <el-button @click="changeDate(1)" :type="activeIndex == 1 ?  'primary' : ''">昨日</el-button>
-                <el-button @click="changeDate(2)" :type="activeIndex == 2 ?  'primary' : ''">近一周</el-button>
-                <el-button @click="changeDate(3)" :type="activeIndex == 3 ?  'primary' : ''">近一月</el-button>
-                <el-button @click="changeDate(4)" :type="activeIndex == 4 ?  'primary' : ''">近一年</el-button>
+                <el-button @click="changeDate(1)" :type="activeIndex == 1 ?  'primary' : ''">{{ $t('message.iotCard.detail.flowChart.buttons.yesterday') }}</el-button>
+                <el-button @click="changeDate(2)" :type="activeIndex == 2 ?  'primary' : ''">{{ $t('message.iotCard.detail.flowChart.buttons.week') }}</el-button>
+                <el-button @click="changeDate(3)" :type="activeIndex == 3 ?  'primary' : ''">{{ $t('message.iotCard.detail.flowChart.buttons.month') }}</el-button>
+                <el-button @click="changeDate(4)" :type="activeIndex == 4 ?  'primary' : ''">{{ $t('message.iotCard.detail.flowChart.buttons.year') }}</el-button>
               </el-button-group>
                 <el-date-picker
                   class="date-picker-wrap"
                   v-model="dateRange"
-                  type="datetimerange"
-                  range-separator="至"
-                  start-placeholder="开始时间"
-                  end-placeholder="结束时间"
+                  type="daterange"
+                  :range-separator="$t('message.iotCard.detail.flowChart.datePicker.rangeSeparator')"
+                  :start-placeholder="$t('message.iotCard.detail.flowChart.datePicker.startPlaceholder')"
+                  :end-placeholder="$t('message.iotCard.detail.flowChart.datePicker.endPlaceholder')"
                   format="YYYY-MM-DD HH:mm:ss"
                   date-format="YYYY/MM/DD"
                   time-format="hh:mm:ss"
@@ -216,18 +216,18 @@
         <div style="height: 460px;" ref="flowLine"></div>
       </el-card>
 
-      <el-card shadow="nover" class="right-wrap">
-        <div class="title">数据统计</div>
+      <el-card shadow="never" class="right-wrap">
+        <div class="title">{{ $t('message.iotCard.detail.dataStatistics.title') }}</div>
         <div class="line-wrap flow-line-wrap">
           <div class="text-wrap">
-            <div class="text">昨日流量消耗</div>
+            <div class="text">{{ $t('message.iotCard.detail.dataStatistics.yesterdayFlow') }}</div>
             <div>{{formatSize(statisticsData.yesterdayTotal * 1024 * 1024)}}</div>
           </div>
           <div class="line-inner-wrap" ref="yesterdayLine"></div>
         </div>
         <div class="line-wrap flow-line-wrap">
           <div class="text-wrap">
-            <div class="text">当月流量消耗</div>
+            <div class="text">{{ $t('message.iotCard.detail.dataStatistics.monthFlow') }}</div>
             <div>{{formatSize(statisticsData.monthTotal * 1024 * 1024)}}</div>
           </div>
           <div class="line-inner-wrap" ref="monthLine"></div>
@@ -235,7 +235,7 @@
 
         <div class="line-wrap flow-line-wrap">
           <div class="text-wrap">
-            <div class="text">本年流量消耗</div>
+            <div class="text">{{ $t('message.iotCard.detail.dataStatistics.yearFlow') }}</div>
             <div>{{formatSize(statisticsData.yearTotal * 1024 * 1024)}}</div>
           </div>
           <div class="line-inner-wrap" ref="yearLine"></div>
@@ -254,9 +254,11 @@ import { useStore } from '/@/store/index';
 import { useRoute } from 'vue-router';
 import * as echarts from 'echarts';
 import dayjs from 'dayjs';
+import { useI18n } from 'vue-i18n';
 
 const store = useStore();
 const route = useRoute();
+const { t } = useI18n();
 const sim = ref({
   accNumber: "",// 卡号
   iccid: "",// ICCID
@@ -407,17 +409,20 @@ const handleDateChange = async (value:any) => {
 
 const formatOperator = (val:number) => {
   // 1电信,2联通,3移动
-  return ['', '电信', '联通', '移动'][val];
+  const operators = ['', t('message.iotCard.index.operators.telecom'), t('message.iotCard.index.operators.unicom'), t('message.iotCard.index.operators.mobile')];
+  return operators[val];
 }
 
 const formatType = (val:number) => {
   // 1月卡,2季卡,3年卡,4其他
-  return ['', '月卡', '季卡', '年卡', '其他'][val];
+  const types = ['', t('message.iotCard.index.types.monthly'), t('message.iotCard.index.types.quarterly'), t('message.iotCard.index.types.yearly'), t('message.iotCard.index.types.other')];
+  return types[val];
 }
 
 const formatStatus = (val:any) => {
   // 1:可激活 2:测试激活 3:测试去激活 4:在用 5:停机 6:运营商管理状态
-  return ['', '可激活', '测试激活', '测试去激活', '在用', '停机', '运营商管理状态'][val];
+  const statuses = ['', t('message.iotCard.index.status.activatable'), t('message.iotCard.index.status.testActivated'), t('message.iotCard.index.status.testDeactivated'), t('message.iotCard.index.status.inUse'), t('message.iotCard.index.status.suspended'), t('message.iotCard.index.status.operatorManaged')];
+  return statuses[val];
 }
 
 // 折线图 - 昨日流量消耗
@@ -443,14 +448,14 @@ const initYesterdayLineChart = () => {
 			formatter: function (params:any) {
 					var relVal = params[0].name
 					let circle = `<i style="margin-right:4px;display: inline-block;width: 10px;height: 10px;border-radius: 50%;background-color:${params[0].color}"></i>`
-					relVal += '<br/>' + circle + ' 流量: ' + formatSize(params[0].value*1024*1024)
+					relVal += '<br/>' + circle + ' ' + t('message.iotCard.detail.charts.tooltip.flow') + ': ' + formatSize(params[0].value*1024*1024)
 					return relVal;
 				}
 		},
     grid: { top: 10, right: 10, bottom: 10, left: 10 },
     series: [
       {
-        name: '流量',
+        name: t('message.iotCard.detail.charts.series.flow'),
         type: 'line',
         smooth: true,
         data: yesterdayLineData.value,
@@ -487,14 +492,14 @@ const initMonthLineChart = () => {
 			formatter: function (params:any) {
 					var relVal = params[0].name
 					let circle = `<i style="margin-right:4px;display: inline-block;width: 10px;height: 10px;border-radius: 50%;background-color:${params[0].color}"></i>`
-					relVal += '<br/>' + circle + ' 流量: ' + formatSize(params[0].value*1024*1024)
+					relVal += '<br/>' + circle + ' ' + t('message.iotCard.detail.charts.tooltip.flow') + ': ' + formatSize(params[0].value*1024*1024)
 					return relVal;
 				}
 		},
     grid: { top: 10, right: 10, bottom: 10, left: 10 },
     series: [
       {
-        name: '流量',
+        name: t('message.iotCard.detail.charts.series.flow'),
         type: 'line',
         smooth: true,
         data: monthLineData.value,
@@ -530,14 +535,14 @@ const initYearLineChart = () => {
 			formatter: function (params:any) {
 					var relVal = params[0].name
 					let circle = `<i style="margin-right:4px;display: inline-block;width: 10px;height: 10px;border-radius: 50%;background-color:${params[0].color}"></i>`
-					relVal += '<br/>' + circle + ' 流量: ' + formatSize(params[0].value*1024*1024)
+					relVal += '<br/>' + circle + ' ' + t('message.iotCard.detail.charts.tooltip.flow') + ': ' + formatSize(params[0].value*1024*1024)
 					return relVal;
 				}
 		},
     grid: { top: 10, right: 10, bottom: 10, left: 10 },
     series: [
       {
-        name: '流量',
+        name: t('message.iotCard.detail.charts.series.flow'),
         type: 'line',
         smooth: true,
         data: yearLineData.value,
@@ -562,7 +567,7 @@ const iniFlowLineChart = async () => {
 			formatter: function (params:any) {
 					var relVal = params[0].name
 					let circle = `<i style="margin-right:4px;display: inline-block;width: 10px;height: 10px;border-radius: 50%;background-color:${params[0].color}"></i>`
-					relVal += '<br/>' + circle + ' 流量: ' + params[0].value + 'MB'
+					relVal += '<br/>' + circle + ' ' + t('message.iotCard.detail.charts.tooltip.flow') + ': ' + params[0].value + 'MB'
 					return relVal;
 				}
 		},
@@ -589,7 +594,7 @@ const iniFlowLineChart = async () => {
     ],
     series: [
       {
-        name: '流量',
+        name: t('message.iotCard.detail.charts.series.flow'),
         type: 'line',
         symbolSize: 6,
         symbol: 'circle',

+ 38 - 33
src/views/modules/iotCard/index/index.vue

@@ -1,49 +1,49 @@
 <!-- 物联网卡列表 -->
 <template>
   <div class="page-full">
-    <el-card shadow="nover" class="page-full-part">
+    <el-card shadow="never" class="page-full-part">
       <el-form :model="params" inline ref="queryRef">
         <el-form-item prop="deptName" class="mr10">
-          <el-input @keyup.enter.native="getList" style="width: 240px;" v-model="params.keyWord" placeholder="请输入ICCID或卡号" clearable />
+          <el-input @keyup.enter.native="getList" style="width: 240px;" v-model="params.keyWord" :placeholder="$t('message.iotCard.index.search.placeholder')" clearable />
         </el-form-item>
         <el-form-item>
           <el-button type="primary" @click="getList">
             <el-icon>
               <ele-Search />
             </el-icon>
-            查询
+            {{ $t('message.iotCard.index.search.query') }}
           </el-button>
           <el-button v-auth="'reset'" @click="resetQuery()">
             <el-icon>
               <ele-Refresh />
             </el-icon>
-            重置
+            {{ $t('message.iotCard.index.search.reset') }}
           </el-button>
         </el-form-item>
       </el-form>
-      <el-table :data="tableData" max-height="calc(100vh  - 210px);" v-loading="loading" style="width: 100%">
-        <el-table-column v-col="'accNumber'" fixed="left" min-width="130" label="卡号" prop="accNumber" align="center" />
-        <el-table-column v-col="'ICCID'" min-width="180" label="ICCID" prop="iccid" align="center" />
-        <el-table-column v-col="'bindDeviceName'" label="绑定设备" prop="bindDeviceName" align="center" />
-        <el-table-column v-col="'platName'" label="平台对接" prop="platName" align="center" />
-        <el-table-column v-col="'types'" label="运营商" prop="types" align="center">
+      <el-table :data="tableData" max-height="calc(100vh - 210px)" v-loading="loading" style="width: 100%">
+        <el-table-column v-col="'accNumber'" fixed="left" min-width="130" :label="$t('message.iotCard.index.table.columns.cardNumber')" prop="accNumber" align="center" />
+        <el-table-column v-col="'ICCID'" min-width="180" :label="$t('message.iotCard.index.table.columns.iccid')" prop="iccid" align="center" />
+        <el-table-column v-col="'bindDeviceName'" width="120" :label="$t('message.iotCard.index.table.columns.bindDevice')" prop="bindDeviceName" align="center" />
+        <el-table-column v-col="'platName'" width="120" :label="$t('message.iotCard.index.table.columns.platform')" prop="platName" align="center" />
+        <el-table-column v-col="'types'" width="120" :label="$t('message.iotCard.index.table.columns.operator')" prop="types" align="center">
           <template #default="scope">{{ formatOperator(scope.row.types) }}</template>
         </el-table-column>
-        <el-table-column v-col="'simTypes'" label="类型" prop="simTypes" align="center">
+        <el-table-column v-col="'simTypes'" width="120" :label="$t('message.iotCard.index.table.columns.type')" prop="simTypes" align="center">
           <template #default="scope">{{ formatType(scope.row.simTypes) }}</template>
         </el-table-column>
-        <el-table-column v-col="'totalFlow'" label="总流量" prop="totalFlow" align="center" />
-        <el-table-column v-col="'usedFlow'" label="使用流量" prop="usedFlow" align="center" />
-        <el-table-column v-col="'leaveFlow'" label="剩余流量" prop="leaveFlow" align="center" />
-        <el-table-column v-col="'activationTime'" width="160" label="激活日期" prop="activationTime" align="center" />
-        <el-table-column v-col="'updatedAt'" width="160" label="更新时间" prop="updatedAt" align="center" />
-        <el-table-column v-col="'simStatus'" label="状态" prop="simStatus" align="center">
+        <el-table-column v-col="'totalFlow'" width="120" :label="$t('message.iotCard.index.table.columns.totalFlow')" prop="totalFlow" align="center" />
+        <el-table-column v-col="'usedFlow'" width="120" :label="$t('message.iotCard.index.table.columns.usedFlow')" prop="usedFlow" align="center" />
+        <el-table-column v-col="'leaveFlow'" width="120" :label="$t('message.iotCard.index.table.columns.remainFlow')" prop="leaveFlow" align="center" />
+        <el-table-column v-col="'activationTime'" width="140" :label="$t('message.iotCard.index.table.columns.activationDate')" prop="activationTime" align="center" />
+        <el-table-column v-col="'updatedAt'" width="120" :label="$t('message.iotCard.index.table.columns.updateTime')" prop="updatedAt" align="center" />
+        <el-table-column v-col="'simStatus'" width="120" :label="$t('message.iotCard.index.table.columns.status')" prop="simStatus" align="center">
           <template #default="scope">{{ formatStatus(scope.row.simStatus) }}</template>
         </el-table-column>
-        <el-table-column v-col="'handle'" width="110" label="操作" fixed="right" prop="handle" align="center">
+        <el-table-column v-col="'handle'" width="110" :label="$t('message.iotCard.index.table.columns.actions')" fixed="right" prop="handle" align="center">
           <template #default="scope">
-            <el-button size="small" text type="primary" @click="onOpenDetail(scope.row)" v-auth="'detail'">详情</el-button>
-            <el-button size="small" text type="warning" @click="onDel(scope.row)" v-auth="'del'">删除</el-button>
+            <el-button size="small" text type="primary" @click="onOpenDetail(scope.row)" v-auth="'detail'">{{ $t('message.iotCard.index.table.actions.detail') }}</el-button>
+            <el-button size="small" text type="warning" @click="onDel(scope.row)" v-auth="'del'">{{ $t('message.iotCard.index.table.actions.delete') }}</el-button>
           </template>
         </el-table-column>
       </el-table>
@@ -57,6 +57,8 @@ import api from '/@/api/modules/iotCard';
 import { ElMessageBox, ElMessage } from 'element-plus';
 import { useSearch } from "/@/hooks/useCommon"
 import { useRouter } from 'vue-router';
+import { useI18n } from 'vue-i18n';
+const { t } = useI18n();
 const { params, tableData, getList, loading } = useSearch<any[]>(
   api.simCard.getList,
   "Data"
@@ -76,30 +78,33 @@ const resetQuery = () => {
  * 单一删除
  */
 const onDel = (row: any) => {
-  ElMessageBox.confirm(`此操作将卡号为:“${row.accNumber}”进行删除,是否继续?`, '提示', {
-    confirmButtonText: '确认',
-    cancelButtonText: '取消',
+  ElMessageBox.confirm(t('message.iotCard.index.messages.deleteConfirm', { cardNumber: row.accNumber }), t('message.iotCard.index.messages.tip'), {
+    confirmButtonText: t('message.iotCard.index.messages.confirm'),
+    cancelButtonText: t('message.iotCard.index.messages.cancel'),
     type: 'warning',
   }).then(async () => {
     await api.simCard.deleteItem({ ids: [row.id] });
-    ElMessage.success('删除成功');
+    ElMessage.success(t('message.iotCard.index.messages.deleteSuccess'));
     getList();
   });
 };
 
-const formatOperator = (val: number) => {
-  // 1电信,2联通,3移动
-  return ['', '电信', '联通', '移动'][val];
+const formatOperator = (val: any) => {
+  // 1:电信 2:联通 3:移动
+  const operators = ['', t('message.iotCard.index.operators.telecom'), t('message.iotCard.index.operators.unicom'), t('message.iotCard.index.operators.mobile')];
+  return operators[val];
 }
 
-const formatType = (val: number) => {
-  // 1月卡,2季卡,3年卡,4其他
-  return ['', '月卡', '季卡', '年卡', '其他'][val];
+const formatType = (val: any) => {
+  // 1:月卡 2:季卡 3:年卡 4:其他
+  const types = ['', t('message.iotCard.index.types.monthly'), t('message.iotCard.index.types.quarterly'), t('message.iotCard.index.types.yearly'), t('message.iotCard.index.types.other')];
+  return types[val];
 }
 
-const formatStatus = (val: number) => {
-  // 1:可激活 2:测试激活 3:测试去激活 4:在用5:停机6:运营商管理状态
-  return ['', '可激活', '测试激活', '测试去激活', '在用', '停机', '运营商管理状态'][val];
+const formatStatus = (val: any) => {
+  // 1:可激活 2:测试激活 3:测试去激活 4:在用 5:停机 6:运营商管理状态
+  const statuses = ['', t('message.iotCard.index.status.activatable'), t('message.iotCard.index.status.testActivated'), t('message.iotCard.index.status.testDeactivated'), t('message.iotCard.index.status.inUse'), t('message.iotCard.index.status.suspended'), t('message.iotCard.index.status.operatorManaged')];
+  return statuses[val];
 }
 
 const onOpenDetail = (item: any) => {

+ 31 - 29
src/views/modules/iotCard/platformManage/addOrEditItem.vue

@@ -1,44 +1,44 @@
 <!-- 平台接入-新增或者编辑 -->
 <template>
-  <el-dialog :title="ruleForm.id ? '编辑' : '新增'" v-model="isShowDialog" width="650px">
-    <el-form :model="ruleForm" ref="formRef" :rules="rules" v-if="isShowDialog" label-width="100px">
-      <el-form-item label="平台类型" prop="types">
-        <el-select style="width: 100%;" v-model="ruleForm.types" placeholder="请选择">
-          <el-option label="电信" value="1"></el-option>
+  <el-dialog :title="ruleForm.id ? $t('message.iotCard.platformManage.addOrEdit.title.edit') : $t('message.iotCard.platformManage.addOrEdit.title.add')" v-model="isShowDialog" width="650px">
+    <el-form :model="ruleForm" ref="formRef" :rules="rules" v-if="isShowDialog" label-width="110px">
+      <el-form-item :label="$t('message.iotCard.platformManage.addOrEdit.form.platformType')" prop="types">
+        <el-select style="width: 100%;" v-model="ruleForm.types" :placeholder="$t('message.iotCard.platformManage.addOrEdit.placeholders.select')">
+          <el-option :label="$t('message.iotCard.platformManage.addOrEdit.operators.telecom')" value="1"></el-option>
           <!--            <el-option disabled label="联通" value="2"></el-option>-->
           <!--            <el-option label="移动" value="3"></el-option>-->
         </el-select>
       </el-form-item>
-      <el-form-item label="名称" prop="name">
-        <el-input v-model="ruleForm.name" placeholder="请输入名称" />
+      <el-form-item :label="$t('message.iotCard.platformManage.addOrEdit.form.name')" prop="name">
+        <el-input v-model="ruleForm.name" :placeholder="$t('message.iotCard.platformManage.addOrEdit.placeholders.name')" />
       </el-form-item>
-      <el-form-item label="App ID" prop="appKey">
-        <el-input v-model="ruleForm.appKey" placeholder="请输入App ID" />
+      <el-form-item :label="$t('message.iotCard.platformManage.addOrEdit.form.appId')" prop="appKey">
+        <el-input v-model="ruleForm.appKey" :placeholder="$t('message.iotCard.platformManage.addOrEdit.placeholders.appId')" />
       </el-form-item>
-      <el-form-item v-if="ruleForm.types == '1'" label="secretKey" prop="appSecret">
-        <el-input v-model="ruleForm.appSecret" placeholder="请输入secretKey" />
+      <el-form-item v-if="ruleForm.types == '1'" :label="$t('message.iotCard.platformManage.addOrEdit.form.secretKey')" prop="appSecret">
+        <el-input v-model="ruleForm.appSecret" :placeholder="$t('message.iotCard.platformManage.addOrEdit.placeholders.secretKey')" />
       </el-form-item>
-      <el-form-item v-if="ruleForm.types == '1'" label="用户id" prop="userId">
-        <el-input v-model="ruleForm.userId" placeholder="请输入用户id" />
+      <el-form-item v-if="ruleForm.types == '1'" :label="$t('message.iotCard.platformManage.addOrEdit.form.userId')" prop="userId">
+        <el-input v-model="ruleForm.userId" :placeholder="$t('message.iotCard.platformManage.addOrEdit.placeholders.userId')" />
       </el-form-item>
       <!-- <el-form-item label="密码" prop="password">
         <el-input v-model="ruleForm.password" placeholder="请输入密码" />
       </el-form-item> -->
-      <el-form-item v-if="ruleForm.types == '3'" label="接口地址" prop="restUrl">
-        <el-input v-model="ruleForm.restUrl" placeholder="请输入接口地址" />
+      <el-form-item v-if="ruleForm.types == '3'" :label="$t('message.iotCard.platformManage.addOrEdit.form.interfaceUrl')" prop="restUrl">
+        <el-input v-model="ruleForm.restUrl" :placeholder="$t('message.iotCard.platformManage.addOrEdit.placeholders.interfaceUrl')" />
       </el-form-item>
-      <el-form-item label="状态">
+      <el-form-item :label="$t('message.iotCard.platformManage.addOrEdit.form.status')">
         <!-- 1启用,0禁用 -->
-        <el-switch v-model="ruleForm.status" active-value="1" inactive-value="0" inline-prompt active-text="启" inactive-text="禁"></el-switch>
+        <el-switch v-model="ruleForm.status" active-value="1" inactive-value="0" inline-prompt :active-text="$t('message.iotCard.platformManage.addOrEdit.switch.enabled')" :inactive-text="$t('message.iotCard.platformManage.addOrEdit.switch.disabled')"></el-switch>
       </el-form-item>
-      <el-form-item label="说明">
-        <el-input :rows="6" type="textarea" v-model="ruleForm.remark" placeholder="请输入说明" />
+      <el-form-item :label="$t('message.iotCard.platformManage.addOrEdit.form.description')">
+        <el-input :rows="6" type="textarea" v-model="ruleForm.remark" :placeholder="$t('message.iotCard.platformManage.addOrEdit.placeholders.description')" />
       </el-form-item>
     </el-form>
     <template #footer>
       <span class="dialog-footer">
-        <el-button @click="onCancel">取 消</el-button>
-        <el-button :loading="btnLoading" type="primary" @click="onSubmit">确定</el-button>
+        <el-button @click="onCancel">{{ $t('message.iotCard.platformManage.addOrEdit.buttons.cancel') }}</el-button>
+        <el-button :loading="btnLoading" type="primary" @click="onSubmit">{{ $t('message.iotCard.platformManage.addOrEdit.buttons.confirm') }}</el-button>
       </span>
     </template>
   </el-dialog>
@@ -48,11 +48,13 @@
 import api from '/@/api/modules/iotCard';
 import { ref, unref } from 'vue';
 import { ElMessage } from 'element-plus';
+import { useI18n } from 'vue-i18n';
 
 const isShowDialog = ref(false);
 const formRef = ref<HTMLElement | null>(null);
 const emit = defineEmits(['updateList']);
 const btnLoading = ref(false);
+const { t } = useI18n();
 
 const baseForm = {
   id: undefined,
@@ -72,13 +74,13 @@ const ruleForm = ref({
 })
 
 const rules = ref({
-  types: [{ required: true, message: '请选择平台类型', trigger: 'change' }],
-  name: [{ required: true, message: '请输入名称', trigger: 'change' }],
-  userId: [{ required: true, message: '请输入用户id', trigger: 'change' }],
+  types: [{ required: true, message: t('message.iotCard.platformManage.addOrEdit.validation.platformType'), trigger: 'change' }],
+  name: [{ required: true, message: t('message.iotCard.platformManage.addOrEdit.validation.name'), trigger: 'change' }],
+  userId: [{ required: true, message: t('message.iotCard.platformManage.addOrEdit.validation.userId'), trigger: 'change' }],
   // password: [{ required: true, message: '请输入密码', trigger: 'change' }],
-  appSecret: [{ required: true, message: '请输入secretKey', trigger: 'change' }],
-  appKey: [{ required: true, message: '请输入App ID', trigger: 'change' }],
-  restUrl: [{ required: true, message: '请输入接口地址', trigger: 'change' }]
+  appSecret: [{ required: true, message: t('message.iotCard.platformManage.addOrEdit.validation.secretKey'), trigger: 'change' }],
+  appKey: [{ required: true, message: t('message.iotCard.platformManage.addOrEdit.validation.appId'), trigger: 'change' }],
+  restUrl: [{ required: true, message: t('message.iotCard.platformManage.addOrEdit.validation.interfaceUrl'), trigger: 'change' }]
 })
 
 /**
@@ -94,7 +96,7 @@ const onSubmit = () => {
       // 修改
       api.platform.editItem(ruleForm.value)
         .then(() => {
-          ElMessage({ type: 'success', message: '修改成功' })
+          ElMessage({ type: 'success', message: t('message.iotCard.platformManage.addOrEdit.messages.editSuccess') })
           emit('updateList')
           closeDialog();
           resetForm();
@@ -104,7 +106,7 @@ const onSubmit = () => {
       // 新增
       api.platform.addItem(ruleForm.value)
         .then(() => {
-          ElMessage({ type: 'success', message: '添加成功' })
+          ElMessage({ type: 'success', message: t('message.iotCard.platformManage.addOrEdit.messages.addSuccess') })
           emit('updateList')
           closeDialog();
           resetForm();

+ 29 - 20
src/views/modules/iotCard/platformManage/index.vue

@@ -1,46 +1,46 @@
 <!-- 平台接入列表 -->
 <template>
   <div class="page-full">
-    <el-card shadow="nover" class="page-full-part">
+    <el-card shadow="never" class="page-full-part">
       <el-form :model="params" inline ref="queryRef">
         <el-form-item prop="deptName" class="mr10">
-          <el-input @keyup.enter.native="getList" style="width: 240px;" v-model="params.keyWord" placeholder="请输入关键字搜索" clearable />
+          <el-input @keyup.enter.native="getList" style="width: 240px;" v-model="params.keyWord" :placeholder="$t('message.iotCard.platformManage.search.placeholder')" clearable />
         </el-form-item>
         <el-form-item>
           <el-button type="primary" @click="getList">
             <el-icon>
               <ele-Search />
             </el-icon>
-            查询
+            {{ $t('message.iotCard.platformManage.search.query') }}
           </el-button>
           <el-button v-auth="'reset'" @click="resetQuery()">
             <el-icon>
               <ele-Refresh />
             </el-icon>
-            重置
+            {{ $t('message.iotCard.platformManage.search.reset') }}
           </el-button>
           <el-button v-auth="'add'" type="primary" @click="toAddItemPage()">
             <el-icon>
               <ele-FolderAdd />
             </el-icon>
-            新增
+            {{ $t('message.iotCard.platformManage.search.add') }}
           </el-button>
         </el-form-item>
       </el-form>
       <el-table :data="tableData" max-height="calc(100vh  - 210px);" v-loading="loading" style="width: 100%">
-        <el-table-column v-col="'name'" label="名称" prop="name" align="left" />
-        <el-table-column v-col="'type'" label="平台类型" prop="types" :formatter="function (row: any) { return ['', '电信', '联通', '移动'][row.types] }" align="center" width="120" />
-        <el-table-column v-col="'appKey'" label="App ID" prop="appKey" align="center" />
-        <el-table-column v-col="'simStatus'" label="状态" prop="simStatus" align="center" width="80">
+        <el-table-column v-col="'name'" :label="$t('message.iotCard.platformManage.table.columns.name')" prop="name" align="left" />
+        <el-table-column v-col="'type'" :label="$t('message.iotCard.platformManage.table.columns.platformType')" prop="types" :formatter="formatPlatformType" align="center" width="120" />
+        <el-table-column v-col="'appKey'" :label="$t('message.iotCard.platformManage.table.columns.appId')" prop="appKey" align="center" />
+        <el-table-column v-col="'simStatus'" :label="$t('message.iotCard.platformManage.table.columns.status')" prop="simStatus" align="center" width="140">
           <template #default="scope">
-            <el-tag :type="scope.row.status === '0' ? 'danger' : 'primary'">{{ formatStatus(scope.row.status) }}</el-tag>
+            <el-tag :type="scope.row.status === '0' ? 'danger' : ''">{{ formatStatus(scope.row.status) }}</el-tag>
           </template>
         </el-table-column>
-        <el-table-column v-col="'remark'" label="说明" prop="remark" align="center" show-overflow-tooltip />
-        <el-table-column v-col="'handle'" width="110" label="操作" fixed="right" prop="handle" align="center">
+        <el-table-column v-col="'remark'" :label="$t('message.iotCard.platformManage.table.columns.description')" prop="remark" align="center" show-overflow-tooltip />
+        <el-table-column v-col="'handle'" width="110" :label="$t('message.iotCard.platformManage.table.columns.actions')" fixed="right" prop="handle" align="center">
           <template #default="scope">
-            <el-button v-auth="'detail'" size="small" text type="primary" @click="onOpenDetail(scope.row)">编辑</el-button>
-            <el-button v-auth="'del'" size="small" text type="warning" @click="onDel(scope.row)">删除</el-button>
+            <el-button v-auth="'detail'" size="small" text type="primary" @click="onOpenDetail(scope.row)">{{ $t('message.iotCard.platformManage.table.actions.edit') }}</el-button>
+            <el-button v-auth="'del'" size="small" text type="warning" @click="onDel(scope.row)">{{ $t('message.iotCard.platformManage.table.actions.delete') }}</el-button>
           </template>
         </el-table-column>
       </el-table>
@@ -53,8 +53,10 @@
 <script lang="ts" setup>
 import api from '/@/api/modules/iotCard';
 import { defineAsyncComponent, ref } from 'vue';
-import { ElMessageBox, ElMessage, formatter } from 'element-plus';
+import { ElMessageBox, ElMessage } from 'element-plus';
 import { useSearch } from "/@/hooks/useCommon"
+import { useI18n } from 'vue-i18n';
+const { t } = useI18n();
 const AddOrEditItem = defineAsyncComponent(() => import('./addOrEditItem.vue'));
 
 const { params, tableData, getList, loading } = useSearch<any[]>(
@@ -75,20 +77,27 @@ const resetQuery = () => {
  * 单一删除
  */
 const onDel = (row: any) => {
-  ElMessageBox.confirm(`此操作将卡号为:“${row.accNumber}”,是否继续?`, '提示', {
-    confirmButtonText: '确认',
-    cancelButtonText: '取消',
+  ElMessageBox.confirm(t('message.iotCard.platformManage.messages.deleteConfirm', { cardNumber: row.accNumber }), t('message.iotCard.platformManage.messages.tip'), {
+    confirmButtonText: t('message.iotCard.platformManage.messages.confirm'),
+    cancelButtonText: t('message.iotCard.platformManage.messages.cancel'),
     type: 'warning',
   }).then(async () => {
     await api.simCard.deleteItem({ ids: [row.id] });
-    ElMessage.success('删除成功');
+    ElMessage.success(t('message.iotCard.platformManage.messages.deleteSuccess'));
     getList();
   });
 };
 
 const formatStatus = (val: any) => {
   // 1:开启 0:禁用
-  return ['禁用', '开启'][val];
+  const statuses = [t('message.iotCard.platformManage.status.disabled'), t('message.iotCard.platformManage.status.enabled')];
+  return statuses[val];
+}
+
+const formatPlatformType = (row: any) => {
+  // 1:电信 2:联通 3:移动
+  const types = ['', t('message.iotCard.platformManage.addOrEdit.operators.telecom'), t('message.iotCard.platformManage.addOrEdit.operators.unicom'), t('message.iotCard.platformManage.addOrEdit.operators.mobile')];
+  return types[row.types];
 }
 
 const onOpenDetail = (item: any) => {

+ 1 - 1
src/views/modules/policy/index/index.vue

@@ -1,5 +1,5 @@
 <template>
-  <el-card shadow="nover" class="page page-wrapper">
+  <el-card shadow="never" class="page page-wrapper">
     <el-form :model="tableData.param" ref="queryRef" inline>
       <el-form-item>
         <el-button @click="onOpenEdit('')">

+ 1 - 1
src/views/modules/policy/runLog/index.vue

@@ -1,5 +1,5 @@
 <template>
-	<el-card shadow="nover" class="page">
+	<el-card shadow="never" class="page">
 		<el-table :data="tableData" style="width: 100%" row-key="id" v-loading="loading">
 			<el-table-column prop="id" label="ID" width="100" show-overflow-tooltip v-col="'id'"></el-table-column>
 			<el-table-column label="操作" align="center"></el-table-column>

+ 1 - 1
src/views/modules/tenant/index.vue

@@ -1,6 +1,6 @@
 <template>
 	<div class="page">
-		<el-card shadow="nover">
+		<el-card shadow="never">
 			<el-form :model="params" inline ref="queryRef">
 				<el-form-item label="名称搜索" prop="name">
 					<el-input v-model="params.name" placeholder="请输入租户名称" clearable style="width: 180px" @keyup.enter.native="getList(1)" />

+ 1 - 1
src/views/personal/index.vue

@@ -3,7 +3,7 @@
 		<el-row>
 			<!-- 个人信息 -->
 			<el-col :xs="24" :sm="24">
-				<el-card shadow="nover" header="个人信息" v-loading="!info.userName">
+				<el-card shadow="never" header="个人信息" v-loading="!info.userName">
 					<div class="personal-user">
 						<div class="personal-user-left">
 							<el-image v-if="isEditStatus && info.avatar" style="width: 140px; height: 140px" :src="info.avatar" />

+ 1 - 1
src/views/system/api/index.vue

@@ -1,6 +1,6 @@
 <template>
   <div class="page">
-    <el-card shadow="nover">
+    <el-card shadow="never">
       <el-form :model="params" inline ref="queryRef">
         <el-form-item label="接口名称" prop="name">
           <el-input v-model="params.name" placeholder="请输入接口名称" clearable style="width: 180px" @keyup.enter.native="getList(1)" />

+ 1 - 1
src/views/system/application/index.vue

@@ -1,5 +1,5 @@
 <template>
-	<el-card shadow="nover" class="page">
+	<el-card shadow="never" class="page">
 		<div class="search">
 			<el-form :model="params" inline ref="queryRef">
 				<el-form-item label="关键字" prop="keyWord" @submit.prevent>

+ 2 - 2
src/views/system/basicConfig/index.vue

@@ -1,12 +1,12 @@
 <template>
 	<div class="page">
-		<el-card shadow="nover">
+		<el-card shadow="never">
 			<el-menu style="--el-menu-bg-color: transparent; --el-menu-hover-bg-color: rgba(0, 0, 0, 0.2); --el-menu-level: 0;" :default-active="activeName" @select="menuChange" class="el-menu-vertical-demo" size="small">
 				<el-menu-item index="1">基础配置</el-menu-item>
 				<el-menu-item index="2">安全配置</el-menu-item>
 			</el-menu>
 		</el-card>
-		<el-card shadow="nover">
+		<el-card shadow="never">
 			<div class="scroll-wrapper">
 				<BasicVue v-if="activeName === '1'"></BasicVue>
 				<SafeVue v-else-if="activeName === '2'"></SafeVue>

+ 1 - 1
src/views/system/city/index.vue

@@ -1,6 +1,6 @@
 <template>
   <div class="page">
-    <el-card shadow="nover">
+    <el-card shadow="never">
       <el-form :model="tableData.param" ref="queryRef" inline>
         <el-form-item label="城市名称" prop="name">
           <el-input v-model="tableData.param.name" placeholder="请输入城市名称" clearable @keyup.enter="queryList" />

+ 1 - 1
src/views/system/config/index.vue

@@ -1,6 +1,6 @@
 <template>
   <div class="page">
-    <el-card shadow="nover">
+    <el-card shadow="never">
       <el-form :model="tableData.param" ref="queryRef" inline label-width="68px">
         <el-form-item label="参数名称" prop="configName">
           <el-input v-model="tableData.param.configName" placeholder="请输入参数名称" clearable @keyup.enter.native="dataList" />

+ 1 - 1
src/views/system/datahub/modeling/index.vue

@@ -1,6 +1,6 @@
 <template>
 	<div class="page">
-		<el-card shadow="nover">
+		<el-card shadow="never">
 			<el-form :model="tableData.param" ref="queryRef" inline>
 				<!-- <el-form-item label="模型标识" prop="key">
             <el-input v-model="tableData.param.key" placeholder="请输入模型标识" clearable style="width: 240px" @keyup.enter.native="typeList" />

+ 1 - 1
src/views/system/datahub/source/detail.vue

@@ -1,6 +1,6 @@
 <template>
 	<div class="page page-full">
-		<el-card shadow="nover">
+		<el-card shadow="never">
 			<div class="content">
 				<div class="cont_box">
 					<div class="title">数据源名称:{{ detail.name }}</div>

+ 1 - 1
src/views/system/datahub/source/index.vue

@@ -1,6 +1,6 @@
 <template>
 	<div class="page">
-		<el-card shadow="nover">
+		<el-card shadow="never">
 			<el-form inline ref="queryRef">
 				<el-form-item label="数据源标识" prop="name">
 					<el-input v-model="params.key" placeholder="请输入" clearable style="width: 140px" @keyup.enter.native="getList" />

+ 1 - 1
src/views/system/dict/dataList.vue

@@ -1,6 +1,6 @@
 <template>
   <div class="page">
-    <el-card shadow="nover">
+    <el-card shadow="never">
       <el-form :model="tableData.param" ref="queryRef" inline>
         <el-form-item label="字典类型" prop="dictType">
           <el-input v-model="tableData.param.dictType" placeholder="请输入字典类型" clearable @keyup.enter.native="dataList" />

+ 1 - 1
src/views/system/dict/index.vue

@@ -1,6 +1,6 @@
 <template>
   <div class="page">
-    <el-card shadow="nover">
+    <el-card shadow="never">
       <el-form :model="tableData.param" ref="queryRef" inline label-width="68px">
         <el-form-item label="字典名称" prop="dictName">
           <el-input v-model="tableData.param.dictName" placeholder="请输入字典名称" clearable @keyup.enter.native="typeList" />

+ 1 - 1
src/views/system/manage/blacklist/index.vue

@@ -1,6 +1,6 @@
 <template>
   <div class="page">
-    <el-card shadow="nover">
+    <el-card shadow="never">
       <el-form :model="tableData.param" ref="queryRef" inline label-width="68px">
         <el-form-item label="IP地址" prop="keyWord">
           <el-input v-model="tableData.param.keyWord" placeholder="请输入IP地址" clearable style="width: 240px" @keyup.enter.native="typeList" />

+ 1 - 1
src/views/system/manage/dept/index.vue

@@ -1,6 +1,6 @@
 <template>
   <div class="page">
-    <el-card shadow="nover">
+    <el-card shadow="never">
       <el-form :model="tableData.param" inline ref="queryRef" @keyup.enter="deptList">
         <el-form-item label="组织名称" prop="deptName">
           <el-input v-model="tableData.param.deptName" placeholder="请输入组织名称" class="w-50" clearable />

+ 1 - 1
src/views/system/manage/org/index.vue

@@ -1,6 +1,6 @@
 <template>
   <div class="system-dept-container">
-    <el-card shadow="nover">
+    <el-card shadow="never">
       <div class="system-dept-search mb15">
         <el-form :model="tableData.param" inline ref="queryRef">
           <el-form-item label="区域名称" prop="name">

+ 1 - 1
src/views/system/manage/post/index.vue

@@ -1,5 +1,5 @@
 <template>
-  <el-card shadow="nover" class="page">
+  <el-card shadow="never" class="page">
     <el-form :model="tableData.param" inline ref="queryRef">
       <el-form-item label="岗位名称" prop="postName">
         <el-input v-model="tableData.param.postName" placeholder="请输入岗位名称" class="w-50" clearable />

+ 1 - 1
src/views/system/manage/role/index.vue

@@ -1,5 +1,5 @@
 <template>
-  <el-card shadow="nover" class="page">
+  <el-card shadow="never" class="page">
     <el-form :model="tableData.param" inline ref="queryRef">
       <el-form-item label="角色名称" prop="name">
         <el-input v-model="tableData.param.name" placeholder="请输入角色名称" class="w-50" clearable />

+ 2 - 2
src/views/system/manage/user/index.vue

@@ -1,6 +1,6 @@
 <template>
 	<div class="page flex-row gap-4">
-		<el-card shadow="nover" style="width:260px">
+		<el-card shadow="never" style="width:260px">
 			<el-scrollbar>
 				<el-input :prefix-icon="search" v-model="filterText" placeholder="请输入组织名称" clearable style="width: 100%;" />
 				<el-tree ref="treeRef" class="filter-tree mt-4" :data="deptData" :props="deptProps" default-expand-all :filter-node-method="deptFilterNode" @node-click="handleNodeClick">
@@ -12,7 +12,7 @@
 				</el-tree>
 			</el-scrollbar>
 		</el-card>
-		<el-card shadow="nover" class="flex1">
+		<el-card shadow="never" class="flex1">
 			<el-form :model="tableData.param" ref="queryRef" inline>
 				<el-form-item label="" prop="keyWords">
 					<el-input v-model="tableData.param.keyWords" placeholder="用户名或姓名搜索" clearable style="width: 165px" @keyup.enter.native="userList" />

+ 1 - 1
src/views/system/menu/index.vue

@@ -1,5 +1,5 @@
 <template>
-	<el-card shadow="nover" class="page">
+	<el-card shadow="never" class="page">
 		<el-form :model="state.queryParams" inline ref="queryRef" @keyup.enter="handleQuery()">
 			<el-form-item label="菜单名称" prop="title">
 				<el-input v-model="state.queryParams.title" placeholder="请输入菜单名称" clearable class="w-50" />

+ 5 - 5
src/views/system/monitor/cache/index.vue

@@ -130,7 +130,7 @@
         </el-card>
       </el-col>
       <el-col :span="12" class="marg-b-15">
-        <el-card shadow="nover" class="box-card-height" style="height:auto">
+        <el-card shadow="never" class="box-card-height" style="height:auto">
           <template #header>
             <div class="card-header">
               <span>CPU 信息</span>
@@ -178,7 +178,7 @@
     </el-row>
     <el-row :gutter="15">
       <el-col :span="12" class="marg-b-15">
-        <el-card shadow="nover" class="box-card-height" style="height:auto">
+        <el-card shadow="never" class="box-card-height" style="height:auto">
           <template #header>
             <div class="card-header">
               <span>服务信息</span>
@@ -256,7 +256,7 @@
         </el-card>
       </el-col>
       <el-col :span="12" class="marg-b-15">
-        <el-card shadow="nover" class="box-card-height" style="height:auto">
+        <el-card shadow="never" class="box-card-height" style="height:auto">
           <template #header>
             <div class="card-header">
               <span>内存信息</span>
@@ -340,7 +340,7 @@
     </el-row>
     <div class="flex-row gap-3">
       <el-col :xs="24" :sm="24" :md="24" class="marg-b-15">
-        <el-card shadow="nover" class="box-card-height" style="height:auto">
+        <el-card shadow="never" class="box-card-height" style="height:auto">
           <template #header>
             <div class="card-header">
               <span>基础统计信息</span>
@@ -383,7 +383,7 @@
     </div>
     <div class="flex-row gap-3">
       <el-col :xs="24" :sm="24" :md="24">
-        <el-card shadow="nover" class="box-card-height" style="height:auto">
+        <el-card shadow="never" class="box-card-height" style="height:auto">
           <template #header>
             <div class="card-header">
               <span>info Keyspace统计信息</span>

+ 1 - 1
src/views/system/monitor/loginLog/index.vue

@@ -1,5 +1,5 @@
 <template>
-  <el-card shadow="nover" class="page">
+  <el-card shadow="never" class="page">
     <el-form :model="tableData.param" ref="queryRef" inline>
       <el-form-item label="" prop="ipaddr">
         <el-input v-model="tableData.param.ipaddr" placeholder="登录IP" clearable style="width: 150px" @keyup.enter="dataList" />

+ 1 - 1
src/views/system/monitor/notice/index.vue

@@ -1,6 +1,6 @@
 <template>
 	<div class="page">
-		<el-card shadow="nover">
+		<el-card shadow="never">
 			<el-table :data="tableData" style="width: 100%" v-loading="loading">
 				<el-table-column type="index" label="序号" width="60" align="center" />
 				<el-table-column prop="MessageInfo.title" label="标题" show-overflow-tooltip></el-table-column>

+ 1 - 1
src/views/system/monitor/online/index.vue

@@ -1,6 +1,6 @@
 <template>
   <div class="page">
-    <el-card shadow="nover">
+    <el-card shadow="never">
       <el-form :model="tableData.param" v-if="false" ref="queryRef" inline label-width="68px">
         <el-form-item label="登录时间" prop="dateRange">
           <el-date-picker v-model="tableData.param.dateRange" style="width: 240px" value-format="YYYY-MM-DD" type="daterange" range-separator="-" start-placeholder="开始日期" end-placeholder="结束日期"></el-date-picker>

+ 1 - 1
src/views/system/monitor/operLog/index.vue

@@ -1,5 +1,5 @@
 <template>
-  <el-card shadow="nover" class="page">
+  <el-card shadow="never" class="page">
     <el-form :model="tableData.param" ref="queryRef" inline>
       <el-form-item label="" prop="title">
         <el-input v-model="tableData.param.title" placeholder="系统模块" clearable style="width: 220px" @keyup.enter="dataList" />

+ 1 - 1
src/views/system/monitor/plugin/index.vue

@@ -1,6 +1,6 @@
 <template>
 	<div class="page">
-		<el-card shadow="nover" class="page-full-part">
+		<el-card shadow="never" class="page-full-part">
 			<el-form :model="params" ref="queryRef" inline label-width="68px">
 				<el-form-item label="关键字" prop="keyWord">
 					<el-input v-model="params.keyWord" placeholder="请输入关键字" clearable style="width: 180px" @keyup.enter="getList(1)" />

+ 7 - 7
src/views/system/monitor/server/index.vue

@@ -1,7 +1,7 @@
 <template>
   <div>
     <div class="flex-row" style="gap: 16px; align-items: stretch;margin-bottom: 16px">
-      <el-card shadow="nover" class="flex1">
+      <el-card shadow="never" class="flex1">
         <div class="flex-row">
           <el-descriptions :column="1" border class="flex1">
             <el-descriptions-item label="CPU数">{{ sysInfo.cpuNum }}</el-descriptions-item>
@@ -15,7 +15,7 @@
           </div>
         </div>
       </el-card>
-      <el-card shadow="nover" class="flex1">
+      <el-card shadow="never" class="flex1">
         <div class="flex-row">
           <el-descriptions :column="1" border class="flex1">
             <el-descriptions-item label="内存总数">{{ memorySizeFormat(sysInfo.memTotal) }}</el-descriptions-item>
@@ -29,7 +29,7 @@
           </div>
         </div>
       </el-card>
-      <el-card shadow="nover" class="flex1">
+      <el-card shadow="never" class="flex1">
         <div class="flex-row">
           <el-descriptions :column="1" border class="flex1">
             <el-descriptions-item label="磁盘容量">{{ memorySizeFormat(sysInfo.diskTotal) }}</el-descriptions-item>
@@ -43,20 +43,20 @@
       </el-card>
     </div>
     <div class="flex-row" style="gap: 16px; align-items: stretch;margin-bottom: 16px">
-      <el-card shadow="nover" class="flex1">
+      <el-card shadow="never" class="flex1">
         <template #header>CPU运行情况</template>
         <VueUiXy :dataset="dataset4" :config="config4" />
       </el-card>
-      <el-card shadow="nover" class="flex1">
+      <el-card shadow="never" class="flex1">
         <template #header>内存运行情况</template>
         <VueUiXy :dataset="dataset5" :config="config5" />
       </el-card>
-      <el-card shadow="nover" class="flex1">
+      <el-card shadow="never" class="flex1">
         <template #header>磁盘使用情况</template>
         <VueUiXy :dataset="dataset6" :config="config6" />
       </el-card>
     </div>
-    <el-card shadow="nover">
+    <el-card shadow="never">
       <template #header>运行环境信息</template>
       <el-descriptions :column="3" border class="flex1">
         <el-descriptions-item label="操作系统">{{ hostData.os }}</el-descriptions-item>

+ 1 - 1
src/views/system/monitor/task-logs/index.vue

@@ -163,7 +163,7 @@ const { loading: detailLoading, doLoading: doDetailLoad } = useLoading(async (id
 </script>
 
 <template>
-  <el-card shadow="nover" class="page">
+  <el-card shadow="never" class="page">
     <el-form :model="searchParam" inline>
       <el-form-item label="" prop="jobName">
         <el-input style="width: 150px" v-model="searchParam.jobName" placeholder="任务名称"></el-input>

+ 1 - 1
src/views/system/monitor/upgrade/index.vue

@@ -1,7 +1,7 @@
 <!-- 远程升级 -->
 <template>
   <div class="page">
-    <el-card shadow="nover" class="page-full-part">
+    <el-card shadow="never" class="page-full-part">
       <h1 class="mb14">当前系统版本号:{{ tableData.currentVersion }}</h1>
       <el-card>
         <template #header>

+ 1 - 1
src/views/system/sso/index.vue

@@ -1,6 +1,6 @@
 <template>
 	<div class="page">
-		<el-card shadow="nover">
+		<el-card shadow="never">
 			<el-form :model="params" inline ref="queryRef">
 				<el-form-item label="名称搜索" prop="name">
 					<el-input v-model="params.name" placeholder="请输入租户名称" clearable style="width: 180px" @keyup.enter.native="getList(1)" />

+ 1 - 1
src/views/system/task/index.vue

@@ -1,6 +1,6 @@
 <template>
   <div class="page">
-    <el-card shadow="nover">
+    <el-card shadow="never">
       <el-form :model="tableData.param" ref="queryRef" inline>
         <el-form-item label="关键字" prop="jobName">
           <el-input v-model="tableData.param.jobName" placeholder="输入名称或描述关键字" clearable style="width: 180px;" @keyup.enter="dataList" />