|  | @@ -1,85 +1,116 @@
 | 
	
		
			
				|  |  |  <template>
 | 
	
		
			
				|  |  |    <div class="system-edit-dic-container">
 | 
	
		
			
				|  |  | -    <el-dialog :title="(ruleForm.id !== 0 ? '修改' : '添加') + '设备'" v-model="isShowDialog" width="769px">
 | 
	
		
			
				|  |  | -      <el-form v-loading="loading" :model="ruleForm" ref="formRef" :rules="rules" label-width="110px">
 | 
	
		
			
				|  |  | -        <el-form-item label="设备标识" prop="key">
 | 
	
		
			
				|  |  | -          <el-input v-model="ruleForm.key" placeholder="请输入设备标识" :disabled="ruleForm.id" />
 | 
	
		
			
				|  |  | +    <!-- 编辑设备/新增设备 -->
 | 
	
		
			
				|  |  | +    <el-dialog :title="ruleForm.id !== 0 ? $t('message.device.dialogI18n.editDevice') : $t('message.device.dialogI18n.addDevice')" v-model="isShowDialog" width="769px">
 | 
	
		
			
				|  |  | +      <el-form v-loading="loading" :model="ruleForm" ref="formRef" :rules="rules" :label-width="currentLocale === 'en' ? '145px' : '110px'">
 | 
	
		
			
				|  |  | +        <!-- 设备标识 -->
 | 
	
		
			
				|  |  | +        <el-form-item :label="$t('message.device.formI18nLabel.deviceKey')" prop="key">
 | 
	
		
			
				|  |  | +          <!-- 请输入设备标识 -->
 | 
	
		
			
				|  |  | +          <el-input v-model="ruleForm.key" :placeholder="$t('message.device.formI18nPlaceholder.deviceKey')" :disabled="ruleForm.id" />
 | 
	
		
			
				|  |  |          </el-form-item>
 | 
	
		
			
				|  |  | -        <el-form-item label="设备名称" prop="name">
 | 
	
		
			
				|  |  | -          <el-input v-model="ruleForm.name" placeholder="请输入设备名称" />
 | 
	
		
			
				|  |  | +        <!-- 设备名称 -->
 | 
	
		
			
				|  |  | +        <el-form-item :label="$t('message.device.formI18nLabel.deviceName')" prop="name">
 | 
	
		
			
				|  |  | +          <!-- 请输入设备名称 -->
 | 
	
		
			
				|  |  | +          <el-input v-model="ruleForm.name" :placeholder="$t('message.device.formI18nPlaceholder.deviceName')" />
 | 
	
		
			
				|  |  |          </el-form-item>
 | 
	
		
			
				|  |  | -        <el-form-item label="所属产品" prop="productKey">
 | 
	
		
			
				|  |  | -          <el-select v-model="ruleForm.productKey" @change="productKeyChange" :disabled="ruleForm.id" placeholder="请选择所属产品" class="w100">
 | 
	
		
			
				|  |  | +        <!-- 所属产品 -->
 | 
	
		
			
				|  |  | +        <el-form-item :label="$t('message.device.formI18nLabel.productBind')" prop="productKey">
 | 
	
		
			
				|  |  | +          <!-- 请选择所属产品 -->
 | 
	
		
			
				|  |  | +          <el-select v-model="ruleForm.productKey" @change="productKeyChange" :disabled="ruleForm.id" :placeholder="$t('message.device.formI18nPlaceholder.productBind1')" class="w100">
 | 
	
		
			
				|  |  |              <el-option v-for="item in productData" :key="item.id" :label="item.name" :value="item.key" />
 | 
	
		
			
				|  |  |            </el-select>
 | 
	
		
			
				|  |  |          </el-form-item>
 | 
	
		
			
				|  |  | -        <el-form-item label="设备坐标" prop="lng">
 | 
	
		
			
				|  |  | -          <el-input :value="ruleForm.lng ? (ruleForm.lng + ' , ' + ruleForm.lat) : ''" placeholder="选择设备坐标" @click="selectMap(ruleForm)" read-only />
 | 
	
		
			
				|  |  | +        <!-- 设备坐标 -->
 | 
	
		
			
				|  |  | +        <el-form-item :label="$t('message.device.formI18nLabel.deviceLng')" prop="lng">
 | 
	
		
			
				|  |  | +          <!-- 选择设备坐标 -->
 | 
	
		
			
				|  |  | +          <el-input :value="ruleForm.lng ? (ruleForm.lng + ' , ' + ruleForm.lat) : ''" :placeholder="$t('message.device.formI18nPlaceholder.deviceLng')" @click="selectMap(ruleForm)" read-only />
 | 
	
		
			
				|  |  |          </el-form-item>
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -        <el-form-item label="标签设置" prop="lng">
 | 
	
		
			
				|  |  | +        <!-- 标签设置 -->
 | 
	
		
			
				|  |  | +        <el-form-item :label="$t('message.device.formI18nLabel.tagSetting')" prop="lng">
 | 
	
		
			
				|  |  |            <div class="tags-wrapper">
 | 
	
		
			
				|  |  | -            <el-button type="primary" size="small" @click="toAddTag">添加标签</el-button>
 | 
	
		
			
				|  |  | +            <!-- 添加标签 -->
 | 
	
		
			
				|  |  | +            <el-button type="primary" size="small" @click="toAddTag">{{ $t('message.device.formI18nButton.addTag') }}</el-button>
 | 
	
		
			
				|  |  |              <div class="tags">
 | 
	
		
			
				|  |  |                <div class="tag flex" v-for="tag, i in ruleForm.tags" :key="tag.key">
 | 
	
		
			
				|  |  |                    <div class="capsule mr-3">
 | 
	
		
			
				|  |  |                    <div class="label">{{ tag.name }}</div>
 | 
	
		
			
				|  |  |                    <div class="value">{{ tag.value }}</div>
 | 
	
		
			
				|  |  |                  </div>
 | 
	
		
			
				|  |  | -                <el-button type="warning" size="small" @click="toUpdateTag(tag)">修改</el-button>
 | 
	
		
			
				|  |  | -                <el-button type="danger" size="small" @click="delTagRow(i)">删除</el-button>
 | 
	
		
			
				|  |  | +                <!-- 编辑 -->
 | 
	
		
			
				|  |  | +                <el-button type="warning" size="small" @click="toUpdateTag(tag)">{{ $t('message.formI18nButton.edit') }}</el-button>
 | 
	
		
			
				|  |  | +                <!-- 删除 -->
 | 
	
		
			
				|  |  | +                <el-button type="danger" size="small" @click="delTagRow(i)">{{ $t('message.formI18nButton.delete') }}</el-button>
 | 
	
		
			
				|  |  |                </div>
 | 
	
		
			
				|  |  |              </div>
 | 
	
		
			
				|  |  |            </div>
 | 
	
		
			
				|  |  |          </el-form-item>
 | 
	
		
			
				|  |  |          <template v-if="ruleForm.authType === 1 || ruleForm.authType === 2">
 | 
	
		
			
				|  |  | -          <el-form-item label="认证方式" prop="">
 | 
	
		
			
				|  |  | +          <!-- 认证方式 -->
 | 
	
		
			
				|  |  | +          <el-form-item :label="$t('message.device.formI18nLabel.authType')" prop="">
 | 
	
		
			
				|  |  |              <el-radio-group v-model="ruleForm.authType">
 | 
	
		
			
				|  |  |                <el-radio :label="1">Basic</el-radio>
 | 
	
		
			
				|  |  |                <el-radio :label="2">AccessToken</el-radio>
 | 
	
		
			
				|  |  |              </el-radio-group>
 | 
	
		
			
				|  |  |            </el-form-item>
 | 
	
		
			
				|  |  |            <template v-if="ruleForm.authType === 1">
 | 
	
		
			
				|  |  | -            <el-form-item label="用户名" prop="authUser">
 | 
	
		
			
				|  |  | -              <el-input v-model="ruleForm.authUser" placeholder="请输入用户名" />
 | 
	
		
			
				|  |  | +            <!-- 用户名 -->
 | 
	
		
			
				|  |  | +            <el-form-item :label="$t('message.device.formI18nLabel.authUser')" prop="authUser">
 | 
	
		
			
				|  |  | +              <!-- 请输入用户名 -->
 | 
	
		
			
				|  |  | +              <el-input v-model="ruleForm.authUser" :placeholder="$t('message.device.formI18nPlaceholder.authUser')" />
 | 
	
		
			
				|  |  |              </el-form-item>
 | 
	
		
			
				|  |  | -            <el-form-item label="密码" prop="authPasswd">
 | 
	
		
			
				|  |  | -              <el-input type="password" v-model="ruleForm.authPasswd" placeholder="请输入密码" />
 | 
	
		
			
				|  |  | +            <!-- 密码 -->
 | 
	
		
			
				|  |  | +            <el-form-item :label="$t('message.device.formI18nLabel.authPasswd')" prop="authPasswd">
 | 
	
		
			
				|  |  | +              <!-- 请输入密码 -->
 | 
	
		
			
				|  |  | +              <el-input type="password" v-model="ruleForm.authPasswd" :placeholder="$t('message.device.formI18nPlaceholder.authPasswd')" />
 | 
	
		
			
				|  |  |              </el-form-item>
 | 
	
		
			
				|  |  |            </template>
 | 
	
		
			
				|  |  |            <template v-else>
 | 
	
		
			
				|  |  |              <el-form-item label="Aceess Token" prop="accessToken">
 | 
	
		
			
				|  |  | -              <el-input v-model="ruleForm.accessToken" placeholder="请输入Aceess Token" />
 | 
	
		
			
				|  |  | +              <!-- 请输入Aceess Token -->
 | 
	
		
			
				|  |  | +              <el-input v-model="ruleForm.accessToken" :placeholder="$t('message.device.formI18nPlaceholder.accessToken')" />
 | 
	
		
			
				|  |  |              </el-form-item>
 | 
	
		
			
				|  |  |            </template>
 | 
	
		
			
				|  |  |          </template>
 | 
	
		
			
				|  |  |          <template v-else-if="ruleForm.authType === 3">
 | 
	
		
			
				|  |  | -          <el-form-item label="认证证书" prop="certificateId">
 | 
	
		
			
				|  |  | -            <el-select v-model="ruleForm.certificateId" placeholder="请选择证书">
 | 
	
		
			
				|  |  | +          <!-- 认证证书 -->
 | 
	
		
			
				|  |  | +          <el-form-item :label="$t('message.device.formI18nLabel.certificateId')" prop="certificateId">
 | 
	
		
			
				|  |  | +            <!-- 请选择认证证书 -->
 | 
	
		
			
				|  |  | +            <el-select v-model="ruleForm.certificateId" :placeholder="$t('message.device.formI18nPlaceholder.certificateId')">
 | 
	
		
			
				|  |  |                <el-option v-for="cert in certList" :key="cert.id" :label="cert.name" :value="cert.id"> </el-option>
 | 
	
		
			
				|  |  |              </el-select>
 | 
	
		
			
				|  |  |            </el-form-item>
 | 
	
		
			
				|  |  |          </template>
 | 
	
		
			
				|  |  | -        <el-form-item label="固件版本号" prop="version">
 | 
	
		
			
				|  |  | -          <el-input v-model="ruleForm.version" placeholder="请输入固件版本号" />
 | 
	
		
			
				|  |  | +        <!-- 固件版本号 -->
 | 
	
		
			
				|  |  | +        <el-form-item  :label="$t('message.device.formI18nLabel.firmwareVersion')" prop="version">
 | 
	
		
			
				|  |  | +          <!-- 请输入固件版本号 -->
 | 
	
		
			
				|  |  | +          <el-input v-model="ruleForm.version" :placeholder="$t('message.device.formI18nPlaceholder.firmwareVersion')" />
 | 
	
		
			
				|  |  |          </el-form-item>
 | 
	
		
			
				|  |  | -        <el-form-item label="备注" prop="desc">
 | 
	
		
			
				|  |  | -          <el-input v-model="ruleForm.desc" type="textarea" placeholder="请输入内容"></el-input>
 | 
	
		
			
				|  |  | +        <!-- 备注 -->
 | 
	
		
			
				|  |  | +        <el-form-item :label="$t('message.device.formI18nLabel.remark')" prop="desc">
 | 
	
		
			
				|  |  | +          <!-- 请输入备注 -->
 | 
	
		
			
				|  |  | +          <el-input v-model="ruleForm.desc" type="textarea" :placeholder="$t('message.device.formI18nPlaceholder.enterContent')"></el-input>
 | 
	
		
			
				|  |  |          </el-form-item>
 | 
	
		
			
				|  |  | -        <el-form-item label="设备说明">
 | 
	
		
			
				|  |  | -          <el-input v-model="intro" type="textarea" placeholder="请输入设备说明"></el-input>
 | 
	
		
			
				|  |  | +        <!-- 设备说明 -->
 | 
	
		
			
				|  |  | +        <el-form-item :label="$t('message.device.formI18nLabel.deviceDescription')">
 | 
	
		
			
				|  |  | +          <!-- 请输入设备说明 -->
 | 
	
		
			
				|  |  | +          <el-input v-model="intro" type="textarea" :placeholder="$t('message.device.formI18nPlaceholder.deviceDescription')"></el-input>
 | 
	
		
			
				|  |  |          </el-form-item>
 | 
	
		
			
				|  |  | -        <el-form-item label="设备图片">
 | 
	
		
			
				|  |  | +        <!-- 设备图片 -->
 | 
	
		
			
				|  |  | +        <el-form-item :label="$t('message.device.formI18nLabel.deviceImage')">
 | 
	
		
			
				|  |  |            <upload-vue :imgs="phone" key="phone" @set-imgs="setImgsPhone" :limit="deviceImgLimit"></upload-vue>
 | 
	
		
			
				|  |  |          </el-form-item>
 | 
	
		
			
				|  |  | -        <el-form-item label="证书图片">
 | 
	
		
			
				|  |  | +        <!-- 证书图片 -->
 | 
	
		
			
				|  |  | +        <el-form-item :label="$t('message.device.formI18nLabel.certificateImage')">
 | 
	
		
			
				|  |  |            <upload-vue :imgs="certificate" key="certificate" @set-imgs="setImgsCertificate" :limit="certificateLimit"></upload-vue>
 | 
	
		
			
				|  |  |          </el-form-item>
 | 
	
		
			
				|  |  |        </el-form>
 | 
	
		
			
				|  |  |        <template #footer>
 | 
	
		
			
				|  |  |          <span class="dialog-footer">
 | 
	
		
			
				|  |  | -          <el-button @click="onCancel">取 消</el-button>
 | 
	
		
			
				|  |  | -          <el-button type="primary" @click="onSubmit">{{ ruleForm.id !== 0 ? '修 改' : '添 加' }}</el-button>
 | 
	
		
			
				|  |  | +          <!-- 取消 -->
 | 
	
		
			
				|  |  | +          <el-button @click="onCancel">{{ $t('message.tableI18nAction.cancel') }}</el-button>
 | 
	
		
			
				|  |  | +          <!-- 编辑/新增 -->
 | 
	
		
			
				|  |  | +          <el-button type="primary" @click="onSubmit">{{ ruleForm.id !== 0 ? $t('message.tableI18nAction.edit') : $t('message.tableI18nAction.add') }}</el-button>
 | 
	
		
			
				|  |  |          </span>
 | 
	
		
			
				|  |  |        </template>
 | 
	
		
			
				|  |  |      </el-dialog>
 | 
	
	
		
			
				|  | @@ -89,7 +120,7 @@
 | 
	
		
			
				|  |  |  </template>
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  <script lang="ts">
 | 
	
		
			
				|  |  | -import { reactive, toRefs, defineComponent, ref, unref } from 'vue';
 | 
	
		
			
				|  |  | +import { reactive, toRefs, defineComponent, ref, unref, computed } from 'vue';
 | 
	
		
			
				|  |  |  import api from '/@/api/device';
 | 
	
		
			
				|  |  |  import apiSystem from '/@/api/system';
 | 
	
		
			
				|  |  |  import { ElMessage, UploadProps } from "element-plus";
 | 
	
	
		
			
				|  | @@ -97,6 +128,8 @@ import tagVue from './tag.vue';
 | 
	
		
			
				|  |  |  import Map from './map.vue';
 | 
	
		
			
				|  |  |  import UploadVue from '/@/components/upload/index.vue';
 | 
	
		
			
				|  |  |  import certApi from '/@/api/certificateManagement';
 | 
	
		
			
				|  |  | +import { useI18n } from "vue-i18n";
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  interface RuleFormState {
 | 
	
		
			
				|  |  |    id: number;
 | 
	
	
		
			
				|  | @@ -141,7 +174,7 @@ interface DicState {
 | 
	
		
			
				|  |  |    product: any;
 | 
	
		
			
				|  |  |    isShowDialog: boolean;
 | 
	
		
			
				|  |  |    ruleForm: RuleFormState;
 | 
	
		
			
				|  |  | -  rules: {};
 | 
	
		
			
				|  |  | +  // rules: {};
 | 
	
		
			
				|  |  |    deviceImgLimit: number;
 | 
	
		
			
				|  |  |    certificateLimit: number;
 | 
	
		
			
				|  |  |    phone: string[];
 | 
	
	
		
			
				|  | @@ -167,6 +200,20 @@ export default defineComponent({
 | 
	
		
			
				|  |  |      const loading = ref(false);
 | 
	
		
			
				|  |  |      const mapRef = ref();
 | 
	
		
			
				|  |  |      const certList = ref<any[]>([])
 | 
	
		
			
				|  |  | +    const { t, locale } = useI18n();
 | 
	
		
			
				|  |  | +    const currentLocale = computed(() => locale.value);
 | 
	
		
			
				|  |  | +    const rules = computed(() => ({
 | 
	
		
			
				|  |  | +      // 设备名称不能为空
 | 
	
		
			
				|  |  | +      name: [
 | 
	
		
			
				|  |  | +        { required: true, message: t('message.device.rules.deviceName'), trigger: "change" }
 | 
	
		
			
				|  |  | +      ],
 | 
	
		
			
				|  |  | +      // 设备标识最少五个字符
 | 
	
		
			
				|  |  | +      key: [
 | 
	
		
			
				|  |  | +        { required: true, message: t('message.device.rules.deviceKeyMin5'), trigger: "change", min: 5 }
 | 
	
		
			
				|  |  | +      ],
 | 
	
		
			
				|  |  | +      // 所属产品不能为空
 | 
	
		
			
				|  |  | +      productKey: [{ required: true, message: t('message.device.rules.productIsNotEmpty'), trigger: 'change' }],
 | 
	
		
			
				|  |  | +    }))
 | 
	
		
			
				|  |  |      const state = reactive<DicState>({
 | 
	
		
			
				|  |  |        isShowDialog: false,
 | 
	
		
			
				|  |  |        product: {},
 | 
	
	
		
			
				|  | @@ -174,15 +221,6 @@ export default defineComponent({
 | 
	
		
			
				|  |  |        ruleForm: {
 | 
	
		
			
				|  |  |          ...form
 | 
	
		
			
				|  |  |        },
 | 
	
		
			
				|  |  | -      rules: {
 | 
	
		
			
				|  |  | -        name: [
 | 
	
		
			
				|  |  | -          { required: true, message: "设备名称不能为空", trigger: "change" }
 | 
	
		
			
				|  |  | -        ],
 | 
	
		
			
				|  |  | -        key: [
 | 
	
		
			
				|  |  | -          { required: true, message: "设备标识最少五个字符", trigger: "change", min: 5 }
 | 
	
		
			
				|  |  | -        ],
 | 
	
		
			
				|  |  | -        productKey: [{ required: true, message: '所属产品不能为空', trigger: 'change' }],
 | 
	
		
			
				|  |  | -      },
 | 
	
		
			
				|  |  |        deviceImgLimit: 0,
 | 
	
		
			
				|  |  |        certificateLimit: 0,
 | 
	
		
			
				|  |  |        phone: [],
 | 
	
	
		
			
				|  | @@ -262,7 +300,7 @@ export default defineComponent({
 | 
	
		
			
				|  |  |        formWrap.validate((valid: boolean) => {
 | 
	
		
			
				|  |  |          if (valid) {
 | 
	
		
			
				|  |  |            if (state.ruleForm.id !== 0) {
 | 
	
		
			
				|  |  | -            //修改
 | 
	
		
			
				|  |  | +            //修辑
 | 
	
		
			
				|  |  |              const params = {
 | 
	
		
			
				|  |  |                ...state.ruleForm,
 | 
	
		
			
				|  |  |                extensionInfo: JSON.stringify({
 | 
	
	
		
			
				|  | @@ -272,22 +310,22 @@ export default defineComponent({
 | 
	
		
			
				|  |  |                })
 | 
	
		
			
				|  |  |              }
 | 
	
		
			
				|  |  |              api.instance.edit(params).then(() => {
 | 
	
		
			
				|  |  | -              ElMessage.success('设备类型修改成功');
 | 
	
		
			
				|  |  | +              ElMessage.success(t('message.tableI18nConfirm.editSuccess'));
 | 
	
		
			
				|  |  |                closeDialog(); // 关闭弹窗
 | 
	
		
			
				|  |  |                emit('typeList')
 | 
	
		
			
				|  |  |              })
 | 
	
		
			
				|  |  |            } else {
 | 
	
		
			
				|  |  | -            //添加
 | 
	
		
			
				|  |  | +            //新增
 | 
	
		
			
				|  |  |              const params = {
 | 
	
		
			
				|  |  |                ...state.ruleForm,
 | 
	
		
			
				|  |  |                extensionInfo: JSON.stringify({
 | 
	
		
			
				|  |  |                  "phone": state.phone,
 | 
	
		
			
				|  |  |                  "certificate": state.certificate,
 | 
	
		
			
				|  |  | -                "intro": state.intro
 | 
	
		
			
				|  |  | +                "intro": state.intro  
 | 
	
		
			
				|  |  |                })
 | 
	
		
			
				|  |  |              }
 | 
	
		
			
				|  |  |              api.instance.add(params).then(() => {
 | 
	
		
			
				|  |  | -              ElMessage.success('设备类型添加成功');
 | 
	
		
			
				|  |  | +              ElMessage.success(t('message.tableI18nConfirm.addSuccess'));
 | 
	
		
			
				|  |  |                closeDialog(); // 关闭弹窗
 | 
	
		
			
				|  |  |                emit('typeList')
 | 
	
		
			
				|  |  |              })
 | 
	
	
		
			
				|  | @@ -328,6 +366,8 @@ export default defineComponent({
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      return {
 | 
	
		
			
				|  |  | +      currentLocale,
 | 
	
		
			
				|  |  | +      rules,
 | 
	
		
			
				|  |  |        loading,
 | 
	
		
			
				|  |  |        certList,
 | 
	
		
			
				|  |  |        productKeyChange,
 |