Selaa lähdekoodia

fix: 优化设备管理,网络组件,数据采集等页面中内页的样式

yanglzh 1 vuosi sitten
vanhempi
sitoutus
d5f645fcd0

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

@@ -1,6 +1,6 @@
 <template>
-	<div class="page flex-row gap-5">
-		<el-card shadow="nover">
+	<div class="page flex-row gap-4">
+		<el-card shadow="nover" style="width:270px">
 			<el-scrollbar>
 				<el-input :prefix-icon="search" v-model="filterText" placeholder="请输入组织名称" clearable style="width: 100%;" />
 				<el-tree ref="treeRef" class="filter-tree mt-4" :data="deptData" :props="deptProps" default-expand-all :filter-node-method="deptFilterNode" @node-click="handleNodeClick">
@@ -8,10 +8,11 @@
 						<div class="custom-tree-node" :title="node.label">
 							{{ node.label }}
 						</div>
-					</template></el-tree>
+					</template>
+				</el-tree>
 			</el-scrollbar>
 		</el-card>
-		<el-card shadow="nover">
+		<el-card shadow="nover" class="flex1">
 			<el-form :model="tableData.param" ref="queryRef" inline label-width="68px">
 				<el-form-item label="关键字" prop="keyWords">
 					<el-input v-model="tableData.param.keyWords" placeholder="请输入用户名或姓名" clearable style="width: 240px" @keyup.enter.native="userList" />