Kaynağa Gözat

fix: 物联管理中其他内页页面的样式优化

yanglzh 1 yıl önce
ebeveyn
işleme
8bf1d4f5c5
43 değiştirilmiş dosya ile 1220 ekleme ve 1365 silme
  1. 4 1
      README.md
  2. 0 2
      src/hooks/useCommonIce104.ts
  3. 0 5
      src/theme/fast.scss
  4. 7 7
      src/views/iot/alarm/setting/index.vue
  5. 4 4
      src/views/iot/certificate/index.vue
  6. 4 4
      src/views/iot/device/channel/component/detail.vue
  7. 4 4
      src/views/iot/device/channel/component/edit.vue
  8. 5 5
      src/views/iot/device/channel/component/taskDialog.vue
  9. 2 2
      src/views/iot/device/instance/component/subDevice.vue
  10. 2 2
      src/views/iot/device/instance/detail.vue
  11. 5 5
      src/views/iot/device/template/component/deviceTemplateDialog.vue
  12. 5 5
      src/views/iot/device/template/component/edit.vue
  13. 2 2
      src/views/iot/device/template/detail.vue
  14. 29 35
      src/views/iot/ice104/device/component/edit.vue
  15. 45 46
      src/views/iot/ice104/device/component/editDeviceForm.vue
  16. 9 11
      src/views/iot/ice104/device/detail.vue
  17. 29 35
      src/views/iot/ice104/template/component/addOrEditTemplateTask.vue
  18. 28 43
      src/views/iot/ice104/template/component/edit.vue
  19. 41 49
      src/views/iot/ice104/template/component/editTemplateForm.vue
  20. 10 12
      src/views/iot/ice104/template/detail.vue
  21. 1 1
      src/views/iot/iotmanager/dashboard.vue
  22. 1 1
      src/views/iot/network/server/create.vue
  23. 4 4
      src/views/iot/network/server/detail.vue
  24. 357 357
      src/views/iot/network/server/edit.vue
  25. 71 70
      src/views/iot/network/tunnel/component/serverDetail.vue
  26. 9 13
      src/views/iot/network/tunnel/detail.vue
  27. 1 1
      src/views/iot/network/tunnel/edit.vue
  28. 78 120
      src/views/iot/noticeservices/config/setting.vue
  29. 84 90
      src/views/iot/ota-update/update/component/batch.vue
  30. 48 43
      src/views/iot/ota-update/update/component/info.vue
  31. 41 74
      src/views/iot/ota-update/update/detail.vue
  32. 76 81
      src/views/iot/property/attribute/index.vue
  33. 3 3
      src/views/iot/property/dossier/edit.vue
  34. 80 85
      src/views/iot/property/dossier/index.vue
  35. 4 4
      src/views/iot/scene/list/index.vue
  36. 61 64
      src/views/iot/scene/manage/component/actionItem.vue
  37. 54 55
      src/views/iot/scene/manage/detail.vue
  38. 7 15
      src/views/iot/scene/manage/index.vue
  39. 1 1
      src/views/system/config/index.vue
  40. 1 1
      src/views/system/datahub/source/detail.vue
  41. 1 1
      src/views/system/dict/index.vue
  42. 1 1
      src/views/system/monitor/lastLinesLog/index.vue
  43. 1 1
      src/views/system/monitor/server/index.vue

+ 4 - 1
README.md

@@ -21,4 +21,7 @@
 
 **.env.development.local**
 
-| 可在本地添加此文件进行配置,会覆盖默认配置及【.env.development】的配置,并且git会忽略这个文件,不会对其他的开发者的环境造成影响
+| 可在本地添加此文件进行配置,会覆盖默认配置及【.env.development】的配置,并且git会忽略这个文件,不会对其他的开发者的环境造成影响
+
+
+<el-form :model="params" inline ref="queryRef" @submit.prevent @keyup.enter="queryList">

+ 0 - 2
src/hooks/useCommonIce104.ts

@@ -53,9 +53,7 @@ export function useSearch<T>(api: any, resKey: string, expandParams?: any) {
     loading.value = true;
     params.total = 0;
     let res = await api(params).finally(() => loading.value = false)
-    console.log(res)
     tableData.value = (resKey ? (res[resKey]) : (res)) || [];
-    console.log(tableData.value)
     params.total = res.total;
   };
 

+ 0 - 5
src/theme/fast.scss

@@ -22,11 +22,6 @@
 		border: 1px solid var(--next-border-color-light);
 	}
 
-	&:hover {
-		box-shadow: 0 2px 12px var(--next-color-dark-hover);
-		transition: all ease 0.3s;
-	}
-
 	> .el-card,
 	&.el-card {
 		height: 100%;

+ 7 - 7
src/views/iot/alarm/setting/index.vue

@@ -1,14 +1,14 @@
 <template>
-	<div class="page page-full">
+	<div class="page padding bg page-full">
 		<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-button type="primary" @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-button type="primary" @click="onOpenLevel" v-auth="'level'">
 					<el-icon>
 						<ele-Setting />
 					</el-icon>
@@ -16,7 +16,7 @@
 				</el-button>
 			</el-form-item>
 		</el-form>
-		<el-divider />
+		<el-divider class="my-5" />
 		<el-row class="page-full-part">
 			<el-col :span="6" v-for="(item, index) in tableData.data" :key="index">
 				<div class="card">
@@ -28,20 +28,20 @@
 								</div>
 								<div class="card-item-body">
 									<div class="card-item-header">
-										<div class="" v-col="'name'">
+										<div v-col="'name'">
 											<div class="ellipsis card-item-header-name" style="width: 100%; height: 45px">{{ item.name }}</div>
 										</div>
 									</div>
 									<div class="card-item-content" v-col="'alarm'">
 										<div>
 											<label>触发:</label>
-											<div class="">
+											<div>
 												<div>级别:</div>
 											</div>
 										</div>
 										<div>
 											<label>{{ item.triggerTypeName }}</label>
-											<div class="">
+											<div>
 												<div>{{ item.alarmLevel.name }}</div>
 											</div>
 										</div>

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

@@ -1,9 +1,9 @@
 <template>
 	<div class="page">
 		<el-card shadow="nover">
-			<el-form :model="state.tableData.param" ref="queryRef" inline label-width="60px">
-				<el-form-item label="关键字" prop="keyWord">
-					<el-input v-model="state.tableData.param.name" placeholder="请输入关键字" clearable @keyup.enter="queryList" />
+			<el-form :model="state.tableData.param" ref="queryRef" inline @submit.prevent @keyup.enter="queryList">
+				<el-form-item label="证书名称" prop="keyWord">
+					<el-input v-model="state.tableData.param.name" placeholder="请输入证书名称" clearable />
 				</el-form-item>
 				<el-form-item>
 					<el-button v-auth="'query'" type="primary" class="ml10" @click="queryList">
@@ -44,7 +44,7 @@
 						<span v-noauth="'startOrStop'">{{ scope.row.status ? '正常' : '暂停' }}</span>
 					</template>
 				</el-table-column>
-				<el-table-column v-col="'handle'" label="操作" width="180" align="center" fixed="right">
+				<el-table-column v-col="'handle'" label="操作" width="100" align="center" fixed="right">
 					<template #default="scope">
 						<el-button size="small" v-auth="'edit'" text type="primary" @click="operate('editParams', scope.row)">编辑</el-button>
 						<el-button size="small" v-auth="'del'" text type="info" @click="operate('delete', scope.row)">删除</el-button>

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

@@ -1,5 +1,5 @@
 <template>
-	<el-dialog title="设备通道详情" v-model="dialogVisible" width="900px" :before-close="clsoeDialog" :close-on-click-modal="false">
+	<el-dialog title="设备通道详情" v-model="dialogVisible" width="900px" :before-close="closeDialog" :close-on-click-modal="false">
 		<div class="page-full" style="height: 60vh;">
 			<el-tabs v-model="activeName">
 				<el-tab-pane label="通道信息" name="1">
@@ -18,7 +18,7 @@
           </el-form-item> -->
 						<el-form-item label="" prop="">
 							<div align="right">
-								<el-button @click="clsoeDialog"> 取 消 </el-button>
+								<el-button @click="closeDialog"> 取 消 </el-button>
 								<!-- <el-button type="primary" @click="updateData()"> 保 存 </el-button> -->
 							</div>
 						</el-form-item>
@@ -116,7 +116,7 @@ export default {
 		downloadLog() {
 			window.open(getOrigin(import.meta.env.VITE_MODBUS_API) + '/debug/export_message?number=' + this.temp.number);
 		},
-		clsoeDialog() {
+		closeDialog() {
 			this.dialogVisible = false;
 			this.activeName = '1';
 			(this.$refs['dataForm'] as any).resetFields();
@@ -128,7 +128,7 @@ export default {
 					const tempData = Object.assign({}, this.temp);
 					api.channel.editDevice(tempData).then(() => {
 						this.$emit('getList');
-						this.clsoeDialog();
+						this.closeDialog();
 						ElMessage.success('操作成功!');
 					});
 				}

+ 4 - 4
src/views/iot/device/channel/component/edit.vue

@@ -1,5 +1,5 @@
 <template>
-	<el-dialog title="添加设备通道" v-model="dialogVisible" width="600px" :before-close="clsoeDialog" :close-on-click-modal="false">
+	<el-dialog title="添加设备通道" v-model="dialogVisible" width="600px" :before-close="closeDialog" :close-on-click-modal="false">
 		<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.trim="temp.title" placeholder="请输入通道名称" />
@@ -12,7 +12,7 @@
 			</el-form-item>
 		</el-form>
 		<template #footer class="dialog-footer">
-			<el-button @click="clsoeDialog()"> 取 消 </el-button>
+			<el-button @click="closeDialog()"> 取 消 </el-button>
 			<el-button type="primary" @click="createData()"> 保 存 </el-button>
 		</template>
 	</el-dialog>
@@ -46,7 +46,7 @@ export default {
 			// this.getList();
 			this.dialogVisible = true;
 		},
-		clsoeDialog() {
+		closeDialog() {
 			(this.$refs.dataForm as any).resetFields();
 			this.dialogVisible = false;
 		},
@@ -67,7 +67,7 @@ export default {
 				if (valid) {
 					api.channel.addDevice(this.temp).then(() => {
 						this.$emit('getList');
-						this.clsoeDialog();
+						this.closeDialog();
 						ElMessage.success('操作成功!');
 					});
 				}

+ 5 - 5
src/views/iot/device/channel/component/taskDialog.vue

@@ -1,5 +1,5 @@
 <template>
-	<el-dialog :title="textMap[dialogStatus]" v-model="dialogVisible" width="500px" :before-close="clsoeDialog" append-to-body :close-on-click-modal="false">
+	<el-dialog :title="textMap[dialogStatus]" v-model="dialogVisible" width="500px" :before-close="closeDialog" append-to-body :close-on-click-modal="false">
 		<el-form ref="dataForm" :rules="rules" :model="temp" label-width="80px">
 			<el-form-item label="标题" prop="title">
 				<el-input v-model="temp.title" placeholder="请输入标题" />
@@ -22,7 +22,7 @@
 			</el-form-item>
 		</el-form>
 		<template #footer class="dialog-footer">
-			<el-button @click="clsoeDialog"> 取 消 </el-button>
+			<el-button @click="closeDialog"> 取 消 </el-button>
 			<el-button type="primary" @click="dialogStatus === 'create' ? createData() : updateData()"> 保 存 </el-button>
 		</template>
 	</el-dialog>
@@ -83,7 +83,7 @@ export default {
 			this.getTemplateList();
 			this.dialogVisible = true;
 		},
-		clsoeDialog() {
+		closeDialog() {
 			this.dialogVisible = false;
 			this.temp = {
 				title: '',
@@ -113,7 +113,7 @@ export default {
 				if (valid) {
 					api.task.addDeviceJob(this.temp).then(() => {
 						this.$emit('finish');
-						this.clsoeDialog();
+						this.closeDialog();
 						ElMessage.success('操作成功!');
 					});
 				}
@@ -124,7 +124,7 @@ export default {
 				if (valid) {
 					api.task.editDeviceJob(this.temp).then(() => {
 						this.$emit('finish');
-						this.clsoeDialog();
+						this.closeDialog();
 						ElMessage.success('操作成功!');
 					});
 				}

+ 2 - 2
src/views/iot/device/instance/component/subDevice.vue

@@ -11,7 +11,7 @@
 			</div>
 
 			<div class="content-box">
-				<el-tabs v-model="activeName" class="demo-tabs" @tab-click="handleClick">
+				<el-tabs v-model="activeName" @tab-click="handleClick">
 					<el-tab-pane label="运行状态" name="3">
 						<div style="display: flex; padding: 10px; flex-wrap: wrap">
 							<div class="ant-card">
@@ -50,7 +50,7 @@
 									</div>
 
 									<div class="statusname">{{ item.value }}{{ item.unit }}</div>
-									<div class="">
+									<div>
 										<devantd :json="item.list" :antdid="item.key" v-if="item.type == 'int' || item.type == 'float'" />
 									</div>
 								</div>

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

@@ -10,7 +10,7 @@
     </div>
 
     <div class="content-box">
-      <el-tabs v-model="activeName" class="demo-tabs" @tab-click="handleClick">
+      <el-tabs v-model="activeName" @tab-click="handleClick">
 
         <el-tab-pane label="运行状态" name="3">
           <div style=" display: flex; padding: 10px;flex-wrap: wrap;">
@@ -62,7 +62,7 @@
                     <div class="name">{{ vare }}</div> -->
                   </div>
                 </div>
-                <div class="">
+                <div>
                   <devantd :json="item.list" :antdid="item.key" v-if="item.type == 'int' || item.type == 'float' || item.type == 'string'" />
                 </div>
               </div>

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

@@ -19,7 +19,7 @@
 		</el-table>
 		<pagination v-show="total > 0" :total="total" v-model:page="listQuery.page" v-model:limit="listQuery.size" @pagination="getList()" style="padding: 20px 0 0 !important" />
 
-		<el-dialog :title="textMap[dialogStatus]" v-model="dialogVisible" width="850px" :before-close="clsoeDialog" close="var-dialog" append-to-body :close-on-click-modal="false">
+		<el-dialog :title="textMap[dialogStatus]" v-model="dialogVisible" width="850px" :before-close="closeDialog" close="var-dialog" append-to-body :close-on-click-modal="false">
 			<el-form ref="dataForm" :rules="rules" :model="temp" label-position="right" label-width="95px">
 				<el-row>
 					<el-col :span="8">
@@ -94,7 +94,7 @@
 				</el-row>
 			</el-form>
 			<template #footer class="dialog-footer">
-				<el-button @click="clsoeDialog"> 取 消 </el-button>
+				<el-button @click="closeDialog"> 取 消 </el-button>
 				<el-button type="primary" @click="dialogStatus === 'create' ? createData() : updateData()"> 保 存 </el-button>
 			</template>
 		</el-dialog>
@@ -224,7 +224,7 @@ export default {
 				this.$refs['dataForm'].clearValidate();
 			});
 		},
-		clsoeDialog() {
+		closeDialog() {
 			this.dialogVisible = false;
 			// this.$refs.dataForm.resetFields()
 			this.temp = {
@@ -248,7 +248,7 @@ export default {
 					const tempData = Object.assign({}, this.temp);
 					api.data.addDeviceTemplate(tempData).then(() => {
 						this.handleFilter();
-						this.clsoeDialog();
+						this.closeDialog();
 						ElMessage.success('添加成功!');
 					});
 				}
@@ -264,7 +264,7 @@ export default {
 					const tempData = Object.assign({}, this.temp);
 					api.data.editDeviceTemplate(tempData).then(() => {
 						this.handleFilter();
-						this.clsoeDialog();
+						this.closeDialog();
 						ElMessage.success('操作成功!');
 					});
 				}

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

@@ -1,5 +1,5 @@
 <template>
-	<el-dialog :title="textMap[dialogStatus]" v-model="dialogVisible" :width="dialogWidth" :before-close="clsoeDialog" :close-on-click-modal="false">
+	<el-dialog :title="textMap[dialogStatus]" v-model="dialogVisible" :width="dialogWidth" :before-close="closeDialog" :close-on-click-modal="false">
 		<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">
@@ -25,7 +25,7 @@
 			</el-tabs>
 		</div>
 		<template #footer class="dialog-footer">
-			<el-button @click="clsoeDialog"> 取 消 </el-button>
+			<el-button @click="closeDialog"> 取 消 </el-button>
 			<el-button type="primary" @click="dialogStatus === 'create' ? createData() : updateData()"> 保 存 </el-button>
 		</template>
 	</el-dialog>
@@ -85,7 +85,7 @@ export default {
 				this.getDataId();
 			}
 		},
-		clsoeDialog() {
+		closeDialog() {
 			this.activeName = '1';
 			this.temp = {
 				title: '',
@@ -107,7 +107,7 @@ export default {
 				if (valid) {
 					api.template.addTemplate(this.temp).then(() => {
 						this.$emit('getList');
-						this.clsoeDialog();
+						this.closeDialog();
 						ElMessage.success('操作成功!');
 					});
 				}
@@ -118,7 +118,7 @@ export default {
 				if (valid) {
 					api.template.editTemplate(this.temp).then(() => {
 						this.$emit('getList');
-						this.clsoeDialog();
+						this.closeDialog();
 						ElMessage.success('操作成功!');
 					});
 				}

+ 2 - 2
src/views/iot/device/template/detail.vue

@@ -10,7 +10,7 @@
 		</div>
 
 		<div class="content-box">
-			<el-tabs v-model="activeName" class="demo-tabs" @tab-click="handleClick">
+			<el-tabs v-model="activeName" @tab-click="handleClick">
 				<el-tab-pane label="运行状态" name="3">
 					<div style="display: flex; padding: 10px; flex-wrap: wrap">
 						<div class="ant-card">
@@ -49,7 +49,7 @@
 								</div>
 
 								<div class="statusname">{{ item.value }}{{ item.unit }}</div>
-								<div class="">
+								<div>
 									<devantd :json="item.list" :antdid="item.key" v-if="item.type == 'int' || item.type == 'float'" />
 								</div>
 							</div>

+ 29 - 35
src/views/iot/ice104/device/component/edit.vue

@@ -1,12 +1,6 @@
 <template>
-	<el-dialog
-		:title="isEdit ? '修改设备' : '添加设备'"
-		v-model="dialogVisible"
-		width="600px"
-		:before-close="closeDialog"
-		:close-on-click-modal="false"
-	>
-		<el-form ref="formRef" :rules="formRules" :model="ruleForm" label-position="left" label-width="120px" style="width: 90%; margin: 0 auto">
+	<el-dialog :title="isEdit ? '修改设备' : '添加设备'" v-model="dialogVisible" width="600px" :before-close="closeDialog" :close-on-click-modal="false">
+		<el-form ref="formRef" :rules="formRules" :model="ruleForm" label-position="right" label-width="120px">
 			<el-form-item label="设备编码" prop="number">
 				<el-input :disabled="isEdit" v-model="ruleForm.number" placeholder="请输入设备编码" />
 			</el-form-item>
@@ -82,33 +76,33 @@ const submitData = async () => {
 			api.device.editItem({
 				...ruleForm.value,
 			})
-			.then(() => {
-				ElMessage({ type: 'success', message: '修改成功' })
-				emit('updateList')
-				closeDialog()
-			})
-			.finally(() => (btnLoading.value = false))
+				.then(() => {
+					ElMessage({ type: 'success', message: '修改成功' })
+					emit('updateList')
+					closeDialog()
+				})
+				.finally(() => (btnLoading.value = false))
 		} else {
 			// 新增
 			api.device.addItem(ruleForm.value)
-			.then(() => {
-				ElMessage({ type: 'success', message: '添加成功' })
-				emit('updateList')
-				closeDialog()
-			})
-			.finally(() => (btnLoading.value = false))
+				.then(() => {
+					ElMessage({ type: 'success', message: '添加成功' })
+					emit('updateList')
+					closeDialog()
+				})
+				.finally(() => (btnLoading.value = false))
 		}
 	})
 }
 
-const handleProductChange = (data:any) => {
+const handleProductChange = (data: any) => {
 	ruleForm.value.deviceKey = "";
-	let findItem:any = productList.value.find((v: any) => v.key === data);
+	let findItem: any = productList.value.find((v: any) => v.key === data);
 	getDeviceList(findItem.id)
 }
 
-const getDeviceList = (id:number) => {
-	apiDevice.device.allList({productId: id}).then((res: any) => {
+const getDeviceList = (id: number) => {
+	apiDevice.device.allList({ productId: id }).then((res: any) => {
 		deviceList.value = res.device
 	})
 }
@@ -117,16 +111,16 @@ const getDeviceList = (id:number) => {
  * 关闭弹窗
  */
 const closeDialog = () => {
-  dialogVisible.value = false;
-  ruleForm.value = {
-	number: '',
-	title: '',
-	commonAddr: '',
-	subCode: '',
-	templateNumber: '',
-	productKey: '',
-	deviceKey: ''
-  }
+	dialogVisible.value = false;
+	ruleForm.value = {
+		number: '',
+		title: '',
+		commonAddr: '',
+		subCode: '',
+		templateNumber: '',
+		productKey: '',
+		deviceKey: ''
+	}
 }
 
 
@@ -135,7 +129,7 @@ const open = async (row: any) => {
 	if (row && row.number.toString()) {
 		ruleForm.value = row;
 		isEdit.value = true;
-	}else {
+	} else {
 		isEdit.value = false;
 	}
 }

+ 45 - 46
src/views/iot/ice104/device/component/editDeviceForm.vue

@@ -1,41 +1,40 @@
 <template>
-    <el-form ref="formRef" :rules="formRules" :model="ruleForm" label-position="left" label-width="120px" style="width: 70%;">
-        <el-form-item label="设备编码" prop="number">
-            <el-input :disabled="isEdit" v-model="ruleForm.number" placeholder="请输入设备编码" />
-        </el-form-item>
-        <el-form-item label="名称">
-            <el-input v-model="ruleForm.title" placeholder="请输入名称" />
-        </el-form-item>
-        <el-form-item label="设备通用地址">
-            <el-input type="number" v-model.number="ruleForm.commonAddr" placeholder="请输入设备通用地址" />
-        </el-form-item>
-        <el-form-item label="mac地址">
-            <el-input v-model="ruleForm.subCode" placeholder="请输入mac地址" />
-        </el-form-item>
-        <el-form-item label="模版编号">
-            <el-select v-model="ruleForm.templateNumber" placeholder="请选择模版编号" class="width100">
-                <el-option :label="item.title" :value="item.number" v-for="(item, index) in tableData" :key="index" />
-            </el-select>
-        </el-form-item>
-        <el-form-item label="产品key">
-            <el-select @change="(val) => handleProductChange(val, true)" v-model="ruleForm.productKey" placeholder="请选择产品key" class="width100">
-                <el-option :label="item.name" :value="item.key" v-for="(item, index) in productList" :key="index" />
-            </el-select>
-        </el-form-item>
-        <el-form-item label="设备key" v-if="ruleForm.productKey">
-            <el-select v-model="ruleForm.deviceKey" placeholder="请选择设备key" class="width100">
-                <el-option :label="item.name" :value="item.key" v-for="(item, index) in deviceList" :key="index" />
-            </el-select>
-        </el-form-item>
-        <el-form-item>
-            <el-button type="primary" v-auth="'save'" :loading="btnLoading" @click="submitData"> 保 存 </el-button>
-        </el-form-item>
-    </el-form>
+	<el-form ref="formRef" :rules="formRules" :model="ruleForm" label-position="right" label-width="110px" style="width: 70%;">
+		<el-form-item label="设备编码" prop="number">
+			<el-input :disabled="isEdit" v-model="ruleForm.number" placeholder="请输入设备编码" />
+		</el-form-item>
+		<el-form-item label="名称">
+			<el-input v-model="ruleForm.title" placeholder="请输入名称" />
+		</el-form-item>
+		<el-form-item label="设备通用地址">
+			<el-input type="number" v-model.number="ruleForm.commonAddr" placeholder="请输入设备通用地址" />
+		</el-form-item>
+		<el-form-item label="mac地址">
+			<el-input v-model="ruleForm.subCode" placeholder="请输入mac地址" />
+		</el-form-item>
+		<el-form-item label="模版编号">
+			<el-select v-model="ruleForm.templateNumber" placeholder="请选择模版编号" class="width100">
+				<el-option :label="item.title" :value="item.number" v-for="(item, index) in tableData" :key="index" />
+			</el-select>
+		</el-form-item>
+		<el-form-item label="产品key">
+			<el-select @change="(val) => handleProductChange(val, true)" v-model="ruleForm.productKey" placeholder="请选择产品key" class="width100">
+				<el-option :label="item.name" :value="item.key" v-for="(item, index) in productList" :key="index" />
+			</el-select>
+		</el-form-item>
+		<el-form-item label="设备key" v-if="ruleForm.productKey">
+			<el-select v-model="ruleForm.deviceKey" placeholder="请选择设备key" class="width100">
+				<el-option :label="item.name" :value="item.key" v-for="(item, index) in deviceList" :key="index" />
+			</el-select>
+		</el-form-item>
+		<el-form-item>
+			<el-button type="primary" v-auth="'save'" :loading="btnLoading" @click="submitData"> 保 存 </el-button>
+		</el-form-item>
+	</el-form>
 </template>
 <script lang="ts" setup>
-import { computed, reactive, ref, onMounted } from 'vue';
+import { computed, ref, onMounted } from 'vue';
 import api from '/@/api/ice104/index';
-import { useI18n } from 'vue-i18n';
 import { ElMessage } from 'element-plus';
 import { useSearch } from '/@/hooks/useCommonIce104';
 import apiDevice from '/@/api/device';
@@ -72,26 +71,26 @@ const submitData = async () => {
 			api.device.editItem({
 				...ruleForm.value,
 			})
-			.then(() => {
-				ElMessage({ type: 'success', message: '修改成功' })
-				emit('updateList')
-			})
-			.finally(() => (btnLoading.value = false))
+				.then(() => {
+					ElMessage({ type: 'success', message: '修改成功' })
+					emit('updateList')
+				})
+				.finally(() => (btnLoading.value = false))
 		}
 	})
 }
 
-const handleProductChange = (data:any, isClear: boolean) => {
-	if(isClear) {
+const handleProductChange = (data: any, isClear: boolean) => {
+	if (isClear) {
 		ruleForm.value.deviceKey = "";
 	}
-	let findItem:any = productList.value.find((v: any) => v.key === data);
-	if(!findItem) return;
+	let findItem: any = productList.value.find((v: any) => v.key === data);
+	if (!findItem) return;
 	getDeviceList(findItem.id)
 }
 
-const getDeviceList = (id:number) => {
-	apiDevice.device.allList({productId: id}).then((res: any) => {
+const getDeviceList = (id: number) => {
+	apiDevice.device.allList({ productId: id }).then((res: any) => {
 		deviceList.value = res.device
 	})
 }
@@ -102,7 +101,7 @@ const open = async (row: any) => {
 		ruleForm.value = row;
 		isEdit.value = true;
 		handleProductChange(ruleForm.value.productKey, false)
-	}else {
+	} else {
 		isEdit.value = false;
 	}
 }

+ 9 - 11
src/views/iot/ice104/device/detail.vue

@@ -7,17 +7,15 @@
  * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
 -->
 <template>
-	<div class="page page-full">
-		<el-card shadow="nover" class="page-full-part">
-			<el-tabs v-model="activeName" class="demo-tabs">
-				<el-tab-pane label="设备详情" name="detail">
-					<EditDeviceForm ref="editFormRef" />
-				</el-tab-pane>
-				<el-tab-pane label="设备任务" name="task">
-					<DeviceTaskTable />
-				</el-tab-pane>
-			</el-tabs>
-		</el-card>
+	<div class="page border bg padding page-full Ipt-2">
+		<el-tabs v-model="activeName">
+			<el-tab-pane label="设备详情" name="detail">
+				<EditDeviceForm ref="editFormRef" />
+			</el-tab-pane>
+			<el-tab-pane label="设备任务" name="task">
+				<DeviceTaskTable />
+			</el-tab-pane>
+		</el-tabs>
 	</div>
 </template>
 

+ 29 - 35
src/views/iot/ice104/template/component/addOrEditTemplateTask.vue

@@ -1,13 +1,7 @@
 <!-- 添加或者修改设备 -->
 <template>
-	<el-dialog
-		:title="isEdit ? '修改模版点位' : '添加模版点位'"
-		v-model="dialogVisible"
-		width="600px"
-		:before-close="closeDialog"
-		:close-on-click-modal="false"
-	>
-		<el-form ref="formRef" :rules="formRules" :model="ruleForm" label-position="left" label-width="120px" style="width: 90%; margin: 0 auto">
+	<el-dialog :title="isEdit ? '修改模版点位' : '添加模版点位'" v-model="dialogVisible" width="600px" :before-close="closeDialog" :close-on-click-modal="false">
+		<el-form ref="formRef" :rules="formRules" :model="ruleForm" label-position="right" label-width="120px" style="width: 90%; margin: 0 auto">
 			<el-form-item label="点位名称" prop="title">
 				<el-input v-model="ruleForm.title" placeholder="请输入点位名称" />
 			</el-form-item>
@@ -43,7 +37,7 @@ const emit = defineEmits(['updateList']);
 
 const formRef = ref();
 const ruleForm = ref({
-    dtId: 0,
+	dtId: 0,
 	title: '',
 	templateNumber: route.params && route.params.id,
 	dataAttribName: '',
@@ -58,8 +52,8 @@ const formRules = computed(() => ({
 	dataAddress: [{ required: true, trigger: 'blur', message: '请输入数据项点位' }],
 	dataCoef: [{ required: true, trigger: 'blur', message: '请输入倍率' }],
 }));
-const getRandom = (num:number) =>{
-    return Math.floor((Math.random()+Math.floor(Math.random()*9+1))*Math.pow(10,num-1));
+const getRandom = (num: number) => {
+	return Math.floor((Math.random() + Math.floor(Math.random() * 9 + 1)) * Math.pow(10, num - 1));
 }
 const submitData = async () => {
 	formRef.value.validate((valid: boolean) => {
@@ -70,22 +64,22 @@ const submitData = async () => {
 			api.deviceTemplate.editItem({
 				...ruleForm.value,
 			})
-			.then(() => {
-				ElMessage({ type: 'success', message: '修改成功' })
-				emit('updateList')
-				closeDialog()
-			})
-			.finally(() => (btnLoading.value = false))
+				.then(() => {
+					ElMessage({ type: 'success', message: '修改成功' })
+					emit('updateList')
+					closeDialog()
+				})
+				.finally(() => (btnLoading.value = false))
 		} else {
 			// 新增
-            ruleForm.value.dtId = getRandom(10);
+			ruleForm.value.dtId = getRandom(10);
 			api.deviceTemplate.addItem(ruleForm.value)
-			.then(() => {
-				ElMessage({ type: 'success', message: '添加成功' })
-				emit('updateList')
-				closeDialog()
-			})
-			.finally(() => (btnLoading.value = false))
+				.then(() => {
+					ElMessage({ type: 'success', message: '添加成功' })
+					emit('updateList')
+					closeDialog()
+				})
+				.finally(() => (btnLoading.value = false))
 		}
 	})
 }
@@ -94,16 +88,16 @@ const submitData = async () => {
  * 关闭弹窗
  */
 const closeDialog = () => {
-  dialogVisible.value = false;
-  isEdit.value = false;
-  ruleForm.value = {
-    dtId: 0,
-	title: '',
-	templateNumber: route.params && route.params.id,
-	dataAttribName: '',
-	dataAddress: 0,
-	DataCoef: ''
-  }
+	dialogVisible.value = false;
+	isEdit.value = false;
+	ruleForm.value = {
+		dtId: 0,
+		title: '',
+		templateNumber: route.params && route.params.id,
+		dataAttribName: '',
+		dataAddress: 0,
+		DataCoef: ''
+	}
 }
 
 
@@ -113,7 +107,7 @@ const open = async (row: any) => {
 		row.DataCoef = row.dataCoef
 		ruleForm.value = row;
 		isEdit.value = true;
-	}else {
+	} else {
 		isEdit.value = false;
 	}
 }

+ 28 - 43
src/views/iot/ice104/template/component/edit.vue

@@ -1,12 +1,6 @@
 <template>
-	<el-dialog
-		:title="isEdit ? '修改模版' : '添加模版'"
-		v-model="dialogVisible"
-		width="600px"
-		:before-close="clsoeDialog"
-		:close-on-click-modal="false"
-	>
-		<el-form ref="formRef" :rules="formRules" :model="ruleForm" label-position="left" label-width="80px" style="width: 90%; margin: 0 auto">
+	<el-dialog :title="isEdit ? '修改模版' : '添加模版'" v-model="dialogVisible" width="600px" :before-close="closeDialog" :close-on-click-modal="false">
+		<el-form ref="formRef" :rules="formRules" :model="ruleForm" label-width="80px" style="width: 90%; margin: 0 auto">
 			<el-form-item label="模版编码" prop="number">
 				<el-input :disabled="isEdit" v-model="ruleForm.number" placeholder="请输入模版编码" />
 			</el-form-item>
@@ -14,31 +8,22 @@
 				<el-input v-model="ruleForm.title" placeholder="请输入模版名称" />
 			</el-form-item>
 			<el-form-item label="状态">
-				<el-switch
-					v-model="ruleForm.status"
-					inline-prompt
-					active-text="开"
-					inactive-text="关"
-					:active-value="1"
-					:inactive-value="0"
-					width="80"
-				/>
+				<el-switch v-model="ruleForm.status" inline-prompt active-text="开" inactive-text="关" :active-value="1" :inactive-value="0" width="80" />
 			</el-form-item>
-			
+
 			<el-form-item label="备注">
 				<el-input type="textarea" v-model="ruleForm.remarks" placeholder="请输入备注信息" />
 			</el-form-item>
 		</el-form>
 		<template #footer>
-			<el-button v-auth="'canceSaveTemplate'" @click="clsoeDialog()"> 取 消 </el-button>
+			<el-button v-auth="'canceSaveTemplate'" @click="closeDialog()"> 取 消 </el-button>
 			<el-button v-auth="'saveTemplate'" :loading="btnLoading" type="primary" @click="submitData"> 保 存 </el-button>
 		</template>
 	</el-dialog>
 </template>
 <script lang="ts" setup>
-import { computed, reactive, ref } from 'vue';
+import { computed, ref } from 'vue';
 import api from '/@/api/ice104/index';
-import { useI18n } from 'vue-i18n';
 import { ElMessage } from 'element-plus';
 
 const dialogVisible = ref(false);
@@ -67,46 +52,46 @@ const submitData = async () => {
 			api.template.editItem({
 				...ruleForm.value,
 			})
-			.then(() => {
-				ElMessage({ type: 'success', message: '修改成功' })
-				emit('updateList')
-				closeDialog()
-			})
-			.finally(() => (btnLoading.value = false))
+				.then(() => {
+					ElMessage({ type: 'success', message: '修改成功' })
+					emit('updateList')
+					closeDialog()
+				})
+				.finally(() => (btnLoading.value = false))
 		} else {
 			// 新增
 			api.template.addItem(ruleForm.value)
-			.then(() => {
-				ElMessage({ type: 'success', message: '添加成功' })
-				emit('updateList')
-				closeDialog()
-			})
-			.finally(() => (btnLoading.value = false))
+				.then(() => {
+					ElMessage({ type: 'success', message: '添加成功' })
+					emit('updateList')
+					closeDialog()
+				})
+				.finally(() => (btnLoading.value = false))
 		}
 	})
 }
 
+
 /**
  * 关闭弹窗
  */
 const closeDialog = () => {
-  dialogVisible.value = false;
-  ruleForm.value = {
-	number: '',
-	title: '',
-	status: 1,
-	remarks: "",
-	mode: 0
-  }
+	dialogVisible.value = false;
+	ruleForm.value = {
+		number: '',
+		title: '',
+		status: 1,
+		remarks: "",
+		mode: 0
+	}
 }
 
-
 const open = async (row: any) => {
 	dialogVisible.value = true
 	if (row && row.number.toString()) {
 		ruleForm.value = row;
 		isEdit.value = true;
-	}else {
+	} else {
 		isEdit.value = false;
 	}
 }

+ 41 - 49
src/views/iot/ice104/template/component/editTemplateForm.vue

@@ -1,31 +1,23 @@
 <template>
-    <el-form ref="formRef" :rules="formRules" :model="ruleForm" label-position="left" label-width="120px" style="width: 70%;">
-        <el-form-item label="模版编码" prop="number">
-            <el-input disabled v-model="ruleForm.number" placeholder="请输入模版编码" />
-        </el-form-item>
-        <el-form-item label="名称">
-            <el-input v-model="ruleForm.title" placeholder="请输入名称" />
-        </el-form-item>
-        <el-form-item label="状态">
-            <el-switch
-                v-model="ruleForm.status"
-                inline-prompt
-                active-text="开"
-                inactive-text="关"
-                :active-value="1"
-                :inactive-value="0"
-                width="80"
-            />
-        </el-form-item>
-        
-        <el-form-item label="备注">
-            <el-input type="textarea" v-model="ruleForm.remarks" placeholder="请输入备注信息" />
-        </el-form-item>
+  <el-form ref="formRef" :rules="formRules" :model="ruleForm" label-position="right" label-width="80px" style="width: 70%;">
+    <el-form-item label="模版编码" prop="number">
+      <el-input disabled v-model="ruleForm.number" placeholder="请输入模版编码" />
+    </el-form-item>
+    <el-form-item label="名称">
+      <el-input v-model="ruleForm.title" placeholder="请输入名称" />
+    </el-form-item>
+    <el-form-item label="状态">
+      <el-switch v-model="ruleForm.status" inline-prompt active-text="开" inactive-text="关" :active-value="1" :inactive-value="0" />
+    </el-form-item>
 
-        <el-form-item>
-            <el-button type="primary" :loading="btnLoading" @click="submitData"> 保 存 </el-button>
-        </el-form-item>
-    </el-form>
+    <el-form-item label="备注">
+      <el-input type="textarea" v-model="ruleForm.remarks" placeholder="请输入备注信息" />
+    </el-form-item>
+
+    <el-form-item>
+      <el-button type="primary" :loading="btnLoading" @click="submitData"> 保 存 </el-button>
+    </el-form-item>
+  </el-form>
 </template>
 <script lang="ts" setup>
 import { computed, reactive, ref, onMounted } from 'vue';
@@ -39,37 +31,37 @@ const btnLoading = ref(false);
 const emit = defineEmits(['updateList']);
 const formRef = ref();
 const ruleForm = ref({
-    number: '',
-	title: '',
-	status: 1,
-	remarks: "",
-	mode: 0
+  number: '',
+  title: '',
+  status: 1,
+  remarks: "",
+  mode: 0
 })
 
 const formRules = computed(() => ({
-	number: [{ required: true, trigger: 'change', message: '请输入设备编码' }],
+  number: [{ required: true, trigger: 'change', message: '请输入设备编码' }],
 }));
 
 const submitData = async () => {
-	formRef.value.validate((valid: boolean) => {
-		if (!valid) return
-		btnLoading.value = true
-		// 修改
-        api.template.editItem({
-            ...ruleForm.value,
-        })
-        .then(() => {
-            ElMessage({ type: 'success', message: '修改成功' })
-            emit('updateList')
-        })
-        .finally(() => (btnLoading.value = false))
-	})
+  formRef.value.validate((valid: boolean) => {
+    if (!valid) return
+    btnLoading.value = true
+    // 修改
+    api.template.editItem({
+      ...ruleForm.value,
+    })
+      .then(() => {
+        ElMessage({ type: 'success', message: '修改成功' })
+        emit('updateList')
+      })
+      .finally(() => (btnLoading.value = false))
+  })
 }
 
 const open = async (row: any) => {
-	if (row && row.number.toString()) {
-		ruleForm.value = row;
-	}
+  if (row && row.number.toString()) {
+    ruleForm.value = row;
+  }
 }
 
 defineExpose({ open })
@@ -77,6 +69,6 @@ defineExpose({ open })
 
 <style lang="scss" scoped>
 .width100 {
-	width: 100%;
+  width: 100%;
 }
 </style>

+ 10 - 12
src/views/iot/ice104/template/detail.vue

@@ -7,17 +7,15 @@
  * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
 -->
 <template>
-	<div class="page page-full">
-		<el-card shadow="nover" class="page-full-part">
-			<el-tabs v-model="activeName">
-				<el-tab-pane label="模版详情" name="detail">
-					<EditTemplateForm ref="editFormRef" />
-				</el-tab-pane>
-				<el-tab-pane label="模版点位" name="point">
-					<TemplateTaskTable />
-				</el-tab-pane>
-			</el-tabs>
-		</el-card>
+	<div class="page bg padding Ipt-2 page-full">
+		<el-tabs v-model="activeName">
+			<el-tab-pane label="模版详情" name="detail">
+				<EditTemplateForm ref="editFormRef" />
+			</el-tab-pane>
+			<el-tab-pane label="模版点位" name="point">
+				<TemplateTaskTable />
+			</el-tab-pane>
+		</el-tabs>
 	</div>
 </template>
 
@@ -50,7 +48,7 @@ const onDel = (row: any) => {
 		cancelButtonText: '取消',
 		type: 'warning',
 	}).then(async () => {
-		await api.device.deleteItem({number: row.number});
+		await api.device.deleteItem({ number: row.number });
 		ElMessage.success('删除成功');
 		getList();
 	});

+ 1 - 1
src/views/iot/iotmanager/dashboard.vue

@@ -3,7 +3,7 @@
 		<el-row :gutter="15" class="home-card-one mb15">
 			<el-col :xs="24" :sm="12" :md="12" :lg="6" :xl="6" v-for="(v, k) in homeOne" :key="k" :class="{ 'home-media home-media-lg': k > 1, 'home-media-sm': k === 1 }">
 				<div class="home-card-item ">
-					<div class="">{{ v.num3 }}</div>
+					<div>{{ v.num3 }}</div>
 					<div class="flex-margin flex w100" :class="` home-one-animation${k}`">
 						<div class="flex-auto">
 

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

@@ -1,6 +1,6 @@
 <template>
   <div class="page bg padding page-full Ipt-2" style="position: relative;">
-    <el-tabs v-model="activeName" class="demo-tabs" @tab-click="handleClick">
+    <el-tabs v-model="activeName" @tab-click="handleClick">
       <el-tab-pane label="新建服务器" name="first">
         <el-collapse v-model="activeViewName">
           <el-collapse-item title="基本信息" name="1">

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

@@ -1,18 +1,18 @@
 <template>
-	<el-card class="system-dic-container" style="position: relative;">
-		<el-tabs v-model="activeName" class="demo-tabs" @tab-click="handleClick">
+	<div class="page bg border padding Ipt-2" style="position: relative;">
+		<el-tabs v-model="activeName" @tab-click="handleClick">
 			<el-tab-pane label="服务器详情" name="first">
 				<serverDetail :detail="detail" />
 			</el-tab-pane>
 			<!-- <el-tab-pane label="相关详情" name="second">相关详情</el-tab-pane>
 			<el-tab-pane label="通道" name="third">通道</el-tab-pane> -->
 		</el-tabs>
-		<div style="position: absolute;right:20px;top: 34px;">
+		<div style="position: absolute;right:20px;top: 18px;">
 			<el-icon @click="freshData" style="font-size: 16px;margin-right:6px;"><ele-RefreshRight /></el-icon>
 			<!-- <el-icon style="font-size: 16px;margin: 0 6px;"><ele-Operation /></el-icon> -->
 			<el-icon @click="toEdit"  style="cursor: pointer;font-size: 16px;"><ele-Edit /></el-icon>
 		</div>
-	</el-card>
+	</div>
 </template>
 <script lang="ts">
 import { toRefs, reactive, onMounted, ref, defineComponent } from 'vue';

+ 357 - 357
src/views/iot/network/server/edit.vue

@@ -1,115 +1,115 @@
 <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" 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-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: 20px;">
-            <el-button size="medium" @click="$router.replace('/iotmanager/network/server')">取消</el-button>
-            <el-button @click="submit" size="medium" type="primary">提交</el-button>
-        </div>
-    </el-card>
+  <div class="page bg padding border 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" 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-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 { watch, toRefs, reactive, onMounted, ref, defineComponent, getCurrentInstance } from 'vue';
@@ -125,279 +125,279 @@ import api from '/@/api/network';
 import api2 from '/@/api/system';
 
 interface TableDataState {
-    activeViewName: string[];
-    resourceModalPro: {
-        mode: string,
-        content: string,
-    },
-    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;
+  activeViewName: string[];
+  resourceModalPro: {
+    mode: string,
+    content: string,
+  },
+  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>({
-            // id: "",
-            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: ''
-            },
-            certificateList: [],
-            detail: {},
-            activeViewName: ['1', '2', '3'],
-            form: {
-                // 名称
-                name: '',
-                // AccessToken
-                accessToken: "",
-                // 认证密码
-                authPasswd: "",
-                // 认证用户
-                authUser: "",
-                // 认证方式(1=Basic,2=AccessToken,3=证书)
-                authType: 3,
-                // 是否开启TLS
-                isTls: 0,
-                // 证书id
-                certificateId: "",
-                // 类型
-                types: 'tcp',
-                // 禁用
-                status: false,
-                // 地址
-                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.server.getDetail({ "id": id }).then((res: any) => {
+  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');
 
-                const { id, isTls, authType, certificateId, authUser, authPasswd, accessToken, name, types, status, addr, register, protocol, heartbeat, devices, stick } = res
-                state.form["id"] = id
-                state.form["name"] = name
-                state.form["types"] = types
-                state.form["status"] = status
-                state.form["isTls"] = isTls
-                state.form["addr"] = addr
-                state.form["authType"] = authType
-                state.form["authUser"] = authUser
-                state.form["authPasswd"] = authPasswd
-                state.form["accessToken"] = accessToken
-                state.form["certificateId"] = certificateId
-                state.form["register"] = JSON.parse(register)
-                state.form["protocol"] = JSON.parse(protocol)
-                state.form["heartbeat"] = JSON.parse(heartbeat)
-                state.form["devices"] = JSON.parse(devices)
-                let stickInfo = JSON.parse(stick)
-                if (stickInfo.len && stickInfo.len.endian) {
-                    state.stick["len,omitempty"] = stickInfo.len
-                } else if (stickInfo.fixedLen) {
-                    state.stick["fixedLen,omitempty"] = stickInfo.fixedLen
-                } else if (stickInfo.custom) {
-                    state.stick["custom,omitempty"] = stickInfo.custom
-                } else if (stickInfo.delimit) {
-                    state.stick["delimit,omitempty"] = stickInfo.delimit
-                }
-                if (types == 'tcp') {
-                    if (state.stick['delimit,omitempty']) {
-                        state.stickValue = '分隔符'
-                    } else if (state.stick['custom,omitempty']) {
-                        state.stickValue = '自定义脚本'
-                    } else if (state.stick['fixedLen,omitempty']) {
-                        state.stickValue = '固定长度'
-                    } else if (state.stick['len,omitempty']) {
-                        state.stickValue = '长度字段'
-                    }
-                }
+    const state = reactive<TableDataState>({
+      // id: "",
+      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: ''
+      },
+      certificateList: [],
+      detail: {},
+      activeViewName: ['1', '2', '3'],
+      form: {
+        // 名称
+        name: '',
+        // AccessToken
+        accessToken: "",
+        // 认证密码
+        authPasswd: "",
+        // 认证用户
+        authUser: "",
+        // 认证方式(1=Basic,2=AccessToken,3=证书)
+        authType: 3,
+        // 是否开启TLS
+        isTls: 0,
+        // 证书id
+        certificateId: "",
+        // 类型
+        types: 'tcp',
+        // 禁用
+        status: false,
+        // 地址
+        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.server.getDetail({ "id": id }).then((res: any) => {
 
-                let jsonData = JSON.stringify(JSON.parse(protocol).options);
-                state.resourceModalPro.content = JSON.stringify(JSON.parse(jsonData), null, 4);
-                mirrorRef.value.setValue(state.resourceModalPro.content);
-            })
-        };
-        const submit = () => {
-            let params = {
-                ...state.form,
-                "stick": {
-                    ...state.stick
-                }
-            }
-            if (mirrorRef.value.getValue()) {
-                state.form.protocol.options = eval("(" + mirrorRef.value.getValue() + ")")
-            }
-            // return
-            api.server.editItem(params).then((res: any) => {
-                ElMessage.success('修改成功')
-                goBack()
-            });
-        };
-        const goBack = () => {
-            router.go(-1);
+        const { id, isTls, authType, certificateId, authUser, authPasswd, accessToken, name, types, status, addr, register, protocol, heartbeat, devices, stick } = res
+        state.form["id"] = id
+        state.form["name"] = name
+        state.form["types"] = types
+        state.form["status"] = status
+        state.form["isTls"] = isTls
+        state.form["addr"] = addr
+        state.form["authType"] = authType
+        state.form["authUser"] = authUser
+        state.form["authPasswd"] = authPasswd
+        state.form["accessToken"] = accessToken
+        state.form["certificateId"] = certificateId
+        state.form["register"] = JSON.parse(register)
+        state.form["protocol"] = JSON.parse(protocol)
+        state.form["heartbeat"] = JSON.parse(heartbeat)
+        state.form["devices"] = JSON.parse(devices)
+        let stickInfo = JSON.parse(stick)
+        if (stickInfo.len && stickInfo.len.endian) {
+          state.stick["len,omitempty"] = stickInfo.len
+        } else if (stickInfo.fixedLen) {
+          state.stick["fixedLen,omitempty"] = stickInfo.fixedLen
+        } else if (stickInfo.custom) {
+          state.stick["custom,omitempty"] = stickInfo.custom
+        } else if (stickInfo.delimit) {
+          state.stick["delimit,omitempty"] = stickInfo.delimit
+        }
+        if (types == 'tcp') {
+          if (state.stick['delimit,omitempty']) {
+            state.stickValue = '分隔符'
+          } else if (state.stick['custom,omitempty']) {
+            state.stickValue = '自定义脚本'
+          } else if (state.stick['fixedLen,omitempty']) {
+            state.stickValue = '固定长度'
+          } else if (state.stick['len,omitempty']) {
+            state.stickValue = '长度字段'
+          }
         }
-        const initData = () => {
-            state.stick = {
-                "delimit,omitempty": "",
-                "custom,omitempty": "",
-                "fixedLen,omitempty": 0,
-                "len,omitempty": {
-                    "len": 0,
-                    "offset": 0,
-                    "endian": ""
-                }
-            }
+
+        let jsonData = JSON.stringify(JSON.parse(protocol).options);
+        state.resourceModalPro.content = JSON.stringify(JSON.parse(jsonData), null, 4);
+        mirrorRef.value.setValue(state.resourceModalPro.content);
+      })
+    };
+    const submit = () => {
+      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.editItem(params).then((res: any) => {
+        ElMessage.success('修改成功')
+        goBack()
+      });
+    };
+    const goBack = () => {
+      router.go(-1);
+    }
+    const initData = () => {
+      state.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;
-            })
+      }
+    }
+    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 = ""
+      }
+    }
+    const getCertificateList = () => {
+      api2.certificate.getList().then((res: any) => {
+        state.certificateList = res.Info;
+      })
+    }
+    watch(
+      () => state.form.isTls,
+      (value) => {
+        if (value == 0) {
+          state.form.authType = ""
         }
-        watch(
-            () => state.form.isTls,
-            (value) => {
-                if (value == 0) {
-                    state.form.authType = ""
-                }
-            }
-        );
-        onMounted(() => {
-            getDetail();
-            getCertificateList();
-        });
+      }
+    );
+    onMounted(() => {
+      getDetail();
+      getCertificateList();
+    });
 
-        return {
-            mirrorRef,
-            activeName,
-            getDetail,
-            network_server_type,
-            network_protocols,
-            submit,
-            initData,
-            handleChangeType,
-            getCertificateList,
-            ...toRefs(props),
-            ...toRefs(state),
-        };
-    },
+    return {
+      mirrorRef,
+      activeName,
+      getDetail,
+      network_server_type,
+      network_protocols,
+      submit,
+      initData,
+      handleChangeType,
+      getCertificateList,
+      ...toRefs(props),
+      ...toRefs(state),
+    };
+  },
 });
 </script>
 <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>
 

+ 71 - 70
src/views/iot/network/tunnel/component/serverDetail.vue

@@ -8,34 +8,34 @@
 -->
 <!-- 服务器详情页 -->
 <template>
-	<div class="server-detail-wrap">
-        <div class="server-detail-item-wrap">
-            <div class="label">名称</div>
-            <div class="value">{{detail.name}}</div>
-        </div>
-        <div class="server-detail-item-wrap">
-            <div class="label">类型</div>
-            <div class="value">{{detail.types}}</div>
-        </div>
-        <div class="server-detail-item-wrap">
-            <div class="label">地址</div>
-            <div class="value">{{detail.addr}}</div>
-        </div>
-        <div class="server-detail-item-wrap">
-            <div class="label">状态</div>
-            <div class="value">{{detail.status?'启动':'未启动'}}</div>
-        </div>
-         <div class="server-detail-item-wrap">
-            <div class="label">禁用</div>
-            <div class="value">
-                <el-switch :loading="loading" :before-change="onChangeStatus" :disabled="!detail.status" :active-value="0"  :inactive-value="1" size="small" v-model="detail.status" />
-            </div>
-        </div>
-        <div class="server-detail-item-wrap">
-            <div class="label">创建时间</div>
-            <div class="value">{{detail.createdAt}}</div>
-        </div>
+  <div class="server-detail-wrap">
+    <div class="server-detail-item-wrap">
+      <div class="label">名称</div>
+      <div class="value">{{ detail.name }}</div>
     </div>
+    <div class="server-detail-item-wrap">
+      <div class="label">类型</div>
+      <div class="value">{{ detail.types }}</div>
+    </div>
+    <div class="server-detail-item-wrap">
+      <div class="label">地址</div>
+      <div class="value">{{ detail.addr }}</div>
+    </div>
+    <div class="server-detail-item-wrap">
+      <div class="label">状态</div>
+      <div class="value">{{ detail.status ? '启动' : '未启动' }}</div>
+    </div>
+    <div class="server-detail-item-wrap">
+      <div class="label">禁用</div>
+      <div class="value">
+        <el-switch :loading="loading" :before-change="onChangeStatus" :disabled="!detail.status" :active-value="0" :inactive-value="1" size="small" v-model="detail.status" />
+      </div>
+    </div>
+    <div class="server-detail-item-wrap">
+      <div class="label">创建时间</div>
+      <div class="value">{{ detail.createdAt }}</div>
+    </div>
+  </div>
 </template>
 <script lang="ts">
 import { toRefs, reactive, onMounted, ref, defineComponent } from 'vue';
@@ -44,56 +44,57 @@ import { ElMessage } from 'element-plus';
 import api from '/@/api/network';
 
 interface TableDataState {
-    loading: boolean
+  loading: boolean
 }
 export default defineComponent({
-	name: 'serverDetail',
-	props: {
-		detail: {
-			type: Object,
-			default: ''
-		}
-	},
-	setup(props, context) {
-		const state = reactive<TableDataState>({
-            loading: false
-		});
-		onMounted(() => {
-		});
-        // 禁用状态
-        const onChangeStatus = () => {
-            state.loading = true
-            return new Promise((resolve) => {
-                api.tunnel.changeTunnelStatus({id: props.detail.id, status: 0}).then((res:any) => {
-                state.loading = false
-		        ElMessage.success('已关闭');
-                props.detail.status = 0
-            })
-            })
-            
-        };
-		return {
-            onChangeStatus,
-			...toRefs(props),
-			...toRefs(state),
-		};
-	}
+  name: 'serverDetail',
+  props: {
+    detail: {
+      type: Object,
+      default: ''
+    }
+  },
+  setup(props, context) {
+    const state = reactive<TableDataState>({
+      loading: false
+    });
+    onMounted(() => {
+    });
+    // 禁用状态
+    const onChangeStatus = () => {
+      state.loading = true
+      return new Promise((resolve) => {
+        api.tunnel.changeTunnelStatus({ id: props.detail.id, status: 0 }).then((res: any) => {
+          state.loading = false
+          ElMessage.success('已关闭');
+          props.detail.status = 0
+        })
+      })
+
+    };
+    return {
+      onChangeStatus,
+      ...toRefs(props),
+      ...toRefs(state),
+    };
+  }
 });
 </script>
 
 <style lang="scss" scoped>
 .server-detail-wrap {
-    .server-detail-item-wrap {
-        display: flex;
-        justify-content: space-between;
-        padding: 10px;
-        border-left: 1px solid var(--el-border-color-light);
-        border-top: 1px solid var(--el-border-color-light);
-        border-right: 1px solid var(--el-border-color-light);
-    }
-    .server-detail-item-wrap:last-child {
-        border-bottom: 1px solid var(--el-border-color-light);
-    }
+  .server-detail-item-wrap {
+    display: flex;
+    justify-content: space-between;
+    padding: 10px;
+    border-left: 1px solid var(--el-border-color-light);
+    border-top: 1px solid var(--el-border-color-light);
+    border-right: 1px solid var(--el-border-color-light);
+  }
+
+  .server-detail-item-wrap:last-child {
+    border-bottom: 1px solid var(--el-border-color-light);
+  }
 }
 </style>
 

+ 9 - 13
src/views/iot/network/tunnel/detail.vue

@@ -1,23 +1,19 @@
 <template>
-	<el-card class="system-dic-container" style="position: relative;">
-		<el-tabs v-model="activeName" class="demo-tabs">
+	<div class="page bg border padding Ipt-2" style="position: relative;">
+		<el-tabs v-model="activeName">
 			<el-tab-pane label="通道详情" name="first">
 				<serverDetail :detail="detail" />
 			</el-tab-pane>
-			<!-- <el-tab-pane label="相关详情" name="second">相关详情</el-tab-pane>
-			<el-tab-pane label="通道" name="third">通道</el-tab-pane> -->
 		</el-tabs>
-		<div style="position: absolute;right:20px;top: 34px;">
+		<div style="position: absolute;right:20px;top: 18px;">
 			<el-icon @click="freshData" style="cursor: pointer;font-size: 16px;margin-right:6px;"><ele-RefreshRight /></el-icon>
-			<!-- <el-icon style="font-size: 16px;margin: 0 6px;"><ele-Operation /></el-icon> -->
 			<el-icon @click="toEdit" style="cursor: pointer;font-size: 16px;"><ele-Edit /></el-icon>
 		</div>
-	</el-card>
+	</div>
 </template>
 <script lang="ts">
 import { toRefs, reactive, onMounted, ref, defineComponent } from 'vue';
-import { ElMessageBox, ElMessage, FormInstance } from 'element-plus';
-import type { TabsPaneContext } from 'element-plus'
+import { ElMessage } from 'element-plus';
 
 import serverDetail from './component/serverDetail.vue'
 
@@ -50,12 +46,12 @@ export default defineComponent({
 				mode: '',
 				content: ''
 			},
-			detail:{}
+			detail: {}
 		});
 		const activeName = ref('first')
 		const getDetail = () => {
 			const id = route.params && route.params.id;
-			api.tunnel.getDetail({"id": id}).then((res: any) => {
+			api.tunnel.getDetail({ "id": id }).then((res: any) => {
 				state.detail = res
 			})
 		};
@@ -64,8 +60,8 @@ export default defineComponent({
 			ElMessage.success('刷新成功');
 		};
 		const toEdit = () => {
-            router.push(`/iotmanager/network/tunnel/edit/${route.params && route.params.id}`)
-        };
+			router.push(`/iotmanager/network/tunnel/edit/${route.params && route.params.id}`)
+		};
 		onMounted(() => {
 			getDetail()
 		});

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

@@ -1,6 +1,6 @@
 <template>
     <el-card class="system-dic-container" style="position: relative;">
-        <el-tabs v-model="activeName" class="demo-tabs">
+        <el-tabs v-model="activeName">
             <el-tab-pane label="编辑通道" name="first">
                 <el-collapse v-model="activeViewName">
                     <el-collapse-item title="基本信息" name="1">

+ 78 - 120
src/views/iot/noticeservices/config/setting.vue

@@ -1,131 +1,90 @@
 <template>
-	<div class="system-dic-container">
-		<el-card shadow="nover">
-			<div class="system-user-search mb15">
-				<el-form :model="tableData.param" ref="queryRef" inline @keyup.enter.native="dataList">
-					<el-form-item label="配置名称" prop="keyWord">
-						<el-input v-model="tableData.param.keyWord" placeholder="请输入配置名称" clearable style="width: 240px" />
-					</el-form-item>
-					<!-- <el-form-item label="通知方式" prop="name">
-						<el-input
-							v-model="tableData.param.sendGateway"
-							placeholder="请输入通知方式"
-							clearable
-							size="default"
-							style="width: 240px"
-							@keyup.enter.native="dataList"
-						/>
-					</el-form-item> -->
-
-					<el-form-item>
-						<el-button type="primary" class="ml10" @click="dataList">
-							<el-icon>
-								<ele-Search />
-							</el-icon>
-							查询
-						</el-button>
-						<el-button @click="resetQuery(queryRef)">
-							<el-icon>
-								<ele-Refresh />
-							</el-icon>
-							重置
-						</el-button>
-						<el-button type="primary" class="ml10" @click="onOpenAdd">
-							<el-icon>
-								<ele-FolderAdd />
-							</el-icon>
-							新增通知
-						</el-button>
-					</el-form-item>
-				</el-form>
-			</div>
-			<div>
-				<div style="border: 1px solid var(--next-border-color-light)"></div>
-				<el-row>
-					<el-col :span="8" v-for="(item, index) in tableData.data" :key="index">
-						<div class="grid-content card">
-							<div class="ant-card">
-								<div class="ant-card-body">
-									<div class="pro-table-card-item">
-										<div class="card-item-avatar">
-											<img width="88" height="88" :src="'/imgs/notice/' + tableData.param.sendGateway + '.svg'" alt="" />
-										</div>
-										<div class="card-item-body">
-											<div class="card-item-header">
-												<div class="ellipsis">
-													<div class="ellipsis card-item-header-name" style="width: 100%; height: 45px">{{ item.title }}</div>
-													<div class="card-item-header-name" style="display: none"></div>
-												</div>
-											</div>
-											<div class="card-item-content">
-												通知方式:<el-tag>{{ item.types == 1 ? '即时发送' : '预约发送' }}</el-tag>
-												<!-- <div>
-													<label>说明</label>
-													<div class="ellipsis">
-														<div style="width: 100%"></div>
-													</div>
-												</div> -->
-											</div>
+	<el-card shadow="nover" class="page">
+		<div class="system-user-search">
+			<el-form :model="tableData.param" ref="queryRef" inline @keyup.enter.native="dataList">
+				<el-form-item label="配置名称" prop="keyWord">
+					<el-input v-model="tableData.param.keyWord" placeholder="请输入配置名称" clearable style="width: 240px" />
+				</el-form-item>
+				<el-form-item>
+					<el-button type="primary" class="ml10" @click="dataList">
+						<el-icon>
+							<ele-Search />
+						</el-icon>
+						查询
+					</el-button>
+					<el-button @click="resetQuery(queryRef)">
+						<el-icon>
+							<ele-Refresh />
+						</el-icon>
+						重置
+					</el-button>
+					<el-button type="primary" class="ml10" @click="onOpenAdd">
+						<el-icon>
+							<ele-FolderAdd />
+						</el-icon>
+						新增通知
+					</el-button>
+				</el-form-item>
+			</el-form>
+		</div>
+		<el-row class="flex1">
+			<el-col :span="8" v-for="(item, index) in tableData.data" :key="index">
+				<div class="grid-content card">
+					<div class="ant-card">
+						<div class="ant-card-body">
+							<div class="pro-table-card-item">
+								<div class="card-item-avatar">
+									<img width="88" height="88" :src="'/imgs/notice/' + tableData.param.sendGateway + '.svg'" alt="" />
+								</div>
+								<div class="card-item-body">
+									<div class="card-item-header">
+										<div class="ellipsis">
+											<div class="ellipsis card-item-header-name" style="width: 100%; height: 45px">{{ item.title }}</div>
+											<div class="card-item-header-name" style="display: none"></div>
 										</div>
 									</div>
-								</div>
-							</div>
-							<div class="card-tools">
-								<div class="card-button" @click="onOpenEdit(item)">
-									<el-button type="primary" class="ml10" text bg>
-										<el-icon>
-											<ele-Edit />
-										</el-icon>
-										修改
-									</el-button>
-								</div>
-								<div class="card-button" @click="onOpenEditTem(item)">
-									<el-button type="primary" text bg>
-										<el-icon>
-											<ele-Wallet />
-										</el-icon>
-										模板配置
-									</el-button>
-								</div>
-								<!--<div class="card-button" @click="onOpenEdit(item)">
-									<el-button type="primary" text bg>
-										<el-icon>
-											<ele-View />
-										</el-icon>
-										调试
-									</el-button>
-								</div>
-
-							 	<div class="card-button" @click="onOpenEdit(item)">
-									<el-button type="info" text bg>
-										<el-icon>
-											<ele-Document />
-										</el-icon>
-										通知记录
-									</el-button>
-								</div> -->
-
-								<div class="card-button" @click="onRowDel(item)">
-									<el-button type="danger" text bg>
-										<el-icon>
-											<ele-Delete />
-										</el-icon>
-										删除
-									</el-button>
+									<div class="card-item-content">
+										通知方式:<el-tag>{{ item.types == 1 ? '即时发送' : '预约发送' }}</el-tag>
+									</div>
 								</div>
 							</div>
 						</div>
-					</el-col>
-				</el-row>
-			</div>
-			<div style="text-align: center;padding: 28px;" v-if="(tableData.total == 0)">暂无数据</div>
-			<pagination v-show="tableData.total > 0" :total="tableData.total" v-model:page="tableData.param.pageNum" v-model:limit="tableData.param.pageSize" @pagination="dataList" />
-		</el-card>
+					</div>
+					<div class="card-tools">
+						<div class="card-button" @click="onOpenEdit(item)">
+							<el-button type="primary" class="ml10" text bg>
+								<el-icon>
+									<ele-Edit />
+								</el-icon>
+								修改
+							</el-button>
+						</div>
+						<div class="card-button" @click="onOpenEditTem(item)">
+							<el-button type="primary" text bg>
+								<el-icon>
+									<ele-Wallet />
+								</el-icon>
+								模板配置
+							</el-button>
+						</div>
 
+						<div class="card-button" @click="onRowDel(item)">
+							<el-button type="danger" text bg>
+								<el-icon>
+									<ele-Delete />
+								</el-icon>
+								删除
+							</el-button>
+						</div>
+					</div>
+				</div>
+			</el-col>
+		</el-row>
+		<div style="text-align: center;padding: 28px;" v-if="(tableData.total == 0)">暂无数据</div>
+		<pagination v-show="tableData.total > 0" :total="tableData.total" v-model:page="tableData.param.pageNum" v-model:limit="tableData.param.pageSize" @pagination="dataList" />
 		<EditDic ref="editDicRef" @dataList="dataList" />
 		<EditTemDic ref="temeditDicRef" @dataList="dataList" />
-		<!-- 	<LevelDic ref="levelDicRef" @dataList="dataList" /> -->
-	</div>
+	</el-card>
 </template>
 
 <script lang="ts">
@@ -133,7 +92,6 @@ import { toRefs, reactive, onMounted, ref, getCurrentInstance, defineComponent }
 import { ElMessageBox, ElMessage, FormInstance } from 'element-plus';
 import EditDic from './component/setEdit.vue';
 import EditTemDic from './component/temEdit.vue';
-//import LevelDic from './component/level.vue';
 
 import api from '/@/api/notice';
 import { useRoute } from 'vue-router';

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

@@ -1,87 +1,81 @@
 <template>
-  <div class="ota-module-container">
-    <el-card shadow="nover">
-      <div class="ota-module-search mb15">
-        <el-form :model="tableData.param" ref="queryRef" inline label-width="90px" @keyup.enter.native="getList(1)">
-          <el-form-item label="批次名称:" prop="name">
-            <el-input v-model="tableData.param.keyWord" placeholder="请输入批次名称" clearable style="width: 240px" />
-          </el-form-item>
+  <div class="page page-full">
+    <el-form :model="tableData.param" ref="queryRef" inline label-width="90px" @keyup.enter.native="getList(1)">
+      <el-form-item label="批次名称:" prop="name">
+        <el-input v-model="tableData.param.keyWord" placeholder="请输入批次名称" clearable style="width: 240px" />
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" class="ml10" @click="getList(1)">
+          <el-icon>
+            <ele-Search />
+          </el-icon>
+          查询
+        </el-button>
+        <el-button @click="resetQuery()">
+          <el-icon>
+            <ele-Refresh />
+          </el-icon>
+          重置
+        </el-button>
+        <el-button type="primary" v-auth="'add'" @click="onOpenAdd()">
+          <el-icon>
+            <ele-FolderAdd />
+          </el-icon>
+          添加批次
+        </el-button>
+      </el-form-item>
+    </el-form>
+    <el-table :data="tableData.data" style="width: 100%" v-loading="tableData.loading">
+      <el-table-column prop="id" label="ID" width="100" />
+      <el-table-column prop="name" label="名称" />
+      <!--        <el-table-column prop="waitVersion" label="待升级版本号" width="120" />-->
+      <el-table-column label="类型" prop="types" width="120" align="center">
+        <template #default="scope">
+          <el-tag type="success" size="small" v-if="scope.row.types == 0">验证</el-tag>
+          <el-tag type="info" size="small" v-else>升级</el-tag>
+        </template>
+      </el-table-column>
+      <el-table-column label="状态" prop="active" width="120" align="center">
+        <template #default="scope">
+          <el-tag type="success" size="small" v-if="scope.row.active == 1">是</el-tag>
+          <el-tag type="info" size="small" v-else>否</el-tag>
+        </template>
+      </el-table-column>
+      <el-table-column prop="method" label="协议方式" show-overflow-tooltip>
+        <template #default="scope">
+          <el-tag size="small" v-if="scope.row.method == 1">http</el-tag>
+          <el-tag size="small" v-if="scope.row.method == 2">https</el-tag>
+          <el-tag size="small" v-if="scope.row.method == 3">mqtt</el-tag>
+        </template>
+      </el-table-column>
+      <el-table-column prop="stratege" label="升级方式" show-overflow-tooltip>
+        <template #default="scope">
+          <el-tag size="small" v-if="scope.row.stratege == 1">静态升级 </el-tag>
+          <el-tag size="small" v-if="scope.row.stratege == 2">动态升级</el-tag>
+        </template>
+      </el-table-column>
 
-          <el-form-item>
-            <el-button type="primary" class="ml10" @click="getList(1)">
-              <el-icon>
-                <ele-Search />
-              </el-icon>
-              查询
-            </el-button>
-            <el-button @click="resetQuery()">
-              <el-icon>
-                <ele-Refresh />
-              </el-icon>
-              重置
-            </el-button>
-            <el-button type="primary" v-auth="'add'" @click="onOpenAdd()">
-              <el-icon>
-                <ele-FolderAdd />
-              </el-icon>
-              添加批次
-            </el-button>
-          </el-form-item>
-
-        </el-form>
-      </div>
-      <el-table :data="tableData.data" style="width: 100%" v-loading="tableData.loading">
-        <el-table-column prop="id" label="ID" width="100" />
-        <el-table-column prop="name" label="名称" />
-<!--        <el-table-column prop="waitVersion" label="待升级版本号" width="120" />-->
-        <el-table-column label="类型" prop="types" width="120" align="center">
-          <template #default="scope">
-            <el-tag type="success" size="small" v-if="scope.row.types == 0">验证</el-tag>
-            <el-tag type="info" size="small" v-else>升级</el-tag>
-          </template>
-        </el-table-column>
-        <el-table-column label="状态" prop="active" width="120" align="center">
-          <template #default="scope">
-            <el-tag type="success" size="small" v-if="scope.row.active == 1">是</el-tag>
-            <el-tag type="info" size="small" v-else>否</el-tag>
-          </template>
-        </el-table-column>
-        <el-table-column prop="method" label="协议方式" show-overflow-tooltip>
-          <template #default="scope">
-            <el-tag size="small" v-if="scope.row.method == 1">http</el-tag>
-            <el-tag size="small" v-if="scope.row.method == 2">https</el-tag>
-            <el-tag size="small" v-if="scope.row.method == 3">mqtt</el-tag>
-          </template>
-        </el-table-column>
-        <el-table-column prop="stratege" label="升级方式" show-overflow-tooltip>
-          <template #default="scope">
-            <el-tag size="small" v-if="scope.row.stratege == 1">静态升级 </el-tag>
-            <el-tag size="small" v-if="scope.row.stratege == 2">动态升级</el-tag>
-          </template>
-        </el-table-column>
-
-        <el-table-column prop="push" label="主动推送" show-overflow-tooltip>
-          <template #default="scope">
-            <el-tag size="small" v-if="scope.row.push == 1">是 </el-tag>
-            <el-tag size="small" v-if="scope.row.push == 2">否</el-tag>
-          </template>
-        </el-table-column>
-        <el-table-column prop="createdAt" label="创建时间" min-width="100" align="center" />
-        <el-table-column label="操作" width="200" align="center">
-          <template #default="scope">
-<!--            <router-link :to="'/iotmanager/operation/ota/update/device/' + scope.row.id" class="link-type" style="padding-right: 12px;font-size: 12px;color: #409eff;">-->
-<!--              <span>查看</span>-->
-<!--            </router-link>-->
-            <el-button size="small" text type="primary" @click="getDeviceList(scope.row)">查看</el-button>
-<!--            <el-button size="small" text type="warning" v-auth="'edit'" @click="CheckUpdate(scope.row)">编辑</el-button>-->
-<!--            <el-button size="small" text type="danger" v-auth="'del'" @click="del(scope.row)">删除</el-button>-->
-          </template>
-        </el-table-column>
-      </el-table>
-      <pagination v-show="tableData.total > 0" :total="tableData.total" v-model:page="tableData.param.pageNum" v-model:limit="tableData.param.pageSize" @pagination="getList" />
-      <CheckConfig ref="checkRef" @getList="getList(1)" />
-      <DeviceList ref="deviceRef" />
-    </el-card>
+      <el-table-column prop="push" label="主动推送" show-overflow-tooltip>
+        <template #default="scope">
+          <el-tag size="small" v-if="scope.row.push == 1">是 </el-tag>
+          <el-tag size="small" v-if="scope.row.push == 2">否</el-tag>
+        </template>
+      </el-table-column>
+      <el-table-column prop="createdAt" label="创建时间" min-width="100" align="center" />
+      <el-table-column label="操作" width="200" align="center">
+        <template #default="scope">
+          <!--            <router-link :to="'/iotmanager/operation/ota/update/device/' + scope.row.id" class="link-type" style="padding-right: 12px;font-size: 12px;color: #409eff;">-->
+          <!--              <span>查看</span>-->
+          <!--            </router-link>-->
+          <el-button size="small" text type="primary" @click="getDeviceList(scope.row)">查看</el-button>
+          <!--            <el-button size="small" text type="warning" v-auth="'edit'" @click="CheckUpdate(scope.row)">编辑</el-button>-->
+          <!--            <el-button size="small" text type="danger" v-auth="'del'" @click="del(scope.row)">删除</el-button>-->
+        </template>
+      </el-table-column>
+    </el-table>
+    <pagination v-show="tableData.total > 0" :total="tableData.total" v-model:page="tableData.param.pageNum" v-model:limit="tableData.param.pageSize" @pagination="getList" />
+    <CheckConfig ref="checkRef" @getList="getList(1)" />
+    <DeviceList ref="deviceRef" />
   </div>
 </template>
 
@@ -156,7 +150,7 @@ export default defineComponent({
       let active = 0;
       if (row.active === 1) active = 0;
       if (row.active === 0) active = 1;
-      api.batch.stop({id: row.id, active: active}).then((res: any) => {
+      api.batch.stop({ id: row.id, active: active }).then((res: any) => {
         ElMessage.success('操作成功');
         batchList();
       });
@@ -170,12 +164,12 @@ export default defineComponent({
       state.tableData.loading = true;
       state.tableData.param.devOtaFirmwareId = props.detail.id;
       api.batch
-          .getList(state.tableData.param)
-          .then((res: any) => {
-            state.tableData.data = res.Data;
-            state.tableData.total = res.Total;
-          })
-          .finally(() => (state.tableData.loading = false));
+        .getList(state.tableData.param)
+        .then((res: any) => {
+          state.tableData.data = res.Data;
+          state.tableData.total = res.Total;
+        })
+        .finally(() => (state.tableData.loading = false));
     };
     // 打开新增弹窗
     const onOpenAdd = () => {
@@ -206,7 +200,7 @@ export default defineComponent({
           getList();
         });
       })
-          .catch(() => { });
+        .catch(() => { });
     };
     /** 重置按钮操作 */
     const resetQuery = () => {

+ 48 - 43
src/views/iot/ota-update/update/component/info.vue

@@ -1,75 +1,77 @@
 <template>
-	<el-card class="system-dic-container" style="position: relative">
-		<div class="content">
-		
-			<div class="container">
-				<div class="item">升级包 ID:{{detail.id}}</div>
-				<div class="item">升级包名称:{{detail.name}}</div>
-				<div class="item">所属产品:{{detail.productName}}</div>
-			</div>
-			<div class="container">
-				<div class="item">升级包签名:d52b637c5eaf2bc9c24008bc4b723600</div>
-				<div class="item">升级包版本号:{{detail.version}}</div>
-				<div class="item">创建时间:{{detail.createdAt}}</div>
-			</div>
-			<div class="container">
-				<div class="item">签名算法:{{detail.are}}</div>
-				<div class="item">升级包状态:未验证</div>
-				<div class="item">验证进度:0%</div>
-			</div>
-			<div class="container">
-				<div class="item">升级包描述:{{detail.describe}}</div>
-				<div class="item">推送给设备的自定义信息:{{detail.info}}</div>
-				<div class="item"></div>
-			</div>
-			
+	<div class="content">
+		<div class="container">
+			<div class="item">升级包 ID:{{ detail.id }}</div>
+			<div class="item">升级包名称:{{ detail.name }}</div>
+			<div class="item">所属产品:{{ detail.productName }}</div>
 		</div>
-	</el-card>
+		<div class="container">
+			<div class="item">升级包签名:d52b637c5eaf2bc9c24008bc4b723600</div>
+			<div class="item">升级包版本号:{{ detail.version }}</div>
+			<div class="item">创建时间:{{ detail.createdAt }}</div>
+		</div>
+		<div class="container">
+			<div class="item">签名算法:{{ detail.are }}</div>
+			<div class="item">升级包状态:未验证</div>
+			<div class="item">验证进度:0%</div>
+		</div>
+		<div class="container">
+			<div class="item">升级包描述:{{ detail.describe }}</div>
+			<div class="item">推送给设备的自定义信息:{{ detail.info }}</div>
+			<div class="item"></div>
+		</div>
+	</div>
 </template>
 <script lang="ts" setup>
 
 const props = defineProps({
-
-detail: {
-  type: Object,
-  default: () => {}
-},
-
+	detail: {
+		type: Object,
+		default: () => { }
+	},
 })
 
 </script>
 
 <style scoped lang="scss">
-.status_list{
+.status_list {
 	width: 100%;
-    display: flex;
-    justify-content: space-between;
-    align-items: center;
+	display: flex;
+	justify-content: space-between;
+	align-items: center;
 	padding: 10px;
-	.otaflex{
+
+	.otaflex {
 		font-size: 14px;
 		display: flex;
 		align-items: center;
 		margin-left: -6px;
-		.otaflex_div1{
+
+		.otaflex_div1 {
 			padding: 0 24px;
 			min-width: 200px;
 			width: fit-content;
+
 			.otaflex_div2 {
 				align-items: center;
-				.title{
+
+				.title {
 					color: #666;
 					font-size: 14px;
 				}
+
 				span {
 					display: block;
 					border-radius: 50%;
+
 					.on {
 						background: #52c41a;
 					}
+
 					.off {
 						background: #c41a1a;
 					}
+
 					.ofn {
 						background: rgb(255, 138, 0);
 					}
@@ -78,7 +80,7 @@ detail: {
 						position: relative;
 						top: -1px;
 						display: inline-block;
-						width:10px;
+						width: 10px;
 						height: 10px;
 						vertical-align: middle;
 						border-radius: 50%;
@@ -86,18 +88,20 @@ detail: {
 					}
 
 				}
-				.otaflex_div3{
+
+				.otaflex_div3 {
 					font-size: 24px;
 					margin-top: 10px;
 					color: #373d41;
 				}
 			}
-	
-	
+
+
 		}
-		
+
 	}
 }
+
 .container {
 	display: flex;
 	padding: 10px;
@@ -106,6 +110,7 @@ detail: {
 .item {
 	flex: 1;
 }
+
 .desc {
 	margin-top: 15px;
 }

+ 41 - 74
src/views/iot/ota-update/update/detail.vue

@@ -1,73 +1,31 @@
 <template>
-  <div>
-    <el-card class="system-dic-container" style="position: relative">
-      <div class="content">
-        <div class="flex cont_box">
-          <div class="font26">升级包名称:{{detail.name}}</div>
-          <div class="pro-status"><span :class="detail.checkres == 1 ? 'on' : 'off'"></span>{{ detail.checkres == 1 ? '已验证' : '未验证' }}</div>
-        </div>
-        <div class="mt20"></div>
-        <div class="container">
-          <div class="item">升级包类型:{{detail.types==1?'整包':'差分'}}</div>
-          <div class="item">升级包签名:d52b637c5eaf2bc9c24008bc4b723600</div>
-        </div>
-        <div class="container">
-          <div class="item">签名算法:{{detail.are}}</div>
-          <div class="item">模块名称:{{detail.moduleName}}</div>
-        </div>
-
-        <!-- <div class="mt20"></div>
-        <div class="status_list">
-          <div class="otaflex">
-            <div class="otaflex_div1">
-                <div class="otaflex_div2">
-                  <span class="title">目标设备总数</span>
-                  <div class="count otaflex_div3">0</div>
-                </div>
-              </div>
-              <div class="otaflex_div1">
-                <div class="otaflex_div2">
-                  <span class="title"><span class="on"></span>目标成功数</span>
-                  <div class="count otaflex_div3">0</div>
-                </div>
-
-              </div>
-              <div class="otaflex_div1">
-                <div class="otaflex_div2">
-                  <span class="title"><span class="off"></span>目标失败数</span>
-                  <div class="count otaflex_div3">0</div>
-                </div>
-              </div>
-              <div class="otaflex_div1">
-                <div class="otaflex_div2">
-                  <span class="title"><span class="ofn"></span>目标取消数</span>
-                  <div class="count otaflex_div3">0</div>
-                </div>
-
-              </div>
-          </div>
-        </div> -->
+  <div class="page page-full padding bg border" style="position: relative">
+    <div class="content">
+      <div class="flex cont_box">
+        <div class="font26">升级包名称:{{ detail.name }}</div>
+        <div class="pro-status"><span :class="detail.checkres == 1 ? 'on' : 'off'"></span>{{ detail.checkres == 1 ? '已验证' : '未验证' }}</div>
       </div>
-    </el-card>
-    <div class="mt10"></div>
-    <el-card class="system-dic-container" style="position: relative">
-      <el-tabs v-model="activeTab">
-        <el-tab-pane label="批次管理" name="tab1">
-          <BatchList v-if="detail.id" :detail="detail" />
-        </el-tab-pane>
-<!--        <el-tab-pane label="设备列表" name="tab2">-->
-<!--          <DeviceList v-if="detail.id" :detail="detail" />-->
-<!--        </el-tab-pane>-->
-        <el-tab-pane label="升级包信息" name="tab3">
-          <InfoList v-if="detail.id" :detail="detail" />
-        </el-tab-pane>
-      </el-tabs>
-    </el-card>
+      <div class="container mt-2">
+        <div class="item">升级包类型:{{ detail.types == 1 ? '整包' : '差分' }}</div>
+        <div class="item">升级包签名:d52b637c5eaf2bc9c24008bc4b723600</div>
+      </div>
+      <div class="container mb-2">
+        <div class="item">签名算法:{{ detail.are }}</div>
+        <div class="item">模块名称:{{ detail.moduleName }}</div>
+      </div>
+    </div>
+    <el-tabs v-model="activeTab">
+      <el-tab-pane label="批次管理" name="tab1">
+        <BatchList v-if="detail.id" :detail="detail" />
+      </el-tab-pane>
+      <el-tab-pane label="升级包信息" name="tab3">
+        <InfoList v-if="detail.id" :detail="detail" />
+      </el-tab-pane>
+    </el-tabs>
   </div>
 </template>
 <script lang="ts">
 import { toRefs, reactive, onMounted, ref, defineComponent } from 'vue'
-import type { TabsPaneContext } from 'element-plus'
 import { useRoute } from 'vue-router'
 import { EditPen, DocumentAdd } from '@element-plus/icons-vue'
 import EditForm from '/@/views/iot/ota-update/update/component/edit.vue';
@@ -79,11 +37,11 @@ import api from '/@/api/ota'
 const editFormRef = ref()
 
 export default defineComponent({
-  components: { EditPen, EditForm, DocumentAdd, InfoList, DeviceList, BatchList},
+  components: { EditPen, EditForm, DocumentAdd, InfoList, DeviceList, BatchList },
   setup(props) {
     const route = useRoute()
     const state = reactive({
-      activeTab:'tab1',
+      activeTab: 'tab1',
       developer_status: 2,
       detail: {
         id: '',
@@ -119,30 +77,36 @@ export default defineComponent({
 </script>
 
 <style scoped lang="scss">
-.status_list{
+.status_list {
   width: 100%;
   display: flex;
   justify-content: space-between;
   align-items: center;
   padding: 10px;
-  .otaflex{
+
+  .otaflex {
     font-size: 12px;
     display: flex;
     align-items: center;
     margin-left: -6px;
-    .otaflex_div1{
+
+    .otaflex_div1 {
       padding: 0 24px;
       min-width: 200px;
       width: fit-content;
+
       .otaflex_div2 {
         align-items: center;
-        .title{
+
+        .title {
           color: #666;
           font-size: 14px;
         }
+
         span {
           display: block;
           border-radius: 50%;
+
           .on {
             background: #52c41a;
           }
@@ -150,6 +114,7 @@ export default defineComponent({
           .off {
             background: #c41a1a;
           }
+
           .ofn {
             background: rgb(255, 138, 0);
           }
@@ -158,7 +123,7 @@ export default defineComponent({
             position: relative;
             top: -1px;
             display: inline-block;
-            width:10px;
+            width: 10px;
             height: 10px;
             vertical-align: middle;
             border-radius: 50%;
@@ -166,7 +131,8 @@ export default defineComponent({
           }
 
         }
-        .otaflex_div3{
+
+        .otaflex_div3 {
           font-size: 24px;
           margin-top: 10px;
           color: #373d41;
@@ -178,14 +144,16 @@ export default defineComponent({
 
   }
 }
+
 .container {
   display: flex;
-  padding: 10px;
+  padding: 2px 0;
 }
 
 .item {
   flex: 1;
 }
+
 .desc {
   margin-top: 15px;
 }
@@ -199,7 +167,6 @@ export default defineComponent({
 .cont_box .pro-status {
   line-height: 40px;
   margin-left: 30px;
-  margin-top: 5px;
 
   .on {
     background: #52c41a;

+ 76 - 81
src/views/iot/property/attribute/index.vue

@@ -1,73 +1,68 @@
 <template>
-	<div class="page">
-		<el-card shadow="nover">
-			<el-form inline ref="queryRef" @keyup.enter="getList(1)">
-				<el-form-item label="关键字:" prop="keyWord">
-					<el-input v-model="params.keyWord" placeholder="请输入关键字" clearable style="width: 240px" />
-				</el-form-item>
-				<el-form-item>
-					<el-button type="primary" class="ml10" @click="getList(1)">
-						<el-icon>
-							<ele-Search />
-						</el-icon>
-						查询
-					</el-button>
-				</el-form-item>
-				<el-form-item>
-					<el-button type="success" @click="addOrEdit()" v-auth="'add'" v-if="productIno">
-						<el-icon>
-							<ele-FolderAdd />
-						</el-icon>
-						新增属性
-					</el-button>
-					<el-button type="danger" @click="batchdel()" v-auth="'batchdel'">
-						<el-icon>
-							<ele-FolderAdd />
-						</el-icon>
-						批量删除
-					</el-button>
-				</el-form-item>
-			</el-form>
-			<el-row :gutter="16">
-				<el-col :span="6">
-					<el-tree :data="mergedData" :props="defaultProps" accordion default-expand-all @node-click="handleNodeClick" style="border: 1px solid #eee;padding: 10px;margin-right: 10px;" class="mt-4" :default-expand-all="true" :node-key="'id'" highlight-current>
-						<template #default="{ node, data }">
-              <div class="custom-tree-node">
-                  <span class="tree-label">
-                    <el-icon v-if="data.is_type == '2'">
-                      <Expand />
-                    </el-icon>
-                    {{ node.label }}
-                  </span>
-              </div>
-						</template>
-					</el-tree>
-				</el-col>
-				<el-col :span="18"><el-table :data="tableData" @selection-change="handleSelectionChange" style="width: 100%" row-key="id" v-loading="loading">
+	<div class="page page-full border bg padding">
+		<el-form inline ref="queryRef" @keyup.enter="getList(1)">
+			<el-form-item label="关键字:" prop="keyWord">
+				<el-input v-model="params.keyWord" placeholder="请输入关键字" clearable style="width: 240px" />
+			</el-form-item>
+			<el-form-item>
+				<el-button type="primary" class="ml10" @click="getList(1)">
+					<el-icon>
+						<ele-Search />
+					</el-icon>
+					查询
+				</el-button>
+			</el-form-item>
+			<el-form-item>
+				<el-button type="success" @click="addOrEdit()" v-auth="'add'" v-if="productIno">
+					<el-icon>
+						<ele-FolderAdd />
+					</el-icon>
+					新增属性
+				</el-button>
+				<el-button type="danger" @click="batchdel()" v-auth="'batchdel'">
+					<el-icon>
+						<ele-FolderAdd />
+					</el-icon>
+					批量删除
+				</el-button>
+			</el-form-item>
+		</el-form>
+		<div class="page page-full-part flex-row gap-4">
+			<el-card style="width: 250px;" shadow="nover">
+				<el-tree :data="mergedData" :props="defaultProps" accordion default-expand-all @node-click="handleNodeClick" :node-key="'id'" highlight-current>
+					<template #default="{ node, data }">
+						<div class="custom-tree-node">
+							<span class="tree-label">
+								<el-icon v-if="data.is_type == '2'">
+									<Expand />
+								</el-icon>
+								{{ node.label }}
+							</span>
+						</div>
+					</template>
+				</el-tree>
+			</el-card>
+			<el-card class="flex1" shadow="nover">
+				<div class="page page-full">
+					<el-table :data="tableData" @selection-change="handleSelectionChange" style="width: 100%" row-key="id" v-loading="loading">
 						<el-table-column type="selection" width="55" align="center" />
-
 						<el-table-column prop="id" v-col="'id'" label="ID" min-width="100" show-overflow-tooltip></el-table-column>
 						<el-table-column prop="name" v-col="'name'" label="字段名称" show-overflow-tooltip></el-table-column>
 						<el-table-column prop="title" v-col="'title'" label="字段标题" show-overflow-tooltip></el-table-column>
 						<el-table-column prop="types" v-col="'types'" label="字段类型" show-overflow-tooltip></el-table-column>
-
-
 						<el-table-column prop="createdAt" v-col="'createdAt'" label="创建时间" width="160" align="center"></el-table-column>
 						<el-table-column label="操作" width="200" align="center">
 							<template #default="scope">
-
 								<el-button size="small" text v-auth="'edit'" type="warning" @click="addOrEdit(scope.row)">编辑</el-button>
-
 								<el-button size="small" text v-auth="'del'" type="info" @click="del(scope.row)">删除</el-button>
 							</template>
 						</el-table-column>
 					</el-table>
 					<pagination v-if="params.total" :total="params.total" v-model:page="params.pageNum" v-model:limit="params.pageSize" @pagination="getList()" />
-				</el-col>
-			</el-row>
-
-			<EditForm ref="editFormRef" @getList="getList(1)"></EditForm>
-		</el-card>
+				</div>
+			</el-card>
+		</div>
+		<EditForm ref="editFormRef" @getList="getList(1)"></EditForm>
 	</div>
 </template>
 
@@ -124,16 +119,16 @@ const getCateList = () => {
 			getList()
 			mergedData.value = matchProductsToCategories(productData.value, cateData.value);
 
-      // 默认加载第一个设备对应属性
-      if (productData.value.length > 0) {
-        handleNodeClick(mergedData.value[0].children[0])
-      }
-    });
+			// 默认加载第一个设备对应属性
+			if (productData.value.length > 0) {
+				handleNodeClick(mergedData.value[0].children[0])
+			}
+		});
 	})
 }
 
 const handleNodeClick = (data: any) => {
-  if (data.is_type === '2') {
+	if (data.is_type === '2') {
 		productIno.value = data;
 		params.productKey = data.key
 		getList()
@@ -206,26 +201,26 @@ const del = (row: any) => {
 </script>
 <style scoped lang="scss">
 .custom-tree-node {
-  width: 100%;
-  display: flex;
-  align-items: center;
-  justify-content: space-between;
-  font-size: 14px;
-  padding-right: 8px;
-  overflow: hidden;
-
-  .tree-label {
-    width: 100%;
-    overflow: hidden;
-    text-overflow: ellipsis;
-    white-space: nowrap;
-    margin-right: 10px;
-  }
+	width: 100%;
+	display: flex;
+	align-items: center;
+	justify-content: space-between;
+	font-size: 14px;
+	padding-right: 8px;
+	overflow: hidden;
+
+	.tree-label {
+		width: 100%;
+		overflow: hidden;
+		text-overflow: ellipsis;
+		white-space: nowrap;
+		margin-right: 10px;
+	}
 
-  &:hover {
-    .tree-options {
-      display: block;
-    }
-  }
+	&:hover {
+		.tree-options {
+			display: block;
+		}
+	}
 }
 </style>

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

@@ -176,7 +176,7 @@ const open = async (row: any, productInfo: any) => {
   showDialog.value = true;
   nextTick(() => {
     system.org.getList({ status: 1 }).then((res: any) => {
-      res.forEach((item:any) => {
+      res.forEach((item: any) => {
         item.id = item.id.toString();
       });
       orgData.value = res || [];
@@ -199,7 +199,7 @@ const open = async (row: any, productInfo: any) => {
 
     //获取部门
     api.dept.getList({ status: -1 }).then((res: any) => {
-      res.forEach((item:any) => {
+      res.forEach((item: any) => {
         item.deptId = item.deptId.toString();
       });
       deptData.value = res || [];
@@ -222,7 +222,7 @@ const open = async (row: any, productInfo: any) => {
       //获取档案属性
       api.dev_asset_metadata.getList({ productKey: productInfo.key, pageSize: 50, pageNum: 1, status: -1, total: 0 }).then((res: any) => {
         const sortedArray = res.Data.sort((a, b) => a.id - b.id);
-				Datalist.value = sortedArray || [];
+        Datalist.value = sortedArray || [];
       });
       formData.productKey = productInfo.key
 

+ 80 - 85
src/views/iot/property/dossier/index.vue

@@ -1,82 +1,77 @@
 <template>
-	<div class="page">
-		<el-card shadow="nover">
-			<el-form inline ref="queryRef" @keyup.enter="getList(1)">
-				<el-form-item label="名称:" prop="keyWord">
-					<el-input v-model="params.keyWord" placeholder="请输入名称" clearable style="width: 240px" />
-				</el-form-item>
-
-				<el-form-item>
-					<el-button type="primary" class="ml10" @click="getList(1)">
-						<el-icon>
-							<ele-Search />
-						</el-icon>
-						查询
-					</el-button>
-				</el-form-item>
-				<el-form-item>
-					<el-button type="success" @click="addOrEdit()" v-auth="'add'" v-if="productIno">
-						<el-icon>
-							<ele-FolderAdd />
-						</el-icon>
-						新增档案
-					</el-button>
-
-					<!-- <el-button type="primary" @click="addOrEdit()" v-if="productIno">
+	<div class="page page-full border bg padding">
+		<el-form inline ref="queryRef" @keyup.enter="getList(1)">
+			<el-form-item label="名称" prop="keyWord">
+				<el-input v-model="params.keyWord" placeholder="请输入名称" clearable style="width: 240px" />
+			</el-form-item>
+
+			<el-form-item>
+				<el-button type="primary" class="ml10" @click="getList(1)">
+					<el-icon>
+						<ele-Search />
+					</el-icon>
+					查询
+				</el-button>
+			</el-form-item>
+			<el-form-item>
+				<el-button type="success" @click="addOrEdit()" v-auth="'add'" v-if="productIno">
+					<el-icon>
+						<ele-FolderAdd />
+					</el-icon>
+					新增档案
+				</el-button>
+
+				<!-- <el-button type="primary" @click="addOrEdit()" v-if="productIno">
 						<el-icon>
 							<ele-FolderAdd />
 						</el-icon>
 						批量添加
 					</el-button> -->
 
-					<el-button type="danger" @click="batchdel()" v-auth="'batchdel'">
-						<el-icon>
-							<ele-FolderAdd />
-						</el-icon>
-						批量删除
-					</el-button>
-				</el-form-item>
-			</el-form>
-			<el-row :gutter="16">
-				<el-col :span="6">
-          <el-tree :data="mergedData" :props="defaultProps" accordion default-expand-all @node-click="handleNodeClick" style="border: 1px solid #eee;padding: 10px;margin-right: 10px;" class="mt-4" :default-expand-all="true" :node-key="'id'" highlight-current>
-            <template #default="{ node, data }">
-              <div class="custom-tree-node">
-                  <span class="tree-label">
-                    <el-icon v-if="data.is_type == '2'">
-                      <Expand />
-                    </el-icon>
-                    {{ node.label }}
-                  </span>
-              </div>
-            </template>
-          </el-tree>
-				</el-col>
-				<el-col :span="18"><el-table :data="tableData" style="width: 100%" @selection-change="handleSelectionChange" row-key="id" v-loading="loading">
+				<el-button type="danger" @click="batchdel()" v-auth="'batchdel'">
+					<el-icon>
+						<ele-FolderAdd />
+					</el-icon>
+					批量删除
+				</el-button>
+			</el-form-item>
+		</el-form>
+		<div class="page page-full-part flex-row gap-4">
+			<el-card style="width: 250px;" shadow="nover">
+				<el-tree :data="mergedData" :props="defaultProps" accordion default-expand-all @node-click="handleNodeClick" :node-key="'id'" highlight-current>
+					<template #default="{ node, data }">
+						<div class="custom-tree-node">
+							<span class="tree-label">
+								<el-icon v-if="data.is_type == '2'">
+									<Expand />
+								</el-icon>
+								{{ node.label }}
+							</span>
+						</div>
+					</template>
+				</el-tree>
+			</el-card>
+			<el-card class="flex1" shadow="nover">
+				<div class="page page-full">
+					<el-table :data="tableData" style="width: 100%" @selection-change="handleSelectionChange" row-key="id" v-loading="loading">
 						<el-table-column type="selection" width="55" align="center" />
-
 						<el-table-column prop="deviceName" v-col="'deviceName'" label="设备名称" min-width="100" show-overflow-tooltip></el-table-column>
 						<el-table-column prop="deviceKey" v-col="'deviceKey'" label="设备KEY" show-overflow-tooltip></el-table-column>
-
 						<el-table-column prop="deviceNumber" v-col="'deviceNumber'" label="设备编码" show-overflow-tooltip></el-table-column>
-
 						<el-table-column prop="deviceCategory" v-col="'deviceCategory'" label="设备类型" show-overflow-tooltip></el-table-column>
-
 						<el-table-column prop="installTime" v-col="'installTime'" label="安装时间" width="160" align="center"></el-table-column>
-						<el-table-column label="操作" width="200" align="center">
+						<el-table-column label="操作" width="120" align="center">
 							<template #default="scope">
 								<el-button size="small" text type="warning" v-auth="'edit'" @click="addOrEdit(scope.row)">编辑</el-button>
-
 								<el-button size="small" text type="info" v-auth="'del'" @click="del(scope.row)">删除</el-button>
 							</template>
 						</el-table-column>
 					</el-table>
 					<pagination v-if="params.total" :total="params.total" v-model:page="params.pageNum" v-model:limit="params.pageSize" @pagination="getList()" />
-				</el-col>
-			</el-row>
-
-			<EditForm ref="editFormRef" @getList="getList(1)"></EditForm>
-		</el-card>
+				</div>
+			</el-card>
+		</div>
+		<EditForm ref="editFormRef" @getList="getList(1)"></EditForm>
 	</div>
 </template>
 
@@ -115,7 +110,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)
@@ -130,10 +125,10 @@ const getCateList = () => {
 			productData.value = res.product
 			mergedData.value = matchProductsToCategories(productData.value, cateData.value)
 
-      // 默认加载第一个设备对应属性
-      if (productData.value.length > 0) {
-        handleNodeClick(mergedData.value[0].children[0])
-      }
+			// 默认加载第一个设备对应属性
+			if (productData.value.length > 0) {
+				handleNodeClick(mergedData.value[0].children[0])
+			}
 		})
 	})
 }
@@ -216,26 +211,26 @@ const del = (row: any) => {
 </script>
 <style scoped lang="scss">
 .custom-tree-node {
-  width: 100%;
-  display: flex;
-  align-items: center;
-  justify-content: space-between;
-  font-size: 14px;
-  padding-right: 8px;
-  overflow: hidden;
-
-  .tree-label {
-    width: 100%;
-    overflow: hidden;
-    text-overflow: ellipsis;
-    white-space: nowrap;
-    margin-right: 10px;
-  }
-
-  &:hover {
-    .tree-options {
-      display: block;
-    }
-  }
+	width: 100%;
+	display: flex;
+	align-items: center;
+	justify-content: space-between;
+	font-size: 14px;
+	padding-right: 8px;
+	overflow: hidden;
+
+	.tree-label {
+		width: 100%;
+		overflow: hidden;
+		text-overflow: ellipsis;
+		white-space: nowrap;
+		margin-right: 10px;
+	}
+
+	&:hover {
+		.tree-options {
+			display: block;
+		}
+	}
 }
 </style>

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

@@ -1,12 +1,12 @@
 <template>
 	<div class="page">
 		<el-card shadow="nover">
-			<el-form inline ref="queryRef">
-				<el-form-item label="场景名称" prop="name">
-					<el-input v-model="params.keyWord" placeholder="场景名称" clearable style="width: 220px" @keyup.enter.native="getList(1)" />
+			<el-form inline ref="queryRef" @submit.prevent @keyup.enter.native="getList(1)">
+				<el-form-item label="场景名称" prop="name">
+					<el-input v-model="params.keyWord" placeholder="请输入" clearable style="width: 220px" />
 				</el-form-item>
 				<el-form-item label="状态" prop="status">
-					<el-select v-model="params.status" placeholder="发布状态" clearable style="width: 160px">
+					<el-select v-model="params.status" placeholder="" clearable style="width: 120px">
 						<el-option label="全部" :value="-1" />
 						<el-option label="成功" :value="1" />
 						<el-option label="失败" :value="0" />

+ 61 - 64
src/views/iot/scene/manage/component/actionItem.vue

@@ -1,8 +1,7 @@
 <template>
   <div class="type-item">
     <div v-for="(item, index) in actionList" :key="index" class="item " :class="index > 0 ? 'biankang' : ''">
-      <div class="conicon" style="width: 100%; text-align: right; position: relative; right: -8px; top: -8px; color: red"
-        v-if="index > 0">
+      <div class="conicon" style="width: 100%; text-align: right; position: relative; right: -8px; top: -8px; color: red" v-if="index > 0">
         <el-icon @click="delAction(index)">
           <CircleClose />
         </el-icon>
@@ -12,16 +11,14 @@
       </div>
       <div class="product flex flex-warp">
         <ActionSerialItem :index="index" :serial="item.serial" :sourceData="sourceData" @saveData="saveData" @delData="delData"></ActionSerialItem>
-
-      
       </div>
 
       <div class="title flex">
         <div class="icon"></div>并行动作
       </div>
       <div class="product flex flex-warp">
-            <ActionParallelItem :index="index"  :parallel="item.parallel" :sourceData="sourceData" @saveData="saveData" @delData="delData"></ActionParallelItem>
-      
+        <ActionParallelItem :index="index" :parallel="item.parallel" :sourceData="sourceData" @saveData="saveData" @delData="delData"></ActionParallelItem>
+
       </div>
     </div>
     <div>
@@ -29,12 +26,12 @@
         <el-button type="primary" :icon="DocumentAdd" @click="addAction()">新增场景动作</el-button>
       </div>
     </div>
- 
+
   </div>
 </template>
 
 <script lang="ts" setup>
-import { PropType, ref  } from 'vue'
+import { PropType, ref } from 'vue'
 import { DocumentAdd, CircleClose } from '@element-plus/icons-vue';
 import ActionSerialItem from './actionSerialItem.vue';
 import ActionParallelItem from './actionParallelItem.vue';
@@ -42,16 +39,16 @@ import api from '/@/api/scene';
 
 
 //初始化数据
-const actionList_temp=ref([{
-  serial:[{}],
-  parallel:[{}],
+const actionList_temp = ref([{
+  serial: [{}],
+  parallel: [{}],
 }]);
-const actionList=ref([{
-  serial:[{}],
-  parallel:[{}],
+const actionList = ref([{
+  serial: [{}],
+  parallel: [{}],
 }]);
 const originalSceneList = ref([{
-	id: 0
+  id: 0
 }]);
 interface testIValueType {
   id: string;
@@ -64,74 +61,74 @@ const props = defineProps({
     type: Array as PropType<testIValueType[]>,
     default: () => []
   },
-  scene_id:{
-    type:String,
+  scene_id: {
+    type: String,
     default: () => ''
   }
 })
 
 const getOneDetail = () => {
-			api.manage.getOneDetail({ "sceneId": props.scene_id, 'group': 'action' }).then((res: any) => {
-				if (!res) {
-					addActionDetail();
-					// getOneDetail();
-				}
-
-       	originalSceneList.value = res;
-        const combinedArray = res.map((scene: any)  => {
-          const parsedBodyJson = JSON.parse(scene.bodyjson);
-          if (Array.isArray(parsedBodyJson)) {
-            const serial = parsedBodyJson.map(item => item.serial).flat();
-            const parallel = parsedBodyJson.map(item => item.parallel).flat();
-            return {
-              serial,
-              parallel
-            };
-          } else {
-            return {
-              serial: [parsedBodyJson.serial].flat(),
-              parallel: [parsedBodyJson.parallel].flat()
-            };
-          }
-        });
-        actionList.value=combinedArray;
-			})
-		};
-getOneDetail();    
+  api.manage.getOneDetail({ "sceneId": props.scene_id, 'group': 'action' }).then((res: any) => {
+    if (!res) {
+      addActionDetail();
+      // getOneDetail();
+    }
+
+    originalSceneList.value = res;
+    const combinedArray = res.map((scene: any) => {
+      const parsedBodyJson = JSON.parse(scene.bodyjson);
+      if (Array.isArray(parsedBodyJson)) {
+        const serial = parsedBodyJson.map(item => item.serial).flat();
+        const parallel = parsedBodyJson.map(item => item.parallel).flat();
+        return {
+          serial,
+          parallel
+        };
+      } else {
+        return {
+          serial: [parsedBodyJson.serial].flat(),
+          parallel: [parsedBodyJson.parallel].flat()
+        };
+      }
+    });
+    actionList.value = combinedArray;
+  })
+};
+getOneDetail();
 
 //新增一条场景动作
 const addActionDetail = () => {
-		let data = {
-			sceneId: props.scene_id,
-			group: 'action',
-			bodyjson: actionList_temp.value,
-		}
-		api.manage.addDetail(data).then((res: any) => {
-			getOneDetail();
-		});
+  let data = {
+    sceneId: props.scene_id,
+    group: 'action',
+    bodyjson: actionList_temp.value,
+  }
+  api.manage.addDetail(data).then((res: any) => {
+    getOneDetail();
+  });
 }
 //删除一条场景
 const delData = (index: number) => {
-			let ids =originalSceneList.value[index].id;
-			api.manage.delDetail(ids).then((res: any) => {
-				// getOneDetail();
-			});
+  let ids = originalSceneList.value[index].id;
+  api.manage.delDetail(ids).then((res: any) => {
+    // getOneDetail();
+  });
 }
 
 //修改一条场景
 const saveData = (data: any) => {
-      let ids = originalSceneList.value[data.index].id;
-			api.manage.editDetail({ id: ids, bodyjson:actionList.value[data.index] }).then((res: any) => {
-				  getOneDetail();
-			});
+  let ids = originalSceneList.value[data.index].id;
+  api.manage.editDetail({ id: ids, bodyjson: actionList.value[data.index] }).then((res: any) => {
+    getOneDetail();
+  });
 
 }
 
 
 const addAction = () => {
   actionList.value.push({
-    'serial':[],
-    'parallel':[],
+    'serial': [],
+    'parallel': [],
   });
   addActionDetail();
 
@@ -143,7 +140,6 @@ const delAction = (index: number) => {
 
 </script>
 <style scoped lang="scss">
-
 .type-item {
   margin-top: 15px;
 
@@ -170,7 +166,8 @@ const delAction = (index: number) => {
 
   .biankang {
     margin-top: 10px;
-    border: 1px solid #cfcfcf;;
+    border: 1px solid #cfcfcf;
+    ;
     border-radius: 2px;
   }
 

+ 54 - 55
src/views/iot/scene/manage/detail.vue

@@ -1,48 +1,47 @@
 <template>
 	<div>
-	<el-card class="system-dic-container" style="position: relative;">
-		<div class="content">
-			<div class="flex cont_box">
-				<div class="font26">场景名称:{{ detail.name }}</div>
-				<div class="pro-status"><span :class="detail.status == 1 ? 'on' : 'off'"></span>{{ detail.status == 1
-					? '启用' : '未启用' }}</div>
+		<el-card class="system-dic-container" shadow="nover" style="position: relative;">
+			<div class="content">
+				<div class="flex cont_box">
+					<div class="font26">场景名称:{{ detail.name }}</div>
+					<div class="pro-status"><span :class="detail.status == 1 ? 'on' : 'off'"></span>{{ detail.status == 1
+						? '启用' : '未启用' }}</div>
+				</div>
+				<div class="flex">
+					<div class="desc" style="margin-right: 20px;">场景类型:{{ typeList[detail.sceneType] }}</div>
+					<div class="desc">场景描述:{{ detail.description }}</div>
+					<div class="edit" @click="addOrEdit(detail)"><el-link type="primary"> <el-icon>
+								<EditPen color="#409eff" />
+							</el-icon>修改</el-link></div>
+				</div>
 			</div>
-			<div class="flex">
-				<div class="desc" style="margin-right: 20px;">场景类型:{{typeList[detail.sceneType]}}</div>
-				<div class="desc">场景描述:{{ detail.description }}</div>
-				<div class="edit" @click="addOrEdit(detail)"><el-link type="primary"> <el-icon>
-							<EditPen color="#409eff" />
-						</el-icon>修改</el-link></div>
-			</div>
-		</div>
-	</el-card>
-	<el-card style="  margin-top: 15px;" v-if="detail.sceneType==='device'">
-		<div class="font20">场景定义</div>
-		<SceneItem v-if="showstatus && sourceData.length>0" :sceneList="sceneList" :sourceData="sourceData" :sceneType="detail.sceneType" @addScenesDetail="addScenesDetail"
-			@delScenesDetail="delScenesDetail" @editScenesDetail="editScenesDetail"></SceneItem>
-	</el-card>
-	<el-card style="  margin-top: 15px;" v-if="detail.sceneType==='timer'">
-		<el-form-item label="定时触发">
-          <div style="display:flex">
-            <el-input v-model="timerData.timer" placeholder="请输入cron表达式" />
-            <el-dialog v-model="dialogVisible" title="选择Cron规则" width="60%">
-              <vue3cron @handlelisten="handlelisten"  @close="cronclose"></vue3cron>
-            </el-dialog>
-            <el-button type="success" @click="showCron()" style="margin-left: 5px;">设置</el-button>
+		</el-card>
+		<el-card shadow="nover" style="margin-top: 15px;" v-if="detail.sceneType === 'device'">
+			<div class="font20">场景定义</div>
+			<SceneItem v-if="showstatus && sourceData.length > 0" :sceneList="sceneList" :sourceData="sourceData" :sceneType="detail.sceneType" @addScenesDetail="addScenesDetail" @delScenesDetail="delScenesDetail" @editScenesDetail="editScenesDetail"></SceneItem>
+		</el-card>
+		<el-card style="  margin-top: 15px;" v-if="detail.sceneType === 'timer'">
+			<el-form-item label="定时触发">
+				<div style="display:flex">
+					<el-input v-model="timerData.timer" placeholder="请输入cron表达式" />
+					<el-dialog v-model="dialogVisible" title="选择Cron规则" width="60%">
+						<vue3cron @handlelisten="handlelisten" @close="cronclose"></vue3cron>
+					</el-dialog>
+					<el-button type="success" @click="showCron()" style="margin-left: 5px;">设置</el-button>
 
-          </div>
-        </el-form-item>
-	</el-card>
-	<el-card style="  margin-top: 15px;">
-		<div class="font20">场景动作</div>
-		<ActionItem v-if="detail.id && sourceData.length>0" :scene_id="detail.id"  :sourceData="sourceData"></ActionItem>
-	</el-card>
+				</div>
+			</el-form-item>
+		</el-card>
+		<el-card shadow="nover" style="margin-top: 15px;">
+			<div class="font20">场景动作</div>
+			<ActionItem v-if="detail.id && sourceData.length > 0" :scene_id="detail.id" :sourceData="sourceData"></ActionItem>
+		</el-card>
 
-	<EditForm ref="editFormRef" @getList="getDetail()"></EditForm>
-</div>
+		<EditForm ref="editFormRef" @getList="getDetail()"></EditForm>
+	</div>
 </template>
 <script lang="ts">
-import { toRefs, reactive, ref, defineComponent,onMounted } from 'vue';
+import { toRefs, reactive, ref, defineComponent, onMounted } from 'vue';
 import { useRoute, useRouter } from 'vue-router';
 import { EditPen, DocumentAdd } from '@element-plus/icons-vue';
 import ActionItem from './component/actionItem.vue';
@@ -71,26 +70,26 @@ const originalSceneList = ref([{
 	id: 0
 }]);
 export default defineComponent({
-	components: { EditPen, EditForm, DocumentAdd, SceneItem, ActionItem,vue3cron},
+	components: { EditPen, EditForm, DocumentAdd, SceneItem, ActionItem, vue3cron },
 	setup(props, context) {
 		const route = useRoute();
 		const router = useRouter();
 		const state = reactive({
-			timer:'',
-			timer_id:0,
-			dialogVisible:false,
+			timer: '',
+			timer_id: 0,
+			dialogVisible: false,
 			developer_status: 2,
 			showstatus: false,
-			typeList:{
-				'device':'设备触发',
-				'manual':'手动触发',
-				'timer':'定时触发',
+			typeList: {
+				'device': '设备触发',
+				'manual': '手动触发',
+				'timer': '定时触发',
 			} as any,
 			sourceData: [],
 			timerData: {
-					triggerType:'timer',
-					timer:'',
-				},
+				triggerType: 'timer',
+				timer: '',
+			},
 			detail: {
 				id: '',
 				name: '',
@@ -123,7 +122,7 @@ export default defineComponent({
 		});
 
 		const handlelisten = (e: any) => {
-			state.timerData.timer=e.cron
+			state.timerData.timer = e.cron
 			api.manage.editDetail({ id: state.timer_id, bodyjson: state.timerData })
 		};
 		const showCron = () => {
@@ -150,7 +149,7 @@ export default defineComponent({
 		const getOneDetail = () => {
 
 			const id = route.params && route.params.id;
-			if(state.detail.sceneType=='device'){
+			if (state.detail.sceneType == 'device') {
 				api.manage.getOneDetail({ "sceneId": id, 'group': 'definition' }).then((res: any) => {
 					if (!res) {
 						addScenesDetail('definition');
@@ -168,21 +167,21 @@ export default defineComponent({
 				})
 			}
 			//定时触发
-			if(state.detail.sceneType=='timer'){
+			if (state.detail.sceneType == 'timer') {
 				api.manage.getOneDetail({ "sceneId": id, 'group': 'timer' }).then((res: any) => {
 					if (!res) {
 						let data = {
 							sceneId: id,
 							group: 'timer',
-							bodyjson:state.timerData,
+							bodyjson: state.timerData,
 						}
 						api.manage.addDetail(data).then((res: any) => {
 							getOneDetail();
 						});
 					}
 
-					state.timer_id=res[0].id
-					state.timerData=JSON.parse(res[0].bodyjson);
+					state.timer_id = res[0].id
+					state.timerData = JSON.parse(res[0].bodyjson);
 
 				})
 			}

+ 7 - 15
src/views/iot/scene/manage/index.vue

@@ -3,43 +3,36 @@
 		<el-card shadow="nover">
 			<div class="search">
 				<el-form inline ref="queryRef" @keyup.enter="getList(1)">
-					<el-form-item label="场景名称" prop="keyWord">
-						<el-input v-model="params.keyWord" placeholder="请输入场景名称" clearable style="width: 240px" />
+					<el-form-item label="场景名称" prop="keyWord">
+						<el-input v-model="params.keyWord" placeholder="请输入场景名称" clearable style="width: 200px" />
 					</el-form-item>
-
-					<el-form-item label="触发方式" prop="sceneType" style="width: 200px;">
-						<el-select v-model="params.sceneType" placeholder="触发方式" clearable style="width: 240px">
+					<el-form-item label="触发方式" prop="sceneType">
+						<el-select v-model="params.sceneType" placeholder="触发方式" clearable style="width: 140px">
 							<el-option label="设备触发" value="device" />
 							<el-option label="手动触发" value="manual" />
 							<el-option label="定时触发" value="timer" />
 						</el-select>
 					</el-form-item>
-
-					<el-form-item label="运行状态" prop="status" style="width: 200px;">
-						<el-select v-model="params.status" placeholder="运行状态" clearable style="width: 240px">
+					<el-form-item label="运行状态" prop="status">
+						<el-select v-model="params.status" placeholder="运行状态" clearable style="width: 140px">
 							<el-option label="全部" :value="-1" />
 							<el-option label="启用" :value="1" />
 							<el-option label="禁用" :value="0" />
 						</el-select>
 					</el-form-item>
-
 					<el-form-item>
-
 						<el-button type="primary" class="ml10" @click="getList(1)">
 							<el-icon>
 								<ele-Search />
 							</el-icon>
 							查询
 						</el-button>
-					</el-form-item>
-					<el-form-item>
 						<el-button type="success" v-auth="'add'" @click="addOrEdit()">
 							<el-icon>
 								<ele-FolderAdd />
 							</el-icon>
 							新增场景
 						</el-button>
-
 					</el-form-item>
 				</el-form>
 			</div>
@@ -82,8 +75,7 @@
 <script lang="ts" setup>
 import api from '/@/api/scene';
 import { useSearch } from '/@/hooks/useCommon';
-import { ElMessageBox, ElMessage, FormInstance } from 'element-plus';
-import getOrigin from '/@/utils/origin'
+import { ElMessageBox, ElMessage } from 'element-plus';
 import EditForm from './edit.vue';
 import { ref } from 'vue';
 import { useRouter } from 'vue-router';

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

@@ -38,7 +38,7 @@
         </el-form-item>
       </el-form>
       <!-- 字典切换 -->
-      <el-tabs v-model="tableData.param.moduleClassify" class="demo-tabs" @tab-change="dataList">
+      <el-tabs v-model="tableData.param.moduleClassify" @tab-change="dataList">
         <el-tab-pane v-for="dict in tabDataList" :label="dict.dictLabel" :name="dict.dictValue"></el-tab-pane>
       </el-tabs>
       <el-table :data="tableData.data" style="width: 100%" @selection-change="handleSelectionChange" v-loading="tableData.loading">

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

@@ -10,7 +10,7 @@
 		</div>
 
 		<div class="content-box">
-			<el-tabs v-model="activeName" class="demo-tabs" @tab-click="handleClick">
+			<el-tabs v-model="activeName" @tab-click="handleClick">
 				<el-tab-pane label="数据源信息" name="1">
 					<el-form label-width="110px" inline>
 						<el-divider content-position="left">基本信息</el-divider>

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

@@ -39,7 +39,7 @@
         </el-form-item>
       </el-form>
       <!-- 字典切换 -->
-      <el-tabs v-model="tableData.param.moduleClassify" class="demo-tabs" @tab-change="typeList">
+      <el-tabs v-model="tableData.param.moduleClassify" @tab-change="typeList">
         <el-tab-pane v-for="dict in tabDataList" :label="dict.dictLabel" :name="dict.dictValue">
         </el-tab-pane>
       </el-tabs>

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

@@ -1,7 +1,7 @@
 <template>
   <div class="page">
     <el-card shadow="nover">
-      <el-tabs v-model="activeName" class="demo-tabs" @tab-click="handleClick">
+      <el-tabs v-model="activeName" @tab-click="handleClick">
         <el-tab-pane label="服务日志" name="1"> </el-tab-pane>
         <el-tab-pane label="数据库日志" name="2"> </el-tab-pane>
         <el-tab-pane label="运行日志" name="3"> </el-tab-pane>

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

@@ -1,5 +1,5 @@
 <template>
-  <div class="" v-loading="loading">
+  <div v-loading="loading">
     <el-row :gutter="15">
       <el-col :xs="24" :sm="12" :md="8" class="mb-4">
         <el-card shadow="nover" class="box-card-meter">