提交 90654adc 编写于 作者: xiaonannet's avatar xiaonannet

Merge branch 'release/1.0.0' into main

{
"name": "thinglinks",
"lockfileVersion": 2,
"requires": true,
"packages": {}
}
{
"name": "thinglinks",
"lockfileVersion": 2,
"requires": true,
"packages": {}
}
......@@ -293,7 +293,7 @@ public class DeviceServiceImpl implements DeviceService {
//更新数据库设备状态
Device device = new Device();
device.setId(oneByClientId.getId());
device.setConnectStatus(DeviceConnectStatus.INIT.getValue());
device.setConnectStatus(DeviceConnectStatus.OFFLINE.getValue());
device.setUpdateTime(DateUtils.getNowDate());
deviceMapper.updateByPrimaryKeySelective(device);
}
......
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<meta name="renderer" content="webkit">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
<link rel="icon" href="<%= BASE_URL %>favicon.ico">
<title><%= webpackConfig.name %></title>
<!--[if lt IE 11]><script>window.location.href='/html/ie.html';</script><![endif]-->
<style lang="scss">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<meta name="renderer" content="webkit">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
<link rel="icon" href="<%= BASE_URL %>favicon.ico">
<title>
<%= webpackConfig.name %>
</title>
<!--[if lt IE 11]><script>window.location.href='/html/ie.html';</script><![endif]-->
<!-- <style lang="scss">
html,
body,
#app {
......@@ -193,16 +196,393 @@
color: #FFF;
opacity: 0.5;
}
</style>
</head>
<body>
<div id="app">
<div id="loader-wrapper">
<div id="loader"></div>
<div class="loader-section section-left"></div>
<div class="loader-section section-right"></div>
<div class="load_title">正在加载ThingLinks系统资源,请耐心等待</div>
</div>
</div>
</body>
</html>
</style> -->
</head>
<style lang="scss" scoped>
@import url(https://fonts.googleapis.com/css?family=Archivo+Narrow);
.cube-folding {
width: 50px;
height: 50px;
display: inline-block;
-webkit-transform: rotate(45deg);
-moz-transform: rotate(45deg);
transform: rotate(45deg);
font-size: 0;
}
.cube-folding span {
position: relative;
width: 25px;
height: 25px;
-webkit-transform: scale(1.1);
-moz-transform: scale(1.1);
transform: scale(1.1);
display: inline-block;
}
.cube-folding span::before {
content: "";
background-color: white;
position: absolute;
left: 0;
top: 0;
display: block;
width: 25px;
height: 25px;
-moz-transform-origin: 100% 100%;
-ms-transform-origin: 100% 100%;
-webkit-transform-origin: 100% 100%;
transform-origin: 100% 100%;
-webkit-animation: folding 2.5s infinite linear both;
-moz-animation: folding 2.5s infinite linear both;
animation: folding 2.5s infinite linear both;
}
.cube-folding .leaf2 {
-webkit-transform: rotateZ(90deg) scale(1.1);
-moz-transform: rotateZ(90deg) scale(1.1);
transform: rotateZ(90deg) scale(1.1);
}
.cube-folding .leaf2::before {
-webkit-animation-delay: 0.3s;
animation-delay: 0.3s;
background-color: #f2f2f2;
}
.cube-folding .leaf3 {
-webkit-transform: rotateZ(270deg) scale(1.1);
-moz-transform: rotateZ(270deg) scale(1.1);
transform: rotateZ(270deg) scale(1.1);
}
.cube-folding .leaf3::before {
-webkit-animation-delay: 0.9s;
animation-delay: 0.9s;
background-color: #f2f2f2;
}
.cube-folding .leaf4 {
-webkit-transform: rotateZ(180deg) scale(1.1);
-moz-transform: rotateZ(180deg) scale(1.1);
transform: rotateZ(180deg) scale(1.1);
}
.cube-folding .leaf4::before {
-webkit-animation-delay: 0.6s;
animation-delay: 0.6s;
background-color: #e6e6e6;
}
@-webkit-keyframes folding {
0%,
10% {
-webkit-transform: perspective(140px) rotateX(-180deg);
-moz-transform: perspective(140px) rotateX(-180deg);
transform: perspective(140px) rotateX(-180deg);
-webkit-opacity: 0;
-moz-opacity: 0;
opacity: 0;
}
25%,
75% {
-webkit-transform: perspective(140px) rotateX(0deg);
-moz-transform: perspective(140px) rotateX(0deg);
transform: perspective(140px) rotateX(0deg);
-webkit-opacity: 1;
-moz-opacity: 1;
opacity: 1;
}
90%,
100% {
-webkit-transform: perspective(140px) rotateY(180deg);
-moz-transform: perspective(140px) rotateY(180deg);
transform: perspective(140px) rotateY(180deg);
-webkit-opacity: 0;
-moz-opacity: 0;
opacity: 0;
}
}
@-moz-keyframes folding {
0%,
10% {
-webkit-transform: perspective(140px) rotateX(-180deg);
-moz-transform: perspective(140px) rotateX(-180deg);
transform: perspective(140px) rotateX(-180deg);
-webkit-opacity: 0;
-moz-opacity: 0;
opacity: 0;
}
25%,
75% {
-webkit-transform: perspective(140px) rotateX(0deg);
-moz-transform: perspective(140px) rotateX(0deg);
transform: perspective(140px) rotateX(0deg);
-webkit-opacity: 1;
-moz-opacity: 1;
opacity: 1;
}
90%,
100% {
-webkit-transform: perspective(140px) rotateY(180deg);
-moz-transform: perspective(140px) rotateY(180deg);
transform: perspective(140px) rotateY(180deg);
-webkit-opacity: 0;
-moz-opacity: 0;
opacity: 0;
}
}
@-ms-keyframes folding {
0%,
10% {
-webkit-transform: perspective(140px) rotateX(-180deg);
-moz-transform: perspective(140px) rotateX(-180deg);
transform: perspective(140px) rotateX(-180deg);
-webkit-opacity: 0;
-moz-opacity: 0;
opacity: 0;
}
25%,
75% {
-webkit-transform: perspective(140px) rotateX(0deg);
-moz-transform: perspective(140px) rotateX(0deg);
transform: perspective(140px) rotateX(0deg);
-webkit-opacity: 1;
-moz-opacity: 1;
opacity: 1;
}
90%,
100% {
-webkit-transform: perspective(140px) rotateY(180deg);
-moz-transform: perspective(140px) rotateY(180deg);
transform: perspective(140px) rotateY(180deg);
-webkit-opacity: 0;
-moz-opacity: 0;
opacity: 0;
}
}
@keyframes folding {
0%,
10% {
-webkit-transform: perspective(140px) rotateX(-180deg);
-moz-transform: perspective(140px) rotateX(-180deg);
transform: perspective(140px) rotateX(-180deg);
-webkit-opacity: 0;
-moz-opacity: 0;
opacity: 0;
}
25%,
75% {
-webkit-transform: perspective(140px) rotateX(0deg);
-moz-transform: perspective(140px) rotateX(0deg);
transform: perspective(140px) rotateX(0deg);
-webkit-opacity: 1;
-moz-opacity: 1;
opacity: 1;
}
90%,
100% {
-webkit-transform: perspective(140px) rotateY(180deg);
-moz-transform: perspective(140px) rotateY(180deg);
transform: perspective(140px) rotateY(180deg);
-webkit-opacity: 0;
-moz-opacity: 0;
opacity: 0;
}
}
.cube-wrapper {
position: fixed;
left: 50%;
top: 50%;
margin-top: -50px;
margin-left: -50px;
width: 100px;
height: 100px;
text-align: center;
}
.cube-wrapper:after {
content: "";
position: absolute;
left: 0;
right: 0;
bottom: -20px;
margin: auto;
width: 90px;
height: 6px;
z-index: 1;
background-color: rgba(0, 0, 0, 0.1);
-webkit-filter: blur(2px);
filter: blur(2px);
-webkit-border-radius: 100%;
-moz-border-radius: 100%;
border-radius: 100%;
-webkit-animation: shadow 0.5s ease infinite alternate;
-moz-animation: shadow 0.5s ease infinite alternate;
animation: shadow 0.5s ease infinite alternate;
}
.cube-wrapper .loading {
font-size: 12px;
letter-spacing: 0.1em;
display: block;
color: white;
position: relative;
top: 25px;
z-index: 2;
-webkit-animation: text 0.5s ease infinite alternate;
-moz-animation: text 0.5s ease infinite alternate;
animation: text 0.5s ease infinite alternate;
}
@-webkit-keyframes text {
100% {
top: 35px;
}
}
@-moz-keyframes text {
100% {
top: 35px;
}
}
@-ms-keyframes text {
100% {
top: 35px;
}
}
@keyframes text {
100% {
top: 35px;
}
}
@-webkit-keyframes shadow {
100% {
bottom: -18px;
width: 100px;
}
}
@-moz-keyframes shadow {
100% {
bottom: -18px;
width: 100px;
}
}
@-ms-keyframes shadow {
100% {
bottom: -18px;
width: 100px;
}
}
@keyframes shadow {
100% {
bottom: -18px;
width: 100px;
}
}
html,
body {
min-height: 100%;
}
body {
/* fallback for old browsers */
/* Chrome 10-25, Safari 5.1-6 */
background: linear-gradient(to left, #00c6ff, #0072ff);
/* W3C, IE 10+/ Edge, Firefox 16+, Chrome 26+, Opera 12+, Safari 7+ */
font-family: arial;
}
h1 {
font-size: 26px;
display: block;
text-align: center;
color: #fff;
padding: 50px 20px;
font-weight: 300;
font-family: "Archivo Narrow", sans-serif;
}
.made-with-love {
position: fixed;
left: 0;
width: 100%;
bottom: 10px;
text-align: center;
font-size: 10px;
z-index: 9999;
font-family: arial;
color: #fff;
}
.made-with-love i {
font-style: normal;
color: #f50057;
font-size: 14px;
position: relative;
top: 2px;
}
.made-with-love a {
color: #fff;
text-decoration: none;
}
.made-with-love a:hover {
text-decoration: underline;
}
/*# sourceMappingURL=index.css.map */
</style>
<body>
<div id="app">
<!-- <div id="loader-wrapper">
<div id="loader"></div>
<div class="loader-section section-left"></div>
<div class="loader-section section-right"></div>
<div class="load_title">正在加载ThingLinks系统资源,请耐心等待</div>
</div> -->
<h1>ThingLinks Iot Integrated Platform</h1>
<div class="cube-wrapper">
<div class="cube-folding">
<span class="leaf1"></span>
<span class="leaf2"></span>
<span class="leaf3"></span>
<span class="leaf4"></span>
</div>
<span class="loading" data-name="Loading">Loading</span>
</div>
<!-- follow me template -->
<div class="made-with-love">
<a target="_blank" href="http://thinglinks.mqttsnet.com">@ThingLinks</a>
</div>
</div>
</body>
</html>
\ No newline at end of file
......@@ -17,3 +17,9 @@ export default {
}
}
</script>
<style>
body{
background:white;
margin: 0;
}
</style>
\ No newline at end of file
<template>
<div class="app-container">
<el-form
:model="queryParams"
ref="queryForm"
:inline="true"
v-show="showSearch"
label-width="100px"
>
<div class="equipment_status">
<div class="status_num">
<!-- <img src="assets/icons/status.svg" alt=""> -->
<i class="el-icon-help"></i>
<p>
<span style="color:#71e2a3">{{ onlineCount }}</span>/
<span style="color:#ff9292">{{ offlineCount }}</span>/
<span style="color:#ffba00">{{ initCount }}</span>/
<span>{{ total }}</span>
</p>
</div>
<div class="status">
<p>
设备状态:
</p>
<span style="color:#71e2a3">在线/</span>
<span style="color:#ff9292">离线/</span>
<span style="color:#ffba00">未连接/</span>
<span>全部</span>
</div>
<div class="Mqtt">
<p v-for="dict in dict.type.link_device_connector" :key="dict.value">
MQTT连接地址:
<i style="cursor: pointer;" title="复制" class="el-icon-copy-document" @click="copy(dict.label)"></i>
<span>{{ dict.label }}</span>
</p>
</div>
<div class="zhengshu">
<p>
SSL证书:
<a href="#" style="color:#357DF5">下载SSL证书</a>
</p>
<p>
<span>二次开发:</span>
<a href="#" style="color:#357DF5;margin-right:20px">下载Demo</a>
<a href="#" style="color:#357DF5">开发文档</a>
</p>
</div>
</div>
<el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="100px">
<el-form-item label="客户端标识" prop="clientId">
<el-input
v-model="queryParams.clientId"
placeholder="请输入客户端标识"
clearable
size="small"
@keyup.enter.native="handleQuery"
/>
<el-input v-model="queryParams.clientId" placeholder="请输入客户端标识" clearable size="small"
@keyup.enter.native="handleQuery" />
</el-form-item>
<el-form-item label="设备标识" prop="deviceIdentification">
<el-input
v-model="queryParams.deviceIdentification"
placeholder="请输入设备标识"
clearable
size="small"
@keyup.enter.native="handleQuery"
/>
<el-input v-model="queryParams.deviceIdentification" placeholder="请输入设备标识" clearable size="small"
@keyup.enter.native="handleQuery" />
</el-form-item>
<el-form-item label="设备名称" prop="deviceName">
<el-input
v-model="queryParams.deviceName"
placeholder="请输入设备名称"
clearable
size="small"
@keyup.enter.native="handleQuery"
/>
<el-input v-model="queryParams.deviceName" placeholder="请输入设备名称" clearable size="small"
@keyup.enter.native="handleQuery" />
</el-form-item>
<el-form-item v-if="advancedSearch" label="连接实例" prop="connector">
<el-select
v-model="queryParams.connector"
placeholder="请选择连接实例"
clearable
size="small"
>
<el-option
v-for="dict in dict.type.link_device_connector"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
<el-select v-model="queryParams.connector" placeholder="请选择连接实例" clearable size="small">
<el-option v-for="dict in dict.type.link_device_connector" :key="dict.value" :label="dict.label"
:value="dict.value" />
</el-select>
</el-form-item>
<el-form-item v-if="advancedSearch" label="设备状态" prop="deviceStatus">
<el-select
v-model="queryParams.deviceStatus"
placeholder="请选择设备状态"
clearable
size="small"
>
<el-option
v-for="dict in dict.type.link_device_status"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
<el-select v-model="queryParams.deviceStatus" placeholder="请选择设备状态" clearable size="small">
<el-option v-for="dict in dict.type.link_device_status" :key="dict.value" :label="dict.label"
:value="dict.value" />
</el-select>
</el-form-item>
<el-form-item v-if="advancedSearch" label="连接状态" prop="connectStatus">
<el-select
v-model="queryParams.connectStatus"
placeholder="请选择连接状态"
clearable
size="small"
>
<el-option
v-for="dict in dict.type.link_device_connect_status"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
<el-select v-model="queryParams.connectStatus" placeholder="请选择连接状态" clearable size="small">
<el-option v-for="dict in dict.type.link_device_connect_status" :key="dict.value" :label="dict.label"
:value="dict.value" />
</el-select>
</el-form-item>
<el-form-item v-if="advancedSearch" label="是否遗言" prop="isWill">
<el-select
v-model="queryParams.isWill"
placeholder="请选择是否遗言"
clearable
size="small"
>
<el-option
v-for="dict in dict.type.link_device_is_will"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
<el-select v-model="queryParams.isWill" placeholder="请选择是否遗言" clearable size="small">
<el-option v-for="dict in dict.type.link_device_is_will" :key="dict.value" :label="dict.label"
:value="dict.value" />
</el-select>
</el-form-item>
<el-form-item v-if="advancedSearch" label="设备标签" prop="deviceTags">
<el-input
v-model="queryParams.deviceTags"
placeholder="请输入设备标签"
clearable
size="small"
@keyup.enter.native="handleQuery"
/>
<el-input v-model="queryParams.deviceTags" placeholder="请输入设备标签" clearable size="small"
@keyup.enter.native="handleQuery" />
</el-form-item>
<el-form-item
v-if="advancedSearch"
label="产品标识"
prop="productIdentification"
>
<el-input
v-model="queryParams.productIdentification"
placeholder="请输入产品标识"
clearable
size="small"
@keyup.enter.native="handleQuery"
/>
<el-form-item v-if="advancedSearch" label="产品标识" prop="productIdentification">
<el-input v-model="queryParams.productIdentification" placeholder="请输入产品标识" clearable size="small"
@keyup.enter.native="handleQuery" />
</el-form-item>
<el-form-item
v-if="advancedSearch"
label="产品协议类型"
prop="protocolType"
>
<el-select
v-model="queryParams.protocolType"
placeholder="请选择产品协议类型"
clearable
size="small"
>
<el-option
v-for="dict in dict.type.link_device_protocol_type"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
<el-form-item v-if="advancedSearch" label="产品协议类型" prop="protocolType">
<el-select v-model="queryParams.protocolType" placeholder="请选择产品协议类型" clearable size="small">
<el-option v-for="dict in dict.type.link_device_protocol_type" :key="dict.value" :label="dict.label"
:value="dict.value" />
</el-select>
</el-form-item>
<el-form-item v-if="advancedSearch" label="设备类型" prop="deviceType">
<el-select
v-model="queryParams.deviceType"
placeholder="请选择设备类型"
clearable
size="small"
>
<el-option
v-for="dict in dict.type.link_device_device_type"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
<el-select v-model="queryParams.deviceType" placeholder="请选择设备类型" clearable size="small">
<el-option v-for="dict in dict.type.link_device_device_type" :key="dict.value" :label="dict.label"
:value="dict.value" />
</el-select>
</el-form-item>
<el-form-item>
<el-button
type="primary"
icon="el-icon-search"
size="mini"
@click="handleQuery"
>搜索</el-button
>
<el-button icon="el-icon-refresh" size="mini" @click="resetQuery"
>重置</el-button
>
<el-button
:icon="icon"
size="mini"
@click="advancedSearch_toggle($event)"
>高级搜索</el-button
>
<el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
<el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
<el-button :icon="icon" size="mini" @click="advancedSearch_toggle($event)">高级搜索</el-button>
</el-form-item>
</el-form>
<el-row :gutter="10" class="mb8">
<el-col :span="1.5">
<el-button
type="primary"
plain
icon="el-icon-plus"
size="mini"
@click="handleAdd"
v-hasPermi="['link:device:add']"
>新增</el-button
>
<el-button type="primary" plain icon="el-icon-plus" size="mini" @click="handleAdd"
v-hasPermi="['link:device:add']">新增</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="success"
plain
icon="el-icon-edit"
size="mini"
:disabled="single"
@click="handleUpdate"
v-hasPermi="['link:device:edit']"
>修改</el-button
>
<el-button type="success" plain icon="el-icon-edit" size="mini" :disabled="single" @click="handleUpdate"
v-hasPermi="['link:device:edit']">修改</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="danger"
plain
icon="el-icon-delete"
size="mini"
:disabled="multiple"
@click="handleDelete"
v-hasPermi="['link:device:remove']"
>删除</el-button
>
<el-button type="danger" plain icon="el-icon-delete" size="mini" :disabled="multiple" @click="handleDelete"
v-hasPermi="['link:device:remove']">删除</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="danger"
plain
icon="el-icon-loading"
size="mini"
:disabled="multiple"
@click="handleDisconnect"
v-hasPermi="['link:device:disconnect']"
>断开连接</el-button
>
<el-button type="danger" plain icon="el-icon-loading" size="mini" :disabled="multiple" @click="handleDisconnect"
v-hasPermi="['link:device:disconnect']">断开连接</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="warning"
plain
icon="el-icon-download"
size="mini"
@click="handleExport"
v-hasPermi="['link:device:export']"
>导出</el-button
>
<el-button type="warning" plain icon="el-icon-download" size="mini" @click="handleExport"
v-hasPermi="['link:device:export']">导出</el-button>
</el-col>
<right-toolbar
:showSearch.sync="showSearch"
@queryTable="getList"
></right-toolbar>
<right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
</el-row>
<el-table
v-loading="loading"
:data="deviceList"
@selection-change="handleSelectionChange"
>
<el-table v-loading="loading" :data="deviceList" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" align="center" />
<el-table-column label="id" align="center" prop="id" />
<el-table-column
label="客户端标识"
align="center"
prop="clientId"
width="180"
/>
<el-table-column
label="用户名"
align="center"
prop="userName"
width="180"
/>
<el-table-column
label="密码"
align="center"
prop="password"
width="180"
/>
<el-table-column label="客户端标识" align="center" prop="clientId" width="180" />
<el-table-column label="用户名" align="center" prop="userName" width="180" />
<el-table-column label="密码" align="center" prop="password" width="180" >
<template slot-scope="scope">
<div disable="disable" style="width:100%;display:flex; justify-content: center;align-items:center">
<i style="cursor: pointer;" title="复制" class="el-icon-copy-document"
@click="copy(deviceList[scope.$index].password)"></i>
<el-input class="inputDeep" v-model="deviceList[scope.$index].password" show-password ></el-input>
</div>
</template>
</el-table-column>
<el-table-column label="认证方式" align="center" prop="authMode">
<template slot-scope="scope">
<dict-tag
:options="dict.type.link_device_auth_mode"
:value="scope.row.authMode"
/>
<dict-tag :options="dict.type.link_device_auth_mode" :value="scope.row.authMode" />
</template>
</el-table-column>
<el-table-column
label="设备标识"
align="center"
prop="deviceIdentification"
width="180"
/>
<el-table-column
label="设备名称"
align="center"
prop="deviceName"
width="180"
/>
<el-table-column
label="连接实例"
align="center"
prop="connector"
width="180"
>
<el-table-column label="设备标识" align="center" prop="deviceIdentification" width="180" />
<el-table-column label="设备名称" align="center" prop="deviceName" width="180" />
<el-table-column label="连接实例" align="center" prop="connector" width="180">
<template slot-scope="scope">
<dict-tag
:options="dict.type.link_device_connector"
:value="scope.row.connector"
/>
<dict-tag :options="dict.type.link_device_connector" :value="scope.row.connector" />
</template>
</el-table-column>
<el-table-column
label="设备描述"
align="center"
prop="deviceDescription"
width="180"
/>
<el-table-column label="设备状态" align="center" prop="deviceStatus">
<el-table-column label="设备标签" align="center" prop="deviceTags" width="180"/>
<el-table-column label="产品标识" align="center" prop="productIdentification" width="180"/>
<el-table-column label="产品协议类型" align="center" prop="protocolType" width="100">
<template slot-scope="scope">
<dict-tag
:options="dict.type.link_device_status"
:value="scope.row.deviceStatus"
/>
<dict-tag :options="dict.type.link_device_protocol_type" :value="scope.row.protocolType" />
</template>
</el-table-column>
<el-table-column label="连接状态" align="center" prop="connectStatus">
<el-table-column label="设备类型" align="center" prop="deviceType">
<template slot-scope="scope">
<dict-tag
:options="dict.type.link_device_connect_status"
:value="scope.row.connectStatus"
/>
<dict-tag :options="dict.type.link_device_device_type" :value="scope.row.deviceType" />
</template>
</el-table-column>
<el-table-column label="是否遗言" align="center" prop="isWill">
<el-table-column label="设备状态" align="center" prop="deviceStatus">
<template slot-scope="scope">
<dict-tag
:options="dict.type.link_device_is_will"
:value="scope.row.isWill"
/>
<dict-tag :options="dict.type.link_device_status" :value="scope.row.deviceStatus" />
</template>
</el-table-column>
<el-table-column label="设备标签" align="center" prop="deviceTags" />
<el-table-column
label="产品标识"
align="center"
prop="productIdentification"
/>
<el-table-column
label="产品协议类型"
align="center"
prop="protocolType"
width="100"
>
<el-table-column label="连接状态" align="center" prop="connectStatus">
<template slot-scope="scope">
<dict-tag
:options="dict.type.link_device_protocol_type"
:value="scope.row.protocolType"
/>
<dict-tag :options="dict.type.link_device_connect_status" :value="scope.row.connectStatus" />
</template>
</el-table-column>
<el-table-column label="设备类型" align="center" prop="deviceType">
<el-table-column label="是否遗言" align="center" prop="isWill">
<template slot-scope="scope">
<dict-tag
:options="dict.type.link_device_device_type"
:value="scope.row.deviceType"
/>
<dict-tag :options="dict.type.link_device_is_will" :value="scope.row.isWill" />
</template>
</el-table-column>
<el-table-column label="设备描述" align="center" prop="deviceDescription" width="180" />
<el-table-column label="创建者" align="center" prop="createBy" />
<el-table-column
label="创建时间"
align="center"
prop="createTime"
width="180"
>
<el-table-column label="创建时间" align="center" prop="createTime" width="180">
<template slot-scope="scope">
<span>{{
parseTime(scope.row.createTime, "{y}-{m}-{d} {h}:{i}:{s}")
parseTime(scope.row.createTime, "{y}-{m}-{d} {h}:{i}:{s}")
}}</span>
</template>
</el-table-column>
<el-table-column label="更新者" align="center" prop="updateBy" />
<el-table-column
label="更新时间"
align="center"
prop="updateTime"
width="180"
>
<el-table-column label="更新时间" align="center" prop="updateTime" width="180">
<template slot-scope="scope">
<span>{{
parseTime(scope.row.updateTime, "{y}-{m}-{d} {h}:{i}:{s}")
parseTime(scope.row.updateTime, "{y}-{m}-{d} {h}:{i}:{s}")
}}</span>
</template>
</el-table-column>
<el-table-column label="备注" align="center" prop="remark" />
<el-table-column fixed="right" label="操作" width="150">
<template slot-scope="scope">
<el-tooltip
class="item"
effect="light"
content="修改"
placement="top"
>
<el-button
circle
size="mini"
type="primary"
icon="el-icon-edit"
@click="handleUpdate(scope.row)"
v-hasPermi="['link:device:edit']"
></el-button>
<el-tooltip class="item" effect="light" content="修改" placement="top">
<el-button circle size="mini" type="primary" icon="el-icon-edit" @click="handleUpdate(scope.row)"
v-hasPermi="['link:device:edit']"></el-button>
</el-tooltip>
<el-tooltip
class="item"
effect="light"
content="删除"
placement="top"
>
<el-button
circle
size="mini"
type="primary"
icon="el-icon-delete"
@click="handleDelete(scope.row)"
v-hasPermi="['link:device:remove']"
></el-button>
<el-tooltip class="item" effect="light" content="删除" placement="top">
<el-button circle size="mini" type="primary" icon="el-icon-delete" @click="handleDelete(scope.row)"
v-hasPermi="['link:device:remove']"></el-button>
</el-tooltip>
<el-tooltip
class="item"
effect="light"
content="子设备信息"
placement="top"
>
<el-button
circle
size="mini"
type="primary"
icon="el-icon-s-operation"
@click="handleUpdate(scope.row)"
v-hasPermi="['link:device:deviceInfo']"
></el-button>
<el-tooltip class="item" effect="light" content="子设备信息" placement="top">
<el-button circle size="mini" type="primary" icon="el-icon-s-operation" @click="handleUpdate(scope.row)"
v-hasPermi="['link:device:deviceInfo']"></el-button>
</el-tooltip>
</template>
</el-table-column>
</el-table>
<pagination
v-show="total > 0"
:total="total"
:page.sync="queryParams.pageNum"
:limit.sync="queryParams.pageSize"
@pagination="getList"
/>
<pagination v-show="total > 0" :total="total" :page.sync="queryParams.pageNum" :limit.sync="queryParams.pageSize"
@pagination="getList" />
<!-- 添加或修改设备档案对话框 -->
<el-dialog :title="title" :visible.sync="open" width="40%" append-to-body>
......@@ -442,10 +225,7 @@
<el-row>
<el-col :span="11">
<el-form-item label="客户端标识" prop="clientId">
<el-input
v-model="form.clientId"
placeholder="请输入客户端标识"
/>
<el-input v-model="form.clientId" placeholder="请输入客户端标识" />
</el-form-item>
</el-col>
<el-col :span="11">
......@@ -458,18 +238,14 @@
<el-row>
<el-col :span="11">
<el-form-item label="密码" prop="password">
<el-input v-model="form.password" placeholder="请输入密码" />
<el-input v-model="form.password" type="password" placeholder="请输入密码" />
</el-form-item>
</el-col>
<el-col :span="11">
<el-form-item label="认证方式" prop="authMode">
<el-select v-model="form.authMode" placeholder="请选择认证方式">
<el-option
v-for="dict in dict.type.link_device_auth_mode"
:key="dict.value"
:label="dict.label"
:value="dict.value"
></el-option>
<el-option v-for="dict in dict.type.link_device_auth_mode" :key="dict.value" :label="dict.label"
:value="dict.value"></el-option>
</el-select>
</el-form-item>
</el-col>
......@@ -478,18 +254,12 @@
<el-row>
<el-col :span="11">
<el-form-item label="设备名称" prop="deviceIdentification">
<el-input
v-model="form.deviceName"
placeholder="请输入设备名称"
/>
<el-input v-model="form.deviceName" placeholder="请输入设备名称" />
</el-form-item>
</el-col>
<el-col :span="11">
<el-form-item label="设备标识" prop="deviceIdentification">
<el-input
v-model="form.deviceIdentification"
placeholder="请输入设备标识"
/>
<el-input v-model="form.deviceIdentification" placeholder="请输入设备标识" />
</el-form-item>
</el-col>
</el-row>
......@@ -498,35 +268,23 @@
<el-col :span="11">
<el-form-item label="集成应用" prop="appId">
<el-select v-model="form.appId" placeholder="请选择集成应用">
<el-option
v-for="dict in dict.type.link_application_type"
:key="dict.value"
:label="dict.label"
:value="dict.value"
></el-option>
<el-option v-for="dict in dict.type.link_application_type" :key="dict.value" :label="dict.label"
:value="dict.value"></el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :span="11">
<el-form-item label="连接实例" prop="connector">
<el-select v-model="form.connector" placeholder="请选择连接实例">
<el-option
v-for="dict in dict.type.link_device_connector"
:key="dict.value"
:label="dict.label"
:value="dict.value"
></el-option>
<el-option v-for="dict in dict.type.link_device_connector" :key="dict.value" :label="dict.label"
:value="dict.value"></el-option>
</el-select>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="22">
<mapView
@locationChange="locationChange"
@locationFail="locationFail"
ref="mapView"
></mapView>
<mapView @locationChange="locationChange" @locationFail="locationFail" ref="mapView"></mapView>
</el-col>
</el-row>
......@@ -546,87 +304,63 @@
<el-row>
<el-col :span="11">
<el-form-item label="设备描述" prop="deviceDescription">
<el-input
v-model="form.deviceDescription"
placeholder="请输入设备描述"
/>
<el-input v-model="form.deviceDescription" placeholder="请输入设备描述" />
</el-form-item>
</el-col>
<el-col :span="11">
<el-form-item label="设备状态" prop="deviceStatus">
<el-select
v-model="form.deviceStatus"
placeholder="请选择设备状态"
>
<el-option
v-for="dict in dict.type.link_device_status"
:key="dict.value"
:label="dict.label"
:value="dict.value"
></el-option>
<el-select v-model="form.deviceStatus" placeholder="请选择设备状态">
<el-option v-for="dict in dict.type.link_device_status" :key="dict.value" :label="dict.label"
:value="dict.value"></el-option>
</el-select>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="11">
<el-form-item label="产品标识" prop="productIdentification">
<el-input
v-model="form.productIdentification"
placeholder="请输入产品标识"
/>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="11">
<el-form-item label="产品协议类型" prop="protocolType">
<el-select
v-model="form.protocolType"
placeholder="请选择产品协议类型"
>
<el-option
v-for="dict in dict.type.link_device_protocol_type"
:key="dict.value"
:label="dict.label"
:value="dict.value"
></el-option>
<el-select v-model="form.protocolType" placeholder="请选择产品协议类型">
<el-option v-for="dict in dict.type.link_device_protocol_type" :key="dict.value" :label="dict.label"
:value="dict.value"></el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :span="11">
<el-form-item label="设备类型" prop="deviceType">
<el-select v-model="form.deviceType" placeholder="请选择设备类型">
<el-option
v-for="dict in dict.type.link_device_device_type"
:key="dict.value"
:label="dict.label"
:value="dict.value"
></el-option>
<el-option v-for="dict in dict.type.link_device_device_type" :key="dict.value" :label="dict.label"
:value="dict.value"></el-option>
</el-select>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="22">
<el-col :span="11">
<el-form-item label="所属产品">
<el-select v-model="form.productIdentification" placeholder="请选择所属产品">
<el-option
v-for="item in productOptions"
:key="item.productIdentification"
:label="item.productName"
:value="item.productIdentification"
:disabled="item.status === 0"
></el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :span="11">
<el-form-item label="设备标签" prop="deviceTags">
<el-input
v-model="form.deviceTags"
placeholder="请输入设备标签"
/>
<el-input v-model="form.deviceTags" placeholder="请输入设备标签" />
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="22">
<el-form-item label="备注" prop="remark">
<el-input
v-model="form.remark"
type="textarea"
placeholder="请输入内容"
/>
<el-input v-model="form.remark" type="textarea" placeholder="请输入内容" />
</el-form-item>
</el-col>
</el-row>
......@@ -648,9 +382,7 @@ import {
updateDevice,
disconnectDevice,
} from "@/api/link/device";
import mapView from "./mapView";
export default {
components: {
mapView,
......@@ -668,6 +400,10 @@ export default {
],
data() {
return {
//密码显示隐藏
passWord: "******",
flag: true,
index_x: [],
// 高级搜索切换
advancedSearch: false,
// 高级搜索icon
......@@ -755,12 +491,28 @@ export default {
{ required: true, message: "设备类型不能为空", trigger: "change" },
],
},
onlineCount: 0, //在线设备
offlineCount: 0,//离线设备
initCount: 0,//未连接设备
};
},
created() {
this.getList();
},
methods: {
// 复制
copy(shareLink) {
var input = document.createElement("input");
input.value = shareLink;
document.body.appendChild(input);
input.select()
document.execCommand("Copy");
document.body.removeChild(input);
this.$message({
message: '复制成功',
type: 'success'
});
},
// 高级搜索切换显示隐藏
advancedSearch_toggle() {
this.advancedSearch = !this.advancedSearch;
......@@ -786,7 +538,11 @@ export default {
getList() {
this.loading = true;
listDevice(this.queryParams).then((response) => {
console.log(response);
this.deviceList = response.data.device.rows;
this.onlineCount = response.data.onlineCount
this.offlineCount = response.data.offlineCount
this.initCount = response.data.initCount
this.total = response.data.device.total;
this.loading = false;
});
......@@ -845,8 +601,11 @@ export default {
/** 新增按钮操作 */
handleAdd() {
this.reset();
this.open = true;
this.title = "添加设备档案";
getDevice().then(response => {
this.productOptions = response.products;
this.open = true;
this.title = "添加设备档案";
});
},
/** 修改按钮操作 */
handleUpdate(row) {
......@@ -854,6 +613,7 @@ export default {
const id = row.id || this.ids;
getDevice(id).then((response) => {
this.form = response.data;
this.productOptions = response.products;
this.open = true;
this.title = "修改设备档案";
});
......@@ -890,7 +650,7 @@ export default {
this.getList();
this.$modal.msgSuccess("删除成功");
})
.catch(() => {});
.catch(() => { });
},
/** 断开连接按钮操作 */
handleDisconnect(row) {
......@@ -904,7 +664,7 @@ export default {
this.getList();
this.$modal.msgSuccess("操作成功");
})
.catch(() => {});
.catch(() => { });
},
/** 导出按钮操作 */
handleExport() {
......@@ -919,3 +679,50 @@ export default {
},
};
</script>
<style lang="scss" scoped>
.equipment_status {
width: 100%;
margin: 0 0 10px 10px;
padding: 20px 30px;
background: #F8F8F9;
border-radius: 10px;
display: flex;
align-items: center;
justify-content: space-around;
font-size: 14px;
font-weight: 700;
color: #515a6e;
}
.equipment_status .status_num {
width: 12%;
display: flex;
font-size: 18px;
align-items: center;
i {
font-size: 25px;
width: 40px;
height: 40px;
border: 1px #ccc dashed;
text-align: center;
line-height: 38px;
border-radius: 50%;
}
img {
width: 20%;
}
}
.equipment_status .status {
width: 20%;
display: flex;
align-items: center;
}
.inputDeep{
border: 0 !important;
}
</style>
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册