Ver Fonte

Merge branch 'master' into professional2

yanglzh há 1 ano atrás
pai
commit
4cd9d7d77c
35 ficheiros alterados com 910 adições e 793 exclusões
  1. 1 1
      src/views/iot/alarm/setting/component/edit.vue
  2. 20 22
      src/views/iot/alarm/setting/index.vue
  3. 1 1
      src/views/iot/device-tree/tree/index.vue
  4. 59 57
      src/views/iot/device/channel/component/detail.vue
  5. 113 12
      src/views/iot/device/instance/detail.vue
  6. 1 1
      src/views/iot/device/product/component/editAttr.vue
  7. 1 1
      src/views/iot/device/product/component/editEvent.vue
  8. 1 1
      src/views/iot/device/product/component/editFun.vue
  9. 1 1
      src/views/iot/device/product/component/editPro.vue
  10. 1 1
      src/views/iot/device/product/component/editTab.vue
  11. 2 2
      src/views/iot/device/template/component/dataAreaDialog.vue
  12. 2 2
      src/views/iot/device/template/component/deviceTemplateDialog.vue
  13. 1 1
      src/views/iot/device/template/component/edit.vue
  14. 350 360
      src/views/iot/network/server/create.vue
  15. 1 1
      src/views/iot/network/server/detail.vue
  16. 239 242
      src/views/iot/network/tunnel/create.vue
  17. 1 1
      src/views/iot/noticeservices/config/component/edit.vue
  18. 1 1
      src/views/iot/noticeservices/config/component/setEdit.vue
  19. 1 1
      src/views/iot/noticeservices/config/component/temEdit.vue
  20. 1 2
      src/views/iot/noticeservices/config/index.vue
  21. 1 1
      src/views/iot/noticeservices/config/setting.vue
  22. 92 63
      src/views/iot/property/dossier/component/from.vue
  23. 3 3
      src/views/iot/property/dossier/edit.vue
  24. 1 1
      src/views/iot/property/dossier/index.vue
  25. 1 1
      src/views/system/application/edit.vue
  26. 1 1
      src/views/system/assess/component/editAttr.vue
  27. 1 1
      src/views/system/assess/component/editEvent.vue
  28. 1 1
      src/views/system/assess/component/editFun.vue
  29. 1 1
      src/views/system/assess/component/editPro.vue
  30. 1 1
      src/views/system/assess/component/editTab.vue
  31. 1 1
      src/views/system/datahub/modeling/detail.vue
  32. 1 1
      src/views/system/datahub/source/component/editNode.vue
  33. 1 1
      src/views/system/datahub/source/detail.vue
  34. 1 1
      src/views/system/manage/blacklist/component/editPro.vue
  35. 5 4
      src/views/system/manage/user/index.vue

+ 1 - 1
src/views/iot/alarm/setting/component/edit.vue

@@ -639,7 +639,7 @@ export default defineComponent({
 	},
 });
 </script>
-<style>
+<style scoped>
 .inline {
 	display: inline-flex;
 }

+ 20 - 22
src/views/iot/alarm/setting/index.vue

@@ -1,23 +1,21 @@
 <template>
 	<div class="page page-full">
-		<div class="">
-			<el-form :model="tableData.param" ref="queryRef" inline>
-				<el-form-item class="mb-0">
-					<el-button type="primary" class="ml10" @click="onOpenAdd" v-auth="'add'">
-						<el-icon>
-							<ele-FolderAdd />
-						</el-icon>
-						新增告警
-					</el-button>
-					<el-button type="primary" class="ml10" @click="onOpenLevel" v-auth="'level'">
-						<el-icon>
-							<ele-Setting />
-						</el-icon>
-						级别设置
-					</el-button>
-				</el-form-item>
-			</el-form>
-		</div>
+		<el-form :model="tableData.param" ref="queryRef" inline>
+			<el-form-item class="mb-0">
+				<el-button type="primary" class="ml10" @click="onOpenAdd" v-auth="'add'">
+					<el-icon>
+						<ele-FolderAdd />
+					</el-icon>
+					新增告警
+				</el-button>
+				<el-button type="primary" class="ml10" @click="onOpenLevel" v-auth="'level'">
+					<el-icon>
+						<ele-Setting />
+					</el-icon>
+					级别设置
+				</el-button>
+			</el-form-item>
+		</el-form>
 		<el-divider />
 		<el-row class="page-full-part">
 			<el-col :span="6" v-for="(item, index) in tableData.data" :key="index">
@@ -109,7 +107,6 @@ import { toRefs, reactive, onMounted, ref, defineComponent } from 'vue';
 import { ElMessageBox, ElMessage, FormInstance } from 'element-plus';
 import EditDic from './component/edit.vue';
 import LevelDic from './component/level.vue';
-
 import alarm from '/@/api/alarm';
 
 // 定义接口来定义对象的类型
@@ -255,7 +252,7 @@ export default defineComponent({
 	},
 });
 </script>
-<style>
+<style scoped lang="scss">
 .el-button.is-text:not(.is-disabled).is-has-bg {
 	background-color: var(--next-border-color-light);
 }
@@ -288,7 +285,8 @@ export default defineComponent({
 .pro-table-card-item {
 	display: flex;
 	justify-content: stretch;
-	.card-item-avatar{
+
+	.card-item-avatar {
 		display: flex;
 		align-items: center;
 	}
@@ -402,7 +400,7 @@ export default defineComponent({
 	border-radius: 0;
 }
 
-*/ .ant-btn-link {
+.ant-btn-link {
 	color: #1d39c4;
 	border-color: transparent;
 	background: transparent;

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

@@ -1,6 +1,6 @@
 <template>
   <div class="page page-full">
-    <el-row :gutter="16" class="h-full">
+    <el-row :gutter="15" class="h-full">
       <el-col :span="6" class="h-full">
         <el-card shadow="nover" class="h-full">
           <el-scrollbar v-loading="treeLoading">

+ 59 - 57
src/views/iot/device/channel/component/detail.vue

@@ -1,64 +1,66 @@
 <template>
 	<el-dialog title="设备通道详情" v-model="dialogVisible" width="900px" :before-close="clsoeDialog" :close-on-click-modal="false">
-		<el-tabs v-model="activeName">
-			<el-tab-pane label="通道信息" name="1">
-				<el-form ref="dataForm" :rules="rules" :model="temp" label-position="left" label-width="120px" style="width: 90%; margin: 0 auto">
-					<el-form-item label="通道名称" prop="title">
-						<el-input v-model="temp.title" disabled placeholder="请输入通道名称" />
-					</el-form-item>
-					<el-form-item label="注册码" prop="number">
-						<el-input v-model="temp.number" disabled placeholder="请输入注册码" />
-					</el-form-item>
-					<el-form-item label="设备地址" prop="slaveId">
-						<el-input v-model.number="temp.slaveId" disabled placeholder="请输入设备地址" />
-					</el-form-item>
-					<!-- <el-form-item label="调度周期(秒)" prop="interval">
+		<div class="page-full" style="height: 60vh;">
+			<el-tabs v-model="activeName">
+				<el-tab-pane label="通道信息" name="1">
+					<el-form ref="dataForm" :rules="rules" :model="temp" label-position="left" label-width="120px" style="width: 90%; margin: 0 auto">
+						<el-form-item label="通道名称" prop="title">
+							<el-input v-model="temp.title" disabled placeholder="请输入通道名称" />
+						</el-form-item>
+						<el-form-item label="注册码" prop="number">
+							<el-input v-model="temp.number" disabled placeholder="请输入注册码" />
+						</el-form-item>
+						<el-form-item label="设备地址" prop="slaveId">
+							<el-input v-model.number="temp.slaveId" disabled placeholder="请输入设备地址" />
+						</el-form-item>
+						<!-- <el-form-item label="调度周期(秒)" prop="interval">
             <el-input v-model="temp.interval" placeholder="请输入调度周期" />
           </el-form-item> -->
-					<el-form-item label="" prop="">
-						<div align="right">
-							<el-button @click="clsoeDialog"> 取 消 </el-button>
-							<!-- <el-button type="primary" @click="updateData()"> 保 存 </el-button> -->
-						</div>
-					</el-form-item>
-				</el-form>
-			</el-tab-pane>
-			<el-tab-pane label="任务" name="2">
-				<div class="filter-container">
-					<el-button class="filter-item" type="primary" icon="el-icon-circle-plus-outline" @click="handleCreate"> 添加任务 </el-button>
-				</div>
+						<el-form-item label="" prop="">
+							<div align="right">
+								<el-button @click="clsoeDialog"> 取 消 </el-button>
+								<!-- <el-button type="primary" @click="updateData()"> 保 存 </el-button> -->
+							</div>
+						</el-form-item>
+					</el-form>
+				</el-tab-pane>
+				<el-tab-pane label="任务" name="2">
+					<div class="filter-container">
+						<el-button class="filter-item" type="primary" icon="el-icon-circle-plus-outline" @click="handleCreate"> 添加任务 </el-button>
+					</div>
 
-				<el-table :key="tableKey" v-loading="listLoading" :data="taskList" border fit highlight-current-row style="width: 100%">
-					<el-table-column label="标题" prop="Job.title" align="center"></el-table-column>
-					<el-table-column label="调度周期" prop="Job.interval" align="center"></el-table-column>
-					<el-table-column label="转发格式" prop="encoding" align="center">
-						<template #default="{ row }">
-							{{ getCodingLabel(row) }}
-						</template>
-					</el-table-column>
-					<el-table-column label="mqtt主题" prop="Job.publishTopic" align="center"></el-table-column>
-					<el-table-column label="模板" prop="Template.title" align="center"></el-table-column>
-					<el-table-column label="操作" align="center" width="200">
-						<template #default="{ row, $index }">
-							<el-button type="primary" size="mini" @click="handleUpdate(row)"> 详情 </el-button>
-							<el-button v-if="row.status != 'deleted'" size="mini" type="danger" @click="handleDelete(row, $index)"> 删除 </el-button>
-						</template>
-					</el-table-column>
-				</el-table>
+					<el-table :key="tableKey" v-loading="listLoading" :data="taskList" border fit highlight-current-row style="width: 100%">
+						<el-table-column label="标题" prop="Job.title" align="center"></el-table-column>
+						<el-table-column label="调度周期" prop="Job.interval" align="center"></el-table-column>
+						<el-table-column label="转发格式" prop="encoding" align="center">
+							<template #default="{ row }">
+								{{ getCodingLabel(row) }}
+							</template>
+						</el-table-column>
+						<el-table-column label="mqtt主题" prop="Job.publishTopic" align="center"></el-table-column>
+						<el-table-column label="模板" prop="Template.title" align="center"></el-table-column>
+						<el-table-column label="操作" align="center" width="200">
+							<template #default="{ row, $index }">
+								<el-button type="primary" size="small" @click="handleUpdate(row)"> 详情 </el-button>
+								<el-button v-if="row.status != 'deleted'" size="small" type="danger" @click="handleDelete(row, $index)"> 删除 </el-button>
+							</template>
+						</el-table-column>
+					</el-table>
 
-				<pagination v-if="total > 0" :total="total" v-model:page="listQuery.page" v-model:limit="listQuery.size" @pagination="getList()" />
-				<TaskDialog ref="taskDialog" :formatOptions="formatOptions" @finish="getList(1)" />
-			</el-tab-pane>
-			<el-tab-pane label="通道码流" name="3">
-				<div>
-					<el-button :type="evsrc ? 'info' : 'primary'" @click="openEv()">开始</el-button>
-					<el-button :type="evsrc ? 'primary' : 'info'" :disabled="!evsrc" @click="closeEv()">停止</el-button>
-					<el-button type="defualt" @click="clearLog()">清空</el-button>
-					<el-button type="info" style="margin-left: 150px" @click="downloadLog()">下载报文</el-button>
-					<ul id="logContainer" ref="logContainer"></ul>
-				</div>
-			</el-tab-pane>
-		</el-tabs>
+					<pagination v-if="total > 0" :total="total" v-model:page="listQuery.page" v-model:limit="listQuery.size" @pagination="getList()" />
+					<TaskDialog ref="taskDialog" :formatOptions="formatOptions" @finish="getList(1)" />
+				</el-tab-pane>
+				<el-tab-pane label="通道码流" name="3">
+					<div>
+						<el-button :type="evsrc ? 'info' : 'primary'" @click="openEv()">开始</el-button>
+						<el-button :type="evsrc ? 'primary' : 'info'" :disabled="!evsrc" @click="closeEv()">停止</el-button>
+						<el-button type="defualt" @click="clearLog()">清空</el-button>
+						<el-button type="info" style="margin-left: 150px" @click="downloadLog()">下载报文</el-button>
+						<ul id="logContainer" ref="logContainer"></ul>
+					</div>
+				</el-tab-pane>
+			</el-tabs>
+		</div>
 	</el-dialog>
 </template>
 
@@ -213,8 +215,8 @@ export default {
 				}
 			};
 			// this.evsrc.onerror = function (_ev: any) {
-				// @ts-ignore
-				// console.log('readyState = ' + ev.currentTarget.readyState);
+			// @ts-ignore
+			// console.log('readyState = ' + ev.currentTarget.readyState);
 			// };
 		},
 		openEv() {

+ 113 - 12
src/views/iot/device/instance/detail.vue

@@ -312,17 +312,65 @@
           </div>
 
         </el-tab-pane>
-        <el-tab-pane label="设备扩展属性信息" name="7">
+        <el-tab-pane label="设备档案" name="7">
           <el-form label-width="110px">
-            <el-form-item label="设备图片">
-              <el-image class="mr20" style="border: 1px solid #e5e5e5;border-radius: 8px;width: 100px;height: 100px;object-fit: contain;" :src="item" v-for="(item, index) in phone" :key="index" />
-            </el-form-item>
-            <el-form-item label="证书图片">
-              <el-image class="mr20" style="border: 1px solid #e5e5e5;border-radius: 8px;width: 100px;height: 100px;object-fit: contain;" :src="item" v-for="(item, index) in certificate" :key="index" />
-            </el-form-item>
-            <el-form-item label="设备说明">
-              <el-input disabled v-model="intro" type="textarea" placeholder="请输入设备说明"></el-input>
-            </el-form-item>
+
+            <!--            <FromData :DataList="Datalist" v-if="Datalist && Datalist.length > 0" disable="true"></FromData>-->
+<!--            <div class="pro-box">-->
+<!--              <div class="protitle">设备档案</div>-->
+<!--              <div>-->
+<!--                <el-button type="primary" v-auth="'edit'" @click="onOpenEditAsset">编辑</el-button>-->
+<!--              </div>-->
+<!--            </div>-->
+
+<!--            <div class="ant-descriptions-view">-->
+<!--              <table>-->
+<!--                <tbody>-->
+<!--                <tr class="ant-descriptions-row" v-for="(item, index) in dataList" :key="index">-->
+<!--                  <th class="ant-descriptions-item-label ant-descriptions-item-colon">{{ item.title }}</th>-->
+<!--                  <td class="ant-descriptions-item-content" colspan="1">-->
+<!--                    <view v-if="item.types === 'file'">-->
+<!--                      <img :src="deviceAssetMetadata[item.name]" class="avatar" />-->
+<!--                    </view>-->
+<!--                    <view v-else>-->
+<!--                      <view v-if="item.pattern">-->
+<!--                        <el-link :href="deviceAssetMetadata[item.name]" type="primary" target="_blank">{{ deviceAssetMetadata[item.name] }}</el-link>-->
+<!--                      </view>-->
+<!--                      <view v-else>-->
+<!--                        {{ deviceAssetMetadata[item.name] }}-->
+<!--                      </view>-->
+<!--                    </view>-->
+<!--                  </td>-->
+<!--                </tr>-->
+<!--                </tbody>-->
+<!--              </table>-->
+<!--            </div>-->
+
+            <div class="pro-box">
+              <div class="protitle">设备档案</div>
+              <div>
+                <el-button size="small" type="primary" v-auth="'edit'" @click="onOpenEditAsset">编辑</el-button>
+              </div>
+            </div>
+
+            <el-descriptions class="margin-top" :column="3" border>
+              <view v-for="(item, index) in dataList" :key="index">
+                <el-descriptions-item :label="item.title">
+                  <view v-if="item.types === 'file'">
+                    <img :src="deviceAssetMetadata[item.name]" class="avatar" />
+                  </view>
+                  <view v-else>
+                    <view v-if="item.pattern">
+                      <el-link :href="deviceAssetMetadata[item.name]" type="primary" target="_blank">{{ deviceAssetMetadata[item.name] }}</el-link>
+                    </view>
+                    <view v-else>
+                      {{ deviceAssetMetadata[item.name] }}
+                    </view>
+                  </view>
+                </el-descriptions-item>
+              </view>
+            </el-descriptions>
+
           </el-form>
         </el-tab-pane>
 
@@ -340,6 +388,8 @@
     <setAttr :device-key="detail.key" ref="setAttrRef" />
     <!-- 子设备-批量绑定弹窗 -->
     <SubDeviceMutipleBind ref="mutipleBindRef" @bindSuccess="getDeviceTableData" />
+    <!-- 编辑设备档案 -->
+    <EditAssetRef ref="editAssetRef" @getList="getDeviceAssetMetadata"></EditAssetRef>
 
     <el-dialog v-model="dialogVisible" title="日志数据内容" width="30%">
       <JsonViewer :value="jsonData" boxed sort theme="jv-dark" @click="onKeyclick" />
@@ -353,7 +403,7 @@
   </div>
 </template>
 <script lang="ts">
-import { toRefs, reactive, onMounted, ref, defineComponent } from 'vue';
+import { toRefs, reactive, onMounted, ref, defineComponent, nextTick } from 'vue';
 import { ElMessageBox, ElMessage, FormInstance } from 'element-plus';
 import functionCom from './component/function.vue';
 import 'vue3-json-viewer/dist/index.css';
@@ -370,6 +420,8 @@ import setAttr from './component/setAttr.vue';
 import SubDeviceMutipleBind from './component/subDeviceMutipleBind.vue';
 import api from '/@/api/device';
 import datahub from '/@/api/datahub';
+import FromData from "/@/views/iot/property/dossier/component/from.vue";
+import EditAssetRef from "/@/views/iot/property/dossier/edit.vue";
 
 import { useRoute } from 'vue-router';
 
@@ -420,7 +472,7 @@ interface TableDataState {
 }
 export default defineComponent({
   name: 'deviceEditPro',
-  components: { SubDeviceMutipleBind, SubDevice, EditDic, EditAttr, EditFun, EditEvent, EditTab, devantd, ListDic, functionCom, setAttr },
+  components: {EditAssetRef, FromData, SubDeviceMutipleBind, SubDevice, EditDic, EditAttr, EditFun, EditEvent, EditTab, devantd, ListDic, functionCom, setAttr },
 
   setup(prop, context) {
     const logqueryRef = ref();
@@ -436,6 +488,10 @@ export default defineComponent({
     const editTabRef = ref();
     const subDeviceRef = ref();
     const mutipleBindRef = ref();
+    const editAssetRef = ref();
+    const dataList = ref();
+    const deviceAssetData = ref();
+    const deviceAssetMetadata = ref({});
     const state = reactive<TableDataState>({
       certificate: [],
       phone: [],
@@ -520,12 +576,45 @@ export default defineComponent({
           state.tableData.data = res.Data;
           state.tableData.total = res.Total;
         });
+
+        // 加载对应设备档案
+        getDeviceAssetMetadata()
+
         getrunData();
 
         getDeviceTableData()
       });
     }
 
+    const getDeviceAssetMetadata = () => {
+      nextTick(() => {
+        const urlRegex = /^(http-s-?:\/\/)?(a-zA\.)?[a-zA-Z0-9@:%._\+~#?&//=]{2,256}\.[a-z]{2,6}\b([-a-zA-Z0-9@:%._\+~#?&//=]*)$/;
+        //获取设备档案
+        api.dev_asset.detail({ deviceKey: state.detail.key }).then((resde: any) => {
+          // 存储设备档案信息
+          deviceAssetData.value = resde;
+          const newArray = resde.data.map(obj => {
+            const { name, value, ...rest } = obj;
+            const newObj = { name, value, ...rest };
+            newObj[name] = value ? value : '';
+            return newObj;
+          });
+          dataList.value = newArray
+
+          for (const item of dataList.value) {
+            item.pattern = false;
+            if (item.types == 'input' || item.types == 'textarea') {
+              if (urlRegex.test(item.value)) {
+                item.pattern = true;
+              }
+            }
+            // 根据属性返回键获取对应档案对应的内容
+            deviceAssetMetadata.value[item.name] = item.value ? item.value : ''
+          }
+        });
+      });
+    }
+
     const mutipleUnbind = () => {
       let msg = '是否进行批量解绑?';
       if (state.deviceKeyList.length === 0) {
@@ -644,6 +733,11 @@ export default defineComponent({
       editDicRef.value.openDialog(row);
     };
 
+    // 打开修改设备档案弹窗
+    const onOpenEditAsset = () => {
+      editAssetRef.value.open(deviceAssetData.value, state.detail.product)
+    };
+
     // 删除产品
     const onRowDel = (key, type) => {
       let msg = `此操作将永久删除该数据,是否继续?`;
@@ -760,6 +854,8 @@ export default defineComponent({
         getList();
       } else if (tab.props.name == 3) {
         getrunData();
+      } else if (tab.props.name == 7) {
+        getDeviceAssetMetadata();
       }
     };
 
@@ -931,6 +1027,9 @@ export default defineComponent({
       editTabRef,
       subDeviceRef,
       mutipleBindRef,
+      editAssetRef,
+      dataList,
+      deviceAssetMetadata,
       onOpenListDetail,
       getrunData,
       getlog,
@@ -949,6 +1048,7 @@ export default defineComponent({
       getfunction,
       getevent,
       gettab,
+      getDeviceAssetMetadata,
       wuhandleClick,
       onOpenEditTab,
       onOpenEditEvent,
@@ -960,6 +1060,7 @@ export default defineComponent({
       handleClick,
       onOpenMutipleBind,
       mutipleUnbind,
+      onOpenEditAsset,
       ...toRefs(state),
     };
   },

+ 1 - 1
src/views/iot/device/product/component/editAttr.vue

@@ -490,7 +490,7 @@ export default defineComponent({
 	},
 });
 </script>
-<style>
+<style scoped>
 .input-box {
 	display: flex;
 	flex-direction: row;

+ 1 - 1
src/views/iot/device/product/component/editEvent.vue

@@ -257,7 +257,7 @@ export default defineComponent({
 	},
 });
 </script>
-<style>
+<style scoped>
 .input-box {
 	display: flex;
 	flex-direction: row;

+ 1 - 1
src/views/iot/device/product/component/editFun.vue

@@ -322,7 +322,7 @@ export default defineComponent({
 	},
 });
 </script>
-<style>
+<style scoped>
 .input-box {
 	display: flex;
 	flex-direction: row;

+ 1 - 1
src/views/iot/device/product/component/editPro.vue

@@ -307,7 +307,7 @@ export default defineComponent({
 }
 </style>
 
-<style>
+<style scoped>
 .avatar-uploader .el-upload {
 	border: 1px dashed var(--el-border-color);
 	border-radius: 6px;

+ 1 - 1
src/views/iot/device/product/component/editTab.vue

@@ -482,7 +482,7 @@ export default defineComponent({
 	},
 });
 </script>
-<style>
+<style scoped>
 .input-box {
 	display: flex;
 	flex-direction: row;

+ 2 - 2
src/views/iot/device/template/component/dataAreaDialog.vue

@@ -42,8 +42,8 @@
 			</el-table-column>
 			<el-table-column label="操作" align="center" width="180px">
 				<template #default="{ row, $index }">
-					<el-button type="primary" size="mini" @click="handleSubmit(row, $index)"> 保存 </el-button>
-					<el-button type="danger" size="mini" @click="handleDelete(row, $index)"> 删除 </el-button>
+					<el-button type="primary" size="small" @click="handleSubmit(row, $index)"> 保存 </el-button>
+					<el-button type="danger" size="small" @click="handleDelete(row, $index)"> 删除 </el-button>
 				</template>
 			</el-table-column>
 		</el-table>

+ 2 - 2
src/views/iot/device/template/component/deviceTemplateDialog.vue

@@ -12,8 +12,8 @@
 			<el-table-column label="存盘周期" prop="saveCycle" align="center" />
 			<el-table-column label="操作" align="center" width="180">
 				<template #default="{ row, $index }">
-					<el-button type="primary" size="mini" @click="handleUpdate(row)"> 修改 </el-button>
-					<el-button v-if="row.status != 'deleted'" size="mini" type="danger" @click="handleDelete(row, $index)"> 删除 </el-button>
+					<el-button type="primary" size="small" @click="handleUpdate(row)"> 修改 </el-button>
+					<el-button v-if="row.status != 'deleted'" size="small" type="danger" @click="handleDelete(row, $index)"> 删除 </el-button>
 				</template>
 			</el-table-column>
 		</el-table>

+ 1 - 1
src/views/iot/device/template/component/edit.vue

@@ -1,6 +1,6 @@
 <template>
 	<el-dialog :title="textMap[dialogStatus]" v-model="dialogVisible" :width="dialogWidth" :before-close="clsoeDialog" :close-on-click-modal="false">
-		<div class="wrapper">
+		<div class="page-full" style="height: 65vh;">
 			<el-form class="form" ref="dataForm" :rules="rules" :model="temp" label-position="right" label-width="120px" style="width: 400px">
 				<el-form-item label="模板名称" prop="title">
 					<el-input v-model.trim="temp.title" placeholder="请输入模板名称" />

+ 350 - 360
src/views/iot/network/server/create.vue

@@ -1,100 +1,100 @@
 <template>
-    <el-card class="system-dic-container" style="position: relative;">
-        <el-tabs v-model="activeName" class="demo-tabs" @tab-click="handleClick">
-            <el-tab-pane label="新建服务器" name="first">
-                <el-collapse v-model="activeViewName">
-                    <el-collapse-item title="基本信息" name="1">
-                        <div class="collapse-wrap">
-                            <el-form style="width: 600px;margin: 0 auto;" :model="form" label-width="98px">
-                                <el-form-item label="名称">
-                                    <el-input v-model="form.name" show-word-limit maxlength="20" placeholder="请填写名称" />
-                                </el-form-item>
-                                <el-form-item label="类型">
-                                    <el-select @change="handleChangeType" v-model="form.types" placeholder="请选择类型">
-                                        <el-option v-for="dict in network_server_type" :key="dict.value" :label="dict.label" :value="dict.value">
-                                        </el-option>
-                                    </el-select>
-                                </el-form-item>
-                                <el-form-item v-if="form.types == 'tcp'" label="粘拆包规则">
-                                    <el-select @change="initData" v-model="stickValue" placeholder="请选择类型">
-                                        <el-option v-for="dict in stick_type" :key="dict.value" :label="dict.label" :value="dict.value">
-                                        </el-option>
-                                    </el-select>
-                                </el-form-item>
-                                <el-form-item v-if="form.types == 'tcp' && stickValue">
-                                    <el-form-item v-if="stickValue == '分隔符'" class="flex-column" label="分隔符">
-                                        <el-input v-model="stick['delimit,omitempty']" placeholder="请填写分隔符" />
-                                    </el-form-item>
-                                    <el-form-item v-if="stickValue == '自定义脚本'" class="flex-column" label="自定义脚本">
-                                        <el-input v-model="stick['custom,omitempty']" placeholder="请填写自定义脚本" />
-                                    </el-form-item>
-                                    <el-form-item v-if="stickValue == '固定长度'" class="flex-column" label="固定长度">
-                                        <el-input type="number" v-model="stick['fixedLen,omitempty']" placeholder="请填写固定长度" />
-                                    </el-form-item>
-                                    <el-form-item v-if="stickValue == '长度字段'" class="flex-column" label="长度">
-                                        <el-input type="number" v-model="stick['len,omitempty']['len']" placeholder="请填写长度" />
-                                    </el-form-item>
-                                    <el-form-item v-if="stickValue == '长度字段'" class="flex-column" label="偏移量">
-                                        <el-input type="number" v-model="stick['len,omitempty']['offset']" placeholder="请填写偏移量" />
-                                    </el-form-item>
-                                    <el-form-item v-if="stickValue == '长度字段'" class="flex-column" label="大小端">
-                                        <el-select v-model="stick['len,omitempty']['endian']" placeholder="请选择大小端">
-                                            <el-option label="大端" value="大端" />
-                                            <el-option label="小端" value="小端" />
-                                        </el-select>
-                                    </el-form-item>
-                                </el-form-item>
-                                <el-form-item label="地址">
-                                    <el-input v-model="form.addr" placeholder="端口号" />
-                                </el-form-item>
-                                <el-form-item label="开启TLS">
-                                    <el-radio-group v-model="form.isTls" class="ml-4">
-                                        <el-radio :label="1">是</el-radio>
-                                        <el-radio :label="0">否</el-radio>
-                                    </el-radio-group>
-                                </el-form-item>
-                                <el-form-item v-if="form.isTls == 1 && form.types != 'mqtt_server'" label="选择证书">
-                                    <el-select v-model="form.certificateId" placeholder="请选择证书">
-                                        <el-option v-for="item in certificateList" :key="item.id" :label="item.name" :value="item.id">
-                                        </el-option>
-                                    </el-select>
-                                </el-form-item>
-                                <el-form-item v-if="form.isTls == 1 && form.types == 'mqtt_server'" label="接入方式">
-                                    <el-select v-model="form.authType" placeholder="选择接入方式">
-                                        <el-option label="Basic" :value="1" />
-                                        <el-option label="AccessToken" :value="2" />
-                                        <!-- <el-option label="证书" :value="3" /> -->
-                                    </el-select>
-                                    <el-form-item v-if="form.authType == 1" class="flex-column" label="用户名">
-                                        <el-input v-model="form.authUser" placeholder="请填写用户名" />
-                                    </el-form-item>
-                                    <el-form-item v-if="form.authType == 1" class="flex-column" label="密码">
-                                        <el-input v-model="form.authPasswd" placeholder="请填写密码" />
-                                    </el-form-item>
-                                    <el-form-item v-if="form.authType == 2" class="flex-column" label="Aceess Token">
-                                        <el-input v-model="form.accessToken" placeholder="请填写Aceess Token" />
-                                    </el-form-item>
-                                </el-form-item>
-                                <el-form-item label="启用">
-                                    <el-switch :active-value="1" :inactive-value="0" v-model="form.status" />
-                                </el-form-item>
-                            </el-form>
-                        </div>
-                    </el-collapse-item>
-                    <el-collapse-item title="注册包" name="2">
-                        <el-form style="width: 600px;margin: 0 auto;" :model="form" label-width="98px">
-                            <el-form-item label="正则表达式">
-                                <el-input v-model="form.register.regex" placeholder="请填写名称" />
-                            </el-form-item>
-                        </el-form>
-                    </el-collapse-item>
-                    <el-collapse-item title="协议适配" name="3">
-                        <el-form style="width: 600px;margin: 0 auto;" :model="form" label-width="98px">
-                            <el-form-item label="协议">
-                                <el-select v-model="form.protocol.name" placeholder="请选择协议适配">
-                                    <el-option v-for="dict in network_protocols" :key="dict.value" :label="dict.label" :value="dict.value">
-                                    </el-option>
-                                    <!-- <el-option label="Modbus RTU" value="Modbus RTU" />
+  <div class="page bg padding page-full Ipt-2" style="position: relative;">
+    <el-tabs v-model="activeName" class="demo-tabs" @tab-click="handleClick">
+      <el-tab-pane label="新建服务器" name="first">
+        <el-collapse v-model="activeViewName">
+          <el-collapse-item title="基本信息" name="1">
+            <div class="collapse-wrap">
+              <el-form style="width: 600px;margin: 0 auto;" :model="form" label-width="98px">
+                <el-form-item label="名称">
+                  <el-input v-model="form.name" show-word-limit maxlength="20" placeholder="请填写名称" />
+                </el-form-item>
+                <el-form-item label="类型">
+                  <el-select @change="handleChangeType" v-model="form.types" placeholder="请选择类型">
+                    <el-option v-for="dict in network_server_type" :key="dict.value" :label="dict.label" :value="dict.value">
+                    </el-option>
+                  </el-select>
+                </el-form-item>
+                <el-form-item v-if="form.types == 'tcp'" label="粘拆包规则">
+                  <el-select @change="initData" v-model="stickValue" placeholder="请选择类型">
+                    <el-option v-for="dict in stick_type" :key="dict.value" :label="dict.label" :value="dict.value">
+                    </el-option>
+                  </el-select>
+                </el-form-item>
+                <el-form-item v-if="form.types == 'tcp' && stickValue">
+                  <el-form-item v-if="stickValue == '分隔符'" class="flex-column" label="分隔符">
+                    <el-input v-model="stick['delimit,omitempty']" placeholder="请填写分隔符" />
+                  </el-form-item>
+                  <el-form-item v-if="stickValue == '自定义脚本'" class="flex-column" label="自定义脚本">
+                    <el-input v-model="stick['custom,omitempty']" placeholder="请填写自定义脚本" />
+                  </el-form-item>
+                  <el-form-item v-if="stickValue == '固定长度'" class="flex-column" label="固定长度">
+                    <el-input type="number" v-model="stick['fixedLen,omitempty']" placeholder="请填写固定长度" />
+                  </el-form-item>
+                  <el-form-item v-if="stickValue == '长度字段'" class="flex-column" label="长度">
+                    <el-input type="number" v-model="stick['len,omitempty']['len']" placeholder="请填写长度" />
+                  </el-form-item>
+                  <el-form-item v-if="stickValue == '长度字段'" class="flex-column" label="偏移量">
+                    <el-input type="number" v-model="stick['len,omitempty']['offset']" placeholder="请填写偏移量" />
+                  </el-form-item>
+                  <el-form-item v-if="stickValue == '长度字段'" class="flex-column" label="大小端">
+                    <el-select v-model="stick['len,omitempty']['endian']" placeholder="请选择大小端">
+                      <el-option label="大端" value="大端" />
+                      <el-option label="小端" value="小端" />
+                    </el-select>
+                  </el-form-item>
+                </el-form-item>
+                <el-form-item label="地址">
+                  <el-input v-model="form.addr" placeholder="端口号" />
+                </el-form-item>
+                <el-form-item label="开启TLS">
+                  <el-radio-group v-model="form.isTls" class="ml-4">
+                    <el-radio :label="1">是</el-radio>
+                    <el-radio :label="0">否</el-radio>
+                  </el-radio-group>
+                </el-form-item>
+                <el-form-item v-if="form.isTls == 1 && form.types != 'mqtt_server'" label="选择证书">
+                  <el-select v-model="form.certificateId" placeholder="请选择证书">
+                    <el-option v-for="item in certificateList" :key="item.id" :label="item.name" :value="item.id">
+                    </el-option>
+                  </el-select>
+                </el-form-item>
+                <el-form-item v-if="form.isTls == 1 && form.types == 'mqtt_server'" label="接入方式">
+                  <el-select v-model="form.authType" placeholder="选择接入方式">
+                    <el-option label="Basic" :value="1" />
+                    <el-option label="AccessToken" :value="2" />
+                    <!-- <el-option label="证书" :value="3" /> -->
+                  </el-select>
+                  <el-form-item v-if="form.authType == 1" class="flex-column" label="用户名">
+                    <el-input v-model="form.authUser" placeholder="请填写用户名" />
+                  </el-form-item>
+                  <el-form-item v-if="form.authType == 1" class="flex-column" label="密码">
+                    <el-input v-model="form.authPasswd" placeholder="请填写密码" />
+                  </el-form-item>
+                  <el-form-item v-if="form.authType == 2" class="flex-column" label="Aceess Token">
+                    <el-input v-model="form.accessToken" placeholder="请填写Aceess Token" />
+                  </el-form-item>
+                </el-form-item>
+                <el-form-item label="启用">
+                  <el-switch :active-value="1" :inactive-value="0" v-model="form.status" />
+                </el-form-item>
+              </el-form>
+            </div>
+          </el-collapse-item>
+          <el-collapse-item title="注册包" name="2">
+            <el-form style="width: 600px;margin: 0 auto;" :model="form" label-width="98px">
+              <el-form-item label="正则表达式">
+                <el-input v-model="form.register.regex" placeholder="请填写名称" />
+              </el-form-item>
+            </el-form>
+          </el-collapse-item>
+          <el-collapse-item title="协议适配" name="3">
+            <el-form style="width: 600px;margin: 0 auto;" :model="form" label-width="98px">
+              <el-form-item label="协议">
+                <el-select v-model="form.protocol.name" placeholder="请选择协议适配">
+                  <el-option v-for="dict in network_protocols" :key="dict.value" :label="dict.label" :value="dict.value">
+                  </el-option>
+                  <!-- <el-option label="Modbus RTU" value="Modbus RTU" />
                                     <el-option label="Modbus TCP" value="Modbus TCP" />
                                     <el-option label="Omron Hostlink" value="Omron Hostlink" />
                                     <el-option label="Omron FINS UDP" value="Omron FINS UDP" />
@@ -105,315 +105,305 @@
                                     <el-option label="Simatic S7-400" value="Simatic S7-400" />
                                     <el-option label="Simatic S7-1200" value="Simatic S7-1200" />
                                     <el-option label="Simatic S7-1500" value="Simatic S7-1500" /> -->
-                                </el-select>
-                            </el-form-item>
-                            <el-form-item label="协议参数">
-                                <codeEditor class="params" ref="mirrorRef" :mode="resourceModalPro.mode" :content="resourceModalPro.content">
-                                </codeEditor>
-                            </el-form-item>
-                        </el-form>
-                    </el-collapse-item>
-                </el-collapse>
-            </el-tab-pane>
-            <!-- <el-tab-pane label="专家视图" name="second">
-                <h1>专家视图</h1>
-            </el-tab-pane> -->
-        </el-tabs>
-        <div style="position: absolute;right:20px;top: 20px;">
-            <el-button size="medium" @click="$router.replace('/iotmanager/network/server')">取消</el-button>
-            <el-button @click="submit" size="medium" type="primary">提交</el-button>
-        </div>
-
-        <!-- <codeEditor ref="mirrorRef"
-	  :mode="resourceModalPro.mode"
-	  :content="resourceModalPro.content"
-	  >
-	  </codeEditor> -->
-    </el-card>
+                </el-select>
+              </el-form-item>
+              <el-form-item label="协议参数">
+                <codeEditor class="params" ref="mirrorRef" :mode="resourceModalPro.mode" :content="resourceModalPro.content">
+                </codeEditor>
+              </el-form-item>
+            </el-form>
+          </el-collapse-item>
+        </el-collapse>
+      </el-tab-pane>
+    </el-tabs>
+    <div style="position: absolute;right:20px;top: 14px;">
+      <el-button size="small" @click="$router.replace('/iotmanager/network/server')">取消</el-button>
+      <el-button @click="submit" size="small" type="primary">提交</el-button>
+    </div>
+  </div>
 </template>
 <script lang="ts">
 import { toRefs, reactive, onMounted, ref, defineComponent, getCurrentInstance, watch } from 'vue';
-import { Delete, Edit, Search, Share, Upload } from '@element-plus/icons-vue';
-import { ElMessageBox, ElMessage, FormInstance } from 'element-plus';
+import { Edit } from '@element-plus/icons-vue';
+import { ElMessage } from 'element-plus';
 import type { TabsPaneContext } from 'element-plus'
 import codeEditor from '/@/components/codeEditor/index.vue'
 
 import serverDetail from './component/serverDetail.vue'
 
-import { useRoute, useRouter } from 'vue-router';
+import { useRoute } from 'vue-router';
 
 import api from '/@/api/network';
 import api2 from '/@/api/system';
 
 interface TableDataState {
-    // ids: number[];
-    // id: string;
-    activeViewName: string[];
-    resourceModalPro: {
-        mode: string,
-        content: string,
-        // content: object,
-    },
-    detail: object,
-    form: object,
-    certificateList: object[];
-    stick: {
-        // 分隔符
-        "delimit,omitempty": string,
-        // 自定义脚本
-        "custom,omitempty": string,
-        // 固定长度
-        "fixedLen,omitempty": number,
-        // 长度字段
-        "len,omitempty": {
-            "len": number,
-            "offset": number,
-            "endian": string
-        }
-    };
-    stick_type: object[];
-    stickValue: string;
+  // ids: number[];
+  // id: string;
+  activeViewName: string[];
+  resourceModalPro: {
+    mode: string,
+    content: string,
+    // content: object,
+  },
+  detail: object,
+  form: object,
+  certificateList: object[];
+  stick: {
+    // 分隔符
+    "delimit,omitempty": string,
+    // 自定义脚本
+    "custom,omitempty": string,
+    // 固定长度
+    "fixedLen,omitempty": number,
+    // 长度字段
+    "len,omitempty": {
+      "len": number,
+      "offset": number,
+      "endian": string
+    }
+  };
+  stick_type: object[];
+  stickValue: string;
 
 }
 export default defineComponent({
-    name: 'serverCreate',
-    components: { codeEditor, serverDetail },
-    props: {
-        type: {
-            type: String,
-            default: ''
-        }
-    },
-
-    setup(props, context) {
-        const { proxy } = getCurrentInstance() as any;
-        const route = useRoute();
-        const router = useRouter();
-        const { network_server_type, network_protocols } = proxy.useDict('network_server_type', 'network_protocols');
+  name: 'serverCreate',
+  components: { codeEditor, serverDetail },
+  props: {
+    type: {
+      type: String,
+      default: ''
+    }
+  },
 
-        const state = reactive<TableDataState>({
-            stickValue: "",
-            stick: {
-                "delimit,omitempty": "",
-                "custom,omitempty": "",
-                "fixedLen,omitempty": 0,
-                "len,omitempty": {
-                    "len": 0,
-                    "offset": 0,
-                    "endian": ""
-                }
-            },
-            stick_type: [
-                {
-                    label: "分隔符",
-                    value: "分隔符"
-                },
-                {
-                    label: "自定义脚本",
-                    value: "自定义脚本"
-                },
-                {
-                    label: "固定长度",
-                    value: "固定长度"
-                },
-                {
-                    label: "长度字段",
-                    value: "长度字段"
-                }
-            ],
-            resourceModalPro: {
-                mode: '',
-                content: ''
-            },
-            detail: {},
-            activeViewName: ['1', '2', '3'],
-            certificateList: [],
-            form: {
-                id: "",
-                // AccessToken
-                accessToken: "",
-                // 认证密码
-                authPasswd: "",
-                // 认证用户
-                authUser: "",
-                // 认证方式(1=Basic,2=AccessToken,3=证书)
-                authType: 3,
-                // 是否开启TLS
-                isTls: 0,
-                // 证书id
-                certificateId: "",
-                // 名称
-                name: '',
-                // 类型
-                types: 'tcp',
-                // 禁用
-                status: 0,
-                // 地址
-                addr: '',
-                register: {
-                    regex: "^\w+$"
-                },
-                // 协议适配
-                protocol: {
-                    name: "ModbusTCP",
-                    options: {}
-                },
-                // 心跳包
-                heartbeat: {
-                    enable: false,
-                    hex: "",
-                    regex: "^\\w+$",
-                    text: "",
-                    timeout: 30
-                },
-                // 设备
-                devices: []
-            }
-        });
-        const mirrorRef = ref('mirrorRef')
-        const activeName = ref('first')
-        const getDetail = () => {
-            const id = route.params && route.params.id;
-            api.tunnel.getDetail({ "id": id }).then((res: any) => {
-                state.detail = res
-            })
-        };
-        const submit = () => {
-            if (!state.form.id) {
-                delete state.form.id;
-            }
-            let params = {
-                ...state.form,
-                "stick": {
-                    ...state.stick
-                }
-            }
-            if (mirrorRef.value.getValue()) {
-                state.form.protocol.options = eval("(" + mirrorRef.value.getValue() + ")")
-            }
-            // return
-            api.server.addItem(params).then((res: any) => {
-                ElMessage.success('添加成功')
-                goBack()
-                // const { list, total, page } = res
-                // state.data = list
-                // state.total = total
-                // state.param.page = page
-            });
-        };
-        onMounted(() => {
+  setup(props, context) {
+    const { proxy } = getCurrentInstance() as any;
+    const route = useRoute();
+    const { network_server_type, network_protocols } = proxy.useDict('network_server_type', 'network_protocols');
 
-            let obj = {}
-            var jsonData = JSON.stringify(obj);
-            state.resourceModalPro.content = JSON.stringify(JSON.parse(jsonData), null, 4);
-            getCertificateList()
-        });
-        const handleClick = (tab: TabsPaneContext, event: Event) => {
+    const state = reactive<TableDataState>({
+      stickValue: "",
+      stick: {
+        "delimit,omitempty": "",
+        "custom,omitempty": "",
+        "fixedLen,omitempty": 0,
+        "len,omitempty": {
+          "len": 0,
+          "offset": 0,
+          "endian": ""
         }
-        const getCertificateList = () => {
-            api2.certificate.getList().then((res: any) => {
-                state.certificateList = res.Info;
-            })
+      },
+      stick_type: [
+        {
+          label: "分隔符",
+          value: "分隔符"
+        },
+        {
+          label: "自定义脚本",
+          value: "自定义脚本"
+        },
+        {
+          label: "固定长度",
+          value: "固定长度"
+        },
+        {
+          label: "长度字段",
+          value: "长度字段"
         }
-        const initData = () => {
-            state.stick = {
-                "delimit,omitempty": "",
-                "custom,omitempty": "",
-                "fixedLen,omitempty": 0,
-                "len,omitempty": {
-                    "len": 0,
-                    "offset": 0,
-                    "endian": ""
-                }
-            }
+      ],
+      resourceModalPro: {
+        mode: '',
+        content: ''
+      },
+      detail: {},
+      activeViewName: ['1', '2', '3'],
+      certificateList: [],
+      form: {
+        id: "",
+        // AccessToken
+        accessToken: "",
+        // 认证密码
+        authPasswd: "",
+        // 认证用户
+        authUser: "",
+        // 认证方式(1=Basic,2=AccessToken,3=证书)
+        authType: 3,
+        // 是否开启TLS
+        isTls: 0,
+        // 证书id
+        certificateId: "",
+        // 名称
+        name: '',
+        // 类型
+        types: 'tcp',
+        // 禁用
+        status: 0,
+        // 地址
+        addr: '',
+        register: {
+          regex: "^\w+$"
+        },
+        // 协议适配
+        protocol: {
+          name: "ModbusTCP",
+          options: {}
+        },
+        // 心跳包
+        heartbeat: {
+          enable: false,
+          hex: "",
+          regex: "^\\w+$",
+          text: "",
+          timeout: 30
+        },
+        // 设备
+        devices: []
+      }
+    });
+    const mirrorRef = ref('mirrorRef')
+    const activeName = ref('first')
+    const getDetail = () => {
+      const id = route.params && route.params.id;
+      api.tunnel.getDetail({ "id": id }).then((res: any) => {
+        state.detail = res
+      })
+    };
+    const submit = () => {
+      if (!state.form.id) {
+        delete state.form.id;
+      }
+      let params = {
+        ...state.form,
+        "stick": {
+          ...state.stick
         }
-        const handleChangeType = () => {
-            if (state.form.types != 'mqtt_server' && state.form.isTls == 1) {
-                state.form.authType = 3
-                return;
-            }
-            if (state.form.isTls == 0) {
-                state.form.authType = ""
-            }
+      }
+      if (mirrorRef.value.getValue()) {
+        state.form.protocol.options = eval("(" + mirrorRef.value.getValue() + ")")
+      }
+      // return
+      api.server.addItem(params).then((res: any) => {
+        ElMessage.success('添加成功')
+        goBack()
+        // const { list, total, page } = res
+        // state.data = list
+        // state.total = total
+        // state.param.page = page
+      });
+    };
+    onMounted(() => {
+
+      let obj = {}
+      var jsonData = JSON.stringify(obj);
+      state.resourceModalPro.content = JSON.stringify(JSON.parse(jsonData), null, 4);
+      getCertificateList()
+    });
+    const handleClick = (tab: TabsPaneContext, event: Event) => {
+    }
+    const getCertificateList = () => {
+      api2.certificate.getList().then((res: any) => {
+        state.certificateList = res.Info;
+      })
+    }
+    const initData = () => {
+      state.stick = {
+        "delimit,omitempty": "",
+        "custom,omitempty": "",
+        "fixedLen,omitempty": 0,
+        "len,omitempty": {
+          "len": 0,
+          "offset": 0,
+          "endian": ""
         }
-        watch(
-            () => state.form.types,
-            (value) => {
-                getCertificateList()
-                // api.certificate.getList();
-            }
-        );
+      }
+    }
+    const handleChangeType = () => {
+      if (state.form.types != 'mqtt_server' && state.form.isTls == 1) {
+        state.form.authType = 3
+        return;
+      }
+      if (state.form.isTls == 0) {
+        state.form.authType = ""
+      }
+    }
+    watch(
+      () => state.form.types,
+      (value) => {
+        getCertificateList()
+        // api.certificate.getList();
+      }
+    );
 
-        watch(
-            () => state.form.isTls,
-            (value) => {
-                if (value == 0) {
-                    state.form.authType = ""
-                }
-                // api.certificate.getList();
-            }
-        );
-        return {
-            Edit,
-            mirrorRef,
-            activeName,
-            getDetail,
-            handleClick,
-            network_server_type,
-            network_protocols,
-            // editDicRef,
-            // editAttrRef,
-            // editFunRef,
-            // editEventRef,
-            // editTabRef,
-            getCertificateList,
-            submit,
-            initData,
-            handleChangeType,
-            ...toRefs(props),
-            ...toRefs(state),
-        };
-    },
+    watch(
+      () => state.form.isTls,
+      (value) => {
+        if (value == 0) {
+          state.form.authType = ""
+        }
+        // api.certificate.getList();
+      }
+    );
+    return {
+      Edit,
+      mirrorRef,
+      activeName,
+      getDetail,
+      handleClick,
+      network_server_type,
+      network_protocols,
+      // editDicRef,
+      // editAttrRef,
+      // editFunRef,
+      // editEventRef,
+      // editTabRef,
+      getCertificateList,
+      submit,
+      initData,
+      handleChangeType,
+      ...toRefs(props),
+      ...toRefs(state),
+    };
+  },
 });
 </script>
 
 <style>
 .CodeMirror {
-    width: 100%;
-    height: 600px;
-    font-size: 16px;
+  width: 100%;
+  height: 600px;
+  font-size: 16px;
 }
 </style>
 <style lang="scss" scoped>
 ::v-deep .el-collapse-item__header {
-    position: relative;
-    padding-left: 20px;
+  position: relative;
+  padding-left: 20px;
 
-    .el-collapse-item__arrow {
-        margin: 0 !important;
-        position: absolute;
-        left: 0;
-        right: 0;
+  .el-collapse-item__arrow {
+    margin: 0 !important;
+    position: absolute;
+    left: 0;
+    right: 0;
 
-    }
+  }
 }
 
 ::v-deep .el-input,
 ::v-deep .el-input-number {
-    width: 500px;
+  width: 500px;
 }
 
 ::v-deep .params {
-    width: 600px;
+  width: 600px;
 }
 
 ::v-deep .flex-column {
-    display: flex;
-    flex-direction: column;
+  display: flex;
+  flex-direction: column;
 
-    .el-form-item__label {
-        justify-content: flex-start;
-    }
+  .el-form-item__label {
+    justify-content: flex-start;
+  }
 }
 </style>
 

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

@@ -87,7 +87,7 @@ export default defineComponent({
 });
 </script>
 
-<style>
+<style scoped>
 .CodeMirror {
   width: 100%;
   height: 600px;

+ 239 - 242
src/views/iot/network/tunnel/create.vue

@@ -1,285 +1,282 @@
 <template>
-    <el-card class="system-dic-container" style="position: relative;">
-        <el-tabs v-model="activeName" class="demo-tabs">
-            <el-tab-pane label="新增通道" name="first">
-                <el-collapse v-model="activeViewName">
-                    <el-collapse-item title="基本信息" name="1">
-                        <div class="collapse-wrap">
-                            <el-form style="width: 600px;margin: 0 auto;" :model="form" :rules="rules" label-width="68px">
-                                <el-form-item label="名称" prop="name">
-                                    <el-input v-model="form.name" show-word-limit maxlength="20" placeholder="请填写名称" />
-                                </el-form-item>
-                                <el-form-item label="类型">
-                                    <el-select v-model="form.types" placeholder="请选择类型">
-                                        <el-option v-for="dict in network_tunnel_type" :key="dict.value" :label="dict.label" :value="dict.value">
-                                        </el-option>
-                                    </el-select>
-                                </el-form-item>
-                                <el-form-item v-show="form.types != 'serial'" label="地址">
-                                    <el-input v-model="form.addr" placeholder="端口号,IP:端口" />
-                                </el-form-item>
-                                <el-form-item label="启用">
-                                    <el-switch v-model="form.status" :active-value="1" :inactive-value="0" />
-                                </el-form-item>
-                            </el-form>
-                        </div>
-                    </el-collapse-item>
-                    <el-collapse-item v-show="form.types == 'serial'" title="串口参数" name="2">
-                        <div class="collapse-wrap">
-                            <el-form style="width: 600px;margin: 0 auto;" :model="form" label-width="68px">
-                                <el-form-item label="端口">
-                                    <el-button>/dev/ttyS0</el-button>
-                                </el-form-item>
-                                <el-form-item label="波特率">
-                                    <el-select v-model="form.serial.baud_rate" placeholder="请选择波特率">
-                                        <el-option v-for="dict in tunnel_serial_baudrate" :key="dict.value" :label="dict.label" :value="dict.value">
-                                        </el-option>
-                                    </el-select>
-                                </el-form-item>
-                                <el-form-item label="数据位">
-                                    <el-select v-model="form.serial.data_bits" placeholder="请选择数据位">
-                                        <el-option v-for="dict in tunnel_serial_databits" :key="dict.value" :label="dict.label" :value="dict.value">
-                                        </el-option>
-                                    </el-select>
-                                </el-form-item>
-                                <el-form-item label="停止位">
-                                    <el-select v-model="form.serial.stop_bits" placeholder="请选择停止位">
-                                        <el-option v-for="dict in tunnel_serial_stopbits" :key="dict.value" :label="dict.label" :value="dict.value">
-                                        </el-option>
-                                    </el-select>
-                                </el-form-item>
-                                <el-form-item label="检验位">
-                                    <el-select v-model="form.serial.parity" placeholder="请选择检验位">
-                                        <el-option v-for="dict in tunnel_serial_parity" :key="dict.value" :label="dict.label" :value="dict.value">
-                                        </el-option>
-                                    </el-select>
-                                </el-form-item>
-                            </el-form>
-                        </div>
-                    </el-collapse-item>
-                    <el-collapse-item v-show="form.type != 'serial'" title="心跳包" name="4">
-                        <el-form style="width: 600px;margin: 0 auto;" :model="form" label-width="68px">
-                            <el-form-item label="启用">
-                                <el-switch v-model="form.heartbeat.enable" />
-                            </el-form-item>
-                        </el-form>
-                    </el-collapse-item>
-                    <el-collapse-item v-if="form.types == 'serial' || form.types == 'tcp-client' || form.types == 'udp-client'" title="断线重连" name="4">
-                        <el-form style="width: 600px;margin: 0 auto;" :model="form" label-width="68px">
-                            <el-form-item label="启用">
-                                <el-switch v-model="form.retry.enable" />
-                            </el-form-item>
-                            <el-form-item label="间隔">
-                                <el-input-number v-model="form.retry.timeout" :min="0" @change="handleChange" />
-                            </el-form-item>
-                            <el-form-item label="最大次数">
-                                <el-input-number v-model="form.retry.maximum" :min="0" @change="handleChange" />
-                            </el-form-item>
-                        </el-form>
-                    </el-collapse-item>
-                    <el-collapse-item title="协议适配" name="5">
-                        <el-form style="width: 600px;margin: 0 auto;" :model="form" label-width="68px">
-                            <el-form-item label="协议">
-                                <el-select v-model="form.protoccol.name" placeholder="请选择协议适配">
-                                    <el-option v-for="dict in network_protocols" :key="dict.value" :label="dict.label" :value="dict.value">
-                                    </el-option>
-                                </el-select>
-                            </el-form-item>
-                            <el-form-item label="协议参数">
-                                <codeEditor class="params" ref="mirrorRef" :mode="resourceModalPro.mode" :content="resourceModalPro.content" :getValue="getValue">
-                                </codeEditor>
-                            </el-form-item>
-                        </el-form>
-                    </el-collapse-item>
-                </el-collapse>
-            </el-tab-pane>
-        </el-tabs>
-        <div style="position: absolute;right:20px;top: 20px;">
-            <el-button size="medium" @click="$router.replace('/iotmanager/network/tunnel')">取消</el-button>
-            <el-button @click="submit" size="medium" type="primary">提交</el-button>
-        </div>
-    </el-card>
+  <div class="page bg padding page-full Ipt-2" style="position: relative;">
+    <el-tabs v-model="activeName">
+      <el-tab-pane label="新增通道" name="first">
+        <el-collapse v-model="activeViewName">
+          <el-collapse-item title="基本信息" name="1">
+            <div class="collapse-wrap">
+              <el-form style="width: 600px;margin: 0 auto;" :model="form" :rules="rules" label-width="68px">
+                <el-form-item label="名称" prop="name">
+                  <el-input v-model="form.name" show-word-limit maxlength="20" placeholder="请填写名称" />
+                </el-form-item>
+                <el-form-item label="类型">
+                  <el-select v-model="form.types" placeholder="请选择类型">
+                    <el-option v-for="dict in network_tunnel_type" :key="dict.value" :label="dict.label" :value="dict.value">
+                    </el-option>
+                  </el-select>
+                </el-form-item>
+                <el-form-item v-show="form.types != 'serial'" label="地址">
+                  <el-input v-model="form.addr" placeholder="端口号,IP:端口" />
+                </el-form-item>
+                <el-form-item label="启用">
+                  <el-switch v-model="form.status" :active-value="1" :inactive-value="0" />
+                </el-form-item>
+              </el-form>
+            </div>
+          </el-collapse-item>
+          <el-collapse-item v-show="form.types == 'serial'" title="串口参数" name="2">
+            <div class="collapse-wrap">
+              <el-form style="width: 600px;margin: 0 auto;" :model="form" label-width="68px">
+                <el-form-item label="端口">
+                  <el-button>/dev/ttyS0</el-button>
+                </el-form-item>
+                <el-form-item label="波特率">
+                  <el-select v-model="form.serial.baud_rate" placeholder="请选择波特率">
+                    <el-option v-for="dict in tunnel_serial_baudrate" :key="dict.value" :label="dict.label" :value="dict.value">
+                    </el-option>
+                  </el-select>
+                </el-form-item>
+                <el-form-item label="数据位">
+                  <el-select v-model="form.serial.data_bits" placeholder="请选择数据位">
+                    <el-option v-for="dict in tunnel_serial_databits" :key="dict.value" :label="dict.label" :value="dict.value">
+                    </el-option>
+                  </el-select>
+                </el-form-item>
+                <el-form-item label="停止位">
+                  <el-select v-model="form.serial.stop_bits" placeholder="请选择停止位">
+                    <el-option v-for="dict in tunnel_serial_stopbits" :key="dict.value" :label="dict.label" :value="dict.value">
+                    </el-option>
+                  </el-select>
+                </el-form-item>
+                <el-form-item label="检验位">
+                  <el-select v-model="form.serial.parity" placeholder="请选择检验位">
+                    <el-option v-for="dict in tunnel_serial_parity" :key="dict.value" :label="dict.label" :value="dict.value">
+                    </el-option>
+                  </el-select>
+                </el-form-item>
+              </el-form>
+            </div>
+          </el-collapse-item>
+          <el-collapse-item v-show="form.type != 'serial'" title="心跳包" name="3">
+            <el-form style="width: 600px;margin: 0 auto;" :model="form" label-width="68px">
+              <el-form-item label="启用">
+                <el-switch v-model="form.heartbeat.enable" />
+              </el-form-item>
+            </el-form>
+          </el-collapse-item>
+          <el-collapse-item v-if="form.types == 'serial' || form.types == 'tcp-client' || form.types == 'udp-client'" title="断线重连" name="4">
+            <el-form style="width: 600px;margin: 0 auto;" :model="form" label-width="68px">
+              <el-form-item label="启用">
+                <el-switch v-model="form.retry.enable" />
+              </el-form-item>
+              <el-form-item label="间隔">
+                <el-input-number v-model="form.retry.timeout" :min="0" @change="handleChange" />
+              </el-form-item>
+              <el-form-item label="最大次数">
+                <el-input-number v-model="form.retry.maximum" :min="0" @change="handleChange" />
+              </el-form-item>
+            </el-form>
+          </el-collapse-item>
+          <el-collapse-item title="协议适配" name="5">
+            <el-form style="width: 600px;margin: 0 auto;" :model="form" label-width="68px">
+              <el-form-item label="协议">
+                <el-select v-model="form.protoccol.name" placeholder="请选择协议适配">
+                  <el-option v-for="dict in network_protocols" :key="dict.value" :label="dict.label" :value="dict.value">
+                  </el-option>
+                </el-select>
+              </el-form-item>
+              <el-form-item label="协议参数">
+                <codeEditor class="params" ref="mirrorRef" :mode="resourceModalPro.mode" :content="resourceModalPro.content" :getValue="getValue">
+                </codeEditor>
+              </el-form-item>
+            </el-form>
+          </el-collapse-item>
+        </el-collapse>
+      </el-tab-pane>
+    </el-tabs>
+    <div style="position: absolute;right:20px;top: 14px;">
+      <el-button size="small" @click="$router.replace('/iotmanager/network/tunnel')">取消</el-button>
+      <el-button @click="submit" size="small" type="primary">提交</el-button>
+    </div>
+  </div>
 </template>
 <script lang="ts">
 import { toRefs, reactive, onMounted, ref, defineComponent, getCurrentInstance, nextTick } from 'vue';
 import { ElMessage } from 'element-plus';
-import type { TabsPaneContext } from 'element-plus'
 import codeEditor from '/@/components/codeEditor/index.vue'
-
 import serverDetail from './component/serverDetail.vue'
-
 import { useRoute, useRouter } from 'vue-router';
 
 import api from '/@/api/network';
 
 interface TableDataState {
-    activeViewName: string[];
-    resourceModalPro: {
-        mode: string,
-        content: string,
-    },
-    detail: object,
-    form: object,
-    rules: object,
+  activeViewName: string[];
+  resourceModalPro: {
+    mode: string,
+    content: string,
+  },
+  detail: object,
+  form: object,
+  rules: object,
 }
 export default defineComponent({
-    name: 'tunnelCreate',
-    components: { codeEditor, serverDetail },
-    props: {
-        type: {
-            type: String,
-            default: ''
-        }
-    },
+  name: 'tunnelCreate',
+  components: { codeEditor, serverDetail },
+  props: {
+    type: {
+      type: String,
+      default: ''
+    }
+  },
 
-    setup(props, context) {
-        const { proxy } = getCurrentInstance() as any;
-        const route = useRoute();
-        const router = useRouter();
-        const { network_tunnel_type, tunnel_serial_baudrate, tunnel_serial_databits, tunnel_serial_stopbits, tunnel_serial_parity, network_protocols } = proxy.useDict('network_tunnel_type', 'tunnel_serial_baudrate', 'tunnel_serial_databits', 'tunnel_serial_stopbits', 'tunnel_serial_parity', 'network_protocols');
+  setup(props, context) {
+    const { proxy } = getCurrentInstance() as any;
+    const route = useRoute();
+    const router = useRouter();
+    const { network_tunnel_type, tunnel_serial_baudrate, tunnel_serial_databits, tunnel_serial_stopbits, tunnel_serial_parity, network_protocols } = proxy.useDict('network_tunnel_type', 'tunnel_serial_baudrate', 'tunnel_serial_databits', 'tunnel_serial_stopbits', 'tunnel_serial_parity', 'network_protocols');
 
-        const state = reactive<TableDataState>({
-            // id: "",
-            resourceModalPro: {
-                mode: '',
-                content: ''
-            },
-            detail: {},
-            activeViewName: ['1', '2', '3', '4', '5'],
-            form: {
-                // 名称
-                name: '',
-                // 类型
-                types: 'serial',
-                // 启用
-                status: false,
-                // 地址
-                addr: '',
-                // 串口参数
-                serial: {
-                    baud_rate: "9600",
-                    data_bits: "6",
-                    stop_bits: "1",
-                    parity: '0'
-                },
-                // 断线重连
-                retry: {
-                    enable: true,
-                    timeout: 30,
-                    maximum: 0,
-                },
-                // 协议适配
-                protoccol: {
-                    name: "ModbusTCP",
-                    options: {}
-                },
-                // 心跳包
-                heartbeat: {
-                    enable: false,
-                    hex: "",
-                    regex: "^\\w+$",
-                    text: "",
-                    timeout: 30
-                }
-            },
-            rules: {
-                name: [
-                    { required: true, message: '名称不能为空', trigger: 'change' }
-                ]
-            }
-        });
+    const state = reactive<TableDataState>({
+      // id: "",
+      resourceModalPro: {
+        mode: '',
+        content: ''
+      },
+      detail: {},
+      activeViewName: ['1', '2', '3', '4', '5'],
+      form: {
+        // 名称
+        name: '',
+        // 类型
+        types: 'serial',
+        // 启用
+        status: false,
+        // 地址
+        addr: '',
+        // 串口参数
+        serial: {
+          baud_rate: "9600",
+          data_bits: "6",
+          stop_bits: "1",
+          parity: '0'
+        },
+        // 断线重连
+        retry: {
+          enable: true,
+          timeout: 30,
+          maximum: 0,
+        },
+        // 协议适配
+        protoccol: {
+          name: "ModbusTCP",
+          options: {}
+        },
+        // 心跳包
+        heartbeat: {
+          enable: false,
+          hex: "",
+          regex: "^\\w+$",
+          text: "",
+          timeout: 30
+        }
+      },
+      rules: {
+        name: [
+          { required: true, message: '名称不能为空', trigger: 'change' }
+        ]
+      }
+    });
 
-        const mirrorRef = ref('mirrorRef')
-        const activeName = ref('first')
+    const mirrorRef = ref('mirrorRef')
+    const activeName = ref('first')
 
-        const getDetail = () => {
-            const id = route.params && route.params.id;
-            api.tunnel.getDetail({ "id": id }).then((res: any) => {
-                state.detail = res
-            })
-        };
+    const getDetail = () => {
+      const id = route.params && route.params.id;
+      api.tunnel.getDetail({ "id": id }).then((res: any) => {
+        state.detail = res
+      })
+    };
 
 
-        const submit = () => {
-            // 串口参数-检验位-无
-            if (state.form.serial.parity == 0) {
-                state.form.serial.rs485 = false
-                delete state.form.serial.port
-            }
-            // 串口参数-检验位-偶/奇
-            if (state.form.serial.parity == 1 || state.form.serial.parity == 2) {
-                state.form.serial.port = null
-                delete state.form.serial.rs485
-            }
-            if (mirrorRef.value.getValue()) {
-                try {
-                    state.form.protoccol.options = eval("(" + mirrorRef.value.getValue() + ")")
-                } catch (error) {
-                    return ElMessage('协议参数解析错误')
-                }
-            }
-            // return
-            api.tunnel.addItem({ ...state.form }).then((res: any) => {
-                ElMessage.success('添加成功')
-                goBack()
-            });
-        };
-        const goBack = () => {
-            router.go(-1);
+    const submit = () => {
+      // 串口参数-检验位-无
+      if (state.form.serial.parity == 0) {
+        state.form.serial.rs485 = false
+        delete state.form.serial.port
+      }
+      // 串口参数-检验位-偶/奇
+      if (state.form.serial.parity == 1 || state.form.serial.parity == 2) {
+        state.form.serial.port = null
+        delete state.form.serial.rs485
+      }
+      if (mirrorRef.value.getValue()) {
+        try {
+          state.form.protoccol.options = eval("(" + mirrorRef.value.getValue() + ")")
+        } catch (error) {
+          return ElMessage('协议参数解析错误')
         }
-        onMounted(() => {
-            let obj = {}
-            var jsonData = JSON.stringify(obj);
-            state.resourceModalPro.content = JSON.stringify(JSON.parse(jsonData), null, 4);
-        });
+      }
+      // return
+      api.tunnel.addItem({ ...state.form }).then((res: any) => {
+        ElMessage.success('添加成功')
+        goBack()
+      });
+    };
+    const goBack = () => {
+      router.go(-1);
+    }
+    onMounted(() => {
+      let obj = {}
+      var jsonData = JSON.stringify(obj);
+      state.resourceModalPro.content = JSON.stringify(JSON.parse(jsonData), null, 4);
+    });
 
-        return {
-            mirrorRef,
-            activeName,
-            getDetail,
-            network_tunnel_type,
-            tunnel_serial_baudrate,
-            tunnel_serial_databits,
-            tunnel_serial_stopbits,
-            tunnel_serial_parity,
-            network_protocols,
-            submit,
-            goBack,
-            ...toRefs(props),
-            ...toRefs(state),
-        };
-    },
+    return {
+      mirrorRef,
+      activeName,
+      getDetail,
+      network_tunnel_type,
+      tunnel_serial_baudrate,
+      tunnel_serial_databits,
+      tunnel_serial_stopbits,
+      tunnel_serial_parity,
+      network_protocols,
+      submit,
+      goBack,
+      ...toRefs(props),
+      ...toRefs(state),
+    };
+  },
 });
 </script>
 
 <style>
 .CodeMirror {
-    width: 100%;
-    height: 600px;
-    font-size: 16px;
+  width: 100%;
+  height: 600px;
+  font-size: 16px;
 }
 </style>
 <style lang="scss" scoped>
 ::v-deep .el-collapse-item__header {
-    position: relative;
-    padding-left: 20px;
+  position: relative;
+  padding-left: 20px;
 
-    .el-collapse-item__arrow {
-        margin: 0 !important;
-        position: absolute;
-        left: 0;
-        right: 0;
+  .el-collapse-item__arrow {
+    margin: 0 !important;
+    position: absolute;
+    left: 0;
+    right: 0;
 
-    }
+  }
 }
 
 ::v-deep .el-input,
 ::v-deep .el-input-number {
-    width: 500px;
+  width: 500px;
 }
 
 ::v-deep .params {
-    width: 600px;
+  width: 600px;
 }
 </style>
 

+ 1 - 1
src/views/iot/noticeservices/config/component/edit.vue

@@ -131,7 +131,7 @@ export default defineComponent({
 	},
 });
 </script>
-<style>
+<style scoped>
 .el-textarea__inner{
 	min-height: 420px !important;
 }

+ 1 - 1
src/views/iot/noticeservices/config/component/setEdit.vue

@@ -143,7 +143,7 @@ export default defineComponent({
 	},
 });
 </script>
-<style>
+<style scoped>
 .inline {
 	display: inline-flex;
 }

+ 1 - 1
src/views/iot/noticeservices/config/component/temEdit.vue

@@ -171,7 +171,7 @@ export default defineComponent({
 	},
 });
 </script>
-<style>
+<style scoped>
 .inline {
 	display: inline-flex;
 }

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

@@ -207,7 +207,7 @@ export default defineComponent({
 });
 </script>
 
-<style>
+<style scoped>
 .line {
   border: 1px solid var(--next-border-color-light);
   ;
@@ -218,7 +218,6 @@ export default defineComponent({
   box-sizing: border-box;
   margin: 0;
   padding: 0;
-  color: rgba(0, 0, 0, 0.85);
   font-size: 14px;
   font-variant: tabular-nums;
   line-height: 1.5715;

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

@@ -287,7 +287,7 @@ export default defineComponent({
 	},
 });
 </script>
-<style>
+<style scoped>
 .el-col-12 {
 	padding: 10px;
 }

+ 92 - 63
src/views/iot/property/dossier/component/from.vue

@@ -1,83 +1,112 @@
 
 <template>
 	<div>
-		<div v-for="(item, index) in Datalist" :key="index">
-			<el-form-item :label="item.title + ':'" :prop="item.name" class="form-item" v-if="item.types === 'input'">
-				<el-input v-model="formData[item.name]" :placeholder="'请输入' + item.title" @input="saveData()" />
-			</el-form-item>
-			<el-form-item :label="item.title + ':'" :prop="item.name" class="form-item" v-if="item.types === 'textarea'">
-				<el-input v-model="formData[item.name]" type="textarea" @input="saveData()" />
-			</el-form-item>
+		<div v-for="(item, index) in dataList" :key="index">
 
-			<el-form-item v-if="item.types === 'date'" :label="item.title + ':'">
-				<el-date-picker v-model="formData[item.name]" :default-value="item.value" type="date" value-format="YYYY-MM-DD" placeholder="请选择时间" class="w100" clearable @change="saveData()" />
-			</el-form-item>
+      <el-form-item :label="item.title + ':'" :prop="item.name" class="form-item" v-if="item.types === 'input'">
+        <el-input v-model="formData[item.name]" :placeholder="'请输入' + item.title" @input="saveData()" :readonly="disable" />
+      </el-form-item>
 
-			<el-form-item :label="item.title + ':'" prop="path" v-if="item.types === 'file'">
+      <el-form-item :label="item.title + ':'" :prop="item.name" class="form-item" v-if="item.types === 'textarea'">
+        <el-input v-model="formData[item.name]" type="textarea" @input="saveData()" :readonly="disable" />
+      </el-form-item>
 
+      <el-form-item v-if="item.types === 'date'" :label="item.title + ':'">
+        <el-date-picker v-model="formData[item.name]" :default-value="item.value" type="date" value-format="YYYY-MM-DD" placeholder="请选择时间" class="w100" clearable @change="saveData()" :readonly="disable" />
+      </el-form-item>
 
+      <el-form-item :label="item.title + ':'" prop="path" v-if="item.types === 'file'">
+        <el-upload class="avatar-uploader" :action="uploadUrl" :headers="headers" :show-file-list="false" :on-success="customCallback(item.name)" :disabled="disable">
+          <img v-if="formData[item.name]" :src="formData[item.name]" class="avatar" />
+          <el-icon v-else class="avatar-uploader-icon" v-if="!disable">
+            <Plus />
+          </el-icon>
+        </el-upload>
+      </el-form-item>
 
-				<el-upload class="avatar-uploader" :action="uploadUrl" :headers="headers" :show-file-list="false" :on-success="customCallback(item.name)">
-					<img v-if="formData[item.name]" :src="formData[item.name]" class="avatar" />
-					<el-icon v-else class="avatar-uploader-icon">
-						<Plus />
-					</el-icon>
-				</el-upload>
-
-
-			</el-form-item>
 		</div>
 	</div>
 </template>
 
-<script lang="ts" setup>
-import { ref, defineEmits, onMounted, defineProps } from 'vue'
+<script lang="ts">
+import {onMounted, defineComponent, reactive, toRefs} from 'vue'
 import getOrigin from '/@/utils/origin'
 import { Plus } from '@element-plus/icons-vue'
 
-const url = ref()
-const uploadUrl = getOrigin(import.meta.env.VITE_API_URL + '/common/singleFile')
-const headers = {
-	Authorization: 'Bearer ' + localStorage.token,
+interface FromState {
+  dataList: any,
+  formData: any,
+  disable: boolean,
 }
-const emit = defineEmits(['SetSaveData'])
-
-const props = defineProps({
-	Datalist: {
-		type: Array,
-		default: () => [],
-	},
-})
-
-const formData = ref({})
 
-onMounted(() => {
-	for (const item of props.Datalist) {
-		formData.value[item.name] = item.value ? item.value : ''
-	}
+export default defineComponent({
+  name: 'dossierFromData',
+  props: {
+    DataList: {
+      type: Array,
+      default: () => [],
+    },
+    disable: {
+      type: Boolean,
+      default: () => false,
+    }
+  },
+  setup(prop, { emit }) {
+    const uploadUrl = getOrigin(import.meta.env.VITE_API_URL + '/common/singleFile')
+    const headers = {
+      Authorization: 'Bearer ' + localStorage.token,
+    }
+    // const emit = defineEmits(['SetSaveData'])
+
+    const state = reactive<FromState>({
+      dataList: prop.DataList,
+      formData: {},
+      disable: prop.disable,
+    })
+
+    onMounted(() => {
+      initFormData();
+    });
+
+    const initFormData = () => {
+      for (const item of state.dataList) {
+        state.formData[item.name] = item.value ? item.value : ''
+      }
+    }
+
+    const customCallback = (customValue: string) => {
+      return function (file: any) {
+        state.formData[customValue] = file.data.full_path
+        saveData();
+      }
+    }
+
+    const saveData = () => {
+      const updatedData = []
+
+      for (const item of state.dataList) {
+        updatedData.push({
+          productKey: item.productKey,
+          name: item.name,
+          value: state.formData[item.name], // 更新为formData的实际值
+          fieldName: item.fieldName,
+        })
+      }
+
+      emit('SetSaveData', updatedData)
+    }
+
+    return {
+      headers,
+      uploadUrl,
+      customCallback,
+      saveData,
+      ...toRefs(state),
+    };
+  },
+
+  components: {Plus},
 })
-
-const customCallback = (customValue: string) => {
-	return function (file: any) {
-		formData.value[customValue] = file.data.full_path
-		saveData();
-	}
-}
-
-const saveData = () => {
-	const updatedData = []
-
-	for (const item of props.Datalist) {
-		updatedData.push({
-			productKey: item.productKey,
-			name: item.name,
-			value: formData.value[item.name], // 更新为formData的实际值
-			fieldName: item.fieldName,
-		})
-	}
-
-	emit('SetSaveData', updatedData)
-}
 </script>
 
 <style scoped lang="scss">
@@ -91,7 +120,7 @@ const saveData = () => {
 	display: block;
 }
 </style>
-<style>
+<style scoped>
 .avatar-uploader .el-upload {
 	border: 1px dashed var(--el-border-color);
 	border-radius: 6px;

+ 3 - 3
src/views/iot/property/dossier/edit.vue

@@ -40,7 +40,6 @@
         </el-col>
       </el-row>
 
-
       <el-row>
         <el-col :span="12">
           <el-form-item label="所属区域" prop="area">
@@ -60,7 +59,6 @@
         </el-col>
       </el-row>
 
-
       <el-row>
         <el-col :span="12">
           <el-form-item label="所属部门" prop="deptId">
@@ -81,7 +79,8 @@
       </el-row>
 
       <el-divider content-position="left" v-if="Datalist">自定义属性</el-divider>
-        <FromData :Datalist="Datalist" @SetSaveData="SetSaveData" v-if="Datalist && Datalist.length > 0"></FromData>
+      <FromData :DataList="Datalist" @SetSaveData="SetSaveData" v-if="Datalist && Datalist.length > 0"></FromData>
+
     </el-form>
     <template #footer>
       <div class="dialog-footer">
@@ -207,6 +206,7 @@ const open = async (row: any, productInfo: any) => {
     });
 
     if (row.id) {
+
       api.dev_asset.detail({ deviceKey: row.deviceKey }).then((resde: any) => {
         Object.assign(formData, { ...resde });
         formData.productKey = row.productKey

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

@@ -115,7 +115,7 @@ onMounted(() => {
 })
 const addOrEdit = async (row?: any) => {
 	if (row) {
-		editFormRef.value.open(row, productIno.value)
+    editFormRef.value.open(row, productIno.value)
 		return
 	} else {
 		editFormRef.value.open({}, productIno.value)

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

@@ -120,7 +120,7 @@ const open = async (row: any) => {
 
 defineExpose({ open });
 </script>
-<style>
+<style scoped>
 .vertical-form-item {
 	display: block;
 	margin-bottom: 10px;

+ 1 - 1
src/views/system/assess/component/editAttr.vue

@@ -203,7 +203,7 @@ export default defineComponent({
 }
 </style>
 
-<style>
+<style scoped>
 .avatar-uploader .el-upload {
 	border: 1px dashed var(--el-border-color);
 	border-radius: 6px;

+ 1 - 1
src/views/system/assess/component/editEvent.vue

@@ -210,7 +210,7 @@ export default defineComponent({
 }
 </style>
 
-<style>
+<style scoped>
 .avatar-uploader .el-upload {
 	border: 1px dashed var(--el-border-color);
 	border-radius: 6px;

+ 1 - 1
src/views/system/assess/component/editFun.vue

@@ -162,7 +162,7 @@ export default defineComponent({
 }
 </style>
 
-<style>
+<style scoped>
 .avatar-uploader .el-upload {
   border: 1px dashed var(--el-border-color);
   border-radius: 6px;

+ 1 - 1
src/views/system/assess/component/editPro.vue

@@ -236,7 +236,7 @@ export default defineComponent({
 }
 </style>
 
-<style>
+<style scoped>
 .avatar-uploader .el-upload {
   border: 1px dashed var(--el-border-color);
   border-radius: 6px;

+ 1 - 1
src/views/system/assess/component/editTab.vue

@@ -204,7 +204,7 @@ export default defineComponent({
 }
 </style>
 
-<style>
+<style scoped>
 .avatar-uploader .el-upload {
 	border: 1px dashed var(--el-border-color);
 	border-radius: 6px;

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

@@ -223,7 +223,7 @@ export default defineComponent({
   },
 });
 </script>
-<style>
+<style scoped>
 .content {
   background: #fff;
   width: 100%;

+ 1 - 1
src/views/system/datahub/source/component/editNode.vue

@@ -457,7 +457,7 @@ export default defineComponent({
 	},
 });
 </script>
-<style>
+<style scoped>
 .el-input__wrapper {
 	width: 98%;
 }

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

@@ -346,7 +346,7 @@ export default defineComponent({
 	},
 });
 </script>
-<style>
+<style scoped>
 .content {
 	background: #fff;
 	width: 100%;

+ 1 - 1
src/views/system/manage/blacklist/component/editPro.vue

@@ -144,7 +144,7 @@ export default defineComponent({
 }
 </style>
 
-<style>
+<style scoped>
 .avatar-uploader .el-upload {
   border: 1px dashed var(--el-border-color);
   border-radius: 6px;

+ 5 - 4
src/views/system/manage/user/index.vue

@@ -1,6 +1,6 @@
 <template>
-	<div class="page flex-row gap-5">
-		<el-card shadow="nover">
+	<div class="page flex-row gap-4">
+		<el-card shadow="nover" style="width:270px">
 			<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">
@@ -8,10 +8,11 @@
 						<div class="custom-tree-node" :title="node.label">
 							{{ node.label }}
 						</div>
-					</template></el-tree>
+					</template>
+				</el-tree>
 			</el-scrollbar>
 		</el-card>
-		<el-card shadow="nover">
+		<el-card shadow="nover" class="flex1">
 			<el-form :model="tableData.param" ref="queryRef" inline label-width="68px">
 				<el-form-item label="关键字" prop="keyWords">
 					<el-input v-model="tableData.param.keyWords" placeholder="请输入用户名或姓名" clearable style="width: 240px" @keyup.enter.native="userList" />