Просмотр исходного кода

Merge branch 'master' of http://git.xt.wenhq.top:8083/wenhongquan/iotc

liwei19941102 2 лет назад
Родитель
Сommit
57c57ed0ed

+ 35 - 0
ruoyi-admin/pom.xml

@@ -125,6 +125,41 @@
                     <warName>${project.artifactId}</warName>
                 </configuration>
             </plugin>
+
+
+            <plugin>
+                <groupId>com.google.cloud.tools</groupId>
+                <artifactId>jib-maven-plugin</artifactId>
+                <version>1.7.0</version>
+                <configuration>
+                    <!--from节点用来设置镜像的基础镜像,相当于Docerkfile中的FROM关键字-->
+                    <from>
+                        <image>docker.xt.wenhq.top:8083/docker_r/javarun:1.0</image>
+                    </from>
+                    <to>
+                        <!--镜像名称和tag,使用了mvn内置变量${project.version},表示当前工程的version-->
+                        <image>docker.xt.wenhq.top:8083/docker_r/ioc:${project.version}</image>
+                        <auth>
+                            <username>admin</username>
+                            <password>xtwenhongquan</password>
+                        </auth>
+                    </to>
+                    <!--容器相关的属性-->
+                    <container>
+                        <useCurrentTimestamp>true</useCurrentTimestamp>
+                    </container>
+                    <allowInsecureRegistries>true</allowInsecureRegistries>
+
+                </configuration>
+                <executions>
+                    <execution>
+                        <phase>package</phase>
+                        <goals>
+                            <goal>build</goal>
+                        </goals>
+                    </execution>
+                </executions>
+            </plugin>
         </plugins>
     </build>
 

+ 8 - 8
ruoyi-admin/src/main/resources/application-dev.yml

@@ -37,7 +37,7 @@ spring:
     # 动态数据源文档 https://www.kancloud.cn/tracy5546/dynamic-datasource/content
     dynamic:
       # 性能分析插件(有性能损耗 不建议生产环境使用)
-      p6spy: true
+      p6spy: false
       # 设置默认的数据源或者数据源组,默认值即为 master
       primary: master
       # 严格模式 匹配不到数据源则报错
@@ -49,9 +49,9 @@ spring:
           driverClassName: com.mysql.cj.jdbc.Driver
           # jdbc 所有参数配置参考 https://lionli.blog.csdn.net/article/details/122018562
           # rewriteBatchedStatements=true 批处理优化 大幅提升批量插入更新删除性能(对数据库有性能损耗 使用批量操作应考虑性能问题)
-          url: jdbc:mysql://xt.wenhq.top:8583/iotc?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&autoReconnect=true&rewriteBatchedStatements=true
-          username: root
-          password: root
+          url: jdbc:mysql://${DBHOST:xt.wenhq.top}:${DBPORT:8583}/iotc?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&autoReconnect=true&rewriteBatchedStatements=true
+          username: ${DBUSER:root}
+          password: ${DBPWD:root}
         # 从库数据源
         slave:
           lazy: true
@@ -102,13 +102,13 @@ spring:
 spring:
   redis:
     # 地址
-    host: 60.204.209.152
+    host: ${REDIS_HOST:localhost}
     # 端口,默认为6379
-    port: 6379
+    port: ${REDIS_PORT:6379}
     # 数据库索引
-    database: 0
+    database: ${REDIS_DB:0}
     # 密码(如没有密码请注释掉)
-    password: 123456
+#    password: ${REDIS_PWD:}
     # 连接超时时间
     timeout: 10s
     # 是否开启ssl

+ 1 - 1
ruoyi-admin/src/main/resources/application.yml

@@ -102,7 +102,7 @@ sa-token:
   timeout: 86400
   # 多端不同 token 有效期 可查看 LoginHelper.loginByDevice 方法自定义
   # token最低活跃时间 (指定时间无操作就过期) 单位: 秒
-  active-timeout: 1800
+  active-timeout: 36000
   # 允许动态设置 token 有效期
   dynamic-active-timeout: true
   # 是否允许同一账号并发登录 (为true时允许一起登录, 为false时新登录挤掉旧登录)

+ 1 - 1
ruoyi-common/src/main/java/com/ruoyi/common/annotation/RepeatSubmit.java

@@ -17,7 +17,7 @@ public @interface RepeatSubmit {
     /**
      * 间隔时间(ms),小于此时间视为重复提交
      */
-    int interval() default 5000;
+    int interval() default 1000;
 
     TimeUnit timeUnit() default TimeUnit.MILLISECONDS;
 

+ 2 - 2
ruoyi-system/src/main/java/com/ruoyi/data/controller/TblEquipmentCodeController.java

@@ -44,8 +44,8 @@ public class TblEquipmentCodeController extends BaseController {
      */
     @SaCheckPermission("data:equipmentCode:list")
     @GetMapping("/list")
-    public TableDataInfo<TblEquipmentCodeVo> list(TblEquipmentCodeBo bo, PageQuery pageQuery) {
-        return iTblEquipmentCodeService.queryPageList(bo, pageQuery);
+    public R<?> list(TblEquipmentCodeBo bo, PageQuery pageQuery) {
+        return R.ok(iTblEquipmentCodeService.queryList(bo));
     }
 
     /**

+ 2 - 2
ruoyi-system/src/main/java/com/ruoyi/data/controller/TblEquipmentTagController.java

@@ -44,8 +44,8 @@ public class TblEquipmentTagController extends BaseController {
      */
     @SaCheckPermission("data:equipmentTag:list")
     @GetMapping("/list")
-    public TableDataInfo<TblEquipmentTagVo> list(TblEquipmentTagBo bo, PageQuery pageQuery) {
-        return iTblEquipmentTagService.queryPageList(bo, pageQuery);
+    public R<?> list(TblEquipmentTagBo bo) {
+        return R.ok(iTblEquipmentTagService.queryList(bo));
     }
 
     /**

+ 1 - 13
ruoyi-system/src/main/java/com/ruoyi/data/domain/bo/TblMqttBo.java

@@ -24,27 +24,23 @@ import com.ruoyi.common.core.domain.BaseEntity;
 public class TblMqttBo extends BaseEntity {
 
     /**
-     * 
+     *
      */
-    @NotNull(message = "不能为空", groups = { EditGroup.class })
     private Long id;
 
     /**
      * 协议名称
      */
-    @NotBlank(message = "协议名称不能为空", groups = { AddGroup.class, EditGroup.class })
     private String protocolName;
 
     /**
      * 协议描述
      */
-    @NotBlank(message = "协议描述不能为空", groups = { AddGroup.class, EditGroup.class })
     private String protocolDesc;
 
     /**
      * 协议类型
      */
-    @NotBlank(message = "协议类型不能为空", groups = { AddGroup.class, EditGroup.class })
     private String protocolType;
 
     /**
@@ -56,19 +52,16 @@ public class TblMqttBo extends BaseEntity {
     /**
      * Mqtt主题
      */
-    @NotBlank(message = "Mqtt主题不能为空", groups = { AddGroup.class, EditGroup.class })
     private String serverTopic;
 
     /**
      * 账号
      */
-    @NotBlank(message = "账号不能为空", groups = { AddGroup.class, EditGroup.class })
     private String account;
 
     /**
      * 密码
      */
-    @NotBlank(message = "密码不能为空", groups = { AddGroup.class, EditGroup.class })
     private String password;
 
     /**
@@ -80,31 +73,26 @@ public class TblMqttBo extends BaseEntity {
     /**
      * 备注
      */
-    @NotBlank(message = "备注不能为空", groups = { AddGroup.class, EditGroup.class })
     private String remark;
 
     /**
      * 创建人
      */
-    @NotBlank(message = "创建人不能为空", groups = { AddGroup.class, EditGroup.class })
     private String creator;
 
     /**
      * 创建时间
      */
-    @NotNull(message = "创建时间不能为空", groups = { AddGroup.class, EditGroup.class })
     private Date ctime;
 
     /**
      * 更新人
      */
-    @NotBlank(message = "更新人不能为空", groups = { AddGroup.class, EditGroup.class })
     private String modifier;
 
     /**
      * 更新时间
      */
-    @NotNull(message = "更新时间不能为空", groups = { AddGroup.class, EditGroup.class })
     private Date utime;
 
 

+ 20 - 0
ruoyi-ui-vue3/.env.test

@@ -0,0 +1,20 @@
+# 页面标题
+VITE_APP_TITLE = 物联网平台
+
+# 生产环境配置
+VITE_APP_ENV = 'test'
+
+# 应用访问路径 例如使用前缀 /admin/
+VITE_APP_CONTEXT_PATH = '/'
+
+# 监控地址
+VITE_APP_MONITRO_ADMIN = '/admin/applications'
+
+# 监控地址
+VITE_APP_XXL_JOB_ADMIN = '/xxl-job-admin'
+
+# 若依管理系统/生产环境
+VITE_APP_BASE_API = 'http://iotc-bg.xt.wenhq.top:8083/'
+
+# 是否在打包时开启压缩,支持 gzip 和 brotli
+VITE_BUILD_COMPRESS = gzip

+ 1 - 0
ruoyi-ui-vue3/package.json

@@ -7,6 +7,7 @@
   "scripts": {
     "dev": "vite",
     "build:prod": "vite build",
+    "build:test": "vite build --mode test",
     "preview": "vite preview"
   },
   "repository": {

+ 44 - 0
ruoyi-ui-vue3/src/api/data/equipmentcode.js

@@ -0,0 +1,44 @@
+import request from '@/utils/request'
+
+// 查询规则列表
+export function listEquipmentCode(query) {
+  return request({
+    url: '/data/equipmentCode/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询规则详细
+export function getEquipmentCode(id) {
+  return request({
+    url: '/data/equipmentCode/' + id,
+    method: 'get'
+  })
+}
+
+// 新增规则
+export function addEquipmentCode(data) {
+  return request({
+    url: '/data/equipmentCode',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改规则
+export function updateEquipmentCode(data) {
+  return request({
+    url: '/data/equipmentCode',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除规则
+export function delEquipmentCode(id) {
+  return request({
+    url: '/data/equipmentCode/' + id,
+    method: 'delete'
+  })
+}

+ 44 - 0
ruoyi-ui-vue3/src/api/data/equipmenttag.js

@@ -0,0 +1,44 @@
+import request from '@/utils/request'
+
+// 查询规则列表
+export function listEquipmentTag(query) {
+  return request({
+    url: '/data/equipmentTag/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询规则详细
+export function getEquipmentTag(id) {
+  return request({
+    url: '/data/equipmentTag/' + id,
+    method: 'get'
+  })
+}
+
+// 新增规则
+export function addEquipmentTag(data) {
+  return request({
+    url: '/data/equipmentTag',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改规则
+export function updateEquipmentTag(data) {
+  return request({
+    url: '/data/equipmentTag',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除规则
+export function delEquipmentTag(id) {
+  return request({
+    url: '/data/equipmentTag/' + id,
+    method: 'delete'
+  })
+}

+ 44 - 0
ruoyi-ui-vue3/src/api/data/mqtttopic.js

@@ -0,0 +1,44 @@
+import request from '@/utils/request'
+
+// 查询mqtt配置列表
+export function listMqttTopic(query) {
+  return request({
+    url: '/data/mqttTopic/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询mqtt配置详细
+export function getMqttTopic(id) {
+  return request({
+    url: '/data/mqttTopic/' + id,
+    method: 'get'
+  })
+}
+
+// 新增mqtt配置
+export function addMqttTopic(data) {
+  return request({
+    url: '/data/mqttTopic',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改mqtt配置
+export function updateMqttTopic(data) {
+  return request({
+    url: '/data/mqttTopic',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除mqtt配置
+export function delMqttTopic(id) {
+  return request({
+    url: '/data/mqttTopic/' + id,
+    method: 'delete'
+  })
+}

+ 1 - 1
ruoyi-ui-vue3/src/utils/request.js

@@ -51,7 +51,7 @@ service.interceptors.request.use(config => {
       const s_url = sessionObj.url;                // 请求地址
       const s_data = sessionObj.data;              // 请求数据
       const s_time = sessionObj.time;              // 请求时间
-      const interval = 1000;                       // 间隔时间(ms),小于此时间视为重复提交
+      const interval = 200;                       // 间隔时间(ms),小于此时间视为重复提交
       if (s_data === requestObj.data && requestObj.time - s_time < interval && s_url === requestObj.url) {
         const message = '数据正在处理,请勿重复提交';
         console.warn(`[${s_url}]: ` + message)

+ 21 - 6
ruoyi-ui-vue3/src/views/device/device/index.vue

@@ -1,6 +1,6 @@
 <template>
   <div style="padding: 10px 15px">
-    <el-card class="box-card">
+    <el-card class="box-card" >
       <div style="display: flex; flex-direction: row; justify-content: space-between">
         <div>
           <div
@@ -38,11 +38,11 @@
         <el-col :span="24" style="padding-left: 10px">
           <el-table :data="devicetabledata" :border="true">
             <el-table-column type="selection" width="55"></el-table-column>
-            <el-table-column label="设备名称"></el-table-column>
-            <el-table-column label="型号"></el-table-column>
-            <el-table-column label="设备类型"></el-table-column>
-            <el-table-column label="生产厂商"></el-table-column>
-            <el-table-column label="制造商"></el-table-column>
+            <el-table-column prop="name" label="设备名称"></el-table-column>
+            <el-table-column prop="model" label="型号"></el-table-column>
+            <el-table-column prop="type" label="设备类型"></el-table-column>
+            <el-table-column prop="manufacturer" label="生产厂商"></el-table-column>
+            <el-table-column prop="producer" label="制造商"></el-table-column>
             <el-table-column label="操作">
               <template #default="scope">
                 <div>
@@ -84,6 +84,8 @@
 
 <script setup lang="ts" name="Units">
 import { ref } from "vue";
+import {listEquipment} from "@/api/data/equipment"
+
 
 const searchform = ref({
   devicename: "",
@@ -94,6 +96,19 @@ const gettbheight = () => {
 };
 
 const devicetabledata = ref([1]);
+
+
+
+const getalldata = ()=>{
+  listEquipment({}).then((res) => {
+    devicetabledata.value = res.rows;
+  });
+
+}
+getalldata();
+
+
+
 </script>
 
 <style lang="scss" scoped>

+ 455 - 0
ruoyi-ui-vue3/src/views/mqtt/index.vue

@@ -0,0 +1,455 @@
+<template>
+  <div style="padding: 10px 15px">
+    <el-row>
+      <el-col :span="16" style="padding-right: 10px" >
+        <el-card class="box-card">
+          <template #header>
+            <div class="card-header">
+              <span>Mqtt连接列表</span>
+               <el-button type="primary" @click="addlink">添加</el-button>
+            </div>
+
+          </template>
+          <el-table
+            @current-change="handleCurrentChange"   highlight-current-row
+            :data="tabledata"
+            ref="tableref"
+            border
+            style="width: 100%">
+            <el-table-column
+              prop="serverAddress"
+              label="连接地址">
+            </el-table-column>
+            <el-table-column
+              prop="account"
+              label="用户名"
+              width="100">
+            </el-table-column>
+            <el-table-column
+              prop="password"
+              label="密码"
+              width="100">
+            </el-table-column>
+
+            <el-table-column
+              prop="uuid"
+              label="客户端ID"
+              width="100">
+            </el-table-column>
+
+            <el-table-column
+              prop="status"
+              label="状态"
+              width="100">
+              <template #default="scope">
+                <span v-if="scope.row.status === 1">
+                  <el-tag type="success">启用</el-tag>
+                </span>
+                <span v-else>
+                  <el-tag type="danger">禁用</el-tag>
+                </span>
+              </template>
+            </el-table-column>
+            <el-table-column
+              prop="remark"
+              label="备注"
+              width="120"
+             >
+            </el-table-column>
+            <el-table-column
+              prop="name"
+              label="操作"
+              width="150">
+              <template #default="scope">
+
+                <el-button link @click="editlink(scope.row)">
+                  <el-tooltip effect="dark" content="编辑">
+                    <el-icon>
+                      <Edit />
+                    </el-icon>
+                  </el-tooltip>
+                </el-button>
+                <el-button link v-if="scope.row.status == 0" @click="doedit(scope.row,1)">
+                  <el-tooltip effect="dark" content="启用" >
+                    <el-icon>
+                      <VideoPlay />
+                    </el-icon>
+                  </el-tooltip>
+                </el-button>
+                <el-button link v-if="scope.row.status == 1"  @click="doedit(scope.row,0)" >
+                  <el-tooltip effect="dark" content="停止" >
+                    <el-icon>
+                      <VideoPause />
+                    </el-icon>
+                  </el-tooltip>
+                </el-button>
+                <el-popconfirm title="确定删除该连接?"  @confirm="dellink(scope.row)">
+                  <template #reference>
+                    <el-button link
+                    ><el-tooltip effect="dark" content="删除"
+                    ><el-icon><Delete /></el-icon></el-tooltip
+                    ></el-button>
+                  </template>
+                </el-popconfirm>
+              </template>
+            </el-table-column>
+          </el-table>
+
+
+        </el-card>
+      </el-col>
+      <el-col :span="8"  >
+        <el-card class="box-card">
+          <template #header>
+            <div class="card-header">
+              <span>主题列表</span>
+              <el-button type="primary" @click="addtopic">添加</el-button>
+            </div>
+
+
+          </template>
+          <el-table :data="topictable" border style="width: 100%">
+            <el-table-column
+              prop="name"
+              label="名称"
+            >
+            </el-table-column>
+            <el-table-column
+              prop="qos"
+              label="QOS"
+            >
+            </el-table-column>
+            <el-table-column
+              prop="status"
+              label="操作"
+            >
+              <template #default="scope">
+                <el-button link @click="edittopic(scope.row)">
+                  <el-tooltip effect="dark" content="编辑">
+                    <el-icon>
+                      <Edit />
+                    </el-icon>
+                  </el-tooltip>
+                </el-button>
+                <el-popconfirm title="确定删除该主题?"  @confirm="deltopic(scope.row)">
+                  <template #reference>
+                    <el-button link
+                    ><el-tooltip effect="dark" content="删除"
+                    ><el-icon><Delete /></el-icon></el-tooltip
+                    ></el-button>
+                  </template>
+                </el-popconfirm>
+              </template>
+            </el-table-column>
+
+          </el-table>
+
+        </el-card>
+      </el-col>
+
+    </el-row>
+    <el-dialog v-model="mqtteditshow" :title="`${showtype==2?'编辑':'添加'}MQTT连接`" width="30%" top="10%">
+      <el-descriptions column="1">
+        <el-descriptions-item >
+          <template #label>
+            <div style="display: inline-block;min-width: 100px;text-align: right;    vertical-align: top;">
+              连接地址
+            </div>
+          </template>
+          <div class="content-w" >
+            <el-input v-model="currentmqtt.serverAddress" placeholder="请输入" />
+          </div>
+        </el-descriptions-item>
+        <el-descriptions-item label="用户名">
+          <template #label>
+            <div style="display: inline-block;min-width: 100px;text-align: right;    vertical-align: top;">
+              用户名
+            </div>
+          </template>
+          <div class="content-w" >
+            <el-input v-model="currentmqtt.account" placeholder="请输入" />
+          </div>
+        </el-descriptions-item>
+        <el-descriptions-item label="密码">
+          <template #label>
+            <div style="display: inline-block;min-width: 100px;text-align: right;    vertical-align: top;">
+              密码
+            </div>
+          </template>
+          <div class="content-w" >
+            <el-input v-model="currentmqtt.password" placeholder="请输入" />
+          </div>
+        </el-descriptions-item>
+
+        <el-descriptions-item >
+          <template #label>
+            <div style="display: inline-block;min-width: 100px;text-align: right;    vertical-align: top;">
+              客户端ID
+            </div>
+          </template>
+          <div class="content-w" >
+            <el-input v-model="currentmqtt.uuid" placeholder="请输入" />
+            <el-button type="primary" link @click="randomuuid" style="margin-left: 10px">随机生成</el-button>
+          </div>
+        </el-descriptions-item>
+        <el-descriptions-item >
+          <template #label>
+            <div style="display: inline-block;min-width: 100px;text-align: right;    vertical-align: top;">
+              备注
+            </div>
+          </template>
+          <div class="content-w" >
+            <el-input type="textarea" v-model="currentmqtt.remark" placeholder="请输入" />
+          </div>
+        </el-descriptions-item>
+
+      </el-descriptions>
+      <div slot="footer" class="dialog-footer">
+        <el-button @click="mqtteditshow = false">取 消</el-button>
+        <el-button type="primary" @click="savelink">保 存</el-button>
+      </div>
+    </el-dialog>
+
+    <el-dialog v-model="topiceditshow" :title="`${topicshowtype==1?'添加':'编辑'}主题`" width="30%" top="10%">
+      <el-descriptions column="1">
+
+        <el-descriptions-item >
+          <template #label>
+            <div style="display: inline-block;min-width: 100px;text-align: right;    vertical-align: top;">
+              主题地址
+            </div>
+          </template>
+          <div class="content-w" >
+            <el-input v-model="currenttopic.name" placeholder="请输入" />
+          </div>
+        </el-descriptions-item>
+
+        <el-descriptions-item >
+          <template #label>
+            <div style="display: inline-block;min-width: 100px;text-align: right;    vertical-align: top;">
+              QOS
+            </div>
+          </template>
+          <div class="content-w" >
+            <el-select v-model="currenttopic.qos" placeholder="请选择">
+              <el-option label="0" value="0"></el-option>
+              <el-option label="1" value="1"></el-option>
+              <el-option label="2" value="2"></el-option>
+            </el-select>
+          </div>
+        </el-descriptions-item>
+
+      </el-descriptions>
+
+      <div slot="footer" class="dialog-footer">
+        <el-button @click="topiceditshow = false">取 消</el-button>
+        <el-button type="primary" @click="savetopic">保 存</el-button>
+      </div>
+    </el-dialog>
+
+  </div>
+
+</template>
+
+<script setup lang="ts" name="Units">
+import {onMounted, ref} from "vue";
+import {useRoute, useRouter} from "vue-router";
+import {listMqtt,delMqtt,addMqtt,updateMqtt} from "@/api/data/mqtt"
+import {ElMessage} from "element-plus";
+
+
+const route = useRoute();
+const router = useRouter();
+
+const mqtteditshow = ref(false);
+const tableref = ref();
+const tabledata = ref([])
+const currentmqtt = ref({})
+const showtype= ref(1)
+const topictable = ref([])
+const topiceditshow = ref(false);
+const topicshowtype = ref(1)
+
+
+const currenttopic = ref({
+  name:"",
+  qos:0
+})
+const lasttopic = ref({
+  name:"",
+  qos:0
+})
+const initdata = ()=>{
+  currentmqtt.value = {
+    serverAddress:"",
+    account:"",
+    password:"",
+    uuid:"",
+    status:0,
+    remark:"",
+  }
+}
+
+const getmqttlist = ()=>{
+  listMqtt({pageSize:10000}).then(res=>{
+      //@ts-ignore
+      tabledata.value = res.rows;
+      if(currentmqtt.value.id!=undefined && currentmqtt.value.id!=null){
+        tableref.value.setCurrentRow(currentmqtt);
+      }else{
+        tableref.value.setCurrentRow(tabledata.value[0]);
+      }
+  })
+}
+
+
+onMounted(()=>{
+  initdata();
+
+  getmqttlist();
+})
+
+const randomuuid = ()=>{
+  currentmqtt.value.uuid = "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g, function(c) {
+    var r = Math.random() * 16 | 0, v = c == "x"? r : (r & 0x3 | 0x8);
+    return v.toString(16);
+  });
+}
+
+const addlink = ()=>{
+  initdata();
+   mqtteditshow.value = true;
+}
+
+const edittopic = (item)=>{
+    topiceditshow.value = true;
+    topicshowtype.value = 2;
+    currenttopic.value = item;
+    lasttopic.value = item;
+}
+const deltopic = (item)=>{
+  topictable.value = topictable.value.filter(v=>v.name!=item.name);
+  currentmqtt.value.serverTopic = JSON.stringify(topictable.value);
+  updateMqtt(currentmqtt.value).then(res=>{
+    ElMessage({
+      type:'success',
+      message: '修改成功',
+    });
+    getmqttlist();
+  })
+}
+const addtopic = ()=>{
+  topiceditshow.value = true;
+  topicshowtype.value = 1;
+  currenttopic.value = {
+    name:"",
+    qos:0
+  };
+}
+
+
+const savetopic = ()=>{
+
+  let list = topictable.value.filter(v=>v.name==currenttopic.value.name && v.qos==currenttopic.value.qos);
+  if(list.length>0){
+    ElMessage({
+      type:'error',
+      message: '存在相同的topic',
+    });
+    return;
+  }
+
+
+
+  if(topicshowtype.value==1){
+    topictable.value.push(currenttopic.value);
+    topiceditshow.value = false;
+  }else{
+
+    topictable.value.push(currenttopic.value);
+    topictable.value = topictable.value.filter(v=>v.name!=lasttopic.value.name);
+  }
+  currentmqtt.value.serverTopic = JSON.stringify(topictable.value);
+  topiceditshow.value = false;
+  updateMqtt(currentmqtt.value).then(res=>{
+    ElMessage({
+      type:'success',
+      message: '修改成功',
+    });
+    getmqttlist();
+  })
+}
+
+const doedit = (item,status)=>{
+   currentmqtt.value = item;
+   currentmqtt.value.status = status;
+   updateMqtt(currentmqtt.value).then(res=>{
+     ElMessage({
+       type:'success',
+       message: '成功',
+     });
+     getmqttlist();
+   });
+}
+
+const handleCurrentChange = (row)=>{
+  currentmqtt.value = row;
+  //获取topic
+  topictable.value = currentmqtt.value && currentmqtt.value.serverTopic!=undefined && currentmqtt.value.serverTopic!="" ? JSON.parse(currentmqtt.value.serverTopic) : [];
+
+}
+const dellink = (item)=>{
+  delMqtt(item.id).then(res=>{
+    getmqttlist();
+    ElMessage({
+      type:'success',
+      message: '删除成功',
+    });
+  })
+}
+
+const savelink = ()=>{
+  if(currentmqtt.value.id==undefined||currentmqtt.value.id==null){
+    addMqtt(currentmqtt.value).then(res=>{
+      getmqttlist();
+      mqtteditshow.value = false;
+      ElMessage({
+        type:'success',
+        message: '保存成功',
+      });
+    })
+  }else{
+    updateMqtt(currentmqtt.value).then(res=>{
+      getmqttlist();
+      mqtteditshow.value = false;
+      ElMessage({
+        type:'success',
+        message: '修改成功',
+      });
+    })
+  }
+}
+
+const editlink = (item)=>{
+  mqtteditshow.value = true;
+  currentmqtt.value = item;
+}
+
+
+</script>
+
+<style lang="scss" scoped>
+.card-header {
+  display: flex;
+  flex-direction: row;
+  justify-content: space-between;
+}
+.content-w {
+  display: inline-flex;
+  width: 300px;
+}
+.dialog-footer{
+  text-align: right;
+  padding-top: 30px;
+}
+</style>

+ 76 - 11
ruoyi-ui-vue3/src/views/rules/index.vue

@@ -32,7 +32,7 @@
           <div>
             <el-button type="primary" @click="goadd">添加</el-button>
             <el-button type="danger">批量删除</el-button>
-            <el-button type="primary" plain>显示字段</el-button>
+            <el-button type="primary" plain @click="ziduanshow=true">显示字段</el-button>
           </div>
         </div>
       </template>
@@ -41,14 +41,44 @@
           <el-col :span="24">
             <el-table :data="tabledata" border>
               <el-table-column type="selection" width="55" />
-              <el-table-column label="规则编号"></el-table-column>
-              <el-table-column label="规则名称"></el-table-column>
-              <el-table-column label="触发类型"></el-table-column>
-              <el-table-column label="设备"></el-table-column>
-              <el-table-column label="传感器"></el-table-column>
-              <el-table-column label="触发条件值"></el-table-column>
-              <el-table-column label="描述"></el-table-column>
-              <el-table-column label="操作"></el-table-column>
+              <el-table-column v-for="item in cloumdata.filter(i=>i.visible)" :prop="item.prop" :label="item.label" ></el-table-column>
+              <el-table-column prop="sn" label="操作">
+                <template #default="scope">
+                  <div>
+                    <el-button
+                      link
+                      @click="
+                    "
+                    >
+                      <el-tooltip effect="dark" content="编辑">
+                        <el-icon>
+                          <Memo />
+                        </el-icon>
+                      </el-tooltip>
+                    </el-button>
+                    <el-button
+                      link
+                      @click="
+                    "
+                    >
+                      <el-tooltip effect="dark" content="编辑">
+                        <el-icon>
+                          <Edit />
+                        </el-icon>
+                      </el-tooltip>
+                    </el-button>
+                    <el-popconfirm title="确定删除该编码?" @confirm="">
+                      <template #reference>
+                        <el-button link
+                        ><el-tooltip effect="dark" content="删除"
+                        ><el-icon><Delete /></el-icon></el-tooltip
+                        ></el-button>
+                      </template>
+                    </el-popconfirm>
+                  </div>
+                </template>
+
+              </el-table-column>
 
             </el-table>
           </el-col>
@@ -73,26 +103,61 @@
     </el-card>
 
 
+    <el-dialog
+      title="字段显示"
+      v-model="ziduanshow"
+      width="50%"
+      @close="ziduanshow = false"
+    >
+      <div style="display: flex;flex-wrap: wrap;align-content: center;justify-content: center;align-items: center;">
+        <el-checkbox v-for="item in cloumdata" v-model="item.visible" :label="item.label" size="large" />
+      </div>
+
+    </el-dialog>
+
   </div>
 </template>
 
 <script setup lang="ts" name="Units">
-import {ref} from "vue";
+import {onMounted, ref} from "vue";
 import {useRoute, useRouter} from "vue-router";
+import { listRule,addRule,updateRule,delRule,getRule } from "@/api/data/rule"
+
 import data from "@/views/system/dict/data.vue";
 
+const ziduanshow = ref(false);
+const cloumdata = ref([
+  {label: '规则编号', prop:'sn',visible:true},
+  {label: '规则名称', prop:'name',visible:true},
+  {label: '触发类型', prop:'type',visible:true},
+  {label: '设备', prop:'equipmentId',visible:true},
+  {label: '传感器', prop:'sensorId',visible:true},
+  {label: '触发条件值', prop:'triggeringCondition',visible:true},
+  {label: '描述', prop:'description',visible:true},
+]);
 
 const route = useRoute();
 const router = useRouter();
 
 const searchform = ref({rulename:""})
-const tabledata = ref([1,2,3])
+const tabledata = ref([])
 
 const goadd = ()=>{
   router.push("/rules/add")
 }
 
 
+const getalldata=()=>{
+  listRule({}).then(res=>{
+    tabledata.value=res.rows
+  })
+}
+
+onMounted(()=>{
+  getalldata()
+})
+
+
 
 </script>
 

+ 61 - 34
ruoyi-ui-vue3/src/views/system/devicecode/index.vue

@@ -8,8 +8,7 @@
           <el-button
             type="primary"
             @click="
-              detailshow = true;
-              edittype = 1;
+              doedit(null,1)
             "
             >添加</el-button
           >
@@ -19,19 +18,18 @@
 
         <el-col :span="24" style="padding-left: 10px">
           <el-table :data="dwtabledata" :border="true" :height="gettbheight()">
-            <el-table-column label="名称"></el-table-column>
-            <el-table-column label="设备"></el-table-column>
-            <el-table-column label="编码前缀"></el-table-column>
-            <el-table-column label="编码序号规则"></el-table-column>
-            <el-table-column label="备注"></el-table-column>
+            <el-table-column prop="name" label="名称"></el-table-column>
+            <el-table-column prop="equipmentInfoId" label="设备"></el-table-column>
+            <el-table-column prop="prefix" label="编码前缀"></el-table-column>
+            <el-table-column prop="serialNumRule" label="编码序号规则"></el-table-column>
+            <el-table-column prop="remark" label="备注"></el-table-column>
             <el-table-column label="操作">
               <template #default="scope">
                 <div>
                   <el-button
                     link
                     @click="
-                      detailshow = true;
-                      edittype = 2;
+                      doedit(scope.row,2)
                     "
                   >
                     <el-tooltip effect="dark" content="编辑">
@@ -40,7 +38,7 @@
                       </el-icon>
                     </el-tooltip>
                   </el-button>
-                  <el-popconfirm title="确定删除该编码?">
+                  <el-popconfirm title="确定删除该编码?" @confirm="deleterow(scope.row)">
                     <template #reference>
                       <el-button link
                         ><el-tooltip effect="dark" content="删除"
@@ -65,16 +63,16 @@
           <el-input v-model="dwform.name"  :disabled="edittype==3"/>
         </el-form-item>
         <el-form-item label="设备">
-          <el-input v-model="dwform.name"  :disabled="edittype==3"/>
+          <el-input v-model="dwform.equipmentInfoId"  :disabled="edittype==3"/>
         </el-form-item>
          <el-form-item label="编码前缀">
-          <el-input v-model="dwform.name"  :disabled="edittype==3"/>
+          <el-input v-model="dwform.prefix"  :disabled="edittype==3"/>
         </el-form-item>
          <el-form-item label="编码序号规则">
-          <el-input v-model="dwform.name"  :disabled="edittype==3"/>
+          <el-input v-model="dwform.serialNumRule"  :disabled="edittype==3"/>
         </el-form-item>
         <el-form-item label="备注">
-          <el-input type="textarea" v-model="dwform.name" :disabled="edittype==3"/>
+          <el-input type="textarea" v-model="dwform.remark" :disabled="edittype==3"/>
         </el-form-item>
       </el-form>
       <template #footer>
@@ -89,40 +87,69 @@
 
 <script setup lang="ts" name="Units">
 import { ref } from "vue";
+import { listEquipmentCode,addEquipmentCode,delEquipmentCode,updateEquipmentCode } from '@/api/data/equipmentcode.js'
+import {ElMessage} from "element-plus";
 
-const dwtypetabledata = ref([]);
-const dwtabledata = ref([1,1,1,1,1,1]);
+const dwtabledata = ref([]);
 
 const edittype = ref(1);
 const detailshow = ref(false);
 
-const dwform = ref({
-  id: 0,
-  name: "",
-  unitSymbol: "",
-  unitName: "",
-  isStandard: "",
-  unitType: "",
-  toStandardRatio: 0,
-  toOffset: 0,
-  remark: "",
-  creator: "",
-  ctime: "",
-  modifier: "",
-  utime: "",
-});
+const dwform = ref({});
+
+const initdata = ()=>{
+  dwform.value = {
+    "name": "",
+    "equipmentInfoId": "",
+    "prefix": "",
+    "serialNumRule": "",
+    "remark": ""
+  }
+}
+initdata();
+const getalldata = ()=>{
+  listEquipmentCode({}).then((res) => {
+    dwtabledata.value = res.data;
+  });
+}
+getalldata();
+
+const doedit = (item,type) => {
+  edittype.value = 2;
+  dwform.value = item;
+  if(type==1){
+    initdata();
+  }
+  detailshow.value = true;
+};
 
-const gettbheight = () => {
 
+const gettbheight = () => {
   return window.innerHeight - 200;
 }
 
 const dosavedw = () => {
-
+  if(dwform.value["id"]!=undefined&&dwform.value["id"]!=null){
+    updateEquipmentCode(dwform.value).then((res) => {
+      ElMessage.success("保存成功")
+      getalldata();
+    });
+  }else{
+    addEquipmentCode(dwform.value).then((res) => {
+      ElMessage.success("保存成功")
+      getalldata();
+    })
+  }
   detailshow.value = false;
-
 };
 
+const  deleterow = (item) =>{
+  delEquipmentCode(item.id).then(res=>{
+    ElMessage.success("删除成功")
+    getalldata();
+  })
+}
+
 </script>
 
 <style lang="scss" scoped>

+ 59 - 27
ruoyi-ui-vue3/src/views/system/devicetag/index.vue

@@ -8,8 +8,7 @@
           <el-button
             type="primary"
             @click="
-              detailshow = true;
-              edittype = 1;
+                doedit(null,1)
             "
             >添加</el-button
           >
@@ -19,17 +18,16 @@
 
         <el-col :span="24" style="padding-left: 10px">
           <el-table :data="dwtabledata" :border="true" :height="gettbheight()">
-            <el-table-column label="编码"></el-table-column>
-            <el-table-column label="名称"></el-table-column>
-            <el-table-column label="备注"></el-table-column>
+            <el-table-column prop="sn" label="编码"></el-table-column>
+            <el-table-column prop="name" label="名称"></el-table-column>
+            <el-table-column prop="remark" label="备注"></el-table-column>
             <el-table-column label="操作">
               <template #default="scope">
                 <div>
                   <el-button
                     link
                     @click="
-                      detailshow = true;
-                      edittype = 2;
+                     doedit(scope.row,2)
                     "
                   >
                     <el-tooltip effect="dark" content="编辑">
@@ -38,7 +36,7 @@
                       </el-icon>
                     </el-tooltip>
                   </el-button>
-                  <el-popconfirm title="确定删除该标签?">
+                  <el-popconfirm title="确定删除该记录?" @confirm="deleterow(scope.row)">
                     <template #reference>
                       <el-button link
                         ><el-tooltip effect="dark" content="删除"
@@ -60,13 +58,13 @@
     >
       <el-form  :model="dwform" label-width="120px">
         <el-form-item label="编码">
-          <el-input v-model="dwform.name"  :disabled="edittype==3"/>
+          <el-input v-model="dwform.sn"  :disabled="edittype==3"/>
         </el-form-item>
         <el-form-item label="名称">
           <el-input v-model="dwform.name"  :disabled="edittype==3"/>
         </el-form-item>
         <el-form-item label="备注">
-          <el-input type="textarea" v-model="dwform.name" :disabled="edittype==3"/>
+          <el-input type="textarea" v-model="dwform.remark" :disabled="edittype==3"/>
         </el-form-item>
       </el-form>
       <template #footer>
@@ -81,40 +79,74 @@
 
 <script setup lang="ts" name="Units">
 import { ref } from "vue";
+import { listEquipmentTag,addEquipmentTag,updateEquipmentTag,delEquipmentTag } from '@/api/data/equipmenttag.js'
+import {ElMessage} from "element-plus";
+
 
-const dwtypetabledata = ref([]);
-const dwtabledata = ref([1,1,1,1,1,1]);
+const dwtabledata = ref([]);
 
 const edittype = ref(1);
 const detailshow = ref(false);
 
 const dwform = ref({
-  id: 0,
-  name: "",
-  unitSymbol: "",
-  unitName: "",
-  isStandard: "",
-  unitType: "",
-  toStandardRatio: 0,
-  toOffset: 0,
-  remark: "",
-  creator: "",
-  ctime: "",
-  modifier: "",
-  utime: "",
+  "sn": "",
+  "name": "",
+  "remark": ""
 });
+const initdata = ()=>{
+  dwform.value = ({
+    "sn": "",
+    "name": "",
+    "remark": ""
+  })
+}
+initdata();
+const doedit = (item,type) => {
+  edittype.value = 2;
+  dwform.value = item;
+  if(type==1){
+    initdata();
+  }
+  detailshow.value = true;
+};
 
 const gettbheight = () => {
-
   return window.innerHeight - 200;
 }
 
 const dosavedw = () => {
-
+  if(dwform.value["id"]!=undefined&&dwform.value["id"]!=null){
+    updateEquipmentTag(dwform.value).then((res) => {
+      ElMessage.success("保存成功")
+      getalldata();
+    });
+  }else{
+    addEquipmentTag(dwform.value).then((res) => {
+      ElMessage.success("保存成功")
+      getalldata();
+    })
+  }
   detailshow.value = false;
 
 };
 
+const  deleterow = (item) =>{
+   delEquipmentTag(item.id).then(res=>{
+     ElMessage.success("删除成功")
+     getalldata();
+   })
+}
+
+const getalldata = ()=>{
+  listEquipmentTag({}).then((res) => {
+    dwtabledata.value = res.data;
+  });
+
+}
+
+getalldata();
+
+
 </script>
 
 <style lang="scss" scoped>

+ 31 - 3
ruoyi-ui-vue3/src/views/system/units/index.vue

@@ -47,7 +47,7 @@
                       </el-icon>
                     </el-tooltip>
                   </el-button>
-                  <el-popconfirm title="确定删除该单位?">
+                  <el-popconfirm title="确定删除该单位?" @confirm="deleterow(scope.row)">
                     <template #reference>
                       <el-button link
                         ><el-tooltip effect="dark" content="删除"
@@ -67,7 +67,7 @@
       :title="`${edittype == 1 ? '新增' : edittype == 2 ? '编辑' : '查看'}单位`"
       v-model="detailshow"
     >
-      <el-form :inline="true" :model="dwform" label-width="120px">
+      <el-form :inline="true" :model="dwform" label-width="120px" class="showdialog">
         <el-form-item label="名称">
           <el-input v-model="dwform.name"  :disabled="edittype==3"/>
         </el-form-item>
@@ -81,7 +81,15 @@
           <el-input v-model="dwform.isStandard" :disabled="edittype==3"/>
         </el-form-item>
         <el-form-item label="单位分类">
-          <el-input v-model="dwform.unitType" :disabled="edittype==3"/>
+          <el-select-v2
+            v-model="dwform.unitType"
+            :options="typeoptions"
+            placeholder="请输入"
+            allow-create
+            style="width: 100%"
+            filterable
+            clearable
+          />
         </el-form-item>
         <el-form-item label="换算比例">
           <el-input v-model="dwform.toStandardRatio" type="number" :disabled="edittype==3"/>
@@ -115,6 +123,7 @@ const detailshow = ref(false);
 
 const dwtypetable =ref();
 
+const typeoptions = ref([]);
 const dwform = ref({});
 const doinint =()=>{
   dwform.value = {
@@ -148,6 +157,13 @@ const gettbheight = () => {
   return window.innerHeight - 200;
 }
 
+const  deleterow = (item) =>{
+  delUnit(item.id).then(res=>{
+    ElMessage.success('删除成功');
+    getalldata();
+  })
+}
+
 const alldata = ref([]);
 const getalldata = () => {
   listUnit({}).then(res=>{
@@ -155,6 +171,8 @@ const getalldata = () => {
     dwtabledata.value = res["data"];
     dwtypetabledata.value = (["全部"].concat(_.uniq(res.data.map(item=>item.unitType)))).map(i=> {return {"name":i};});
     dwtypetable.value.setCurrentRow(dwtypetabledata.value[0]);
+
+    typeoptions.value = _.uniq(res.data.map(item=>item.unitType)).map(i=>({value:i,label:i}))
   })
 };
 
@@ -191,6 +209,14 @@ onMounted(()=>{
 
 
 </script>
+<style lang="scss">
+.showdialog{
+  .el-form-item__content {
+    width: 180px !important;
+  }
+}
+
+</style>
 
 <style lang="scss" scoped>
 .card-header {
@@ -198,4 +224,6 @@ onMounted(()=>{
   flex-direction: row;
   justify-content: space-between;
 }
+
+
 </style>