瀏覽代碼

feat: 加入多语言

vera_min 1 月之前
父節點
當前提交
a2e83c6f8e

+ 14 - 3
src/components/upload/uploadFile.vue

@@ -1,8 +1,16 @@
+<!--
+ * @Author: vera_min vera_min@163.com
+ * @Date: 2025-08-28 16:22:30
+ * @LastEditors: vera_min vera_min@163.com
+ * @LastEditTime: 2025-09-01 13:59:24
+ * @FilePath: /sagoo-admin-ui-pro2/src/components/upload/uploadFile.vue
+ * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
+-->
 <template>
 	<el-upload :accept="accept" :show-file-list="false" v-model:file-list="fileList" :limit="1" :data="{ source }" :headers="headers" :before-upload="beforeAvatarUpload" :action="uploadUrl" :on-success="updateImg">
 		<el-button>
 			<el-icon> <ele-Upload /> </el-icon>
-			数据导入
+			{{ $t('message.upload.importData') }}
 		</el-button>
 	</el-upload>
 </template>
@@ -13,6 +21,9 @@ import { ElMessage } from 'element-plus';
 import type { UploadProps } from 'element-plus';
 import getOrigin from '/@/utils/origin';
 import { getToken } from "/@/utils/auth";
+import { useI18n } from 'vue-i18n';
+
+const { t } = useI18n();
 
 const source = localStorage.uploadFileWay
 
@@ -48,14 +59,14 @@ const updateImg = (res: any) => {
 		return ElMessage.error(res.message)
 	}
 
-	ElMessage.success('文件上传成功');
+	ElMessage.success(t('message.upload.fileUploadSuccess'));
 	fileList.value = []
 	emit('update', res.data.full_path)
 };
 
 const beforeAvatarUpload: UploadProps['beforeUpload'] = (rawFile) => {
 	if (rawFile.size / 1024 / 1024 > 2) {
-		ElMessage.error('文件不能超过2MB!');
+		ElMessage.error(t('message.upload.fileUploadError2MB'));
 		return false;
 	}
 	return true;

+ 11 - 1
src/i18n/index.ts

@@ -2,7 +2,7 @@
  * @Author: vera_min vera_min@163.com
  * @Date: 2025-08-02 12:21:54
  * @LastEditors: vera_min vera_min@163.com
- * @LastEditTime: 2025-09-01 10:43:44
+ * @LastEditTime: 2025-09-01 12:10:34
  * @FilePath: /sagoo-admin-ui/src/i18n/index.ts
  * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
  */
@@ -46,10 +46,17 @@ import pagesDateCenterZhcn from './pages/dateCenter/zh-cn';
 import pagesDateCenterEn from './pages/dateCenter/en';
 import pagesDateCenterZhtw from './pages/dateCenter/zh-tw';
 
+
+// 数据分析
 import pagesDataAnalysisZhcn from './pages/dataAnalysis/zh-cn';
 import pagesDataAnalysisEn from './pages/dataAnalysis/en';
 import pagesDataAnalysisZhtw from './pages/dataAnalysis/zh-tw';
 
+// 证书管理
+import pagesCertificateZhcn from './pages/certificate/zh-cn';
+import pagesCertificateEn from './pages/certificate/en';
+import pagesCertificateZhtw from './pages/certificate/zh-tw';
+
 
 // 定义语言国际化内容
 /**
@@ -71,6 +78,7 @@ const messages = {
 			property: pagesPropertyZhcn,
 			dateCenter: pagesDateCenterZhcn,
 			dataAnalysis: pagesDataAnalysisZhcn,
+			certificate: pagesCertificateZhcn,
 		}
 	},
 	[enLocale.name]: {
@@ -86,6 +94,7 @@ const messages = {
 			property: pagesPropertyEn,
 			dateCenter: pagesDateCenterEn,
 			dataAnalysis: pagesDataAnalysisEn,
+			certificate: pagesCertificateEn,
 		},	
 	},
 	[zhtwLocale.name]: {
@@ -101,6 +110,7 @@ const messages = {
 			property: pagesPropertyZhtw,
 			dateCenter: pagesDateCenterZhtw,
 			dataAnalysis: pagesDataAnalysisZhtw,
+			certificate: pagesCertificateZhtw,
 		},
 	},
 };

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

@@ -363,5 +363,10 @@ export default {
 			title: "Policy",
 			policyControl: "Policy Control",
 		}
+	},
+	upload: {
+		importData: "Data Import",
+		fileUploadSuccess: "File uploaded successfully",
+		fileUploadError2MB: "File size cannot exceed 2MB!"
 	}
 };

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

@@ -356,5 +356,10 @@ export default {
 			title: "策略管理",
 			policyControl: "策略控制",
 		}
+	},
+	upload: {
+		importData: "数据导入",
+		fileUploadSuccess: "文件上传成功",
+		fileUploadError2MB: "文件不能超过2MB!"
 	}
 };

+ 6 - 1
src/i18n/lang/zh-tw.ts

@@ -2,7 +2,7 @@
  * @Author: vera_min vera_min@163.com
  * @Date: 2025-08-02 12:21:54
  * @LastEditors: vera_min vera_min@163.com
- * @LastEditTime: 2025-08-05 13:00:24
+ * @LastEditTime: 2025-09-01 13:56:39
  * @FilePath: /sagoo-admin-ui/src/i18n/lang/zh-tw.ts
  * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
  */
@@ -363,5 +363,10 @@ export default {
 			title: "政策管理",
 			policyControl: "政策控制",
 		}
+	},
+	upload: {
+		importData: "資料匯入",
+		fileUploadSuccess: "檔案上傳成功",
+		fileUploadError2MB: "檔案不能超過2MB!"
 	}
 };

+ 69 - 0
src/i18n/pages/certificate/en.ts

@@ -0,0 +1,69 @@
+/*
+ * @Author: vera_min vera_min@163.com
+ * @Date: 2025-09-01 12:02:37
+ * @LastEditors: vera_min vera_min@163.com
+ * @LastEditTime: 2025-09-01 13:49:50
+ * @FilePath: /sagoo-admin-ui-pro2/src/i18n/pages/certificate/en.ts
+ * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
+ */
+// 数据分析
+export default {
+  labels: {
+    certificateName: "Certificate Name",
+    standard: "Certificate Standard",
+    fileContent: "Certificate File",
+    publicKeyContent: "Public Key",
+    privateKeyContent: "Private Key",
+    description: "Description",
+  },
+  columns: {
+    id: 'ID',
+    name: 'Certificate Name',
+    standard: 'Certificate Standard',
+    description: 'Description',
+    status: 'Status',
+    action: 'Actions',
+  },
+  actions: {
+    search: 'Search',
+    reset: "Reset",
+    addCertificate: "Add Certificate",
+    edit: 'Edit',
+    delete: 'Delete',
+    editCertificate: "Edit Certificate",
+    upload: "Upload",
+    cancel: "Cancel",
+    submit: "Submit"
+  },
+  status: {
+    normal: "Normal",
+    pause: "Pause",
+    enable: "Enable",
+    disable: "Disable",
+    enableText: "On",
+    disableText: "Off"
+  },
+  options: { },
+  messages: {
+    tip: 'Tip',
+    confirm: 'Confirm',
+    cancel: 'Cancel',
+    confirmText: "Are you sure to {text}:'{name}'?",
+    success: 'success',
+    deleteConfirm: "Are you sure to delete the data item with the number '{id}'?",
+    deleteSuccess: 'Deleted successfully',
+    editSuccess: "Certificate updated successfully",
+    addSuccess: "Certificate added successfully"
+  },
+  placeholders: {
+    certificateName: "Please enter certificate name",
+    standard: "Please select certificate standard"
+  },
+  validate: {
+    certificateName: "Certificate name is required",
+    standard: "Certificate standard is required",
+    fileContent: "Certificate file is required",
+    publicKeyContent: "Public key is required",
+    privateKeyContent: "Private key is required",
+  }
+};

+ 69 - 0
src/i18n/pages/certificate/zh-cn.ts

@@ -0,0 +1,69 @@
+/*
+ * @Author: vera_min vera_min@163.com
+ * @Date: 2025-09-01 12:02:37
+ * @LastEditors: vera_min vera_min@163.com
+ * @LastEditTime: 2025-09-01 13:49:11
+ * @FilePath: /sagoo-admin-ui-pro2/src/i18n/pages/certificate/zh-cn.ts
+ * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
+ */
+// 数据分析
+export default {
+  labels: {
+    certificateName: "证书名称",
+    standard: "证书标准",
+    fileContent: "证书文件",
+    publicKeyContent: "证书公钥",
+    privateKeyContent: "证书私钥",
+    description: "说明",
+  },
+  columns: {
+    id: 'ID',
+    name: '证书名称',
+    standard: '证书标准',
+    description: '说明',
+    status: '状态',
+    action: '操作',
+  },
+  actions: {
+    search: '查询',
+    reset: "重置",
+    addCertificate: "新增证书",
+    edit: '编辑',
+    delete: '删除',
+    editCertificate: "编辑证书",
+    upload: "上传",
+    cancel: "取消",
+    submit: "提交"
+  },
+  status: {
+    normal: "正常",
+    pause: "暂停",
+    enable: "启用",
+    disable: "停用",
+    enableText: "启",
+    disableText: "禁"
+  },
+  options: {},
+  messages: {
+    tip: '提示',
+    confirm: '确认',
+    cancel: '取消',
+    confirmText: '确认要{text}:{name}证书吗?',
+    success: '成功',
+    deleteConfirm: "是否确认删除编号为{id}的数据项?",
+    deleteSuccess: '删除成功',
+    editSuccess: "证书编辑成功",
+    addSuccess: "证书添加成功"
+  },
+  placeholders: {
+    certificateName: "请输入证书名称",
+    standard: "请选择证书标准"
+  },
+  validate: {
+		certificateName: "证书名称不能为空",
+		standard: "证书标准不能为空",
+		fileContent: "证书文件不能为空",
+		publicKeyContent: "证书公钥不能为空",
+		privateKeyContent: "证书私钥不能为空",
+	}
+};

+ 69 - 0
src/i18n/pages/certificate/zh-tw.ts

@@ -0,0 +1,69 @@
+/*
+ * @Author: vera_min vera_min@163.com
+ * @Date: 2025-09-01 12:02:37
+ * @LastEditors: vera_min vera_min@163.com
+ * @LastEditTime: 2025-09-01 13:50:35
+ * @FilePath: /sagoo-admin-ui-pro2/src/i18n/pages/certificate/zh-cn.ts
+ * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
+ */
+// 数据分析
+export default {
+  labels: {
+    certificateName: "憑證名稱",
+    standard: "憑證標準",
+    fileContent: "憑證檔案",
+    publicKeyContent: "憑證公鑰",
+    privateKeyContent: "憑證私鑰",
+    description: "說明",
+  },
+  columns: {
+    id: 'ID',
+    name: '憑證名稱',
+    standard: '憑證標準',
+    description: '說明',
+    status: '狀態',
+    action: '操作',
+  },
+  actions: {
+    search: '查詢',
+    reset: "重置",
+    addCertificate: "新增憑證",
+    edit: '編輯',
+    delete: '刪除',
+    editCertificate: "編輯憑證",
+    upload: "上傳",
+    cancel: "取消",
+    submit: "提交"
+  },
+  status: {
+    normal: "正常",
+    pause: "暫停",
+    enable: "啟用",
+    disable: "停用",
+    enableText: "啟",
+    disableText: "禁"
+  },
+  options: {},
+  messages: {
+    tip: '提示',
+    confirm: '確認',
+    cancel: '取消',
+    confirmText: '確認要{text}:{name}憑證嗎?',
+    success: '成功',
+    deleteConfirm: "是否確認刪除編號為{id}的資料項?",
+    deleteSuccess: '刪除成功',
+    editSuccess: "憑證編輯成功",
+    addSuccess: "憑證新增成功"
+  },
+  placeholders: {
+    certificateName: "請輸入憑證名稱",
+    standard: "請選擇憑證標準"
+  },
+  validate: {
+    certificateName: "憑證名稱不能為空",
+    standard: "憑證標準不能為空",
+    fileContent: "憑證檔案不能為空",
+    publicKeyContent: "憑證公鑰不能為空",
+    privateKeyContent: "憑證私鑰不能為空",
+  }
+};

+ 1 - 1
src/i18n/pages/dataAnalysis/zh-cn.ts

@@ -2,7 +2,7 @@
  * @Author: vera_min vera_min@163.com
  * @Date: 2025-09-01 10:41:04
  * @LastEditors: vera_min vera_min@163.com
- * @LastEditTime: 2025-09-01 12:07:57
+ * @LastEditTime: 2025-09-01 12:51:22
  * @FilePath: /sagoo-admin-ui-pro2/src/i18n/pages/dataAnalysis/zh-cn.ts
  * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
  */

+ 84 - 263
src/views/iot/certificate/component/editParams.vue

@@ -1,316 +1,137 @@
 <template>
-	<el-dialog @close="closeDialog" :title="state.ruleForm.id ? '编辑证书' : '新增证书'" v-model="state.dialogVisible" width="60%">
-		<!-- <el-tabs v-model="state.activeName" @tab-click="onTabClick"> -->
-		<!-- <el-tab-pane label="基本信息" name="1"> -->
-		<el-form :rules="state.rules" ref="ruleForm" :model="state.ruleForm" label-width="120px">
-			<el-form-item label="证书标准" prop="standard">
-				<el-select v-model="state.ruleForm.standard" placeholder="请选择证书标准">
+	<!-- 编辑证书/新增证书 -->
+	<el-dialog @close="closeDialog" :title="ruleForm.id ? $t('message.certificate.actions.editCertificate') : $t('message.certificate.actions.addCertificate')" v-model="dialogVisible" width="60%">
+		<el-form :rules="rules" ref="ruleFormRef" :model="ruleForm" :label-width="currentLocale === 'en' ? '150px' : '120px'">
+			<!-- 证书标准 -->
+			<el-form-item :label="$t('message.certificate.labels.standard')" prop="standard">
+				<!-- 请选择证书标准 -->
+				<el-select v-model="ruleForm.standard" class="w100" :placeholder="$t('message.certificate.placeholders.standard')">
 					<el-option v-for="dict in network_certificate" :key="dict.value" :label="dict.label" :value="dict.value"> </el-option>
 				</el-select>
 			</el-form-item>
-			<el-form-item label="证书名称" prop="name">
-				<el-input v-model.trim="state.ruleForm.name"></el-input>
+			<!-- 证书名称 -->
+			<el-form-item :label="$t('message.certificate.labels.certificateName')" prop="name">
+				<el-input v-model.trim="ruleForm.name"></el-input>
 			</el-form-item>
-			<el-form-item label="证书文件" prop="fileContent">
-				<el-input disabled v-if="state.ruleForm.fileContent" v-model="state.ruleForm.fileContent"></el-input>
+			<!-- 证书文件 -->
+			<el-form-item :label="$t('message.certificate.labels.fileContent')" prop="fileContent">
+				<el-input disabled v-if="ruleForm.fileContent" v-model="ruleForm.fileContent"></el-input>
 				<uploadFile @update="updateFile"></uploadFile>
 			</el-form-item>
-			<el-form-item label="证书公钥" prop="publicKeyContent">
-				<el-input disabled type="textarea" :rows="6" v-model="state.ruleForm.publicKeyContent"></el-input>
+			<!-- 证书公钥 -->
+			<el-form-item :label="$t('message.certificate.labels.publicKeyContent')" prop="publicKeyContent">
+				<el-input disabled type="textarea" :rows="6" v-model="ruleForm.publicKeyContent"></el-input>
 				<el-upload class="upload-demo" action="" accept=".txt" :on-change="beforePublicUpload" :auto-upload="false">
-					<el-button size="small" type="primary">上传</el-button>
+					<!-- 上传 -->
+					<el-button size="small" type="primary">{{$t('message.certificate.actions.upload')}}</el-button>
 				</el-upload>
 			</el-form-item>
-			<el-form-item label="证书私钥" prop="privateKeyContent">
-				<el-input disabled type="textarea" :rows="6" v-model="state.ruleForm.privateKeyContent"></el-input>
+			<!-- 证书私钥 -->
+			<el-form-item :label="$t('message.certificate.labels.privateKeyContent')" prop="privateKeyContent">
+				<el-input disabled type="textarea" :rows="6" v-model="ruleForm.privateKeyContent"></el-input>
 				<el-upload class="upload-demo" action="" accept=".txt" :on-change="beforePrivateUpload" :auto-upload="false">
-					<el-button size="small" type="primary">上传</el-button>
+					<!-- 上传 -->
+					<el-button size="small" type="primary">{{$t('message.certificate.actions.upload')}}</el-button>
 				</el-upload>
 			</el-form-item>
-			<el-form-item label="说明">
-				<el-input type="textarea" :rows="6" v-model="state.ruleForm.description"></el-input>
+			<!-- 说明 -->
+			<el-form-item :label="$t('message.certificate.labels.description')">
+				<el-input type="textarea" :rows="6" v-model="ruleForm.description"></el-input>
 			</el-form-item>
 		</el-form>
 
 		<template #footer>
 			<div class="dialog-footer">
-				<el-button type="default" @click="closeDialog">取 消</el-button>
-				<el-button type="primary" @click="submitData(ruleForm)">提 交</el-button>
+				<!-- 取消 -->
+				<el-button type="default" @click="closeDialog">{{ $t('message.certificate.actions.cancel') }}</el-button>
+				<!-- 提交 -->
+				<el-button type="primary" @click="submitData(ruleFormRef)">{{ $t('message.certificate.actions.submit') }}</el-button>
 			</div>
 		</template>
 	</el-dialog>
 </template>
 
 <script lang="ts" setup>
-import { reactive, ref, getCurrentInstance } from 'vue'
-import { FormInstance } from 'element-plus'
+import { ref, getCurrentInstance, computed } from 'vue'
 import uploadFile from '/@/components/upload/uploadFile.vue'
+import { useI18n } from 'vue-i18n'
+
+const { locale, t } = useI18n();
 
 import api from '/@/api/certificateManagement'
 import { ElMessage } from 'element-plus'
 
 const emit = defineEmits(['update'])
+const currentLocale = computed(() => locale.value)
+const ruleFormRef = ref();
+const dialogVisible = ref(false);
+const rules = computed(() => ({
+	name: [{ required: true, message: t('message.certificate.validate.certificateName'), trigger: 'blur' }],
+	standard: [{ required: true, message: t('message.certificate.validate.standard'), trigger: ['blur', 'change'] }],
+	fileContent: [{ required: true, message: t('message.certificate.validate.fileContent'), trigger: 'blur' }],
+	publicKeyContent: [{ required: true, message: t('message.certificate.validate.publicKeyContent'), trigger: ['blur', 'change'] }],
+	privateKeyContent: [{ required: true, message: t('message.certificate.validate.privateKeyContent'), trigger: ['blur', 'change'] }],
+}))
+const ruleForm = ref({
+	id: "",
+	standard: "",
+	name: "",
+	fileContent: "",
+	publicKeyContent: "",
+	privateKeyContent: "",
+	description: ""
+});
 
-const ruleForm = ref<FormInstance>()
-
-const state = reactive({
-	dialogVisible: false,
-	activeName: '1',
-	id: 0,
-	ruleForm: {},
-	rules: {
-		name: [{ required: true, message: '证书名称不能为空', trigger: 'blur' }],
-		standard: [{ required: true, message: '证书标准不能为空', trigger: ['blur', 'change'] }],
-		fileContent: [{ required: true, message: '证书文件不能为空', trigger: 'blur' }],
-		publicKeyContent: [{ required: true, message: '证书公钥不能为空', trigger: ['blur', 'change'] }],
-		privateKeyContent: [{ required: true, message: '证书私钥不能为空', trigger: ['blur', 'change'] }],
-	},
-	columns: [
-		{
-			columnId: 29,
-			tableId: 3,
-			TableName: '',
-			columnName: 'business_type',
-			columnComment: '0其它 1新增 2修改 3删除',
-			columnType: 'varchar(1)',
-			columnKey: '',
-			goType: 'string',
-			goField: 'BusinessType',
-			jsonField: 'businessType',
-			htmlField: '',
-			isPk: '0',
-			isIncrement: '',
-			isRequired: '0',
-			isInsert: '1',
-			isEdit: '1',
-			isList: '1',
-			isQuery: '1',
-			queryType: 'EQ',
-			htmlType: 'datetime',
-			dictType: '',
-			sort: 3,
-			linkTableName: '',
-			linkTableClass: '',
-			linkTablePackage: '',
-			linkLabelId: '',
-			linkLabelName: '',
-		},
-		{
-			columnId: 31,
-			tableId: 3,
-			TableName: '',
-			columnName: 'method',
-			columnComment: '请求方法',
-			columnType: 'varchar(255)',
-			columnKey: '',
-			goType: 'string',
-			goField: 'Method',
-			jsonField: 'method',
-			htmlField: '',
-			isPk: '0',
-			isIncrement: '',
-			isRequired: '0',
-			isInsert: '1',
-			isEdit: '1',
-			isList: '1',
-			isQuery: '1',
-			queryType: 'EQ',
-			htmlType: 'input',
-			dictType: '',
-			sort: 4,
-			linkTableName: '',
-			linkTableClass: '',
-			linkTablePackage: '',
-			linkLabelId: '',
-			linkLabelName: '',
-		},
-		{
-			columnId: 33,
-			tableId: 3,
-			TableName: '',
-			columnName: 'oper_name',
-			columnComment: '操作人员',
-			columnType: 'varchar(255)',
-			columnKey: '',
-			goType: 'string',
-			goField: 'OperName',
-			jsonField: 'operName',
-			htmlField: '',
-			isPk: '0',
-			isIncrement: '',
-			isRequired: '1',
-			isInsert: '1',
-			isEdit: '1',
-			isList: '1',
-			isQuery: '1',
-			queryType: 'LIKE',
-			htmlType: 'input',
-			dictType: '',
-			sort: 5,
-			linkTableName: '',
-			linkTableClass: '',
-			linkTablePackage: '',
-			linkLabelId: '',
-			linkLabelName: '',
-		},
-		{
-			columnId: 35,
-			tableId: 3,
-			TableName: '',
-			columnName: 'oper_url',
-			columnComment: '操作url',
-			columnType: 'varchar(255)',
-			columnKey: '',
-			goType: 'string',
-			goField: 'OperUrl',
-			jsonField: 'operUrl',
-			htmlField: '',
-			isPk: '0',
-			isIncrement: '',
-			isRequired: '0',
-			isInsert: '1',
-			isEdit: '1',
-			isList: '1',
-			isQuery: '1',
-			queryType: 'EQ',
-			htmlType: 'input',
-			dictType: '',
-			sort: 6,
-			linkTableName: '',
-			linkTableClass: '',
-			linkTablePackage: '',
-			linkLabelId: '',
-			linkLabelName: '',
-		},
-		{
-			columnId: 37,
-			tableId: 3,
-			TableName: '',
-			columnName: 'oper_ip',
-			columnComment: '操作IP',
-			columnType: 'varchar(255)',
-			columnKey: '',
-			goType: 'string',
-			goField: 'OperIp',
-			jsonField: 'operIp',
-			htmlField: '',
-			isPk: '0',
-			isIncrement: '',
-			isRequired: '0',
-			isInsert: '1',
-			isEdit: '1',
-			isList: '1',
-			isQuery: '1',
-			queryType: 'EQ',
-			htmlType: 'input',
-			dictType: '',
-			sort: 7,
-			linkTableName: '',
-			linkTableClass: '',
-			linkTablePackage: '',
-			linkLabelId: '',
-			linkLabelName: '',
-		},
-		{
-			columnId: 41,
-			tableId: 3,
-			TableName: '',
-			columnName: 'status',
-			columnComment: '0=正常,1=异常',
-			columnType: 'varchar(1)',
-			columnKey: '',
-			goType: 'string',
-			goField: 'Status',
-			jsonField: 'status',
-			htmlField: '',
-			isPk: '0',
-			isIncrement: '',
-			isRequired: '1',
-			isInsert: '1',
-			isEdit: '1',
-			isList: '1',
-			isQuery: '1',
-			queryType: 'EQ',
-			htmlType: 'radio',
-			dictType: '',
-			sort: 10,
-			linkTableName: '',
-			linkTableClass: '',
-			linkTablePackage: '',
-			linkLabelId: '',
-			linkLabelName: '',
-		},
-		{
-			columnId: 42,
-			tableId: 3,
-			TableName: '',
-			columnName: 'oper_id',
-			columnComment: '',
-			columnType: 'bigint(20)',
-			columnKey: '',
-			goType: 'int64',
-			goField: 'OperId',
-			jsonField: 'operId',
-			htmlField: '',
-			isPk: '1',
-			isIncrement: '',
-			isRequired: '0',
-			isInsert: '1',
-			isEdit: '0',
-			isList: '1',
-			isQuery: '1',
-			queryType: 'EQ',
-			htmlType: 'input',
-			dictType: '',
-			sort: 1,
-			linkTableName: '',
-			linkTableClass: '',
-			linkTablePackage: '',
-			linkLabelId: '',
-			linkLabelName: '',
-		},
-	],
-})
 const { proxy } = getCurrentInstance() as any
 const { network_certificate } = proxy.useDict('network_certificate')
 // 打开弹窗
 const openDialog = (row: any) => {
 	if (row) {
-		state.ruleForm = row
+		ruleForm.value = row
 	}
-	state.dialogVisible = true
+	dialogVisible.value = true
 }
 
 // 关闭弹窗
 const closeDialog = () => {
-	state.dialogVisible = false
-	state.ruleForm = {}
-	ruleForm.value?.clearValidate()
+	dialogVisible.value = false
+	resetForm()
+
+}
+
+const resetForm = () => {
+	ruleForm.value = {
+		id: "",
+		standard: "",
+		name: "",
+		fileContent: "",
+		publicKeyContent: "",
+		privateKeyContent: "",
+		description: ""
+	}
+	ruleFormRef.value?.clearValidate()
+	ruleFormRef.value?.resetFields()
 }
-// 取消
-// const onCancel = () => {
-// 	closeDialog()
-// }
 
 const submitData = async (formEl: any | undefined) => {
 	if (!formEl) return
 	await formEl.validate((valid: any) => {
 		if (valid) {
-			if (state.ruleForm.id) {
+			if (ruleForm.value.id) {
 				// 编辑
-				api.certificateManagement.edit(state.ruleForm).then(() => {
-					ElMessage.success('证书编辑成功')
-					state.dialogVisible = false
+				api.certificateManagement.edit(ruleForm.value).then(() => {
+					ElMessage.success(t('message.certificate.messages.editSuccess'))
+					dialogVisible.value = false
 					emit('update')
-					state.ruleForm = {}
+					resetForm()
 				})
 			} else {
 				// 新增
-				api.certificateManagement.add(state.ruleForm).then(() => {
-					ElMessage.success('证书添加成功')
-					state.dialogVisible = false
+				api.certificateManagement.add(ruleForm.value).then(() => {
+					ElMessage.success(t('message.certificate.messages.addSuccess'))
+					dialogVisible.value = false
 					emit('update')
-					state.ruleForm = {}
+					resetForm()
 				})
 			}
 		}
@@ -323,7 +144,7 @@ const beforePublicUpload = (response: any, file: any) => {
 	reader.onload = function (e: any) {
 		let val = e.target.result //获取数据
 		let rtulist = val.split('\r\n')
-		state.ruleForm.publicKeyContent = rtulist[0]
+		ruleForm.value.publicKeyContent = rtulist[0]
 	}
 }
 
@@ -333,11 +154,11 @@ const beforePrivateUpload = (response: any, file: any) => {
 	reader.onload = function (e: any) {
 		let val = e.target.result //获取数据
 		let rtulist = val.split('\r\n')
-		state.ruleForm.privateKeyContent = rtulist[0]
+		ruleForm.value.privateKeyContent = rtulist[0]
 	}
 }
 const updateFile = (url: string) => {
-	state.ruleForm.fileContent = url
+	ruleForm.value.fileContent = url
 }
 
 defineExpose({ openDialog })

+ 51 - 27
src/views/iot/certificate/index.vue

@@ -2,52 +2,64 @@
 	<div class="page">
 		<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 />
+				<!-- 证书名称 -->
+				<el-form-item :label="$t('message.certificate.labels.certificateName')" prop="keyWord">
+					<!-- 请输入证书名称 -->
+					<el-input v-model="state.tableData.param.name" :placeholder="$t('message.certificate.placeholders.certificateName')" clearable />
 				</el-form-item>
 				<el-form-item>
+					<!-- 查询 -->
 					<el-button v-auth="'query'" type="primary" class="ml10" @click="queryList">
 						<el-icon>
 							<ele-Search />
 						</el-icon>
-						查询
+						{{$t('message.certificate.actions.search')}}
 					</el-button>
+					<!-- 重置 -->
 					<el-button v-auth="'reset'" @click="resetQuery(queryRef)">
 						<el-icon>
 							<ele-Refresh />
 						</el-icon>
-						重置
+						{{$t('message.certificate.actions.reset')}}
 					</el-button>
+					<!-- 新增证书 -->
 					<el-button v-auth="'add'" type="primary" class="ml10" @click="operate('add')">
 						<el-icon>
 							<ele-FolderAdd />
 						</el-icon>
-						新增证书
+						{{$t('message.certificate.actions.addCertificate')}}
 					</el-button>
 				</el-form-item>
 			</el-form>
 			<el-table :data="state.tableData.data" v-loading="state.tableData.loading" style="width: 100%">
-				<!-- <el-table-column type="selection" width="55" align="center" /> -->
-				<el-table-column v-col="'id'" label="ID" align="center" prop="id" width="100" />
-				<el-table-column v-col="'name'" label="证书名称" prop="name" min-width="120" show-overflow-tooltip />
-				<el-table-column v-col="'standard'" label="证书标准" prop="standard" min-width="120" show-overflow-tooltip>
+				<!-- ID -->
+				<el-table-column v-col="'id'" :label="$t('message.certificate.columns.id')" align="center" prop="id" width="100" />
+				<!-- 证书名称 -->
+				<el-table-column v-col="'name'" :label="$t('message.certificate.columns.name')" prop="name" min-width="120" show-overflow-tooltip />
+				<!-- 证书标准 -->
+				<el-table-column v-col="'standard'" :label="$t('message.certificate.columns.standard')"  prop="standard" min-width="120" show-overflow-tooltip>
 					<template #default="scope">
 						{{ filterStandard(scope.row.standard) }}
-						<!-- <el-button size="small" text type="primary" @click="operate('editParams', scope.row)">编辑</el-button> -->
-						<!-- <el-button size="small" text type="danger" @click="operate('delete', scope.row)">删除</el-button> -->
 					</template>
 				</el-table-column>
-				<el-table-column v-col="'description'" label="说明" prop="description" min-width="120" show-overflow-tooltip />
-				<el-table-column label="状态" width="120" align="center">
+				<!-- 说明 -->
+				<el-table-column v-col="'description'" :label="$t('message.certificate.columns.description')" prop="description" min-width="120" show-overflow-tooltip />
+				<!-- 状态 -->
+				<el-table-column :label="$t('message.certificate.columns.status')" width="120" align="center">
 					<template #default="scope">
-						<el-switch v-auth="'startOrStop'" v-model="scope.row.status" inline-prompt :active-value="1" :inactive-value="0" active-text="启" inactive-text="禁" @change="handleStatusChange(scope.row)"></el-switch>
-						<span v-noauth="'startOrStop'">{{ scope.row.status ? '正常' : '暂停' }}</span>
+						<!-- 启/禁 -->
+						<el-switch v-auth="'startOrStop'" v-model="scope.row.status" inline-prompt :active-value="1" :inactive-value="0" :active-text="$t('message.certificate.status.enableText')" :inactive-text="$t('message.certificate.status.disableText')" @change="handleStatusChange(scope.row)"></el-switch>
+						<!-- 正常/暂停 -->
+						<span v-noauth="'startOrStop'">{{ scope.row.status ? $t('message.certificate.status.normal') : $t('message.certificate.status.pause') }}</span>
 					</template>
 				</el-table-column>
-				<el-table-column v-col="'handle'" label="操作" width="100" align="center" fixed="right">
+				<!-- 操作 -->
+				<el-table-column v-col="'handle'" :label="$t('message.certificate.columns.action')" width="100" align="center" fixed="right">
 					<template #default="scope">
-						<el-button size="small" v-auth="'edit'" text type="primary" @click="operate('editParams', scope.row)">编辑</el-button>
-						<el-button size="small" v-auth="'del'" text type="info" @click="operate('delete', scope.row)">删除</el-button>
+						<!-- 编辑 -->
+						<el-button size="small" v-auth="'edit'" text type="primary" @click="operate('editParams', scope.row)">{{ $t('message.certificate.actions.edit') }}</el-button>
+						<!-- 删除 -->
+						<el-button size="small" v-auth="'del'" text type="info" @click="operate('delete', scope.row)">{{ $t('message.certificate.actions.delete') }}</el-button>
 					</template>
 				</el-table-column>
 			</el-table>
@@ -62,6 +74,9 @@ import { reactive, onMounted, ref, getCurrentInstance } from 'vue';
 import { ElMessageBox, ElMessage, FormInstance } from 'element-plus';
 import api from '/@/api/certificateManagement';
 import EditParams from './component/editParams.vue';
+import { useI18n } from 'vue-i18n';
+
+const { t } = useI18n();
 
 const { proxy } = getCurrentInstance() as any;
 const { network_certificate } = proxy.useDict('network_certificate');
@@ -105,17 +120,22 @@ const filterStandard = (type: any) => {
 }
 // 状态修改
 const handleStatusChange = (row: any) => {
-	let text = row.status === 1 ? '启用' : '停用';
-	ElMessageBox.confirm('确认要"' + text + '":"' + row.name + '"证书吗?', '警告', {
-		confirmButtonText: '确定',
-		cancelButtonText: '取消',
+	// 启用/停用
+	let text = row.status === 1 ? t('message.certificate.status.enable') : t('message.certificate.status.disable');
+	// 确认要"' + text + '":"' + row.name + '"证书吗?
+	ElMessageBox.confirm(
+		t('message.certificate.messages.confirmText', { text: text, name: row.name }),
+		t('message.certificate.messages.tip'), {
+		confirmButtonText: t('message.certificate.messages.confirm'),
+		cancelButtonText: t('message.certificate.messages.cancel'),
 		type: 'warning',
 	})
 		.then(function () {
 			return api.certificateManagement.editStatus({ id: row.id, status: row.status });
 		})
 		.then(() => {
-			ElMessage.success(text + '成功');
+			// 成功
+			ElMessage.success(text + t('message.certificate.messages.success'));
 		})
 		.catch(function () {
 			row.status = row.status === 0 ? 1 : 0;
@@ -148,14 +168,18 @@ const operate = (type: string, row: any) => {
 			buildConfigRef.value.openDialog({ ...row })
 			break
 		case 'delete':
-			ElMessageBox.confirm(`是否确认删除编号为"${row.id}"的数据项?`, '提示', {
-				confirmButtonText: '确认',
-				cancelButtonText: '取消',
+			// 是否确认删除编号为"${row.id}"的数据项?
+			ElMessageBox.confirm(
+				t('message.certificate.messages.deleteConfirm', { id: row.id }),
+				t('message.certificate.messages.tip'), {
+				confirmButtonText: t('message.certificate.messages.confirm'),
+				cancelButtonText: t('message.certificate.messages.cancel'),
 				type: 'warning',
 			})
 				.then(() => {
 					api.certificateManagement.del(row.id).then(() => {
-						ElMessage.success('删除成功');
+						// 删除成功
+						ElMessage.success(t('message.certificate.messages.deleteSuccess'));
 						queryList();
 					});
 				})

+ 2 - 0
src/views/iot/configuration/list/index.vue

@@ -105,7 +105,9 @@ const del = (row: any) => {
   ElMessageBox.confirm(
     t('message.configuration.designScreen.deleteDiagramMessage', { name: row.name }),
     t('message.tableI18nConfirm.deleteTitle'), {
+    // 确认
     confirmButtonText: t('message.tableI18nConfirm.confirmText'),
+    // 取消
     cancelButtonText: t('message.tableI18nConfirm.cancelText'),
     type: 'warning',
   }).then(async () => {

+ 2 - 0
src/views/iot/configuration/screen/index.vue

@@ -146,7 +146,9 @@ const onDel = (row: any) => {
   ElMessageBox.confirm(
     t('message.configuration.designScreen.deleteScreenMessage', { name: row.projectName }), 
     t('message.tableI18nConfirm.deleteTitle'), {
+    // 确认
     confirmButtonText: t('message.tableI18nConfirm.confirmText'),
+    // 取消
     cancelButtonText: t('message.tableI18nConfirm.cancelText'),
     type: 'warning',
   }).then(async () => {

+ 2 - 0
src/views/iot/device/category/index.vue

@@ -101,7 +101,9 @@ const onTabelRowDel = (row: TableDataRow) => {
     t('message.device.tableI18nConfirm.deleteCatrgoryMessage', { name: row.name }),
     t('message.tableI18nConfirm.deleteTitle'),
     {
+      // 确认
       confirmButtonText: t('message.tableI18nConfirm.confirmText'),
+      // 取消
       cancelButtonText: t('message.tableI18nConfirm.cancelText'),
       type: 'warning',
     }

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

@@ -107,7 +107,7 @@ const onDel = (row: any) => {
 		// 提示
 		t("message.tableI18nConfirm.deleteTitle"),
 		{
-			// 删除
+			// 确认
 			confirmButtonText: t("message.tableI18nConfirm.confirmText"),
 			// 取消
 			cancelButtonText: t("message.tableI18nConfirm.cancelText"),

+ 2 - 0
src/views/iot/device/product/index.vue

@@ -186,7 +186,9 @@ const onRowDel = (row?: TableDataRow) => {
     return;
   }
   ElMessageBox.confirm(msg, t('message.tableI18nConfirm.deleteTitle'), {
+    // 确认
     confirmButtonText: t('message.tableI18nConfirm.confirmText'),
+    // 取消
     cancelButtonText: t('message.tableI18nConfirm.cancelText'),
     type: "warning",
   })

+ 2 - 0
src/views/iot/network/server/component/list.vue

@@ -161,7 +161,9 @@ export default defineComponent({
       ElMessageBox.confirm(
         t('message.server.deleteServerMessage', { name: row.name }),
         t('message.tableI18nConfirm.deleteTitle'), {
+        // 确认
         confirmButtonText: t('message.tableI18nConfirm.confirmText'),
+        // 取消
         cancelButtonText: t('message.tableI18nConfirm.cancelText'),
         type: 'warning',
       })

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

@@ -251,7 +251,9 @@ const onDel = (row: any) => {
   ElMessageBox.confirm(
     t('message.ruleEngine.deleteRuleMessage', { name: row.name }),
     t('message.tableI18nConfirm.deleteTitle'), {
+    // 确认
     confirmButtonText: t('message.tableI18nConfirm.confirmText'),
+    // 取消
     cancelButtonText: t('message.tableI18nConfirm.cancelText'),
     type: 'warning',
   }).then(async () => {