Quellcode durchsuchen

Merge branch 'master' into professional2

yanglzh vor 1 Jahr
Ursprung
Commit
f643a77567

+ 1 - 0
src/theme/fast.scss

@@ -22,6 +22,7 @@
 .page-full-part {
   flex      : 1;
   overflow-y: auto;
+  overflow-x: hidden;
 }
 
 .full-part {

+ 57 - 59
src/views/iot/alarm/log/index.vue

@@ -1,64 +1,62 @@
 <template>
-	<div class="system-dic-container">
-		<el-card shadow="nover">
-			<div class="system-user-search mb15">
-				<el-form :model="tableData.param" ref="queryRef" :inline="true" label-width="68px">
-					<el-form-item label="创建时间" prop="dateRange">
-						<el-date-picker v-model="tableData.param.dateRange" size="default" style="width: 240px" value-format="YYYY-MM-DD" type="daterange" range-separator="-" start-placeholder="开始日期" end-placeholder="结束日期"></el-date-picker>
-					</el-form-item>
-					<el-form-item label="告警状态" prop="status" style="width: 200px;">
-						<el-select v-model="tableData.param.status" placeholder="告警状态" clearable size="default" style="width: 240px">
-							<el-option label="未处理" :value="0" />
-							<el-option label="已处理" :value="1" />
-							<el-option label="已忽略" :value="2" />
-						</el-select>
-					</el-form-item>
-					<el-form-item>
-						<el-button size="default" type="primary" class="ml10" @click="typeList">
-							<el-icon>
-								<ele-Search />
-							</el-icon>
-							查询
-						</el-button>
-						<el-button size="default" @click="resetQuery(queryRef)">
-							<el-icon>
-								<ele-Refresh />
-							</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 label="ID" align="center" prop="id" width="100" v-col="'ID'" />
-				<el-table-column label="告警类型" prop="type" width="120" show-overflow-tooltip v-col="'type'">
-					<template #default="scope">
-						<span v-if="scope.row.type == 1">规则告警</span>
-						<span v-else>设备自主告警</span>
-					</template>
-				</el-table-column>
-				<el-table-column label="规则级别" prop="alarmLevel.name" width="100" align="center" show-overflow-tooltip v-col="'alarmLevel'"></el-table-column>
-				<el-table-column label="规则名称" prop="ruleName" show-overflow-tooltip v-col="'ruleName'" />
-				<el-table-column label="产品标识" prop="productKey" show-overflow-tooltip v-col="'productKey'" />
-				<el-table-column label="设备标识" prop="deviceKey" show-overflow-tooltip v-col="'deviceKey'" />
+	<div class="page">
+		<div class="system-user-search">
+			<el-form :model="tableData.param" ref="queryRef" :inline="true" label-width="68px">
+				<el-form-item label="创建时间" prop="dateRange">
+					<el-date-picker v-model="tableData.param.dateRange" size="default" style="width: 240px" value-format="YYYY-MM-DD" type="daterange" range-separator="-" start-placeholder="开始日期" end-placeholder="结束日期"></el-date-picker>
+				</el-form-item>
+				<el-form-item label="告警状态" prop="status" style="width: 200px;">
+					<el-select v-model="tableData.param.status" placeholder="告警状态" clearable size="default" style="width: 240px">
+						<el-option label="未处理" :value="0" />
+						<el-option label="已处理" :value="1" />
+						<el-option label="已忽略" :value="2" />
+					</el-select>
+				</el-form-item>
+				<el-form-item>
+					<el-button size="default" type="primary" class="ml10" @click="typeList">
+						<el-icon>
+							<ele-Search />
+						</el-icon>
+						查询
+					</el-button>
+					<el-button size="default" @click="resetQuery(queryRef)">
+						<el-icon>
+							<ele-Refresh />
+						</el-icon>
+						重置
+					</el-button>
+				</el-form-item>
+			</el-form>
+		</div>
+		<el-table :data="tableData.data" style="width: 100%" v-loading="tableData.loading" max-height="calc(100vh  - 255px)">
+			<el-table-column label="ID" align="center" prop="id" width="100" v-col="'ID'" />
+			<el-table-column label="告警类型" prop="type" width="120" show-overflow-tooltip v-col="'type'">
+				<template #default="scope">
+					<span v-if="scope.row.type == 1">规则告警</span>
+					<span v-else>设备自主告警</span>
+				</template>
+			</el-table-column>
+			<el-table-column label="规则级别" prop="alarmLevel.name" width="100" align="center" show-overflow-tooltip v-col="'alarmLevel'"></el-table-column>
+			<el-table-column label="规则名称" prop="ruleName" show-overflow-tooltip v-col="'ruleName'" />
+			<el-table-column label="产品标识" prop="productKey" show-overflow-tooltip v-col="'productKey'" />
+			<el-table-column label="设备标识" prop="deviceKey" show-overflow-tooltip v-col="'deviceKey'" />
 
-				<el-table-column prop="status" label="告警状态" width="100" align="center" v-col="'status'">
-					<template #default="scope">
-						<el-tag type="danger" size="small" v-if="scope.row.status == 0">未处理</el-tag>
-						<el-tag type="success" size="small" v-if="scope.row.status == 1">已处理</el-tag>
-						<el-tag type="info" size="small" v-if="scope.row.status == 2">已忽略</el-tag>
-					</template>
-				</el-table-column>
-				<el-table-column prop="createdAt" label="告警时间" align="center" width="160" v-col="'createdAt'"></el-table-column>
-				<el-table-column label="操作" width="140" align="center" fixed="right" v-col="'handle'">
-					<template #default="scope">
-						<el-button size="small" text type="primary" @click="onOpenDetailDic(scope.row)" v-auth="'detail'">详情</el-button>
-						<el-button size="small" text type="warning" @click="onOpenEditDic(scope.row)" v-if="scope.row.status == 0" v-auth="'edit'">处理</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="typeList" />
-		</el-card>
+			<el-table-column prop="status" label="告警状态" width="100" align="center" v-col="'status'">
+				<template #default="scope">
+					<el-tag type="danger" size="small" v-if="scope.row.status == 0">未处理</el-tag>
+					<el-tag type="success" size="small" v-if="scope.row.status == 1">已处理</el-tag>
+					<el-tag type="info" size="small" v-if="scope.row.status == 2">已忽略</el-tag>
+				</template>
+			</el-table-column>
+			<el-table-column prop="createdAt" label="告警时间" align="center" width="160" v-col="'createdAt'"></el-table-column>
+			<el-table-column label="操作" width="140" align="center" fixed="right" v-col="'handle'">
+				<template #default="scope">
+					<el-button size="small" text type="primary" @click="onOpenDetailDic(scope.row)" v-auth="'detail'">详情</el-button>
+					<el-button size="small" text type="warning" @click="onOpenEditDic(scope.row)" v-if="scope.row.status == 0" v-auth="'edit'">处理</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="typeList" />
 
 		<EditDic ref="editDicRef" @dataList="typeList" />
 		<DetailDic ref="detailRef" @dataList="typeList" />

+ 108 - 111
src/views/iot/alarm/setting/index.vue

@@ -1,119 +1,104 @@
 <template>
-	<div class="system-dic-container">
-		<el-card shadow="nover">
-			<div class="system-user-search mb15">
-				<el-form :model="tableData.param" ref="queryRef" :inline="true">
-					<el-form-item>
-						<el-button size="default" type="primary" class="ml10" @click="onOpenAdd" v-auth="'add'">
-							<el-icon>
-								<ele-FolderAdd />
-							</el-icon>
-							新增告警
-						</el-button>
-						<el-button size="default" type="primary" class="ml10" @click="onOpenLevel" v-auth="'level'">
-							<el-icon>
-								<ele-Setting />
-							</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="6" 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" v-col="'image'">
-											<img width="88" height="88" src="/src/assets/img/alarm.svg" alt="" />
-										</div>
-										<div class="card-item-body">
-											<div class="card-item-header">
-												<div class="" v-col="'name'">
-													<div class="ellipsis card-item-header-name" style="width: 100%; height: 45px">{{ item.name }}</div>
-													<div class="card-item-header-name" style="display: none"></div>
-												</div>
-											</div>
-											<div class="card-item-content" v-col="'alarm'">
-												<div>
-													<label>触发:</label>
-													<div class="">
-														<div>级别:</div>
-													</div>
-												</div>
-												<div>
-													<label>{{ item.triggerTypeName }}</label>
-													<div class="">
-														<div>{{ item.alarmLevel.name }}</div>
-													</div>
-												</div>
-											</div>
+	<div class="page page-full">
+		<div class="">
+			<el-form :model="tableData.param" ref="queryRef" :inline="true">
+				<el-form-item class="mb-0">
+					<el-button size="default" type="primary" class="ml10" @click="onOpenAdd" v-auth="'add'">
+						<el-icon>
+							<ele-FolderAdd />
+						</el-icon>
+						新增告警
+					</el-button>
+					<el-button size="default" type="primary" class="ml10" @click="onOpenLevel" v-auth="'level'">
+						<el-icon>
+							<ele-Setting />
+						</el-icon>
+						级别设置
+					</el-button>
+				</el-form-item>
+			</el-form>
+		</div>
+		<el-divider />
+		<el-row class="page-full-part">
+			<el-col :span="6" v-for="(item, index) in tableData.data" :key="index">
+				<div class="card">
+					<div class="ant-card">
+						<div class="ant-card-body">
+							<div class="pro-table-card-item">
+								<div class="card-item-avatar" v-col="'image'">
+									<img width="88" height="88" src="/src/assets/img/alarm.svg" />
+								</div>
+								<div class="card-item-body">
+									<div class="card-item-header">
+										<div class="" v-col="'name'">
+											<div class="ellipsis card-item-header-name" style="width: 100%; height: 45px">{{ item.name }}</div>
 										</div>
 									</div>
-
-									<div class="card-state success" v-if="item.status == 1" v-col="'liststatus'">
-										<div class="card-state-content">
-											<span class="ant-badge ant-badge-status ant-badge-not-a-wrapper">
-												<span class="ant-badge-status-dot ant-badge-status-success"></span>
-												<span class="ant-badge-status-text">已启用</span>
-											</span>
+									<div class="card-item-content" v-col="'alarm'">
+										<div>
+											<label>触发:</label>
+											<div class="">
+												<div>级别:</div>
+											</div>
 										</div>
-									</div>
-									<div class="card-state error" v-if="item.status == 0" v-col="'liststatus'">
-										<div class="card-state-content">
-											<span class="ant-badge ant-badge-status ant-badge-not-a-wrapper"><span class="ant-badge-status-dot ant-badge-status-error"></span><span class="ant-badge-status-text">未启用</span></span>
+										<div>
+											<label>{{ item.triggerTypeName }}</label>
+											<div class="">
+												<div>{{ item.alarmLevel.name }}</div>
+											</div>
 										</div>
 									</div>
 								</div>
 							</div>
-							<div class="card-tools">
-								<div class="card-button" @click="onOpenEdit(item)" v-auth="'edit'">
-									<el-button size="default" type="primary" class="ml10" text bg>
-										<el-icon>
-											<ele-Edit />
-										</el-icon>
-										修改
-									</el-button>
-								</div>
 
-
-								<div class="card-button" v-if="item.status == 0" v-auth="'status'">
-									<el-button size="default" type="warning" text bg @click="onActionStatus(item)">
-										<el-icon>
-											<ele-Check />
-										</el-icon>
-										启用
-									</el-button>
-								</div>
-
-								<div class="card-button" v-if="item.status == 1" v-auth="'status'">
-									<el-button size="default" type="info" text bg @click="onActionStatus(item)">
-										<el-icon>
-											<ele-Close />
-										</el-icon>
-										禁用
-									</el-button>
+							<div class="card-state success" v-if="item.status == 1" v-col="'liststatus'">
+								<div class="card-state-content">
+									<span class="ant-badge ant-badge-status ant-badge-not-a-wrapper">
+										<span class="ant-badge-status-dot ant-badge-status-success"></span>
+										<span class="ant-badge-status-text">已启用</span>
+									</span>
 								</div>
-
-								<div class="card-button" @click="onRowDel(item)" v-auth="'del'">
-									<el-button size="default" type="info" text bg>
-										<el-icon>
-											<ele-Delete />
-										</el-icon>
-										删除
-									</el-button>
+							</div>
+							<div class="card-state error" v-if="item.status == 0" v-col="'liststatus'">
+								<div class="card-state-content">
+									<span class="ant-badge ant-badge-status ant-badge-not-a-wrapper"><span class="ant-badge-status-dot ant-badge-status-error"></span><span class="ant-badge-status-text">未启用</span></span>
 								</div>
 							</div>
 						</div>
-					</el-col>
-				</el-row>
-			</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">
+						<el-button size="default" type="primary" text bg @click="onOpenEdit(item)" v-auth="'edit'">
+							<el-icon>
+								<ele-Edit />
+							</el-icon>
+							修改
+						</el-button>
+
+						<el-button size="default" type="warning" text bg @click="onActionStatus(item)" v-if="item.status == 0" v-auth="'status'">
+							<el-icon>
+								<ele-Check />
+							</el-icon>
+							启用
+						</el-button>
 
+						<el-button size="default" type="info" text bg @click="onActionStatus(item)" v-if="item.status == 1" v-auth="'status'">
+							<el-icon>
+								<ele-Close />
+							</el-icon>
+							禁用
+						</el-button>
+
+						<el-button size="default" type="info" text bg @click="onRowDel(item)" v-auth="'del'">
+							<el-icon>
+								<ele-Delete />
+							</el-icon>
+							删除
+						</el-button>
+					</div>
+				</div>
+			</el-col>
+		</el-row>
+		<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" />
 		<LevelDic ref="levelDicRef" @dataList="dataList" />
 	</div>
@@ -276,13 +261,11 @@ export default defineComponent({
 }
 
 .card {
-	padding: 10px;
+	margin: 0 10px 20px;
 }
 
 .ant-card {
 	box-sizing: border-box;
-	margin: 10px;
-	width: 97%;
 	font-size: 14px;
 	font-variant: tabular-nums;
 	border: 1px solid var(--next-border-color-light);
@@ -297,13 +280,18 @@ export default defineComponent({
 }
 
 .ant-card-body {
-	padding: 24px;
+	padding: 12px;
 	zoom: 1;
 	overflow: hidden;
 }
 
 .pro-table-card-item {
 	display: flex;
+	justify-content: stretch;
+	.card-item-avatar{
+		display: flex;
+		align-items: center;
+	}
 }
 
 .pro-table-card-item .card-item-avatar {
@@ -388,12 +376,20 @@ export default defineComponent({
 
 .card-tools {
 	display: flex;
-	margin-top: 2px;
+	margin-top: 8px;
+	justify-content: space-between;
+	overflow: hidden;
+	gap: 8px;
+
+	.el-button {
+		flex: 1;
+		margin-left: 0;
+	}
 }
 
-.card-tools .card-button:not(:last-child) {
+/* /* .card-tools .card-button:not(:last-child) {
 	margin-right: 8px;
-}
+} */
 
 .card-tools .card-button {
 	display: flex;
@@ -406,7 +402,7 @@ export default defineComponent({
 	border-radius: 0;
 }
 
-.ant-btn-link {
+*/ .ant-btn-link {
 	color: #1d39c4;
 	border-color: transparent;
 	background: transparent;
@@ -466,4 +462,5 @@ export default defineComponent({
 	margin-top: 20px;
 	height: 30px;
 	line-height: 30px;
-}</style>
+}
+</style>

+ 56 - 58
src/views/iot/certificate/index.vue

@@ -1,61 +1,59 @@
 <template>
-	<div class="system-dic-container">
-		<el-card shadow="nover">
-			<div class="system-user-search mb15">
-				<el-form :model="state.tableData.param" ref="queryRef" :inline="true" label-width="60px">
-					<el-form-item label="关键字" prop="keyWord">
-						<el-input v-model="state.tableData.param.name" placeholder="请输入关键字" clearable size="default" @keyup.enter="queryList" />
-					</el-form-item>
-					<el-form-item>
-						<el-button v-auth="'query'" size="default" type="primary" class="ml10" @click="queryList">
-							<el-icon>
-								<ele-Search />
-							</el-icon>
-							查询
-						</el-button>
-						<el-button v-auth="'reset'" size="default" @click="resetQuery(queryRef)">
-							<el-icon>
-								<ele-Refresh />
-							</el-icon>
-							重置
-						</el-button>
-						<el-button v-auth="'add'" size="default" type="primary" class="ml10" @click="operate('add')">
-							<el-icon>
-								<ele-FolderAdd />
-							</el-icon>
-							新增证书
-						</el-button>
-					</el-form-item>
-				</el-form>
-			</div>
-			<!--  -->
-			<el-table :data="state.tableData.data" v-loading="state.tableData.loading" style="width: 100%">
-				<!-- <el-table-column type="selection" width="55" align="center" /> -->
-				<el-table-column v-col="'id'" label="ID" align="center" prop="id" width="100" />
-				<el-table-column v-col="'name'" label="证书名称" prop="name" min-width="120" show-overflow-tooltip />
-				<el-table-column v-col="'standard'" label="证书标准" prop="standard" min-width="120" show-overflow-tooltip>
-					<template #default="scope">
-						{{ filterStandard(scope.row.standard) }}
-						<!-- <el-button size="small" text type="primary" @click="operate('editParams', scope.row)">编辑</el-button> -->
-						<!-- <el-button size="small" text type="danger" @click="operate('delete', scope.row)">删除</el-button> -->
-					</template>
-				</el-table-column>
-				<el-table-column v-col="'description'" label="说明" prop="description" min-width="120" show-overflow-tooltip />
-				<el-table-column label="状态" width="120" align="center">
-					<template #default="scope">
-						<el-switch v-auth="'startOrStop'" v-model="scope.row.status" inline-prompt :active-value="1" :inactive-value="0" active-text="启" inactive-text="禁" @change="handleStatusChange(scope.row)"></el-switch>
-						<span v-noauth="'startOrStop'">{{ scope.row.status ? '正常' : '暂停' }}</span>
-					</template>
-				</el-table-column>
-				<el-table-column v-col="'handle'" label="操作" width="180" 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>
-					</template>
-				</el-table-column>
-			</el-table>
-			<pagination v-show="state.tableData.total > 0" :total="state.tableData.total" v-model:page="state.tableData.param.pageNum" v-model:limit="state.tableData.param.pageSize" @pagination="queryList" />
-		</el-card>
+	<div class="page">
+		<div class="system-user-search">
+			<el-form :model="state.tableData.param" ref="queryRef" :inline="true" label-width="60px">
+				<el-form-item label="关键字" prop="keyWord">
+					<el-input v-model="state.tableData.param.name" placeholder="请输入关键字" clearable size="default" @keyup.enter="queryList" />
+				</el-form-item>
+				<el-form-item>
+					<el-button v-auth="'query'" size="default" type="primary" class="ml10" @click="queryList">
+						<el-icon>
+							<ele-Search />
+						</el-icon>
+						查询
+					</el-button>
+					<el-button v-auth="'reset'" size="default" @click="resetQuery(queryRef)">
+						<el-icon>
+							<ele-Refresh />
+						</el-icon>
+						重置
+					</el-button>
+					<el-button v-auth="'add'" size="default" type="primary" class="ml10" @click="operate('add')">
+						<el-icon>
+							<ele-FolderAdd />
+						</el-icon>
+						新增证书
+					</el-button>
+				</el-form-item>
+			</el-form>
+		</div>
+		<!--  -->
+		<el-table :data="state.tableData.data" v-loading="state.tableData.loading" style="width: 100%" max-height="calc(100vh - 255px)">>
+			<!-- <el-table-column type="selection" width="55" align="center" /> -->
+			<el-table-column v-col="'id'" label="ID" align="center" prop="id" width="100" />
+			<el-table-column v-col="'name'" label="证书名称" prop="name" min-width="120" show-overflow-tooltip />
+			<el-table-column v-col="'standard'" label="证书标准" prop="standard" min-width="120" show-overflow-tooltip>
+				<template #default="scope">
+					{{ filterStandard(scope.row.standard) }}
+					<!-- <el-button size="small" text type="primary" @click="operate('editParams', scope.row)">编辑</el-button> -->
+					<!-- <el-button size="small" text type="danger" @click="operate('delete', scope.row)">删除</el-button> -->
+				</template>
+			</el-table-column>
+			<el-table-column v-col="'description'" label="说明" prop="description" min-width="120" show-overflow-tooltip />
+			<el-table-column label="状态" width="120" align="center">
+				<template #default="scope">
+					<el-switch v-auth="'startOrStop'" v-model="scope.row.status" inline-prompt :active-value="1" :inactive-value="0" active-text="启" inactive-text="禁" @change="handleStatusChange(scope.row)"></el-switch>
+					<span v-noauth="'startOrStop'">{{ scope.row.status ? '正常' : '暂停' }}</span>
+				</template>
+			</el-table-column>
+			<el-table-column v-col="'handle'" label="操作" width="180" 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>
+				</template>
+			</el-table-column>
+		</el-table>
+		<pagination v-show="state.tableData.total > 0" :total="state.tableData.total" v-model:page="state.tableData.param.pageNum" v-model:limit="state.tableData.param.pageSize" @pagination="queryList" />
 		<EditParams ref="editParamsRef" @update="queryList" />
 	</div>
 </template>
@@ -145,7 +143,7 @@ const operate = (type: string, row: any) => {
 			editParamsRef.value.openDialog()
 			break
 		case 'editParams':
-			editParamsRef.value.openDialog({...row})
+			editParamsRef.value.openDialog({ ...row })
 			break
 		case 'buildConfig':
 			buildConfigRef.value.openDialog({ ...row })

+ 46 - 47
src/views/iot/device/channel/index.vue

@@ -7,55 +7,54 @@
  * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
 -->
 <template>
-	<div class="page">
-		<el-card shadow="nover">
-			<div class="search">
-				<el-form :model="params" :inline="true" ref="queryRef" @keyup.enter.native="getList(1)">
-					<el-form-item label="通道名称" prop="title">
-						<el-input v-model="params.title" placeholder="请输入通道名称" clearable style="width: 240px" />
-					</el-form-item>
-					<el-form-item label="注册码" prop="number">
-						<el-input v-model="params.number" placeholder="请输入注册码" clearable style="width: 240px" />
-					</el-form-item>
-					<el-form-item>
-						<el-button size="default" type="primary" class="ml10" @click="getList(1)">
-							<el-icon>
-								<ele-Search />
-							</el-icon>
-							查询
-						</el-button>
-						<el-button size="default" @click="resetQuery()">
-							<el-icon>
-								<ele-Refresh />
-							</el-icon>
-							重置
-						</el-button>
-						<el-button type="primary" @click="addOrEdit()" v-auth="'add'">
-							<el-icon>
-								<ele-FolderAdd />
-							</el-icon>
-							新增通道
-						</el-button>
-					</el-form-item>
-				</el-form>
-			</div>
-			<el-table :data="tableData" style="width: 100%" v-loading="loading">
-				<el-table-column type="index" label="序号" width="80" align="center" />
-				<el-table-column prop="title" label="通道名称" align="center" show-overflow-tooltip></el-table-column>
-				<el-table-column prop="number" label="注册码" align="center" show-overflow-tooltip></el-table-column>
-				<el-table-column prop="slaveId" label="设备地址" align="center" show-overflow-tooltip></el-table-column>
-				<el-table-column label="操作" width="100" align="center">
-					<template #default="scope">
-						<el-button size="small" text type="primary" v-auth="'detail'" @click="viewDetail(scope.row)">详情</el-button>
-						<el-button size="small" text type="info" v-auth="'del'" @click="onDel(scope.row)">删除</el-button>
-					</template>
-				</el-table-column>
-			</el-table>
-			<pagination v-if="params.total" :total="params.total" v-model:page="params.page" v-model:limit="params.size" @pagination="getList()" />
-		</el-card>
+	<el-card shadow="nover" class="page-full">
+		<div class="search">
+			<el-form :model="params" :inline="true" ref="queryRef" @keyup.enter.native="getList(1)">
+				<el-form-item label="通道名称" prop="title">
+					<el-input v-model="params.title" placeholder="请输入通道名称" clearable style="width: 240px" />
+				</el-form-item>
+				<el-form-item label="注册码" prop="number">
+					<el-input v-model="params.number" placeholder="请输入注册码" clearable style="width: 240px" />
+				</el-form-item>
+				<el-form-item>
+					<el-button size="default" type="primary" class="ml10" @click="getList(1)">
+						<el-icon>
+							<ele-Search />
+						</el-icon>
+						查询
+					</el-button>
+					<el-button size="default" @click="resetQuery()">
+						<el-icon>
+							<ele-Refresh />
+						</el-icon>
+						重置
+					</el-button>
+					<el-button type="primary" @click="addOrEdit()" v-auth="'add'">
+						<el-icon>
+							<ele-FolderAdd />
+						</el-icon>
+						新增通道
+					</el-button>
+				</el-form-item>
+			</el-form>
+		</div>
+		<el-table :data="tableData" style="width: 100%" v-loading="loading" max-height="calc(100vh - 255px)">
+			<el-table-column type="index" label="序号" width="80" align="center" />
+			<el-table-column prop="title" label="通道名称" align="center" show-overflow-tooltip></el-table-column>
+			<el-table-column prop="number" label="注册码" align="center" show-overflow-tooltip></el-table-column>
+			<el-table-column prop="slaveId" label="设备地址" align="center" show-overflow-tooltip></el-table-column>
+			<el-table-column label="操作" width="100" align="center">
+				<template #default="scope">
+					<el-button size="small" text type="primary" v-auth="'detail'" @click="viewDetail(scope.row)">详情</el-button>
+					<el-button size="small" text type="info" v-auth="'del'" @click="onDel(scope.row)">删除</el-button>
+				</template>
+			</el-table-column>
+		</el-table>
+		<pagination v-if="params.total" :total="params.total" v-model:page="params.page" v-model:limit="params.size" @pagination="getList()" />
+
 		<EditForm ref="editFormRef" @getList="getList(1)"></EditForm>
 		<detailForm ref="detailFormRef" @getList="getList(1)"></detailForm>
-	</div>
+	</el-card>
 </template>
 
 <script lang="ts" setup>

+ 49 - 50
src/views/iot/device/template/index.vue

@@ -1,56 +1,55 @@
 <template>
-	<div class="page">
-		<el-card shadow="nover">
-			<div class="search">
-				<el-form :model="params" :inline="true" ref="queryRef">
-					<el-form-item label="模板名称" prop="title">
-						<el-input v-model="params.title" placeholder="请输入模板名称" clearable style="width: 240px" @keyup.enter.native="getList(1)" />
-					</el-form-item>
-					<el-form-item>
-						<el-button size="default" type="primary" class="ml10" @click="getList(1)">
-							<el-icon>
-								<ele-Search />
-							</el-icon>
-							查询
-						</el-button>
-						<el-button size="default" @click="resetQuery()">
-							<el-icon>
-								<ele-Refresh />
-							</el-icon>
-							重置
-						</el-button>
-						<el-button type="primary" @click="addOrEdit()" v-auth="'add'">
-							<el-icon>
-								<ele-FolderAdd />
-							</el-icon>
-							新增模板
-						</el-button>
-					</el-form-item>
-				</el-form>
-			</div>
-			<el-table :data="tableData" style="width: 100%" v-loading="loading">
-				<el-table-column type="index" label="序号" width="80" align="center" />
-				<el-table-column prop="title" label="模板名称" align="center" show-overflow-tooltip></el-table-column>
-				<el-table-column prop="mode" label="模式" align="center" width="120" show-overflow-tooltip>
-					<template #default="{ row }">
-						{{ row.mode === 0 ? '顺序读取' : '批量读取' }}
-					</template>
-				</el-table-column>
-				<el-table-column prop="remarks" label="备注" align="center" show-overflow-tooltip></el-table-column>
-				<el-table-column label="操作" width="160" align="center">
-					<template #default="scope">
-						<el-button size="small" text type="primary" v-auth="'upload'" @click="handleImport(scope.row)">导入</el-button>
-						<el-button size="small" text type="primary" v-auth="'download'" @click="handleExport(scope.row)">导出</el-button>
-						<el-button size="small" text type="primary" v-auth="'detail'" @click="addOrEdit(scope.row)">详情</el-button>
-						<el-button size="small" text type="info" v-auth="'del'" @click="onDel(scope.row)">删除</el-button>
-					</template>
-				</el-table-column>
-			</el-table>
-			<pagination v-if="params.total" :total="params.total" v-model:page="params.page" v-model:limit="params.size" @pagination="getList()" />
-		</el-card>
+	<el-card shadow="nover" class="page-full">
+		<div class="search">
+			<el-form :model="params" :inline="true" ref="queryRef">
+				<el-form-item label="模板名称" prop="title">
+					<el-input v-model="params.title" placeholder="请输入模板名称" clearable style="width: 240px" @keyup.enter.native="getList(1)" />
+				</el-form-item>
+				<el-form-item>
+					<el-button size="default" type="primary" class="ml10" @click="getList(1)">
+						<el-icon>
+							<ele-Search />
+						</el-icon>
+						查询
+					</el-button>
+					<el-button size="default" @click="resetQuery()">
+						<el-icon>
+							<ele-Refresh />
+						</el-icon>
+						重置
+					</el-button>
+					<el-button type="primary" @click="addOrEdit()" v-auth="'add'">
+						<el-icon>
+							<ele-FolderAdd />
+						</el-icon>
+						新增模板
+					</el-button>
+				</el-form-item>
+			</el-form>
+		</div>
+		<el-table :data="tableData" style="width: 100%" v-loading="loading" max-height="calc(100vh - 255px)">
+			<el-table-column type="index" label="序号" width="80" align="center" />
+			<el-table-column prop="title" label="模板名称" align="center" show-overflow-tooltip></el-table-column>
+			<el-table-column prop="mode" label="模式" align="center" width="120" show-overflow-tooltip>
+				<template #default="{ row }">
+					{{ row.mode === 0 ? '顺序读取' : '批量读取' }}
+				</template>
+			</el-table-column>
+			<el-table-column prop="remarks" label="备注" align="center" show-overflow-tooltip></el-table-column>
+			<el-table-column label="操作" width="160" align="center">
+				<template #default="scope">
+					<el-button size="small" text type="primary" v-auth="'upload'" @click="handleImport(scope.row)">导入</el-button>
+					<el-button size="small" text type="primary" v-auth="'download'" @click="handleExport(scope.row)">导出</el-button>
+					<el-button size="small" text type="primary" v-auth="'detail'" @click="addOrEdit(scope.row)">详情</el-button>
+					<el-button size="small" text type="info" v-auth="'del'" @click="onDel(scope.row)">删除</el-button>
+				</template>
+			</el-table-column>
+		</el-table>
+		<pagination v-if="params.total" :total="params.total" v-model:page="params.page" v-model:limit="params.size" @pagination="getList()" />
+
 		<EditForm ref="editFormRef" @getList="getList(1)"></EditForm>
 		<ImportFile ref="importFile" />
-	</div>
+	</el-card>
 </template>
 
 <script lang="ts" setup>

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

@@ -304,7 +304,7 @@ export default defineComponent({
 				data.push({ name: getname[i], value: getvalue[i] });
 			}
 
-			const colorList = ['#FF0000', '#FEC279', '#968AF5', '#51A3FC', '#36C78B',];
+			const colorList = ['#FF0000', '#FEC279', '#968AF5', '#51A3FC', '#669',];
 			const color = state.pieChartLevel.map(level => colorList[level - 1])
 
 			const option = {

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

@@ -1,6 +1,6 @@
 <template>
   <div>
-    <el-table v-loading="loading" :data="data" style="width: 100%" max-height="calc(100vh - 255px)">
+    <el-table v-loading="loading" :data="data" style="width: 100%" max-height="calc(100vh - 270px)">
       <el-table-column align="center" prop="id" label="ID" width="100" v-col="'id'" />
       <!-- <el-table-column align="center" prop="server" label="服务器"/> -->
       <el-table-column align="center" prop="name" label="名称" v-col="'name'" />

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

@@ -1,14 +1,8 @@
 <template>
-	<el-card shadow="nover">
+	<el-card shadow="nover" class="page-full">
 		<div class="search">
 			<el-form :inline="true">
 				<el-form-item>
-					<!-- <el-button size="default" type="primary" class="ml10" @click="getList(1)">
-							<el-icon>
-								<ele-Search />
-							</el-icon>
-							查询
-						</el-button> -->
 					<el-button type="primary" v-auth="'add'" @click="addOrEdit()">
 						<el-icon>
 							<ele-FolderAdd />
@@ -18,7 +12,7 @@
 				</el-form-item>
 			</el-form>
 		</div>
-		<el-table :data="tableData" style="width: 100%" v-loading="loading">
+		<el-table :data="tableData" style="width: 100%" v-loading="loading" max-height="calc(100vh - 255px)">
 			<el-table-column type="index" label="序号" width="80" align="center" />
 			<el-table-column prop="name" label="名称" show-overflow-tooltip></el-table-column>
 			<el-table-column prop="expound" label="说明" show-overflow-tooltip></el-table-column>

+ 2 - 2
src/views/iot/rule-engine/send.vue

@@ -1,5 +1,5 @@
 <template>
-  <el-card shadow="nover">
+  <el-card shadow="nover" class="page-full">
     <div class="search">
       <el-form :inline="true">
         <el-form-item>
@@ -18,7 +18,7 @@
         </el-form-item>
       </el-form>
     </div>
-    <el-table :data="tableData" style="width: 100%" v-loading="loading">
+    <el-table :data="tableData" style="width: 100%" v-loading="loading" max-height="calc(100vh - 255px)">
       <el-table-column type="index" label="序号" width="80" align="center" />
       <el-table-column prop="name" label="名称" show-overflow-tooltip></el-table-column>
       <el-table-column prop="expound" label="说明" show-overflow-tooltip></el-table-column>

+ 169 - 0
src/views/system/basicConfig/basic.vue

@@ -0,0 +1,169 @@
+<template>
+	<el-form :model="state.tableData.param" label-position="top" ref="queryRef" :inline="true" label-width="100px">
+		<div class="form-inner-wrap">
+			<div class="left-wrap">
+				<el-form-item label="系统名称" prop="keyWord">
+					<el-input v-model="state.info.name" placeholder="请输入系统名称" clearable size="default" />
+				</el-form-item>
+				<el-form-item label="系统版权" prop="keyWord">
+					<el-input v-model="state.info.copyright" placeholder="请输入系统版权" clearable size="default" />
+				</el-form-item>
+				<el-row>
+					<el-col :span="12">
+						<el-form-item label="系统LOGO" prop="keyWord">
+							<uploadVue accept=".jpg,.png,.jpeg,.gif,.svg" :name="'logo'" @set-img="setImg">
+								<el-image style="width: 100%;" :src="state.info.logo" />
+								<!-- <div class="tips">点击上方照片,即可更改头像</div> -->
+							</uploadVue>
+						</el-form-item>
+					</el-col>
+
+					<el-col :span="12">
+						<el-form-item label="系统LOGO(小图标)" prop="keyWord">
+							<uploadVue accept=".jpg,.png,.jpeg,.gif,.svg" :name="'mini'" @set-img="setImg">
+								<el-image style="width: 100%;" :src="state.info.mini" />
+								<!-- <div class="tips">点击上方照片,即可更改头像</div> -->
+							</uploadVue>
+						</el-form-item>
+					</el-col>
+				</el-row>
+				<el-form-item>
+					<el-button v-auth="'save'" size="default" type="primary" class="ml10" @click="setDetails">保存</el-button>
+				</el-form-item>
+			</div>
+			<div class="right-wrap">
+				<el-form-item label="登录展示图" prop="keyWord">
+					<uploadVue accept=".jpg,.png,.jpeg,.gif,.svg" :name="'pic'" @set-img="setImg">
+						<el-image style="width: 100%;" :src="state.info.pic" fit="contain" />
+					</uploadVue>
+				</el-form-item>
+			</div>
+		</div>
+	</el-form>
+</template>
+
+<script lang="ts" setup>
+import { reactive, onMounted, ref } from 'vue';
+import { ElMessage } from 'element-plus';
+import api from '/@/api/system';
+import uploadVue from '/@/components/upload-wrapper/index.vue';
+
+
+const queryRef = ref();
+const state = reactive({
+	ids: [],
+	info: {
+		name: "",
+		copyright: "",
+		accesskey: "",
+		secretkey: "",
+		logo: "",
+		mini: "",
+		pic: ""
+	},
+	data: [],
+	tableData: {
+		data: [],
+		loading: false,
+		param: {
+			pageNum: 1,
+			PageSize: 10,
+			status: -1,
+			keyWord: ""
+		},
+		total: 0
+	},
+});
+// 初始化表格数据
+const initBasicConfigInfo = () => {
+	queryBasicConfigInfo();
+};
+const queryBasicConfigInfo = () => {
+	state.tableData.loading = true
+	api.basicConfig.getDetails({ types: 0 }).then((res: any) => {
+		state.data = res.data;
+		res.data.forEach((element: any) => {
+			if (element.configName == '系统名称') {
+				state.info.name = element.configValue
+			} else if (element.configName == '系统版权') {
+				state.info.copyright = element.configValue
+			} else if (element.configName == '系统LOGO') {
+				state.info.logo = element.configValue
+			} else if (element.configName == '系统LOGO(小图标)') {
+				state.info.mini = element.configValue
+			} else if (element.configName == '登录展示图') {
+				state.info.pic = element.configValue
+			}
+		});
+	});
+};
+
+const setDetails = () => {
+	if (!state.info.name) {
+		ElMessage.error('请填写系统名称');
+		return;
+	}
+	if (!state.info.copyright) {
+		ElMessage.error('请填写系统版权');
+		return;
+	}
+	if (!state.info.logo) {
+		ElMessage.error('请上传系统LOGO');
+		return;
+	}
+
+	if (!state.info.mini) {
+		ElMessage.error('请上传LOGO(小图标)');
+		return;
+	} if (!state.info.pic) {
+		ElMessage.error('请上传登录展示图');
+		return;
+	}
+	state.data.forEach((element: object) => {
+		if (element.configName == '系统名称') {
+			element.configValue = state.info.name
+		} else if (element.configName == '系统版权') {
+			element.configValue = state.info.copyright
+		} else if (element.configName == '系统LOGO') {
+			element.configValue = state.info.logo
+		} else if (element.configName == '系统LOGO(小图标)') {
+			element.configValue = state.info.mini
+		} else if (element.configName == '登录展示图') {
+			element.configValue = state.info.pic
+		}
+	})
+	api.basicConfig.setDetails({ ConfigInfo: state.data }).then(() => {
+		ElMessage.success('设置成功');
+
+	});
+};
+
+const setImg = (img: string, name: string) => {
+	state.info[name] = img;
+}
+
+// 页面加载时
+onMounted(() => {
+	initBasicConfigInfo();
+});
+
+</script>
+
+
+<style scoped lang="scss">
+:deep(.el-form) {
+	width: 100%;
+}
+
+:deep(.form-inner-wrap) {
+	width: 100%;
+	display: flex;
+	justify-content: space-between;
+
+	.left-wrap,
+	.right-wrap {
+		width: 100%;
+	}
+
+}
+</style>

+ 39 - 150
src/views/system/basicConfig/index.vue

@@ -1,173 +1,62 @@
 <template>
-	<div class="system-dic-container">
+	<div class="page">
 		<el-card shadow="nover">
-			<el-form :model="state.tableData.param" label-position="top" ref="queryRef" :inline="true" label-width="100px">
-				<div class="form-inner-wrap">
-					<div class="left-wrap">
-						<el-form-item label="系统名称" prop="keyWord">
-							<el-input v-model="state.info.name" placeholder="请输入系统名称" clearable size="default" />
-						</el-form-item>
-						<el-form-item label="系统版权" prop="keyWord">
-							<el-input v-model="state.info.copyright" placeholder="请输入系统版权" clearable size="default" />
-						</el-form-item>
-						<el-row>
-							<el-col :span="12">
-								<el-form-item label="系统LOGO" prop="keyWord">
-									<uploadVue accept=".jpg,.png,.jpeg,.gif,.svg" :name="'logo'" @set-img="setImg">
-										<el-image style="width: 100%;" :src="state.info.logo" />
-										<!-- <div class="tips">点击上方照片,即可更改头像</div> -->
-									</uploadVue>
-								</el-form-item>
-							</el-col>
-
-							<el-col :span="12">
-								<el-form-item label="系统LOGO(小图标)" prop="keyWord">
-									<uploadVue accept=".jpg,.png,.jpeg,.gif,.svg" :name="'mini'" @set-img="setImg">
-										<el-image style="width: 100%;" :src="state.info.mini" />
-										<!-- <div class="tips">点击上方照片,即可更改头像</div> -->
-									</uploadVue>
-								</el-form-item>
-							</el-col>
-						</el-row>
-						<el-form-item>
-							<el-button v-auth="'save'" size="default" type="primary" class="ml10" @click="setDetails">保存</el-button>
-						</el-form-item>
-					</div>
-					<div class="right-wrap">
-						<el-form-item label="登录展示图" prop="keyWord">
-							<uploadVue accept=".jpg,.png,.jpeg,.gif,.svg" :name="'pic'" @set-img="setImg">
-								<el-image style="width: 100%;" :src="state.info.pic" fit="contain" />
-							</uploadVue>
-						</el-form-item>
-					</div>
-				</div>
-			</el-form>
+			<el-menu :default-active="activeName" @select="menuChange" class="el-menu-vertical-demo" size="small">
+				<el-menu-item index="1">基础配置</el-menu-item>
+				<el-menu-item index="2">安全配置</el-menu-item>
+			</el-menu>
+		</el-card>
+		<el-card shadow="nover">
+			<div class="scroll-wrapper">
+				<BasicVue v-if="activeName === '1'"></BasicVue>
+				<SafeVue v-else-if="activeName === '2'"></SafeVue>
+			</div>
 		</el-card>
 	</div>
 </template>
 
 <script lang="ts" setup>
-import { reactive, onMounted, ref } from 'vue';
-import { ElMessage } from 'element-plus';
-import api from '/@/api/system';
-import uploadVue from '/@/components/upload-wrapper/index.vue';
-
-
-const queryRef = ref();
-const state = reactive({
-	ids: [],
-	info: {
-		name: "",
-		copyright: "",
-		accesskey: "",
-		secretkey: "",
-		logo: "",
-		mini: "",
-		pic: ""
-	},
-	data: [],
-	tableData: {
-		data: [],
-		loading: false,
-		param: {
-			pageNum: 1,
-			PageSize: 10,
-			status: -1,
-			keyWord: ""
-		},
-		total: 0
-	},
-});
-// 初始化表格数据
-const initBasicConfigInfo = () => {
-	queryBasicConfigInfo();
-};
-const queryBasicConfigInfo = () => {
-	state.tableData.loading = true
-	api.basicConfig.getDetails({types: 0}).then((res: any) => {
-		state.data = res.data;
-		res.data.forEach((element: object) => {
-			if (element.configName == '系统名称') {
-				state.info.name = element.configValue
-			} else if (element.configName == '系统版权') {
-				state.info.copyright = element.configValue
-			} else if (element.configName == '系统LOGO') {
-				state.info.logo = element.configValue
-			} else if (element.configName == '系统LOGO(小图标)') {
-				state.info.mini = element.configValue
-			} else if (element.configName == '登录展示图') {
-				state.info.pic = element.configValue
-			}
-		});
-	});
-};
+import { ref } from 'vue';
+import BasicVue from "./basic.vue";
+import SafeVue from "./safe.vue";
 
-const setDetails = () => {
-	if (!state.info.name) {
-		ElMessage.error('请填写系统名称');
-		return;
-	}
-	if (!state.info.copyright) {
-		ElMessage.error('请填写系统版权');
-		return;
-	}
-	if (!state.info.logo) {
-		ElMessage.error('请上传系统LOGO');
-		return;
-	}
-
-	if (!state.info.mini) {
-		ElMessage.error('请上传LOGO(小图标)');
-		return;
-	} if (!state.info.pic) {
-		ElMessage.error('请上传登录展示图');
-		return;
-	}
-	state.data.forEach((element: object) => {
-		if (element.configName == '系统名称') {
-			element.configValue = state.info.name
-		} else if (element.configName == '系统版权') {
-			element.configValue = state.info.copyright
-		} else if (element.configName == '系统LOGO') {
-			element.configValue = state.info.logo
-		} else if (element.configName == '系统LOGO(小图标)') {
-			element.configValue = state.info.mini
-		} else if (element.configName == '登录展示图') {
-			element.configValue = state.info.pic
-		}
-	})
-	api.basicConfig.setDetails({ ConfigInfo: state.data }).then(() => {
-		ElMessage.success('设置成功');
 
-	});
-};
+const activeName = ref('1')
 
-const setImg = (img: string, name: string) => {
-	state.info[name] = img;
+function menuChange(index: string) {
+	activeName.value = index
 }
 
-// 页面加载时
-onMounted(() => {
-	initBasicConfigInfo();
-});
-
 </script>
 
 
 <style scoped lang="scss">
-:deep(.el-form) {
-	width: 100%;
-}
-
-:deep(.form-inner-wrap) {
-	width: 100%;
+.page {
 	display: flex;
 	justify-content: space-between;
+	gap: 16px;
+
+	.el-card:first-child {
+		width: 240px;
+	}
 
-	.left-wrap,
-	.right-wrap {
-		width: 100%;
+	.el-card:last-child {
+		flex: 1;
+	}
+	.el-card ::v-deep(.el-card__body) {
+		flex: 1;
+		height: 100%;
+		overflow-y: auto;
+		overflow-x: hidden;
 	}
 
+	.el-menu {
+		width: 200px;
+
+		::v-deep(.el-menu-item) {
+			height: 40px !important;
+			line-height: 40px !important;
+		}
+	}
 }
 </style>

+ 219 - 0
src/views/system/basicConfig/safe.vue

@@ -0,0 +1,219 @@
+<template>
+	<el-form :model="form" ref="queryRef" label-width="155px">
+		<div :style="{ width: '450px' }">
+			<el-descriptions title="安全控制" v-if="form.security || form.rsaEnabled"></el-descriptions>
+			<el-form-item label="是否启用安全控制" prop="security" v-if="form.security">
+				<el-radio-group v-model="form.security">
+					<el-radio label="1">启用</el-radio>
+					<el-radio label="0">禁用</el-radio>
+				</el-radio-group>
+			</el-form-item>
+			<el-form-item label="是否启用RSA" prop="rsaEnabled" v-if="form.rsaEnabled">
+				<el-radio-group v-model="form.rsaEnabled">
+					<el-radio label="1">启用</el-radio>
+					<el-radio label="0">禁用</el-radio>
+				</el-radio-group>
+			</el-form-item>
+			<el-descriptions title="登录设置" v-if="form.singleLogin || form.changePwdFirstLogin || form.expiryDate || form.errorNum || form.againLoginDate || form.changePeriodSwitch || form.changePeriod"></el-descriptions>
+			<el-form-item label="是否单一登录" prop="singleLogin" v-if="form.singleLogin">
+				<el-radio-group v-model="form.singleLogin">
+					<el-radio label="1">启用</el-radio>
+					<el-radio label="0">禁用</el-radio>
+				</el-radio-group>
+			</el-form-item>
+			<el-form-item label="首次登录是否更改密码" prop="changePwdFirstLogin" v-if="form.changePwdFirstLogin">
+				<el-radio-group v-model="form.changePwdFirstLogin">
+					<el-radio label="1">启用</el-radio>
+					<el-radio label="0">禁用</el-radio>
+				</el-radio-group>
+			</el-form-item>
+			<el-form-item label="TOKEN过期时间" prop="expiryDate" v-if="form.expiryDate">
+				<el-input type="number" v-model="form.expiryDate" placeholder="请输入">
+					<template #append>分钟</template>
+				</el-input>
+			</el-form-item>
+			<el-form-item label="密码输入错误次数" prop="errorNum" v-if="form.errorNum">
+				<el-input type="number" v-model="form.errorNum" placeholder="请输入"></el-input>
+			</el-form-item>
+			<el-form-item label="允许再次登录时间" prop="againLoginDate" v-if="form.againLoginDate">
+				<el-input type="number" v-model="form.againLoginDate" placeholder="请输入">
+					<template #append>分钟</template>
+				</el-input>
+			</el-form-item>
+			<el-form-item label="密码更换周期开关" prop="changePeriodSwitch" v-if="form.changePeriodSwitch">
+				<el-radio-group v-model="form.changePeriodSwitch">
+					<el-radio label="1">启用</el-radio>
+					<el-radio label="0">禁用</el-radio>
+				</el-radio-group>
+			</el-form-item>
+			<el-form-item label="密码更换周期" prop="changePeriod" v-if="form.changePeriod">
+				<el-input type="number" v-model="form.changePeriod" placeholder="请输入">
+					<template #append>天</template>
+				</el-input>
+			</el-form-item>
+			<el-descriptions title="密码策略设置" v-if="form.uppercase || form.lowercase || form.digit || form.complexity || form.minimum"></el-descriptions>
+			<el-form-item label="是否包含大写字母" prop="uppercase" v-if="form.uppercase">
+				<el-radio-group v-model="form.uppercase">
+					<el-radio label="1">启用</el-radio>
+					<el-radio label="0">禁用</el-radio>
+				</el-radio-group>
+			</el-form-item>
+			<el-form-item label="是否包含小写字母" prop="lowercase" v-if="form.lowercase">
+				<el-radio-group v-model="form.lowercase">
+					<el-radio label="1">启用</el-radio>
+					<el-radio label="0">禁用</el-radio>
+				</el-radio-group>
+			</el-form-item>
+			<el-form-item label="是否包含数字" prop="digit" v-if="form.digit">
+				<el-radio-group v-model="form.digit">
+					<el-radio label="1">启用</el-radio>
+					<el-radio label="0">禁用</el-radio>
+				</el-radio-group>
+			</el-form-item>
+			<el-form-item label="是否包含复杂字符" prop="complexity" v-if="form.complexity">
+				<el-radio-group v-model="form.complexity">
+					<el-radio label="1">启用</el-radio>
+					<el-radio label="0">禁用</el-radio>
+				</el-radio-group>
+			</el-form-item>
+			<el-form-item label="密码长度" prop="minimum" v-if="form.minimum">
+				<el-input type="number" v-model="form.minimum" placeholder="请输入密码长度"></el-input>
+			</el-form-item>
+			<el-descriptions title="权限设置" v-if="form.button || form.column || form.api"></el-descriptions>
+			<el-form-item label="按钮开关" prop="button" v-if="form.button">
+				<el-radio-group v-model="form.button">
+					<el-radio label="1">启用</el-radio>
+					<el-radio label="0">禁用</el-radio>
+				</el-radio-group>
+			</el-form-item>
+			<el-form-item label="列表开关" prop="column" v-if="form.column">
+				<el-radio-group v-model="form.column">
+					<el-radio label="1">启用</el-radio>
+					<el-radio label="0">禁用</el-radio>
+				</el-radio-group>
+			</el-form-item>
+			<el-form-item label="API开关" prop="api" v-if="form.api">
+				<el-radio-group v-model="form.api">
+					<el-radio label="1">启用</el-radio>
+					<el-radio label="0">禁用</el-radio>
+				</el-radio-group>
+			</el-form-item>
+			<el-form-item>
+				<el-button type="primary" class="ml10" @click="saveEmailConfig">保存</el-button>
+			</el-form-item>
+		</div>
+	</el-form>
+</template>
+
+<script lang="ts" setup>
+import { reactive } from 'vue';
+import { ElMessage } from 'element-plus';
+import api from '/@/api/system';
+
+const emailConfigMap: any = {}
+
+const form = reactive({
+	singleLogin: '',
+	expiryDate: '',
+	uppercase: '',
+	lowercase: '',
+	digit: '',
+	complexity: '',
+	minimum: '',
+	errorNum: '',
+	againLoginDate: '',
+	changePeriod: '',
+	button: '',
+	column: '',
+	api: '',
+	security: '',
+	changePeriodSwitch: '',
+	changePwdFirstLogin: '',
+	rsaEnabled: '',
+})
+
+// 是否包含大写字母
+// 是否包含小写字母
+// 是否包含数字
+// 是否包含复杂字符
+// 密码长度
+// 密码输入错误次数
+// 允许再次登录时间
+// 密码更换周期
+api.basicConfig.getDetails({ types: 1 }).then((res: any) => {
+	res.data.forEach((item: any) => {
+		emailConfigMap[item.configKey] = item
+	})
+
+	form.singleLogin = get('sys.is.single.login')
+	form.expiryDate = get('sys.token.expiry.date')
+	form.uppercase = get('sys.require.uppercase.letter')
+	form.lowercase = get('sys.require.lowercase.letter')
+	form.digit = get('sys.require.digit')
+	form.complexity = get('sys.require.complexity')
+	form.minimum = get('sys.password.minimum.length')
+	form.errorNum = get('sys.password.error.num')
+	form.againLoginDate = get('sys.again.login.date')
+	form.changePeriod = get('sys.password.change.period')
+	form.changePeriodSwitch = get('sys.password.change.period.switch')
+	form.changePwdFirstLogin = get('sys.change.password.for.first.login')
+	form.button = get('sys.button.switch')
+	form.column = get('sys.column.switch')
+	form.api = get('sys.api.switch')
+	form.security = get('sys.is.security.control.enabled')
+	form.rsaEnabled = get('sys.is.rsa.enabled')
+});
+
+function saveEmailConfig() {
+	set('sys.is.single.login', form.singleLogin)
+	set('sys.token.expiry.date', form.expiryDate)
+	set('sys.require.uppercase.letter', form.uppercase)
+	set('sys.require.lowercase.letter', form.lowercase)
+	set('sys.require.digit', form.digit)
+	set('sys.require.complexity', form.complexity)
+	set('sys.password.minimum.length', form.minimum)
+	set('sys.password.error.num', form.errorNum)
+	set('sys.again.login.date', form.againLoginDate)
+	set('sys.password.change.period', form.changePeriod)
+	set('sys.password.change.period.switch', form.changePeriodSwitch)
+	set('sys.change.password.for.first.login', form.changePwdFirstLogin)
+	set('sys.button.switch', form.button)
+	set('sys.column.switch', form.column)
+	set('sys.api.switch', form.api)
+	set('sys.is.security.control.enabled', form.security)
+	set('sys.is.rsa.enabled', form.rsaEnabled)
+	api.basicConfig.setDetails({ ConfigInfo: Object.values(emailConfigMap) }).then(() => {
+		ElMessage.success('操作成功');
+	});
+}
+
+function get(key: string) {
+	return emailConfigMap[key]?.configValue
+}
+
+function set(key: string, value: string) {
+	emailConfigMap[key] && (emailConfigMap[key].configValue = value)
+}
+
+</script>
+
+<style scoped lang="scss">
+:deep(.el-form) {
+	width: 100%;
+}
+
+.el-form-item {
+	margin-bottom: 10px;
+}
+
+:deep(.form-inner-wrap) {
+	width: 100%;
+	display: flex;
+	justify-content: space-between;
+
+	.left-wrap,
+	.right-wrap {
+		width: 100%;
+	}
+}
+</style>

+ 20 - 20
src/views/system/datahub/source/component/edit.vue

@@ -314,27 +314,27 @@ export default defineComponent({
 
 			ruleForm: JSON.parse(JSON.stringify(baseFrom)),
 			rules: {
-				key: [{ required: true, message: '数据源标识不能为空', trigger: 'blur' }],
-				name: [ { required: true, message: '数据源名称不能为空', trigger: 'blur' },
-        				{ max: 32, message: '数据源名称不能超过32个字符', trigger: 'blur' },
-						{ validator: validateNoSpace, message: '数据源名称不能包含空格', trigger: 'blur' }
+				key: [{ required: true, message: '数据源标识不能为空', trigger: 'change' }],
+				name: [ { required: true, message: '数据源名称不能为空', trigger: 'change' },
+        				{ max: 32, message: '数据源名称不能超过32个字符', trigger: 'change' },
+						{ validator: validateNoSpace, message: '数据源名称不能包含空格', trigger: 'change' }
 					],
-				from: [{ required: true, message: '数据源类型不能为空', trigger: 'blur' }],
-				method: [{ required: true, message: '请求方法不能为空', trigger: 'blur', when: (formItem:any) => formItem.from === 1 }],
-				url: [{ required: true, message: '请求地址不能为空', trigger: 'blur', when: (formItem:any) => formItem.from === 1 }],
-				cronExpression: [{ required: true, message: '定时请求不能为空', trigger: 'blur', when: (formItem:any) => formItem.from === 1 }],
-				deviceKey: [{ required: true, message: '请选择设备', trigger: 'blur', when: (formItem:any) => formItem.from === 2 }],
-				type: [{ required: true, message: '请选择数据来源', trigger: 'blur', when: (formItem:any) => formItem.from === 3 }],
-				host: [{ required: true, message: '请输入主机地址', trigger: 'blur', when: (formItem:any) => formItem.from === 3 }],
-				port: [{ required: true, message: '请输入端口号', trigger: 'blur', when: (formItem:any) => formItem.from === 3 }],
-				user: [{ required: true, message: '请输入用户名', trigger: 'blur', when: (formItem:any) => formItem.from === 3 }],
-				passwd: [{ required: true, message: '请输入密码', trigger: 'blur', when: (formItem:any) => formItem.from === 3 }],
-				dbName: [{ required: true, message: '请输入数据库名称', trigger: 'blur', when: (formItem:any) => formItem.from === 3 }],
-				queryType: [{ required: true, message: '请选择执行方式', trigger: 'blur', when: (formItem:any) => formItem.from === 3 }],
-				tableName: [{ required: true, message: '该项不能为空', trigger: 'blur', when: (formItem:any) => formItem.from === 3 }],
-				pk: [{ required: true, message: '请输入主键字段', trigger: 'blur', when: (formItem:any) => formItem.from === 3 }],
-				num: [{ required: true, message: '请输入每次获取数量', trigger: 'blur', when: (formItem:any) => formItem.from === 3 }],
-				tabcronExpression: [{ required: true, message: '请输入cron任务表达式', trigger: 'blur', when: (formItem:any) => formItem.from === 3 }],
+				from: [{ required: true, message: '数据源类型不能为空', trigger: 'change' }],
+				method: [{ required: true, message: '请求方法不能为空', trigger: 'change', when: (formItem:any) => formItem.from === 1 }],
+				url: [{ required: true, message: '请求地址不能为空', trigger: 'change', when: (formItem:any) => formItem.from === 1 }],
+				cronExpression: [{ required: true, message: '定时请求不能为空', trigger: 'change', when: (formItem:any) => formItem.from === 1 }],
+				deviceKey: [{ required: true, message: '请选择设备', trigger: 'change', when: (formItem:any) => formItem.from === 2 }],
+				type: [{ required: true, message: '请选择数据来源', trigger: 'change', when: (formItem:any) => formItem.from === 3 }],
+				host: [{ required: true, message: '请输入主机地址', trigger: 'change', when: (formItem:any) => formItem.from === 3 }],
+				port: [{ required: true, message: '请输入端口号', trigger: 'change', when: (formItem:any) => formItem.from === 3 }],
+				user: [{ required: true, message: '请输入用户名', trigger: 'change', when: (formItem:any) => formItem.from === 3 }],
+				passwd: [{ required: true, message: '请输入密码', trigger: 'change', when: (formItem:any) => formItem.from === 3 }],
+				dbName: [{ required: true, message: '请输入数据库名称', trigger: 'change', when: (formItem:any) => formItem.from === 3 }],
+				queryType: [{ required: true, message: '请选择执行方式', trigger: 'change', when: (formItem:any) => formItem.from === 3 }],
+				tableName: [{ required: true, message: '该项不能为空', trigger: 'change', when: (formItem:any) => formItem.from === 3 }],
+				pk: [{ required: true, message: '请输入主键字段', trigger: 'change', when: (formItem:any) => formItem.from === 3 }],
+				num: [{ required: true, message: '请输入每次获取数量', trigger: 'change', when: (formItem:any) => formItem.from === 3 }],
+				tabcronExpression: [{ required: true, message: '请输入cron任务表达式', trigger: 'change', when: (formItem:any) => formItem.from === 3 }],
 			},
 		});
 		const delParams = (index) => {

+ 0 - 218
src/views/system/safeConfig/index.vue

@@ -1,218 +0,0 @@
-<template>
-	<div class="system-dic-container page-full">
-		<el-card class="page-full-part" shadow="never">
-			<el-form :model="form" ref="queryRef" label-width="155px">
-				<div :style="{ width: '450px' }">
-					<el-descriptions title="安全控制" v-if="form.security || form.rsaEnabled"></el-descriptions>
-					<el-form-item label="是否启用安全控制" prop="security" v-if="form.security">
-						<el-radio-group v-model="form.security">
-							<el-radio label="1">启用</el-radio>
-							<el-radio label="0">禁用</el-radio>
-						</el-radio-group>
-					</el-form-item>
-					<el-form-item label="是否启用RSA" prop="rsaEnabled" v-if="form.rsaEnabled">
-						<el-radio-group v-model="form.rsaEnabled">
-							<el-radio label="1">启用</el-radio>
-							<el-radio label="0">禁用</el-radio>
-						</el-radio-group>
-					</el-form-item>
-					<el-descriptions title="登录设置" v-if="form.singleLogin || form.changePwdFirstLogin || form.expiryDate || form.errorNum || form.againLoginDate || form.changePeriodSwitch || form.changePeriod"></el-descriptions>
-					<el-form-item label="是否单一登录" prop="singleLogin" v-if="form.singleLogin">
-						<el-radio-group v-model="form.singleLogin">
-							<el-radio label="1">启用</el-radio>
-							<el-radio label="0">禁用</el-radio>
-						</el-radio-group>
-					</el-form-item>
-					<el-form-item label="首次登录是否更改密码" prop="changePwdFirstLogin" v-if="form.changePwdFirstLogin">
-						<el-radio-group v-model="form.changePwdFirstLogin">
-							<el-radio label="1">启用</el-radio>
-							<el-radio label="0">禁用</el-radio>
-						</el-radio-group>
-					</el-form-item>
-					<el-form-item label="TOKEN过期时间" prop="expiryDate" v-if="form.expiryDate">
-						<el-input type="number" v-model="form.expiryDate" placeholder="请输入">
-							<template #append>分钟</template>
-						</el-input>
-					</el-form-item>
-					<el-form-item label="密码输入错误次数" prop="errorNum" v-if="form.errorNum">
-						<el-input type="number" v-model="form.errorNum" placeholder="请输入"></el-input>
-					</el-form-item>
-					<el-form-item label="允许再次登录时间" prop="againLoginDate" v-if="form.againLoginDate">
-						<el-input type="number" v-model="form.againLoginDate" placeholder="请输入">
-							<template #append>分钟</template>
-						</el-input>
-					</el-form-item>
-					<el-form-item label="密码更换周期开关" prop="changePeriodSwitch" v-if="form.changePeriodSwitch">
-						<el-radio-group v-model="form.changePeriodSwitch">
-							<el-radio label="1">启用</el-radio>
-							<el-radio label="0">禁用</el-radio>
-						</el-radio-group>
-					</el-form-item>
-					<el-form-item label="密码更换周期" prop="changePeriod" v-if="form.changePeriod">
-						<el-input type="number" v-model="form.changePeriod" placeholder="请输入">
-							<template #append>天</template>
-						</el-input>
-					</el-form-item>
-					<el-descriptions title="密码策略设置" v-if="form.uppercase || form.lowercase || form.digit || form.complexity || form.minimum"></el-descriptions>
-					<el-form-item label="是否包含大写字母" prop="uppercase" v-if="form.uppercase">
-						<el-radio-group v-model="form.uppercase">
-							<el-radio label="1">启用</el-radio>
-							<el-radio label="0">禁用</el-radio>
-						</el-radio-group>
-					</el-form-item>
-					<el-form-item label="是否包含小写字母" prop="lowercase" v-if="form.lowercase">
-						<el-radio-group v-model="form.lowercase">
-							<el-radio label="1">启用</el-radio>
-							<el-radio label="0">禁用</el-radio>
-						</el-radio-group>
-					</el-form-item>
-					<el-form-item label="是否包含数字" prop="digit" v-if="form.digit">
-						<el-radio-group v-model="form.digit">
-							<el-radio label="1">启用</el-radio>
-							<el-radio label="0">禁用</el-radio>
-						</el-radio-group>
-					</el-form-item>
-					<el-form-item label="是否包含复杂字符" prop="complexity" v-if="form.complexity">
-						<el-radio-group v-model="form.complexity">
-							<el-radio label="1">启用</el-radio>
-							<el-radio label="0">禁用</el-radio>
-						</el-radio-group>
-					</el-form-item>
-					<el-form-item label="密码长度" prop="minimum" v-if="form.minimum">
-						<el-input type="number" v-model="form.minimum" placeholder="请输入密码长度"></el-input>
-					</el-form-item>
-					<el-descriptions title="权限设置" v-if="form.button || form.column || form.api"></el-descriptions>
-					<el-form-item label="按钮开关" prop="button" v-if="form.button">
-						<el-radio-group v-model="form.button">
-							<el-radio label="1">启用</el-radio>
-							<el-radio label="0">禁用</el-radio>
-						</el-radio-group>
-					</el-form-item>
-					<el-form-item label="列表开关" prop="column" v-if="form.column">
-						<el-radio-group v-model="form.column">
-							<el-radio label="1">启用</el-radio>
-							<el-radio label="0">禁用</el-radio>
-						</el-radio-group>
-					</el-form-item>
-					<el-form-item label="API开关" prop="api" v-if="form.api">
-						<el-radio-group v-model="form.api">
-							<el-radio label="1">启用</el-radio>
-							<el-radio label="0">禁用</el-radio>
-						</el-radio-group>
-					</el-form-item>
-					<el-form-item>
-						<el-button type="primary" class="ml10" @click="saveEmailConfig">确认</el-button>
-					</el-form-item>
-				</div>
-			</el-form>
-		</el-card>
-
-	</div>
-</template>
-
-<script lang="ts" setup>
-import { reactive } from 'vue';
-import { ElMessage } from 'element-plus';
-import api from '/@/api/system';
-
-const emailConfigMap: any = {}
-
-const form = reactive({
-	singleLogin: '',
-	expiryDate: '',
-	uppercase: '',
-	lowercase: '',
-	digit: '',
-	complexity: '',
-	minimum: '',
-	errorNum: '',
-	againLoginDate: '',
-	changePeriod: '',
-	button: '',
-	column: '',
-	api: '',
-	security: '',
-	changePeriodSwitch: '',
-	changePwdFirstLogin: '',
-	rsaEnabled: '',
-})
-
-// 是否包含大写字母
-// 是否包含小写字母
-// 是否包含数字
-// 是否包含复杂字符
-// 密码长度
-// 密码输入错误次数
-// 允许再次登录时间
-// 密码更换周期
-api.basicConfig.getDetails({ types: 1 }).then((res: any) => {
-	res.data.forEach((item: any) => {
-		emailConfigMap[item.configKey] = item
-	})
-
-	form.singleLogin = emailConfigMap['sys.is.single.login']?.configValue
-	form.expiryDate = emailConfigMap['sys.token.expiry.date']?.configValue
-	form.uppercase = emailConfigMap['sys.require.uppercase.letter']?.configValue
-	form.lowercase = emailConfigMap['sys.require.lowercase.letter']?.configValue
-	form.digit = emailConfigMap['sys.require.digit']?.configValue
-	form.complexity = emailConfigMap['sys.require.complexity']?.configValue
-	form.minimum = emailConfigMap['sys.password.minimum.length']?.configValue
-	form.errorNum = emailConfigMap['sys.password.error.num']?.configValue
-	form.againLoginDate = emailConfigMap['sys.again.login.date']?.configValue
-	form.changePeriod = emailConfigMap['sys.password.change.period']?.configValue
-	form.changePeriod = emailConfigMap['sys.password.change.period']?.configValue
-	form.changePeriod = emailConfigMap['sys.password.change.period']?.configValue
-	form.changePeriodSwitch = emailConfigMap['sys.password.change.period.switch']?.configValue
-	form.changePwdFirstLogin = emailConfigMap['sys.change.password.for.first.login']?.configValue
-	form.button = emailConfigMap['sys.button.switch']?.configValue
-	form.column = emailConfigMap['sys.column.switch']?.configValue
-	form.api = emailConfigMap['sys.api.switch']?.configValue
-	form.security = emailConfigMap['sys.is.security.control.enabled']?.configValue
-	form.rsaEnabled = emailConfigMap['sys.is.rsa.enabled']?.configValue
-});
-
-function saveEmailConfig() {
-	emailConfigMap['sys.is.single.login'] && (emailConfigMap['sys.is.single.login'].configValue = form.singleLogin)
-	emailConfigMap['sys.token.expiry.date'] && (emailConfigMap['sys.token.expiry.date'].configValue = form.expiryDate)
-	emailConfigMap['sys.require.uppercase.letter'] && (emailConfigMap['sys.require.uppercase.letter'].configValue = form.uppercase)
-	emailConfigMap['sys.require.lowercase.letter'] && (emailConfigMap['sys.require.lowercase.letter'].configValue = form.lowercase)
-	emailConfigMap['sys.require.digit'] && (emailConfigMap['sys.require.digit'].configValue = form.digit)
-	emailConfigMap['sys.require.complexity'] && (emailConfigMap['sys.require.complexity'].configValue = form.complexity)
-	emailConfigMap['sys.password.minimum.length'] && (emailConfigMap['sys.password.minimum.length'].configValue = form.minimum)
-	emailConfigMap['sys.password.error.num'] && (emailConfigMap['sys.password.error.num'].configValue = form.errorNum)
-	emailConfigMap['sys.again.login.date'] && (emailConfigMap['sys.again.login.date'].configValue = form.againLoginDate)
-	emailConfigMap['sys.password.change.period'] && (emailConfigMap['sys.password.change.period'].configValue = form.changePeriod)
-	emailConfigMap['sys.password.change.period.switch'] && (emailConfigMap['sys.password.change.period.switch'].configValue = form.changePeriodSwitch)
-	emailConfigMap['sys.change.password.for.first.login'] && (emailConfigMap['sys.change.password.for.first.login'].configValue = form.changePwdFirstLogin)
-	emailConfigMap['sys.button.switch'] && (emailConfigMap['sys.button.switch'].configValue = form.button)
-	emailConfigMap['sys.column.switch'] && (emailConfigMap['sys.column.switch'].configValue = form.column)
-	emailConfigMap['sys.api.switch'] && (emailConfigMap['sys.api.switch'].configValue = form.api)
-	emailConfigMap['sys.is.security.control.enabled'] && (emailConfigMap['sys.is.security.control.enabled'].configValue = form.security)
-	emailConfigMap['sys.is.rsa.enabled'] && (emailConfigMap['sys.is.rsa.enabled'].configValue = form.rsaEnabled)
-	api.basicConfig.setDetails({ ConfigInfo: Object.values(emailConfigMap) }).then(() => {
-		ElMessage.success('操作成功');
-	});
-}
-
-</script>
-
-<style scoped lang="scss">
-:deep(.el-form) {
-	width: 100%;
-}
-
-.el-form-item {
-	margin-bottom: 10px;
-}
-
-:deep(.form-inner-wrap) {
-	width: 100%;
-	display: flex;
-	justify-content: space-between;
-
-	.left-wrap,
-	.right-wrap {
-		width: 100%;
-	}
-}
-</style>