Bladeren bron

地块管理的基础功能,设备监控管理除查看按钮的基础功能。

zmj 11 maanden geleden
bovenliggende
commit
6137cb0f45

+ 2 - 2
.env.development

@@ -1,10 +1,10 @@
 # 页面标题
-VUE_APP_TITLE = 若依管理系统
+VUE_APP_TITLE = 爱智农智慧农业平台
 
 # 开发环境配置
 ENV = 'development'
 
-# 若依管理系统/开发环境
+# 爱智农智慧农业平台/开发环境
 VUE_APP_BASE_API = '/dev-api'
 
 # 路由懒加载

+ 2 - 2
.env.production

@@ -1,8 +1,8 @@
 # 页面标题
-VUE_APP_TITLE = 若依管理系统
+VUE_APP_TITLE = 爱智农智慧农业平台
 
 # 生产环境配置
 ENV = 'production'
 
-# 若依管理系统/生产环境
+# 爱智农智慧农业平台/生产环境
 VUE_APP_BASE_API = '/prod-api'

+ 2 - 2
.env.staging

@@ -1,5 +1,5 @@
 # 页面标题
-VUE_APP_TITLE = 若依管理系统
+VUE_APP_TITLE = 爱智农智慧农业平台
 
 BABEL_ENV = production
 
@@ -8,5 +8,5 @@ NODE_ENV = production
 # 测试环境配置
 ENV = 'staging'
 
-# 若依管理系统/测试环境
+# 爱智农智慧农业平台/测试环境
 VUE_APP_BASE_API = '/stage-api'

+ 4 - 2
package.json

@@ -1,7 +1,7 @@
 {
   "name": "ruoyi",
   "version": "3.6.5",
-  "description": "若依管理系统",
+  "description": "爱智农智慧农业平台",
   "author": "若依",
   "license": "MIT",
   "scripts": {
@@ -36,11 +36,12 @@
     "url": "https://gitee.com/y_project/RuoYi-Cloud.git"
   },
   "dependencies": {
+    "@amap/amap-jsapi-loader": "^1.0.1",
     "@riophae/vue-treeselect": "0.4.0",
     "axios": "0.28.1",
     "clipboard": "2.0.8",
     "core-js": "3.37.1",
-    "echarts": "5.4.0",
+    "echarts": "^5.4.0",
     "element-ui": "2.15.14",
     "file-saver": "2.0.5",
     "fuse.js": "6.4.3",
@@ -54,6 +55,7 @@
     "sortablejs": "1.10.2",
     "splitpanes": "2.4.1",
     "vue": "2.6.12",
+    "vue-amap": "^0.5.10",
     "vue-count-to": "1.0.13",
     "vue-cropper": "0.5.5",
     "vue-meta": "2.4.0",

+ 46 - 0
src/api/base/device.js

@@ -0,0 +1,46 @@
+import request from '@/utils/request'
+
+// 查询设备列表
+export function listDevice(query) {
+  return request({
+    url: '/base/device/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询设备详细
+export function getDevice(id) {
+  return request({
+    url: '/base/device/' + id,
+    method: 'get'
+  })
+}
+
+// 新增设备
+export function addDevice(data) {
+  return request({
+    url: '/base/device',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改设备
+export function updateDevice(data) {
+  return request({
+    url: '/base/device',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除设备
+export function delDevice(id) {
+  return request({
+    url: '/base/device/' + id,
+    method: 'delete'
+  })
+}
+
+

+ 123 - 0
src/api/base/field.js

@@ -0,0 +1,123 @@
+import request from '@/utils/request'
+
+// 查询地块信息列表
+export function listField(query) {
+  return request({
+    url: '/base/field/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询地块信息详细
+export function getField(id) {
+  return request({
+    url: '/base/field/' + id,
+    method: 'get'
+  })
+}
+
+
+// 查询地块设备绑定信息
+export function getDeviceField(id) {
+  return request({
+    url: '/base/field/device/' + id,
+    method: 'get'
+  })
+}
+
+// 查询地块设备未绑定信息
+export function getDeviceUnField(id) {
+  return request({
+    url: '/base/field/unDevice/' + id,
+    method: 'get'
+  })
+}
+
+// 查询地块人员未绑定信息
+export function getDeviceUnUser(id) {
+  return request({
+    url: '/base/field/unUser/' + id,
+    method: 'get'
+  })
+}
+
+// 查询地块设备绑定信息
+export function getUserField(id) {
+  return request({
+    url: '/base/field/person/' + id,
+    method: 'get'
+  })
+}
+
+
+// 新增地块信息
+export function addField(data) {
+  return request({
+    url: '/base/field',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改地块信息
+export function updateField(data) {
+  return request({
+    url: '/base/field',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除地块信息
+export function delField(id) {
+  return request({
+    url: '/base/field/' + id,
+    method: 'delete'
+  })
+}
+
+// 绑定地块设备信息
+export function bindFieldDevice(id) {
+  return request({
+    url: '/base/field/bindFieldDevice/' + id,
+    method: 'put'
+  })
+}
+
+// 绑定地块人员信息
+export function bindFieldUser(id) {
+  return request({
+    url: '/base/field/bindFieldPerson/' + id,
+    method: 'put'
+  })
+}
+
+
+
+// 解绑地块设备信息
+export function unbindFieldDevice(id) {
+  return request({
+    url: '/base/field/unbindFieldDevice/' + id,
+    method: 'put'
+  })
+}
+
+
+// 解绑地块人员信息
+export function unbindFieldUser(id) {
+  return request({
+    url: '/base/field/unbindFieldPerson/' + id,
+    method: 'put'
+  })
+}
+
+
+// 查询地块列表
+export function listFieldName(query) {
+  return request({
+    url: '/base/field/listName',
+    method: 'get',
+    params: query
+  })
+}

+ 11 - 0
src/api/base/sensor.js

@@ -0,0 +1,11 @@
+import request from '@/utils/request'
+
+
+
+// 查询设备详细
+export function getInfoLatestTime(deviceId) {
+  return request({
+    url: '/base/sensor/LatestTime/' + deviceId,
+    method: 'get'
+  })
+}

+ 293 - 0
src/components/Map/index.vue

@@ -0,0 +1,293 @@
+<template>
+ <div >
+   <!-- <el-row>
+
+     <Button @click="drawFence">添加区域</Button>
+     <Button @click="drawFence">清除区域</Button>
+     <Button @click="saveRectangle">保存区域</Button>
+   </el-row> -->
+
+   <el-row style="height: 1300px;width: 100%;">
+     <el-amap class="amap-box" vid="map"
+              :zoom="zoom"
+              :center="center"
+              :amap-manager="amapManager"
+              :events="events"
+     >
+       <el-amap-marker v-for="(u,i) in markers" :position="u.position" :key="i" :icon="icon">
+       </el-amap-marker>
+
+     </el-amap>
+   </el-row>
+    <el-row type="flex" justify="end" class="m_tools">
+      <el-col  style="width:auto;">
+        <el-button-group size="small">
+          <el-button type="default" title="绘制围栏" size="small"   v-if="tools_show.place_show" v-show="!tools_show.oc_show" icon="el-icon-edit" @click="drawFence"></el-button>
+          <el-button type="default" title="保存围栏" size="small"  v-if="tools_show.place_show" v-show="!tools_show.oc_show" icon="el-icon-check" @click="saveRectangle" ></el-button>
+          <el-button type="default" title="清除" size="small"v-if="tools_show.place_show" v-show="!tools_show.oc_show" icon="el-icon-delete" @click="delemap"></el-button>
+          <el-button type="default" title="展开/收起" size="small" v-if="tools_show.openclose_show" :icon="tools_show.oc_show?'el-icon-d-arrow-left':'el-icon-d-arrow-right'" @click="tools_show.oc_show=!tools_show.oc_show"></el-button>
+        </el-button-group>
+      </el-col>
+
+    </el-row>
+
+  </div>
+
+
+</template>
+
+<script>
+import VueAMap from 'vue-amap'
+
+let amapManager = new VueAMap.AMapManager()
+window._AMapSecurityConfig = {
+  securityJsCode: 'b672db78212bb58899d609f0ce9f2d97'
+}
+
+export default {
+  name: "Map",
+  data() {
+    return {
+      // 地图对象
+      amapManager,
+      zoom: 12,
+      center: [116.404269,39.916042],
+      position: [121.5273285, 31.21515044],
+      events: {
+        init (o) {
+
+        }
+      },
+
+      icon: new AMap.Icon({
+        image: "https://webapi.amap.com/theme/v1.3/markers/n/mark_b.png"
+      }),
+      searchOption: {
+        city: '北京',
+        citylimit: false
+      },
+      fenceForm:{
+        coordinate:[]
+      },
+      rectangle:null,
+      mouseTool: null,
+      overlays: [],
+      map: null,
+      markers: [//标记点位置
+        
+      ],
+      formData: {
+        carId: '',
+        pageNum: 1,//当前页
+        pageSize: 10,//页长
+        pageTotal: 0,//总数
+      },
+      map: null,
+      path: [],//以前绘制的数据
+      paths: [], // 当前绘制的多边形经纬度数组
+      polygonItems: [], // 地图上绘制的所有多边形对象
+      polyEditors: [],// 新增数据=>所有编辑对象数组
+      polyEditorsBefore: [],// 以前历史数据=>进入编辑对象数组
+
+      // 总条数
+      tools_show: {
+        place_show:true,
+        openclose_show:true,
+        oc_show:false
+      },
+
+      // 查询参数
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        fenceName: null,
+        deptId: null,
+      },
+      // 表单参数
+      form: {}
+    };
+  },
+  watch: {
+
+  },
+  mounted() {
+    //DOM初始化完成进行地图初始化
+    //this.initAMap()
+  },
+  methods: {
+    // 绘制多边形
+    drawFence() {
+      let _this = this
+      this.map = this.amapManager.getMap()
+      let map = this.amapManager.getMap()
+      /* if(this.fenceForm.coordinate.length >0){
+         this.$Message.warning("围栏已存在!")
+         return
+       }*/
+      if(this.rectangle){
+        map.remove(this.rectangle)
+      }
+      map.plugin(['AMap.MouseTool'], function () {
+        let mouseTool = new AMap.MouseTool(map)
+        _this.mouseTool = mouseTool
+        //添加事件
+        /*mouseTool.rectangle()
+        AMap.event.addListener(mouseTool, 'draw', function (e) {
+          _this.fenceForm.coordinate = []
+          let path = e.obj.getPath()
+          path.forEach(e=>{
+            _this.fenceForm.coordinate.push([e.getLng(),e.getLat()])
+          })
+          mouseTool.close(false)
+        })*/
+        const polygon = mouseTool.polygon({
+          //polygon:绘制多边形【线段:polyline;矩形:rectangle;圆:circle】
+          strokeColor: 'red',
+          strokeOpacity: 0.4,
+          strokeWeight: 2,//线宽
+          fillColor: '#1791fc', //填充色
+          fillOpacity: 0.2,//填充透明度
+          // strokeStyle还支持 solid
+          strokeStyle: 'solid',
+          // strokeDasharray: [30,10],
+        });
+        mouseTool.on('draw', function (event) {
+          // event.obj 为绘制出来的覆盖物对象
+          let polygonItem = event.obj;
+          let paths = polygonItem.getPath();//取得绘制的多边形的每一个点坐标
+          // console.log('覆盖物对象绘制完成各个点的坐标', paths, event);
+
+          let path_in = [];  // 编辑的路径
+          paths.forEach(v => {
+            path_in.push([v.lng, v.lat])
+            _this.fenceForm.coordinate.push([v.lng, v.lat])
+          });
+          _this.paths = path_in //将新增数据放入paths数组里
+          _this.path = path_in //将新增数据放入paths数组里
+
+          //this.editRectangle();//绘制完成,默认进入编辑状态
+          var polygonItems=[];
+           polygonItems .push(event.obj);
+          //this.map.remove(event.obj); // 删除多边形
+           console.log(_this.paths, '------polygon-----');
+        });
+      })
+    },
+    // 编辑围栏
+    editRectangle() {
+      const path = this.paths;
+      //新增的进入编辑状态
+      let polygon = new AMap.Polygon({
+        path: path,
+        strokeColor: "#FF33FF",
+        strokeWeight: 6,
+        strokeOpacity: 0.2,
+        fillOpacity: 0.2,
+        fillColor: '#1791fc',
+        zIndex: 50,
+      });
+      this.map.add(polygon);
+      this.polygonItem.push(polygon);
+      // 缩放地图到合适的视野级别
+      this.map.setFitView([polygon]);
+
+      this.polyEditor = new AMap.PolyEditor(this.map, polygon);
+      this.polyEditor.open();
+      this.polyEditors.push(this.polyEditor);
+
+      //历史围栏的进入编辑状态
+      let polygonBefore = new AMap.Polygon({
+        path: this.path,
+        strokeColor: "#FF33FF",
+        strokeWeight: 6,
+        strokeOpacity: 0.2,
+        fillOpacity: 0.2,
+        fillColor: '#1791fc',
+        zIndex: 50,
+      });
+      this.map.add(polygonBefore);
+      this.polygonItem.push(polygonBefore);
+      // 缩放地图到合适的视野级别
+      this.map.setFitView([polygonBefore]);
+
+      this.polyEditorBefore = new AMap.PolyEditor(this.map, polygonBefore);
+      this.polyEditorBefore.open();
+      this.polyEditorsBefore.push(this.polyEditorBefore);
+
+      // this.polyEditor.on('addnode', function (event) {
+      //     console.info('触发事件:addnode', event)
+      //     console.info('修改后的经纬度:', polygon.getPath())
+      // });
+
+      // this.polyEditor.on('adjust', function (event) {
+      //     console.info('触发事件:adjust', event)
+      //     console.info('修改后的经纬度:', polygon.getPath())
+      // });
+
+      // this.polyEditor.on('removenode', function (event) {
+      //     console.info('触发事件:removenode', event)
+      //     console.info('修改后的经纬度:', polygon.getPath())
+      // });
+
+      // this.polyEditor.on('end', function (event) {
+      //     console.info('触发事件: end', event)
+      //     console.info('end修改后的经纬度:', polygon.getPath())
+      //     // event.target 即为编辑后的多边形对象
+      // });
+    },
+    // 取消编辑状态
+    cancelRectangle() {
+      this.polyEditors.forEach(item => { item.close(); });//新增
+      this.polyEditorsBefore.forEach(item => { item.close(); });//历史
+    },
+    //保存围栏
+    saveRectangle() {
+      console.log(this.path,'---save----');
+      //保存更新围栏经纬度
+      let polygon="";
+      var polygon_start="POLYGON((";
+        this.path.forEach(v => {
+          polygon=polygon+v[0]+" "+v[1]+",";
+        });
+
+      let result = polygon_start+polygon.slice(0, polygon.length - 1)+","+polygon.split(",")[0]+"))";
+      let id = this.$route.params.fenceId
+      let fencePolygon={fenceId:id,fencePolygon:result};
+      
+
+    },
+    // 删除围栏
+    deleRectangle() {
+      this.map.clearMap(); // 删除地图所有覆盖物
+      //删除=>成功(重新刷新页面)
+    },
+    delemap() {
+      this.map.clearMap(); // 删除地图所有覆盖物
+    },
+
+  }
+};
+</script>
+
+<style lang="scss" scoped>
+  ::v-deep .amap-logo {
+    display: none;
+    opacity: 0 !important;
+  }
+  ::v-deep .amap-copyright {
+    opacity: 0;
+  }
+</style>
+<style lang="scss" scoped>
+  .m_tools {
+    position: absolute;
+    z-index: 999;
+    // left: 550px;
+    // top: 120px;
+    left: 85%;
+    top: 1px;
+    width: auto;
+    color: #409eff;
+    overflow: hidden;
+  }
+</style>

+ 2 - 2
src/layout/components/AppMain.vue

@@ -1,10 +1,10 @@
 <template>
   <section class="app-main">
-    <transition name="fade-transform" mode="out-in">
+    <!-- <transition name="fade-transform" type="animation"> -->
       <keep-alive :include="cachedViews">
         <router-view v-if="!$route.meta.link" :key="key" />
       </keep-alive>
-    </transition>
+    <!-- </transition> -->
     <iframe-toggle />
   </section>
 </template>

+ 25 - 1
src/main.js

@@ -38,6 +38,30 @@ import VueMeta from 'vue-meta'
 // 字典数据组件
 import DictData from '@/components/DictData'
 
+// 地图组件
+import VueAMap from 'vue-amap';
+Vue.use(VueAMap)
+VueAMap.initAMapApiLoader({
+  key: 'bee95ab1796ad6803492c1bf9da311ab',
+  plugin: [
+    'AMap.Autocomplete', // 输入提示插件
+    'AMap.PlaceSearch', // POI搜索插件
+    'AMap.Scale', // 右下角缩略图插件 比例尺
+    'AMap.OverView', // 地图鹰眼插件
+    'AMap.ToolBar', // 地图工具条
+    'AMap.MapType', // 类别切换控件,实现默认图层与卫星图、实施交通图层之间切换的控制
+    'AMap.PolyEditor', // 编辑 折线、多边形
+    'AMap.CircleEditor', // 圆形编辑器插件
+    'MarkerClusterer', // 点聚合
+    'AMap.Geolocation', // 定位控件,用来获取和展示用户主机所在的经纬度位置,
+    'AMap.DistrictSearch',
+    'AMap.MouseTool',
+    'Geocoder'
+  ],
+  v: '1.4.15', // 默认高德 sdk 版本为 1.4.4
+  uiVersion: '1.0.11'
+})
+
 // 全局方法挂载
 Vue.prototype.getDicts = getDicts
 Vue.prototype.getConfigKey = getConfigKey
@@ -77,7 +101,7 @@ Vue.use(Element, {
 })
 
 Vue.config.productionTip = false
-
+ 
 new Vue({
   el: '#app',
   router,

+ 13 - 0
src/router/index.js

@@ -87,6 +87,19 @@ export const constantRoutes = [
         meta: { title: '个人中心', icon: 'user' }
       }
     ]
+  },
+  {
+    path: '/management',
+    component: Layout,
+    hidden: true,
+    children: [
+      {
+        path: 'index/:id(\\d+)',
+        component: () => import('@/views/base/field/management'),
+        name: 'management',
+        meta: { title: '管理信息', activeMenu: '/base/field' }
+      }
+    ]
   }
 ]
 

+ 1191 - 0
src/views/base/device/index.vue

@@ -0,0 +1,1191 @@
+<template>
+  <div class="app-container">
+    <el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
+      <el-form-item label="设备编号" prop="deviceId">
+        <el-input v-model="queryParams.deviceId" placeholder="请输入设备编号" clearable @keyup.enter.native="handleQuery" />
+      </el-form-item>
+      <el-form-item label="设备名称" prop="deviceName">
+        <el-input v-model="queryParams.deviceName" placeholder="请输入设备名称" clearable @keyup.enter.native="handleQuery" />
+      </el-form-item>
+
+      <!-- <el-form-item label="设备类型" prop="deviceTypeId">
+        <el-input v-model="queryParams.deviceTypeId" placeholder="请输入设备类型" clearable
+          @keyup.enter.native="handleQuery" />
+      </el-form-item> -->
+
+      <el-form-item label="设备类型" prop="deviceTypeId">
+        <el-select v-model="queryParams.deviceTypeId" placeholder="请输入设备类型" clearable>
+          <el-option v-for="dict in dict.type.device_type" :key="dict.value" :label="dict.label" :value="dict.value" />
+        </el-select>
+      </el-form-item>
+
+      <el-form-item label="所属地块" prop="fieldIdList">
+        <!-- <el-input
+          v-model="queryParams.supplierName"
+          placeholder="请输入供应商名称"
+          clearable
+          @keyup.enter.native="handleQuery"
+        /> -->
+        <el-select v-model="queryParams.fieldIdList" placeholder="请选择地块" multiple collapse-tags filterable clearable>
+          <el-option v-for="dict in fieldIdList" :key="dict.value" :label="dict.label" :value="dict.value" />
+        </el-select>
+      </el-form-item>
+
+      <!-- <el-form-item label="所属农场" prop="farmId">
+        <el-input v-model="queryParams.farmId" placeholder="请输入所属农场" clearable @keyup.enter.native="handleQuery" />
+      </el-form-item> -->
+      <el-form-item label="所属农场" prop="deptIdList">
+        <treeselect v-model="queryParams.deptIdList" :options="deptOptions" multiple :flat="true" :limit="1"
+          :limitText="count => `+${count}`" style="width:200px" :show-count="true" placeholder="请选所属机构" />
+      </el-form-item>
+
+
+      <el-form-item label="设备状态" prop="status">
+        <el-select v-model="queryParams.status" placeholder="请输入设备状态" clearable>
+          <el-option v-for="dict in dict.type.device_status" :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-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="['system: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="['system: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="['system:device:remove']">删除</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button type="warning" plain icon="el-icon-download" size="mini" @click="handleExport"
+          v-hasPermi="['system:device:export']">导出</el-button>
+      </el-col>
+      <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
+    </el-row>
+
+    <el-table v-loading="loading" :data="deviceList" @selection-change="handleSelectionChange">
+      <el-table-column type="selection" width="55" align="center" />
+      <el-table-column label="主键" align="center" prop="id" v-if="false" />
+      <el-table-column label="设备编号" align="center" prop="deviceId" />
+      <el-table-column label="设备名称" align="center" prop="deviceName" />
+      <el-table-column label="设备类型" align="center" prop="deviceTypeId">
+        <template slot-scope="scope">
+          <dict-tag :options="dict.type.device_type" :value="scope.row.deviceTypeId" />
+        </template>
+      </el-table-column>
+      <el-table-column label="所属地块" align="center" key="fieldName" prop="fieldName" />
+      <el-table-column label="所属农场" align="center" key="deptName" prop="dept.deptName" />
+      <!-- <template slot-scope="scope">
+          <dict-tag :options="dict.type.device_status" :value="scope.row.farmId"/>
+        </template> -->
+
+      <el-table-column label="设备型号" align="center" prop="model" />
+      <el-table-column label="厂家" align="center" prop="manufacturer" />
+      <el-table-column label="状态" align="center" prop="status">
+        <template slot-scope="scope">
+          <dict-tag :options="dict.type.device_status" :value="scope.row.status" />
+        </template>
+      </el-table-column>
+      <el-table-column label="最后活动时间" align="center" prop="lastActiveTime" width="180">
+        <template slot-scope="scope">
+          <span>{{ parseTime(scope.row.lastActiveTime, '{y}-{m}-{d}') }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+        <template slot-scope="scope">
+          <el-button size="mini" type="text" icon="el-icon-edit" @click="handleView(scope.row)"
+            v-hasPermi="['system:device:edit']">查看</el-button>
+
+          <el-button size="mini" type="text" icon="el-icon-edit" @click="handleUpdate(scope.row)"
+            v-hasPermi="['system:device:edit']">修改</el-button>
+          <el-button size="mini" type="text" icon="el-icon-delete" @click="handleDelete(scope.row)"
+            v-hasPermi="['system:device:remove']">删除</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+
+    <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="500px" append-to-body>
+      <el-form ref="form" :model="form" :rules="rules" label-width="80px">
+        <el-form-item label="设备编号" prop="deviceId">
+          <el-input v-model="form.deviceId" placeholder="请输入设备编号" />
+        </el-form-item>
+        <el-form-item label="设备名称" prop="deviceName">
+          <el-input v-model="form.deviceName" placeholder="请输入设备名称" />
+        </el-form-item>
+        <!-- <el-form-item label="设备类型" prop="deviceTypeId">
+          <el-input v-model="form.deviceTypeId" placeholder="请输入设备类型" />
+        </el-form-item> -->
+
+
+        <el-form-item label="设备类型" prop="deviceTypeId">
+          <el-select v-model="form.deviceTypeId" placeholder="请选择设备类型">
+            <el-option v-for="dict in dict.type.device_type" :key="dict.value" :label="dict.label"
+              :value="dict.value"></el-option>
+          </el-select>
+        </el-form-item>
+
+        <el-form-item label="厂家" prop="manufacturer">
+          <el-input v-model="form.manufacturer" placeholder="请输入厂家" />
+        </el-form-item>
+        <!-- <el-form-item label="所属农场" prop="farmId">
+          <el-input v-model="form.farmId" placeholder="请输入所属农场" />
+        </el-form-item> -->
+
+        <el-form-item label="所属农场" prop="farmId">
+          <treeselect v-model="form.farmId" :options="deptOptions" :show-count="true" placeholder="请选所属机构"
+            @input='queryPersonCharge(form.farmId)' />
+        </el-form-item>
+
+
+        <el-form-item label="设备型号" prop="model">
+          <el-input v-model="form.model" placeholder="请输入设备型号" />
+        </el-form-item>
+        <el-form-item label="GPS经度" prop="longitude">
+          <el-input v-model="form.longitude" placeholder="请输入GPS经度" />
+        </el-form-item>
+        <el-form-item label="GPS纬度" prop="latitude">
+          <el-input v-model="form.latitude" placeholder="请输入GPS纬度" />
+        </el-form-item>
+
+        <el-form-item label="安装日期" prop="installDate">
+          <el-date-picker clearable v-model="form.installDate" type="date" value-format="yyyy-MM-dd"
+            placeholder="请选择安装日期">
+          </el-date-picker>
+        </el-form-item>
+        <el-form-item label="备注信息" prop="remark">
+          <el-input v-model="form.remark" type="textarea" placeholder="请输入内容" />
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitForm">确 定</el-button>
+        <el-button @click="cancel">取 消</el-button>
+      </div>
+    </el-dialog>
+
+
+
+
+    <!-- 查看传感器设备对话框 -->
+    <el-dialog :title="title" :visible.sync="openView" width="800px" append-to-body>
+      <el-tabs v-model="activeTab" @tab-click="handleClick">
+        <el-tab-pane label="基本信息" name="basicInfo">
+          <el-row :gutter="20">
+            <el-col :span="12">
+              <div class="device-info">
+                <h3>设备基础信息</h3>
+
+                <ul>
+                  <li><strong>设备编号:</strong> {{ formView.deviceId }}</li>
+                  <li><strong>设备名称:</strong> {{ formView.deviceName }}</li>
+
+                  <li><strong style="float: left;">设备类型:</strong><dict-tag :options="dict.type.device_type"
+                      :value="formView.deviceTypeId" /></li>
+                  <li><strong>设备型号:</strong> {{ formView.model }}</li>
+                  <li><strong>制造厂商:</strong> {{ formView.manufacturer }}</li>
+                </ul>
+
+              </div>
+
+
+            </el-col>
+            <el-col :span="12">
+              <div class="device-info">
+                <h3>位置信息</h3>
+
+                <ul>
+                  <li><strong>所属农场:</strong> {{ formView.deptName }}</li>
+                  <li><strong>所属地块:</strong> {{ formView.fieldName }}</li>
+                  <li><strong>安装日期:</strong> {{ formView.installDate }}</li>
+                  <li><strong>GPS坐标:</strong> {{ formView.longitude }} - {{ formView.latitude }}</li>
+                </ul>
+
+              </div>
+            </el-col>
+          </el-row>
+          <el-row>
+            <el-col :span="24">
+              <h3>运行状态</h3>
+              <el-row :gutter="20">
+                <el-col :span="12">
+                  <div>
+                    <p>当前状态:
+                      <el-tag :type="getTagType(formView.status)">{{ getStatusText(formView.status) }}</el-tag>
+                    </p>
+                  </div>
+                  <div>
+                    <p>最后活动:{{ formView.lastActiveTime }}</p>
+
+                  </div>
+                </el-col>
+                <el-col :span="12">
+                  <div>
+                    <p>电量状态:
+                      <el-progress :percentage="deviceStatus.battery" :stroke-width="10"></el-progress>
+                    </p>
+                  </div>
+                  <div>
+                    <p>信号强度:良好</p>
+                  </div>
+                </el-col>
+              </el-row>
+            </el-col>
+          </el-row>
+        </el-tab-pane>
+        <el-tab-pane label="实时数据" name="realTimeData">
+          <el-card class="box-card">
+            <div slot="header" class="clearfix">
+              <span>实时读数</span>
+              <el-badge style="margin-left: 70%;">最后更新: {{ sensorRealTime.collectTime }}</el-badge>
+            </div>
+            <el-row :gutter="20">
+              <el-col :span="6">
+                <el-card>
+                  <div class="item-content">
+
+                    <div class="item-value" style="color: #059669;">{{ sensorRealTime.temperature }}</div>
+                    <div class="item-title">温度 (°C)</div>
+                  </div>
+                </el-card>
+              </el-col>
+              <el-col :span="6">
+                <el-card>
+                  <div class="item-content">
+
+                    <div class="item-value" style="color: #2563eb;">{{ sensorRealTime.humidity }}%</div>
+                    <div class="item-title">湿度</div>
+                  </div>
+                </el-card>
+              </el-col>
+              <el-col :span="6">
+                <el-card>
+                  <div class="item-content">
+
+                    <div class="item-value">{{ sensorRealTime.illuminance }}</div>
+                    <div class="item-title">光照 (lux)</div>
+                  </div>
+                </el-card>
+              </el-col>
+              <el-col :span="6">
+                <el-card>
+                  <div class="item-content">
+
+                    <div class="item-value" style="color: #7c3aed;">{{ sensorRealTime.soilMoisture }}%</div>
+                    <div class="item-title">土壤湿度</div>
+                  </div>
+                </el-card>
+              </el-col>
+            </el-row>
+          </el-card>
+          <div ref="chart" id="sensor" style="width: 750px; height: 400px;">
+          </div>
+          <el-card class="box-card">
+            <el-row :gutter="20">
+              <el-col :span="6">
+                <el-card>
+                  <div class="item-content">
+                    <div class="item-title">平均温度</div>
+                    <div class="item-value" style="color: #059669;">{{ AverageSensorRealTime.temperature }}</div>
+
+                  </div>
+                </el-card>
+              </el-col>
+              <el-col :span="6">
+                <el-card>
+                  <div class="item-content">
+                    <div class="item-title">平均湿度</div>
+                    <div class="item-value" style="color: #2563eb;">{{ AverageSensorRealTime.humidity }}%</div>
+                  </div>
+                </el-card>
+              </el-col>
+              <el-col :span="6">
+                <el-card>
+                  <div class="item-content">
+                    <div class="item-title">平均光照</div>
+                    <div class="item-value">{{ AverageSensorRealTime.illuminance }}</div>
+
+                  </div>
+                </el-card>
+              </el-col>
+              <el-col :span="6">
+                <el-card>
+                  <div class="item-content">
+                    <div class="item-title">平均土壤湿度</div>
+                    <div class="item-value" style="color: #7c3aed;">{{ AverageSensorRealTime.soilMoisture }}%</div>
+
+                  </div>
+                </el-card>
+              </el-col>
+            </el-row>
+          </el-card>
+
+        </el-tab-pane>
+      </el-tabs>
+    </el-dialog>
+
+
+
+    <!-- 查看气象设备对话框 -->
+    <el-dialog :title="title" :visible.sync="openWeatherView" width="800px" append-to-body>
+      <el-tabs v-model="activeWeatherTab" @tab-click="handleClickWeather">
+        <el-tab-pane label="基本信息" name="basicInfoWeather">
+          <el-row :gutter="20">
+            <el-col :span="12">
+              <div class="device-info">
+                <h3>设备基础信息</h3>
+
+                <ul>
+                  <li><strong>设备编号:</strong> {{ formView.deviceId }}</li>
+                  <li><strong>设备名称:</strong> {{ formView.deviceName }}</li>
+
+                  <li><strong style="float: left;">设备类型:</strong><dict-tag :options="dict.type.device_type"
+                      :value="formView.deviceTypeId" /></li>
+                  <li><strong>设备型号:</strong> {{ formView.model }}</li>
+                  <li><strong>制造厂商:</strong> {{ formView.manufacturer }}</li>
+                </ul>
+
+              </div>
+
+
+            </el-col>
+            <el-col :span="12">
+              <div class="device-info">
+                <h3>位置信息</h3>
+
+                <ul>
+                  <li><strong>所属农场:</strong> {{ formView.deptName }}</li>
+                  <li><strong>所属地块:</strong> {{ formView.fieldName }}</li>
+                  <li><strong>安装日期:</strong> {{ formView.installDate }}</li>
+                  <li><strong>GPS坐标:</strong> {{ formView.longitude }} - {{ formView.latitude }}</li>
+                </ul>
+
+              </div>
+            </el-col>
+          </el-row>
+          <el-row>
+            <el-col :span="24">
+              <h3>运行状态</h3>
+              <el-row :gutter="20">
+                <el-col :span="12">
+                  <div>
+                    <p>当前状态:
+                      <el-tag :type="getTagType(formView.status)">{{ getStatusText(formView.status) }}</el-tag>
+                    </p>
+                  </div>
+                  <div>
+                    <p>最后活动:{{ formView.lastActiveTime }}</p>
+
+                  </div>
+                </el-col>
+                <el-col :span="12">
+                  <div>
+                    <p>电量状态:
+                      <el-progress :percentage="deviceStatus.battery" :stroke-width="10"></el-progress>
+                    </p>
+                  </div>
+                  <div>
+                    <p>信号强度:良好</p>
+                  </div>
+                </el-col>
+              </el-row>
+            </el-col>
+          </el-row>
+        </el-tab-pane>
+        <el-tab-pane label="实时数据" name="realTimeData">
+          <el-card class="box-card">
+            <div slot="header" class="clearfix">
+              <span>实时气象数据</span>
+              <el-badge style="margin-left: 70%;">最后更新: {{ sensorRealTime.lastUpdateTime }}</el-badge>
+            </div>
+            <el-row :gutter="20">
+              <el-col :span="6">
+                <el-card>
+                  <div class="item-content">
+
+                    <div class="item-value" style="color: #059669;">{{ sensorRealTime.temperature }}</div>
+                    <div class="item-title">气温 (°C)</div>
+                  </div>
+                </el-card>
+              </el-col>
+              <el-col :span="6">
+                <el-card>
+                  <div class="item-content">
+
+                    <div class="item-value" style="color: #2563eb;">{{ sensorRealTime.humidity }}%</div>
+                    <div class="item-title">湿度</div>
+                  </div>
+                </el-card>
+              </el-col>
+              <el-col :span="6">
+                <el-card>
+                  <div class="item-content">
+
+                    <div class="item-value">{{ sensorRealTime.illuminance }}</div>
+                    <div class="item-title">降雨量 (lux)</div>
+                  </div>
+                </el-card>
+              </el-col>
+              <el-col :span="6">
+                <el-card>
+                  <div class="item-content">
+
+                    <div class="item-value" style="color: #7c3aed;">{{ sensorRealTime.soilMoisture }}%</div>
+                    <div class="item-title">风向</div>
+                  </div>
+                </el-card>
+              </el-col>
+            </el-row>
+
+
+            <el-row :gutter="20">
+              <el-col :span="6">
+                <el-card>
+                  <div class="item-content">
+
+                    <div class="item-value" style="color: #059669;">{{ sensorRealTime.temperature }}</div>
+                    <div class="item-title">风速</div>
+                  </div>
+                </el-card>
+              </el-col>
+              <el-col :span="6">
+                <el-card>
+                  <div class="item-content">
+
+                    <div class="item-value" style="color: #2563eb;">{{ sensorRealTime.humidity }}%</div>
+                    <div class="item-title">气压</div>
+                  </div>
+                </el-card>
+              </el-col>
+              <el-col :span="6">
+                <el-card>
+                  <div class="item-content">
+
+                    <div class="item-value">{{ sensorRealTime.illuminance }}</div>
+                    <div class="item-title">光照</div>
+                  </div>
+                </el-card>
+              </el-col>
+
+            </el-row>
+          </el-card>
+          <div ref="chart" id="demoDiv" style="width: 750px; height: 400px;">
+          </div>
+          <el-card class="box-card">
+            <el-row :gutter="20">
+              <el-col :span="6">
+                <el-card>
+                  <div class="item-content">
+                    <div class="item-title">平均气温</div>
+                    <div class="item-value" style="color: #059669;">{{ AverageSensorRealTime.temperature }}</div>
+
+                  </div>
+                </el-card>
+              </el-col>
+              <el-col :span="6">
+                <el-card>
+                  <div class="item-content">
+                    <div class="item-title">平均湿度</div>
+                    <div class="item-value" style="color: #2563eb;">{{ AverageSensorRealTime.humidity }}%</div>
+                  </div>
+                </el-card>
+              </el-col>
+              <el-col :span="6">
+                <el-card>
+                  <div class="item-content">
+                    <div class="item-title">累计降雨量</div>
+                    <div class="item-value">{{ AverageSensorRealTime.illuminance }}</div>
+
+                  </div>
+                </el-card>
+              </el-col>
+              <el-col :span="6">
+                <el-card>
+                  <div class="item-content">
+                    <div class="item-title">平均风速</div>
+                    <div class="item-value" style="color: #7c3aed;">{{ AverageSensorRealTime.soilMoisture }}%</div>
+
+                  </div>
+                </el-card>
+              </el-col>
+            </el-row>
+          </el-card>
+
+        </el-tab-pane>
+      </el-tabs>
+    </el-dialog>
+
+
+
+    <!-- 查看控制器设备对话框 -->
+    <el-dialog :title="title" :visible.sync="openControllerView" width="800px" append-to-body>
+      <el-tabs v-model="activeControllerTab" @tab-click="handleClickController">
+        <el-tab-pane label="基本信息" name="basicInfoController">
+          <el-row :gutter="20">
+            <el-col :span="12">
+              <div class="device-info">
+                <h3>设备基础信息</h3>
+
+                <ul>
+                  <li><strong>设备编号:</strong> {{ formView.deviceId }}</li>
+                  <li><strong>设备名称:</strong> {{ formView.deviceName }}</li>
+
+                  <li><strong style="float: left;">设备类型:</strong><dict-tag :options="dict.type.device_type"
+                      :value="formView.deviceTypeId" /></li>
+                  <li><strong>设备型号:</strong> {{ formView.model }}</li>
+                  <li><strong>制造厂商:</strong> {{ formView.manufacturer }}</li>
+                </ul>
+
+              </div>
+
+
+            </el-col>
+            <el-col :span="12">
+              <div class="device-info">
+                <h3>位置信息</h3>
+
+                <ul>
+                  <li><strong>所属农场:</strong> {{ formView.deptName }}</li>
+                  <li><strong>所属地块:</strong> {{ formView.fieldName }}</li>
+                  <li><strong>安装日期:</strong> {{ formView.installDate }}</li>
+                  <li><strong>GPS坐标:</strong> {{ formView.longitude }} - {{ formView.latitude }}</li>
+                </ul>
+
+              </div>
+            </el-col>
+          </el-row>
+          <el-row>
+            <el-col :span="24">
+              <h3>运行状态</h3>
+              <el-row :gutter="20">
+                <el-col :span="12">
+                  <div>
+                    <p>当前状态:
+                      <el-tag :type="getTagType(formView.status)">{{ getStatusText(formView.status) }}</el-tag>
+                    </p>
+                  </div>
+                  <div>
+                    <p>最后活动:{{ formView.lastActiveTime }}</p>
+
+                  </div>
+                </el-col>
+                <el-col :span="12">
+                  <div>
+                    <p>电量状态:
+                      <el-progress :percentage="deviceStatus.battery" :stroke-width="10"></el-progress>
+                    </p>
+                  </div>
+                  <div>
+                    <p>信号强度:良好</p>
+                  </div>
+                </el-col>
+              </el-row>
+            </el-col>
+          </el-row>
+        </el-tab-pane>
+        <el-tab-pane label="实时数据" name="realTimeData">
+          <div>
+            <el-row :gutter="20">
+              <el-col :span="12">
+                <h3>控制状态</h3>
+                <ul>
+                  <li v-for="item in controlStatus" :key="item.id">
+                    <strong>{{ item.name }}</strong>
+
+                  </li>
+                </ul>
+              </el-col>
+              <el-col :span="12">
+                <h3>运行参数</h3>
+                <el-form>
+                  <el-form-item label="系统工作模式">
+                    <el-select v-model="systemMode" placeholder="请选择">
+                      <el-option label="自动模式" value="auto"></el-option>
+                      <el-option label="手动模式" value="manual"></el-option>
+                    </el-select>
+                  </el-form-item>
+                  <el-form-item label="水泵1#流量">
+                    <el-progress :percentage="waterPump1Flow" :stroke-width="18"></el-progress>
+                  </el-form-item>
+                  <el-form-item label="风机转速">
+                    <el-progress :percentage="fanSpeed" :stroke-width="18"></el-progress>
+                  </el-form-item>
+                  <el-form-item label="阀门开度">
+                    <el-progress :percentage="valveOpenDegree" :stroke-width="18"></el-progress>
+                  </el-form-item>
+                </el-form>
+              </el-col>
+            </el-row>
+            <el-table :data="operationRecords" style="width: 100%">
+              <el-table-column prop="time" label="时间" width="180" />
+              <el-table-column prop="eventType" label="事件类型" width="180" />
+              <el-table-column prop="operator" label="操作人员" width="180" />
+              <el-table-column prop="detail" label="详情" />
+
+            </el-table>
+          </div>
+
+        </el-tab-pane>
+      </el-tabs>
+    </el-dialog>
+
+
+
+
+
+  </div>
+</template>
+
+<script>
+import { listDevice, getDevice, delDevice, addDevice, updateDevice } from "@/api/base/device"
+import { getInfoLatestTime } from "@/api/base/sensor"
+import { listFieldName } from "@/api/base/field"
+import { deptTreeSelect } from "@/api/system/user";
+import Treeselect from "@riophae/vue-treeselect";
+import "@riophae/vue-treeselect/dist/vue-treeselect.css";
+import * as  echarts from 'echarts'
+
+export default {
+  name: "Device",
+  components: { Treeselect },
+  dicts: ['device_type', 'device_status'],
+  data() {
+    return {
+      activeTab: 'basicInfo',
+      activeWeatherTab: 'basicInfoWeather',
+      activeControllerTab: 'basicInfoController',
+      // 遮罩层
+      loading: true,
+      // 选中的设备编号
+      deviceId: "",
+      // 选中数组
+      ids: [],
+      // 非单个禁用
+      single: true,
+      // 非多个禁用
+      multiple: true,
+      // 显示搜索条件
+      showSearch: true,
+      // 总条数
+      total: 0,
+      // 设备表格数据
+      deviceList: [],
+
+      // 部门树选项
+      deptOptions: undefined,
+      // 所属地块
+      fieldIdList: [],
+      // 弹出层标题
+      title: "",
+      // 是否显示弹出层
+      open: false,
+      // 是否显示查看传感器的弹出层
+      openView: false,
+      // 是否显示查看气象设备的弹出层
+      openWeatherView: false,
+      // 是否显示查看控制器的弹出层
+      openControllerView: false,
+
+      // 传感器日期数据
+      sensorDate: ['5/31', '6/1', '6/2', '6/3', '6/4', '6/5', '6/6'],
+      // 传感器温度数据
+      sensorTemperature: [22, 24, 28, 26, 24, 22, 22],
+      // 传感器湿度数据
+      sensorHumidity: [70, 60, 65, 75, 55, 60, 67],
+      // 传感器光照数据
+      sensorIllumination: [null, null, null, 78, 55, 60, 68],
+      // 传感器土壤湿度数据
+      sensorSoilMoisture: [20, 22, 25, 24, 22, 22, 22],
+
+      controlStatus: [
+        { name: '水泵1#', status: 'success' },
+        { name: '水泵2#', status: 'danger' },
+        { name: '风机', status: 'success' },
+        { name: '灌溉阀门', status: 'warning' },
+        { name: '照明系统', status: 'info' }
+      ],
+      systemMode: 'auto',
+      waterPump1Flow: 65,
+      fanSpeed: 80,
+      valveOpenDegree: 45,
+      operationRecords: [
+        { time: '2023-10-16 14:30', eventType: '自动启动', operator: '系统', detail: '根据传感器数据,水泵1#自动启动' },
+        { time: '2023-10-16 12:15', eventType: '手动调整', operator: '张农艺师', detail: '调整风机转速至80%' },
+        { time: '2023-10-16 09:30', eventType: '自动关闭', operator: '系统', detail: '灌溉完成,阀门自动关闭' },
+        { time: '2023-10-16 08:00', eventType: '系统检查', operator: '系统', detail: '日常自检完成,所有系统正常' }
+      ],
+
+
+      // 传感器实时数据
+      sensorRealTime: {
+        temperature: 26.5,
+        humidity: 65,
+        illuminance: 782,
+        soilMoisture: 25,
+        collectTime: '2023-10-16 15:45',
+      },
+      // 传感器实时数据平均
+      AverageSensorRealTime: {
+        temperature: 26.5,
+        humidity: 65,
+        illuminance: 782,
+        soilMoisture: 25,
+        lastUpdateTime: '2023-10-16 15:45',
+      },
+      weatherRealTime: {
+
+      },
+      AverageweatherRealTime:{
+
+      },
+      deviceInfo: {
+        deviceCode: 'DEV20230001',
+        deviceName: '温湿度传感器-A1',
+        deviceType: '传感器',
+        deviceModel: 'TS-100A',
+        manufacturer: '智农科技',
+        farmName: '东区智慧农场',
+        location: 'A区大棚3号',
+        installDate: '2023-01-15',
+        gps: '30.2922° N, 120.1619° E'
+      },
+      deviceStatus: {
+        battery: 85,
+        signal: '良好',
+        signalColor: 'green',
+        lastActivity: '2023-10-15 14:30'
+      },
+
+      // 查询参数
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        deviceId: null,
+        deviceName: null,
+        deviceTypeId: null,
+        farmId: null,
+        status: null,
+        deptIdList: [],
+      },
+      // 表单参数
+      form: {},
+
+      // 查看传感器表单参数
+      formView: {},
+      // 查看气象设备表单参数
+      formViewMeteorological: {},
+      // 表单校验
+      rules: {
+        deviceId: [
+          { required: true, message: "设备编号不能为空", trigger: "blur" }
+        ],
+        deviceName: [
+          { required: true, message: "设备名称不能为空", trigger: "blur" }
+        ],
+        deviceTypeId: [
+          { required: true, message: "设备类型不能为空", trigger: "blur" }
+        ],
+        createTime: [
+          { required: true, message: "创建时间不能为空", trigger: "blur" }
+        ],
+        updateTime: [
+          { required: true, message: "更新时间不能为空", trigger: "blur" }
+        ],
+      }
+    }
+  },
+  mounted() {
+
+  },
+
+
+
+
+  created() {
+    this.getList();
+    this.getDeptTree();
+    this.getFieldNameList();
+  },
+  methods: {
+
+
+
+
+    /** 查询地块名称 **/
+    getFieldNameList() {
+      listFieldName().then(res => {
+        this.fieldIdList = res;
+        this.fieldIdList.forEach(x => {
+          x.value = x.id;
+          x.label = x.fieldName;
+        })
+        console.info(this.deviceList)
+      });
+    },
+
+
+
+
+    Sensor() {
+      // let lCharts = echarts.init(document.getElementById('demoDiv'))
+      const chart = echarts.init(document.getElementById('sensor'));
+      const option = {
+        title: {
+          text: '数据统计图'
+        },
+        tooltip: {},
+        legend: {
+          data: ['温度', '湿度', '光照', '土壤湿度']
+        },
+        xAxis: {
+          type: 'category',
+          data: this.sensorDate
+        },
+        yAxis: {
+          type: 'value'
+        },
+        toolbox: {
+          feature: {
+            saveAsImage: {}
+          }
+        },
+        series: [
+          {
+            name: '温度',
+            type: 'line',
+            data: this.sensorTemperature,
+            smooth: true,
+            areaStyle: {
+
+            }
+          },
+          {
+            name: '湿度',
+            type: 'line',
+            data: this.sensorHumidity,
+            smooth: true,
+            areaStyle: {
+
+            }
+          },
+          {
+            name: '光照',
+            type: 'line',
+            data: this.sensorIllumination,
+            smooth: true,
+            areaStyle: {
+
+            }
+          },
+          {
+            name: '土壤湿度',
+            type: 'line',
+            data: this.sensorSoilMoisture,
+            smooth: true,
+            areaStyle: {
+
+            }
+          }
+        ]
+      };
+      chart.setOption(option);
+
+    },
+
+
+    getStatusText(status) {
+      switch (status) {
+        case 0:
+          return '离线';
+        case 1:
+          return '在线';
+        case 2:
+          return '故障';
+        case 3:
+          return '维护中';
+        default:
+          // 如果状态值未知,返回默认文本
+          return '未知状态';
+      }
+    },
+    getTagType(status) {
+      // 根据状态返回对应的标签类型
+      switch (status) {
+        case 0:
+          return 'info';
+        case 1:
+          return 'success';
+        case 2:
+          return 'danger';
+        case 3:
+          return 'warning';
+        default:
+          // 如果状态值未知,返回默认类型
+          return 'default';
+      }
+    },
+
+    /* 传感器切换事件 */
+    handleClick(tab, event) {
+      console.log(tab, event);
+      if (tab.index == 0) {
+        console.log("传感器第一个");
+      } else if (tab.index == 1) {
+        console.log("传感器第二个");
+        console.log(this.deviceId);
+
+        getInfoLatestTime(this.deviceId).then(response => {
+        this.sensorRealTime = response.rows
+      })
+      } else {
+        //网络请求3getUserField
+        console.log("传感器第三个");
+      }
+
+    },
+
+
+    /* 气象设备切换事件 */
+    handleClickWeather(tab, event) {
+      console.log(tab, event);
+      if (tab.index == 0) {
+        console.log("气象设备第一个");
+      } else if (tab.index == 1) {
+
+        console.log("气象设备第二个");
+      } else {
+        //网络请求3getUserField
+        console.log("气象设备第三个");
+      }
+
+    },
+
+    /* 控制器切换事件 */
+    handleClickController(tab, event) {
+      console.log(tab, event);
+      if (tab.index == 0) {
+        console.log("控制器第一个");
+      } else if (tab.index == 1) {
+
+        console.log("控制器第二个");
+      } else {
+        //网络请求3getUserField
+        console.log("控制器第三个");
+      }
+
+    },
+
+    /**查询对应的负责人 */
+    queryPersonCharge() {
+
+    },
+
+    /** 查询部门下拉树结构 */
+    getDeptTree() {
+      deptTreeSelect().then(response => {
+        this.deptOptions = response.data;
+      });
+    },
+    /** 查询设备列表 */
+    getList() {
+      this.loading = true
+      listDevice(this.queryParams).then(response => {
+        this.deviceList = response.rows
+        this.total = response.total
+        this.loading = false
+      })
+    },
+    // 取消按钮
+    cancel() {
+      this.open = false
+      this.reset()
+    },
+    // 表单重置
+    reset() {
+      this.form = {
+        id: null,
+        deviceId: null,
+        deviceName: null,
+        deviceTypeId: null,
+        farmId: null,
+        model: null,
+        longitude: null,
+        latitude: null,
+        manufacturer: null,
+        installDate: null,
+        status: null,
+        lastActiveTime: null,
+        createTime: null,
+        updateTime: null,
+        remark: null
+      }
+      this.resetForm("form")
+    },
+    // 查看表单重置
+    resetView() {
+      this.formView = {
+        id: null,
+        deviceId: null,
+        deviceName: null,
+        deviceTypeId: null,
+        farmId: null,
+        model: null,
+        longitude: null,
+        latitude: null,
+        manufacturer: null,
+        installDate: null,
+        status: null,
+        lastActiveTime: null,
+        createTime: null,
+        updateTime: null,
+        remark: null,
+        deptName: null
+      }
+      this.resetForm("formView")
+    },
+    /** 搜索按钮操作 */
+    handleQuery() {
+      this.queryParams.pageNum = 1
+      this.getList()
+    },
+    /** 重置按钮操作 */
+    resetQuery() {
+      this.resetForm("queryForm")
+      this.handleQuery()
+    },
+    // 多选框选中数据
+    handleSelectionChange(selection) {
+      this.ids = selection.map(item => item.id)
+      this.single = selection.length !== 1
+      this.multiple = !selection.length
+    },
+    /** 新增按钮操作 */
+    handleAdd() {
+      this.reset()
+      this.open = true
+      this.title = "添加设备"
+    },
+    /** 修改按钮操作 */
+    handleUpdate(row) {
+      this.reset()
+      const id = row.id || this.ids
+      getDevice(id).then(response => {
+        this.form = response.data
+        this.open = true
+        this.title = "修改设备"
+      })
+    },
+    /** 查看按钮操作 */
+    handleView(row) {
+      this.resetView()
+      const id = row.id || this.ids
+      this.deviceId = row.deviceId
+      getDevice(id).then(response => {
+        this.formView = response.data
+        this.formView.deptName = response.data.dept.deptName
+        this.title = "设备详情"
+      })
+      if (row.deviceTypeId == 1) {// 传感器
+
+        this.openView = true
+
+        this.$nextTick(() => {
+          this.Sensor();
+        });
+
+
+      } else if (row.deviceTypeId == 2) {// 摄像头
+      } else if (row.deviceTypeId == 3) {// 控制器
+        this.openControllerView = true
+      } else if (row.deviceTypeId == 4) {// 气象设备
+        this.openWeatherView = true
+      }
+
+    },
+    /** 提交按钮 */
+    submitForm() {
+      this.$refs["form"].validate(valid => {
+        if (valid) {
+          if (this.form.id != null) {
+            updateDevice(this.form).then(response => {
+              this.$modal.msgSuccess("修改成功")
+              this.open = false
+              this.getList()
+            })
+          } else {
+            addDevice(this.form).then(response => {
+              this.$modal.msgSuccess("新增成功")
+              this.open = false
+              this.getList()
+            })
+          }
+        }
+      })
+    },
+    /** 删除按钮操作 */
+    handleDelete(row) {
+      const ids = row.id || this.ids
+      this.$modal.confirm('是否确认删除设备编号为"' + ids + '"的数据项?').then(function () {
+        return delDevice(ids)
+      }).then(() => {
+        this.getList()
+        this.$modal.msgSuccess("删除成功")
+      }).catch(() => { })
+    },
+    /** 导出按钮操作 */
+    handleExport() {
+      this.download('system/device/export', {
+        ...this.queryParams
+      }, `device_${new Date().getTime()}.xlsx`)
+    }
+  }
+}
+</script>
+
+
+<style scoped>
+li {
+  list-style-type: none;
+}
+
+ul {
+  margin: 0;
+  padding: 0;
+}
+
+
+#Sensor {
+  width: 500px;
+  height: 300px;
+  border: 1px solid red;
+}
+
+
+.box-card {
+  margin-bottom: 20px;
+}
+
+.item-content {
+  text-align: center;
+}
+
+.item-title {
+  font-weight: bold;
+}
+
+.item-value {
+  font-size: 24px;
+}
+</style>

+ 465 - 0
src/views/base/field/index.vue

@@ -0,0 +1,465 @@
+<template>
+  <div class="app-container">
+    <el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
+      <el-form-item label="地块编号" prop="fieldCode">
+        <el-input v-model="queryParams.fieldCode" placeholder="请输入地块编号" clearable @keyup.enter.native="handleQuery" />
+      </el-form-item>
+      <el-form-item label="地块名称" prop="fieldName">
+        <el-input v-model="queryParams.fieldName" placeholder="请输入地块名称" clearable @keyup.enter.native="handleQuery" />
+      </el-form-item>
+      <!-- <el-form-item label="所属农场" prop="farmId">
+        <el-input v-model="queryParams.farmId" placeholder="请输入所属农场ID" clearable @keyup.enter.native="handleQuery" />
+      </el-form-item> -->
+
+      <el-form-item label="所属农场" prop="deptIdList">
+        <treeselect v-model="queryParams.deptIdList" :options="deptOptions" multiple :flat="true" :limit="1"
+          :limitText="count => `+${count}`" style="width:200px" :show-count="true" placeholder="请选所属机构" />
+      </el-form-item>
+
+
+      <el-form-item label="使用状态" prop="status">
+        <el-select v-model="queryParams.status" placeholder="请选择使用状态" clearable>
+          <el-option v-for="dict in dict.type.field_status" :key="dict.value" :label="dict.label" :value="dict.value" />
+        </el-select>
+      </el-form-item>
+
+      <el-form-item label="地块类型" prop="fieldType">
+        <el-select v-model="queryParams.fieldType" placeholder="请选择地块类型" clearable>
+          <el-option v-for="dict in dict.type.sys_field_type" :key="dict.value" :label="dict.label"
+            :value="dict.value" />
+        </el-select>
+      </el-form-item>
+      <el-form-item label="种植作物" prop="growCrops">
+        <el-input v-model="queryParams.growCrops" placeholder="请输入种植作物" clearable @keyup.enter.native="handleQuery" />
+      </el-form-item>
+
+      <el-form-item label="土壤类型" prop="soilType">
+        <el-select v-model="queryParams.soilType" placeholder="请选择土壤类型" clearable>
+          <el-option v-for="dict in dict.type.field_soil_type" :key="dict.value" :label="dict.label"
+            :value="dict.value" />
+        </el-select>
+      </el-form-item>
+      <el-form-item label="灌溉方式" prop="irrigationType">
+        <el-select v-model="queryParams.irrigationType" placeholder="请选择灌溉方式" clearable>
+          <el-option v-for="dict in dict.type.field_irrigation_type" :key="dict.value" :label="dict.label"
+            :value="dict.value" />
+        </el-select>
+      </el-form-item>
+
+      <el-form-item label="负责人" prop="managerId">
+        <el-input v-model="queryParams.managerId" placeholder="请输入负责人" clearable @keyup.enter.native="handleQuery" />
+      </el-form-item>
+      <!-- <el-form-item label="创建时间" prop="createdTime">
+        <el-date-picker clearable v-model="queryParams.createdTime" type="date" value-format="yyyy-MM-dd"
+          placeholder="请选择创建时间">
+        </el-date-picker>
+      </el-form-item> -->
+
+      <el-form-item label="日期" prop="rangeTime" :width="150">
+        <el-date-picker v-model="queryParams.rangeTime" type="daterange" range-separator="至" start-placeholder="开始日期"
+          end-placeholder="结束日期" value-format="yyyy-MM-dd">
+        </el-date-picker>
+      </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-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="['system:field: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="['system:field: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="['system:field:remove']">删除</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button type="warning" plain icon="el-icon-download" size="mini" @click="handleExport"
+          v-hasPermi="['system:field:export']">导出</el-button>
+      </el-col>
+      <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
+    </el-row>
+
+    <el-table v-loading="loading" :data="fieldList" @selection-change="handleSelectionChange">
+      <el-table-column type="selection" width="55" align="center" />
+      <el-table-column label="地块编号" align="center" prop="fieldCode" />
+      <el-table-column label="地块名称" align="center" prop="fieldName" />
+      <!-- <el-table-column label="所属农场" align="center" prop="farmId" /> -->
+      <el-table-column label="所属农场" align="center" key="deptName" prop="dept.deptName" />
+      <el-table-column label="地块类型" align="center" prop="fieldType">
+        <template slot-scope="scope">
+          <dict-tag :options="dict.type.sys_field_type" :value="scope.row.fieldType" />
+        </template>
+      </el-table-column>
+      <el-table-column label="面积(亩)" align="center" prop="size" />
+      <el-table-column label="种植作物" align="center" prop="growCrops" />
+
+      <el-table-column label="土壤类型" align="center" prop="soilType">
+        <template slot-scope="scope">
+          <dict-tag :options="dict.type.field_soil_type" :value="scope.row.soilType" />
+        </template>
+      </el-table-column>
+      <el-table-column label="灌溉方式" align="center" prop="irrigationType">
+        <template slot-scope="scope">
+          <dict-tag :options="dict.type.field_irrigation_type" :value="scope.row.irrigationType" />
+        </template>
+      </el-table-column>
+      <el-table-column label="使用状态" align="center" prop="status">
+        <template slot-scope="scope">
+          <dict-tag :options="dict.type.field_status" :value="scope.row.status" />
+        </template>
+      </el-table-column>
+
+      <el-table-column label="绑定设备" align="center" prop="bindDeviceCount" />
+      <el-table-column label="绑定人员" align="center" prop="bindUserCount" />
+      <el-table-column label="负责人" align="center" prop="managerName" />
+      <!-- <el-table-column label="地块描述" align="center" prop="description" />
+      <el-table-column label="地理位置数据(GeoJSON格式)" align="center" prop="locationData" /> -->
+      <el-table-column label="创建时间" align="center" prop="createdTime" width="180">
+        <template slot-scope="scope">
+          <span>{{ parseTime(scope.row.createdTime, '{y}-{m}-{d}') }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="上次更新" align="center" prop="updatedTime" width="180">
+        <template slot-scope="scope">
+          <span>{{ parseTime(scope.row.updatedTime, '{y}-{m}-{d}') }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+        <template slot-scope="scope">
+
+          <el-button size="mini" type="text" icon="el-icon-edit" @click="management(scope.row)"
+            v-hasPermi="['system:field:edit']">管理</el-button>
+          <el-button size="mini" type="text" icon="el-icon-edit" @click="handleUpdate(scope.row)"
+            v-hasPermi="['system:field:edit']">修改</el-button>
+          <el-button size="mini" type="text" icon="el-icon-delete" @click="handleDelete(scope.row)"
+            v-hasPermi="['system:field:remove']">删除</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+
+    <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="500px" append-to-body>
+      <el-form ref="form" :model="form" :rules="rules" label-width="80px">
+
+        <el-form-item label="地块名称" prop="fieldName">
+          <el-input v-model="form.fieldName" placeholder="请输入地块名称" />
+        </el-form-item>
+
+        <el-form-item label="地块编号" prop="fieldCode">
+          <el-input v-model="form.fieldCode" placeholder="请输入地块编号" />
+        </el-form-item>
+
+        <!-- <el-form-item label="所属农场" prop="farmId">
+          <el-input v-model="form.farmId" placeholder="请输入所属农场ID" />
+        </el-form-item> -->
+
+        <el-form-item label="所属农场" prop="farmId">
+          <treeselect v-model="form.farmId" :options="deptOptions" :show-count="true" placeholder="请选所属机构"
+            @input='queryPersonCharge(form.farmId)' :disabled="detail" />
+        </el-form-item>
+
+        <el-form-item label="地块类型" prop="fieldType">
+          <el-select v-model="form.fieldType" placeholder="请选择地块类型">
+            <el-option v-for="dict in dict.type.sys_field_type" :key="dict.value" :label="dict.label"
+              :value="dict.value"></el-option>
+          </el-select>
+        </el-form-item>
+
+        <el-form-item label="面积(亩)" prop="size">
+          <el-input v-model="form.size" placeholder="请输入面积(亩)" />
+        </el-form-item>
+
+        <el-form-item label="负责人" prop="managerId">
+          <el-input v-model="form.managerName" placeholder="请输入负责人" />
+        </el-form-item>
+
+        <el-form-item label="种植作物" prop="growCrops">
+          <el-input v-model="form.growCrops" placeholder="请输入种植作物" />
+        </el-form-item>
+
+        <el-form-item label="土壤类型" prop="soilType">
+          <el-select v-model="form.soilType" placeholder="请选择土壤类型">
+            <el-option v-for="dict in dict.type.field_soil_type" :key="dict.value" :label="dict.label"
+              :value="dict.value"></el-option>
+          </el-select>
+        </el-form-item>
+
+        <el-form-item label="灌溉方式" prop="irrigationType">
+          <el-select v-model="form.irrigationType" placeholder="请选择灌溉方式">
+            <el-option v-for="dict in dict.type.field_irrigation_type" :key="dict.value" :label="dict.label"
+              :value="dict.value"></el-option>
+          </el-select>
+        </el-form-item>
+
+        <el-form-item label="使用状态" prop="status">
+          <el-radio-group v-model="form.status">
+            <el-radio v-for="dict in dict.type.field_status" :key="dict.value" :label="dict.value">{{ dict.label
+            }}</el-radio>
+          </el-radio-group>
+        </el-form-item>
+
+        <el-form-item label="地块描述" prop="description">
+          <el-input v-model="form.description" type="textarea" placeholder="请输入内容" />
+        </el-form-item>
+
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitForm">确 定</el-button>
+        <el-button @click="cancel">取 消</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import { listField, getField, delField, addField, updateField } from "@/api/base/field"
+import { deptTreeSelect } from "@/api/system/user";
+import Treeselect from "@riophae/vue-treeselect";
+import "@riophae/vue-treeselect/dist/vue-treeselect.css";
+
+export default {
+  name: "Field",
+  components: { Treeselect },
+  dicts: ['field_status', 'field_irrigation_type', 'field_soil_type','sys_field_type'],
+  data() {
+    return {
+      // 点击详情按钮是否可编辑
+      detail: false,
+      // 遮罩层
+      loading: true,
+      // 选中数组
+      ids: [],
+      // 非单个禁用
+      single: true,
+      // 非多个禁用
+      multiple: true,
+      // 显示搜索条件
+      showSearch: true,
+      // 总条数
+      total: 0,
+      // 地块信息表格数据
+      fieldList: [],
+      // 弹出层标题
+      title: "",
+      // 是否显示弹出层
+      open: false,
+      // 部门树选项
+      deptOptions: undefined,
+      // 查询参数
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        fieldCode: null,
+        fieldName: null,
+        farmId: null,
+        fieldType: null,
+        growCrops: null,
+        size: null,
+        soilType: null,
+        irrigationType: null,
+        status: null,
+        managerId: null,
+        description: null,
+        locationData: null,
+        createdTime: null,
+        updatedTime: null,
+        createdBy: null,
+        updatedBy: null,
+        deptIdList: [],
+        rangeTime: [],
+        isDeleted: null
+      },
+      // 表单参数
+      form: {},
+      // 表单校验
+      rules: {
+        fieldCode: [
+          { required: true, message: "地块编号不能为空", trigger: "blur" }
+        ],
+        fieldName: [
+          { required: true, message: "地块名称不能为空", trigger: "blur" }
+        ],
+        farmId: [
+          { required: true, message: "所属农场ID不能为空", trigger: "blur" }
+        ],
+        fieldType: [
+          { required: true, message: "地块类型不能为空", trigger: "change" }
+        ],
+        growCrops: [
+          { required: true, message: "种植作物(字典)不能为空", trigger: "blur" }
+        ],
+        size: [
+          { required: true, message: "面积(亩)不能为空", trigger: "blur" }
+        ],
+        status: [
+          { required: true, message: "使用状态不能为空", trigger: "change" }
+        ],
+        createdTime: [
+          { required: true, message: "创建时间不能为空", trigger: "blur" }
+        ],
+        updatedTime: [
+          { required: true, message: "更新时间不能为空", trigger: "blur" }
+        ],
+        createdBy: [
+          { required: true, message: "创建人ID不能为空", trigger: "blur" }
+        ],
+        updatedBy: [
+          { required: true, message: "更新人ID不能为空", trigger: "blur" }
+        ],
+        isDeleted: [
+          { required: true, message: "是否删除不能为空", trigger: "blur" }
+        ]
+      }
+    }
+  },
+  created() {
+    this.getList();
+    this.getDeptTree();
+  },
+  methods: {
+    /**查询对应的负责人 */
+    queryPersonCharge() {
+
+    },
+    /** 查询部门下拉树结构 */
+    getDeptTree() {
+      deptTreeSelect().then(response => {
+        this.deptOptions = response.data;
+      });
+    },
+
+    /** 查询地块信息列表 */
+    getList() {
+
+      console.log(this.queryParams);
+      
+      this.loading = true
+      if (null != this.queryParams.rangeTime && '' != this.queryParams.rangeTime) {
+        this.queryParams.params["beginfieldDate"] = this.queryParams.rangeTime[0];
+        this.queryParams.params["endfieldDate"] = this.queryParams.rangeTime[1];
+      }
+      listField(this.queryParams).then(response => {
+        this.fieldList = response.rows
+        this.total = response.total
+        this.loading = false
+      })
+    },
+    // 取消按钮
+    cancel() {
+      this.open = false
+      this.reset()
+    },
+    // 表单重置
+    reset() {
+      this.form = {
+        id: null,
+        fieldCode: null,
+        fieldName: null,
+        farmId: null,
+        fieldType: null,
+        growCrops: null,
+        size: null,
+        soilType: null,
+        irrigationType: null,
+        status: null,
+        managerId: null,
+        description: null,
+        locationData: null,
+        createdTime: null,
+        updatedTime: null,
+        createdBy: null,
+        updatedBy: null,
+        isDeleted: null
+      }
+      this.resetForm("form")
+    },
+    /** 搜索按钮操作 */
+    handleQuery() {
+      this.queryParams.pageNum = 1
+      this.getList()
+    },
+    /** 重置按钮操作 */
+    resetQuery() {
+      this.resetForm("queryForm")
+      this.handleQuery()
+    },
+    // 多选框选中数据
+    handleSelectionChange(selection) {
+      this.ids = selection.map(item => item.id)
+      this.single = selection.length !== 1
+      this.multiple = !selection.length
+    },
+    /** 新增按钮操作 */
+    handleAdd() {
+      this.reset()
+      this.open = true
+      this.title = "添加地块信息"
+    },
+    /** 修改按钮操作 */
+    handleUpdate(row) {
+      this.reset()
+      const id = row.id || this.ids
+      getField(id).then(response => {
+        this.form = response.data
+        this.open = true
+        this.title = "修改地块信息"
+      })
+    },
+
+    /** 管理按钮操作 */
+    management(row) {
+      //console.log(row.id);
+      
+       this.$router.push('/management/index/' + row.id);
+    },
+    /** 提交按钮 */
+    submitForm() {
+      this.$refs["form"].validate(valid => {
+        if (valid) {
+          if (this.form.id != null) {
+            updateField(this.form).then(response => {
+              this.$modal.msgSuccess("修改成功")
+              this.open = false
+              this.getList()
+            })
+          } else {
+            addField(this.form).then(response => {
+              this.$modal.msgSuccess("新增成功")
+              this.open = false
+              this.getList()
+            })
+          }
+        }
+      })
+    },
+    /** 删除按钮操作 */
+    handleDelete(row) {
+      const ids = row.id || this.ids
+      this.$modal.confirm('是否确认删除地块信息编号为"' + ids + '"的数据项?').then(function () {
+        return delField(ids)
+      }).then(() => {
+        this.getList()
+        this.$modal.msgSuccess("删除成功")
+      }).catch(() => { })
+    },
+    /** 导出按钮操作 */
+    handleExport() {
+      this.download('base/field/export', {
+        ...this.queryParams
+      }, `field_${new Date().getTime()}.xlsx`)
+    }
+  }
+}
+</script>

+ 509 - 0
src/views/base/field/management.vue

@@ -0,0 +1,509 @@
+<template>
+  <div class="field-info">
+    <el-tabs v-model="activeTab" @tab-click="handleClick">
+      <el-tab-pane label="基本信息" name="basicInfo">
+        <el-row :gutter="20">
+          <el-form label-width="120px" :inline="true">
+            <el-col :span="6">
+              <el-form-item label="地块编号">
+                <span>{{ basicInfo.fieldCode }}</span>
+              </el-form-item>
+            </el-col>
+
+            <el-col :span="6">
+              <el-form-item label="地块名称">
+                <span>{{ basicInfo.fieldName }}</span>
+              </el-form-item>
+            </el-col>
+
+            <el-col :span="6">
+              <el-form-item label="所属农场">
+                <span>{{ basicInfo.dept.deptName }}</span>
+
+              </el-form-item>
+            </el-col>
+
+            <!--  <el-col :span="6">
+              <el-form-item label="所属区域">
+                <span>{{ basicInfo.region }}</span>
+              </el-form-item>
+            </el-col> -->
+
+
+            <el-col :span="6">
+              <el-form-item label="地块类型">
+                <!-- <span>{{ basicInfo.fieldType }}</span> -->
+                <template slot-scope="scope">
+                  <dict-tag :options="dict.type.sys_field_type" :value="basicInfo.fieldType" />
+                </template>
+              </el-form-item>
+            </el-col>
+
+            <el-col :span="6">
+              <el-form-item label="面积(亩)">
+                <span>{{ basicInfo.size }}</span>
+              </el-form-item>
+            </el-col>
+
+            <el-col :span="6">
+              <el-form-item label="种植作物">
+                <span>{{ basicInfo.growCrops }}</span>
+              </el-form-item>
+            </el-col>
+            <el-col :span="6">
+              <el-form-item label="土壤类型">
+                <!-- <span>{{ basicInfo.soilType }}</span> -->
+                <template slot-scope="scope">
+                  <dict-tag :options="dict.type.field_soil_type" :value="basicInfo.soilType" />
+                </template>
+              </el-form-item>
+            </el-col>
+            <el-col :span="6">
+              <el-form-item label="灌溉方式">
+                <!-- <span>{{ basicInfo.irrigationType }}</span> -->
+                <template slot-scope="scope">
+                  <dict-tag :options="dict.type.field_irrigation_type" :value="basicInfo.irrigationType" />
+                </template>
+              </el-form-item></el-col>
+            <el-col :span="6">
+              <el-form-item label="使用状态">
+                <!-- <el-tag :type="getTagType(basicInfo.status)">{{ basicInfo.status }}</el-tag> -->
+                <template slot-scope="scope">
+                  <dict-tag :options="dict.type.field_status" :value="basicInfo.status" />
+                </template>
+              </el-form-item></el-col>
+            <el-col :span="6">
+              <el-form-item label="绑定设备">
+                <span>{{ basicInfo.devices }}</span>
+              </el-form-item></el-col>
+            <el-col :span="6">
+              <el-form-item label="绑定人员">
+                <span>{{ basicInfo.bindPeople }}</span>
+              </el-form-item>
+            </el-col>
+            <el-col :span="6">
+              <el-form-item label="负责人">
+                <span>{{ basicInfo.managerName }}</span>
+              </el-form-item>
+            </el-col>
+            <el-col :span="6">
+              <el-form-item label="创建时间">
+                <span>{{ basicInfo.createdTime }}</span>
+              </el-form-item></el-col>
+            <el-col :span="6">
+              <el-form-item label="上次更新">
+                <span>{{ basicInfo.updatedTime }}</span>
+              </el-form-item>
+            </el-col>
+          </el-form>
+        </el-row>
+        <!-- <el-card>
+          <el-table :data="cropInfo" style="width: 100%">
+            <el-table-column prop="cropName" label="作物名称"></el-table-column>
+            <el-table-column prop="plantedArea" label="种植面积(亩)"></el-table-column>
+            <el-table-column prop="plantingDate" label="种植时间"></el-table-column>
+            <el-table-column prop="expectedHarvestDate" label="预计收获时间"></el-table-column>
+            <el-table-column prop="status" label="状态">
+              <template slot-scope="scope">
+                <el-tag :type="getTagType(scope.row.status)">{{ scope.row.status }}</el-tag>
+              </template>
+            </el-table-column>
+          </el-table>
+        </el-card> -->
+      </el-tab-pane>
+      <el-tab-pane label="设备绑定" name="deviceBinding">
+        <h1>设备列表</h1>
+        <el-card>
+          <el-tabs type="border-card" @tab-click="handleClickByDevice">
+            <el-tab-pane label="已绑定">
+              <el-table :data="device" style="width: 100%">
+                <el-table-column prop="deviceId" label="设备编号"></el-table-column>
+                <el-table-column prop="deviceName" label="设备名称"></el-table-column>
+                <el-table-column label="设备类型" prop="deviceTypeId">
+                  <template slot-scope="scope">
+                    <dict-tag :options="dict.type.device_type" :value="scope.row.deviceTypeId" />
+                  </template>
+                </el-table-column>
+                <el-table-column prop="status" label="状态">
+                  <template slot-scope="scope">
+
+                    <dict-tag :options="dict.type.device_status" :value="scope.row.status" />
+                  </template>
+                </el-table-column>
+
+                <el-table-column prop="bindTime" label="绑定时间"></el-table-column>
+                <el-table-column label="操作">
+                  <template slot-scope="scope">
+                    <el-button type="text" @click="handleBindStatus(scope.row)">
+                      {{ scope.row.bindStatus === 0 ? '解绑' : '绑定' }}
+                    </el-button>
+                  </template>
+                </el-table-column>
+              </el-table>
+
+            </el-tab-pane>
+            <el-tab-pane label="未绑定">
+              <el-table :data="unDevice" style="width: 100%">
+                <el-table-column prop="deviceId" label="设备编号"></el-table-column>
+                <el-table-column prop="deviceName" label="设备名称"></el-table-column>
+                <el-table-column label="设备类型" prop="deviceTypeId">
+                  <template slot-scope="scope">
+                    <dict-tag :options="dict.type.device_type" :value="scope.row.deviceTypeId" />
+                  </template>
+                </el-table-column>
+                <el-table-column prop="status" label="状态">
+                  <template slot-scope="scope">
+
+                    <dict-tag :options="dict.type.device_status" :value="scope.row.status" />
+                  </template>
+                </el-table-column>
+                <el-table-column label="操作">
+                  <template slot-scope="scope">
+                    <el-button type="text" @click="handleBindStatus(scope.row)">
+                      {{ scope.row.bindStatus === 0 ? '解绑' : '绑定' }}
+                    </el-button>
+                  </template>
+                </el-table-column>
+              </el-table>
+            </el-tab-pane>
+          </el-tabs>
+          <!-- <el-table :data="device" style="width: 100%">
+            <el-table-column prop="deviceId" label="设备编号"></el-table-column>
+            <el-table-column prop="deviceName" label="设备名称"></el-table-column>
+            <el-table-column label="设备类型" prop="deviceTypeId">
+              <template slot-scope="scope">
+                <dict-tag :options="dict.type.device_type" :value="scope.row.deviceTypeId" />
+              </template>
+            </el-table-column>
+            <el-table-column prop="status" label="状态">
+              <template slot-scope="scope">
+          
+                <dict-tag :options="dict.type.device_status" :value="scope.row.status" />
+              </template>
+            </el-table-column>
+
+            <el-table-column prop="bindTime" label="绑定时间"></el-table-column>
+            <el-table-column label="操作">
+              <template slot-scope="scope">
+                <el-button type="text" @click="handleBindStatus(scope.row)">
+                  {{ scope.row.bindStatus === 0 ? '解绑' : '绑定' }}
+                </el-button>
+              </template>
+            </el-table-column>
+          </el-table> -->
+        </el-card>
+      </el-tab-pane>
+      <el-tab-pane label="人员绑定" name="userBinding">
+        <h1>人员列表</h1>
+        <el-card>
+          <el-tabs type="border-card" @tab-click="handleClickByUser">
+            <el-tab-pane label="已绑定">
+              <el-table :data="userBind" style="width: 100%">
+                <!-- <el-table-column prop="cropName" label="工号"></el-table-column> -->
+                <el-table-column prop="userName" label="姓名"></el-table-column>
+                <el-table-column prop="postName" label="职位"></el-table-column>
+                <el-table-column prop="phonenumber" label="联系方式"></el-table-column>
+
+                <el-table-column prop="bindingTime" label="绑定时间"></el-table-column>
+                <el-table-column label="操作">
+                  <template slot-scope="scope">
+                    <el-button type="text" @click="userUnBindStatus(scope.row)">
+                      解绑
+                    </el-button>
+                  </template>
+                </el-table-column>
+              </el-table>
+
+            </el-tab-pane>
+            <el-tab-pane label="未绑定">
+              <el-table :data="userUnBind" style="width: 100%">
+                <!--  <el-table-column prop="cropName" label="工号"></el-table-column> -->
+                <el-table-column prop="userName" label="姓名"></el-table-column>
+                <el-table-column prop="postName" label="职位"></el-table-column>
+                <el-table-column prop="phonenumber" label="联系方式"></el-table-column>
+
+                <!-- <el-table-column prop="bindingTime" label="绑定时间"></el-table-column> -->
+                <el-table-column label="操作">
+                  <template slot-scope="scope">
+                    <el-button type="text" @click="userBindStatus(scope.row)">
+                      绑定
+                    </el-button>
+                  </template>
+                </el-table-column>
+              </el-table>
+            </el-tab-pane>
+          </el-tabs>
+          <!-- <el-table :data="userBind" style="width: 100%">
+            <el-table-column prop="cropName" label="工号"></el-table-column>
+            <el-table-column prop="userName" label="姓名"></el-table-column>
+            <el-table-column prop="postName" label="职位"></el-table-column>
+            <el-table-column prop="phonenumber" label="联系方式"></el-table-column>
+
+            <el-table-column prop="bindingTime" label="绑定时间"></el-table-column>
+            <el-table-column label="操作">
+              <template slot-scope="scope">
+                <el-button type="text" @click="userBindStatus(scope.row)">
+                  {{ scope.row.bindStatus === 0 ? '解绑' : '绑定' }}
+                </el-button>
+              </template>
+            </el-table-column>
+          </el-table> -->
+        </el-card>
+      </el-tab-pane>
+      <el-tab-pane label="区域绘制" name="areaDrawing">
+
+        <map-container></map-container>
+      </el-tab-pane>
+    </el-tabs>
+  </div>
+</template>
+
+<script>
+
+import {
+  getField, getUserField, getDeviceField,
+  bindFieldDevice, unbindFieldDevice, unbindFieldUser,
+  bindFieldUser, getDeviceUnField, getDeviceUnUser
+} from "@/api/base/field"
+import Treeselect from "@riophae/vue-treeselect";
+import "@riophae/vue-treeselect/dist/vue-treeselect.css";
+import MapContainer from "@/components/Map/index";
+
+export default {
+  components: { Treeselect, MapContainer },
+  dicts: ['field_status', 'field_irrigation_type', 'field_soil_type', 'sys_field_type', 'device_type', 'device_status'],
+  data() {
+    return {
+
+
+      activeTab: 'basicInfo',
+      basicInfo: {
+        fieldCode: null,
+        fieldName: null,
+        farmName: null,
+        // region: '东区',
+        fieldType: null,
+        size: null,
+        growCrops: null,
+        soilType: null,
+        irrigationType: null,
+        status: null,
+        devices: null,
+        bindPeople: null,
+        manager: null,
+        createdTime: null,
+        updatedTime: null
+      },
+      cropInfo: [
+        {
+          cropName: null,
+          plantedArea: null,
+          plantingDate: null,
+          expectedHarvestDate: null,
+          status: null
+        }
+      ],
+      device: [
+        {
+          cropName: null,
+          plantedArea: null,
+          plantingDate: null,
+          expectedHarvestDate: null,
+          status: null
+        }
+      ],
+
+      unDevice: [
+        {
+          cropName: null,
+          plantedArea: null,
+          plantingDate: null,
+          expectedHarvestDate: null,
+          status: null
+        }
+      ],
+      userBind: [
+        {
+          userName: null,
+          postName: null,
+          phonenumber: null,
+          bindingTime: null,
+        }
+      ],
+      userUnBind: [
+        {
+          userName: null,
+          postName: null,
+          phonenumber: null,
+          bindingTime: null,
+        }
+      ],
+    };
+  },
+  created() {
+    // 获取传过来的数据,并赋值给本页面中的数据
+    console.log(this.$route.params.id);
+    // this.getDeptTree();
+    getField(this.$route.params.id).then(response => {
+      this.basicInfo = response.data;
+    })
+
+  },
+
+  methods: {
+
+    handleClickByUser(tab, event) {
+      if (tab.index == 0) {
+        getUserField(this.$route.params.id).then(response => {
+          this.userBind = response.data;
+        })
+      } else {
+        getDeviceUnUser(this.$route.params.id).then(response => {
+          this.userUnBind = response.data;
+        })
+      }
+    },
+
+    handleClickByDevice(tab, event) {
+      if (tab.index == 0) {
+        getDeviceField(this.$route.params.id).then(response => {
+          this.device = response.data;
+        })
+      } else {
+        getDeviceUnField(this.$route.params.id).then(response => {
+          this.unDevice = response.data;
+        })
+      }
+    },
+
+
+    /* 切换事件 */
+    handleClick(tab, event) {
+      console.log(tab, event);
+      if (tab.index == 0) {
+        console.log("第一个");
+
+      } else if (tab.index == 1) {
+        getDeviceField(this.$route.params.id).then(response => {
+          this.device = response.data;
+        })
+
+      } else if (tab.index == 2) {
+        getUserField(this.$route.params.id).then(response => {
+          this.userBind = response.data;
+        })
+      } else {
+
+      }
+
+    },
+    /* 绑定解绑操作 */
+    handleBindStatus(row) {
+      let ids = [];
+      ids.push(this.$route.params.id);
+      ids.push(row.id);
+      if (row.bindStatus === 0) {
+        // 执行解绑操作
+        /* console.log('解绑', row);
+        unbindFieldDevice(ids); */
+        this.$modal.confirm('是否确认解绑该设备?').then(function () {
+          return unbindFieldDevice(ids)
+        }).then(() => {
+          getDeviceField(this.$route.params.id).then(response => {
+            this.device = response.data;
+          })
+          this.$modal.msgSuccess("解绑成功")
+        }).catch(() => { })
+
+      } else {
+
+        console.log('绑定设备', row);
+        console.log(ids);
+
+        /* bindFieldDevice(ids); */
+
+        this.$modal.confirm('是否确认绑定该设备?').then(function () {
+          return bindFieldDevice(ids)
+        }).then(() => {
+          getDeviceField(this.$route.params.id).then(response => {
+            this.device = response.data;
+          })
+          this.$modal.msgSuccess("绑定成功")
+        }).catch(() => { })
+      }
+    },
+
+    userBindStatus(row) {
+      let ids = [];
+      ids.push(this.$route.params.id);
+      ids.push(row.userId);
+
+      this.$modal.confirm('是否确认绑定该人员?').then(function () {
+        return bindFieldUser(ids)
+      }).then(() => {
+        getDeviceUnUser(this.$route.params.id).then(response => {
+          this.userUnBind = response.data;
+        })
+        this.$modal.msgSuccess("绑定成功")
+      }).catch(() => { })
+
+    },
+
+
+    userUnBindStatus(row) {
+      let ids = [];
+      ids.push(this.$route.params.id);
+      ids.push(row.userId);
+
+      this.$modal.confirm('是否确认解绑该人员?').then(function () {
+        return unbindFieldUser(ids)
+      }).then(() => {
+        getUserField(this.$route.params.id).then(response => {
+          this.userBind = response.data;
+        })
+        this.$modal.msgSuccess("解绑成功")
+      }).catch(() => { })
+    },
+
+
+    /**查询对应的负责人 */
+    queryPersonCharge() {
+
+    },
+
+    getTagType(status) {
+      switch (status) {
+        case '使用中':
+          return 'success';
+        case '生长中':
+          return 'info';
+        default:
+          return 'danger';
+      }
+    }
+  },
+  unbindDevice(device) {
+    this.$confirm('确认解绑该设备吗?', '提示', {
+      confirmButtonText: '确定',
+      cancelButtonText: '取消',
+      type: 'warning',
+    }).then(() => {
+      this.devices = this.devices.filter(d => d !== device);
+      this.$message.success('解绑成功');
+    }).catch(() => {
+      this.$message.info('已取消解绑');
+    });
+  },
+};
+</script>
+
+<style scoped>
+.field-info {
+  padding: 20px;
+}
+
+#container {
+  width: 100%;
+  height: 800px;
+}
+</style>

+ 2 - 902
src/views/index.vue

@@ -1,906 +1,6 @@
 <template>
-  <div class="app-container home">
-    <el-row :gutter="20">
-      <el-col :sm="24" :lg="12" style="padding-left: 20px">
-        <h2>若依后台管理框架</h2>
-        <p>
-          一直想做一款后台管理系统,看了很多优秀的开源项目但是发现没有合适自己的。于是利用空闲休息时间开始自己写一套后台系统。如此有了若依管理系统,她可以用于所有的Web应用程序,如网站管理后台,网站会员中心,CMS,CRM,OA等等,当然,您也可以对她进行深度定制,以做出更强系统。所有前端后台代码封装过后十分精简易上手,出错概率低。同时支持移动客户端访问。系统会陆续更新一些实用功能。
-        </p>
-        <p>
-          <b>当前版本:</b> <span>v{{ version }}</span>
-        </p>
-        <p>
-          <el-tag type="danger">&yen;免费开源</el-tag>
-        </p>
-        <p>
-          <el-button
-            type="primary"
-            size="mini"
-            icon="el-icon-cloudy"
-            plain
-            @click="goTarget('https://gitee.com/y_project/RuoYi-Cloud')"
-            >访问码云</el-button
-          >
-          <el-button
-            size="mini"
-            icon="el-icon-s-home"
-            plain
-            @click="goTarget('http://ruoyi.vip')"
-            >访问主页</el-button
-          >
-        </p>
-      </el-col>
-
-      <el-col :sm="24" :lg="12" style="padding-left: 50px">
-        <el-row>
-          <el-col :span="12">
-            <h2>技术选型</h2>
-          </el-col>
-        </el-row>
-        <el-row>
-          <el-col :span="6">
-            <h4>后端技术</h4>
-            <ul>
-              <li>SpringBoot</li>
-              <li>SpringCloud</li>
-              <li>Nacos</li>
-              <li>Sentinel</li>
-              <li>Seata</li>
-              <li>Minio</li>
-              <li>...</li>
-            </ul>
-          </el-col>
-          <el-col :span="6">
-            <h4>前端技术</h4>
-            <ul>
-              <li>Vue</li>
-              <li>Vuex</li>
-              <li>Element-ui</li>
-              <li>Axios</li>
-              <li>Echarts</li>
-              <li>Quill</li>
-              <li>...</li>
-            </ul>
-          </el-col>
-        </el-row>
-      </el-col>
-    </el-row>
-    <el-divider />
-    <el-row :gutter="20">
-      <el-col :xs="24" :sm="24" :md="12" :lg="8">
-        <el-card class="update-log">
-          <div slot="header" class="clearfix">
-            <span>联系信息</span>
-          </div>
-          <div class="body">
-            <p>
-              <i class="el-icon-s-promotion"></i> 官网:<el-link
-                href="http://www.ruoyi.vip"
-                target="_blank"
-                >http://www.ruoyi.vip</el-link
-              >
-            </p>
-            <p>
-              <i class="el-icon-user-solid"></i> QQ群: <s> 满42799195 </s>  <s> 满170157040 </s>
-              <s> 满130643120 </s> <s> 满225920371 </s> <s> 满201705537 </s> <s> 满236543183 </s>
-              <s> 满213618602 </s> <s> 满148794840 </s> <s> 满118752664 </s> <s> 满101038945 </s>
-              <s> 满128355254 </s> <s> 满179219821 </s> <a href="http://qm.qq.com/cgi-bin/qm/qr?_wv=1027&k=Z6j1amUmIPBXamuZzxpwjY8GwaP45XB6&authKey=zfSnxECfnScfY1HLCWilSqCq%2BmSVtr%2Bi%2F4oXeBcuQVwlq6XlrAfbZ0awp3%2B4Bdec&noverify=0&group_code=158753145" target="_blank">158753145</a>
-            </p>
-            <p>
-              <i class="el-icon-chat-dot-round"></i> 微信:<a
-                href="javascript:;"
-                >/ *若依</a
-              >
-            </p>
-            <p>
-              <i class="el-icon-money"></i> 支付宝:<a
-                href="javascript:;"
-                class="支付宝信息"
-                >/ *若依</a
-              >
-            </p>
-          </div>
-        </el-card>
-      </el-col>
-      <el-col :xs="24" :sm="24" :md="12" :lg="8">
-        <el-card class="update-log">
-          <div slot="header" class="clearfix">
-            <span>更新日志</span>
-          </div>
-          <el-collapse accordion>
-            <el-collapse-item title="v3.6.5 - 2024-11-13">
-              <ol>
-                <li>使用SpringDoc代替Swagger</li>
-                <li>菜单管理新增路由名称</li>
-                <li>新增数据脱敏过滤注解</li>
-                <li>限制用户操作数据权限范围</li>
-                <li>支持自定义显示Excel属性列</li>
-                <li>操作日志记录DELETE请求参数</li>
-                <li>用户登录后记录最后登录IP&时间</li>
-                <li>升级druid到最新版本1.2.23</li>
-                <li>升级fastjson到最新版2.0.53</li>
-                <li>升级dynamic-ds到最新版本4.3.1</li>
-                <li>升级spring-cloud到最新版2021.0.9</li>
-                <li>升级spring-boot-admin到最新版2.7.16</li>
-                <li>升级spring-cloud-alibaba到最新版2021.0.6.1</li>
-                <li>升级quill到最新版本2.0.2</li>
-                <li>升级axios到最新版本0.28.1</li>
-                <li>升级core-js到最新版本3.37.1</li>
-                <li>升级其他依赖到安全版本,防止漏洞风险</li>
-                <li>修复角色禁用权限不失效问题</li>
-                <li>优化身份证脱敏正则</li>
-                <li>优化权限更新后同步缓存</li>
-                <li>优化查询时间范围日期格式</li>
-                <li>优化代码生成上级菜单字段类型</li>
-                <li>优化无用户编号不校验数据权限</li>
-                <li>优化代码生成主子表关联查询方式</li>
-                <li>优化校检文件名是否包含特殊字符</li>
-                <li>优化查表特殊字符使用反斜杠进行转义</li>
-                <li>优化多个自定数据权限使用in查询,避免多次拼接</li>
-                <li>其他细节优化</li>
-              </ol>
-            </el-collapse-item>
-            <el-collapse-item title="v3.6.4 - 2024-04-01">
-              <ol>
-                <li>全局数据存储用户编号</li>
-                <li>用户密码新增非法字符验证</li>
-                <li>代码生成支持选择前端模板类型</li>
-                <li>操作日志列表新增IP地址查询</li>
-                <li>显隐列组件支持复选框弹出类型</li>
-                <li>Excel注解ColumnType类型新增文本</li>
-                <li>Excel自定义数据处理器增加单元格/工作簿对象</li>
-                <li>升级element-ui到最新版本2.15.14</li>
-                <li>升级compression-webpack-plugin到6.1.2以兼容node18+</li>
-                <li>升级druid到最新版本1.2.20</li>
-                <li>升级fastjson到最新版2.0.43</li>
-                <li>升级pagehelper到最新版2.0.0</li>
-                <li>升级dynamic-ds到最新版本4.2.0</li>
-                <li>升级commons.io到最新版本2.13.0</li>
-                <li>升级spring-boot到最新版本2.7.18</li>
-                <li>升级spring-boot-admin到最新版2.7.15</li>
-                <li>升级transmittable-thread-local到最新版本2.14.4</li>
-                <li>修复五级路由缓存无效问题</li>
-                <li>修复外链带端口出现的异常</li>
-                <li>修复内链iframe没有传递参数问题</li>
-                <li>修复自定义字典样式不生效的问题</li>
-                <li>修复字典缓存删除方法参数错误问题</li>
-                <li>修复Excel导入数据临时文件无法删除问题</li>
-                <li>修复未登录带参数访问成功后参数丢失问题</li>
-                <li>修复HeaderSearch组件跳转query参数丢失问题</li>
-                <li>修复数据字典列表页重置后标签值无法输入问题</li>
-                <li>修复Excels导入时无法获取到readConverterExp内容转表达式问题</li>
-                <li>优化Xss注解匹配方式</li>
-                <li>优化权限字符匹配方式</li>
-                <li>优化下载zip方法新增遮罩层</li>
-                <li>优化头像上传参数新增文件名称</li>
-                <li>优化字典标签支持自定义分隔符</li>
-                <li>优化定时任务白名单配置范围缩小</li>
-                <li>优化菜单管理类型为按钮状态可选</li>
-                <li>优化前端防重复提交数据大小限制</li>
-                <li>优化TopNav菜单没有图标svg不显示</li>
-                <li>优化富文本Editor组件检验图片格式</li>
-                <li>优化数字金额大写转换精度丢失问题</li>
-                <li>优化个人中心/基本资料修改时数据显示问题</li>
-                <li>其他细节优化</li>
-              </ol>
-            </el-collapse-item>
-            <el-collapse-item title="v3.6.3 - 2023-07-07">
-              <ol>
-                <li>支持登录IP黑名单限制</li>
-                <li>操作日志新增消耗时间属性</li>
-                <li>屏蔽定时任务bean违规的字符</li>
-                <li>日志管理使用索引提升查询性能</li>
-                <li>日志注解支持排除指定的请求参数</li>
-                <li>支持自定义隐藏属性列过滤子对象</li>
-                <li>升级spring-boot到最新版本2.7.13</li>
-                <li>升级spring-cloud到最新版2021.0.8</li>
-                <li>升级spring-cloud-alibaba到最新版2021.0.5.0</li>
-                <li>升级druid到最新版本1.2.16</li>
-                <li>升级fastjson到最新版2.0.34</li>
-                <li>升级pagehelper到最新版1.4.7</li>
-                <li>升级transmittable-thread-local到最新版本2.14.3</li>
-                <li>升级element-ui到最新版本2.15.13</li>
-                <li>移除apache/commons-fileupload依赖</li>
-                <li>修复页面切换时布局错乱的问题</li>
-                <li>修复用户多角色数据权限可能出现权限抬升的情况</li>
-                <li>修复导入用户时无法更新存在用户数据的问题</li>
-                <li>修复开启TopNav后一级菜单路由参数设置无效问题</li>
-                <li>优化文件下载出现的异常</li>
-                <li>优化选择图标组件高亮回显</li>
-                <li>优化修改密码日志存储明文问题</li>
-                <li>优化排序属性orderBy参数限制长度</li>
-                <li>优化页签栏关闭其他出现的异常问题</li>
-                <li>优化页签关闭左侧选项排除首页选项</li>
-                <li>优化关闭当前tab页跳转最右侧tab页</li>
-                <li>优化文件上传服务关闭InputStream</li>
-                <li>优化页签在Firefox浏览器被遮挡的问题</li>
-                <li>优化侧边栏的平台标题与VUE_APP_TITLE保持同步</li>
-                <li>优化DictTag组件value没有匹配的值时则展示value</li>
-                <li>优化去除@EnableCustomSwagger注解后会启动失败问题</li>
-                <li>优化upload接口在文件过大和文件名过长的情况返回提示信息</li>
-                <li>优化异步保存日志发生报错不进RemoteLogFallbackFactory问题</li>
-                <li>其他细节优化</li>
-              </ol>
-            </el-collapse-item>
-            <el-collapse-item title="v3.6.2 - 2023-01-16">
-              <ol>
-                <li>重置时取消部门选中</li>
-                <li>新增返回警告消息提示</li>
-                <li>忽略不必要的属性数据返回</li>
-                <li>修改参数键名时移除前缓存配置</li>
-                <li>开启TopNav没有子菜单隐藏侧边栏</li>
-                <li>删除fuse无效选项maxPatternLength</li>
-                <li>兼容Excel下拉框内容过多无法显示的问题</li>
-                <li>修复文件上传组件格式验证问题</li>
-                <li>修复回显数据字典数组异常问题</li>
-                <li>修复sheet超出最大行数异常问题</li>
-                <li>修复Log注解GET请求记录不到参数问题</li>
-                <li>修复gateway流控规则生效但不显示问题</li>
-                <li>修复主题颜色在Drawer组件不会加载问题</li>
-                <li>修复调度日志点击多次数据不变化的问题</li>
-                <li>修复用户编辑时角色和部门存在无法修改情况</li>
-                <li>修复使用透明底png图片时,自动填充黑色背景</li>
-                <li>修复table中更多按钮切换主题色未生效修复问题</li>
-                <li>修复某些特性的环境生成代码变乱码TXT文件问题</li>
-                <li>修复代码生成图片/文件/单选时选择必填无法校验问题</li>
-                <li>升级spring-cloud到最新版2021.0.5</li>
-                <li>升级spring-boot到最新版本2.7.7</li>
-                <li>升级spring-boot-admin到最新版2.7.10</li>
-                <li>升级kaptcha到最新版2.3.3</li>
-                <li>升级druid到最新版本1.2.15</li>
-                <li>升级fastjson到最新版2.0.22</li>
-                <li>升级pagehelper到最新版1.4.6</li>
-                <li>升级transmittable-thread-local到最新版本2.14.2</li>
-                <li>升级echarts到最新版本5.4.0</li>
-                <li>升级core-js到最新版本3.25.3</li>
-                <li>升级element-ui到最新版本2.15.12</li>
-                <li>移除commons-collections多余的依赖</li>
-                <li>优化弹窗内容过多展示不全问题</li>
-                <li>优化导出对象的子列表为空会出现[]问题</li>
-                <li>优化字符未使用下划线不进行驼峰式处理</li>
-                <li>优化nacos修改xss开关时同步过滤器验证</li>
-                <li>优化修改头像在小屏幕上页面布局错位的问题</li>
-                <li>其他细节优化</li>
-              </ol>
-            </el-collapse-item>
-            <el-collapse-item title="v3.6.1 - 2022-10-01">
-              <ol>
-                <li>数据逻辑删除不进行唯一验证</li>
-                <li>支持多权限字符匹配角色数据权限</li>
-                <li>页面内嵌iframe切换tab不刷新数据</li>
-                <li>新增密码最大错误次数/锁定时间</li>
-                <li>登录日志新增解锁账户功能</li>
-                <li>通用下载方法新增config配置选项</li>
-                <li>操作日志记录支持排除敏感属性字段</li>
-                <li>Excel注解支持导出对象的子列表方法</li>
-                <li>Excel注解支持自定义隐藏属性列</li>
-                <li>Excel注解支持backgroundColor属性设置背景色</li>
-                <li>升级spring-cloud-alibaba到最新版2021.0.4.0</li>
-                <li>升级spring-cloud到最新版2021.0.4</li>
-                <li>升级spring-boot到最新版本2.7.3</li>
-                <li>升级spring-boot-admin到最新版2.7.5</li>
-                <li>升级seata到最新版1.5.2</li>
-                <li>升级druid到最新版本1.2.12</li>
-                <li>升级fastjson到最新版2.0.14</li>
-                <li>升级pagehelper到最新版1.4.5</li>
-                <li>升级core-js到最新版本3.25.2</li>
-                <li>升级dynamic-ds到最新版本3.5.2</li>
-                <li>升级element-ui到最新版本2.15.10</li>
-                <li>修复多文件上传报错出现的异常问题</li>
-                <li>修复图片预览组件src属性为null值控制台报错问题</li>
-                <li>修复使用FastDFS上传头像失败提示文件名没有后缀问题</li>
-                <li>优化seata单独依赖模块</li>
-                <li>优化任务过期不执行调度</li>
-                <li>优化字典数据使用store存取</li>
-                <li>优化代码生成同步后值NULL问题</li>
-                <li>优化定时任务支持执行父类方法</li>
-                <li>优化修改资料头像被覆盖的问题</li>
-                <li>优化修改用户登录账号重复验证</li>
-                <li>优化用户个人信息接口防止修改部门</li>
-                <li>优化布局设置使用el-drawer抽屉显示</li>
-                <li>优化日志注解记录限制请求地址的长度</li>
-                <li>优化导入更新用户数据前校验数据权限</li>
-                <li>优化excel/scale属性导出单元格数值类型</li>
-                <li>优化日志操作中重置按钮时重复查询的问题</li>
-                <li>优化多个相同角色数据导致权限SQL重复问题</li>
-                <li>优化表格上右侧工具条(搜索按钮显隐&右侧样式凸出)</li>
-                <li>其他细节优化</li>
-              </ol>
-            </el-collapse-item>
-            <el-collapse-item title="v3.6.0 - 2022-07-16">
-              <ol>
-                <li>Excel注解支持color字体颜色</li>
-                <li>用户头像上传限制只能为图片格式</li>
-                <li>检查定时任务bean所在包名是否为白名单配置</li>
-                <li>字典类型必须以字母开头,且只能为(小写字母,数字,下滑线)</li>
-                <li>升级spring-cloud-alibaba到最新版2021.0.1.0</li>
-                <li>升级spring-cloud到最新版2021.0.3</li>
-                <li>升级spring-boot到最新版本2.7.1</li>
-                <li>升级spring-boot-admin到最新版2.7.2</li>
-                <li>升级seata到最新版1.5.1</li>
-                <li>升级pagehelper到最新版1.4.3</li>
-                <li>升级dynamic-ds到最新版本3.5.1</li>
-                <li>升级fastjson到最新版2.0.9</li>
-                <li>升级druid到最新版本1.2.11</li>
-                <li>升级transmittable-thread-local到最新版本2.13.2</li>
-                <li>升级element-ui到最新版本2.15.9</li>
-                <li>修复字典数据显示不全问题</li>
-                <li>修复操作日志查询类型条件为0时会查到所有数据</li>
-                <li>优化验证码开关变量名</li>
-                <li>优化设置分页参数默认值</li>
-                <li>优化对空字符串参数处理的过滤</li>
-                <li>优化Maven使用阿里云镜像站加速</li>
-                <li>优化用户列表查询不显示密码字段</li>
-                <li>优化表单构建按钮不显示正则校验</li>
-                <li>优化字典类型删除多余的mapper注解</li>
-                <li>优化字典数据回显样式下拉框显示值</li>
-                <li>优化用户管理左侧树型组件增加选中高亮保持</li>
-                <li>优化新增用户与角色信息&用户与岗位信息逻辑</li>
-                <li>优化数据监控Spring Security权限认证过时代码</li>
-                <li>优化岗位长主键溢出问题将查询返回类型改为Long</li>
-                <li>优化删除无用admin-client依赖声明,避免造成误解</li>
-                <li>优化默认不启用压缩文件缓存防止node_modules过大</li>
-                <li>优化获取body请求数据缓存过滤器CacheRequestFilter</li>
-                <li>优化网关通过注解解决循环引用及Bean重复问题删除allow配置</li>
-                <li>其他细节优化</li>
-              </ol>
-            </el-collapse-item>
-            <el-collapse-item title="v3.5.0 - 2022-04-11">
-              <ol>
-                <li>开启TopNav没有子菜单情况隐藏侧边栏</li>
-                <li>侧边栏菜单名称过长悬停显示标题</li>
-                <li>用户访问控制时校验数据权限,防止越权</li>
-                <li>导出Excel时屏蔽公式,防止CSV注入风险</li>
-                <li>组件ImageUpload支持多图同时选择上传</li>
-                <li>组件FileUpload支持多文件同时选择上传</li>
-                <li>代码生成树表新增(展开/折叠)</li>
-                <li>代码生成子表支持日期/字典配置</li>
-                <li>代码生成编辑修改打开新页签</li>
-                <li>添加页签openPage支持传递参数</li>
-                <li>添加清理分页的线程变量方法</li>
-                <li>修改npm即将过期的注册源地址</li>
-                <li>用户缓存信息添加部门ancestors祖级列表</li>
-                <li>升级spring-cloud到最新版2021.0.1</li>
-                <li>升级spring-boot到最新版本2.6.6</li>
-                <li>升级spring-boot-admin到最新版2.6.6</li>
-                <li>升级spring-boot-mybatis到最新版2.2.2</li>
-                <li>降级jsencrypt版本兼容IE浏览器</li>
-                <li>修复分页组件请求两次问题</li>
-                <li>修复表单清除元素位置未垂直居中问题</li>
-                <li>修复Excel注解prompt/combo同时使用不生效问题</li>
-                <li>修复导入Excel时字典字段类型为Long转义为空问题</li>
-                <li>修复登录超时刷新页面跳转登录页面还提示重新登录问题</li>
-                <li>修复Xss注解字段值为空时的异常问题</li>
-                <li>优化IP地址获取到多个的问题</li>
-                <li>优化文件上传兼容Weblogic环境</li>
-                <li>代码生成同步保留必填/类型选项</li>
-                <li>优化Excel格式化不同类型的日期对象</li>
-                <li>优化菜单表关键字导致的插件报错问题</li>
-                <li>优化Oracle用户头像列为空时不显示问题</li>
-                <li>优化页面若未匹配到字典标签则返回原字典值</li>
-                <li>优化修复登录失效后多次请求提示多次弹窗问题</li>
-                <li>其他细节优化</li>
-              </ol>
-            </el-collapse-item>
-            <el-collapse-item title="v3.4.0 - 2022-01-24">
-              <ol>
-                <li>新增Vue3前端代码生成模板</li>
-                <li>新增图片预览组件</li>
-                <li>新增压缩插件实现打包Gzip</li>
-                <li>新增docker一键复制的脚本</li>
-                <li>自定义xss校验注解实现</li>
-                <li>路由支持单独配置菜单或角色权限</li>
-                <li>前端支持设置是否需要防止数据重复提交</li>
-                <li>预览组件支持多图显示</li>
-                <li>代码生成列表图片支持预览</li>
-                <li>代码生成新增Java类型Boolean</li>
-                <li>定时任务目标字符串过滤特殊字符</li>
-                <li>定时任务目标字符串验证包名白名单</li>
-                <li>升级nacos到最新版2.0.4</li>
-                <li>升级spring-cloud到最新版2021.0.0</li>
-                <li>升级spring-boot到最新版本2.6.3</li>
-                <li>升级spring-boot-admin到最新版2.6.1</li>
-                <li>升级pagehelper到最新版1.4.1</li>
-                <li>升级fastjson到最新版1.2.79</li>
-                <li>SQL工具类新增检查关键字方法</li>
-                <li>修复打包后字体图标偶现的乱码问题</li>
-                <li>修复版本差异导致的懒加载报错问题</li>
-                <li>修复选项卡点击右键刷新丢失参数问题</li>
-                <li>修复登录失效后多次请求提示多次弹窗问题</li>
-                <li>优化加载字典缓存数据</li>
-                <li>优化代码生成同步更新字段</li>
-                <li>优化代码生成字典组重复问题</li>
-                <li>优化空值不进行回显数据字典</li>
-                <li>优化用户导入提示溢出则显示滚动条</li>
-                <li>优化定时任务cron表达式小时设置24</li>
-                <li>优化部门修改缩放后出现的错位问题</li>
-                <li>优化分页方法设置成通用方便灵活调用</li>
-                <li>优化用户管理部门查询选择节点后分页参数初始</li>
-                <li>其他细节优化</li>
-              </ol>
-            </el-collapse-item>
-            <el-collapse-item title="v3.3.0 - 2021-12-13">
-              <ol>
-                <li>新增配套并同步的Vue3前端版本</li>
-                <li>新增认证对象简化权限验证</li>
-                <li>新增tab对象简化页签操作</li>
-                <li>修改获取缓存信息方式</li>
-                <li>修改权限认证注解实现</li>
-                <li>自定义文字复制剪贴指令</li>
-                <li>升级axios到最新版本0.24.0</li>
-                <li>升级core-js到最新版本3.19.1</li>
-                <li>升级jsencrypt到最新版本3.2.1</li>
-                <li>升级js-cookie到最新版本3.0.1</li>
-                <li>升级clipboard到最新版本2.0.8</li>
-                <li>升级velocity到最新版本2.3</li>
-                <li>升级spring-boot到最新版本2.5.6</li>
-                <li>升级spring-boot-admin到最新版2.5.4</li>
-                <li>升级dynamic-ds到最新版本3.5.0</li>
-                <li>代码生成预览支持复制内容</li>
-                <li>修复五级以上菜单出现的404问题</li>
-                <li>生产环境使用路由懒加载提升页面响应速度</li>
-                <li>任务屏蔽违规字符&参数忽略双引号中的逗号</li>
-                <li>优化用户个人信息接口防止修改用户名</li>
-                <li>优化登录/验证码请求headers不设置token</li>
-                <li>优化注册成功提示消息类型success</li>
-                <li>优化下载解析blob响应是否登录失效</li>
-                <li>修复字符串无法被反转义问题</li>
-                <li>修复响应体过大出现的乱码问题</li>
-                <li>修复回显数据字典组的键值错误</li>
-                <li>修复代码生成复选框字典遗漏问题</li>
-                <li>修复代码生成模板主子表删除缺少事务</li>
-                <li>其他细节优化</li>
-              </ol>
-            </el-collapse-item>
-            <el-collapse-item title="v3.2.0 - 2021-10-12">
-              <ol>
-                <li>菜单管理支持配置路由参数</li>
-                <li>定时任务支持在线生成cron表达式</li>
-                <li>自定义弹层溢出滚动样式</li>
-                <li>自定义可拖动弹窗宽度指令</li>
-                <li>自定义可拖动弹窗高度指令</li>
-                <li>修改时检查用户数据权限范围</li>
-                <li>修复保存配置主题颜色失效问题</li>
-                <li>新增暗色菜单风格主题</li>
-                <li>菜单&部门新增展开/折叠功能</li>
-                <li>页签新增关闭左侧&添加图标</li>
-                <li>代码生成主子表多选行数据</li>
-                <li>日期范围支持添加多组</li>
-                <li>Excel导入支持@Excels注解</li>
-                <li>Excel注解支持导入导出标题信息</li>
-                <li>Excel注解支持自定义数据处理器</li>
-                <li>日志注解新增是否保存响应参数</li>
-                <li>定时任务对检查异常进行事务回滚</li>
-                <li>补充定时任务表字段注释</li>
-                <li>定时任务屏蔽ldap远程调用</li>
-                <li>新增通用方法简化下载使用</li>
-                <li>新增通用方法简化模态/缓存使用</li>
-                <li>新增data-dict组件简化数据字典使用</li>
-                <li>禁用dict-tag组件的渐变动画</li>
-                <li>默认首页使用keep-alive缓存</li>
-                <li>升级springcloud到最新版2020.0.4</li>
-                <li>升级spring-boot到最新版本2.5.5</li>
-                <li>升级spring-boot-admin到最新版2.5.2</li>
-                <li>升级pagehelper到最新版1.4.0</li>
-                <li>升级fastjson到最新版1.2.78</li>
-                <li>升级druid到最新版1.2.8</li>
-                <li>升级element-ui到最新版本2.15.6</li>
-                <li>升级sass-loader到最新版本10.1.1</li>
-                <li>升级dart-sass到版本1.32.13</li>
-                <li>升级file-saver到最新版本2.0.5</li>
-                <li>优化异常处理信息</li>
-                <li>验证码默认20s超时</li>
-                <li>优化代码生成导入表按创建时间排序</li>
-                <li>优化代码生成点击预览重置激活tab</li>
-                <li>修复主子表代码模板方法名错误问题</li>
-                <li>修复xss过滤后格式出现的异常</li>
-                <li>修复多图组件验证失败被删除问题</li>
-                <li>请求参数新增reasonable分页合理化属性</li>
-                <li>修复代码生成页面数据编辑保存之后总是跳转第一页的问题</li>
-                <li>修复带safari浏览器无法格式化utc日期格式yyyy-MM-dd'T'HH:mm:ss.SSS问题</li>
-                <li>其他细节优化</li>
-              </ol>
-            </el-collapse-item>
-            <el-collapse-item title="v3.1.0 - 2021-08-02">
-              <ol>
-                <li>支持配置XSS跨站脚本过滤</li>
-                <li>支持配置验证码开关&类型</li>
-                <li>新增是否开启用户注册功能</li>
-                <li>用户管理新增分配角色功能</li>
-                <li>角色管理新增分配用户功能</li>
-                <li>系统布局配置支持动态标题开关</li>
-                <li>增加字典标签样式回显dict组件</li>
-                <li>FileUpload组件支持多文件上传</li>
-                <li>ImageUpload组件支持多图片上传</li>
-                <li>封装通用iframe组件</li>
-                <li>菜单路由配置支持内链访问</li>
-                <li>全局注册通用组件</li>
-                <li>富文本默认上传返回url类型</li>
-                <li>富文本新增上传文件大小限制</li>
-                <li>增加自定义弹窗拖拽指令</li>
-                <li>顶部菜单排除隐藏的默认路由</li>
-                <li>跳转路由高亮相对应的菜单栏</li>
-                <li>日志列表支持排序操作</li>
-                <li>分页组件新增pagerCount属性</li>
-                <li>定时任务屏蔽http(s)远程调用</li>
-                <li>文件服务本地资源允许跨域访问</li>
-                <li>升级spring-boot到最新版本2.5.3</li>
-                <li>升级spring-boot-admin到最新版2.4.3</li>
-                <li>升级spring-boot-mybatis到最新版2.2.0</li>
-                <li>升级nacos到最新版2.0.3</li>
-                <li>升级pagehelper到最新版1.3.1</li>
-                <li>升级minio到最新版本8.2.2</li>
-                <li>升级tobato到最新版本1.27.2</li>
-                <li>升级dynamic-ds到最新版本3.4.1</li>
-                <li>升级commons.io到最新版本v2.11.0</li>
-                <li>升级common-pool到最新版本2.10.0</li>
-                <li>升级commons.fileupload到最新版本v1.4</li>
-                <li>升级element-ui到最新版本2.15.3</li>
-                <li>优化统一网关错误码响应</li>
-                <li>修复导出含params属性对象参数问题</li>
-                <li>修复任意账户越权问题</li>
-                <li>修复定时任务日志执行状态显示</li>
-                <li>修改登录失效返回值code401</li>
-                <li>用户信息长度校验限制</li>
-                <li>角色&菜单新增字段属性提示信息</li>
-                <li>修复用户搜索分页变量错误</li>
-                <li>优化部门父级启用状态</li>
-                <li>启用部门状态排除顶级节点</li>
-                <li>定时任务新增更多操作</li>
-                <li>优化代码生成模板</li>
-                <li>优化顶部菜单显示样式</li>
-                <li>优化导入用户显示样式</li>
-                <li>优化用户不能删除自己</li>
-                <li>密码框新增显示切换密码图标</li>
-                <li>BLOB下载时清除URL对象引用</li>
-                <li>其他细节优化</li>
-              </ol>
-            </el-collapse-item>
-            <el-collapse-item title="v3.0.0 - 2021-06-10">
-              <ol>
-                <li>新增菜单导航显示风格TopNav(false为左侧导航菜单,true为顶部导航菜单)</li>
-                <li>布局设置支持保存&重置配置</li>
-                <li>富文本编辑器支持自定义上传地址</li>
-                <li>富文本编辑组件新增readOnly属性</li>
-                <li>优化参数&字典缓存操作</li>
-                <li>新增IE浏览器版本过低提示页面</li>
-                <li>页签TagsView新增关闭右侧功能</li>
-                <li>显隐列组件加载初始默认隐藏列</li>
-                <li>关闭头像上传窗口还原默认图片</li>
-                <li>个人信息添加手机&邮箱重复验证</li>
-                <li>代码生成模板树表操作列添加新增按钮</li>
-                <li>代码生成模板修复主子表字段重名问题</li>
-                <li>支持docker部署项目</li>
-                <li>升级springcloud到最新版2020.0.3</li>
-                <li>升级spring-boot-alibaba到最新版2021.1</li>
-                <li>升级nacos到最新版2.0.1 性能提升</li>
-                <li>升级spring-boot到最新版本2.5.0</li>
-                <li>升级spring-boot-admin到最新版2.4.1</li>
-                <li>升级swagger到最新版本3.0.0</li>
-                <li>升级mybatis到最新版3.5.6</li>
-                <li>升级dynamic-ds到最新版本3.3.2</li>
-                <li>升级minio到最新版本8.2.1</li>
-                <li>升级fastjson到最新版1.2.76</li>
-                <li>升级druid到最新版本v1.2.6</li>
-                <li>修复四级菜单无法显示问题</li>
-                <li>修复树表数据显示不全&加载慢问题</li>
-                <li>修复关闭confirm提示框控制台报错问题</li>
-                <li>上传媒体类型添加视频格式</li>
-                <li>增加feign客户端IP头部信息</li>
-                <li>修复两处存在SQL注入漏洞问题</li>
-                <li>优化图片工具类读取文件,防止异常</li>
-                <li>修复导出角色数据范围翻译缺少仅本人</li>
-                <li>修复表单构建选择下拉选择控制台报错问题</li>
-                <li>修复请求形参未传值记录日志异常问题</li>
-                <li>调整sql默认为当前时间</li>
-                <li>修改ip字段长度防止ipv6地址长度不够</li>
-                <li>删除操作日志记录信息</li>
-                <li>修复firefox下表单构建拖拽会新打卡一个选项卡</li>
-                <li>用户&角色单条删除时使其逻辑删除</li>
-                <li>优化树表代码生成模板</li>
-                <li>修正通知公告日志记录类型</li>
-                <li>修正后端导入表权限标识</li>
-                <li>过滤BindingResult对象,防止异常</li>
-                <li>Redis设置HashKey序列化</li>
-                <li>优化Excel导入增加空行判断</li>
-                <li>树级结构更新子节点使用replaceFirst</li>
-                <li>富文本工具栏配置视频</li>
-                <li>修正模板字符编码</li>
-                <li>优化通用下载完成后删除节点</li>
-                <li>角色非自定义权限范围清空选择值</li>
-                <li>修改主题后mini类型按钮无效问题</li>
-                <li>其他细节优化</li>
-              </ol>
-            </el-collapse-item>
-            <el-collapse-item title="v2.5.0 - 2021-02-02">
-              <ol>
-                <li>增加分布式事务seata支持</li>
-                <li>代码生成模板支持主子表</li>
-                <li>表格右侧工具栏组件支持显隐列</li>
-                <li>图片组件添加预览&移除功能</li>
-                <li>Excel注解支持Image图片导出</li>
-                <li>操作按钮组调整为朴素按钮样式</li>
-                <li>代码生成支持文件上传组件</li>
-                <li>代码生成日期控件区分范围</li>
-                <li>代码生成数据库文本类型生成表单文本域</li>
-                <li>用户手机邮箱&菜单组件修改允许空字符串</li>
-                <li>修复header获取username中文情况下乱码</li>
-                <li>修复角色管理-编辑角色-功能权限显示异常</li>
-                <li>修正操作日志删除接口路径</li>
-                <li>修复IE11浏览器报错问题</li>
-                <li>修复sentinel流量告警前端不响应</li>
-                <li>修正侧边栏静态路由丢失问题</li>
-                <li>修复导入数据为负浮点数时丢失精度问题</li>
-                <li>修复Get请求参数特殊值无法正确的传参</li>
-                <li>更换过期的共享配置属性</li>
-                <li>添加启动执行脚本</li>
-                <li>升级element-ui到最新版本2.15.0</li>
-                <li>升级spring-boot到最新版本2.3.7</li>
-                <li>升级spring-cloud到Hoxton.SR9</li>
-                <li>升级spring-boot-alibaba到最新版2.2.5</li>
-                <li>升级spring-boot-admin到最新版2.3.1</li>
-                <li>升级druid到最新版本v1.2.4</li>
-                <li>升级fastjson到最新版1.2.75</li>
-                <li>其他细节优化</li>
-              </ol>
-            </el-collapse-item>
-            <el-collapse-item title="v2.4.0 - 2020-12-22">
-              <ol>
-                <li>增加分布式文件Minio支持</li>
-                <li>支持多数据源切换</li>
-                <li>修复多级菜单之间切换无法缓存的问题</li>
-                <li>三级菜单自动配置组件</li>
-                <li>支持主题风格配置</li>
-                <li>服务之间feign调用传递用户信息</li>
-                <li>删除用户和角色解绑关联</li>
-                <li>去除用户手机邮箱部门必填验证</li>
-                <li>代码生成预览支持高亮显示</li>
-                <li>获取请求token方法移至权限工具类</li>
-                <li>代码生成预览提供滚动机制</li>
-                <li>权限工具类增加管理员判断</li>
-                <li>日志记录增加过滤多文件场景</li>
-                <li>修改用户头像预览宽高</li>
-                <li>Excel支持注解align对齐方式</li>
-                <li>项目添加robots.txt 防止系统被搜索引擎收录</li>
-                <li>移除path-to-regexp正则匹配插件</li>
-                <li>修改Set可能导致嵌套的问题</li>
-                <li>调整代码生成页列宽</li>
-                <li>回显数据字典防止空值报错</li>
-                <li>支持get请求映射params参数</li>
-                <li>登录后push添加catch防止出现检查错误</li>
-                <li>防止安全扫描YUI出现的风险提示</li>
-                <li>代码生成删除多余的数字float类型</li>
-                <li>Excel支持导入Boolean型数据</li>
-                <li>修正转换字符串的目标字符集属性</li>
-                <li>删除多余的依赖</li>
-                <li>修改node-sass为dart-sass</li>
-                <li>升级poi到最新版本4.1.2</li>
-                <li>升级axios到最新版本0.21.0</li>
-                <li>升级element-ui到最新版本2.14.1</li>
-                <li>升级vue到最新版本2.6.12</li>
-                <li>升级vuex到最新版本3.6.0</li>
-                <li>升级vue-cli到版本4.5.9</li>
-                <li>升级vue-router到最新版本3.4.9</li>
-                <li>升级vue-cli到最新版本4.4.6</li>
-                <li>升级vue-cropper到最新版本0.5.5</li>
-                <li>升级clipboard到最新版本2.0.6</li>
-                <li>升级core-js到最新版本3.8.1</li>
-                <li>升级echarts到最新版本4.9.0</li>
-                <li>升级file-saver到最新版本2.0.4</li>
-                <li>升级fuse.js到最新版本6.4.3</li>
-                <li>升级js-beautify到最新版本1.13.0</li>
-                <li>升级js-cookie到最新版本2.2.1</li>
-                <li>升级path-to-regexp到最新版本6.2.0</li>
-                <li>升级quill到最新版本1.3.7</li>
-                <li>升级screenfull到最新版本5.0.2</li>
-                <li>升级sortablejs到最新版本1.10.2</li>
-                <li>升级vuedraggable到最新版本2.24.3</li>
-                <li>升级chalk到最新版本4.1.0</li>
-                <li>升级eslint到最新版本7.15.0</li>
-                <li>升级eslint-plugin-vue到最新版本7.2.0</li>
-                <li>升级lint-staged到最新版本10.5.3</li>
-                <li>升级runjs到最新版本4.4.2</li>
-                <li>升级sass-loader到最新版本10.1.0</li>
-                <li>升级script-ext-html-webpack-plugin到最新版本2.1.5</li>
-                <li>升级svg-sprite-loader到最新版本5.1.1</li>
-                <li>升级vue-template-compiler到最新版本2.6.12</li>
-                <li>其他细节优化</li>
-              </ol>
-            </el-collapse-item>
-            <el-collapse-item title="v2.3.0 - 2020-11-20">
-              <ol>
-                <li>新增文件服务应用(支持本地、FastDFS)</li>
-                <li>优化头像样式,鼠标移入悬停遮罩</li>
-                <li>AjaxResult重写put方法,以方便链式调用</li>
-                <li>代码生成支持上传控件</li>
-                <li>新增图片上传组件</li>
-                <li>支持用户头像更新</li>
-                <li>调整默认首页</li>
-                <li>角色权限验证hasRole匹配改为equals</li>
-                <li>修正数组权限为空判断</li>
-                <li>修正注释选中节点和半选节点获取</li>
-                <li>升级pagehelper到最新版1.3.0</li>
-                <li>升级fastjson到最新版1.2.74</li>
-                <li>修正定时任务执行一次权限标识</li>
-                <li>修复页签关闭所有固定标签路由不刷新问题</li>
-                <li>表单构建布局型组件新增按钮</li>
-                <li>调整日志路径到模块目录</li>
-                <li>修正菜单提示信息错误</li>
-                <li>其他细节优化</li>
-              </ol>
-            </el-collapse-item>
-            <el-collapse-item title="v2.2.0 - 2020-10-10">
-              <ol>
-                <li>移除 OAuth2 改为 Redis</li>
-                <li>升级SpringCloud到最新版本Hoxton.SR8</li>
-                <li>升级SpringCloud Alibaba到最新版本2.2.3</li>
-                <li>升级SpringBoot Admin到最新版本2.3.0</li>
-                <li>升级Fastjson到最新版1.2.73</li>
-                <li>新增在线用户会话管理</li>
-                <li>修改用户个人资料/密码同步缓存信息</li>
-                <li>修复前端通用导出方法参数传值请求方式问题</li>
-                <li>菜单新增是否缓存keep-alive</li>
-                <li>菜单&数据权限新增(展开/折叠 全选/全不选 父子联动)</li>
-                <li>Job与Gen模块增加Redis默认配置</li>
-                <li>新增表格右侧工具栏组件right-toolbar</li>
-                <li>代码生成支持同步数据库</li>
-                <li>代码生成支持富文本控件</li>
-                <li>代码生成树模板去掉多余双引号</li>
-                <li>代码生成添加select必填选项</li>
-                <li>代码生成页面时不忽略remark属性</li>
-                <li>修复代码生成下载路径错误</li>
-                <li>左侧菜单文字过长显示省略号</li>
-                <li>表格操作列间距调整</li>
-                <li>Excel注解支持自动统计数据总和</li>
-                <li>Excel注解支持设置BigDecimal精度&舍入规则</li>
-                <li>导入Excel整形值校验优化</li>
-                <li>导出Excel类型NUMERIC支持精度浮点类型</li>
-                <li>导出Excel调整targetAttr获取值方法,防止get方法不规范</li>
-                <li>Token续期调整为后端刷新</li>
-                <li>Token设置默认有效期时长12小时</li>
-                <li>网关白名单放入nacos配置&支持模糊匹配</li>
-                <li>修复富文本工具栏样式不对齐问题</li>
-                <li>Editor组件优化,支持自定义高度&图片冲突问题</li>
-                <li>修复富文本空格和缩进保存后不生效问题&删除重复的placeholder</li>
-                <li>限制系统内置参数不允许删除</li>
-                <li>修正调用目标字符串最大长度</li>
-                <li>修改自定义权限实现</li>
-                <li>优化递归菜单&部门子节点</li>
-                <li>修改sass为node-sass,避免el-icon图标乱码</li>
-                <li>修复根节点为子部门时,树状结构显示问题</li>
-                <li>全局异常状态汉化拦截处理</li>
-                <li>唯一限制条件只返回单条数据</li>
-                <li>其他细节优化</li>
-              </ol>
-            </el-collapse-item>
-
-            <el-collapse-item title="v2.1.0 - 2020-08-02">
-              <ol>
-                <li>表格工具栏右侧添加刷新&显隐查询栏</li>
-                <li>OAuth自动刷新续签Token</li>
-                <li>网关支持黑名单配置</li>
-                <li>权限配置自动注册</li>
-                <li>Feign配置自动注册</li>
-                <li>代码生成支持选择上级菜单</li>
-                <li>代码生成支持复选框</li>
-                <li>代码生成支持自定义路径</li>
-                <li>验证码类型支持(数组计算、字符验证)</li>
-                <li>Excel支持sort导出排序</li>
-                <li>Excel支持分割字符串组内容</li>
-                <li>excel 导入数字不需要格式化 ,导入允许列和属性个数不一致</li>
-                <li>新增菜单默认主类目</li>
-                <li>升级vue-cli版本到4.4.4</li>
-                <li>修改 node-sass 为 dart-sass</li>
-                <li>升级element-ui版本到2.13.2</li>
-                <li>删除babel,提高编译速度</li>
-                <li>修复验证码异常时network面板的中文会出现乱码问题</li>
-                <li>修复 utils/index.js 中不包含 parseTime 函数的 bug</li>
-                <li>优化selectDictLabel方法,数组迭代器换为some</li>
-                <li>修复客户端模式认证会出现错误</li>
-                <li>检查字符支持小数点&降级改成异常提醒</li>
-                <li>定时任务添加cron表达式验证</li>
-                <li>代码生成查询条件修正</li>
-                <li>修正角色管理导出权限权限字符</li>
-                <li>修正防止切换权限用户后登录出现404</li>
-                <li>终端设置安全码加密&更新缓存</li>
-                <li>修复头像上传成功二次打开无法改变裁剪框大小和位置问题</li>
-                <li>修复布局为small者mini用户表单显示错位问题</li>
-                <li>修复代码生成点击多次表修改数据不变化的问题</li>
-                <li>修复代码生成导入表结构出现异常页面不提醒问题</li>
-                <li>修复角色权限修改时已有权限未自动勾选异常</li>
-                <li>创建用户不允许选择系统管理员角色</li>
-                <li>添加全局异常处理(网关异常&业务异常)</li>
-                <li>修复终端查询Enter键搜索时是刷新页面而不是查询列表</li>
-                <li>删除job重复表单参数</li>
-                <li>代码生成浮点型改用BigDecimal</li>
-                <li>表单类型为Integer/Long设置整形默认值</li>
-                <li>修改用户管理复选框宽度,防止部分浏览器出现省略号</li>
-                <li>RedisCache中所有方法参数添加final,并优化list取出效率,添加其它常用redis方法</li>
-                <li>修正定时任务日志权限字符</li>
-                <li>添加Jackson时区配置</li>
-                <li>代码生成相关问题修复</li>
-                <li>自定义oauth2返回异常信息</li>
-                <li>升级nacos到最新版1.3.0 全新内核构建</li>
-                <li>修正【代码生成】功能无法下载的问题</li>
-                <li>其他细节优化</li>
-              </ol>
-            </el-collapse-item>
-
-            <el-collapse-item title="v2.0.0 - 2019-12-02">
-              <ol>
-                <li>新增代码生成</li>
-                <li>新增@RepeatSubmit注解,防止重复提交</li>
-                <li>新增菜单主目录添加/删除操作</li>
-                <li>日志记录过滤特殊对象,防止转换异常</li>
-                <li>修改代码生成路由脚本错误</li>
-                <li>用户上传头像实时同步缓存,无需重新登录</li>
-                <li>调整切换页签后不重新加载数据</li>
-                <li>添加jsencrypt实现参数的前端加密</li>
-                <li>系统退出删除用户缓存记录</li>
-                <li>其他细节优化</li>
-              </ol>
-            </el-collapse-item>
-            <el-collapse-item title="v2.0.0 - 2020-06-10">
-              <ol>
-                <li>使用Sentinel代替Hystrix</li>
-                <li>菜单新增终端管理配置</li>
-                <li>菜单新增Nacos&Sentinel控制台</li>
-                <li>代码生成适配Cloud</li>
-                <li>记录登录退出日志信息</li>
-                <li>网关验证码过滤器添加放行校验</li>
-                <li>个性化的定制自动加载类</li>
-                <li>定时任务调整label-width,防止部署出现错位</li>
-                <li>调整表头固定列默认样式</li>
-                <li>代码生成模板调整,字段为String并且必填则加空串条件</li>
-                <li>代码生成字典Integer/Long使用parseInt</li>
-                <li>修复退出登录重定向到登录页,登录后参数丢失。</li>
-                <li>修正岗位导出权限注解</li>
-                <li>修复首页搜索菜单外链无法点击跳转问题</li>
-                <li>修复菜单管理选择图标,backspace删除时不过滤数据</li>
-                <li>用户管理部门分支节点不可检查&显示计数</li>
-                <li>数据范围过滤属性调整</li>
-                <li>字典管理添加缓存读取</li>
-                <li>参数管理支持缓存操作</li>
-                <li>升级fastjson到最新版1.2.70 修复高危安全漏洞</li>
-                <li>dev启动默认打开浏览器</li>
-                <li>使用vue-cli默认source-map</li>
-                <li>slidebar eslint报错优化</li>
-                <li>当tags-view滚动关闭右键菜单</li>
-                <li>支持一级菜单(和主页同级)在main区域显示</li>
-                <li>限制外链地址必须以http(s)😕/开头</li>
-                <li>tagview & sidebar 主题颜色与element ui(全局)同步</li>
-                <li>修复dict_sort不可update为0的问题&查询返回增加dict_sort升序排序</li>
-                <li>权限部分代码调整</li>
-                <li>其他细节优化</li>
-              </ol>
-            </el-collapse-item>
-            <el-collapse-item title="v1.0.0 - 2020-05-20">
-              <ol>
-                <li>若依微服务系统正式发布</li>
-              </ol>
-            </el-collapse-item>
-          </el-collapse>
-        </el-card>
-      </el-col>
-      <el-col :xs="24" :sm="24" :md="12" :lg="8">
-        <el-card class="update-log">
-          <div slot="header" class="clearfix">
-            <span>捐赠支持</span>
-          </div>
-          <div class="body">
-            <img
-              src="@/assets/images/pay.png"
-              alt="donate"
-              width="100%"
-            />
-            <span style="display: inline-block; height: 30px; line-height: 30px"
-              >你可以请作者喝杯咖啡表示鼓励</span
-            >
-          </div>
-        </el-card>
-      </el-col>
-    </el-row>
-  </div>
+ 
+    
 </template>
 
 <script>

+ 1 - 1
src/views/login.vue

@@ -56,7 +56,7 @@
     </el-form>
     <!--  底部  -->
     <div class="el-login-footer">
-      <span>Copyright © 2018-2025 ruoyi.vip All Rights Reserved.</span>
+      <span></span>
     </div>
   </div>
 </template>

+ 1 - 1
src/views/register.vue

@@ -61,7 +61,7 @@
     </el-form>
     <!--  底部  -->
     <div class="el-register-footer">
-      <span>Copyright © 2018-2025 ruoyi.vip All Rights Reserved.</span>
+      <span></span>
     </div>
   </div>
 </template>

+ 1 - 1
vue.config.js

@@ -7,7 +7,7 @@ function resolve(dir) {
 
 const CompressionPlugin = require('compression-webpack-plugin')
 
-const name = process.env.VUE_APP_TITLE || '若依管理系统' // 网页标题
+const name = process.env.VUE_APP_TITLE || '爱智农智慧农业平台' // 网页标题
 
 const port = process.env.port || process.env.npm_config_port || 80 // 端口