浏览代码

Merge remote-tracking branch 'origin/master'

tjf 1 月之前
父节点
当前提交
c3242b8d2e
共有 73 个文件被更改,包括 10914 次插入1437 次删除
  1. 2 2
      ruoyi-ui/.env.development
  2. 2 2
      ruoyi-ui/.env.production
  3. 2 2
      ruoyi-ui/.env.staging
  4. 4 2
      ruoyi-ui/package.json
  5. 44 0
      ruoyi-ui/src/api/manage/NetworkManage.js
  6. 44 0
      ruoyi-ui/src/api/manage/equipmentManage.js
  7. 55 0
      ruoyi-ui/src/api/manage/staffManage.js
  8. 44 0
      ruoyi-ui/src/api/manage/taskManage.js
  9. 44 0
      ruoyi-ui/src/api/manage/warnManage.js
  10. 44 0
      ruoyi-ui/src/api/system/app.js
  11. 44 0
      ruoyi-ui/src/api/system/box.js
  12. 44 0
      ruoyi-ui/src/api/system/channelNumber.js
  13. 5 5
      ruoyi-ui/src/api/system/config.js
  14. 54 0
      ruoyi-ui/src/api/system/configuration.js
  15. 4 4
      ruoyi-ui/src/api/system/dept.js
  16. 4 4
      ruoyi-ui/src/api/system/dict/data.js
  17. 5 5
      ruoyi-ui/src/api/system/dict/type.js
  18. 4 4
      ruoyi-ui/src/api/system/menu.js
  19. 4 4
      ruoyi-ui/src/api/system/notice.js
  20. 4 4
      ruoyi-ui/src/api/system/post.js
  21. 14 14
      ruoyi-ui/src/api/system/role.js
  22. 12 13
      ruoyi-ui/src/api/system/user.js
  23. 二进制
      ruoyi-ui/src/assets/images/icon_gjgl_gx_normal.png
  24. 二进制
      ruoyi-ui/src/assets/images/icon_gjgl_gx_selected.png
  25. 二进制
      ruoyi-ui/src/assets/images/icon_htgl_kp_gx.png
  26. 二进制
      ruoyi-ui/src/assets/images/icon_htgl_rylb_bj.png
  27. 二进制
      ruoyi-ui/src/assets/images/icon_htgl_rylb_del.png
  28. 二进制
      ruoyi-ui/src/assets/images/icon_htgl_rylb_mrtx.png
  29. 二进制
      ruoyi-ui/src/assets/images/icon_htgl_zd.png
  30. 二进制
      ruoyi-ui/src/assets/images/icon_yqht_ssjk_lb_normal.png
  31. 二进制
      ruoyi-ui/src/assets/images/pic_gjpt_logo.png
  32. 二进制
      ruoyi-ui/src/assets/images/pic_htgl_bg.png
  33. 二进制
      ruoyi-ui/src/assets/images/pic_htgl_dl_logo.png
  34. 二进制
      ruoyi-ui/src/assets/images/pic_htgl_dlk_bg.png
  35. 二进制
      ruoyi-ui/src/assets/images/zwshjbig.png
  36. 二进制
      ruoyi-ui/src/assets/images/zwshuj.png
  37. 426 0
      ruoyi-ui/src/assets/styles/chinaz.css
  38. 1 1
      ruoyi-ui/src/assets/styles/element-variables.scss
  39. 30 0
      ruoyi-ui/src/assets/styles/index.scss
  40. 112 122
      ruoyi-ui/src/assets/styles/ruoyi.scss
  41. 27 9
      ruoyi-ui/src/assets/styles/sidebar.scss
  42. 5 5
      ruoyi-ui/src/assets/styles/variables.scss
  43. 265 0
      ruoyi-ui/src/components/ImageUploadr/index.vue
  44. 56 15
      ruoyi-ui/src/components/Pagination/index.vue
  45. 155 0
      ruoyi-ui/src/components/Paginations/index.vue
  46. 373 0
      ruoyi-ui/src/components/Photo/index.vue
  47. 296 19
      ruoyi-ui/src/layout/components/Navbar.vue
  48. 8 8
      ruoyi-ui/src/layout/components/Sidebar/Logo.vue
  49. 13 13
      ruoyi-ui/src/layout/components/Sidebar/index.vue
  50. 2 2
      ruoyi-ui/src/layout/components/TagsView/ScrollPane.vue
  51. 2 2
      ruoyi-ui/src/layout/components/TagsView/index.vue
  52. 10 0
      ruoyi-ui/src/main.js
  53. 6 3
      ruoyi-ui/src/settings.js
  54. 2 0
      ruoyi-ui/src/utils/request.js
  55. 28 9
      ruoyi-ui/src/views/dashboard/LineChart.vue
  56. 166 58
      ruoyi-ui/src/views/dashboard/PieChart.vue
  57. 3936 1064
      ruoyi-ui/src/views/index.vue
  58. 46 15
      ruoyi-ui/src/views/login.vue
  59. 357 0
      ruoyi-ui/src/views/shipinggaoj/NetworkManage/index.vue
  60. 359 0
      ruoyi-ui/src/views/shipinggaoj/channelNumber/index.vue
  61. 734 0
      ruoyi-ui/src/views/shipinggaoj/gaojingguanli/index.vue
  62. 949 0
      ruoyi-ui/src/views/shipinggaoj/renyuan/index.vue
  63. 1112 0
      ruoyi-ui/src/views/shipinggaoj/shebe/index.vue
  64. 476 0
      ruoyi-ui/src/views/shipinggaoj/shebei/index.vue
  65. 415 0
      ruoyi-ui/src/views/shipinggaoj/taskManage/index.vue
  66. 1 1
      ruoyi-ui/src/views/system/dept/index.vue
  67. 2 2
      ruoyi-ui/src/views/system/dict/data.vue
  68. 2 2
      ruoyi-ui/src/views/system/dict/index.vue
  69. 1 1
      ruoyi-ui/src/views/system/menu/index.vue
  70. 2 2
      ruoyi-ui/src/views/system/role/index.vue
  71. 13 5
      ruoyi-ui/src/views/system/user/index.vue
  72. 40 12
      ruoyi-ui/src/views/system/user/profile/userAvatar.vue
  73. 3 2
      ruoyi-ui/vue.config.js

+ 2 - 2
ruoyi-ui/.env.development

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

+ 2 - 2
ruoyi-ui/.env.production

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

+ 2 - 2
ruoyi-ui/.env.staging

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

+ 4 - 2
ruoyi-ui/package.json

@@ -1,7 +1,7 @@
 {
   "name": "ruoyi",
   "version": "3.8.9",
-  "description": "若依管理系统",
+  "description": "AI-Hub智能处理平台",
   "author": "若依",
   "license": "MIT",
   "scripts": {
@@ -38,11 +38,13 @@
   "dependencies": {
     "@riophae/vue-treeselect": "0.4.0",
     "axios": "0.28.1",
+    "better-scroll": "^2.5.1",
     "clipboard": "2.0.8",
     "core-js": "3.37.1",
-    "echarts": "5.4.0",
+    "echarts": "^5.1.0",
     "element-ui": "2.15.14",
     "file-saver": "2.0.5",
+    "flv": "^0.0.1",
     "fuse.js": "6.4.3",
     "highlight.js": "9.18.5",
     "js-beautify": "1.13.0",

+ 44 - 0
ruoyi-ui/src/api/manage/NetworkManage.js

@@ -0,0 +1,44 @@
+import request from '@/utils/request'
+
+// 查询网络管理列表
+export function listNetworkManage(query) {
+  return request({
+    url: '/manage/NetworkManage/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询网络管理详细
+export function getNetworkManage(networkId) {
+  return request({
+    url: '/manage/NetworkManage/' + networkId,
+    method: 'get'
+  })
+}
+
+// 新增网络管理
+export function addNetworkManage(data) {
+  return request({
+    url: '/manage/NetworkManage',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改网络管理
+export function updateNetworkManage(data) {
+  return request({
+    url: '/manage/NetworkManage/put',
+    method: 'post',
+    data: data
+  })
+}
+
+// 删除网络管理
+export function delNetworkManage(networkId) {
+  return request({
+    url: '/manage/NetworkManage/delete/' + networkId,
+    method: 'get'
+  })
+}

+ 44 - 0
ruoyi-ui/src/api/manage/equipmentManage.js

@@ -0,0 +1,44 @@
+import request from '@/utils/request'
+
+// 查询设备管理列表
+export function listEquipmentManage(query) {
+  return request({
+    url: '/system/equipmentManage/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询设备管理详细
+export function getEquipmentManage(equipmentId) {
+  return request({
+    url: '/system/equipmentManage/' + equipmentId,
+    method: 'get'
+  })
+}
+
+// 新增设备管理
+export function addEquipmentManage(data) {
+  return request({
+    url: '/system/equipmentManage',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改设备管理
+export function updateEquipmentManage(data) {
+  return request({
+    url: '/system/equipmentManage/put',
+    method: 'post',
+    data: data
+  })
+}
+
+// 删除设备管理
+export function delEquipmentManage(equipmentId) {
+  return request({
+    url: '/system/equipmentManage/delete/' + equipmentId,
+    method: 'get'
+  })
+}

+ 55 - 0
ruoyi-ui/src/api/manage/staffManage.js

@@ -0,0 +1,55 @@
+import request from '@/utils/request'
+
+// 查询人员管理列表
+export function listStaffManage(query) {
+  return request({
+    url: '/manage/staffManage/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询人员管理详细
+export function getStaffManage(staffId) {
+  return request({
+    url: '/manage/staffManage/' + staffId,
+    method: 'get'
+  })
+}
+
+// 新增人员管理
+export function addStaffManage(data) {
+  return request({
+    url: '/manage/staffManage',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改人员管理
+export function updateStaffManage(data) {
+  return request({
+    url: '/manage/staffManage/put',
+    method: 'post',
+    data: data
+  })
+}
+
+export function unploa(data) {
+  return request({
+    url: '/common/upload',
+    headers: {
+            'Content-Type': 'application/x-www-form-urlencoded'
+        },
+    method: 'post',
+    data: data
+  })
+}
+
+// 删除人员管理
+export function delStaffManage(staffId) {
+  return request({
+    url: '/manage/staffManage/delete/' + staffId,
+    method: 'get'
+  })
+}

+ 44 - 0
ruoyi-ui/src/api/manage/taskManage.js

@@ -0,0 +1,44 @@
+import request from '@/utils/request'
+
+// 查询任务管理列表
+export function listTaskManage(query) {
+  return request({
+    url: '/manage/taskManage/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询任务管理详细
+export function getTaskManage(taskId) {
+  return request({
+    url: '/manage/taskManage/' + taskId,
+    method: 'get'
+  })
+}
+
+// 新增任务管理
+export function addTaskManage(data) {
+  return request({
+    url: '/manage/taskManage',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改任务管理
+export function updateTaskManage(data) {
+  return request({
+    url: '/manage/taskManage/put',
+    method: 'post',
+    data: data
+  })
+}
+
+// 删除任务管理
+export function delTaskManage(taskId) {
+  return request({
+    url: '/manage/taskManage/delete/' + taskId,
+    method: 'get'
+  })
+}

+ 44 - 0
ruoyi-ui/src/api/manage/warnManage.js

@@ -0,0 +1,44 @@
+import request from '@/utils/request'
+
+// 查询告警管理列表
+export function listWarnManage(query) {
+  return request({
+    url: '/manage/warnManage/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询告警管理详细
+export function getWarnManage(warnId) {
+  return request({
+    url: '/manage/warnManage/' + warnId,
+    method: 'get'
+  })
+}
+
+// 新增告警管理
+export function addWarnManage(data) {
+  return request({
+    url: '/manage/warnManage',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改告警管理
+export function updateWarnManage(data) {
+  return request({
+    url: '/manage/warnManage/put',
+    method: 'post',
+    data: data
+  })
+}
+
+// 删除告警管理
+export function delWarnManage(warnId) {
+  return request({
+    url: '/manage/warnManage/delete/' + warnId,
+    method: 'get'
+  })
+}

+ 44 - 0
ruoyi-ui/src/api/system/app.js

@@ -0,0 +1,44 @@
+import request from '@/utils/request'
+
+// 查询【请填写功能名称】列表
+export function listApp(query) {
+  return request({
+    url: '/system/app/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询【请填写功能名称】详细
+export function getApp(id) {
+  return request({
+    url: '/system/app/' + id,
+    method: 'get'
+  })
+}
+
+// 新增【请填写功能名称】
+export function addApp(data) {
+  return request({
+    url: '/system/app',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改【请填写功能名称】
+export function updateApp(data) {
+  return request({
+    url: '/system/app/put',
+    method: 'post',
+    data: data
+  })
+}
+
+// 删除【请填写功能名称】
+export function delApp(id) {
+  return request({
+    url: '/system/app/delete/' + id,
+    method: 'get'
+  })
+}

+ 44 - 0
ruoyi-ui/src/api/system/box.js

@@ -0,0 +1,44 @@
+import request from '@/utils/request'
+
+// 查询包厢菜单列表
+export function listBox(query) {
+  return request({
+    url: '/system/box/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询包厢菜单详细
+export function getBox(menuBoxId) {
+  return request({
+    url: '/system/box/' + menuBoxId,
+    method: 'get'
+  })
+}
+
+// 新增包厢菜单
+export function addBox(data) {
+  return request({
+    url: '/system/box',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改包厢菜单
+export function updateBox(data) {
+  return request({
+    url: '/system/box/put',
+    method: 'post',
+    data: data
+  })
+}
+
+// 删除包厢菜单
+export function delBox(menuBoxId) {
+  return request({
+    url: '/system/box/delete/' + menuBoxId,
+    method: 'get'
+  })
+}

+ 44 - 0
ruoyi-ui/src/api/system/channelNumber.js

@@ -0,0 +1,44 @@
+import request from '@/utils/request'
+
+// 查询通道管理列表
+export function listChannelNumber(query) {
+  return request({
+    url: '/system/channelNumber/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询通道管理详细
+export function getChannelNumber(channelId) {
+  return request({
+    url: '/system/channelNumber/' + channelId,
+    method: 'get'
+  })
+}
+
+// 新增通道管理
+export function addChannelNumber(data) {
+  return request({
+    url: '/system/channelNumber',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改通道管理
+export function updateChannelNumber(data) {
+  return request({
+    url: '/system/channelNumber/put',
+    method: 'post',
+    data: data
+  })
+}
+
+// 删除通道管理
+export function delChannelNumber(channelId) {
+  return request({
+    url: '/system/channelNumber/delete/' + channelId,
+    method: 'get'
+  })
+}

+ 5 - 5
ruoyi-ui/src/api/system/config.js

@@ -37,8 +37,8 @@ export function addConfig(data) {
 // 修改参数配置
 export function updateConfig(data) {
   return request({
-    url: '/system/config',
-    method: 'put',
+    url: '/system/config/put',
+    method: 'post',
     data: data
   })
 }
@@ -46,8 +46,8 @@ export function updateConfig(data) {
 // 删除参数配置
 export function delConfig(configId) {
   return request({
-    url: '/system/config/' + configId,
-    method: 'delete'
+    url: '/system/config/delete/' + configId,
+    method: 'get'
   })
 }
 
@@ -55,6 +55,6 @@ export function delConfig(configId) {
 export function refreshCache() {
   return request({
     url: '/system/config/refreshCache',
-    method: 'delete'
+    method: 'get'
   })
 }

+ 54 - 0
ruoyi-ui/src/api/system/configuration.js

@@ -0,0 +1,54 @@
+import request from '@/utils/request'
+
+// 查询设备配置(控制抓拍一体机)列表
+export function listConfiguration(query) {
+  return request({
+    url: '/system/configuration/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询设备配置(控制抓拍一体机)详细
+export function getConfiguration(equipmentId) {
+  return request({
+    url: '/system/configuration/' + equipmentId,
+    method: 'get'
+  })
+}
+
+// 新增设备配置(控制抓拍一体机)
+export function addConfiguration(data) {
+  return request({
+    url: '/system/configuration',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改设备配置(控制抓拍一体机)
+export function updateConfiguration(data) {
+  return request({
+    url: '/system/configuration/put',
+    method: 'post',
+    data: data
+  })
+}
+
+// 删除设备配置(控制抓拍一体机)
+export function delConfiguration(equipmentId) {
+  return request({
+    url: '/system/configuration/delete/' + equipmentId,
+    method: 'get'
+  })
+}
+
+
+export function boolean(query) {
+  return request({
+    url: '/system/config/configKey/boolean',
+    method: 'get',
+    params: query
+  })
+}
+

+ 4 - 4
ruoyi-ui/src/api/system/dept.js

@@ -37,8 +37,8 @@ export function addDept(data) {
 // 修改部门
 export function updateDept(data) {
   return request({
-    url: '/system/dept',
-    method: 'put',
+    url: '/system/dept/put',
+    method: 'post',
     data: data
   })
 }
@@ -46,7 +46,7 @@ export function updateDept(data) {
 // 删除部门
 export function delDept(deptId) {
   return request({
-    url: '/system/dept/' + deptId,
-    method: 'delete'
+    url: '/system/dept/delete/' + deptId,
+    method: 'get'
   })
 }

+ 4 - 4
ruoyi-ui/src/api/system/dict/data.js

@@ -37,8 +37,8 @@ export function addData(data) {
 // 修改字典数据
 export function updateData(data) {
   return request({
-    url: '/system/dict/data',
-    method: 'put',
+    url: '/system/dict/data/put',
+    method: 'post',
     data: data
   })
 }
@@ -46,7 +46,7 @@ export function updateData(data) {
 // 删除字典数据
 export function delData(dictCode) {
   return request({
-    url: '/system/dict/data/' + dictCode,
-    method: 'delete'
+    url: '/system/dict/data/delete/' + dictCode,
+    method: 'get'
   })
 }

+ 5 - 5
ruoyi-ui/src/api/system/dict/type.js

@@ -29,8 +29,8 @@ export function addType(data) {
 // 修改字典类型
 export function updateType(data) {
   return request({
-    url: '/system/dict/type',
-    method: 'put',
+    url: '/system/dict/type/put',
+    method: 'post',
     data: data
   })
 }
@@ -38,8 +38,8 @@ export function updateType(data) {
 // 删除字典类型
 export function delType(dictId) {
   return request({
-    url: '/system/dict/type/' + dictId,
-    method: 'delete'
+    url: '/system/dict/type/delete/' + dictId,
+    method: 'get'
   })
 }
 
@@ -47,7 +47,7 @@ export function delType(dictId) {
 export function refreshCache() {
   return request({
     url: '/system/dict/type/refreshCache',
-    method: 'delete'
+    method: 'get'
   })
 }
 

+ 4 - 4
ruoyi-ui/src/api/system/menu.js

@@ -45,8 +45,8 @@ export function addMenu(data) {
 // 修改菜单
 export function updateMenu(data) {
   return request({
-    url: '/system/menu',
-    method: 'put',
+    url: '/system/menu/put',
+    method: 'post',
     data: data
   })
 }
@@ -54,7 +54,7 @@ export function updateMenu(data) {
 // 删除菜单
 export function delMenu(menuId) {
   return request({
-    url: '/system/menu/' + menuId,
-    method: 'delete'
+    url: '/system/menu/delete/' + menuId,
+    method: 'get'
   })
 }

+ 4 - 4
ruoyi-ui/src/api/system/notice.js

@@ -29,8 +29,8 @@ export function addNotice(data) {
 // 修改公告
 export function updateNotice(data) {
   return request({
-    url: '/system/notice',
-    method: 'put',
+    url: '/system/notice/put',
+    method: 'post',
     data: data
   })
 }
@@ -38,7 +38,7 @@ export function updateNotice(data) {
 // 删除公告
 export function delNotice(noticeId) {
   return request({
-    url: '/system/notice/' + noticeId,
-    method: 'delete'
+    url: '/system/notice/delete/' + noticeId,
+    method: 'get'
   })
 }

+ 4 - 4
ruoyi-ui/src/api/system/post.js

@@ -29,8 +29,8 @@ export function addPost(data) {
 // 修改岗位
 export function updatePost(data) {
   return request({
-    url: '/system/post',
-    method: 'put',
+    url: '/system/post/put',
+    method: 'post',
     data: data
   })
 }
@@ -38,7 +38,7 @@ export function updatePost(data) {
 // 删除岗位
 export function delPost(postId) {
   return request({
-    url: '/system/post/' + postId,
-    method: 'delete'
+    url: '/system/post/delete/' + postId,
+    method: 'get'
   })
 }

+ 14 - 14
ruoyi-ui/src/api/system/role.js

@@ -29,8 +29,8 @@ export function addRole(data) {
 // 修改角色
 export function updateRole(data) {
   return request({
-    url: '/system/role',
-    method: 'put',
+    url: '/system/role/put',
+    method: 'post',
     data: data
   })
 }
@@ -38,8 +38,8 @@ export function updateRole(data) {
 // 角色数据权限
 export function dataScope(data) {
   return request({
-    url: '/system/role/dataScope',
-    method: 'put',
+    url: '/system/role/dataScope/put',
+    method: 'post',
     data: data
   })
 }
@@ -51,8 +51,8 @@ export function changeRoleStatus(roleId, status) {
     status
   }
   return request({
-    url: '/system/role/changeStatus',
-    method: 'put',
+    url: '/system/role/changeStatus/put',
+    method: 'post',
     data: data
   })
 }
@@ -60,8 +60,8 @@ export function changeRoleStatus(roleId, status) {
 // 删除角色
 export function delRole(roleId) {
   return request({
-    url: '/system/role/' + roleId,
-    method: 'delete'
+    url: '/system/role/delete/' + roleId,
+    method: 'get'
   })
 }
 
@@ -86,8 +86,8 @@ export function unallocatedUserList(query) {
 // 取消用户授权角色
 export function authUserCancel(data) {
   return request({
-    url: '/system/role/authUser/cancel',
-    method: 'put',
+    url: '/system/role/authUser/cancel/put',
+    method: 'post',
     data: data
   })
 }
@@ -95,8 +95,8 @@ export function authUserCancel(data) {
 // 批量取消用户授权角色
 export function authUserCancelAll(data) {
   return request({
-    url: '/system/role/authUser/cancelAll',
-    method: 'put',
+    url: '/system/role/authUser/cancelAll/put',
+    method: 'post',
     params: data
   })
 }
@@ -104,8 +104,8 @@ export function authUserCancelAll(data) {
 // 授权用户选择
 export function authUserSelectAll(data) {
   return request({
-    url: '/system/role/authUser/selectAll',
-    method: 'put',
+    url: '/system/role/authUser/selectAll/put',
+    method: 'post',
     params: data
   })
 }

+ 12 - 13
ruoyi-ui/src/api/system/user.js

@@ -30,8 +30,8 @@ export function addUser(data) {
 // 修改用户
 export function updateUser(data) {
   return request({
-    url: '/system/user',
-    method: 'put',
+    url: '/system/user/put',
+    method: 'post',
     data: data
   })
 }
@@ -39,8 +39,8 @@ export function updateUser(data) {
 // 删除用户
 export function delUser(userId) {
   return request({
-    url: '/system/user/' + userId,
-    method: 'delete'
+    url: '/system/user/delete/' + userId,
+    method: 'get'
   })
 }
 
@@ -52,7 +52,7 @@ export function resetUserPwd(userId, password) {
   }
   return request({
     url: '/system/user/resetPwd',
-    method: 'put',
+    method: 'post',
     data: data
   })
 }
@@ -65,7 +65,7 @@ export function changeUserStatus(userId, status) {
   }
   return request({
     url: '/system/user/changeStatus',
-    method: 'put',
+    method: 'post',
     data: data
   })
 }
@@ -81,8 +81,8 @@ export function getUserProfile() {
 // 修改用户个人信息
 export function updateUserProfile(data) {
   return request({
-    url: '/system/user/profile',
-    method: 'put',
+    url: '/system/user/profile/put',
+    method: 'post',
     data: data
   })
 }
@@ -95,8 +95,8 @@ export function updateUserPwd(oldPassword, newPassword) {
   }
   return request({
     url: '/system/user/profile/updatePwd',
-    method: 'put',
-    data: data
+    method: 'post',
+    params: data
   })
 }
 
@@ -105,7 +105,6 @@ export function uploadAvatar(data) {
   return request({
     url: '/system/user/profile/avatar',
     method: 'post',
-    headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
     data: data
   })
 }
@@ -121,8 +120,8 @@ export function getAuthRole(userId) {
 // 保存授权角色
 export function updateAuthRole(data) {
   return request({
-    url: '/system/user/authRole',
-    method: 'put',
+    url: '/system/user/authRole/put',
+    method: 'post',
     params: data
   })
 }

二进制
ruoyi-ui/src/assets/images/icon_gjgl_gx_normal.png


二进制
ruoyi-ui/src/assets/images/icon_gjgl_gx_selected.png


二进制
ruoyi-ui/src/assets/images/icon_htgl_kp_gx.png


二进制
ruoyi-ui/src/assets/images/icon_htgl_rylb_bj.png


二进制
ruoyi-ui/src/assets/images/icon_htgl_rylb_del.png


二进制
ruoyi-ui/src/assets/images/icon_htgl_rylb_mrtx.png


二进制
ruoyi-ui/src/assets/images/icon_htgl_zd.png


二进制
ruoyi-ui/src/assets/images/icon_yqht_ssjk_lb_normal.png


二进制
ruoyi-ui/src/assets/images/pic_gjpt_logo.png


二进制
ruoyi-ui/src/assets/images/pic_htgl_bg.png


二进制
ruoyi-ui/src/assets/images/pic_htgl_dl_logo.png


二进制
ruoyi-ui/src/assets/images/pic_htgl_dlk_bg.png


二进制
ruoyi-ui/src/assets/images/zwshjbig.png


二进制
ruoyi-ui/src/assets/images/zwshuj.png


+ 426 - 0
ruoyi-ui/src/assets/styles/chinaz.css

@@ -0,0 +1,426 @@
+body {margin:0}
+
+.headline-bg.index-headline-bg {
+	height:680px;
+	overflow:hidden;
+	background:-webkit-linear-gradient(top,#0076d1,#5db8ff);
+	background:-moz-linear-gradient(top,#0076d1,#5db8ff);
+	background:-o-linear-gradient(top,#0076d1,#5db8ff);
+	background:-ms-linear-gradient(top,#0076d1,#5db8ff)
+}
+.index-headline-img {
+	width:610px;
+	display:block;
+	margin:auto
+}
+.feature-index {
+	width:100%;
+	margin-top:0;
+	padding-top:100px;
+	padding-bottom:0;
+	overflow:hidden;
+}
+.feature-index h2.title {
+	font-size:42px;
+	color:#fff;
+	font-weight:400;
+	text-align:left;
+	line-height:1.3
+}
+.feature-index h2.title span {
+	display:block;
+	font-size:26px;
+	margin-bottom:10px
+}
+.feature-index .p-btn .btn-sign {
+	background-color:#fff;
+	color:#006ec3
+}
+.feature-index .p-btn .btn-sign:hover {
+	opacity:.8
+}
+.feature-index .p-btn .btn-large {
+	font-size:14px;
+	padding:6px 16px;
+	font-weight:400;
+	border:1px solid #fff
+}
+.feature-index .p-btn a:first-child {
+	margin-right:20px
+}
+.feature-index p.more {
+	text-align:left;
+	font-size:14px;
+	padding-top:5px;
+	padding-left:30px
+}
+.feature-index p.more a {
+	color:rgba(0,0,0,.3);
+	font-weight:700;
+	text-transform:uppercase;
+	font-size:14px;
+	text-decoration:none;
+	cursor:pointer;
+	margin-right:15px
+}
+.feature-index p.more a:hover {
+	color:#fff
+}
+.steps {
+	padding-top:150px;
+	padding-bottom:150px
+}
+.steps .title {
+	font-size:48px;
+	margin:0 0 20px
+}
+.steps .text {
+	width:80%;
+	max-width:300px;
+	margin-left:auto;
+	margin-right:auto;
+	font-size:24px;
+	/* margin-top:p:0 */
+}
+.steps .intro {
+	font-size:20px
+}
+.steps .intro-text {
+	width:80%;
+	max-width:300px;
+	margin-bottom:40px
+}
+.steps .fea-img {
+	display:block;
+	width:80%;
+	margin:0 auto 20px;
+	max-width:300px
+}
+.steps .single-img {
+	width:100%;
+	max-width:500px;
+	margin:0 auto
+}
+.steps .intro-more {
+	font-size:16px;
+	color:#7a7a7a;
+	margin-top:70px
+}
+.background {
+	background:#fafafa
+}
+.lang {
+	padding:140px 0
+}
+.lang .title {
+	font-size:40px
+}
+.lang p.intro-more {
+	margin-top:30px
+}
+.lang .icon {
+	max-width:120px;
+	width:100%;
+	margin:0 auto
+}
+.lang .icon img {
+	max-width:100%
+}
+.lang .icon .text {
+	font-size:14px;
+	color:rgba(43,43,43,.5);
+	margin-top:-5px;
+	visibility:hidden;
+	text-align:center
+}
+.lang .icon:hover {
+	cursor:pointer
+}
+.lang .icon:hover .text {
+	visibility:visible
+}
+.lang .icon a:hover {
+	text-decoration:none
+}
+.products {
+	padding:120px 0 150px
+}
+.products .pro {
+	width:100%;
+	margin-bottom:3px
+}
+.products .pro img {
+	float:left;
+	width:33.33%
+}
+.products .pro a:nth-child(1) img {
+	border-right:2px solid #fff
+}
+.products .pro a:nth-child(2) img {
+	border-left:1px solid #fff;
+	border-right:1px solid #fff
+}
+.products .pro a:nth-child(3) img {
+	float:right;
+	border-left:2px solid #fff
+}
+.ui {
+	background:#829ec7;
+	background:-webkit-linear-gradient(top,#829ec7,#d5c9ce);
+	background:-moz-linear-gradient(top,#829ec7,#d5c9ce);
+	background:-o-linear-gradient(top,#829ec7,#d5c9ce);
+	background:-ms-linear-gradient(top,#829ec7,#d5c9ce);
+	padding:140px 0 0
+}
+.ui .title {
+	margin:0 auto 30px;
+	color:#fff
+}
+.ui p.intro {
+	color:rgba(29,29,29,.5);
+	margin-bottom:30px
+}
+.ui p.try {
+	margin-bottom:120px;
+	position:relative
+}
+.ui>img {
+	width:80%;
+	max-width:100%;
+	margin-bottom:-10%;
+	position:relative
+}
+.users {
+	background:#fff;
+	padding:150px 0 120px
+}
+.users .num {
+	max-width:400px;
+	width:80%;
+	padding-bottom:10px
+}
+.users img {
+	width:100%;
+	padding:30px 0
+}
+.users .title {
+	font-size:30px;
+	margin-bottom:30px
+}
+.cta-section.pricing-cta-section {
+	background:#0076d1;
+	background:-webkit-linear-gradient(top,#0076d1,#5db8ff);
+	background:-moz-linear-gradient(top,#0076d1,#5db8ff);
+	background:-o-linear-gradient(top,#0076d1,#5db8ff);
+	background:-ms-linear-gradient(top,#0076d1,#5db8ff)
+}
+.cta-section.pricing-cta-section .btn-sign-ye {
+	color:#0076d1
+}
+@media (min-width:768px) {
+	.index-headline-img {
+	position:absolute;
+	left:46%;
+	top:0;
+	width:968px
+}
+.feature-index {
+	padding-top:100px
+}
+.feature-index h2.title {
+	padding-left:30px;
+	margin-top:50px;
+	margin-bottom:60px
+}
+.feature-index .p-btn {
+	padding-left:30px
+}
+.lang .title:first-child {
+	margin-top:15%
+}
+}@media (max-width:991px) {
+	.headline-bg.index-headline-bg {
+	height:575px
+}
+.index-headline-img {
+	width:813px
+}
+.feature-index {
+	height:600px
+}
+.feature-index h2.title {
+	margin-top:20px;
+	margin-bottom:40px;
+	padding-left:20px;
+	font-size:30px
+}
+.feature-index h2.title span {
+	font-size:24px;
+	margin-bottom:10px
+}
+.feature-index .p-btn,.feature-index p.more {
+	padding-left:20px
+}
+.steps {
+	padding-top:100px;
+	padding-bottom:100px
+}
+.lang .title {
+	font-size:34px;
+	margin:0
+}
+.lang .intro-more {
+	margin-top:30px
+}
+.products {
+	padding-top:50px
+}
+}@media (max-width:767px) {
+	.headline-bg.index-headline-bg {
+	height:800px
+}
+.feature-index {
+	height:auto;
+	text-align:center;
+	overflow:visible;
+	padding-top:40px!important
+}
+.feature-index .index-headline-img {
+	max-width:85%;
+	margin-bottom:-6%
+}
+.feature-index h2.title {
+	padding-left:0;
+	margin-bottom:20px;
+	text-align:center;
+	font-size:36px!important
+}
+.feature-index h2.title span {
+	font-size:24px;
+	margin-bottom:5px
+}
+.feature-index p.more {
+	text-align:center;
+	margin-bottom:40px
+}
+.steps {
+	padding-top:150px;
+	padding-bottom:100px
+}
+.steps .fea-img {
+	margin:auto
+}
+.steps .icon {
+	max-width:110px;
+	width:100%
+}
+.steps .text {
+	margin:auto;
+	font-size:20px;
+	text-align:center
+}
+.steps .intro-text {
+	margin-left:0;
+	width:100%;
+	max-width:100%;
+	text-align:center;
+	margin-bottom:50px
+}
+.steps .single-img {
+	margin-top:30px
+}
+.lang {
+	padding:80px 0;
+	text-align:center
+}
+.products {
+	padding-top:60px
+}
+.users {
+	padding:80px 0 0
+}
+.users img {
+	padding:20px 0
+}
+.users .title {
+	font-size:24px!important
+}
+.users .num {
+	max-width:300px
+}
+}@media (max-width:480px) {
+	.headline-bg.index-headline-bg {
+	height:610px
+}
+.feature-index .index-headline-img {
+	max-width:95%
+}
+.feature-index {
+	padding-top:30px!important
+}
+.feature-index h2.title {
+	font-size:26px!important
+}
+.feature-index h2.title span {
+	font-size:18px
+}
+.steps {
+	padding-top:110px;
+	padding-bottom:50px
+}
+.steps .title {
+	margin-bottom:10px
+}
+.steps .intro-more {
+	margin-top:30px
+}
+.steps .intro {
+	font-size:16px
+}
+.steps .intro-text {
+	margin-bottom:40px
+}
+.products .pro {
+	margin:0
+}
+.products .pro a:nth-child(1) img,.products .pro a:nth-child(2) img,.products .pro a:nth-child(3) img {
+	display:block;
+	float:none;
+	border:0;
+	width:100%;
+	margin:0 auto 2px
+}
+.ui {
+	padding-top:60px
+}
+.ui>img {
+	width:90%
+}
+.ui p.intro {
+	margin-bottom:15px
+}
+.ui p.try {
+	margin-bottom:70px
+}
+.users .num {
+	font-size:48px
+}
+.hidden-xxs {
+	display:none
+}
+}@media (max-width:375px) {
+	.steps {
+	padding-top:90px
+}
+.steps h3.title {
+	font-size:26px!important
+}
+}
+
+
+
+
+
+
+
+

+ 1 - 1
ruoyi-ui/src/assets/styles/element-variables.scss

@@ -4,7 +4,7 @@
 **/
 
 /* theme color */
-$--color-primary: #1890ff;
+$--color-primary: #4775ea;
 $--color-success: #13ce66;
 $--color-warning: #ffba00;
 $--color-danger: #ff4949;

+ 30 - 0
ruoyi-ui/src/assets/styles/index.scss

@@ -122,6 +122,8 @@ aside {
 //main-container全局样式
 .app-container {
   padding: 20px;
+  background: linear-gradient(180deg, #E7F5F1, #F6F9FA);
+  padding-top: 0;
 }
 
 .components-container {
@@ -129,6 +131,10 @@ aside {
   position: relative;
 }
 
+.pagination-container {
+  margin-top: 30px;
+}
+
 .text-center {
   text-align: center
 }
@@ -176,3 +182,27 @@ aside {
     margin-bottom: 10px;
   }
 }
+.el-table .el-table__header-wrapper th, .el-table .el-table__fixed-header-wrapper th{
+    background-color:#F5F6F8;
+  }
+  .el-checkbox__input.is-checked .el-checkbox__inner{
+    background-color: #03BF8A;
+    border-color: #03BF8A;
+  }
+  .el-checkbox__input.is-indeterminate .el-checkbox__inner{
+    background-color: #03BF8A;
+    border-color: #03BF8A;
+  }
+  .qucheu{
+    .el-form-item--small.el-form-item{
+      border: 1px  solid #E6E6E6;
+    }
+    .el-input__inner{
+      border:0;
+    }
+  }
+  .el-switch.is-checked .el-switch__core{
+    border-color: #03BF8A;
+    background-color: #03BF8A;
+  }
+

+ 112 - 122
ruoyi-ui/src/assets/styles/ruoyi.scss

@@ -1,136 +1,129 @@
-/**
-* 通用css样式布局处理
-* Copyright (c) 2019 ruoyi
-*/
+ /**
+ * 通用css样式布局处理
+ * Copyright (c) 2019 ruoyi
+ */
 
-/** 基础通用 **/
+ /** 基础通用 **/
 .pt5 {
-  padding-top: 5px;
+	padding-top: 5px;
 }
-
 .pr5 {
-  padding-right: 5px;
+	padding-right: 5px;
 }
-
 .pb5 {
-  padding-bottom: 5px;
+	padding-bottom: 5px;
 }
-
 .mt5 {
-  margin-top: 5px;
+	margin-top: 5px;
 }
-
 .mr5 {
-  margin-right: 5px;
+	margin-right: 5px;
 }
-
 .mb5 {
-  margin-bottom: 5px;
+	margin-bottom: 5px;
 }
-
 .mb8 {
-  margin-bottom: 8px;
+	margin-bottom: 8px;
 }
-
 .ml5 {
-  margin-left: 5px;
+	margin-left: 5px;
 }
-
 .mt10 {
-  margin-top: 10px;
+	margin-top: 10px;
 }
-
 .mr10 {
-  margin-right: 10px;
+	margin-right: 10px;
 }
-
 .mb10 {
-  margin-bottom: 10px;
+	margin-bottom: 10px;
 }
 .ml10 {
 	margin-left: 10px;
 }
-
 .mt20 {
-  margin-top: 20px;
+	margin-top: 20px;
 }
-
 .mr20 {
-  margin-right: 20px;
+	margin-right: 20px;
 }
-
 .mb20 {
-  margin-bottom: 20px;
+	margin-bottom: 20px;
 }
 .ml20 {
 	margin-left: 20px;
 }
 
 .h1, .h2, .h3, .h4, .h5, .h6, h1, h2, h3, h4, h5, h6 {
-  font-family: inherit;
-  font-weight: 500;
-  line-height: 1.1;
-  color: inherit;
+	font-family: inherit;
+	font-weight: 500;
+	line-height: 1.1;
+	color: inherit;
 }
 
 .el-message-box__status + .el-message-box__message{
-  word-break: break-word;
+    word-break: break-word;
 }
 
 .el-dialog:not(.is-fullscreen) {
-  margin-top: 6vh !important;
+	margin-top: 6vh !important;
 }
 
 .el-dialog__wrapper.scrollbar .el-dialog .el-dialog__body {
-  overflow: auto;
-  overflow-x: hidden;
-  max-height: 70vh;
-  padding: 10px 20px 0;
+    overflow: auto;
+	overflow-x: hidden;
+	max-height: 70vh;
+	padding: 10px 20px 0;
 }
 
 .el-table {
-  .el-table__header-wrapper, .el-table__fixed-header-wrapper {
-    th {
-      word-break: break-word;
-      background-color: #f8f8f9;
-      color: #515a6e;
-      height: 40px;
-      font-size: 13px;
-    }
-  }
-
-  .el-table__body-wrapper {
-    .el-button [class*="el-icon-"] + span {
-      margin-left: 1px;
-    }
-  }
+	.el-table__header-wrapper, .el-table__fixed-header-wrapper {
+		th {
+			word-break: break-word;
+			background-color: #f8f8f9;
+			color: #515a6e;
+			height: 40px;
+			font-size: 13px;
+		}
+	}
+	.el-table__body-wrapper {
+		.el-button [class*="el-icon-"] + span {
+			margin-left: 1px;
+		}
+	}
 }
 
 /** 表单布局 **/
 .form-header {
-  font-size: 15px;
-  color: #6379bb;
-  border-bottom: 1px solid #ddd;
-  margin: 8px 10px 25px 10px;
-  padding-bottom: 5px
+    font-size:15px;
+	color:#6379bb;
+	border-bottom:1px solid #ddd;
+	margin:8px 10px 25px 10px;
+	padding-bottom:5px
 }
 
 /** 表格布局 **/
 .pagination-container {
-  display: flex;
-  justify-content: flex-end;
-  margin-top: 20px;
+	position: relative;
+	height: 25px;
+	margin-bottom: 10px;
+	margin-top: 15px;
+	padding: 10px 20px !important;
 }
 
 /* tree border */
 .tree-border {
-  margin-top: 5px;
-  border: 1px solid #e5e6e7;
-  background: #FFFFFF none;
-  border-radius: 4px;
+    margin-top: 5px;
+    border: 1px solid #e5e6e7;
+    background: #FFFFFF none;
+    border-radius:4px;
+}
+
+.pagination-container .el-pagination {
+	right: 0;
+	position: absolute;
 }
 
-@media (max-width: 768px) {
+@media ( max-width : 768px) {
   .pagination-container .el-pagination > .el-pagination__jump {
     display: none !important;
   }
@@ -140,9 +133,9 @@
 }
 
 .el-table .fixed-width .el-button--mini {
-  padding-left: 0;
-  padding-right: 0;
-  width: inherit;
+	padding-left: 0;
+	padding-right: 0;
+	width: inherit;
 }
 
 /** 表格更多操作下拉样式 */
@@ -152,49 +145,51 @@
 }
 
 .el-table .el-dropdown, .el-icon-arrow-down {
-  font-size: 12px;
+	font-size: 12px;
 }
 
 .el-tree-node__content > .el-checkbox {
-  margin-right: 8px;
+	margin-right: 8px;
 }
 
 .list-group-striped > .list-group-item {
-  border-left: 0;
-  border-right: 0;
-  border-radius: 0;
-  padding-left: 0;
-  padding-right: 0;
+	border-left: 0;
+	border-right: 0;
+	border-radius: 0;
+	padding-left: 0;
+	padding-right: 0;
 }
 
 .list-group {
-  padding-left: 0px;
-  list-style: none;
+	padding-left: 0px;
+	list-style: none;
 }
 
 .list-group-item {
-  border-bottom: 1px solid #e7eaec;
-  border-top: 1px solid #e7eaec;
-  margin-bottom: -1px;
-  padding: 11px 0px;
-  font-size: 13px;
+	border-bottom: 1px solid #e7eaec;
+	border-top: 1px solid #e7eaec;
+	margin-bottom: -1px;
+	padding: 11px 0px;
+	font-size: 13px;
 }
 
 .pull-right {
-  float: right !important;
+	float: right !important;
 }
 
 .el-card__header {
-  padding: 14px 15px 7px;
-  min-height: 40px;
+	padding: 14px 15px 7px;
+	min-height: 40px;
 }
 
 .el-card__body {
-  padding: 15px 20px 20px 20px;
+	padding: 15px 20px 20px 20px;
 }
 
 .card-box {
-  margin-bottom: 10px;
+	padding-right: 15px;
+	padding-left: 15px;
+	margin-bottom: 10px;
 }
 
 /* button color */
@@ -220,68 +215,63 @@
 
 /* text color */
 .text-navy {
-  color: #1ab394;
+	color: #1ab394;
 }
 
 .text-primary {
-  color: inherit;
+	color: inherit;
 }
 
 .text-success {
-  color: #1c84c6;
+	color: #1c84c6;
 }
 
 .text-info {
-  color: #23c6c8;
+	color: #23c6c8;
 }
 
 .text-warning {
-  color: #f8ac59;
+	color: #f8ac59;
 }
 
 .text-danger {
-  color: #ed5565;
+	color: #ed5565;
 }
 
 .text-muted {
-  color: #888888;
+	color: #888888;
 }
 
 /* image */
 .img-circle {
-  border-radius: 50%;
+	border-radius: 50%;
 }
 
 .img-lg {
-  width: 120px;
-  height: 120px;
+	width: 120px;
+	height: 120px;
 }
 
 .avatar-upload-preview {
-  position: relative;
-  top: 50%;
-  left: 50%;
-  transform: translate(-50%, -50%);
-  width: 200px;
-  height: 200px;
-  border-radius: 50%;
-  box-shadow: 0 0 4px #ccc;
-  overflow: hidden;
+	position: relative;
+	top: 50%;
+	left: 50%;
+	transform: translate(-50%, -50%);
+	width: 200px;
+	height: 200px;
+	border-radius: 50%;
+	box-shadow: 0 0 4px #ccc;
+	overflow: hidden;
 }
 
 /* 拖拽列样式 */
-.sortable-ghost {
-  opacity: .8;
-  color: #fff !important;
-  background: #42b983 !important;
+.sortable-ghost{
+	opacity: .8;
+	color: #fff!important;
+	background: #42b983!important;
 }
 
 .top-right-btn {
-  position: relative;
-  float: right;
-}
-
-/* 分割面板样式 */
-.splitpanes.default-theme .splitpanes__pane {
-  background-color: #fff!important;
+	position: relative;
+	float: right;
 }

+ 27 - 9
ruoyi-ui/src/assets/styles/sidebar.scss

@@ -24,8 +24,8 @@
     left: 0;
     z-index: 1001;
     overflow: hidden;
-    -webkit-box-shadow: 2px 0 6px rgba(0,21,41,.35);
-    box-shadow: 0px 0px 8px 0px rgba(0, 0, 0, 0.1);
+    // -webkit-box-shadow: 2px 0 6px rgba(0,21,41,.35);
+    // box-shadow: 2px 0 6px rgba(0,21,41,.35);
 
     // reset element-ui css
     .horizontal-collapse-transition {
@@ -47,6 +47,7 @@
     &.has-logo {
       .el-scrollbar {
         height: calc(100% - 50px);
+        background: #E7F5F1;
       }
     }
 
@@ -68,24 +69,29 @@
       border: none;
       height: 100%;
       width: 100% !important;
+      background:  #E7F5F1
     }
 
     .el-menu-item, .el-submenu__title {
       overflow: hidden !important;
       text-overflow: ellipsis !important;
       white-space: nowrap !important;
+      color:#4B5A6D !important;
     }
 
     // menu hover
     .submenu-title-noDropdown,
     .el-submenu__title {
       &:hover {
-        background-color: rgba(0, 0, 0, 0.06) !important;
+        background-color: #DDEBE7 !important;
+         color: #03BF8A !important;
       }
     }
 
     & .theme-dark .is-active > .el-submenu__title {
-      color: $base-menu-color-active !important;
+      // color: $base-menu-color-active !important;
+      color: #03BF8A !important;
+      // background-color: #196CFF !important;
     }
 
     & .nest-menu .el-submenu>.el-submenu__title,
@@ -93,19 +99,30 @@
       min-width: $base-sidebar-width !important;
 
       &:hover {
-        background-color: rgba(0, 0, 0, 0.06) !important;
+        // background-color: #196CFF !important;
+        background-color: #DDEBE7 !important;
+         color: #03BF8A !important;
       }
     }
 
     & .theme-dark .nest-menu .el-submenu>.el-submenu__title,
     & .theme-dark .el-submenu .el-menu-item {
-      background-color: $base-sub-menu-background !important;
-
+      // background-color: $base-sub-menu-background ;
       &:hover {
-        background-color: $base-sub-menu-hover !important;
+        // background-color: $base-sub-menu-hover !important;
       }
     }
   }
+  // .sidebar-container .theme-dark .el-submenu
+.el-menu-item.is-active{
+  color: #03BF8A !important;
+  // background-color: #196CFF !important;
+  background-color: #DDEBE7;
+      width: 90%;
+      margin-left: 50%;
+      transform: translateX(-50%);
+      border-radius: 4px;
+}
 
   .hideSidebar {
     .sidebar-container {
@@ -202,7 +219,7 @@
   .el-menu-item {
     &:hover {
       // you can use $subMenuHover
-      background-color: rgba(0, 0, 0, 0.06) !important;
+      // background-color: rgba(0, 0, 0, 0.06) !important;
     }
   }
 
@@ -225,3 +242,4 @@
     }
   }
 }
+

+ 5 - 5
ruoyi-ui/src/assets/styles/variables.scss

@@ -9,17 +9,17 @@ $yellow:#FEC171;
 $panGreen: #30B08F;
 
 // 默认菜单主题风格
-$base-menu-color:#bfcbd9;
+$base-menu-color:#A7B4C6;
 $base-menu-color-active:#f4f4f5;
-$base-menu-background:#304156;
+$base-menu-background:'';
 $base-logo-title-color: #ffffff;
 
-$base-menu-light-color:rgba(0,0,0,.70);
+$base-menu-light-color:'';
 $base-menu-light-background:#ffffff;
 $base-logo-light-title-color: #001529;
 
-$base-sub-menu-background:#1f2d3d;
-$base-sub-menu-hover:#001528;
+$base-sub-menu-background:'';
+$base-sub-menu-hover:#202B3E;
 
 // 自定义暗色菜单风格
 /**

+ 265 - 0
ruoyi-ui/src/components/ImageUploadr/index.vue

@@ -0,0 +1,265 @@
+<template>
+  <div class="component-upload-image">
+    <el-upload
+      multiple
+      :action="uploadImgUrl"
+      list-type="picture-card"
+      :on-success="handleUploadSuccess"
+      :before-upload="handleBeforeUpload"
+      :data="data"
+      :limit="limit"
+      :on-error="handleUploadError"
+      :on-exceed="handleExceed"
+      ref="imageUpload"
+      :on-remove="handleDelete"
+      :show-file-list="true"
+      :headers="headers"
+      :file-list="fileList"
+      :on-preview="handlePictureCardPreview"
+      :class="{hide: this.fileList.length >= this.limit}"
+    >
+     <!--  -->
+     <div>
+       <i class="el-icon-camera"></i>
+       <div style=" margin-top: -50px; font-weight: 500;font-size: 14px;color: #C3C3C3;line-height: 25px;">支持上传照片或 在线拍摄照片</div>
+     </div>
+    </el-upload>
+
+    <!-- 上传提示 -->
+    <!-- <div class="el-upload__tip" slot="tip" v-if="showTip">
+      请上传
+      <template v-if="fileSize"> 大小不超过 <b style="color: #f56c6c">{{ fileSize }}MB</b> </template>
+      <template v-if="fileType"> 格式为 <b style="color: #f56c6c">{{ fileType.join("/") }}</b> </template>
+      的文件
+    </div> -->
+
+    <el-dialog
+      :visible.sync="dialogVisible"
+      title="预览"
+      width="800"
+      append-to-body
+    >
+      <img
+        :src="dialogImageUrl"
+        style="display: block; max-width: 100%; margin: 0 auto"
+      />
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import { getToken } from "@/utils/auth"
+import { isExternal } from "@/utils/validate"
+import Sortable from 'sortablejs'
+
+export default {
+  props: {
+    value: [String, Object, Array],
+    // 上传接口地址
+    action: {
+      type: String,
+      default: "/common/upload"
+    },
+    // 上传携带的参数
+    data: {
+      type: Object
+    },
+    // 图片数量限制
+    limit: {
+      type: Number,
+      default: 5
+    },
+    // 大小限制(MB)
+    fileSize: {
+       type: Number,
+      default: 5
+    },
+    // 文件类型, 例如['png', 'jpg', 'jpeg']
+    fileType: {
+      type: Array,
+      default: () => ["png", "jpg", "jpeg"]
+    },
+    // 是否显示提示
+    isShowTip: {
+      type: Boolean,
+      default: true
+    },
+      // 拖动排序
+    drag: {
+      type: Boolean,
+      default: true
+    }
+  },
+  data() {
+    return {
+      number: 0,
+      uploadList: [],
+      dialogImageUrl: "",
+      dialogVisible: false,
+      hideUpload: false,
+      baseUrl: process.env.VUE_APP_BASE_API,
+      uploadImgUrl: process.env.VUE_APP_BASE_API + this.action, // 上传的图片服务器地址
+      headers: {
+        Authorization: "Bearer " + getToken(),
+      },
+      fileList: []
+    }
+  },
+  mounted() {
+    if (this.drag) {
+      this.$nextTick(() => {
+        const element = document.querySelector('.el-upload-list')
+        Sortable.create(element, {
+          onEnd: (evt) => {
+            const movedItem = this.fileList.splice(evt.oldIndex, 1)[0]
+            this.fileList.splice(evt.newIndex, 0, movedItem)
+            this.$emit("input", this.listToString(this.fileList))
+          }
+        })
+      })
+    }
+  },
+  watch: {
+    value: {
+      handler(val) {
+        if (val) {
+          // 首先将值转为数组
+          const list = Array.isArray(val) ? val : this.value.split(',')
+          // 然后将数组转为对象数组
+          this.fileList = list.map(item => {
+            if (typeof item === "string") {
+              if (item.indexOf(this.baseUrl) === -1 && !isExternal(item)) {
+                  item = { name: this.baseUrl + item, url: this.baseUrl + item }
+              } else {
+                  item = { name: item, url: item }
+              }
+            }
+            return item
+          })
+        } else {
+          this.fileList = []
+          return []
+        }
+      },
+      deep: true,
+      immediate: true
+    }
+  },
+  computed: {
+    // 是否显示提示
+    showTip() {
+      return this.isShowTip && (this.fileType || this.fileSize)
+    },
+  },
+  methods: {
+    // 上传前loading加载
+    handleBeforeUpload(file) {
+      let isImg = false
+      if (this.fileType.length) {
+        let fileExtension = ""
+        if (file.name.lastIndexOf(".") > -1) {
+          fileExtension = file.name.slice(file.name.lastIndexOf(".") + 1)
+        }
+        isImg = this.fileType.some(type => {
+          if (file.type.indexOf(type) > -1) return true
+          if (fileExtension && fileExtension.indexOf(type) > -1) return true
+          return false
+        })
+      } else {
+        isImg = file.type.indexOf("image") > -1
+      }
+
+      if (!isImg) {
+        this.$modal.msgError(`文件格式不正确,请上传${this.fileType.join("/")}图片格式文件!`)
+        return false
+      }
+      if (file.name.includes(',')) {
+        this.$modal.msgError('文件名不正确,不能包含英文逗号!')
+        return false
+      }
+      if (this.fileSize) {
+        const isLt = file.size / 1024 / 1024 < this.fileSize
+        if (!isLt) {
+          this.$modal.msgError(`上传头像图片大小不能超过 ${this.fileSize} MB!`)
+          return false
+        }
+      }
+      this.$modal.loading("正在上传图片,请稍候...")
+      this.number++
+    },
+    // 文件个数超出
+    handleExceed() {
+      this.$modal.msgError(`上传文件数量不能超过 ${this.limit} 个!`)
+    },
+    // 上传成功回调
+    handleUploadSuccess(res, file) {
+      if (res.code === 200) {
+        this.uploadList.push({ name: res.fileName, url: res.fileName })
+        this.uploadedSuccessfully()
+      } else {
+        this.number--
+        this.$modal.closeLoading()
+        this.$modal.msgError(res.msg)
+        this.$refs.imageUpload.handleRemove(file)
+        this.uploadedSuccessfully()
+      }
+    },
+    // 删除图片
+    handleDelete(file) {
+      const findex = this.fileList.map(f => f.name).indexOf(file.name)
+      if (findex > -1) {
+        this.fileList.splice(findex, 1)
+        this.$emit("input", this.listToString(this.fileList))
+      }
+    },
+    // 上传失败
+    handleUploadError() {
+      this.$modal.msgError("上传图片失败,请重试")
+      this.$modal.closeLoading()
+    },
+    // 上传结束处理
+    uploadedSuccessfully() {
+      if (this.number > 0 && this.uploadList.length === this.number) {
+        this.fileList = this.fileList.concat(this.uploadList)
+        this.uploadList = []
+        this.number = 0
+        this.$emit("input", this.listToString(this.fileList))
+        this.$modal.closeLoading()
+      }
+    },
+    // 预览
+    handlePictureCardPreview(file) {
+      this.dialogImageUrl = file.url
+      this.dialogVisible = true
+    },
+    // 对象转成指定字符串分隔
+    listToString(list, separator) {
+      let strs = ""
+      separator = separator || ","
+      for (let i in list) {
+        if (list[i].url) {
+          strs += list[i].url.replace(this.baseUrl, "") + separator
+        }
+      }
+      return strs != '' ? strs.substr(0, strs.length - 1) : ''
+    }
+  }
+}
+</script>
+<style scoped lang="scss">
+// .el-upload--picture-card 控制加号部分
+::v-deep.hide .el-upload--picture-card {
+    display: none;
+}
+// 去掉动画效果
+::v-deep .el-list-enter-active,
+::v-deep .el-list-leave-active {
+    transition: all 0s;
+}
+
+::v-deep .el-list-enter, .el-list-leave-active {
+  opacity: 0;
+  transform: translateY(0);
+}
+</style>
+

+ 56 - 15
ruoyi-ui/src/components/Pagination/index.vue

@@ -1,17 +1,19 @@
 <template>
-  <div :class="{'hidden':hidden}" class="pagination-container">
-    <el-pagination
-      :background="background"
-      :current-page.sync="currentPage"
-      :page-size.sync="pageSize"
-      :layout="layout"
-      :page-sizes="pageSizes"
-      :pager-count="pagerCount"
-      :total="total"
-      v-bind="$attrs"
-      @size-change="handleSizeChange"
-      @current-change="handleCurrentChange"
-    />
+  <div class="daba">
+    <div :class="{'hidden':hidden}" class="pagination-container ike">
+      <el-pagination
+        :background="background"
+        :current-page.sync="currentPage"
+        :page-size.sync="pageSize"
+        :layout="layout"
+        :page-sizes="pageSizes"
+        :pager-count="pagerCount"
+        :total="total"
+        v-bind="$attrs"
+        @size-change="handleSizeChange"
+        @current-change="handleCurrentChange"
+      />
+    </div>
   </div>
 </template>
 
@@ -104,9 +106,48 @@ export default {
 </script>
 
 <style scoped>
-.pagination-container {
-  background: #fff;
+.ike {
+  /* background: #fff; */
+  text-align: center;
+  height: 50px;
 }
+.daba{
+  .pagination-container .el-pagination{
+    left: 50%;
+    transform: translateX(-50%);
+  }
+  .el-input__inner{
+    border: 0;
+    background: #DDEBE7;
+  }
+  .el-pagination button:disabled{
+    background-color:#DDEBE7;
+    color: #4B5A6D;
+
+
+  }
+  .el-pagination .btn-prev, .el-pagination .btn-next{
+    background-color:#DDEBE7;
+    color: #4B5A6D;
+  }
+  .el-pager li{
+    /* margin-right: 5px; */
+    background-color:#DDEBE7;
+    color: #4B5A6D;
+  }
+  .el-pagination.is-background .el-pager li:not(.disabled).active{
+    background-color:#03BF8A;
+    color: #fff;
+  }
+  .el-pager li.active{
+    background-color:#DDEBE7;
+    color: #4B5A6D;
+  }
+  .el-pager li:nth-child(1){
+    /* margin-left: 5px; */
+  }
+}
+
 .pagination-container.hidden {
   display: none;
 }

+ 155 - 0
ruoyi-ui/src/components/Paginations/index.vue

@@ -0,0 +1,155 @@
+<template >
+
+  <div class="tuwe">
+    <div :class="{'hidden':hidden}" class="pagination-container ">
+      <el-pagination
+            :current-page.sync="currentPage"
+            :page-size.sync="pageSize"
+            :layout="layout"
+      	  :small="true"
+            :page-sizes="pageSizes"
+            :pager-count="pagerCount"
+            :total="total"
+            v-bind="$attrs"
+            @size-change="handleSizeChange"
+            @current-change="handleCurrentChange"
+          />
+    </div>
+  </div>
+</template>
+
+<script>
+import { scrollTo } from '@/utils/scroll-to'
+
+export default {
+  name: 'Pagination',
+  props: {
+    total: {
+      required: true,
+      type: Number
+    },
+    page: {
+      type: Number,
+      default: 1
+    },
+    limit: {
+      type: Number,
+      default: 20
+    },
+    pageSizes: {
+      type: Array,
+      default() {
+        return [3,10, 20, 30, 50]
+      }
+    },
+    // 移动端页码按钮的数量端默认值5
+    pagerCount: {
+      type: Number,
+      default: document.body.clientWidth < 992 ? 5 : 7
+    },
+    layout: {
+      type: String,
+     default: 'total,  prev, pager, next'
+    },
+    background: {
+      type: Boolean,
+      default: true
+    },
+    autoScroll: {
+      type: Boolean,
+      default: true
+    },
+    hidden: {
+      type: Boolean,
+      default: false
+    }
+  },
+  data() {
+    return {
+    };
+  },
+  computed: {
+    currentPage: {
+      get() {
+        return this.page
+      },
+      set(val) {
+        this.$emit('update:page', val)
+      }
+    },
+    pageSize: {
+      get() {
+        return this.limit
+      },
+      set(val) {
+        this.$emit('update:limit', val)
+      }
+    }
+  },
+  methods: {
+    handleSizeChange(val) {
+      if (this.currentPage * val > this.total) {
+        this.currentPage = 1
+      }
+      this.$emit('pagination', { page: this.currentPage, limit: val })
+      if (this.autoScroll) {
+        scrollTo(0, 800)
+      }
+    },
+    handleCurrentChange(val) {
+      this.$emit('pagination', { page: val, limit: this.pageSize })
+      if (this.autoScroll) {
+        scrollTo(0, 800)
+      }
+    }
+  }
+}
+</script>
+
+<style scoped>
+.pagination-container {
+  /* background: #fff; */
+  /* padding: 32px 16px; */
+}
+.tuwe {
+  .el-input__inner{
+    border: 0;
+    background: #DDEBE7;
+  }
+  .el-pagination button:disabled{
+    background-color:#DDEBE7;
+    color: #4B5A6D;
+
+
+  }
+  .el-pagination .btn-prev, .el-pagination .btn-next{
+    background-color:#DDEBE7;
+    color: #4B5A6D;
+  }
+  .el-pager li{
+    margin-right: 5px;
+    background-color:#DDEBE7;
+    color: #4B5A6D;
+  }
+  .el-pagination.is-background .el-pager li:not(.disabled).active{
+    background-color:#03BF8A;
+    color: #fff;
+  }
+  .el-pager li.active{
+    background-color:#03BF8A;
+    color: #fff;
+  }
+  .el-pager li:nth-child(1){
+    margin-left: 5px;
+  }
+}
+
+.tuwe .pagination-container .el-pagination{
+  left: 50%;
+  transform: translateX(-50%);
+  text-align: center;
+}
+.pagination-container.hidden {
+  display: none;
+}
+</style>

+ 373 - 0
ruoyi-ui/src/components/Photo/index.vue

@@ -0,0 +1,373 @@
+<template>
+  <div>
+    <el-dialog  width="720px" :title="title" :close-on-click-modal="false" :visible.sync="dialogPhotoVisible">
+      <div v-show="!noShow" class="pictureBox">
+        <div >
+          <div v-show="cameraShow" id="my_camera">
+            <video id="videoCamera" :width="videoWidth" :height="videoHeight" autoplay></video>
+            <canvas style="display:none;" id="canvasCamera" :width="videoWidth" :height="videoHeight"></canvas>
+          </div>
+
+          <div v-show="!cameraShow" class="camera_no">
+            <div>
+              <i class="el-icon-loading"/>
+            </div>
+            <div class="text">{{ loadingText }}</div>
+          </div>
+        </div>
+
+        <div class="picList">
+          <div style="padding-left: 10px;">
+            示例
+            <img :src="srt" alt="" style="width: 100%; height: 130px">
+          </div>
+          <div v-for="(s, index) in listSrc" style="position: relative">
+            <el-image
+              style="width: 100%; height: 130px"
+              :src="s.src"
+              :preview-src-list="getSrcList(index)" lazy>
+            </el-image>
+            <i class="el-icon-error" @click="delClick(s)"></i>
+          </div>
+
+        </div>
+      </div>
+      <div v-show="noShow" class="camera_no_data">
+        <div>
+          <i class="el-icon-loading"/>
+        </div>
+        <div class="text">{{ loadingErrorText }}</div>
+      </div>
+
+      <div class="btn-group" v-show="!noShow">
+        <div class="btn-cn" v-show="cameraShow">
+          <el-button v-if="listSrc.length < 1"  type="warning" :loading="saveLoading" @click="takeSnapShot()">拍照</el-button>
+          <el-button v-if="listSrc.length !== 0" type="danger" :loading="saveLoading" @click="againTakePhoto()">清空</el-button>
+          <el-button type="primary" :loading="saveLoading" @click="saveSnapShot()">上传</el-button>
+        </div>
+      </div>
+      <div slot="footer" class="dialog-footer">
+        <el-button @click="dialogPhotoVisible = false">关 闭</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+<script>
+
+  import { unploa } from '@/api/manage/staffManage'
+
+  export default {
+    name: 'PhotoApply',
+    data() {
+      return {
+        dialogPhotoVisible: false,
+        videoWidth: 480,
+        videoHeight: 360,
+        imgSrc: "",
+        thisCancas: null,
+        thisContext: null,
+        thisVideo: null,
+        stream: null,
+        src: '',
+        srt:'../../assets/images/zwshjbig.png',
+        listSrc: [],
+        takePhoto: true,
+        cameraShow: false,
+        saveLoading: false,
+        noShow: false,
+        loadingText: '正在加载摄像头...',
+        loadingErrorText: '正在加载摄像头...'
+      }
+    },
+    props: {
+      title: {
+        type: String
+      }
+    },
+    watch: {
+      dialogPhotoVisible(val) {
+        if (val) {
+          this.$nextTick(() => {
+            this.open()
+          })
+        } else {
+          this.listSrc = []
+          this.close()
+        }
+      }
+    },
+    beforeDestroy() {
+      this.listSrc = []
+    },
+    mounted() {
+    },
+    methods: {
+      getSrcList(index){
+        const srcs = this.listSrc.map((v) => { return v.src })
+        return srcs.slice(index).concat(srcs.slice(0,index))
+      },
+      takeSnapShot() {
+        const _this = this
+        const timestamp = new Date().getTime()
+        const fileName = _this.applyID + '_' + timestamp
+        // canvas画图
+        _this.thisContext.drawImage(
+          _this.thisVideo,
+          0,
+          0,
+          _this.videoWidth,
+          _this.videoHeight
+        );
+        // 获取图片base64链接
+        const image = _this.thisCancas.toDataURL("image/jpeg");
+        _this.src = image
+        // console.log(_this.src)
+        _this.listSrc.push({
+          src: _this.src,
+          file: this.dataToFile(_this.src, fileName),
+          title: fileName
+        })
+
+        _this.takePhoto = false
+      },
+      /**
+       * 将base64转换成file
+       */
+       dataToFile(base64, fileName){
+
+        const parts = base64.split(';base64,')
+        const contentType = parts[0].split(':')[1]
+        const raw = window.atob(parts[1])
+        const rawLength = raw.length
+
+        const uInt8Array = new Uint8Array(rawLength)
+
+        for (let i = 0; i < rawLength; ++i) {
+          uInt8Array[i] = raw.charCodeAt(i)
+        }
+        console.log(new File([uInt8Array], fileName, {type: contentType, lastModified: Date.now()}))
+        return new File([uInt8Array], fileName, {type: contentType, lastModified: Date.now()})
+      },
+      delClick(src) {
+        this.listSrc = this.listSrc.filter((v) => {return src.src !== v.src})
+      },
+      againTakePhoto() {
+        this.src = ''
+        this.listSrc = []
+      },
+      saveSnapShot() {
+        if (this.listSrc.length === 0) {
+          this.$message.warning('请上传相关数据')
+          return
+        }
+        // 拍照
+        const _this = this
+        // 调用后台接口
+        _this.saveLoading = true
+        _this.loadingText = '正在上传图片,请稍后...'
+        let formData = new FormData()
+        _this.listSrc.forEach((v) => {
+          console.log(v,formData,3)
+          formData.append("file", v.file)
+        })
+        console.log(formData,3)
+        // 上传自己可以自己写
+        unploa(formData).then(response => {
+          this.$modal.msgSuccess("成功")
+          this.$emit("input", response.fileName)
+         _this.dialogPhotoVisible = false
+        })
+        // unploa(formData).then(res => {
+        //   // const data = res.message
+        //   _this.$message.success('上传图片成功')
+        //   _this.dialogPhotoVisible = false
+        // })
+        // .catch(() => {
+        //   setTimeout(() => {
+        //     // 失败
+        //     _this.src = ''
+        //     _this.saveLoading = false
+        //     _this.takePhoto = true
+        //     _this.cameraShow = true
+        //   }, 500)
+        // })
+      },
+      close() {
+        this.src = ''
+        this.listSrc = []
+        this.saveLoading = false
+        this.cameraShow = false
+        this.takePhoto = true
+        this.loadingText = '正在关闭摄像头...'
+        this.stopNavigator()
+      },
+      open() {
+        this.cameraShow = false
+        this.loadingText = '正在打开摄像头...'
+
+        this.getCompetence()
+        setTimeout(() => {
+          this.cameraShow = true
+        }, 1500)
+      },
+      // 调用权限(打开摄像头功能)
+      getCompetence() {
+        console.log(this.listSrc)
+        const _this = this;
+        _this.thisCancas = document.getElementById("canvasCamera");
+        _this.thisContext = this.thisCancas.getContext("2d");
+        _this.thisVideo = document.getElementById("videoCamera");
+        _this.thisVideo.style.display = 'block';
+        // 获取媒体属性,旧版本浏览器可能不支持mediaDevices,我们首先设置一个空对象
+        if (navigator.mediaDevices === undefined) {
+          navigator.mediaDevices = {};
+        }
+        // 一些浏览器实现了部分mediaDevices,我们不能只分配一个对象
+        // 使用getUserMedia,因为它会覆盖现有的属性。
+        // 这里,如果缺少getUserMedia属性,就添加它。
+        if (navigator.mediaDevices.getUserMedia === undefined) {
+          navigator.mediaDevices.getUserMedia = function(constraints) {
+            // 首先获取现存的getUserMedia(如果存在)
+            const getUserMedia =
+              navigator.webkitGetUserMedia ||
+              navigator.mozGetUserMedia ||
+              navigator.getUserMedia;
+            // 有些浏览器不支持,会返回错误信息
+            // 保持接口一致
+            if (!getUserMedia) {//不存在则报错
+              return Promise.reject(
+                _this.$message.error("浏览器没有打开摄像头的权限!")
+              );
+            }
+            // 否则,使用Promise将调用包装到旧的navigator.getUserMedia
+            return new Promise(function(resolve, reject) {
+              getUserMedia.call(navigator, constraints, resolve, reject);
+            });
+          };
+        }
+        let constraints = {
+          audio: false,
+          video: {
+            width: this.videoWidth,
+            height: this.videoHeight,
+            transform: "scaleX(-1)"
+          }
+        };
+        navigator.mediaDevices.getUserMedia(constraints).then(function(stream) {
+          _this.stream = stream
+          // 旧的浏览器可能没有srcObject
+          if ("srcObject" in _this.thisVideo) {
+            _this.thisVideo.srcObject = stream;
+          } else {
+            // 避免在新的浏览器中使用它,因为它正在被弃用。
+            _this.thisVideo.src = window.URL.createObjectURL(stream);
+          }
+          _this.thisVideo.onloadedmetadata = function(e) {
+            _this.thisVideo.play();
+          };
+        }).catch(err => {
+          console.log(err);
+          this.$nextTick(() => {
+            this.noShow = true
+            this.loadingErrorText = '浏览器没有打开摄像头的权限!在chrome浏览器的地址栏中输入: chrome://flags/#unsafely-treat-insecure-origin-as-secure,将该 flag 切换成 enable 状态;\n' +
+              '在输入框中填写需要开启的域名或地址,如果有多个,则以逗号分隔;\n' +
+              '重启浏览器后生效。'
+          })
+        });
+      },
+      // 关闭摄像头
+      stopNavigator() {
+        if (this.stream) {
+          if (this.stream.getVideoTracks) {
+            let tracks = this.stream.getVideoTracks();
+            if (tracks && tracks[0] && tracks[0].stop) tracks[0].stop();
+          } else if (this.stream.stop) {
+            this.stream.stop();
+          }
+        }
+      }
+    }
+  }
+</script>
+
+<style scoped lang="scss">
+  .pictureBox {
+    display: flex;
+    align-items: center;
+    justify-content: space-between;
+  }
+
+  .btn-cn {
+    width: 100%;
+    text-align: center;
+    margin-top: 20px;
+    margin-bottom: 20px;
+  }
+
+  #my_camera {
+    border: 1px solid #606266;
+  }
+
+  .picList{
+    width: 200px;
+    overflow-x: hidden;
+    overflow-y: scroll;
+    height: 360px;
+    .el-image{
+      width: 180px;
+      height: 130px;
+      margin: 0px 0px 10px 10px;
+    }
+  }
+  .camera_no_data{
+    display: flex;
+    flex-direction: column;
+    justify-content: center;
+    align-items: center;
+    padding: 50px;
+    width: 100%;
+    margin-bottom: 20px;
+    background: #fff;
+    height: 360px;
+    border: 1px solid #606266;
+    .el-icon-loading {
+      font-size: 40px;
+    }
+    .text {
+      font-size: 20px;
+      margin-top: 30px;
+    }
+  }
+  .camera_no {
+    position: relative;
+    background: #fff;
+    width: 480px;
+    height: 360px;
+    border: 1px solid #606266;
+    display: flex;
+    flex-direction: column;
+    justify-content: center;
+    align-items: center;
+
+    .el-icon-loading {
+      font-size: 40px;
+    }
+
+    .text {
+      font-size: 20px;
+      margin-top: 30px;
+    }
+  }
+  ::v-deep .el-image-viewer__mask {
+    opacity: .9;
+    background: #fff;
+  }
+  .el-icon-error{
+    position: absolute;
+    right: 0;
+    top: 0;
+    font-size: 25px;
+    color: yellow;
+    cursor: pointer;
+  }
+</style>

+ 296 - 19
ruoyi-ui/src/layout/components/Navbar.vue

@@ -1,12 +1,45 @@
 <template>
   <div class="navbar">
     <hamburger id="hamburger-container" :is-active="sidebar.opened" class="hamburger-container" @toggleClick="toggleSideBar" />
-
-    <breadcrumb v-if="!topNav" id="breadcrumb-container" class="breadcrumb-container" />
-    <top-nav v-if="topNav" id="topmenu-container" class="topmenu-container" />
-
-    <div class="right-menu">
-      <template v-if="device!=='mobile'">
+    <!-- <breadcrumb id="breadcrumb-container" class="breadcrumb-container" v-if="!topNav"/> -->
+    <!-- <top-nav id="topmenu-container" class="topmenu-container" v-if="topNav"/> -->
+    <!-- <div class="sign_box">
+      <div class="sign_item" :class="{active: activeMenu.includes((item.path||item.redirect))}"  v-for="(item,index) in this.sidebarRouters.filter(res => {
+            return res.hidden == false || res.redirect == 'index'
+          })" :key="index"
+        @click="tabBtn(item)">
+        <item v-if="item.meta" :icon="item.meta && item.meta.icon" :title="item.meta.title" />
+        <item v-if="!item.meta" :icon="item.meta && item.meta.icon" :title="'首页'" />
+      </div>
+    </div> -->
+    <div class="right-menu" style="display: flex;align-items: center;">
+			<!-- <el-select
+			  v-model="companyName"
+			  clearable
+			  filterable
+			  reserve-keyword
+			  placeholder="选择小区"
+			  v-if="userId === 1 && tenantEnabled"
+			  @change="dynamicTenantEvent"
+			  @clear="dynamicClearEvent"
+			>
+			  <el-option v-for="item in tenantList" :key="item.tenantId" :label="item.companyName" :value="item.tenantId"> </el-option>
+			  <template ><svg-icon icon-class="company" class="el-input__icon input-icon" /></template>
+			</el-select>
+      <el-select
+        v-model="companyName"
+        clearable
+        filterable
+        reserve-keyword
+        placeholder="选择小区"
+        v-if="userId != 1 && (tenantListtw.length !=0 && tenantListtw.length !=1)"
+        @change="dynamicTenantEventg"
+        @clear="dynamicClearEvent"
+      >
+        <el-option v-for="item in tenantListtw" :key="item.tenantId" :label="item.companyName" :value="item.tenantId"> </el-option>
+        <template ><svg-icon icon-class="company" class="el-input__icon input-icon" /></template>
+      </el-select> -->
+      <!-- <template v-if="device!=='mobile'">
         <search id="header-search" class="right-menu-item" />
 
         <el-tooltip content="源码地址" effect="dark" placement="bottom">
@@ -23,13 +56,28 @@
           <size-select id="size-select" class="right-menu-item hover-effect" />
         </el-tooltip>
 
-      </template>
+      </template> -->
 
-      <el-dropdown class="avatar-container right-menu-item hover-effect" trigger="click">
-        <div class="avatar-wrapper">
+      <el-dropdown  class="avatar-container right-menu-item hover-effect nhdes"  trigger="hover" >
+		  <!-- <img src="../../assets/images/pic_htgl_grxx_bg.png" class="imgse" > -->
+		  <div class="nhse ">
+        <div class="avatar-wrapper  el-dropdown-link">
           <img :src="avatar" class="user-avatar">
-          <i class="el-icon-caret-bottom" />
+
         </div>
+			<div class="acnes ">
+						  <p>
+							  <!-- <img src="../../assets/images/icon_htgl_hzh.png" > -->
+						  			  <span >
+						  			  	{{name}}
+						  			  </span>
+						  </p>
+
+			</div>
+      <i style="color: #333; opacity: 0.7;display: flex;align-items: center;" class="el-icon-caret-bottom " />
+      <!-- <i class="el-icon-caret-bottom" /> -->
+
+		  </div>
         <el-dropdown-menu slot="dropdown">
           <router-link to="/user/profile">
             <el-dropdown-item>个人中心</el-dropdown-item>
@@ -42,6 +90,14 @@
           </el-dropdown-item>
         </el-dropdown-menu>
       </el-dropdown>
+
+      <template>
+
+        <p style="display: flex;align-items: center;width:80px; cursor:pointer; " @click="logouth">
+             <!-- <img src="../../assets/images/icon_htdh_tc.png" class="user-avatar" style="width:13px;height:16px;margin-right: 10px;"> -->
+             <span style="font-weight: bold;font-size: 16px;color: #343434;">退出</span>
+          </p>
+      </template>
     </div>
   </div>
 </template>
@@ -56,6 +112,9 @@ import SizeSelect from '@/components/SizeSelect'
 import Search from '@/components/HeaderSearch'
 import RuoYiGit from '@/components/RuoYi/Git'
 import RuoYiDoc from '@/components/RuoYi/Doc'
+import { getCodeImg,register,getTenantList,getInfo } from "@/api/login";
+// import { dynamicClear, dynamicTenant,userNamet,dynamicTenantgw } from "@/api/zhihuixy/tenant";
+import { getToken, setToken, removeToken } from '@/utils/auth'
 
 export default {
   components: {
@@ -68,12 +127,21 @@ export default {
     RuoYiGit,
     RuoYiDoc
   },
+
   computed: {
     ...mapGetters([
       'sidebar',
       'avatar',
-      'device'
+      'device',
+	    'name',
+			'userId',
+      'dept',
+      'rolesName',
+	  "sidebarRouters", "sidebar", "tabIndex"
     ]),
+	activeMenu() {
+	  return this.tabIndex;
+	},
     setting: {
       get() {
         return this.$store.state.settings.showSettings
@@ -91,31 +159,203 @@ export default {
       }
     }
   },
+	data() {
+	  return {
+	    tenantEnabled:true,
+			tenantList:[],
+		  companyName:null,
+      tenantListtw:[],
+      usename:'',
+      timer:null,
+	  };
+	},
+
+  created() {
+  	console.log(this.$store.state.user)
+    this.usename = this.$store.state.user.name
+    // this.avatar = this.$store.state.user.avatar
+    // if(this.$store.getters.authenticationUser =='4' || this.$store.getters.authenticationUser =='3'){
+    //   if(this.usename =='admin'){
+    //     console.log(5)
+    //     this.getnhgw()
+    //   }else{
+    //     if(sessionStorage.getItem('companyName') != null ){
+    //       if(sessionStorage.getItem('companyName') != undefined ){
+    //         this.companyName = sessionStorage.getItem('companyName')
+    //       }
+    //     }
+    //     console.log(3)
+    //     this.getnhgwon()
+    //   }
+    // }
+
+  },
+  mouted(){
+    // this.$nextTick(()=>{
+                   let router_path = this.$route.path
+                   console.log(router_path)    // 输出当前页面的路由,如:/home
+               // })
+
+  },
+
   methods: {
+		getnhgw(){
+		  // this.loading = true;
+		  getTenantList().then(response => {
+			  // this.tenantEnabled = response.data.tenantEnabled
+		    this.tenantList = response.data.voList;
+		    // this.loading = false;
+		  });
+		},
+    getnhgwon(){
+      // this.loading = true;
+      let ngse={'userName': this.usename}
+      userNamet(ngse).then(response => {
+    	  // this.tenantEnabled = response.data.tenantEnabled
+        this.tenantListtw = response.data;
+        if(response.data.length !=0 || response.data.length !=1){
+          this.tenantEnabled = false
+        }
+
+
+        // this.loading = false;
+      });
+    },
+		dynamicTenantEvent(){
+			if (this.companyName != null && this.companyName !== '') {
+			  dynamicTenant(this.companyName).then(response => {
+			  	this.dynamic = true;
+			  	this.$tab.closeAllPage();
+			  	this.$router.push('/');
+			  });
+			}
+		},
+
+    dynamicTenantEventg(){
+    	if (this.companyName != null && this.companyName !== '') {
+        sessionStorage.setItem('companyName', this.companyName)
+        let ngpw={'tenantId':this.companyName,'clientId':'e5cd7e4891bf95d1d19206ce24a7b32e','grantType':'password'}
+    	  // dynamicTenantgw ngpw
+        dynamicTenantgw(ngpw).then(response => {
+    	  	this.dynamic = true;
+           setToken(response.msg)
+           let ngse={'userName': this.usename}
+           getInfo().then(response => {
+             // this.loading = false;
+             this.$router.push('/');
+             this.$tab.closeAllPage();
+             setTimeout(() => {
+               location.reload(true)
+                             }, 1000)
+             //
+             // location.reload(true)
+
+             this.companyName = response.data.user.tenantId
+           });
+    	  	// this.$tab.closeAllPage();
+    	  	// this.$router.push('/');
+    	  });
+    	}
+    },
+		dynamicClearEvent(){
+			dynamicClear().then(response => {
+				this.dynamic = false;
+				this.$tab.closeAllPage();
+				this.$router.push('/');
+			});
+		},
     toggleSideBar() {
       this.$store.dispatch('app/toggleSideBar')
     },
-    logout() {
+	tabBtn(item) {
+	  console.log(item)
+	  if(this.activeMenu.includes((item.path||item.redirect))){
+	    return
+	  }
+	  this.$store.dispatch('app/toggleSideBartwo')
+	  if (item.redirect == 'index') {
+	    if(this.$route.path!=='/index'){
+	      this.$router.push({
+	        path: '/index'
+	      })
+	    }
+	    this.$store.dispatch('TabFn', item.redirect)
+	    return
+	  }
+	  this.$store.dispatch('TabFn', item.path)
+	  this.showde = true
+
+	},
+	init() {
+	  const route = this.$route;
+	  const {
+	    meta,
+	    path
+	  } = route;
+	  // if set path, the sidebar will highlight the path you set
+	  console.log(route,13)
+	  if (meta.activeMenu) {
+	    this.$store.dispatch('TabFn', meta.activeMenu)
+	  }
+	  this.$store.dispatch('TabFn', path)
+	},
+    async logout() {
       this.$confirm('确定注销并退出系统吗?', '提示', {
         confirmButtonText: '确定',
         cancelButtonText: '取消',
         type: 'warning'
       }).then(() => {
+         sessionStorage.removeItem('companyName')
         this.$store.dispatch('LogOut').then(() => {
-          location.href = '/index'
+          location.href = '/index';
         })
-      }).catch(() => {})
+      }).catch(() => {});
+    },
+    async logouth() {
+      this.$confirm('确定注销并退出系统吗?', '提示', {
+        confirmButtonText: '确定',
+        cancelButtonText: '取消',
+        type: 'warning'
+      }).then(() => {
+        sessionStorage.removeItem('companyName')
+        this.$store.dispatch('LogOut').then(() => {
+          location.href = '/index';
+        })
+      }).catch(() => {});
     }
   }
 }
 </script>
+<style lang="scss">
+	.nhdes{
+		position: relative;
+		z-index: 99;
+		.el-button-group>.el-button{
+			border: none;
+			padding: 0;
+		}
+		.el-button-group>.el-button:hover{
+		  background-color: #fff;
+		}
+	}
+</style>
 
 <style lang="scss" scoped>
+	.navbar .right-menu .avatar-container{
+		margin-right: 20px;
+	}
+	.right-menu{
+		.el-select{
+			// top:-17px;
+      margin-right: 60px;
+		}
+	}
 .navbar {
   height: 50px;
   overflow: hidden;
   position: relative;
-  background: #fff;
+  // background: #fff;
+  background-color: #E7F5F1;
   box-shadow: 0 1px 4px rgba(0,21,41,.08);
 
   .hamburger-container {
@@ -125,7 +365,6 @@ export default {
     cursor: pointer;
     transition: background .3s;
     -webkit-tap-highlight-color:transparent;
-
     &:hover {
       background: rgba(0, 0, 0, .025)
     }
@@ -173,17 +412,18 @@ export default {
     }
 
     .avatar-container {
-      margin-right: 30px;
+      // margin-right: 30px;
+	  position: relative;
 
       .avatar-wrapper {
         margin-top: 5px;
         position: relative;
-
+        z-index: 33;
         .user-avatar {
           cursor: pointer;
           width: 40px;
           height: 40px;
-          border-radius: 10px;
+          border-radius: 50%;
         }
 
         .el-icon-caret-bottom {
@@ -192,9 +432,46 @@ export default {
           right: -20px;
           top: 25px;
           font-size: 12px;
+		  z-index: 33;
         }
       }
     }
   }
 }
+.nhse{
+	display: flex;
+	height: 50px !important;
+	// background-image: url("../../assets/images/pic_htgl_grxx_bg.png") !important;
+   //    background-size: 100% 70px;
+	.acnes{
+		display: flex;
+		height: 100%;
+		position: relative;
+		z-index: 2;
+		align-items: center;
+		p{
+			font-size: 13px;
+			font-family: PingFang SC;
+			font-weight: bold;
+			color: #333;
+			margin-right: 10px;
+      opacity: 0.7;
+      margin-left: 10px;
+		}
+		img{
+			width: 16px;
+			height: 16px;
+			margin-right: 6px;
+
+		}
+	}
+}
+.imgse{
+	position: absolute;
+	right: -30px;
+	top: 0;
+	// filter: drop-shadow(0 0.5px 0.5px black);
+	// height: 50px;
+}
+
 </style>

+ 8 - 8
ruoyi-ui/src/layout/components/Sidebar/Logo.vue

@@ -2,19 +2,19 @@
   <div class="sidebar-logo-container" :class="{'collapse':collapse}" :style="{ backgroundColor: sideTheme === 'theme-dark' ? variables.menuBackground : variables.menuLightBackground }">
     <transition name="sidebarLogoFade">
       <router-link v-if="collapse" key="collapse" class="sidebar-logo-link" to="/">
-        <img v-if="logo" :src="logo" class="sidebar-logo" />
-        <h1 v-else class="sidebar-title" :style="{ color: sideTheme === 'theme-dark' ? variables.logoTitleColor : variables.logoLightTitleColor }">{{ title }} </h1>
+        <img v-if="logo" :src="logo" class="sidebar-logo" style="width: 80%; height: 100%;" />
+        <!-- <h1 v-else class="sidebar-title" :style="{ color: sideTheme === 'theme-dark' ? variables.logoTitleColor : variables.logoLightTitleColor }">{{ title }} </h1> -->
       </router-link>
       <router-link v-else key="expand" class="sidebar-logo-link" to="/">
         <img v-if="logo" :src="logo" class="sidebar-logo" />
-        <h1 class="sidebar-title" :style="{ color: sideTheme === 'theme-dark' ? variables.logoTitleColor : variables.logoLightTitleColor }">{{ title }} </h1>
+        <!-- <h1 class="sidebar-title" :style="{ color: sideTheme === 'theme-dark' ? variables.logoTitleColor : variables.logoLightTitleColor }">{{ title }} </h1> -->
       </router-link>
     </transition>
   </div>
 </template>
 
 <script>
-import logoImg from '@/assets/logo/logo.png'
+import logoImg from '@/assets/images/pic_gjpt_logo.png'
 import variables from '@/assets/styles/variables.scss'
 
 export default {
@@ -27,7 +27,7 @@ export default {
   },
   computed: {
     variables() {
-      return variables
+      return variables;
     },
     sideTheme() {
       return this.$store.state.settings.sideTheme
@@ -57,7 +57,7 @@ export default {
   width: 100%;
   height: 50px;
   line-height: 50px;
-  background: #2b2f3a;
+  background: #E7F5F1 !important;
   text-align: center;
   overflow: hidden;
 
@@ -66,8 +66,8 @@ export default {
     width: 100%;
 
     & .sidebar-logo {
-      width: 32px;
-      height: 32px;
+      width: 87%;
+      height: 30px;
       vertical-align: middle;
       margin-right: 12px;
     }

+ 13 - 13
ruoyi-ui/src/layout/components/Sidebar/index.vue

@@ -5,7 +5,7 @@
             <el-menu
                 :default-active="activeMenu"
                 :collapse="isCollapse"
-                :background-color="settings.sideTheme === 'theme-dark' ? variables.menuBackground : variables.menuLightBackground"
+
                 :text-color="settings.sideTheme === 'theme-dark' ? variables.menuColor : variables.menuLightColor"
                 :unique-opened="true"
                 :active-text-color="settings.theme"
@@ -24,10 +24,10 @@
 </template>
 
 <script>
-import { mapGetters, mapState } from "vuex"
-import Logo from "./Logo"
-import SidebarItem from "./SidebarItem"
-import variables from "@/assets/styles/variables.scss"
+import { mapGetters, mapState } from "vuex";
+import Logo from "./Logo";
+import SidebarItem from "./SidebarItem";
+import variables from "@/assets/styles/variables.scss";
 
 export default {
     components: { SidebarItem, Logo },
@@ -35,23 +35,23 @@ export default {
         ...mapState(["settings"]),
         ...mapGetters(["sidebarRouters", "sidebar"]),
         activeMenu() {
-            const route = this.$route
-            const { meta, path } = route
+            const route = this.$route;
+            const { meta, path } = route;
             // if set path, the sidebar will highlight the path you set
             if (meta.activeMenu) {
-                return meta.activeMenu
+                return meta.activeMenu;
             }
-            return path
+            return path;
         },
         showLogo() {
-            return this.$store.state.settings.sidebarLogo
+            return this.$store.state.settings.sidebarLogo;
         },
         variables() {
-            return variables
+            return variables;
         },
         isCollapse() {
-            return !this.sidebar.opened
+            return !this.sidebar.opened;
         }
     }
-}
+};
 </script>

+ 2 - 2
ruoyi-ui/src/layout/components/TagsView/ScrollPane.vue

@@ -1,4 +1,4 @@
-<template>
+<!-- <template>
   <el-scrollbar ref="scrollContainer" :vertical="false" class="scroll-container" @wheel.native.prevent="handleScroll">
     <slot />
   </el-scrollbar>
@@ -91,4 +91,4 @@ export default {
     }
   }
 }
-</style>
+</style> -->

+ 2 - 2
ruoyi-ui/src/layout/components/TagsView/index.vue

@@ -1,4 +1,4 @@
-<template>
+<!-- <template>
   <div id="tags-view-container" class="tags-view-container">
     <scroll-pane ref="scrollPane" class="tags-view-wrapper" @scroll="handleScroll">
       <router-link
@@ -325,4 +325,4 @@ export default {
     }
   }
 }
-</style>
+</style> -->

+ 10 - 0
ruoyi-ui/src/main.js

@@ -21,6 +21,7 @@ import { getConfigKey } from "@/api/system/config"
 import { parseTime, resetForm, addDateRange, selectDictLabel, selectDictLabels, handleTree } from "@/utils/ruoyi"
 // 分页组件
 import Pagination from "@/components/Pagination"
+import Paginations from "@/components/Paginations"
 // 自定义表格工具组件
 import RightToolbar from "@/components/RightToolbar"
 // 富文本组件
@@ -29,6 +30,10 @@ import Editor from "@/components/Editor"
 import FileUpload from "@/components/FileUpload"
 // 图片上传组件
 import ImageUpload from "@/components/ImageUpload"
+import ImageUploadr from "@/components/ImageUploadr"
+import Photo from "@/components/Photo"
+
+
 // 图片预览组件
 import ImagePreview from "@/components/ImagePreview"
 // 字典标签组件
@@ -52,10 +57,15 @@ Vue.prototype.handleTree = handleTree
 // 全局组件挂载
 Vue.component('DictTag', DictTag)
 Vue.component('Pagination', Pagination)
+Vue.component('Paginations', Paginations)
 Vue.component('RightToolbar', RightToolbar)
 Vue.component('Editor', Editor)
 Vue.component('FileUpload', FileUpload)
 Vue.component('ImageUpload', ImageUpload)
+Vue.component('ImageUploadr', ImageUploadr)
+Vue.component('Photo', Photo)
+
+
 Vue.component('ImagePreview', ImagePreview)
 
 Vue.use(directive)

+ 6 - 3
ruoyi-ui/src/settings.js

@@ -1,8 +1,11 @@
 module.exports = {
+  urls: `http://10.90.90.52:8099`,
+  // 10.90.90.52 192.168.101.245
+  // urls:`https://xygl.qs163.cn`,
   /**
    * 侧边栏主题 深色主题theme-dark,浅色主题theme-light
    */
-  sideTheme: 'theme-dark',
+  sideTheme: 'theme-light',
 
   /**
    * 是否系统布局配置
@@ -17,7 +20,7 @@ module.exports = {
   /**
    * 是否显示 tagsView
    */
-  tagsView: true,
+  tagsView: false,
 
   /**
    * 是否固定头部
@@ -27,7 +30,7 @@ module.exports = {
   /**
    * 是否显示logo
    */
-  sidebarLogo: true,
+  sidebarLogo: false,
 
   /**
    * 是否显示动态标题

+ 2 - 0
ruoyi-ui/src/utils/request.js

@@ -12,6 +12,8 @@ let downloadLoadingInstance
 export let isRelogin = { show: false }
 
 axios.defaults.headers['Content-Type'] = 'application/json;charset=utf-8'
+// application/json;charset=utf-8
+// application/x-www-form-urlencoded
 // 创建axios实例
 const service = axios.create({
   // axios中请求配置有baseURL选项,表示请求URL公共部分

+ 28 - 9
ruoyi-ui/src/views/dashboard/LineChart.vue

@@ -20,7 +20,7 @@ export default {
     },
     height: {
       type: String,
-      default: '350px'
+      default: '300px'
     },
     autoResize: {
       type: Boolean,
@@ -68,7 +68,13 @@ export default {
           boundaryGap: false,
           axisTick: {
             show: false
-          }
+          },
+          axisLine: {
+                                  lineStyle: {
+                                      color: '#666666',
+                                      width: 1, //这里是为了突出显示加上的
+                                  }
+                              },
         },
         grid: {
           left: 10,
@@ -86,19 +92,32 @@ export default {
         },
         yAxis: {
           axisTick: {
-            show: false
-          }
+            show: true
+          },
+          lineStyle: {
+                          type: 'dotted' // 或者'dotted'
+                      },
+          axisLine: {
+                                  lineStyle: {
+                                      color: '#666666',
+                                      width: 1, //这里是为了突出显示加上的
+                                  }
+                              },
         },
         legend: {
-          data: ['expected', 'actual']
+          data: []
         },
         series: [{
           name: 'expected', itemStyle: {
             normal: {
-              color: '#FF005A',
+              color: '#FFAB2B',
               lineStyle: {
-                color: '#FF005A',
+                color: '#FFAB2B',
                 width: 2
+              },
+              areaStyle: {
+                color: '#FFAB2B',
+                opacity: 0.2,
               }
             }
           },
@@ -114,9 +133,9 @@ export default {
           type: 'line',
           itemStyle: {
             normal: {
-              color: '#3888fa',
+              color: '##03BF8A',
               lineStyle: {
-                color: '#3888fa',
+                color: '#03BF8A',
                 width: 2
               },
               areaStyle: {

+ 166 - 58
ruoyi-ui/src/views/dashboard/PieChart.vue

@@ -1,11 +1,11 @@
 <template>
-  <div :class="className" :style="{height:height,width:width}" />
+  <div :class="className" :style="{ height: height, width: width }" />
 </template>
 
 <script>
-import * as echarts from 'echarts'
-require('echarts/theme/macarons') // echarts theme
-import resize from './mixins/resize'
+import * as echarts from 'echarts';
+require('echarts/theme/macarons'); // echarts theme
+import resize from './mixins/resize';
 
 export default {
   mixins: [resize],
@@ -16,64 +16,172 @@ export default {
     },
     width: {
       type: String,
-      default: '100%'
+      default: '190%'
     },
     height: {
       type: String,
-      default: '300px'
-    }
-  },
-  data() {
-    return {
-      chart: null
-    }
-  },
-  mounted() {
-    this.$nextTick(() => {
-      this.initChart()
-    })
-  },
-  beforeDestroy() {
-    if (!this.chart) {
-      return
+      default: '240px'
+    },
+    chartData: {
+      type: Object,
+      required: true
     }
-    this.chart.dispose()
-    this.chart = null
   },
-  methods: {
-    initChart() {
-      this.chart = echarts.init(this.$el, 'macarons')
+watch: {
+     chartData: {
+       deep: true,
+       handler(val) {
+         this.setOptions(val)
+       }
+     }
+   },
+   data() {
+     return {
+       chart: null
+     }
+   },
+   mounted() {
+     this.$nextTick(() => {
+       this.initChart()
+     })
+   },
+   beforeDestroy() {
+     if (!this.chart) {
+       return
+     }
+     this.chart.dispose()
+     this.chart = null
+   },
+   methods: {
+     initChart() {
+       this.chart = echarts.init(this.$el, 'macarons');
+       this.chart = echarts.init(this.$el, 'macarons')
+       this.setOptions(this.chartData)
+     },
+       setOptions(row) {
+         console.log(row,56)
+          var colors = ["#FCA660","#59D4AB","#73C5EB", ];
+        this.chart.setOption({
 
-      this.chart.setOption({
-        tooltip: {
-          trigger: 'item',
-          formatter: '{a} <br/>{b} : {c} ({d}%)'
-        },
-        legend: {
-          left: 'center',
-          bottom: '10',
-          data: ['Industries', 'Technology', 'Forex', 'Gold', 'Forecasts']
-        },
-        series: [
-          {
-            name: 'WEEKLY WRITE ARTICLES',
-            type: 'pie',
-            roseType: 'radius',
-            radius: [15, 95],
-            center: ['50%', '38%'],
-            data: [
-              { value: 320, name: 'Industries' },
-              { value: 240, name: 'Technology' },
-              { value: 149, name: 'Forex' },
-              { value: 100, name: 'Gold' },
-              { value: 59, name: 'Forecasts' }
-            ],
-            animationEasing: 'cubicInOut',
-            animationDuration: 2600
-          }
-        ]
-      })
-    }
-  }
-}
+          // 设置环形中间的数据
+          graphic: [
+            {
+              type: 'text',
+              left: '26%',
+              top: '50%',
+              z: 10,
+              style: {
+                fill: '#333333',
+                formatter: '{total|' + 200 +'}'+ '\n\r' + '{active|共发布活动}',
+                rich: {
+                    total:{
+                        fontSize: 35,
+                        fontFamily : "微软雅黑",
+                        color:'#454c5c'
+                    },
+                    active: {
+                        fontFamily : "微软雅黑",
+                        fontSize: 16,
+                        color:'#6c7a89',
+                        lineHeight:30,
+                    },
+                }
+              },
+              textStyle: {
+                color: '#333333',
+                fontSize: 16,
+                align: 'center'
+              },
+
+            }
+          ],
+               series: [
+                           {
+                             // name:'访问来源',
+                             type:'pie',
+                             radius: ['40%', '70%'],
+                              center: ['30%', '39%'],
+                             avoidLabelOverlap: false,
+                             minShowLabelAngle: 2,
+                             label: {
+                                normal: {
+                                               show: true,
+                                               position: 'center',
+                                               color:'#4c4a4a',
+                                               formatter:  '{active|总告警数}' + '\n\r' +  ' {total|' + 200 + '}' + '{activen|/次}' ,
+                                               rich: {
+                                                   total:{
+
+                                                       fontSize: 20,
+                                                       fontWight:700,
+                                                       fontFamily : "微软雅黑",
+                                                       color:'#454c5c'
+                                                   },
+                                                   active: {
+                                                       fontFamily : "微软雅黑",
+                                                       fontSize: 16,
+                                                       color:'#6c7a89',
+                                                       lineHeight:30,
+                                                   },
+                                                   activen: {
+                                                       fontFamily : "微软雅黑",
+                                                       fontSize: 16,
+                                                       color:'#666666',
+                                                       lineHeight:30,
+                                                   },
+                                               }
+                                           },
+                                           emphasis: {//中间文字显示
+                                               show: true,
+                                           }
+                             },
+                             labelLine: {
+                               normal: {
+                                   show: false
+                               }
+                             },
+                             data:[
+                               {value:4,
+                                   name:'火焰告警',
+                                   hoverAnimation: false,
+                                   itemStyle: {
+                                       normal: {
+                                           // borderWidth: 5, // 为两个颜色之间那个宽度
+                                           // borderColor: '#fff',  // 边框颜色白色
+                                           color: colors[0]
+                                       }
+                                   }
+                               },
+                               {
+                                   value:4,
+                                   name:'陌生人告警',
+                                   hoverAnimation: false,
+                                   itemStyle: {
+                                       normal: {
+                                           // borderWidth: 5,
+                                           // borderColor: '#fff',
+                                           color: colors[1]
+                                       }
+                                   }
+                               },
+                               {
+                                   value:2,
+                                   name:'徘徊告警',
+                                   hoverAnimation: false,
+                                   itemStyle: {
+                                       normal: {
+                                           // borderWidth: 5,
+                                           // borderColor: '#fff',
+                                           color: colors[2]
+                                       }
+                                   }
+                               },
+
+                                ]
+                              }
+                               ]
+              });
+       }
+   }
+};
 </script>

+ 3936 - 1064
ruoyi-ui/src/views/index.vue

@@ -1,1100 +1,3972 @@
 <template>
-  <div class="app-container home">
+  <div class="app-container home index">
+    <div>
     <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-Vue')"
-            >访问码云</el-button
-          >
-          <el-button
-            size="mini"
-            icon="el-icon-s-home"
-            plain
-            @click="goTarget('http://ruoyi.vip')"
-            >访问主页</el-button
-          >
-        </p>
+      <el-col :span="16">
+         <el-col :span="24" style="padding-left: 0;padding-right: 0; border-radius: 10px;" >
+           <div class="block_4 flex-col">
+                     <div class="group_2 flex-row justify-between">
+                       <img
+                         class="thumbnail_5"
+                         referrerpolicy="no-referrer"
+                         src="https://lanhu-oss-2537-2.lanhuapp.com/pszcoe3n1ol6darv33oo7yk46dkwxg567200e550-246c-41b3-9049-dfa3474dbd43"
+                       />
+                       <span class="text_3">告警内容统计</span>
+                     </div>
+                     <div class="group_3 flex-row">
+                       <div class="text-wrapper_1 flex-col justify-between">
+                         <span class="text_4">本月告警总数</span>
+                         <span class="text_5">17</span>
+                         <div style="display: flex; margin-top:20px;">
+                           <span class="text_14">较上月</span>
+                           <img
+                             class="thumbnail_6"
+                             referrerpolicy="no-referrer"
+                             src="https://lanhu-oss-2537-2.lanhuapp.com/pszkc6daufldtde73fdjkalphsh76mlo57ed58e47ba-0deb-4ffd-9e4e-86592762cdf6"
+                           />
+                           <span class="text_15">28%</span>
+                         </div>
+                       </div>
+                       <!-- <img
+                         class="image_2"
+                         referrerpolicy="no-referrer"
+                         src="https://lanhu-oss-2537-2.lanhuapp.com/ps7mxkzc5neit681xsy8xznba7hm35r4ttv08926882-7cd0-4694-a312-ebee13b874e7"
+                       /> -->
+                       <div class="text-wrapper_2 flex-col justify-between">
+                         <span class="text_6">越线告警</span>
+                         <span class="text_7">08</span>
+                         <div style="display: flex; margin-top:20px;">
+                                                   <span class="text_14">较上月</span>
+                                                   <img
+                                                     class="thumbnail_6"
+                                                     referrerpolicy="no-referrer"
+                                                     src="https://lanhu-oss-2537-2.lanhuapp.com/pszkc6daufldtde73fdjkalphsh76mlo57ed58e47ba-0deb-4ffd-9e4e-86592762cdf6"
+                                                   />
+                                                   <span class="text_15">28%</span>
+                                                 </div>
+
+                       </div>
+                       <div class="text-wrapper_3 flex-col justify-between">
+                         <span class="text_8">徘徊告警</span>
+                         <span class="text_9">06</span>
+                          <div style="display: flex; margin-top:20px;">
+                                                    <span class="text_14">较上月</span>
+                                                    <img
+                                                      class="thumbnail_6"
+                                                      referrerpolicy="no-referrer"
+                                                      src="https://lanhu-oss-2537-2.lanhuapp.com/pszkc6daufldtde73fdjkalphsh76mlo57ed58e47ba-0deb-4ffd-9e4e-86592762cdf6"
+                                                    />
+                                                    <span class="text_15">28%</span>
+                                                  </div>
+                       </div>
+                       <div class="text-wrapper_4 flex-col justify-between">
+                         <span class="text_10">陌生人告警</span>
+                         <span class="text_11">02</span>
+                         <div style="display: flex; margin-top:20px;">
+                           <span class="text_14">较上月</span>
+                           <img
+                             class="thumbnail_6"
+                             referrerpolicy="no-referrer"
+                             src="https://lanhu-oss-2537-2.lanhuapp.com/pszkc6daufldtde73fdjkalphsh76mlo57ed58e47ba-0deb-4ffd-9e4e-86592762cdf6"
+                           />
+                           <span class="text_15">28%</span>
+                         </div>
+                       </div>
+                       <div class="text-wrapper_5 flex-col justify-between">
+                         <span class="text_12">火焰/烟雾告警</span>
+                         <span class="text_13">01</span>
+                         <div style="display: flex; margin-top:20px;">
+                           <span class="text_14">较上月</span>
+                           <img
+                             class="thumbnail_6"
+                             referrerpolicy="no-referrer"
+                             src="https://lanhu-oss-2537-2.lanhuapp.com/pszkc6daufldtde73fdjkalphsh76mlo57ed58e47ba-0deb-4ffd-9e4e-86592762cdf6"
+                           />
+                           <span class="text_15">28%</span>
+                         </div>
+                       </div>
+                     </div>
+
+                   </div>
+         </el-col>
+         <el-col :span="24" style="padding-left: 0;padding-right: 0; border-radius: 10px;" >
+           <div class="group_5 flex-col">
+                       <div class="group_6 flex-row" style="justify-content: space-between;">
+                         <div class="flex-row">
+                           <img
+                             class="thumbnail_19"
+                             referrerpolicy="no-referrer"
+                             src="https://lanhu-oss-2537-2.lanhuapp.com/psu3p9pm6jypghx3f47jgjfy30ja3ykbq35346262-3398-4814-a521-bc9ac3e30ac7"
+                           />
+                           <span class="text_30">年度告警统计</span>
+                           <div class="section_1 flex-row">
+                             <span class="text_31">越线告警</span>
+                             <img
+                               class="thumbnail_20"
+                               referrerpolicy="no-referrer"
+                               src="https://lanhu-oss-2537-2.lanhuapp.com/psfm47lo8z2nwf9tptn20pziqjiho31pmd4090dc3-6956-408d-97cc-9432a673c69d"
+                             />
+                           </div>
+                         </div>
+                         <span class="text_32">查看更多&nbsp;→</span>
+                       </div>
+                       <div class="group_7 flex-row" style="justify-content: space-between;">
+                         <span class="text_33">2025年</span>
+                         <div class="flex-row">
+                           <div class="flex-row">
+                             <div class="box_5 flex-col"></div>
+                             <span class="text_34">告警总数</span>
+                           </div>
+                           <div class="flex-row">
+                            <div class="box_6 flex-col"></div>
+                            <span class="text_35">越线告警</span>
+                           </div>
+                         </div>
+                         <span class="text_36">告警数/件</span>
+                       </div>
+                       <div class="group_8 flex-row justify-between">
+                            <line-chart :chart-data="lineChartData" />
+                       </div>
+
+                     </div>
+           </el-col>
+           <el-col :span="12" style="padding-left: 0; border-radius: 10px; margin-top: 20px;" >
+             <div class="box_7 flex-col">
+                           <div class="group_10 flex-row justify-between">
+                             <div class="image-text_1 flex-row justify-between">
+                               <img
+                                 class="thumbnail_21"
+                                 referrerpolicy="no-referrer"
+                                 src="https://lanhu-oss-2537-2.lanhuapp.com/psz7ip3r1lx39ddipa4t9asue3nlgizcr2m69352d25-9d7b-4b5f-a116-a8b1a9c63bad"
+                               />
+                               <span class="text-group_1">告警内容分析</span>
+                             </div>
+                             <div class="group_11 flex-row">
+                               <div class="image-text_2 flex-row justify-between">
+                                 <span class="text-group_2">2025</span>
+                                 <img
+                                   class="thumbnail_22"
+                                   referrerpolicy="no-referrer"
+                                   src="https://lanhu-oss-2537-2.lanhuapp.com/psddvdglysnl66rxvp2pzsrayivek3mvize28b1d838-4c12-4a87-b210-a41016d39338"
+                                 />
+                               </div>
+                             </div>
+                           </div>
+                           <span class="text_51">烟雾告警</span>
+                           <div class="group_12 flex-row justify-between">
+                             <span class="text_52">越线告警</span>
+                             <img
+                               class="image_5"
+                               referrerpolicy="no-referrer"
+                               src="https://lanhu-oss-2537-2.lanhuapp.com/psl74u17tgk7nsrsy5bqoqo2tyzv1i3ws31f72a3a-f58e-48ac-878f-ee9ce9a87c15"
+                             />
+                             <span class="text_53">火焰告警</span>
+                           </div>
+                           <div class="text-wrapper_8 flex-row justify-between">
+                             <span class="text_54">徘徊告警</span>
+                             <span class="text_55">陌生人告警</span>
+                           </div>
+                         </div>
+             </el-col>
+             <el-col :span="12" style=" border-radius: 10px; padding-right: 0;margin-top: 20px;" >
+               <div class="box_8 flex-col">
+                             <div class="block_7 flex-row justify-between">
+                               <div class="image-text_3 flex-row justify-between">
+                                 <img
+                                   class="thumbnail_23"
+                                   referrerpolicy="no-referrer"
+                                   src="https://lanhu-oss-2537-2.lanhuapp.com/psum99tr1vffjvtyeb4grcmlm3dnnjsksbd421be4-6aa6-46d8-b175-bb40b20e8992"
+                                 />
+                                 <span class="text-group_3">告警严重程度分析</span>
+                               </div>
+                               <div class="section_2 flex-row">
+                                 <div class="image-text_4 flex-row justify-between">
+                                   <span class="text-group_4">2025</span>
+                                   <img
+                                     class="thumbnail_24"
+                                     referrerpolicy="no-referrer"
+                                     src="https://lanhu-oss-2537-2.lanhuapp.com/psqt7s72rvrjlc6nlybwqk5bmvku09vdcp7090335a-a4a0-4522-953e-fb79361a0e68"
+                                   />
+                                 </div>
+                               </div>
+                             </div>
+
+                             <div class="block_8 flex-row" style="padding-right: 10px;">
+
+                               <div style="width: 50%;" >
+                                 <pie-chart />
+                                <!-- <div style="position: relative;top:-173px;">
+                                   <span class="text_56">总告警数</span>
+                                   <div class="text-wrapper_9">
+                                     <span class="text_57">146</span>
+                                     <span class="text_58"></span>
+                                     <span class="text_59">/次</span>
+                                   </div>
+                                 </div> -->
+                               </div>
+                               <div style="width: 50%;justify-content: flex-end;" class=" flex-row">
+                                 <div class="block_10 flex-col">
+                                   <div class="section_3 flex-col"></div>
+                                   <div class="section_4 flex-col"></div>
+                                   <div class="section_5 flex-col"></div>
+                                 </div>
+                                 <div class="text-wrapper_10 flex-col">
+                                   <span class="text_60">徘徊告警</span>
+                                   <span class="text_61">陌生人告警</span>
+                                   <span class="text_62">越线告警</span>
+                                   <span class="text_63">火焰告警</span>
+                                   <span class="text_64">烟雾告警</span>
+                                 </div>
+                                 <div class="text-wrapper_11 flex-col">
+                                   <span class="text_65">44</span>
+                                   <span class="text_66">42</span>
+                                   <span class="text_67">26</span>
+                                   <span class="text_68">13</span>
+                                   <span class="text_69">21</span>
+                                 </div>
+                               </div>
+                             </div>
+                             <div class="block_11 flex-row">
+                               <div class="section_6 flex-col"></div>
+                               <span class="text_70">低等级</span>
+                               <div class="section_7 flex-col"></div>
+                               <span class="text_71">中等级</span>
+                               <div class="section_8 flex-col"></div>
+                               <span class="text_72">高等级</span>
+                             </div>
+                           </div>
+               </el-col>
+
+      </el-col>
+      <el-col :span="8">
+        <div class="block_5 flex-col" style="background-color: #fff;">
+                  <div class="box_3 flex-row justify-between">
+                    <img
+                      class="thumbnail_11"
+                      referrerpolicy="no-referrer"
+                      src="https://lanhu-oss-2537-2.lanhuapp.com/psrdw890zdgxp85irjoai1mlys955fw0rcqa9b3d048-b776-48a3-a084-07acc200736d"
+                    />
+                    <span class="text_24">快捷功能</span>
+                  </div>
+                  <div class="image-wrapper_1 flex-row justify-between">
+                    <div style="text-align: center;">
+                      <img
+                        class="label_2"
+                        referrerpolicy="no-referrer"
+                        src="https://lanhu-oss-2537-2.lanhuapp.com/psn6jwvwy8l2j1h16w1of82ohsn7v4wwn7gk8ab5d7b4-4138-4e15-af1d-4dd41b3f94b6"
+                      />
+                      <div style="margin-top: 10px;">
+                         <span class="text_25">人员管理</span>
+                      </div>
+                    </div>
+                    <div style="text-align: center;">
+                      <img
+                        class="label_3"
+                        referrerpolicy="no-referrer"
+                        src="https://lanhu-oss-2537-2.lanhuapp.com/psdx8guqu2pc7qy9dec86q1p34cx76366gv94657d09-f3df-4daf-a8ab-772805d40279"
+                      />
+                      <div style="margin-top: 10px;">
+                         <span class="text_26">设备管理</span>
+                      </div>
+                    </div>
+                    <div style="text-align: center;">
+                      <img
+                        class="label_4"
+                        referrerpolicy="no-referrer"
+                        src="https://lanhu-oss-2537-2.lanhuapp.com/psbjpsfb3zmw6ts129i4b98d6kilysry37729c90a-1889-4617-9e11-55dfad50bd7b"
+                      />
+                      <div style="margin-top: 10px;">
+                         <span class="text_27">监控回放</span>
+                      </div>
+                    </div>
+                    <div style="text-align: center;">
+                      <img
+                        class="label_5"
+                        referrerpolicy="no-referrer"
+                        src="https://lanhu-oss-2537-2.lanhuapp.com/psp4wnnq3t9dmfg1ee9r3p87z6jj37w2ju668ffd6f-fea0-49b4-b6f5-2fe2807078c1"
+                      />
+                      <div style="margin-top: 10px;">
+                          <span class="text_28">一键布控</span>
+                      </div>
+                    </div>
+                    <div style="text-align: center;">
+                      <img
+                        class="label_6"
+                        referrerpolicy="no-referrer"
+                        src="https://lanhu-oss-2537-2.lanhuapp.com/pswcql79skat8m2hadqe0c2hrl664tdlk191dee3e56-41ea-47f3-9118-48384c61cbe0"
+                      />
+                      <div style="margin-top: 10px;">
+                         <span class="text_29">一键撤防</span>
+                      </div>
+                    </div>
+                  </div>
+                </div>
+        <!-- 日历 -->
+          <div style=" height: 431px; background-color: #fff; border-radius: 10px;padding: 20px;margin-top: 20px;">
+            <div class="box_11 flex-row">
+                          <div class="box_12 flex-col justify-between">
+                            <div class="text-wrapper_12 flex-row justify-between">
+                              <span class="text_73">2025(年)</span>
+                              <span class="text_74">Apr</span>
+                            </div>
+                            <div class="text-wrapper_13">
+                              <span class="text_75">0</span>
+                              <span class="text_76">4/</span>
+                              <span class="text_77">23</span>
+                            </div>
+                          </div>
+                          <div class="flex-row">
+                            <div class="text-wrapper_14 flex-col justify-between">
+                              <span class="text_78">潜山</span>
+                              <span class="text_79">27℃</span>
+                            </div>
+                            <img
+                              class="label_7"
+                              referrerpolicy="no-referrer"
+                              src="https://lanhu-oss-2537-2.lanhuapp.com/ps2dkvgja0bj82ye5za7m6rjholjn017m3w2ea76a7a-9421-4be5-8b86-66181f103334"
+                            />
+                          </div>
+                        </div>
+            <!-- 日历-->
+            <div class="timeall">
+                    <i class="el-icon-arrow-left lastbt" @click="lastclick"></i>
+                    <div class="table_header">
+                        <div class="weekday" v-for="(item,index) in weekAll" :key="index">
+                             <span>{{item}}</span>
+                        </div>
+                    </div>
+                    <div class="table_header">
+                        <div class="weekday test"   v-for="(item,index) in weekDayArr" :key="index">
+                             <span :class="item.adate==todayDate?'finish':''"   @click="getAdate(item)">{{item.adate.slice(8,10)}}</span>
+                        </div>
+                    </div>
+
+                    <i class="el-icon-arrow-right nextbt" @click="nextclick"></i>
+                  </div>
+            <!-- 内容 -->
+                <div>
+                  <div v-for="(item,index) in 2" :key="index" class="box_14 flex-row" style="justify-content: space-between;padding: 0 20px;">
+                                <div class="text-wrapper_17 flex-col justify-between">
+                                  <span class="text_94">25/04/23&nbsp;&nbsp;10:31:46</span>
+                                  <span class="text_95">通道001</span>
+                                </div>
+                                <div class="text-wrapper_18 ">
+                                  <div class="text_96">越线告警</div>
+                                  <div><img
+                                  class="thumbnail_27"
+                                  referrerpolicy="no-referrer"
+                                  src="https://lanhu-oss-2537-2.lanhuapp.com/psdns8niqehwnqonehba3fupf1jks9bkmeba9dfa9d-80e7-483e-9ef6-abb696ae65f0"
+                                />
+                              </div></div>
+                                </div>
+
+                </div>
+          </div>
+          <!-- 开关 -->
+          <div>
+            <div class="box_16 flex-col">
+                        <div class="section_9 flex-row justify-between">
+                          <div class="image-text_5 flex-row justify-between">
+                            <img
+                              class="thumbnail_29"
+                              referrerpolicy="no-referrer"
+                              src="https://lanhu-oss-2537-2.lanhuapp.com/psa27evgswubenvym1lop1v9fdundzbrw19c1850b51-939b-4d99-b5af-8745a5f6f954"
+                            />
+                            <span class="text-group_5">设备运行状态</span>
+                          </div>
+                          <span class="text_100">查看更多&nbsp;→</span>
+                        </div>
+                        <div class="section_10 flex-row">
+                          <div class="image-text_6 flex-col justify-between">
+                            <img
+                              class="image_6"
+                              referrerpolicy="no-referrer"
+                              src="https://lanhu-oss-2537-2.lanhuapp.com/ps88exyzo1tdikk9srdibcimyfl7toswujt8f98ae4d-a44c-42c8-b411-03a577d649f4"
+                            />
+                            <span class="text-group_6">设备01</span>
+                          </div>
+                          <div class="image-text_7 flex-col justify-between">
+                            <img
+                              class="image_7"
+                              referrerpolicy="no-referrer"
+                              src="https://lanhu-oss-2537-2.lanhuapp.com/psj4k7tsxe0dh0sc95kc1lnzf1frpd738z69de4a80a3-dcc1-4bd1-af71-cefbfe3cb6a9"
+                            />
+                            <span class="text-group_7">设备02</span>
+                          </div>
+                          <div class="box_17 flex-col justify-between">
+                            <div class="group_13 flex-col">
+                              <div class="section_11 flex-col"></div>
+                            </div>
+                            <span class="text_101">设备03</span>
+                          </div>
+                          <div class="box_18 flex-col justify-between">
+                            <div class="box_19 flex-col">
+                              <div class="block_12 flex-col"></div>
+                            </div>
+                            <span class="text_102">设备04</span>
+                          </div>
+                          <div class="box_20 flex-col justify-between">
+                            <div class="group_14 flex-col">
+                              <div class="group_15 flex-col"></div>
+                            </div>
+                            <span class="text_103">设备05</span>
+                          </div>
+                        </div>
+                      </div>
+          </div>
       </el-col>
+    </el-row>
+    </div>
 
-      <el-col :sm="24" :lg="12" style="padding-left: 50px">
+
+
+    <!-- 添加或修改投诉建议对话框 -->
+    <el-dialog title="回复建议" :visible.sync="open" width="800px" append-to-body>
+      <el-form ref="form" :model="form" :rules="rules" label-width="80px">
         <el-row>
-          <el-col :span="12">
-            <h2>技术选型</h2>
+          <el-col :span="24">
+            <el-form-item label="回复内容" prop="replyContent">
+              <!-- <editor v-model="form.replyContent" :min-height="192"/> -->
+              <el-input v-model="form.replyContent" type="textarea" placeholder="请输入内容" />
+            </el-form-item>
+          </el-col>
+          <el-col :span="24">
+            <el-form-item label="上传附件">
+              <fileUploadh :limit="20" v-model="form.suggestionFjList" />
+            </el-form-item>
           </el-col>
         </el-row>
+      </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="指派" :visible.sync="openz" width="640px" append-to-body>
+      <el-form ref="formz" :model="formz" :rules="rulesz" label-width="80px">
         <el-row>
-          <el-col :span="6">
-            <h4>后端技术</h4>
-            <ul>
-              <li>SpringBoot</li>
-              <li>Spring Security</li>
-              <li>JWT</li>
-              <li>MyBatis</li>
-              <li>Druid</li>
-              <li>Fastjson</li>
-              <li>...</li>
-            </ul>
+          <el-col :span="24">
+            <el-form-item label="选择人员" prop="staffName">
+              <el-select style="width: 100%;" v-model="formz.staffName" placeholder="请选择维修人员">
+                <el-option @click.native="xuanse(dict)" v-for="dict in staffManageList" :key="dict.staffId"
+                  :label="dict.staffName + '('+ (dict.status == null?'' : dict.status == 1?'空闲中' : '指派中') + ')'"
+                  :value="dict.staffId"></el-option>
+              </el-select>
+            </el-form-item>
+          </el-col>
+        </el-row>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitFormz">确 定</el-button>
+        <el-button @click="cancel">取 消</el-button>
+      </div>
+    </el-dialog>
+
+    <el-dialog title="完善信息" :visible.sync="openg" width="640px" append-to-body>
+      <el-form ref="formg" :model="formg" :rules="rulesg" label-width="80px">
+        <el-row>
+          <el-col :span="24" class="ngeshimg" >
+            <el-form-item label="身份证号" prop="idCard" style="position: relative;">
+                  <el-input v-model="formg.idCard" placeholder="请输入身份证号码" />
+                  <!-- <image-upload :limit="1" v-model="form.idCardBack"/> -->
+                  <image-uploadshib @uploadedSuccessfully="uploadedSuccessfully" :typeg = "1" :limit="1" v-model="formg.idCardBack"/>
+            </el-form-item>
+          </el-col>
+          <el-col :span="24">
+            <el-form-item label="选择小区" prop="tenantId">
+               <el-select
+               style="width:100%;"
+               			  v-model="formg.tenantId"
+               			  clearable
+               			  filterable
+               			  reserve-keyword
+               			  placeholder="选择物业"
+               			>
+                    <!-- @click.native="chahue(item)" -->
+               			  <el-option v-for="item in tenantList" :key="item.tenantId" :label="item.companyName" :value="item.tenantId" > </el-option>
+               			  <template ><svg-icon icon-class="company" class="el-input__icon input-icon" /></template>
+               			</el-select>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="人员性别" prop="gender">
+                      <el-select v-model="formg.gender" placeholder="请选择员工性别">
+                        <el-option
+                          v-for="dict in dict.type.gender"
+                          :key="dict.value"
+                          :label="dict.label"
+                          :value="dict.value"
+                        ></el-option>
+                      </el-select>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+                     <el-form-item label="员工类别" prop="staffCategory">
+                                           <el-select v-model="formg.staffCategory" placeholder="请选择员工类别">
+                                            <el-option
+                                            v-for="dict in dict.type.yaungong"
+                                            :key="dict.value"
+                                            :label="dict.label"
+                                            :value="dict.value"
+                                            ></el-option>
+                                           </el-select>
+                                         </el-form-item>
+                    </el-col>
+          <el-col :span="12">
+            <el-form-item label="维修分类" prop="maintenanceCategory">
+                      <el-select clearable v-model="formg.maintenanceCategory" placeholder="请选择维修分类">
+                        <el-option
+                          v-for="dict in dict.type.weixiutype"
+                          :key="dict.value"
+                          :label="dict.label"
+                          :value="dict.value"
+                        ></el-option>
+                      </el-select>
+                    </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="手机号码" prop="phoneNumber">
+                <el-input v-model="formg.phoneNumber" placeholder="请输入手机号码" />
+            </el-form-item>
+          </el-col>
+          <el-col :span="15">
+            <el-form-item label="员工姓名" prop="staffName">
+               <el-input v-model="formg.staffName" placeholder="请输入员工姓名" />
+            </el-form-item>
+          </el-col>
+
+
+          <el-col :span="12" class="shefnze" >
+              <el-form-item label="头像" prop="avatarPhoto">
+            <image-upload :limit="1" v-model="formg.avatarPhoto"/>
+          </el-form-item>
+            </el-col>
+          <el-col :span="12" class="shefnze">
+             <el-form-item label="身份证国徽面" prop="idCardFront">
+               <image-upload :limit="1" v-model="formg.idCardFront"/>
+             </el-form-item>
           </el-col>
-          <el-col :span="6">
-            <h4>前端技术</h4>
-            <ul>
-              <li>Vue</li>
-              <li>Vuex</li>
-              <li>Element-ui</li>
-              <li>Axios</li>
-              <li>Sass</li>
-              <li>Quill</li>
-              <li>...</li>
-            </ul>
+
+          <el-col :span="24" >
+              <el-form-item label="相关证件" prop="certificate">
+                        <file-upload v-model="formg.certificate"/>
+             </el-form-item>
           </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> 满937441 </s> <s> 满887144332 </s>
-              <s> 满180251782 </s> <s> 满104180207 </s> <s> 满186866453 </s> <s> 满201396349 </s>
-              <s> 满101456076 </s> <s> 满101539465 </s> <s> 满264312783 </s> <s> 满167385320 </s> 
-              <s> 满104748341 </s> <s> 满160110482 </s> <s> 满170801498 </s> <s> 满108482800 </s> 
-              <s> 满101046199 </s> <s> 满136919097 </s> <s> 满143961921 </s> <s> 满174951577 </s> 
-              <s> 满161281055 </s> <s> 满138988063 </s> <s> 满151450850 </s> <s> 满224622315 </s>
-              <s> 满287842588 </s> <s> 满187944233 </s> <a href="http://qm.qq.com/cgi-bin/qm/qr?_wv=1027&k=G6r5KGCaa3pqdbUSXNIgYloyb8e0_L0D&authKey=4w8tF1eGW7%2FedWn%2FHAypQksdrML%2BDHolQSx7094Agm7Luakj9EbfPnSTxSi2T1LQ&noverify=0&group_code=228578329" target="_blank">228578329</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.8.9 - 2024-12-30">
-              <ol>
-                <li>用户管理支持分栏拖动</li>
-                <li>修改主题样式本地读取</li>
-                <li>用户头像http(s)链接支持</li>
-                <li>用户管理过滤掉已禁用部门</li>
-                <li>支持自定义显示Excel属性列</li>
-                <li>操作日志记录DELETE请求参数</li>
-                <li>白名单支持对通配符路径匹配</li>
-                <li>校检文件名是否包含特殊字符</li>
-                <li>代码生成创建表屏蔽违规的字符</li>
-                <li>菜单面包屑导航支持多层级显示</li>
-                <li>Excel注解支持wrapText是否允许内容换行</li>
-                <li>代码生成新增配置是否允许文件覆盖到本地</li>
-                <li>修复角色禁用权限不失效问题</li>
-                <li>修复代码生成上级菜单显示问题</li>
-                <li>修复导出子列表对象只能在最后的问题</li>
-                <li>修复TopNav无法正确获取active的问题</li>
-                <li>修复默认关闭Tags-Views内链页面打不开</li>
-                <li>升级oshi到最新版本6.6.5</li>
-                <li>升级tomcat到最新版本9.0.96</li>
-                <li>升级fastjson到最新版2.0.53</li>
-                <li>升级logback到最新版本1.2.13</li>
-                <li>升级spring-framework到最新版本5.3.39</li>
-                <li>升级quill到最新版本2.0.2</li>
-                <li>升级axios到最新版本0.28.1</li>
-                <li>优化身份证脱敏正则</li>
-                <li>优化权限更新后同步缓存</li>
-                <li>优化查询时间范围日期格式</li>
-                <li>优化参数键值更换为多行文本</li>
-                <li>优化导入带标题文件关闭清理</li>
-                <li>优化上传图片带域名不增加前缀</li>
-                <li>优化特殊字符密码修改失败问题</li>
-                <li>优化无用户编号不校验数据权限</li>
-                <li>优化TopNav内链菜单点击没有高亮</li>
-                <li>优化菜单管理切换Mini布局错乱问题</li>
-                <li>其他细节优化</li>
-              </ol>
-            </el-collapse-item>
-            <el-collapse-item title="v3.8.8 - 2024-06-30">
-              <ol>
-                <li>菜单管理新增路由名称</li>
-                <li>新增数据脱敏过滤注解</li>
-                <li>用户密码新增非法字符验证</li>
-                <li>限制用户操作数据权限范围</li>
-                <li>代码生成新增创建表结构功能</li>
-                <li>定时任务白名单配置范围缩小</li>
-                <li>优化代码生成主子表关联查询方式</li>
-                <li>Excel注解新增属性comboReadDict</li>
-                <li>Excel注解ColumnType类型新增文本</li>
-                <li>新增国际化资源文件配置</li>
-                <li>升级oshi到最新版本6.6.1</li>
-                <li>升级druid到最新版本1.2.23</li>
-                <li>升级core-js到最新版本3.37.1</li>
-                <li>更新HttpUtils中的User-Agent</li>
-                <li>更新compressionPlugin到6.1.2以兼容node18+</li>
-                <li>升级spring-security到安全版本,防止漏洞风险</li>
-                <li>升级spring-framework到安全版本,防止漏洞风险</li>
-                <li>优化自定义XSS注解匹配方式</li>
-                <li>优化缓存监控键名列表排序显示</li>
-                <li>优化定时任务日志默认按时间排序</li>
-                <li>优化默认文件大小超过2G无效的问题</li>
-                <li>优化查表特殊字符使用反斜杠进行转义</li>
-                <li>优化定时任务cron表达式小时配置显示错误问题</li>
-                <li>优化多个自定数据权限使用in查询,避免多次拼接</li>
-                <li>优化导入Excel时设置dictType属性重复查缓存问题</li>
-                <li>其他细节优化</li>
-              </ol>
-            </el-collapse-item>
-            <el-collapse-item title="v3.8.7 - 2023-12-08">
-              <ol>
-                <li>操作日志记录部门名称</li>
-                <li>全局数据存储用户编号</li>
-                <li>新增编程式判断资源访问权限</li>
-                <li>操作日志列表新增IP地址查询</li>
-                <li>定时任务新增页去除状态选项</li>
-                <li>代码生成支持选择前端模板类型</li>
-                <li>显隐列组件支持复选框弹出类型</li>
-                <li>通用排序属性orderBy参数限制长度</li>
-                <li>Excel自定义数据处理器增加单元格/工作簿对象</li>
-                <li>升级oshi到最新版本6.4.8</li>
-                <li>升级druid到最新版本1.2.20</li>
-                <li>升级fastjson到最新版2.0.43</li>
-                <li>升级pagehelper到最新版1.4.7</li>
-                <li>升级commons.io到最新版本2.13.0</li>
-                <li>升级element-ui到最新版本2.15.14</li>
-                <li>修复五级路由缓存无效问题</li>
-                <li>修复外链带端口出现的异常</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导入时无法获取到dictType字典值问题</li>
-                <li>优化下载zip方法新增遮罩层</li>
-                <li>优化头像上传参数新增文件名称</li>
-                <li>优化字典标签支持自定义分隔符</li>
-                <li>优化菜单管理类型为按钮状态可选</li>
-                <li>优化前端防重复提交数据大小限制</li>
-                <li>优化TopNav菜单没有图标svg不显示</li>
-                <li>优化数字金额大写转换精度丢失问题</li>
-                <li>优化富文本Editor组件检验图片格式</li>
-                <li>优化页签在Firefox浏览器被遮挡的问题</li>
-                <li>优化个人中心/基本资料修改时数据显示问题</li>
-                <li>优化缓存监控图表支持跟随屏幕大小自适应调整</li>
-                <li>其他细节优化</li>
-              </ol>
-            </el-collapse-item>
-            <el-collapse-item title="v3.8.6 - 2023-06-30">
-              <ol>
-                <li>支持登录IP黑名单限制</li>
-                <li>新增监控页面图标显示</li>
-                <li>操作日志新增消耗时间属性</li>
-                <li>屏蔽定时任务bean违规的字符</li>
-                <li>日志管理使用索引提升查询性能</li>
-                <li>日志注解支持排除指定的请求参数</li>
-                <li>支持自定义隐藏属性列过滤子对象</li>
-                <li>升级oshi到最新版本6.4.3</li>
-                <li>升级druid到最新版本1.2.16</li>
-                <li>升级fastjson到最新版2.0.34</li>
-                <li>升级spring-boot到最新版本2.5.15</li>
-                <li>升级element-ui到最新版本2.15.13</li>
-                <li>移除apache/commons-fileupload依赖</li>
-                <li>修复页面切换时布局错乱的问题</li>
-                <li>修复匿名注解Anonymous空指针问题</li>
-                <li>修复路由跳转被阻止时内部产生报错信息问题</li>
-                <li>修复isMatchedIp的参数判断产生空指针的问题</li>
-                <li>修复用户多角色数据权限可能出现权限抬升的情况</li>
-                <li>修复开启TopNav后一级菜单路由参数设置无效问题</li>
-                <li>修复DictTag组件value没有匹配的值时则展示value</li>
-                <li>优化文件下载出现的异常</li>
-                <li>优化选择图标组件高亮回显</li>
-                <li>优化弹窗后导航栏偏移的问题</li>
-                <li>优化修改密码日志存储明文问题</li>
-                <li>优化页签栏关闭其他出现的异常问题</li>
-                <li>优化页签关闭左侧选项排除首页选项</li>
-                <li>优化关闭当前tab页跳转最右侧tab页</li>
-                <li>优化缓存列表清除操作提示不变的问题</li>
-                <li>优化字符未使用下划线不进行驼峰式处理</li>
-                <li>优化用户导入更新时需获取用户编号问题</li>
-                <li>优化侧边栏的平台标题与VUE_APP_TITLE保持同步</li>
-                <li>优化导出Excel时设置dictType属性重复查缓存问题</li>
-                <li>连接池Druid支持新的配置connectTimeout和socketTimeout</li>
-                <li>其他细节优化</li>
-              </ol>
-            </el-collapse-item>
-            <el-collapse-item title="v3.8.5 - 2023-01-01">
-              <ol>
-                <li>定时任务违规的字符</li>
-                <li>重置时取消部门选中</li>
-                <li>新增返回警告消息提示</li>
-                <li>忽略不必要的属性数据返回</li>
-                <li>修改参数键名时移除前缓存配置</li>
-                <li>导入更新用户数据前校验数据权限</li>
-                <li>兼容Excel下拉框内容过多无法显示的问题</li>
-                <li>升级echarts到最新版本5.4.0</li>
-                <li>升级core-js到最新版本3.25.3</li>
-                <li>升级oshi到最新版本6.4.0</li>
-                <li>升级kaptcha到最新版2.3.3</li>
-                <li>升级druid到最新版本1.2.15</li>
-                <li>升级fastjson到最新版2.0.20</li>
-                <li>升级pagehelper到最新版1.4.6</li>
-                <li>优化弹窗内容过多展示不全问题</li>
-                <li>优化swagger-ui静态资源使用缓存</li>
-                <li>开启TopNav没有子菜单隐藏侧边栏</li>
-                <li>删除fuse无效选项maxPatternLength</li>
-                <li>优化导出对象的子列表为空会出现[]问题</li>
-                <li>优化编辑头像时透明部分会变成黑色问题</li>
-                <li>优化小屏幕上修改头像界面布局错位的问题</li>
-                <li>修复代码生成勾选属性无效问题</li>
-                <li>修复文件上传组件格式验证问题</li>
-                <li>修复回显数据字典数组异常问题</li>
-                <li>修复sheet超出最大行数异常问题</li>
-                <li>修复Log注解GET请求记录不到参数问题</li>
-                <li>修复调度日志点击多次数据不变化的问题</li>
-                <li>修复主题颜色在Drawer组件不会加载问题</li>
-                <li>修复文件名包含特殊字符的文件无法下载问题</li>
-                <li>修复table中更多按钮切换主题色未生效修复问题</li>
-                <li>修复某些特性的环境生成代码变乱码TXT文件问题</li>
-                <li>修复代码生成图片/文件/单选时选择必填无法校验问题</li>
-                <li>修复某些特性的情况用户编辑对话框中角色和部门无法修改问题</li>
-                <li>其他细节优化</li>
-              </ol>
-            </el-collapse-item>
-            <el-collapse-item title="v3.8.4 - 2022-09-26">
-              <ol>
-                <li>数据逻辑删除不进行唯一验证</li>
-                <li>Excel注解支持导出对象的子列表方法</li>
-                <li>Excel注解支持自定义隐藏属性列</li>
-                <li>Excel注解支持backgroundColor属性设置背景色</li>
-                <li>支持配置密码最大错误次数/锁定时间</li>
-                <li>登录日志新增解锁账户功能</li>
-                <li>通用下载方法新增config配置选项</li>
-                <li>支持多权限字符匹配角色数据权限</li>
-                <li>页面内嵌iframe切换tab不刷新数据</li>
-                <li>操作日志记录支持排除敏感属性字段</li>
-                <li>修复多文件上传报错出现的异常问题</li>
-                <li>修复图片预览组件src属性为null值控制台报错问题</li>
-                <li>升级oshi到最新版本6.2.2</li>
-                <li>升级fastjson到最新版2.0.14</li>
-                <li>升级pagehelper到最新版1.4.3</li>
-                <li>升级core-js到最新版本3.25.2</li>
-                <li>升级element-ui到最新版本2.15.10</li>
-                <li>优化任务过期不执行调度</li>
-                <li>优化字典数据使用store存取</li>
-                <li>优化修改资料头像被覆盖的问题</li>
-                <li>优化修改用户登录账号重复验证</li>
-                <li>优化代码生成同步后值NULL问题</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.8.3 - 2022-06-27">
-              <ol>
-                <li>新增缓存列表菜单功能</li>
-                <li>代码生成树表新增(展开/折叠)</li>
-                <li>Excel注解支持color字体颜色</li>
-                <li>新增Anonymous匿名访问不鉴权注解</li>
-                <li>用户头像上传限制只能为图片格式</li>
-                <li>接口使用泛型使其看到响应属性字段</li>
-                <li>检查定时任务bean所在包名是否为白名单配置</li>
-                <li>添加页签openPage支持传递参数</li>
-                <li>用户缓存信息添加部门ancestors祖级列表</li>
-                <li>升级element-ui到最新版本2.15.8</li>
-                <li>升级oshi到最新版本6.1.6</li>
-                <li>升级druid到最新版本1.2.11</li>
-                <li>升级fastjson到最新版2.0.8</li>
-                <li>升级spring-boot到最新版本2.5.14</li>
-                <li>降级jsencrypt版本兼容IE浏览器</li>
-                <li>删除多余的salt字段</li>
-                <li>新增获取不带后缀文件名称方法</li>
-                <li>新增获取配置文件中的属性值方法</li>
-                <li>新增内容编码/解码方便插件集成使用</li>
-                <li>字典类型必须以字母开头,且只能为(小写字母,数字,下滑线)</li>
-                <li>优化设置分页参数默认值</li>
-                <li>优化对空字符串参数处理的过滤</li>
-                <li>优化显示顺序orderNum类型为整型</li>
-                <li>优化表单构建按钮不显示正则校验</li>
-                <li>优化字典数据回显样式下拉框显示值</li>
-                <li>优化R响应成功状态码与全局保持一致</li>
-                <li>优化druid开启wall过滤器出现的异常问题</li>
-                <li>优化用户管理左侧树型组件增加选中高亮保持</li>
-                <li>优化新增用户与角色信息&用户与岗位信息逻辑</li>
-                <li>优化默认不启用压缩文件缓存防止node_modules过大</li>
-                <li>修复字典数据显示不全问题</li>
-                <li>修复操作日志查询类型条件为0时会查到所有数据</li>
-                <li>修复Excel注解prompt/combo同时使用不生效问题</li>
-                <li>其他细节优化</li>
-              </ol>
-            </el-collapse-item>
-            <el-collapse-item title="v3.8.2 - 2022-04-01">
-              <ol>
-                <li>前端支持设置是否需要防止数据重复提交</li>
-                <li>开启TopNav没有子菜单情况隐藏侧边栏</li>
-                <li>侧边栏菜单名称过长悬停显示标题</li>
-                <li>用户访问控制时校验数据权限,防止越权</li>
-                <li>导出Excel时屏蔽公式,防止CSV注入风险</li>
-                <li>组件ImagePreview支持多图预览显示</li>
-                <li>组件ImageUpload支持多图同时选择上传</li>
-                <li>组件FileUpload支持多文件同时选择上传</li>
-                <li>服务监控新增运行参数信息显示</li>
-                <li>定时任务目标字符串过滤特殊字符</li>
-                <li>定时任务目标字符串验证包名白名单</li>
-                <li>代码生成列表图片支持预览</li>
-                <li>代码生成编辑修改打开新页签</li>
-                <li>代码生成新增Java类型Boolean</li>
-                <li>代码生成子表支持日期/字典配置</li>
-                <li>代码生成同步保留必填/类型选项</li>
-                <li>升级oshi到最新版本6.1.2</li>
-                <li>升级fastjson到最新版1.2.80</li>
-                <li>升级pagehelper到最新版1.4.1</li>
-                <li>升级spring-boot到最新版本2.5.11</li>
-                <li>升级spring-boot-mybatis到最新版2.2.2</li>
-                <li>添加遗漏的分页参数合理化属性</li>
-                <li>修改npm即将过期的注册源地址</li>
-                <li>修复分页组件请求两次问题</li>
-                <li>修复通用文件下载接口跨域问题</li>
-                <li>修复Xss注解字段值为空时的异常问题</li>
-                <li>修复选项卡点击右键刷新丢失参数问题</li>
-                <li>修复表单清除元素位置未垂直居中问题</li>
-                <li>修复服务监控中运行参数显示条件错误</li>
-                <li>修复导入Excel时字典字段类型为Long转义为空问题</li>
-                <li>修复登录超时刷新页面跳转登录页面还提示重新登录问题</li>
-                <li>优化加载字典缓存数据</li>
-                <li>优化IP地址获取到多个的问题</li>
-                <li>优化任务队列满时任务拒绝策略</li>
-                <li>优化文件上传兼容Weblogic环境</li>
-                <li>优化定时任务默认保存到内存中执行</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.8.1 - 2022-01-01">
-              <ol>
-                <li>新增Vue3前端代码生成模板</li>
-                <li>新增图片预览组件</li>
-                <li>新增压缩插件实现打包Gzip</li>
-                <li>自定义xss校验注解实现</li>
-                <li>自定义文字复制剪贴指令</li>
-                <li>代码生成预览支持复制内容</li>
-                <li>路由支持单独配置菜单或角色权限</li>
-                <li>用户管理部门查询选择节点后分页参数初始</li>
-                <li>修复用户分配角色属性错误</li>
-                <li>修复打包后字体图标偶现的乱码问题</li>
-                <li>修复菜单管理重置表单出现的错误</li>
-                <li>修复版本差异导致的懒加载报错问题</li>
-                <li>修复Cron组件中周回显问题</li>
-                <li>修复定时任务多参数逗号分隔的问题</li>
-                <li>修复根据ID查询列表可能出现的主键溢出问题</li>
-                <li>修复tomcat配置参数已过期问题</li>
-                <li>升级clipboard到最新版本2.0.8</li>
-                <li>升级oshi到最新版本v5.8.6</li>
-                <li>升级fastjson到最新版1.2.79</li>
-                <li>升级spring-boot到最新版本2.5.8</li>
-                <li>升级log4j2到2.17.1,防止漏洞风险</li>
-                <li>优化下载解析blob异常提示</li>
-                <li>优化代码生成字典组重复问题</li>
-                <li>优化查询用户的角色组&岗位组代码</li>
-                <li>优化定时任务cron表达式小时设置24</li>
-                <li>优化用户导入提示溢出则显示滚动条</li>
-                <li>优化防重复提交标识组合为(key+url+header)</li>
-                <li>优化分页方法设置成通用方便灵活调用</li>
-                <li>其他细节优化</li>
-              </ol>
-            </el-collapse-item>
-            <el-collapse-item title="v3.8.0 - 2021-12-01">
-              <ol>
-                <li>新增配套并同步的Vue3前端版本</li>
-                <li>新增通用方法简化模态/缓存/下载/权限/页签使用</li>
-                <li>优化导出数据/使用通用下载方法</li>
-                <li>Excel注解支持自定义数据处理器</li>
-                <li>Excel注解支持导入导出标题信息</li>
-                <li>Excel导入支持@Excels注解</li>
-                <li>新增组件data-dict,简化数据字典使用</li>
-                <li>新增Jaxb依赖,防止jdk8以上出现的兼容错误</li>
-                <li>生产环境使用路由懒加载提升页面响应速度</li>
-                <li>修复五级以上菜单出现的404问题</li>
-                <li>防重提交注解支持配置间隔时间/提示消息</li>
-                <li>日志注解新增是否保存响应参数</li>
-                <li>任务屏蔽违规字符&参数忽略双引号中的逗号</li>
-                <li>升级SpringBoot到最新版本2.5.6</li>
-                <li>升级pagehelper到最新版1.4.0</li>
-                <li>升级spring-boot-mybatis到最新版2.2.0</li>
-                <li>升级oshi到最新版本v5.8.2</li>
-                <li>升级druid到最新版1.2.8</li>
-                <li>升级velocity到最新版本2.3</li>
-                <li>升级fastjson到最新版1.2.78</li>
-                <li>升级axios到最新版本0.24.0</li>
-                <li>升级dart-sass到版本1.32.13</li>
-                <li>升级core-js到最新版本3.19.1</li>
-                <li>升级jsencrypt到最新版本3.2.1</li>
-                <li>升级js-cookie到最新版本3.0.1</li>
-                <li>升级file-saver到最新版本2.0.5</li>
-                <li>升级sass-loader到最新版本10.1.1</li>
-                <li>升级element-ui到最新版本2.15.6</li>
-                <li>新增sendGet无参请求方法</li>
-                <li>禁用el-tag组件的渐变动画</li>
-                <li>代码生成点击预览重置激活tab</li>
-                <li>AjaxResult重写put方法,以方便链式调用</li>
-                <li>优化登录/验证码请求headers不设置token</li>
-                <li>优化用户个人信息接口防止修改用户名</li>
-                <li>优化Cron表达式生成器关闭时销毁避免缓存</li>
-                <li>优化注册成功提示消息类型success</li>
-                <li>优化aop语法,使用spring自动注入注解</li>
-                <li>优化记录登录信息,移除不必要的修改</li>
-                <li>优化mybatis全局默认的执行器</li>
-                <li>优化Excel导入图片可能出现的异常</li>
-                <li>修复代码生成模板主子表删除缺少事务</li>
-                <li>修复日志记录可能出现的转换异常</li>
-                <li>修复代码生成复选框字典遗漏问题</li>
-                <li>修复关闭xss功能导致可重复读RepeatableFilter失效</li>
-                <li>修复字符串无法被反转义问题</li>
-                <li>修复后端主子表代码模板方法名生成错误问题</li>
-                <li>修复xss过滤后格式出现的异常</li>
-                <li>修复swagger没有指定dataTypeClass导致启动出现warn日志</li>
-                <li>其他细节优化</li>
-              </ol>
-            </el-collapse-item>
-            <el-collapse-item title="v3.7.0 - 2021-09-13">
-              <ol>
-                <li>参数管理支持配置验证码开关</li>
-                <li>新增是否开启用户注册功能</li>
-                <li>定时任务支持在线生成cron表达式</li>
-                <li>菜单管理支持配置路由参数</li>
-                <li>支持自定义注解实现接口限流</li>
-                <li>Excel注解支持Image图片导入</li>
-                <li>自定义弹层溢出滚动样式</li>
-                <li>自定义可拖动弹窗宽度指令</li>
-                <li>自定义可拖动弹窗高度指令</li>
-                <li>修复任意账户越权问题</li>
-                <li>修改时检查用户数据权限范围</li>
-                <li>修复保存配置主题颜色失效问题</li>
-                <li>新增暗色菜单风格主题</li>
-                <li>菜单&部门新增展开/折叠功能</li>
-                <li>页签新增关闭左侧&添加图标</li>
-                <li>顶部菜单排除隐藏的默认路由</li>
-                <li>顶部菜单同步系统主题样式</li>
-                <li>跳转路由高亮相对应的菜单栏</li>
-                <li>代码生成主子表多选行数据</li>
-                <li>日期范围支持添加多组</li>
-                <li>升级element-ui到最新版本2.15.5</li>
-                <li>升级oshi到最新版本v5.8.0</li>
-                <li>升级commons.io到最新版本v2.11.0</li>
-                <li>定时任务屏蔽ldap远程调用</li>
-                <li>定时任务屏蔽http(s)远程调用</li>
-                <li>补充定时任务表字段注释</li>
-                <li>定时任务对检查异常进行事务回滚</li>
-                <li>启用父部门状态排除顶级节点</li>
-                <li>富文本新增上传文件大小限制</li>
-                <li>默认首页使用keep-alive缓存</li>
-                <li>修改代码生成字典回显样式</li>
-                <li>自定义分页合理化传入参数</li>
-                <li>修复字典组件值为整形不显示问题</li>
-                <li>修复定时任务日志执行状态显示</li>
-                <li>角色&菜单新增字段属性提示信息</li>
-                <li>修复角色分配用户页面参数类型错误提醒</li>
-                <li>优化布局设置动画特效</li>
-                <li>优化异常处理信息</li>
-                <li>优化错误token导致的解析异常</li>
-                <li>密码框新增显示切换密码图标</li>
-                <li>定时任务新增更多操作</li>
-                <li>更多操作按钮添加权限控制</li>
-                <li>导入用户样式优化</li>
-                <li>提取通用方法到基类控制器</li>
-                <li>优化使用权限工具获取用户信息</li>
-                <li>优化用户不能删除自己</li>
-                <li>优化XSS跨站脚本过滤</li>
-                <li>优化代码生成模板</li>
-                <li>验证码默认20s超时</li>
-                <li>BLOB下载时清除URL对象引用</li>
-                <li>代码生成导入表按创建时间排序</li>
-                <li>修复代码生成页面数据编辑保存之后总是跳转第一页的问题</li>
-                <li>修复带safari浏览器无法格式化utc日期格式yyyy-MM-dd'T'HH:mm:ss.SSS问题</li>
-                <li>多图上传组件移除多余的api地址&验证失败导致图片删除问题&无法删除相应图片修复</li>
-                <li>其他细节优化</li>
-              </ol>
-            </el-collapse-item>
-            <el-collapse-item title="v3.6.0 - 2021-07-12">
-              <ol>
-                <li>角色管理新增分配用户功能</li>
-                <li>用户管理新增分配角色功能</li>
-                <li>日志列表支持排序操作</li>
-                <li>优化参数&字典缓存操作</li>
-                <li>系统布局配置支持动态标题开关</li>
-                <li>菜单路由配置支持内链访问</li>
-                <li>默认访问后端首页新增提示语</li>
-                <li>富文本默认上传返回url类型</li>
-                <li>新增自定义弹窗拖拽指令</li>
-                <li>全局注册常用通用组件</li>
-                <li>全局挂载字典标签组件</li>
-                <li>ImageUpload组件支持多图片上传</li>
-                <li>FileUpload组件支持多文件上传</li>
-                <li>文件上传组件添加数量限制属性</li>
-                <li>富文本编辑组件添加类型属性</li>
-                <li>富文本组件工具栏配置视频</li>
-                <li>封装通用iframe组件</li>
-                <li>限制超级管理员不允许操作</li>
-                <li>用户信息长度校验限制</li>
-                <li>分页组件新增pagerCount属性</li>
-                <li>添加bat脚本执行应用</li>
-                <li>升级oshi到最新版本v5.7.4</li>
-                <li>升级element-ui到最新版本2.15.2</li>
-                <li>升级pagehelper到最新版1.3.1</li>
-                <li>升级commons.io到最新版本v2.10.0</li>
-                <li>升级commons.fileupload到最新版本v1.4</li>
-                <li>升级swagger到最新版本v3.0.0</li>
-                <li>修复关闭confirm提示框控制台报错问题</li>
-                <li>修复存在的SQL注入漏洞问题</li>
-                <li>定时任务屏蔽rmi远程调用</li>
-                <li>修复用户搜索分页变量错误</li>
-                <li>修复导出角色数据范围翻译缺少仅本人</li>
-                <li>修复表单构建选择下拉选择控制台报错问题</li>
-                <li>优化图片工具类读取文件</li>
-                <li>其他细节优化</li>
-              </ol>
-            </el-collapse-item>
-            <el-collapse-item title="v3.5.0 - 2021-05-25">
-              <ol>
-                <li>新增菜单导航显示风格TopNav(false为左侧导航菜单,true为顶部导航菜单)</li>
-                <li>布局设置支持保存&重置配置</li>
-                <li>修复树表数据显示不全&加载慢问题</li>
-                <li>新增IE浏览器版本过低提示页面</li>
-                <li>用户登录后记录最后登录IP&时间</li>
-                <li>页面导出按钮点击之后添加遮罩</li>
-                <li>富文本编辑器支持自定义上传地址</li>
-                <li>富文本编辑组件新增readOnly属性</li>
-                <li>页签TagsView新增关闭右侧功能</li>
-                <li>显隐列组件加载初始默认隐藏列</li>
-                <li>关闭头像上传窗口还原默认图片</li>
-                <li>个人信息添加手机&邮箱重复验证</li>
-                <li>代码生成模板导出按钮点击后添加遮罩</li>
-                <li>代码生成模板树表操作列添加新增按钮</li>
-                <li>代码生成模板修复主子表字段重名问题</li>
-                <li>升级fastjson到最新版1.2.76</li>
-                <li>升级druid到最新版本v1.2.6</li>
-                <li>升级mybatis到最新版3.5.6 阻止远程代码执行漏洞</li>
-                <li>升级oshi到最新版本v5.6.0</li>
-                <li>velocity剔除commons-collections版本,防止3.2.1版本的反序列化漏洞</li>
-                <li>数据监控页默认账户密码防止越权访问</li>
-                <li>修复firefox下表单构建拖拽会新打卡一个选项卡</li>
-                <li>修正后端导入表权限标识</li>
-                <li>修正前端操作日志&登录日志权限标识</li>
-                <li>设置Redis配置HashKey序列化</li>
-                <li>删除操作日志记录信息</li>
-                <li>上传媒体类型添加视频格式</li>
-                <li>修复请求形参未传值记录日志异常问题</li>
-                <li>优化xss校验json请求条件</li>
-                <li>树级结构更新子节点使用replaceFirst</li>
-                <li>优化ExcelUtil空值处理</li>
-                <li>日志记录过滤BindingResult对象,防止异常</li>
-                <li>修改主题后mini类型按钮无效问题</li>
-                <li>优化通用下载完成后删除节点</li>
-                <li>通用Controller添加响应返回消息</li>
-                <li>其他细节优化</li>
-              </ol>
-            </el-collapse-item>
-            <el-collapse-item title="v3.4.0 - 2021-02-22">
-              <ol>
-                <li>代码生成模板支持主子表</li>
-                <li>表格右侧工具栏组件支持显隐列</li>
-                <li>图片组件添加预览&移除功能</li>
-                <li>Excel注解支持Image图片导出</li>
-                <li>操作按钮组调整为朴素按钮样式</li>
-                <li>代码生成支持文件上传组件</li>
-                <li>代码生成日期控件区分范围</li>
-                <li>代码生成数据库文本类型生成表单文本域</li>
-                <li>用户手机邮箱&菜单组件修改允许空字符串</li>
-                <li>升级SpringBoot到最新版本2.2.13 提升启动速度</li>
-                <li>升级druid到最新版本v1.2.4</li>
-                <li>升级fastjson到最新版1.2.75</li>
-                <li>升级element-ui到最新版本2.15.0</li>
-                <li>修复IE11浏览器报错问题</li>
-                <li>优化多级菜单之间切换无法缓存的问题</li>
-                <li>修复四级菜单无法显示问题</li>
-                <li>修正侧边栏静态路由丢失问题</li>
-                <li>修复角色管理-编辑角色-功能权限显示异常</li>
-                <li>配置文件新增redis数据库索引属性</li>
-                <li>权限工具类增加admin判断</li>
-                <li>角色非自定义权限范围清空选择值</li>
-                <li>修复导入数据为负浮点数时丢失精度问题</li>
-                <li>移除path-to-regexp正则匹配插件</li>
-                <li>修复生成树表代码异常</li>
-                <li>修改ip字段长度防止ipv6地址长度不够</li>
-                <li>防止get请求参数值为false或0等特殊值会导致无法正确的传参</li>
-                <li>登录后push添加catch防止出现检查错误</li>
-                <li>其他细节优化</li>
-              </ol>
-            </el-collapse-item>
-            <el-collapse-item title="v3.3.0 - 2020-12-14">
-              <ol>
-                <li>新增缓存监控功能</li>
-                <li>支持主题风格配置</li>
-                <li>修复多级菜单之间切换无法缓存的问题</li>
-                <li>多级菜单自动配置组件</li>
-                <li>代码生成预览支持高亮显示</li>
-                <li>支持Get请求映射Params参数</li>
-                <li>删除用户和角色解绑关联</li>
-                <li>去除用户手机邮箱部门必填验证</li>
-                <li>Excel支持注解align对齐方式</li>
-                <li>Excel支持导入Boolean型数据</li>
-                <li>优化头像样式,鼠标移入悬停遮罩</li>
-                <li>代码生成预览提供滚动机制</li>
-                <li>代码生成删除多余的数字float类型</li>
-                <li>修正转换字符串的目标字符集属性</li>
-                <li>回显数据字典防止空值报错</li>
-                <li>日志记录增加过滤多文件场景</li>
-                <li>修改缓存Set方法可能导致嵌套的问题</li>
-                <li>移除前端一些多余的依赖</li>
-                <li>防止安全扫描YUI出现的风险提示</li>
-                <li>修改node-sass为dart-sass</li>
-                <li>升级SpringBoot到最新版本2.1.18</li>
-                <li>升级poi到最新版本4.1.2</li>
-                <li>升级oshi到最新版本v5.3.6</li>
-                <li>升级bitwalker到最新版本1.21</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="v3.2.1 - 2020-11-18">
-              <ol>
-                <li>阻止任意文件下载漏洞</li>
-                <li>代码生成支持上传控件</li>
-                <li>新增图片上传组件</li>
-                <li>调整默认首页</li>
-                <li>升级druid到最新版本v1.2.2</li>
-                <li>mapperLocations配置支持分隔符</li>
-                <li>权限信息调整</li>
-                <li>调整sql默认时间</li>
-                <li>解决代码生成没有bit类型的问题</li>
-                <li>升级pagehelper到最新版1.3.0</li>
-              </ol>
-            </el-collapse-item>
-            <el-collapse-item title="v3.2.0 - 2020-10-10">
-              <ol>
-                <li>升级springboot版本到2.1.17 提升安全性</li>
-                <li>升级oshi到最新版本v5.2.5</li>
-                <li>升级druid到最新版本v1.2.1</li>
-                <li>升级jjwt到版本0.9.1</li>
-                <li>升级fastjson到最新版1.2.74</li>
-                <li>修改sass为node-sass,避免el-icon图标乱码</li>
-                <li>代码生成支持同步数据库</li>
-                <li>代码生成支持富文本控件</li>
-                <li>代码生成页面时不忽略remark属性</li>
-                <li>代码生成添加select必填选项</li>
-                <li>Excel导出类型NUMERIC支持精度浮点类型</li>
-                <li>Excel导出targetAttr优化获取值,防止get方法不规范</li>
-                <li>Excel注解支持自动统计数据总和</li>
-                <li>Excel注解支持设置BigDecimal精度&舍入规则</li>
-                <li>菜单&数据权限新增(展开/折叠 全选/全不选 父子联动)</li>
-                <li>允许用户分配到部门父节点</li>
-                <li>菜单新增是否缓存keep-alive</li>
-                <li>表格操作列间距调整</li>
-                <li>限制系统内置参数不允许删除</li>
-                <li>富文本组件优化,支持自定义高度&图片冲突问题</li>
-                <li>富文本工具栏样式对齐</li>
-                <li>导入excel整形值校验优化</li>
-                <li>修复页签关闭所有时固定标签路由不刷新问题</li>
-                <li>表单构建布局型组件新增按钮</li>
-                <li>左侧菜单文字过长显示省略号</li>
-                <li>修正根节点为子部门时,树状结构显示问题</li>
-                <li>修正调用目标字符串最大长度</li>
-                <li>修正菜单提示信息错误</li>
-                <li>修正定时任务执行一次权限标识</li>
-                <li>修正数据库字符串类型nvarchar</li>
-                <li>优化递归子节点</li>
-                <li>优化数据权限判断</li>
-                <li>其他细节优化</li>
-              </ol>
-            </el-collapse-item>
-
-            <el-collapse-item title="v3.1.0 - 2020-08-13">
-              <ol>
-                <li>表格工具栏右侧添加刷新&显隐查询组件</li>
-                <li>后端支持CORS跨域请求</li>
-                <li>代码生成支持选择上级菜单</li>
-                <li>代码生成支持自定义路径</li>
-                <li>代码生成支持复选框</li>
-                <li>Excel导出导入支持dictType字典类型</li>
-                <li>Excel支持分割字符串组内容</li>
-                <li>验证码类型支持(数组计算、字符验证)</li>
-                <li>升级vue-cli版本到4.4.4</li>
-                <li>修改 node-sass 为 dart-sass</li>
-                <li>表单类型为Integer/Long设置整形默认值</li>
-                <li>代码生成器默认mapper路径与默认mapperScan路径不一致</li>
-                <li>优化防重复提交拦截器</li>
-                <li>优化上级菜单不能选择自己</li>
-                <li>修复角色的权限分配后,未实时生效问题</li>
-                <li>修复在线用户日志记录类型</li>
-                <li>修复富文本空格和缩进保存后不生效问题</li>
-                <li>修复在线用户判断逻辑</li>
-                <li>唯一限制条件只返回单条数据</li>
-                <li>添加获取当前的环境配置方法</li>
-                <li>超时登录后页面跳转到首页</li>
-                <li>全局异常状态汉化拦截处理</li>
-                <li>HTML过滤器改为将html转义</li>
-                <li>检查字符支持小数点&降级改成异常提醒</li>
-                <li>其他细节优化</li>
-              </ol>
-            </el-collapse-item>
-
-            <el-collapse-item title="v3.0.0 - 2020-07-20">
-              <ol>
-                <li>单应用调整为多模块项目</li>
-                <li>升级element-ui版本到2.13.2</li>
-                <li>删除babel,提高编译速度。</li>
-                <li>新增菜单默认主类目</li>
-                <li>编码文件名修改为uuid方式</li>
-                <li>定时任务cron表达式验证</li>
-                <li>角色权限修改时已有权限未自动勾选异常修复</li>
-                <li>防止切换权限用户后登录出现404</li>
-                <li>Excel支持sort导出排序</li>
-                <li>创建用户不允许选择超级管理员角色</li>
-                <li>修复代码生成导入表结构出现异常页面不提醒问题</li>
-                <li>修复代码生成点击多次表修改数据不变化的问题</li>
-                <li>修复头像上传成功二次打开无法改变裁剪框大小和位置问题</li>
-                <li>修复布局为small者mini用户表单显示错位问题</li>
-                <li>修复热部署导致的强换异常问题</li>
-                <li>修改用户管理复选框宽度,防止部分浏览器出现省略号</li>
-                <li>IpUtils工具,清除Xss特殊字符,防止Xff注入攻击</li>
-                <li>生成domain 如果是浮点型 统一用BigDecimal</li>
-                <li>定时任务调整label-width,防止部署出现错位</li>
-                <li>调整表头固定列默认样式</li>
-                <li>代码生成模板调整,字段为String并且必填则加空串条件</li>
-                <li>代码生成字典Integer/Long使用parseInt</li>
-                <li>
-                  修复dict_sort不可update为0的问题&查询返回增加dict_sort升序排序
-                </li>
-                <li>修正岗位导出权限注解</li>
-                <li>禁止加密密文返回前端</li>
-                <li>修复代码生成页面中的查询条件创建时间未生效的问题</li>
-                <li>修复首页搜索菜单外链无法点击跳转问题</li>
-                <li>修复菜单管理选择图标,backspace删除时不过滤数据</li>
-                <li>用户管理部门分支节点不可检查&显示计数</li>
-                <li>数据范围过滤属性调整</li>
-                <li>其他细节优化</li>
-              </ol>
-            </el-collapse-item>
-
-            <el-collapse-item title="v2.3.0 - 2020-06-01">
-              <ol>
-                <li>升级fastjson到最新版1.2.70 修复高危安全漏洞</li>
-                <li>dev启动默认打开浏览器</li>
-                <li>vue-cli使用默认source-map</li>
-                <li>slidebar eslint报错优化</li>
-                <li>当tags-view滚动关闭右键菜单</li>
-                <li>字典管理添加缓存读取</li>
-                <li>参数管理支持缓存操作</li>
-                <li>支持一级菜单(和主页同级)在main区域显示</li>
-                <li>限制外链地址必须以http(s)开头</li>
-                <li>tagview & sidebar 主题颜色与element ui(全局)同步</li>
-                <li>修改数据源类型优先级,先根据方法,再根据类</li>
-                <li>支持是否需要设置token属性,自定义返回码消息。</li>
-                <li>swagger请求前缀加入配置。</li>
-                <li>登录地点设置内容过长则隐藏显示</li>
-                <li>修复定时任务执行一次按钮后不提示消息问题</li>
-                <li>修改上级部门(选择项排除本身和下级)</li>
-                <li>通用http发送方法增加参数 contentType 编码类型</li>
-                <li>更换IP地址查询接口</li>
-                <li>修复页签变量undefined</li>
-                <li>添加校验部门包含未停用的子部门</li>
-                <li>修改定时任务详情下次执行时间日期显示错误</li>
-                <li>角色管理查询设置默认排序字段</li>
-                <li>swagger添加enable参数控制是否启用</li>
-                <li>只对json类型请求构建可重复读取inputStream的request</li>
-                <li>修改代码生成字典字段int类型没有自动选中问题</li>
-                <li>vuex用户名取值修正</li>
-                <li>表格树模板去掉多余的)</li>
-                <li>代码生成序号修正</li>
-                <li>全屏情况下不调整上外边距</li>
-                <li>代码生成Date字段添加默认格式</li>
-                <li>用户管理角色选择权限控制</li>
-                <li>修复路由懒加载报错问题</li>
-                <li>模板sql.vm添加菜单状态</li>
-                <li>设置用户名称不能修改</li>
-                <li>dialog添加append-to-body属性,防止ie遮罩</li>
-                <li>菜单区分状态和显示隐藏功能</li>
-                <li>升级fastjson到最新版1.2.68 修复安全加固</li>
-                <li>修复代码生成如果选择字典类型缺失逗号问题</li>
-                <li>登录请求params更换为data,防止暴露url</li>
-                <li>日志返回时间格式处理</li>
-                <li>添加handle控制允许拖动的元素</li>
-                <li>布局设置点击扩大范围</li>
-                <li>代码生成列属性排序查询</li>
-                <li>代码生成列支持拖动排序</li>
-                <li>修复时间格式不支持ios问题</li>
-                <li>表单构建添加父级class,防止冲突</li>
-                <li>定时任务并发属性修正</li>
-                <li>角色禁用&菜单隐藏不查询权限</li>
-                <li>其他细节优化</li>
-              </ol>
-            </el-collapse-item>
-
-            <el-collapse-item title="v2.2.0 - 2020-03-18">
-              <ol>
-                <li>系统监控新增定时任务功能</li>
-                <li>添加一个打包Web工程bat</li>
-                <li>修复页签鼠标滚轮按下的时候,可以关闭不可关闭的tag</li>
-                <li>修复点击退出登录有时会无提示问题</li>
-                <li>修复防重复提交注解无效问题</li>
-                <li>修复通知公告批量删除异常问题</li>
-                <li>添加菜单时路由地址必填限制</li>
-                <li>代码生成字段描述可编辑</li>
-                <li>修复用户修改个人信息导致缓存不过期问题</li>
-                <li>个人信息创建时间获取正确属性值</li>
-                <li>操作日志详细显示正确类型</li>
-                <li>导入表单击行数据时选中对应的复选框</li>
-                <li>批量替换表前缀逻辑调整</li>
-                <li>固定重定向路径表达式</li>
-                <li>升级element-ui版本到2.13.0</li>
-                <li>操作日志排序调整</li>
-                <li>修复charts切换侧边栏或者缩放窗口显示bug</li>
-                <li>其他细节优化</li>
-              </ol>
-            </el-collapse-item>
-
-            <el-collapse-item title="v2.1.0 - 2020-02-24">
-              <ol>
-                <li>新增表单构建</li>
-                <li>代码生成支持树表结构</li>
-                <li>新增用户导入</li>
-                <li>修复动态加载路由页面刷新问题</li>
-                <li>修复地址开关无效问题</li>
-                <li>汉化错误提示页面</li>
-                <li>代码生成已知问题修改</li>
-                <li>修复多数据源下配置关闭出现异常处理</li>
-                <li>添加HTML过滤器,用于去除XSS漏洞隐患</li>
-                <li>修复上传头像控制台出现异常</li>
-                <li>修改用户管理分页不正确的问题</li>
-                <li>修复验证码记录提示错误</li>
-                <li>修复request.js缺少Message引用</li>
-                <li>修复表格时间为空出现的异常</li>
-                <li>添加Jackson日期反序列化时区配置</li>
-                <li>调整根据用户权限加载菜单数据树形结构</li>
-                <li>调整成功登录不恢复按钮,防止多次点击</li>
-                <li>修改用户个人资料同步缓存信息</li>
-                <li>修复页面同时出现el-upload和Editor不显示处理</li>
-                <li>修复在角色管理页修改菜单权限偶尔未选中问题</li>
-                <li>配置文件新增redis密码属性</li>
-                <li>设置mybatis全局的配置文件</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="v1.1.0 - 2019-11-11">
-              <ol>
-                <li>新增在线用户管理</li>
-                <li>新增按钮组功能实现(批量删除、导出、清空)</li>
-                <li>新增查询条件重置按钮</li>
-                <li>新增Swagger全局Token配置</li>
-                <li>新增后端参数校验</li>
-                <li>修复字典管理页面的日期查询异常</li>
-                <li>修改时间函数命名防止冲突</li>
-                <li>去除菜单上级校验,默认为顶级</li>
-                <li>修复用户密码无法修改问题</li>
-                <li>修复菜单类型为按钮时不显示权限标识</li>
-                <li>其他细节优化</li>
-              </ol>
-            </el-collapse-item>
-            <el-collapse-item title="v1.0.0 - 2019-10-08">
-              <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>
+
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitFormg">确 定</el-button>
+      </div>
+    </el-dialog>
+
+    <!-- <el-dialog title="完善信息" :visible.sync="openg" width="640px" append-to-body>
+
+    </el-dialog> -->
+
+
   </div>
 </template>
 
 <script>
-export default {
-  name: "Index",
-  data() {
-    return {
-      // 版本号
-      version: "3.8.9"
-    }
-  },
-  methods: {
-    goTarget(href) {
-      window.open(href, "_blank")
+  import PanelGroup from './dashboard/PanelGroup'
+  import LineChart from './dashboard/LineChart'
+  import RaddarChart from './dashboard/RaddarChart'
+  import PieChart from './dashboard/PieChart'
+  import BarChart from './dashboard/BarChart'
+
+
+  const lineChartData = {
+    newVisitis: {
+      expectedData: [100, 120, 161, 134, 105, 160, 165],
+      actualData: [120, 82, 91, 154, 162, 140, 145]
+    },
+    messages: {
+      expectedData: [200, 192, 120, 144, 160, 130, 140],
+      actualData: [180, 160, 151, 106, 145, 150, 130]
+    },
+    purchases: {
+      expectedData: [80, 100, 121, 104, 105, 90, 100],
+      actualData: [120, 90, 100, 138, 142, 130, 130]
+    },
+    shoppings: {
+      expectedData: [130, 140, 141, 142, 145, 150, 160],
+      actualData: [120, 82, 91, 154, 162, 140, 130]
     }
   }
-}
+
+
+
+  import { getTenantList} from "@/api/login";
+  import {listNoPage} from "@/api/system/role";
+  export default {
+    name: "Index",
+    dicts: ['baoxiutype', 'repair_status', 'patrol_type','yaungong', 'gender', 'weixiutype'],
+    components: {
+      PanelGroup,
+      LineChart,
+      RaddarChart,
+      PieChart,
+      BarChart,
+    },
+    data() {
+      return {
+        // 版本号
+        version: "3.8.9",
+        customColor: '#FFCB62',
+        lineChartData: lineChartData.newVisitis,
+        getyer: '',
+        getmor: '',
+        getday: '',
+        getshifL: '',
+        getweek: '',
+        open: false,
+        openz: false,
+        openg:false,
+        shouzu:false,
+        // 投诉建议表格数据
+        suggestionList: [],
+        repairList: [],
+        // 巡检点记录表格数据
+        checkPointRecordList: [],
+        // 表单参数
+        form: {},
+        formz: {},
+        formg: {
+          name:null,
+          card:null,
+          phonenumber:null,
+          boundary:null,
+          unit:null,
+          partyAffiliation:null,
+        },
+        // 表单校验
+        rules: {
+          replyContent: [{
+            required: true,
+            message: "不能为空",
+            trigger: "blur"
+          }],
+        },
+        rulesz: {
+          staffName: [{
+            required: true,
+            message: "不能为空",
+            trigger: "blur"
+          }],
+
+        },
+        rulesg:{
+          tenantId: [
+                            { required: true, message: "不能为空", trigger: "blur" }
+                          ],
+          staffName: [
+                            { required: true, message: "姓名不能为空", trigger: "blur" }
+                          ],
+                          // staffCategory: [
+                          //   { required: true, message: "员工类别", trigger: "change" }
+                          // ],
+
+                          phoneNumber: [
+                            { required: true, message: "手机号码不能为空", trigger: "blur" }
+                          ],
+        },
+        staffManageList: [],
+        xunjiantj: {},
+        tatse: 0,
+        yifhufe: 0,
+        isxug: false,
+        bafe: 0,
+        timer: null,
+        zhexian: {},
+        userid: 0,
+        chelisngguan: {},
+        isacr: 0,
+        carNume:{},
+        tenantList:[],
+        ishsoe:false,
+        forewg:{},
+        tesrtw:'',
+        // 角色表格数据
+        roleList: [],
+        // 日历
+        currentFirstDate:"",
+                    clen:7,
+                    todayDate:"",
+                    weekDayArr:[],
+                    weekAll: [
+                      '星期一','星期二','星期三','星期四','星期五','星期六','星期日',
+                    ]
+      };
+    },
+    created() {
+      // 移交 日历
+      this.todayDate=this.formatDate(new Date())
+      this.setDate(new Date())
+      // 旧的
+      this.userid = this.$store.getters.userId
+      if(this.$store.getters.authenticationUser =='1' || this.$store.getters.authenticationUser =='2'){
+        // 认证未通过或者未认证
+        this.shouzu = false
+        // this.getxinaqren()
+        // this.getrou(this.$store.getters.tenantId)
+      }else{
+        // if(){
+
+        // }
+        this.shouzu = true
+        // this.getcharnae()
+        // this.setTimer()
+        // this.gettime()
+        // this.getListtion()
+        // this.getListpair()
+        // this.getstaffManageList()
+        // this.getListRecord()
+        // this.getListRecordcun()
+        // this.baozhe()
+        // this.getche()
+      }
+      clearInterval(this.timer)
+      this.timer = null
+      this.getnhgwzuhue()
+      console.log(this.shouzu)
+    },
+    methods: {
+      // 日历
+       // 日期格式处理
+              formatDate(date){
+
+                var year = date.getFullYear() + '-'
+                var month = (date.getMonth()+1) ;
+                if(month<10){
+                  month = '0' + month
+                }
+                month = month + '-'
+                var day = date.getDate();
+                if(day<10){
+                  day = '0' + day
+                }
+                console.log(year+month+day)
+                return year+month+day;
+              },
+              //
+              addDate(date,n){
+                date.setDate(date.getDate()+n);
+                console.log(date,5)
+                return date;
+              },
+              //
+              setDate(date){
+                  var week = date.getDay()-1;
+                  date = this.addDate(date,week*-1);
+                  this.currentFirstDate = new Date(date);
+                  for(var i = 0;i<this.clen; i++){
+                      this.weekDayArr.push({"adate":this.formatDate(i==0 ? date : this.addDate(date,1))})
+                  }
+                  console.log(this.weekDayArr)
+              },
+              //上一周
+              lastclick(){
+                  this.weekDayArr=[]
+                  this.setDate(this.addDate(this.currentFirstDate,-7));
+              },
+              //下一周
+              nextclick(){
+                  this.weekDayArr=[]
+                  this.setDate(this.addDate(this.currentFirstDate,7));
+              },
+              getAdate (item) {
+                 this.todayDate = item.adate
+                console.log(item)
+              },
+      // 日历结束
+      // 小区切换
+         chahue(row){
+           this.getrou(row.tenantId)
+         },
+         // 查询角色信息
+         getrou(row){
+           let pade={'tenantId':row}
+           listNoPage(pade).then(response => {
+               this.roleList = response.rows;
+               this.roleList.filter(rou=>{
+                 rou.dictValue=rou.roleKey
+                 rou.dictLabel=rou.roleName
+               })
+               if(response.rows.length !=0){
+                 this.formg.staffCategory = response.rows[0].roleKey
+               }
+             }
+           );
+         },
+      getxinaqren(){
+        staffManagexq(this.$store.getters.userId).then(response => {
+          if(response.data == null){
+            this.ishsoe = true
+          }else{
+            this.ishsoe = false
+            this.forewg = response.data
+            this.tesrtw = response.data.tenantId
+          }
+          // this.tenantEnabled = response.data.tenantEnabled
+          // this.tenantList = response.data.voList;
+          // this.loading = false;
+        });
+
+      },
+      getnhgwzuhue(){
+        // this.loading = true;
+        getTenantList().then(response => {
+      	  // this.tenantEnabled = response.data.tenantEnabled
+          this.tenantList = response.data.voList;
+          // this.loading = false;
+        });
+      },
+      zhuhuet(){
+          this.reset()
+          this.formg.phoneNumber =  this.$store.getters.phonenumber
+          this.formg.userId = this.userid
+          if(this.tenantList.length !=0){
+             this.formg.tenantId = this.tenantList[0].tenantId
+             // this.getrou(this.$store.getters.tenantId)
+                 this.openg = true
+          }else{
+            this.openg = true
+          }
+
+        console.log(this.formg)
+        // console.log(this.formg.userId)
+        // console.log(this.formg.phoneNumber,this.$store.getters.user.phonenumber)
+
+      },
+      // 车辆进入\
+      getcharnae(){
+        car().then(response => {
+          this.carNume = response.data;
+        });
+      },
+      // 车辆管控
+      getche() {
+        vehicleControl().then(response => {
+          this.chelisngguan = response.data;
+        });
+      },
+      // 车辆管控点击
+      iszhe(val){
+        this.isacr = val
+      },
+      // 报修折线
+      baozhe() {
+        qx().then(response => {
+          this.zhexian = response.data;
+        });
+      },
+
+      // 巡更记录
+      getListRecord() {
+        let sgmse = {
+          'pageNum': 1,
+          'pageSize': 2,
+          'params':{
+            'createTime':this.getyer + '-' + this.getmor + '-' + this.getday,
+          },
+          // params:{'checkTime': this.getyer + '-' + this.getmor + '-' + this.getday},
+          // 'createTime': this.getyer + '-' + this.getmor + '-' + this.getday,
+          'checkStatus': 2,
+          'userId': this.userid
+        }
+        this.isxug = false
+        listCheckPointRecord(sgmse).then(response => {
+          this.checkPointRecordList = response.rows;
+          // this.checkPointRecordList .filter(rou=>{
+          //   rou.imges = []
+          //   if(rou.checkResultPhoto != null && rou.checkResultPhoto != ''){
+          //     rou.imges = rou.checkResultPhoto.split(',')
+          //   }
+          // })
+          if (this.checkPointRecordList.length == 0) {
+            let gh = {
+              'checkTime': '暂无数据',
+              'checkAddress': '暂无数据',
+              'checkUserName': '暂无数据',
+              'checkResult': '暂无数据',
+              'checkType': '暂无数据'
+            }
+            this.checkPointRecordList.push(gh)
+            this.checkPointRecordList.push(gh)
+          }
+          if (this.checkPointRecordList.length == 1) {
+            let gh = {
+              'checkTime': '暂无数据',
+              'checkAddress': '暂无数据',
+              'checkUserName': '暂无数据',
+              'checkResult': '暂无数据',
+              'checkType': '暂无数据'
+            }
+            this.checkPointRecordList.push(gh)
+          }
+          this.isxug = true
+        });
+      },
+      getListRecordcun() {
+        count().then(response => {
+          this.xunjiantj = response.data
+        });
+      },
+      // 报修列表
+      getListpair() {
+        let sgmse = {
+          'pageNum': 1,
+          'pageSize': 2,
+          'userId': this.userid
+        }
+        listRepair(sgmse).then(response => {
+          this.repairList = response.rows;
+          if (this.repairList.length == 0) {
+            let gnsh = {
+              'repairTitle': '暂无数据',
+              'phoneNumber': '暂无数据',
+              'houseAddress': '暂无数据',
+              'repairTime': '暂无数据',
+              'repairStatus': null
+            }
+            this.repairList.push(gnsh)
+            this.repairList.push(gnsh)
+          }
+          if (this.repairList.length == 1) {
+            let gnsh = {
+              'repairTitle': '暂无数据',
+              'phoneNumber': '暂无数据',
+              'houseAddress': '暂无数据',
+              'repairTime': '暂无数据',
+              'repairStatus': null
+            }
+            this.repairList.push(gnsh)
+
+          }
+
+        });
+      },
+      // 待分配
+      daifeng(row) {
+        if (row.repairStatus == 1) {
+          // 待分配
+          // this.formz.maintenanceCategory = row.maintenanceCategory
+          this.openz = true
+          this.formz.repairId = row.repairId
+        }
+      },
+      // 待分配提交
+      submitFormz() {
+        this.$refs["formz"].validate(valid => {
+          if (valid) {
+            assign(this.formz).then(response => {
+              this.$modal.msgSuccess("操作成功");
+              this.openz = false;
+              this.getList();
+            });
+          }
+        })
+      },
+      xuanse(val) {
+        console.log(val)
+        this.formz.staffName = val.staffName
+        this.formz.staffId = val.staffId
+        this.formz.staffPhone = val.phoneNumber
+      },
+      getstaffManageList(row) {
+        let bsdf = {
+          'staffCategory': 2
+        }
+        listStaffManageNoPage(bsdf).then(response => {
+          this.staffManageList = response.rows;
+          // this.staffManageList.filrter(rout=>{
+          //   rout.lable = rout.staffName + '<p>'
+          // })
+        });
+      },
+      /** 查询投诉建议列表 */
+      getListtion() {
+        let sgmse = {
+          'pageNum': 1,
+          'pageSize': 10,
+          'isPublic':'Y',
+          'userId': this.userid
+        }
+        listSuggestion(sgmse).then(response => {
+        if(response.rows.length !=0){
+           if(response.rows.length > 2){
+              this.suggestionList = response.rows.slice(0, 2);
+           }else{
+              this.suggestionList = response.rows;
+           }
+        }else{
+          this.suggestionList = response.rows;
+        }
+          if (this.suggestionList.length == 0) {
+            let gnsh = {
+              'title': '暂无数据',
+              'content': '暂无数据',
+              'createTime': '暂无数据',
+            }
+            this.suggestionList.push(gnsh)
+            this.suggestionList.push(gnsh)
+          }
+          if (this.suggestionList.length == 1) {
+            let gnsh = {
+              'title': '暂无数据',
+              'content': '暂无数据',
+              'createTime': '暂无数据',
+            }
+            this.suggestionList.push(gnsh)
+          }
+
+
+          this.getListtionesTOTL()
+        });
+      },
+      getListtiones() {
+        let sgmse = {
+          'pageNum': 1,
+          'pageSize': 2,
+          'status': 2,
+        }
+        listSuggestion(sgmse).then(response => {
+          this.yifhufe = response.total
+          this.bafe = this.percentage() - 0
+        });
+      },
+      getListtionesTOTL() {
+        let sgmse = {
+          'pageNum': 1,
+           'pageSize': 10,
+        }
+        listSuggestion(sgmse).then(response => {
+          this.tatse = response.total
+          this.getListtiones()
+        });
+      },
+
+      // 投诉隐藏
+      yinange(row,index){
+        row.isPublic = 'N'
+        updateSuggestion(row).then(response => {
+          this.$modal.msgSuccess("操作成功");
+          // this.open = false;
+          // this.getList();
+        });
+      },
+      percentage() {
+        return (this.yifhufe / this.tatse * 100).toFixed(0);
+      },
+
+      tousuhuif(row) {
+        // this.form.suggestionId  =  row.suggestionId
+        this.form = {
+          'replyContent': null,
+          'suggestionFjList': null,
+          'suggestionId': row.suggestionId,
+          'status': 2
+        }
+        // this.$set('replyContent',this.form,null)
+        // this.form.replyContent = null
+        // this.form.suggestionFjList = null
+        this.open = true
+      },
+      cancel() {
+        this.open = false
+        this.openz = false
+      },
+      /** 提交按钮 */
+      submitForm() {
+        this.$refs["form"].validate(valid => {
+          if (valid) {
+            // console.log(this.form)
+            if (this.form.suggestionFjList != null) {
+              this.form.suggestionFjList.filter(rou => {
+                rou.suggestionId = this.form.suggestionId
+              })
+            }
+            updateSuggestion(this.form).then(response => {
+              this.$modal.msgSuccess("修改成功");
+              this.open = false;
+              this.getListtion();
+            });
+
+          }
+        });
+      },
+
+      /** 注册认证提交按钮 */
+      submitFormg: function() {
+        this.$refs["formg"].validate(valid => {
+         if (valid) {
+           if(this.ishsoe == false){
+             if(this.tesrtw == this.formg.tenantId){
+               updateStaffManage(this.formg).then(response => {
+                 this.$modal.msgSuccess("修改成功,等待管理员审核");
+                 this.openg = false;
+               });
+             }else{
+               addStaffManage(this.formg).then(response => {
+                 this.$modal.msgSuccess("操作成功,等待管理员审核");
+                 this.openg = false;
+                 // this.getList();
+               });
+             }
+           }else{
+              addStaffManage(this.formg).then(response => {
+                this.$modal.msgSuccess("操作成功,等待管理员审核");
+                this.openg = false;
+                // this.getList();
+              });
+           }
+
+
+          }
+        });
+      },
+      handleSetLineChartData(type) {
+        this.lineChartData = lineChartData[type]
+      },
+      goTarget(href) {
+        window.open(href, "_blank");
+      },
+      format(percentage) {
+        return percentage === 100 ? '${percentage}' : `${percentage}`;
+      },
+      gettime() {
+        var _this = this;
+        let wk = new Date().getDay()
+        let yy = new Date().getFullYear();
+        let mm = new Date().getMonth() + 1;
+        if(mm < 10){
+          mm = '0'+mm
+        }
+        let dd = new Date().getDate();
+        if(dd < 10){
+          dd = '0'+dd
+        }
+        let hh = new Date().getHours() < 10 ? '0' + new Date().getHours() : new Date().getHours();
+        let mf = new Date().getMinutes() < 10 ? '0' + new Date().getMinutes() : new Date().getMinutes();
+        let ss = new Date().getSeconds() < 10 ? '0' + new Date().getSeconds() : new Date().getSeconds();
+        let weeks = ['星期日', '星期一', '星期二', '星期三', '星期四', '星期五', '星期六']
+        let week = weeks[wk]
+        _this.getyer = yy;
+        _this.getmor = mm;
+        _this.getday = dd;
+        _this.getshifL = hh + ':' + mf;
+        _this.getweek = week;
+        // console.log(this.gettime)
+      },
+      setTimer() {
+        if (this.timer == null) {
+          this.timer = setInterval(() => {
+            this.gettime()
+          }, 30000)
+        }
+      },
+      tiahe(row) {
+        if (row == 1) {
+          // 房屋管理
+          this.$router.push({
+            path: '/housesassets/fagnwuguanli',
+          })
+        } else if (row == 2) {
+          // 居住人员管理
+          this.$router.push({
+            path: '/renyuanxiangguan/renyuan',
+          })
+        } else if (row == 3) {
+          // 车辆管控
+          this.$router.push({
+            path: '/communityservicesfacilities/cheliangguank',
+          })
+        } else if (row == 4) {
+          // 违停管理
+          this.$router.push({
+            path: '/communitysecurityorder/weitingchel',
+          })
+        } else if (row == 5) {
+          // 来访管理
+          this.$router.push({
+            path: '/communicationmanagement/visitorManage',
+          })
+        } else if (row == 6) {
+          // 物业报修
+          this.$router.push({
+            path: '/communityservicesfacilities/baoxiuguanli/index',
+          })
+        } else if (row == 7) {
+          // 投诉建议
+          this.$router.push({
+            path: '/communityservicesfacilities/suggestion',
+          })
+        } else if (row == 8) {
+          // 今日巡更
+          this.$router.push({
+            path: '/communitysecurityorder/xungengxinx',
+          })
+        }
+
+      },
+      uploadedSuccessfully(row){
+        // console.log('上传重构员工',row)
+        if(row.length !=0){
+          row.filter(ru=>{
+            this.formg.staffName = ru.realName
+            this.formg.idCard = ru.idCard
+            let sge = this.getInfo( this.formg.idCard)
+            // this.form.yearsOld = sge.age
+            this.formg.gender = sge.sex + ''
+            // this.form.residentBirthday = sge.birth
+          })
+
+        }
+      },
+      getInfo(idCard) {
+              let sex = null;
+              let birth = null;
+              let myDate = new Date();
+              let month = myDate.getMonth() + 1;
+              let day = myDate.getDate();
+              let age = 0;
+
+              if (idCard.length === 18) {
+                age = myDate.getFullYear() - idCard.substring(6, 10) - 1;
+                sex = idCard.substring(16, 17);
+                birth = idCard.substring(6, 10) + "-" + idCard.substring(10, 12) + "-" + idCard.substring(12, 14);
+                if (idCard.substring(10, 12) < month || idCard.substring(10, 12) === month && idCard.substring(12, 14) <= day)
+                  age++;
+
+              }
+              if (idCard.length === 15) {
+                age = myDate.getFullYear() - idCard.substring(6, 8) - 1901;
+                sex = idCard.substring(13, 14);
+                birth = "19" + idCard.substring(6, 8) + "-" + idCard.substring(8, 10) + "-" + idCard.substring(10, 12);
+                if (idCard.substring(8, 10) < month || idCard.substring(8, 10) === month && idCard.substring(10, 12) <= day)
+                  age++;
+              }
+
+              if (sex % 2 === 0)
+                sex = 2; // 性别代码 1代表男,0代表女,暂时不涉及其他类型性别
+              else
+                sex = 1;
+              return {
+                age,
+                sex,
+                birth
+              }
+            },
+            // 表单重置
+            reset() {
+              this.formg = {
+                      staffId: null,
+                      staffName: null,
+                      gender: null,
+                      staffCategory: null,
+                      maintenanceCategory: null,
+                      phoneNumber: null,
+                      avatarPhoto: null,
+                      idCard: null,
+                      idCardFront: null,
+                      idCardBack: null,
+                      certificate: null,
+                      status: null,
+                      createBy: null,
+                      createTime: null,
+                      updateBy: null,
+                      updateTime: null,
+                      remark: null,
+                      tenantId:null,
+                      userId:this.userid,
+                      userType:'pc_user'
+                    };
+              this.resetForm("formg");
+            },
+
+    }
+  };
 </script>
 
-<style scoped lang="scss">
-.home {
-  blockquote {
-    padding: 10px 20px;
-    margin: 0 0 20px;
-    font-size: 17.5px;
-    border-left: 5px solid #eee;
+<style  lang="scss">
+  .quce{
+    .el-form-item__content{
+      margin-left: 0 !important;
+    }
+    .el-upload--picture-card{
+      margin-left:50%;
+      transform:translateX(-50%);
+    }
   }
-  hr {
-    margin-top: 20px;
-    margin-bottom: 20px;
-    border: 0;
-    border-top: 1px solid #eee;
+  .shefnze{
+    .el-upload--picture-card{
+      width: 80px;
+      height: 80px;
+      line-height: 80px;
+    }
+    .el-upload-list--picture-card .el-upload-list__item{
+      width: 80px;
+      height: 80px;
+    }
+    .el-upload__tip{
+      overflow: hidden;
+        text-overflow: ellipsis;
+        white-space: nowrap;
+    }
   }
-  .col-item {
-    margin-bottom: 20px;
+  .ngeshimg{
+    .el-upload--picture-card{
+      width: 36px;
+      height: 36px;
+      line-height: 36px;
+      position: absolute;
+      top:0;
+      right: 0;
+    }
+    .component-upload-image{
+      position: absolute;
+      top:0;
+      right: 0;
+    }
+    .el-upload--picture-card i{
+      font-size: 20px;
+    }
+    .el-upload-list--picture-card .el-upload-list__item{
+      width: 58px;
+      height: 36px;
+      position: absolute;
+      top:0;
+      right: -10px;
+    }
   }
-
-  ul {
-    padding: 0;
-    margin: 0;
+  .unimg{
+    .el-upload--picture-card{
+      width:102px;
+      height: 102px;
+      line-height: 102px;
+    }
+    .el-upload-list--picture-card .el-upload-list__item{
+      width:102px;
+      height: 102px;
+      line-height: 102px;
+    }
   }
 
-  font-family: "open sans", "Helvetica Neue", Helvetica, Arial, sans-serif;
-  font-size: 13px;
-  color: #676a6c;
-  overflow-x: hidden;
+  </style>
 
-  ul {
-    list-style-type: none;
+<style scoped lang="scss">
+  .index {
+    // padding-right: 10px !important;
   }
 
-  h4 {
-    margin-top: 0px;
-  }
+  .home {
+    blockquote {
+      padding: 10px 20px;
+      margin: 0 0 20px;
+      font-size: 17.5px;
+      border-left: 5px solid #eee;
+    }
 
-  h2 {
-    margin-top: 10px;
-    font-size: 26px;
-    font-weight: 100;
-  }
+    hr {
+      margin-top: 20px;
+      margin-bottom: 20px;
+      border: 0;
+      border-top: 1px solid #eee;
+    }
 
-  p {
-    margin-top: 10px;
+    .col-item {
+      margin-bottom: 20px;
+    }
 
-    b {
-      font-weight: 700;
+    ul {
+      padding: 0;
+      margin: 0;
+    }
+
+    font-family: "open sans",
+    "Helvetica Neue",
+    Helvetica,
+    Arial,
+    sans-serif;
+    font-size: 13px;
+    color: #676a6c;
+    overflow-x: hidden;
+
+    ul {
+      list-style-type: none;
+    }
+
+    h4 {
+      margin-top: 0px;
+    }
+
+    h2 {
+      margin-top: 10px;
+      font-size: 26px;
+      font-weight: 100;
+    }
+
+    p {
+      margin-top: 10px;
+
+      b {
+        font-weight: 700;
+      }
     }
-  }
 
-  .update-log {
-    ol {
-      display: block;
-      list-style-type: decimal;
-      margin-block-start: 1em;
-      margin-block-end: 1em;
-      margin-inline-start: 0;
-      margin-inline-end: 0;
-      padding-inline-start: 40px;
+    .update-log {
+      ol {
+        display: block;
+        list-style-type: decimal;
+        margin-block-start: 1em;
+        margin-block-end: 1em;
+        margin-inline-start: 0;
+        margin-inline-end: 0;
+        padding-inline-start: 40px;
+      }
     }
   }
-}
+
 </style>
+<style lang="scss">
+// 蓝湖样式粘贴
+body {
+  font-family: PingFangSC-Regular, Roboto, Helvetica Neue, Helvetica, Tahoma,
+    Arial, PingFang SC-Light, Microsoft YaHei;
+}
+input {
+  background-color: transparent;
+  border: 0;
+}
+button {
+  margin: 0;
+  padding: 0;
+  border: 1px solid transparent;
+  outline: none;
+  background-color: transparent;
+}
+
+button:active {
+  opacity: 0.6;
+}
+.van-nav-bar__left:active,
+.van-nav-bar__right:active {
+  opacity: 1;
+}
+[class*='van-']::after {
+  border-bottom: 0;
+}
+.flex-col {
+  display: flex;
+  flex-direction: column;
+}
+.flex-row {
+  display: flex;
+  flex-direction: row;
+}
+.justify-start {
+  display: flex;
+  justify-content: flex-start;
+}
+.justify-center {
+  display: flex;
+  justify-content: center;
+}
+
+.justify-end {
+  display: flex;
+  justify-content: flex-end;
+}
+.justify-evenly {
+  display: flex;
+  justify-content: space-evenly;
+}
+.justify-around {
+  display: flex;
+  justify-content: space-around;
+}
+.justify-between {
+  display: flex;
+  justify-content: space-between;
+}
+.align-start {
+  display: flex;
+  align-items: flex-start;
+}
+.align-center {
+  display: flex;
+  align-items: center;
+}
+.align-end {
+  display: flex;
+  align-items: flex-end;
+}
+
+.page {
+  position: relative;
+  width: 1440px;
+  height: 934px;
+  overflow: hidden;
+}
+
+.box_1 {
+  height: 934px;
+  background: url(https://lanhu-oss-2537-2.lanhuapp.com/psupnp53zjsb6uumou8biiluuj3eul374afd762c56-ebbd-4c13-a938-1c346119c9ed)
+    100% no-repeat;
+  background-size: 100% 100%;
+  width: 1440px;
+  position: relative;
+}
+
+.block_1 {
+  width: 1400px;
+  height: 30px;
+  margin: 25px 0 0 20px;
+}
+
+.image_1 {
+  width: 231px;
+  height: 30px;
+}
+
+.label_1 {
+  width: 26px;
+  height: 26px;
+  margin: 2px 0 0 1003px;
+}
+
+.text_1 {
+  width: 46px;
+  height: 12px;
+  overflow-wrap: break-word;
+  color: rgba(75, 90, 109, 1);
+  font-size: 16px;
+  font-family: PingFang-SC-Bold;
+  font-weight: 700;
+  text-align: left;
+  white-space: nowrap;
+  line-height: 24px;
+  margin: 8px 0 0 7px;
+}
+
+.thumbnail_1 {
+  width: 8px;
+  height: 4px;
+  margin: 13px 0 0 11px;
+}
+
+.thumbnail_2 {
+  width: 1px;
+  height: 16px;
+  margin: 7px 0 0 18px;
+}
+
+.text_2 {
+  width: 31px;
+  height: 16px;
+  overflow-wrap: break-word;
+  color: rgba(75, 90, 109, 1);
+  font-size: 16px;
+  font-family: PingFang-SC-Bold;
+  font-weight: 700;
+  text-align: left;
+  white-space: nowrap;
+  line-height: 24px;
+  margin: 6px 0 0 18px;
+}
+
+.block_2 {
+  width: 1399px;
+  height: 167px;
+  margin: 24px 0 0 20px;
+}
+
+.block_3 {
+  width: 180px;
+  height: 145px;
+  margin-top: 22px;
+}
+
+.group_1 {
+  background-color: rgba(221, 235, 231, 1);
+  border-radius: 4px;
+  height: 36px;
+  width: 180px;
+}
+
+.box_2 {
+  width: 14px;
+  height: 16px;
+  background: url(https://lanhu-oss-2537-2.lanhuapp.com/pssr9va0oenskc5702erondk4k6soy2sg3fcb86e5-1f9d-40ef-9503-d5785a4bf2be)
+    100% no-repeat;
+  background-size: 100% 100%;
+  margin: 10px 0 0 22px;
+}
+
+.thumbnail_3 {
+  width: 16px;
+  height: 15px;
+  margin: 35px 0 0 20px;
+}
+
+.thumbnail_4 {
+  width: 16px;
+  height: 16px;
+  margin: 43px 0 0 21px;
+}
+
+.block_4 {
+  background-color: rgba(255, 255, 255, 1);
+  border-radius: 10px;
+  height: 158px;
+  width: 100%;
+  // margin: 1px 0 0 19px;
+}
+
+.group_2 {
+  width: 118px;
+  height: 18px;
+  margin: 17px 0 0 13px;
+}
+
+.thumbnail_5 {
+  width: 16px;
+  height: 18px;
+}
+
+.text_3 {
+  width: 95px;
+  height: 16px;
+  overflow-wrap: break-word;
+  color: rgba(51, 51, 51, 1);
+  font-size: 16px;
+  font-family: PingFang-SC-Heavy;
+  font-weight: 900;
+  text-align: left;
+  white-space: nowrap;
+  line-height: 16px;
+  margin-top: 1px;
+}
+
+.group_3 {
+  width: 100%;
+  height: 59px;
+  margin: 26px 0 0 0;
+  justify-content: space-around;
+}
+
+.text-wrapper_1 {
+  width: 84px;
+  height: 44px;
+}
+
+.text_4 {
+  width: 84px;
+  height: 14px;
+  overflow-wrap: break-word;
+  color: rgba(102, 102, 102, 1);
+  font-size: 14px;
+  font-family: PingFang-SC-Medium;
+  font-weight: 500;
+  text-align: left;
+  white-space: nowrap;
+  line-height: 24px;
+}
+
+.text_5 {
+  width: 23px;
+  height: 16px;
+  overflow-wrap: break-word;
+  color: rgba(51, 51, 51, 1);
+  font-size: 22px;
+  font-family: Alibaba-PuHuiTi-B;
+  font-weight: 700;
+  text-align: left;
+  white-space: nowrap;
+  line-height: 24px;
+  margin-top: 14px;
+}
+
+.image_2 {
+  width: 1px;
+  height: 46px;
+  margin: 13px 0 0 42px;
+}
+
+.text-wrapper_2 {
+  width: 56px;
+  height: 45px;
+  // margin-left: 42px;
+}
+
+.text_6 {
+  width: 55px;
+  height: 14px;
+  overflow-wrap: break-word;
+  color: rgba(102, 102, 102, 1);
+  font-size: 14px;
+  font-family: PingFang-SC-Medium;
+  font-weight: 500;
+  text-align: left;
+  white-space: nowrap;
+  line-height: 24px;
+  margin-left: 1px;
+}
+
+.text_7 {
+  width: 25px;
+  height: 17px;
+  overflow-wrap: break-word;
+  color: rgba(51, 51, 51, 1);
+  font-size: 22px;
+  font-family: Alibaba-PuHuiTi-B;
+  font-weight: 700;
+  text-align: left;
+  white-space: nowrap;
+  line-height: 24px;
+  margin-top: 14px;
+}
+
+.text-wrapper_3 {
+  width: 56px;
+  height: 45px;
+  // margin-left: 73px;
+}
+
+.text_8 {
+  width: 55px;
+  height: 14px;
+  overflow-wrap: break-word;
+  color: rgba(102, 102, 102, 1);
+  font-size: 14px;
+  font-family: PingFang-SC-Medium;
+  font-weight: 500;
+  text-align: left;
+  white-space: nowrap;
+  line-height: 24px;
+  margin-left: 1px;
+}
+
+.text_9 {
+  width: 25px;
+  height: 17px;
+  overflow-wrap: break-word;
+  color: rgba(51, 51, 51, 1);
+  font-size: 22px;
+  font-family: Alibaba-PuHuiTi-B;
+  font-weight: 700;
+  text-align: left;
+  white-space: nowrap;
+  line-height: 24px;
+  margin-top: 14px;
+}
+
+.text-wrapper_4 {
+  width: 70px;
+  height: 45px;
+  // margin-left: 80px;
+}
+
+.text_10 {
+  width: 68px;
+  height: 14px;
+  overflow-wrap: break-word;
+  color: rgba(102, 102, 102, 1);
+  font-size: 14px;
+  font-family: PingFang-SC-Medium;
+  font-weight: 500;
+  text-align: left;
+  white-space: nowrap;
+  line-height: 24px;
+  margin-left: 2px;
+}
+
+.text_11 {
+  width: 24px;
+  height: 17px;
+  overflow-wrap: break-word;
+  color: rgba(51, 51, 51, 1);
+  font-size: 22px;
+  font-family: Alibaba-PuHuiTi-B;
+  font-weight: 700;
+  text-align: left;
+  white-space: nowrap;
+  line-height: 24px;
+  margin-top: 14px;
+}
+
+.text-wrapper_5 {
+  width: 91px;
+  height: 45px;
+  // margin-left: 56px;
+}
+
+.text_12 {
+  width: 90px;
+  height: 14px;
+  overflow-wrap: break-word;
+  color: rgba(102, 102, 102, 1);
+  font-size: 14px;
+  font-family: PingFang-SC-Medium;
+  font-weight: 500;
+  text-align: left;
+  white-space: nowrap;
+  line-height: 24px;
+  margin-left: 1px;
+}
+
+.text_13 {
+  width: 22px;
+  height: 17px;
+  overflow-wrap: break-word;
+  color: rgba(51, 51, 51, 1);
+  font-size: 22px;
+  font-family: Alibaba-PuHuiTi-B;
+  font-weight: 700;
+  text-align: left;
+  white-space: nowrap;
+  line-height: 24px;
+  margin-top: 14px;
+}
+
+.group_4 {
+  width: 100%;
+  height: 12px;
+  margin: 1px 0 25px 0;
+}
+
+.text_14 {
+  width: 34px;
+  height: 12px;
+  overflow-wrap: break-word;
+  color: rgba(102, 102, 102, 1);
+  font-size: 12px;
+  font-family: PingFang-SC-Medium;
+  font-weight: 500;
+  text-align: left;
+  white-space: nowrap;
+  line-height: 12px;
+}
+
+.thumbnail_6 {
+  width: 14px;
+  height: 10px;
+  margin: 1px 0 0 4px;
+}
+
+.text_15 {
+  width: 26px;
+  height: 10px;
+  overflow-wrap: break-word;
+  color: rgba(254, 167, 27, 1);
+  font-size: 12px;
+  font-family: PingFang-SC-Bold;
+  font-weight: 700;
+  text-align: left;
+  white-space: nowrap;
+  line-height: 12px;
+  margin: 1px 0 0 5px;
+}
+
+.text_16 {
+  width: 34px;
+  height: 12px;
+  overflow-wrap: break-word;
+  color: rgba(102, 102, 102, 1);
+  font-size: 12px;
+  font-family: PingFang-SC-Medium;
+  font-weight: 500;
+  text-align: left;
+  white-space: nowrap;
+  line-height: 24px;
+  margin-left: 87px;
+}
+
+.thumbnail_7 {
+  width: 14px;
+  height: 10px;
+  margin: 1px 0 0 4px;
+}
+
+.text_17 {
+  width: 29px;
+  height: 10px;
+  overflow-wrap: break-word;
+  color: rgba(254, 167, 27, 1);
+  font-size: 12px;
+  font-family: PingFang-SC-Bold;
+  font-weight: 700;
+  text-align: left;
+  white-space: nowrap;
+  line-height: 24px;
+  margin: 1px 0 0 5px;
+}
+
+.text_18 {
+  width: 34px;
+  height: 12px;
+  overflow-wrap: break-word;
+  color: rgba(102, 102, 102, 1);
+  font-size: 12px;
+  font-family: PingFang-SC-Medium;
+  font-weight: 500;
+  text-align: left;
+  white-space: nowrap;
+  line-height: 24px;
+  margin-left: 43px;
+}
+
+.thumbnail_8 {
+  width: 14px;
+  height: 10px;
+  margin: 1px 0 0 5px;
+}
+
+.text_19 {
+  width: 36px;
+  height: 10px;
+  overflow-wrap: break-word;
+  color: rgba(3, 191, 138, 1);
+  font-size: 12px;
+  font-family: PingFang-SC-Bold;
+  font-weight: 700;
+  text-align: left;
+  white-space: nowrap;
+  line-height: 24px;
+  margin: 1px 0 0 4px;
+}
+
+.text_20 {
+  width: 34px;
+  height: 12px;
+  overflow-wrap: break-word;
+  color: rgba(102, 102, 102, 1);
+  font-size: 12px;
+  font-family: PingFang-SC-Medium;
+  font-weight: 500;
+  text-align: left;
+  white-space: nowrap;
+  line-height: 24px;
+  margin-left: 43px;
+}
+
+.thumbnail_9 {
+  width: 14px;
+  height: 10px;
+  margin: 1px 0 0 5px;
+}
+
+.text_21 {
+  width: 26px;
+  height: 10px;
+  overflow-wrap: break-word;
+  color: rgba(3, 191, 138, 1);
+  font-size: 12px;
+  font-family: PingFang-SC-Bold;
+  font-weight: 700;
+  text-align: left;
+  white-space: nowrap;
+  line-height: 24px;
+  margin: 1px 0 0 4px;
+}
+
+.text_22 {
+  width: 34px;
+  height: 12px;
+  overflow-wrap: break-word;
+  color: rgba(102, 102, 102, 1);
+  font-size: 12px;
+  font-family: PingFang-SC-Medium;
+  font-weight: 500;
+  text-align: left;
+  white-space: nowrap;
+  line-height: 24px;
+  margin-left: 43px;
+}
+
+.thumbnail_10 {
+  width: 14px;
+  height: 10px;
+  margin: 1px 0 0 4px;
+}
+
+.text_23 {
+  width: 32px;
+  height: 10px;
+  overflow-wrap: break-word;
+  color: rgba(254, 167, 27, 1);
+  font-size: 12px;
+  font-family: PingFang-SC-Bold;
+  font-weight: 700;
+  text-align: left;
+  white-space: nowrap;
+  line-height: 24px;
+  margin: 1px 0 0 6px;
+}
+
+.block_5 {
+  background-color: rgba(255, 255, 255, 1);
+  border-radius: 10px;
+  height: 159px;
+  // margin-left: 12px;
+  width: 100%;
+}
+
+.box_3 {
+  width: 86px;
+  height: 16px;
+  margin: 18px 0 0 13px;
+}
+
+.thumbnail_11 {
+  width: 18px;
+  height: 16px;
+}
+
+.text_24 {
+  width: 64px;
+  height: 16px;
+  overflow-wrap: break-word;
+  color: rgba(51, 51, 51, 1);
+  font-size: 16px;
+  font-family: PingFang-SC-Heavy;
+  font-weight: 900;
+  text-align: left;
+  white-space: nowrap;
+  line-height: 16px;
+  margin-left: 10px;
+}
+
+.image-wrapper_1 {
+  width: 100%;
+  // height: 48px;
+  margin: 21px 0 0 0;
+  justify-content: space-around;
+}
+
+.label_2 {
+  width: 48px;
+  height: 48px;
+}
+
+.label_3 {
+  width: 48px;
+  height: 48px;
+  // margin-left: 34px;
+}
+
+.label_4 {
+  width: 48px;
+  height: 48px;
+  // margin-left: 34px;
+}
+
+.label_5 {
+  width: 48px;
+  height: 48px;
+  // margin-left: 35px;
+}
 
+.label_6 {
+  width: 48px;
+  height: 48px;
+  // margin-left: 34px;
+}
+
+.text-wrapper_6 {
+  width: 392px;
+  height: 16px;
+  margin: 20px 0 20px 31px;
+}
+
+.text_25 {
+  width: 63px;
+  height: 16px;
+  overflow-wrap: break-word;
+  color: rgba(51, 51, 51, 1);
+  font-size: 16px;
+  font-family: PingFang-SC-Medium;
+  font-weight: 500;
+  text-align: center;
+  white-space: nowrap;
+  line-height: 30px;
+}
+
+.text_26 {
+  width: 63px;
+  height: 16px;
+  overflow-wrap: break-word;
+  color: rgba(51, 51, 51, 1);
+  font-size: 16px;
+  font-family: PingFang-SC-Medium;
+  font-weight: 500;
+  text-align: center;
+  white-space: nowrap;
+  line-height: 30px;
+  // margin-left: 19px;
+}
+
+.text_27 {
+  width: 64px;
+  height: 15px;
+  overflow-wrap: break-word;
+  color: rgba(51, 51, 51, 1);
+  font-size: 16px;
+  font-family: PingFang-SC-Medium;
+  font-weight: 500;
+  text-align: center;
+  white-space: nowrap;
+  line-height: 30px;
+  // margin-left: 19px;
+}
+
+.text_28 {
+  width: 63px;
+  height: 15px;
+  overflow-wrap: break-word;
+  color: rgba(51, 51, 51, 1);
+  font-size: 16px;
+  font-family: PingFang-SC-Medium;
+  font-weight: 500;
+  text-align: center;
+  white-space: nowrap;
+  line-height: 30px;
+  // margin-left: 19px;
+}
+
+.text_29 {
+  width: 63px;
+  height: 16px;
+  overflow-wrap: break-word;
+  color: rgba(51, 51, 51, 1);
+  font-size: 16px;
+  font-family: PingFang-SC-Medium;
+  font-weight: 500;
+  text-align: center;
+  white-space: nowrap;
+  line-height: 30px;
+  // margin-left: 19px;
+}
+
+.block_6 {
+  width: 1380px;
+  height: 668px;
+  margin: 4px 0 16px 39px;
+}
+
+.image-wrapper_2 {
+  width: 18px;
+  height: 376px;
+  margin-top: 41px;
+}
+
+.thumbnail_12 {
+  width: 16px;
+  height: 15px;
+  margin-left: 1px;
+}
+
+.thumbnail_13 {
+  width: 16px;
+  height: 14px;
+  margin: 44px 0 0 1px;
+}
+
+.thumbnail_14 {
+  width: 16px;
+  height: 16px;
+  margin: 45px 0 0 1px;
+}
+
+.thumbnail_15 {
+  width: 15px;
+  height: 16px;
+  margin: 44px 0 0 2px;
+}
+
+.thumbnail_16 {
+  width: 18px;
+  height: 16px;
+  margin-top: 45px;
+}
+
+.thumbnail_17 {
+  width: 16px;
+  height: 16px;
+  margin: 44px 0 0 1px;
+}
+
+.thumbnail_18 {
+  width: 15px;
+  height: 15px;
+  margin: 46px 0 0 2px;
+}
+
+.box_4 {
+  width: 734px;
+  height: 668px;
+  margin-left: 162px;
+}
+
+.group_5 {
+  background-color: rgba(255, 255, 255, 1);
+  border-radius: 10px;
+  position: relative;
+  width: 100%;
+  height: 372px;
+  margin-top: 20px;
+}
+
+.group_6 {
+  width: 100%;
+  height: 24px;
+  padding: 14px 12px 0 12px;
+
+}
+
+.thumbnail_19 {
+  width: 17px;
+  height: 15px;
+  margin-top: 4px;
+}
+
+.text_30 {
+  width: 95px;
+  height: 16px;
+  overflow-wrap: break-word;
+  color: rgba(51, 51, 51, 1);
+  font-size: 16px;
+  font-family: PingFang-SC-Heavy;
+  font-weight: 900;
+  text-align: left;
+  white-space: nowrap;
+  line-height: 16px;
+  margin: 3px 0 0 6px;
+}
+
+.section_1 {
+  background-color: rgba(238, 248, 245, 1);
+  border-radius: 11px;
+  width: 102px;
+  height: 24px;
+  margin-left: 12px;
+}
+
+.text_31 {
+  width: 55px;
+  height: 14px;
+  overflow-wrap: break-word;
+  color: rgba(51, 51, 51, 1);
+  font-size: 14px;
+  font-family: PingFang-SC-Medium;
+  font-weight: 500;
+  text-align: left;
+  white-space: nowrap;
+  line-height: 14px;
+  margin: 5px 0 0 13px;
+}
+
+.thumbnail_20 {
+  width: 9px;
+  height: 6px;
+  margin: 9px 14px 0 11px;
+}
+
+.text_32 {
+  width: 75px;
+  height: 14px;
+  overflow-wrap: break-word;
+  color: rgba(170, 170, 170, 1);
+  font-size: 14px;
+  font-family: PingFang-SC-Medium;
+  font-weight: 500;
+  text-align: left;
+  white-space: nowrap;
+  line-height: 14px;
+  // margin: 3px 0 0 402px;
+}
+
+.group_7 {
+  width: 100%;
+  // height: 13px;
+  padding: 23px 12px 0 12px;
+}
+
+.text_33 {
+  width: 40px;
+  height: 12px;
+  overflow-wrap: break-word;
+  color: rgba(51, 51, 51, 1);
+  font-size: 12px;
+  font-family: PingFang-SC-Medium;
+  font-weight: 500;
+  text-align: left;
+  white-space: nowrap;
+  line-height: 18px;
+}
+
+.box_5 {
+  background-color: rgba(255, 171, 43, 1);
+  width: 10px;
+  height: 10px;
+  margin: 2px 0 0 0;
+}
+
+.text_34 {
+  width: 47px;
+  height: 12px;
+  overflow-wrap: break-word;
+  color: rgba(51, 51, 51, 1);
+  font-size: 12px;
+  font-family: PingFang-SC-Medium;
+  font-weight: 500;
+  text-align: left;
+  white-space: nowrap;
+  line-height: 12px;
+  margin: 1px 0 0 10px;
+}
+
+.box_6 {
+  background-color: rgba(3, 191, 138, 1);
+  width: 10px;
+  height: 10px;
+  margin: 2px 0 0 21px;
+}
+
+.text_35 {
+  width: 47px;
+  height: 12px;
+  overflow-wrap: break-word;
+  color: rgba(51, 51, 51, 1);
+  font-size: 12px;
+  font-family: PingFang-SC-Medium;
+  font-weight: 500;
+  text-align: left;
+  white-space: nowrap;
+  line-height: 12px;
+  margin: 1px 0 0 10px;
+}
+
+.text_36 {
+  width: 54px;
+  height: 12px;
+  overflow-wrap: break-word;
+  color: rgba(51, 51, 51, 1);
+  font-size: 12px;
+  font-family: PingFang-SC-Medium;
+  font-weight: 500;
+  text-align: left;
+  white-space: nowrap;
+  line-height: 18px;
+  margin-left: 0;
+}
+
+.group_8 {
+  width: 100%;
+  height: 234px;
+  padding: 23px 12px 0 19px;
+}
+
+.paragraph_1 {
+  width: 14px;
+  height: 234px;
+  overflow-wrap: break-word;
+  color: rgba(102, 102, 102, 1);
+  font-size: 12px;
+  font-family: PingFang-SC-Medium;
+  font-weight: 500;
+  text-align: right;
+  line-height: 45px;
+}
+
+.image_3 {
+  width: 671px;
+  height: 210px;
+  margin-top: 17px;
+}
+
+.text-wrapper_7 {
+  width: 655px;
+  height: 10px;
+  margin: 10px 0 21px 50px;
+}
+
+.text_37 {
+  width: 24px;
+  height: 10px;
+  overflow-wrap: break-word;
+  color: rgba(102, 102, 102, 1);
+  font-size: 12px;
+  font-family: PingFang-SC-Medium;
+  font-weight: 500;
+  text-align: left;
+  white-space: nowrap;
+  line-height: 18px;
+}
+
+.text_38 {
+  width: 17px;
+  height: 10px;
+  overflow-wrap: break-word;
+  color: rgba(102, 102, 102, 1);
+  font-size: 12px;
+  font-family: PingFang-SC-Medium;
+  font-weight: 500;
+  text-align: left;
+  white-space: nowrap;
+  line-height: 18px;
+  margin-left: 26px;
+}
+
+.text_39 {
+  width: 16px;
+  height: 10px;
+  overflow-wrap: break-word;
+  color: rgba(102, 102, 102, 1);
+  font-size: 12px;
+  font-family: PingFang-SC-Medium;
+  font-weight: 500;
+  text-align: left;
+  white-space: nowrap;
+  line-height: 18px;
+  margin-left: 27px;
+}
+
+.text_40 {
+  width: 24px;
+  height: 10px;
+  overflow-wrap: break-word;
+  color: rgba(102, 102, 102, 1);
+  font-size: 12px;
+  font-family: PingFang-SC-Medium;
+  font-weight: 500;
+  text-align: left;
+  white-space: nowrap;
+  line-height: 18px;
+  margin-left: 27px;
+}
+
+.text_41 {
+  width: 24px;
+  height: 10px;
+  overflow-wrap: break-word;
+  color: rgba(102, 102, 102, 1);
+  font-size: 12px;
+  font-family: PingFang-SC-Medium;
+  font-weight: 500;
+  text-align: left;
+  white-space: nowrap;
+  line-height: 18px;
+  margin-left: 26px;
+}
+
+.text_42 {
+  width: 21px;
+  height: 10px;
+  overflow-wrap: break-word;
+  color: rgba(102, 102, 102, 1);
+  font-size: 12px;
+  font-family: PingFang-SC-Medium;
+  font-weight: 500;
+  text-align: left;
+  white-space: nowrap;
+  line-height: 18px;
+  margin-left: 27px;
+}
+
+.text_43 {
+  width: 24px;
+  height: 10px;
+  overflow-wrap: break-word;
+  color: rgba(102, 102, 102, 1);
+  font-size: 12px;
+  font-family: PingFang-SC-Medium;
+  font-weight: 500;
+  text-align: left;
+  white-space: nowrap;
+  line-height: 18px;
+  margin-left: 27px;
+}
+
+.text_44 {
+  width: 17px;
+  height: 10px;
+  overflow-wrap: break-word;
+  color: rgba(102, 102, 102, 1);
+  font-size: 12px;
+  font-family: PingFang-SC-Medium;
+  font-weight: 500;
+  text-align: left;
+  white-space: nowrap;
+  line-height: 18px;
+  margin-left: 25px;
+}
+
+.text_45 {
+  width: 25px;
+  height: 10px;
+  overflow-wrap: break-word;
+  color: rgba(102, 102, 102, 1);
+  font-size: 12px;
+  font-family: PingFang-SC-Medium;
+  font-weight: 500;
+  text-align: left;
+  white-space: nowrap;
+  line-height: 18px;
+  margin-left: 26px;
+}
+
+.text_46 {
+  width: 25px;
+  height: 10px;
+  overflow-wrap: break-word;
+  color: rgba(102, 102, 102, 1);
+  font-size: 12px;
+  font-family: PingFang-SC-Medium;
+  font-weight: 500;
+  text-align: left;
+  white-space: nowrap;
+  line-height: 18px;
+  margin-left: 26px;
+}
+
+.text_47 {
+  width: 25px;
+  height: 10px;
+  overflow-wrap: break-word;
+  color: rgba(102, 102, 102, 1);
+  font-size: 12px;
+  font-family: PingFang-SC-Medium;
+  font-weight: 500;
+  text-align: left;
+  white-space: nowrap;
+  line-height: 18px;
+  margin-left: 26px;
+}
+
+.text_48 {
+  width: 22px;
+  height: 9px;
+  overflow-wrap: break-word;
+  color: rgba(102, 102, 102, 1);
+  font-size: 12px;
+  font-family: PingFang-SC-Medium;
+  font-weight: 500;
+  text-align: left;
+  white-space: nowrap;
+  line-height: 18px;
+  margin: 1px 0 0 25px;
+}
+
+.text_49 {
+  width: 25px;
+  height: 10px;
+  overflow-wrap: break-word;
+  color: rgba(102, 102, 102, 1);
+  font-size: 12px;
+  font-family: PingFang-SC-Medium;
+  font-weight: 500;
+  text-align: left;
+  white-space: nowrap;
+  line-height: 18px;
+  margin-left: 27px;
+}
+
+.text_50 {
+  width: 25px;
+  height: 10px;
+  overflow-wrap: break-word;
+  color: rgba(102, 102, 102, 1);
+  font-size: 12px;
+  font-family: PingFang-SC-Medium;
+  font-weight: 500;
+  text-align: left;
+  white-space: nowrap;
+  line-height: 18px;
+  margin-left: 26px;
+}
+
+.image_4 {
+  position: absolute;
+  left: 43px;
+  top: 102px;
+  width: 669px;
+  height: 226px;
+}
+
+.group_9 {
+  width: 734px;
+  height: 284px;
+  margin-top: 12px;
+}
+
+.box_7 {
+  background-color: rgba(255, 255, 255, 1);
+  border-radius: 10px;
+  width: 100%;
+  height: 284px;
+}
+
+.group_10 {
+  width: 100%;
+  height: 24px;
+  padding: 12px 12px 0 12px;
+}
+
+.image-text_1 {
+  width: 118px;
+  height: 16px;
+  margin-top: 4px;
+}
+
+.thumbnail_21 {
+  width: 17px;
+  height: 16px;
+}
+
+.text-group_1 {
+  width: 95px;
+  height: 16px;
+  overflow-wrap: break-word;
+  color: rgba(51, 51, 51, 1);
+  font-size: 16px;
+  font-family: PingFang-SC-Heavy;
+  font-weight: 900;
+  text-align: left;
+  white-space: nowrap;
+  line-height: 16px;
+}
+
+.group_11 {
+  background-color: rgba(238, 248, 245, 1);
+  border-radius: 11px;
+  width: 84px;
+  height: 24px;
+}
+
+.image-text_2 {
+  width: 55px;
+  height: 11px;
+  margin: 6px 0 0 15px;
+}
+
+.text-group_2 {
+  width: 33px;
+  height: 11px;
+  overflow-wrap: break-word;
+  color: rgba(51, 51, 51, 1);
+  font-size: 14px;
+  font-family: PingFang-SC-Medium;
+  font-weight: 500;
+  text-align: left;
+  white-space: nowrap;
+  line-height: 11px;
+}
+
+.thumbnail_22 {
+  width: 9px;
+  height: 6px;
+  margin-top: 3px;
+}
+
+.text_51 {
+  width: 58px;
+  height: 13px;
+  overflow-wrap: break-word;
+  color: rgba(51, 51, 51, 1);
+  font-size: 14px;
+  font-family: PingFang-SC-Medium;
+  font-weight: 500;
+  text-align: left;
+  white-space: nowrap;
+  line-height: 14px;
+  margin: 23px 0 0 141px;
+}
+
+.group_12 {
+  width: 100%;
+  height: 161px;
+  padding: 6px 10px 0 10px;
+
+}
+
+.text_52 {
+  width: 58px;
+  height: 13px;
+  overflow-wrap: break-word;
+  color: rgba(51, 51, 51, 1);
+  font-size: 14px;
+  font-family: PingFang-SC-Medium;
+  font-weight: 500;
+  text-align: left;
+  white-space: nowrap;
+  line-height: 14px;
+  margin-top: 54px;
+}
+
+.image_5 {
+  width: 177px;
+  height: 161px;
+  margin-left: 5px;
+}
+
+.text_53 {
+  width: 58px;
+  height: 13px;
+  overflow-wrap: break-word;
+  color: rgba(51, 51, 51, 1);
+  font-size: 14px;
+  font-family: PingFang-SC-Medium;
+  font-weight: 500;
+  text-align: left;
+  white-space: nowrap;
+  line-height: 14px;
+  margin: 54px 0 0 5px;
+}
+
+.text-wrapper_8 {
+  width: 184px;
+  height: 14px;
+  margin: 4px 0 27px 82px;
+}
+
+.text_54 {
+  width: 58px;
+  height: 14px;
+  overflow-wrap: break-word;
+  color: rgba(51, 51, 51, 1);
+  font-size: 14px;
+  font-family: PingFang-SC-Medium;
+  font-weight: 500;
+  text-align: left;
+  white-space: nowrap;
+  line-height: 14px;
+}
+
+.text_55 {
+  width: 72px;
+  height: 14px;
+  overflow-wrap: break-word;
+  color: rgba(51, 51, 51, 1);
+  font-size: 14px;
+  font-family: PingFang-SC-Medium;
+  font-weight: 500;
+  text-align: left;
+  white-space: nowrap;
+  line-height: 14px;
+}
+
+.box_8 {
+  background-color: rgba(255, 255, 255, 1);
+  border-radius: 10px;
+  height: 284px;
+  width: 100%;
+  position: relative;
+}
+
+.block_7 {
+  width: 100%;
+  height: 24px;
+  padding: 12px 11px 0 11px;
+}
+
+.image-text_3 {
+  width: 151px;
+  height: 16px;
+  margin-top: 4px;
+}
+
+.thumbnail_23 {
+  width: 16px;
+  height: 16px;
+}
+
+.text-group_3 {
+  width: 127px;
+  height: 16px;
+  overflow-wrap: break-word;
+  color: rgba(51, 51, 51, 1);
+  font-size: 16px;
+  font-family: PingFang-SC-Heavy;
+  font-weight: 900;
+  text-align: left;
+  white-space: nowrap;
+  line-height: 16px;
+}
+
+.section_2 {
+  background-color: rgba(238, 248, 245, 1);
+  border-radius: 11px;
+  width: 84px;
+  height: 24px;
+}
+
+.image-text_4 {
+  width: 55px;
+  height: 11px;
+  margin: 6px 0 0 15px;
+}
+
+.text-group_4 {
+  width: 33px;
+  height: 11px;
+  overflow-wrap: break-word;
+  color: rgba(51, 51, 51, 1);
+  font-size: 14px;
+  font-family: PingFang-SC-Medium;
+  font-weight: 500;
+  text-align: left;
+  white-space: nowrap;
+  line-height: 11px;
+}
+
+.thumbnail_24 {
+  width: 9px;
+  height: 6px;
+  margin-top: 3px;
+}
+
+.block_8 {
+  width: 100%;
+  // height: 179px;
+  padding: 0 10px 0 10px;
+  position: relative;
+  top:32px;
+}
+
+.block_9 {
+  width: 167px;
+  height: 167px;
+  background: url(https://lanhu-oss-2537-2.lanhuapp.com/ps7hfzqonyh34q6htsu17cobje5wipuw9706925fc9-9116-494b-a413-4e48b0c75c37) -21px -14px
+    no-repeat;
+  background-size: 224px 195px;
+}
+
+.text_56 {
+  width: 64px;
+  height: 16px;
+  overflow-wrap: break-word;
+  color: rgba(102, 102, 102, 1);
+  font-size: 16px;
+  font-family: PingFang-SC-Medium;
+  font-weight: 500;
+  text-align: left;
+  white-space: nowrap;
+  line-height: 24px;
+  margin: 59px 0 0 50px;
+}
+
+.text-wrapper_9 {
+  width: 68px;
+  height: 18px;
+  overflow-wrap: break-word;
+  font-size: 0;
+  font-family: Alibaba-PuHuiTi-B;
+  font-weight: 700;
+  text-align: left;
+  white-space: nowrap;
+  line-height: 24px;
+  margin: 13px 0 61px 50px;
+}
+
+.text_57 {
+  width: 68px;
+  height: 18px;
+  overflow-wrap: break-word;
+  color: rgba(51, 51, 51, 1);
+  font-size: 22px;
+  font-family: Alibaba-PuHuiTi-B;
+  font-weight: 700;
+  text-align: left;
+  white-space: nowrap;
+  line-height: 24px;
+}
+
+.text_58 {
+  width: 68px;
+  height: 18px;
+  overflow-wrap: break-word;
+  color: rgba(51, 51, 51, 1);
+  font-size: 24px;
+  font-family: Alibaba-PuHuiTi-M;
+  font-weight: 500;
+  text-align: left;
+  white-space: nowrap;
+  line-height: 24px;
+}
+
+.text_59 {
+  width: 68px;
+  height: 18px;
+  overflow-wrap: break-word;
+  color: rgba(51, 51, 51, 1);
+  font-size: 16px;
+  font-family: PingFang-SC-Medium;
+  font-weight: 500;
+  text-align: left;
+  white-space: nowrap;
+  line-height: 24px;
+}
+
+.block_10 {
+  width: 10px;
+  height: 126px;
+  margin: 19px 0 0 26px;
+}
+
+.section_3 {
+  background-color: rgba(89, 212, 171, 1);
+  border-radius: 50%;
+  width: 10px;
+  height: 10px;
+}
+
+.section_4 {
+  background-color: rgba(115, 197, 235, 1);
+  border-radius: 50%;
+  width: 10px;
+  height: 10px;
+  margin-top: 33px;
+}
+
+.section_5 {
+  background-color: rgba(252, 166, 96, 1);
+  border-radius: 50%;
+  width: 10px;
+  height: 10px;
+  margin-top: 63px;
+}
+
+.text-wrapper_10 {
+  width: 80px;
+  height: 163px;
+  margin: 16px 0 0 14px;
+}
+
+.text_60 {
+  width: 63px;
+  height: 16px;
+  overflow-wrap: break-word;
+  color: rgba(51, 51, 51, 1);
+  font-size: 16px;
+  font-family: PingFang-SC-Medium;
+  font-weight: 500;
+  text-align: left;
+  white-space: nowrap;
+  line-height: 16px;
+  margin-left: 1px;
+}
+
+.text_61 {
+  width: 79px;
+  height: 16px;
+  overflow-wrap: break-word;
+  color: rgba(51, 51, 51, 1);
+  font-size: 16px;
+  font-family: PingFang-SC-Medium;
+  font-weight: 500;
+  text-align: left;
+  white-space: nowrap;
+  line-height: 16px;
+  margin: 27px 0 0 1px;
+}
+
+.text_62 {
+  width: 64px;
+  height: 16px;
+  overflow-wrap: break-word;
+  color: rgba(51, 51, 51, 1);
+  font-size: 16px;
+  font-family: PingFang-SC-Medium;
+  font-weight: 500;
+  text-align: left;
+  white-space: nowrap;
+  line-height: 16px;
+  margin-top: 15px;
+}
+
+.text_63 {
+  width: 63px;
+  height: 16px;
+  overflow-wrap: break-word;
+  color: rgba(51, 51, 51, 1);
+  font-size: 16px;
+  font-family: PingFang-SC-Medium;
+  font-weight: 500;
+  text-align: left;
+  white-space: nowrap;
+  line-height: 16px;
+  margin: 26px 0 0 1px;
+}
+
+.text_64 {
+  width: 63px;
+  height: 16px;
+  overflow-wrap: break-word;
+  color: rgba(51, 51, 51, 1);
+  font-size: 16px;
+  font-family: PingFang-SC-Medium;
+  font-weight: 500;
+  text-align: left;
+  white-space: nowrap;
+  line-height: 16px;
+  margin: 15px 0 0 1px;
+}
+
+.text-wrapper_11 {
+  width: 19px;
+  height: 158px;
+  margin: 19px 0 0 20px;
+}
+
+.text_65 {
+  width: 19px;
+  height: 11px;
+  overflow-wrap: break-word;
+  color: rgba(51, 51, 51, 1);
+  font-size: 16px;
+  font-family: Alibaba-PuHuiTi-B;
+  font-weight: 700;
+  text-align: left;
+  white-space: nowrap;
+  line-height: 11px;
+}
+
+.text_66 {
+  width: 19px;
+  height: 12px;
+  overflow-wrap: break-word;
+  color: rgba(51, 51, 51, 1);
+  font-size: 16px;
+  font-family: Alibaba-PuHuiTi-B;
+  font-weight: 700;
+  text-align: left;
+  white-space: nowrap;
+  line-height: 12px;
+  margin-top: 31px;
+}
+
+.text_67 {
+  width: 18px;
+  height: 13px;
+  overflow-wrap: break-word;
+  color: rgba(51, 51, 51, 1);
+  font-size: 16px;
+  font-family: Alibaba-PuHuiTi-B;
+  font-weight: 700;
+  text-align: left;
+  white-space: nowrap;
+  line-height: 13px;
+  margin: 19px 0 0 1px;
+}
+
+.text_68 {
+  width: 17px;
+  height: 13px;
+  overflow-wrap: break-word;
+  color: rgba(51, 51, 51, 1);
+  font-size: 16px;
+  font-family: Alibaba-PuHuiTi-B;
+  font-weight: 700;
+  text-align: left;
+  white-space: nowrap;
+  line-height: 13px;
+  margin: 29px 0 0 1px;
+}
+
+.text_69 {
+  width: 16px;
+  height: 12px;
+  overflow-wrap: break-word;
+  color: rgba(51, 51, 51, 1);
+  font-size: 16px;
+  font-family: Alibaba-PuHuiTi-B;
+  font-weight: 700;
+  text-align: left;
+  white-space: nowrap;
+  line-height: 12px;
+  margin: 18px 0 0 1px;
+}
+
+.block_11 {
+  width: 208px;
+  height: 13px;
+  margin: 20px 0 27px 14px;
+  position: absolute;
+  bottom: 0;
+}
+
+.section_6 {
+  background-color: rgba(89, 212, 171, 1);
+  width: 10px;
+  height: 10px;
+  margin-top: 1px;
+}
+
+.text_70 {
+  width: 42px;
+  height: 13px;
+  overflow-wrap: break-word;
+  color: rgba(51, 51, 51, 1);
+  font-size: 14px;
+  font-family: PingFang-SC-Medium;
+  font-weight: 500;
+  text-align: left;
+  white-space: nowrap;
+  line-height: 13px;
+  margin-left: 7px;
+}
+
+.section_7 {
+  background-color: rgba(115, 197, 235, 1);
+  width: 10px;
+  height: 10px;
+  margin: 1px 0 0 15px;
+}
+
+.text_71 {
+  width: 41px;
+  height: 13px;
+  overflow-wrap: break-word;
+  color: rgba(51, 51, 51, 1);
+  font-size: 14px;
+  font-family: PingFang-SC-Medium;
+  font-weight: 500;
+  text-align: left;
+  white-space: nowrap;
+  line-height: 13px;
+  margin-left: 8px;
+}
+
+.section_8 {
+  background-color: rgba(252, 166, 96, 1);
+  width: 10px;
+  height: 10px;
+  margin: 1px 0 0 16px;
+}
+
+.text_72 {
+  width: 42px;
+  height: 13px;
+  overflow-wrap: break-word;
+  color: rgba(51, 51, 51, 1);
+  font-size: 14px;
+  font-family: PingFang-SC-Medium;
+  font-weight: 500;
+  text-align: left;
+  white-space: nowrap;
+  line-height: 13px;
+  margin-left: 7px;
+}
+
+.box_9 {
+  width: 454px;
+  height: 668px;
+  margin-left: 12px;
+}
+
+.box_10 {
+  background-color: rgba(255, 255, 255, 1);
+  border-radius: 10px;
+  width: 454px;
+  height: 416px;
+}
+
+.box_11 {
+  width: 100%;
+  height: 59px;
+  justify-content: space-between;
+  // margin: 21px 0 0 25px;
+}
+
+.box_12 {
+  width: 123px;
+  height: 59px;
+}
+
+.text-wrapper_12 {
+  width: 123px;
+  height: 17px;
+}
+
+.text_73 {
+  width: 65px;
+  height: 16px;
+  overflow-wrap: break-word;
+  color: rgba(51, 51, 51, 1);
+  font-size: 16px;
+  font-family: PingFang-SC-Bold;
+  font-weight: 700;
+  text-align: center;
+  white-space: nowrap;
+  line-height: 26px;
+}
+
+.text_74 {
+  width: 30px;
+  height: 17px;
+  overflow-wrap: break-word;
+  color: rgba(51, 51, 51, 1);
+  font-size: 18px;
+  font-family: PingFang-SC-Bold;
+  font-weight: 700;
+  text-align: center;
+  white-space: nowrap;
+  line-height: 26px;
+}
+
+.text-wrapper_13 {
+  width: 122px;
+  height: 31px;
+  overflow-wrap: break-word;
+  font-size: 0;
+  font-family: Alibaba-PuHuiTi-B;
+  font-weight: 700;
+  text-align: center;
+  white-space: nowrap;
+  line-height: 26px;
+  margin: 11px 0 0 1px;
+}
+
+.text_75 {
+  width: 122px;
+  height: 31px;
+  overflow-wrap: break-word;
+  color: rgba(51, 51, 51, 1);
+  font-size: 40px;
+  font-family: Alibaba-PuHuiTi-B;
+  font-weight: 700;
+  text-align: left;
+  white-space: nowrap;
+  line-height: 26px;
+}
+
+.text_76 {
+  width: 122px;
+  height: 31px;
+  overflow-wrap: break-word;
+  color: rgba(51, 51, 51, 1);
+  font-size: 40px;
+  font-family: Alibaba-PuHuiTi-B;
+  font-weight: 700;
+  text-align: left;
+  white-space: nowrap;
+  line-height: 26px;
+}
+
+.text_77 {
+  width: 122px;
+  height: 31px;
+  overflow-wrap: break-word;
+  color: rgba(51, 51, 51, 1);
+  font-size: 40px;
+  font-family: Alibaba-PuHuiTi-B;
+  font-weight: 700;
+  text-align: left;
+  white-space: nowrap;
+  line-height: 26px;
+}
+
+.text-wrapper_14 {
+  width: 30px;
+  height: 38px;
+  margin-top: 13px;
+  // margin: 13px 0 0 184px;
+}
+
+.text_78 {
+  width: 26px;
+  height: 13px;
+  overflow-wrap: break-word;
+  color: rgba(51, 51, 51, 1);
+  font-size: 14px;
+  font-family: PingFang-SC-Medium;
+  font-weight: 500;
+  text-align: left;
+  white-space: nowrap;
+  line-height: 26px;
+}
+
+.text_79 {
+  width: 29px;
+  height: 13px;
+  overflow-wrap: break-word;
+  color: rgba(51, 51, 51, 1);
+  font-size: 14px;
+  font-family: PingFang-SC-Medium;
+  font-weight: 500;
+  text-align: left;
+  white-space: nowrap;
+  line-height: 26px;
+  margin: 12px 0 0 1px;
+}
+
+.label_7 {
+  width: 36px;
+  height: 38px;
+  margin: 13px 0 0 12px;
+}
+
+.text-wrapper_15 {
+  width: 391px;
+  height: 14px;
+  margin: 29px 0 0 32px;
+}
+
+.text_80 {
+  width: 41px;
+  height: 14px;
+  overflow-wrap: break-word;
+  color: rgba(170, 170, 170, 1);
+  font-size: 14px;
+  font-family: PingFang-SC-Medium;
+  font-weight: 500;
+  text-align: center;
+  white-space: nowrap;
+  line-height: 26px;
+}
+
+.text_81 {
+  width: 41px;
+  height: 14px;
+  overflow-wrap: break-word;
+  color: rgba(170, 170, 170, 1);
+  font-size: 14px;
+  font-family: PingFang-SC-Medium;
+  font-weight: 500;
+  text-align: center;
+  white-space: nowrap;
+  line-height: 26px;
+  margin-left: 18px;
+}
+
+.text_82 {
+  width: 41px;
+  height: 14px;
+  overflow-wrap: break-word;
+  color: rgba(170, 170, 170, 1);
+  font-size: 14px;
+  font-family: PingFang-SC-Medium;
+  font-weight: 500;
+  text-align: center;
+  white-space: nowrap;
+  line-height: 26px;
+  margin-left: 18px;
+}
+
+.text_83 {
+  width: 40px;
+  height: 14px;
+  overflow-wrap: break-word;
+  color: rgba(170, 170, 170, 1);
+  font-size: 14px;
+  font-family: PingFang-SC-Medium;
+  font-weight: 500;
+  text-align: center;
+  white-space: nowrap;
+  line-height: 26px;
+  margin-left: 17px;
+}
+
+.text_84 {
+  width: 41px;
+  height: 14px;
+  overflow-wrap: break-word;
+  color: rgba(170, 170, 170, 1);
+  font-size: 14px;
+  font-family: PingFang-SC-Medium;
+  font-weight: 500;
+  text-align: center;
+  white-space: nowrap;
+  line-height: 26px;
+  margin-left: 19px;
+}
+
+.text_85 {
+  width: 41px;
+  height: 14px;
+  overflow-wrap: break-word;
+  color: rgba(170, 170, 170, 1);
+  font-size: 14px;
+  font-family: PingFang-SC-Medium;
+  font-weight: 500;
+  text-align: center;
+  white-space: nowrap;
+  line-height: 26px;
+  margin-left: 17px;
+}
+
+.text_86 {
+  width: 39px;
+  height: 14px;
+  overflow-wrap: break-word;
+  color: rgba(170, 170, 170, 1);
+  font-size: 14px;
+  font-family: PingFang-SC-Medium;
+  font-weight: 500;
+  text-align: center;
+  white-space: nowrap;
+  line-height: 26px;
+  margin-left: 18px;
+}
+
+.box_13 {
+  width: 431px;
+  height: 31px;
+  margin: 20px 0 0 12px;
+}
+
+.thumbnail_25 {
+  width: 8px;
+  height: 12px;
+  margin-top: 10px;
+}
+
+.text_87 {
+  width: 13px;
+  height: 11px;
+  overflow-wrap: break-word;
+  color: rgba(51, 51, 51, 1);
+  font-size: 14px;
+  font-family: PingFang-SC-Medium;
+  font-weight: 500;
+  text-align: center;
+  white-space: nowrap;
+  line-height: 26px;
+  margin: 10px 0 0 23px;
+}
+
+.text_88 {
+  width: 15px;
+  height: 11px;
+  overflow-wrap: break-word;
+  color: rgba(51, 51, 51, 1);
+  font-size: 14px;
+  font-family: PingFang-SC-Medium;
+  font-weight: 500;
+  text-align: center;
+  white-space: nowrap;
+  line-height: 26px;
+  margin: 10px 0 0 46px;
+}
+
+.text-wrapper_16 {
+  height: 31px;
+  background: url(https://lanhu-oss-2537-2.lanhuapp.com/psj51mwd60ogrxhjjk6nh3da9ncnt0yrycq9e12ee7e-4335-48e6-b7b7-6fe63c92e06b)
+    100% no-repeat;
+  background-size: 100% 100%;
+  margin-left: 36px;
+  width: 31px;
+}
+
+.text_89 {
+  width: 16px;
+  height: 12px;
+  overflow-wrap: break-word;
+  color: rgba(255, 255, 255, 1);
+  font-size: 14px;
+  font-family: PingFang-SC-Heavy;
+  font-weight: 900;
+  text-align: center;
+  white-space: nowrap;
+  line-height: 26px;
+  margin: 10px 0 0 8px;
+}
+
+.text_90 {
+  width: 16px;
+  height: 11px;
+  overflow-wrap: break-word;
+  color: rgba(51, 51, 51, 1);
+  font-size: 14px;
+  font-family: PingFang-SC-Medium;
+  font-weight: 500;
+  text-align: center;
+  white-space: nowrap;
+  line-height: 26px;
+  margin: 10px 0 0 38px;
+}
+
+.text_91 {
+  width: 16px;
+  height: 12px;
+  overflow-wrap: break-word;
+  color: rgba(51, 51, 51, 1);
+  font-size: 14px;
+  font-family: PingFang-SC-Medium;
+  font-weight: 500;
+  text-align: center;
+  white-space: nowrap;
+  line-height: 26px;
+  margin: 10px 0 0 41px;
+}
+
+.text_92 {
+  width: 16px;
+  height: 12px;
+  overflow-wrap: break-word;
+  color: rgba(51, 51, 51, 1);
+  font-size: 14px;
+  font-family: PingFang-SC-Medium;
+  font-weight: 500;
+  text-align: center;
+  white-space: nowrap;
+  line-height: 26px;
+  margin: 10px 0 0 42px;
+}
+
+.text_93 {
+  width: 15px;
+  height: 11px;
+  overflow-wrap: break-word;
+  color: rgba(51, 51, 51, 1);
+  font-size: 14px;
+  font-family: PingFang-SC-Medium;
+  font-weight: 500;
+  text-align: center;
+  white-space: nowrap;
+  line-height: 26px;
+  margin: 10px 0 0 42px;
+}
+
+.thumbnail_26 {
+  width: 8px;
+  height: 12px;
+  margin: 10px 0 0 25px;
+}
+
+.box_14 {
+  background-color: rgba(255, 255, 255, 1);
+  border-radius: 5px 0px 0px 0px;
+  width: 100%;
+  height: 88px;
+  border: 2px solid rgba(238, 238, 238, 1);
+  margin: 30px 0 0 0;
+}
+
+.text-wrapper_17 {
+  width: 150px;
+  height: 44px;
+  margin: 22px 0 0 0;
+}
+
+.text_94 {
+  width: 150px;
+  height: 15px;
+  overflow-wrap: break-word;
+  color: rgba(170, 170, 170, 1);
+  font-size: 16px;
+  font-family: PingFang-SC-Medium;
+  font-weight: 500;
+  text-align: center;
+  white-space: nowrap;
+  line-height: 15px;
+}
+
+.text_95 {
+  width: 59px;
+  height: 16px;
+  overflow-wrap: break-word;
+  color: rgba(51, 51, 51, 1);
+  font-size: 16px;
+  font-family: PingFang-SC-Heavy;
+  font-weight: 900;
+  text-align: left;
+  white-space: nowrap;
+  line-height: 16px;
+  margin: 13px 0 0 1px;
+}
+
+.text-wrapper_18 {
+
+  // width: 84px;
+  // margin: 31px 0 0 121px;
+  display: flex;
+  align-items: center;
+}
+
+.text_96 {
+  // width: 56px;
+  // height: 14px;
+  background-color: rgba(255, 242, 233, 1);
+  border-radius: 4px;
+  // height: 26px;
+  border: 1px solid rgba(255, 102, 0, 1);
+  overflow-wrap: break-word;
+  color: rgba(255, 102, 0, 1);
+  font-size: 14px;
+  font-family: PingFang-SC-Medium;
+  font-weight: 500;
+  text-align: left;
+  white-space: nowrap;
+  line-height: 14px;
+  padding: 5px;
+  margin-right: 10px;
+  // margin: 6px 0 0 14px;
+}
+
+.thumbnail_27 {
+  width: 18px;
+  height: 14px;
+  // margin: 37px 20px 0 18px;
+}
+
+.box_15 {
+  box-shadow: 0px 2px 20px 0px rgba(187, 187, 187, 0.1);
+  background-color: rgba(255, 255, 255, 1);
+  border-radius: 5px 0px 0px 0px;
+  width: 430px;
+  height: 88px;
+  border: 2px solid rgba(238, 238, 238, 1);
+  margin: 14px 0 22px 12px;
+}
+
+.text-wrapper_19 {
+  width: 150px;
+  height: 44px;
+  margin: 22px 0 0 19px;
+}
+
+.text_97 {
+  width: 150px;
+  height: 15px;
+  overflow-wrap: break-word;
+  color: rgba(170, 170, 170, 1);
+  font-size: 16px;
+  font-family: PingFang-SC-Medium;
+  font-weight: 500;
+  text-align: center;
+  white-space: nowrap;
+  line-height: 26px;
+}
+
+.text_98 {
+  width: 59px;
+  height: 16px;
+  overflow-wrap: break-word;
+  color: rgba(51, 51, 51, 1);
+  font-size: 16px;
+  font-family: PingFang-SC-Heavy;
+  font-weight: 900;
+  text-align: left;
+  white-space: nowrap;
+  line-height: 26px;
+  margin: 13px 0 0 1px;
+}
+
+.text-wrapper_20 {
+  background-color: rgba(225, 242, 250, 1);
+  border-radius: 4px;
+  height: 26px;
+  border: 1px solid rgba(0, 159, 232, 1);
+  width: 84px;
+  margin: 31px 0 0 121px;
+}
+
+.text_99 {
+  width: 55px;
+  height: 14px;
+  overflow-wrap: break-word;
+  color: rgba(0, 159, 232, 1);
+  font-size: 14px;
+  font-family: PingFang-SC-Medium;
+  font-weight: 500;
+  text-align: left;
+  white-space: nowrap;
+  line-height: 26px;
+  margin: 6px 0 0 15px;
+}
+
+.thumbnail_28 {
+  width: 18px;
+  height: 14px;
+  margin: 37px 20px 0 18px;
+}
+
+.box_16 {
+  background-color: rgba(255, 255, 255, 1);
+  border-radius: 10px;
+  height: 232px;
+  margin-top: 12px;
+  width: 100%;
+}
+
+.section_9 {
+  // width: 429px;
+  height: 16px;
+  padding: 18px 13px 0 13px;
+}
+
+.image-text_5 {
+  width: 118px;
+  height: 16px;
+}
+
+.thumbnail_29 {
+  width: 18px;
+  height: 16px;
+}
+
+.text-group_5 {
+  width: 96px;
+  height: 16px;
+  overflow-wrap: break-word;
+  color: rgba(51, 51, 51, 1);
+  font-size: 16px;
+  font-family: PingFang-SC-Heavy;
+  font-weight: 900;
+  text-align: left;
+  white-space: nowrap;
+  line-height: 16px;
+  margin-left: 10px;
+}
+
+.text_100 {
+  width: 75px;
+  height: 14px;
+  overflow-wrap: break-word;
+  color: rgba(170, 170, 170, 1);
+  font-size: 14px;
+  font-family: PingFang-SC-Medium;
+  font-weight: 500;
+  text-align: left;
+  white-space: nowrap;
+  line-height: 14px;
+  margin-top: 2px;
+}
+
+.section_10 {
+  width: 100%;
+  height: 149px;
+  padding: 30px 0 37px 20px;
+}
+
+.image-text_6 {
+  width: 58px;
+  height: 149px;
+}
+
+.image_6 {
+  width: 58px;
+  height: 127px;
+}
+
+.text-group_6 {
+  width: 48px;
+  height: 15px;
+  overflow-wrap: break-word;
+  color: rgba(51, 51, 51, 1);
+  font-size: 16px;
+  font-family: PingFang-SC-Medium;
+  font-weight: 500;
+  text-align: left;
+  white-space: nowrap;
+  line-height: 15px;
+  margin: 7px 0 0 5px;
+}
+
+.image-text_7 {
+  width: 59px;
+  height: 149px;
+  margin-left: 28px;
+}
+
+.image_7 {
+  width: 59px;
+  height: 127px;
+}
+
+.text-group_7 {
+  width: 50px;
+  height: 15px;
+  overflow-wrap: break-word;
+  color: rgba(51, 51, 51, 1);
+  font-size: 16px;
+  font-family: PingFang-SC-Medium;
+  font-weight: 500;
+  text-align: left;
+  white-space: nowrap;
+  line-height: 15px;
+  margin: 7px 0 0 5px;
+}
+
+.box_17 {
+  width: 51px;
+  height: 143px;
+  margin: 6px 0 0 35px;
+}
+
+.group_13 {
+  box-shadow: 0px 0px 8px 0px rgba(50, 74, 67, 0.68);
+  background-color: rgba(133, 225, 194, 1);
+  border-radius: 24px;
+  height: 116px;
+  margin-left: 2px;
+  width: 48px;
+}
+
+.section_11 {
+  box-shadow: 0px 0px 10px 0px rgba(167, 167, 167, 0.78);
+  background-color: rgba(255, 255, 255, 1);
+  border-radius: 50%;
+  width: 36px;
+  height: 36px;
+  margin: 73px 0 0 6px;
+}
+
+.text_101 {
+  width: 51px;
+  height: 15px;
+  overflow-wrap: break-word;
+  color: rgba(51, 51, 51, 1);
+  font-size: 16px;
+  font-family: PingFang-SC-Medium;
+  font-weight: 500;
+  text-align: left;
+  white-space: nowrap;
+  line-height: 15px;
+  margin-top: 12px;
+}
+
+.box_18 {
+  width: 51px;
+  height: 143px;
+  margin: 6px 0 0 38px;
+}
+
+.box_19 {
+  box-shadow: 0px 0px 8px 0px rgba(50, 74, 67, 0.21);
+  background-color: rgba(238, 248, 245, 1);
+  border-radius: 24px;
+  height: 116px;
+  margin-left: 2px;
+  width: 48px;
+}
+
+.block_12 {
+  box-shadow: 0px 0px 10px 0px rgba(167, 167, 167, 0.78);
+  background-color: rgba(255, 255, 255, 1);
+  border-radius: 50%;
+  width: 36px;
+  height: 36px;
+  margin: 7px 0 0 6px;
+}
+
+.text_102 {
+  width: 51px;
+  height: 15px;
+  overflow-wrap: break-word;
+  color: rgba(51, 51, 51, 1);
+  font-size: 16px;
+  font-family: PingFang-SC-Medium;
+  font-weight: 500;
+  text-align: left;
+  white-space: nowrap;
+  line-height: 15px;
+  margin-top: 12px;
+}
+
+.box_20 {
+  width: 51px;
+  height: 143px;
+  margin: 6px 0 0 38px;
+}
+
+.group_14 {
+  box-shadow: 0px 0px 8px 0px rgba(50, 74, 67, 0.68);
+  background-color: rgba(133, 225, 194, 1);
+  border-radius: 24px;
+  height: 116px;
+  margin-left: 2px;
+  width: 48px;
+}
+
+.group_15 {
+  box-shadow: 0px 0px 10px 0px rgba(167, 167, 167, 0.78);
+  background-color: rgba(255, 255, 255, 1);
+  border-radius: 50%;
+  width: 36px;
+  height: 36px;
+  margin: 73px 0 0 6px;
+}
+
+.text_103 {
+  width: 51px;
+  height: 15px;
+  overflow-wrap: break-word;
+  color: rgba(51, 51, 51, 1);
+  font-size: 16px;
+  font-family: PingFang-SC-Medium;
+  font-weight: 500;
+  text-align: left;
+  white-space: nowrap;
+  line-height: 15px;
+  margin-top: 12px;
+}
+
+.text-wrapper_21 {
+  position: absolute;
+  left: 68px;
+  top: 111px;
+  width: 63px;
+  height: 555px;
+  overflow-wrap: break-word;
+  font-size: 0;
+  font-family: PingFang-SC-Heavy;
+  font-weight: 900;
+  text-align: left;
+  line-height: 60px;
+}
+
+.paragraph_2 {
+  width: 63px;
+  height: 555px;
+  overflow-wrap: break-word;
+  color: rgba(3, 191, 138, 1);
+  font-size: 16px;
+  font-family: PingFang-SC-Heavy;
+  font-weight: 900;
+  text-align: left;
+  line-height: 80px;
+}
+
+.paragraph_3 {
+  width: 63px;
+  height: 555px;
+  overflow-wrap: break-word;
+  color: rgba(75, 90, 109, 1);
+  font-size: 16px;
+  font-family: PingFang-SC-Medium;
+  font-weight: 500;
+  text-align: left;
+  line-height: 80px;
+}
+.timeall{
+    position: relative;
+    width: 100%;
+    margin-top: 40px;
+  }
+  .lastbt,.nextbt{
+    position: absolute;
+    top:18px;
+  }
+  .lastbt{
+    left: -7px;
+  }
+  .nextbt{
+    right: -7px;
+  }
+.table_header{ display:flex; justify-content: center; color:#8e8e8e;}
+.week_one{ text-align: center; line-height: 50px; border-bottom:1px solid #f5f4f7; border-left:1px solid #f5f4f7; background: #e9f0fe;  width:200px; }
+.weekday{ flex:1; text-align: center; line-height: 25px; }
+.finish {
+  // background:#8ACBAD;
+  background: linear-gradient(135deg, #04E399, #00A36A);
+  padding: 5px;
+  border-radius: 50%;
+  color:#fff !important;
+}
+
+
+</style>

+ 46 - 15
ruoyi-ui/src/views/login.vue

@@ -1,7 +1,8 @@
 <template>
-  <div class="login">
+  <div class="login shoue">
     <el-form ref="loginForm" :model="loginForm" :rules="loginRules" class="login-form">
-      <h3 class="title">{{title}}</h3>
+      <img src="../assets/images/pic_htgl_dl_logo.png" alt="" style="margin-left: 50%; transform: translateX(-50%);">
+      <h3 class="title">登录</h3>
       <el-form-item prop="username">
         <el-input
           v-model="loginForm.username"
@@ -37,27 +38,31 @@
           <img :src="codeUrl" @click="getCode" class="login-code-img"/>
         </div>
       </el-form-item>
-      <el-checkbox v-model="loginForm.rememberMe" style="margin:0px 0px 25px 0px;">记住密码</el-checkbox>
+      <div class="ingwe">
+        <el-checkbox v-model="loginForm.rememberMe" style="margin:0px 0px 0px 0px;color: #333;">记住密码</el-checkbox>
+        <div style="float: right;" v-if="register">
+          <router-link class="link-type" :to="'/register'" style="color: #03BF8A; font-size: 16px;">还没有账号?去注册</router-link>
+        </div>
+      </div>
+
       <el-form-item style="width:100%;">
         <el-button
           :loading="loading"
           size="medium"
           type="primary"
-          style="width:100%;"
+          style="width:100%;background-color: #03BF8A; border-color: #03BF8A;"
           @click.native.prevent="handleLogin"
         >
           <span v-if="!loading">登 录</span>
           <span v-else>登 录 中...</span>
         </el-button>
-        <div style="float: right;" v-if="register">
-          <router-link class="link-type" :to="'/register'">立即注册</router-link>
-        </div>
+
       </el-form-item>
     </el-form>
     <!--  底部  -->
-    <div class="el-login-footer">
+    <!-- <div class="el-login-footer">
       <span>Copyright © 2018-2025 ruoyi.vip All Rights Reserved.</span>
-    </div>
+    </div> -->
   </div>
 </template>
 
@@ -90,9 +95,9 @@ export default {
       },
       loading: false,
       // 验证码开关
-      captchaEnabled: true,
+      captchaEnabled: false,
       // 注册开关
-      register: false,
+      register: true,
       redirect: undefined
     }
   },
@@ -157,26 +162,52 @@ export default {
 </script>
 
 <style rel="stylesheet/scss" lang="scss">
+  .shoue .el-input input{
+    background:#f2f2f2;
+    border: 0;
+    color: #A7A7A7;
+  }
+  .ingwe{
+    display: flex;
+    justify-content: space-between;
+    align-items: center;
+    margin-bottom: 20px;
+    .el-checkbox__input.is-checked .el-checkbox__inner{
+      background-color:#03BF8A;
+      border-color:#03BF8A;
+    }
+    .el-checkbox__input.is-checked + .el-checkbox__label{
+      color:#03BF8A ;
+    }
+  }
 .login {
   display: flex;
   justify-content: center;
   align-items: center;
   height: 100%;
-  background-image: url("../assets/images/login-background.jpg");
+  background-image: url("../assets/images/pic_htgl_bg.png");
   background-size: cover;
+  position: relative;
 }
 .title {
-  margin: 0px auto 30px auto;
+  margin: 10px auto 20px auto;
   text-align: center;
   color: #707070;
+  font-family: PingFang SC;
+  font-weight: bold;
+  font-size: 24px;
+  color: #333333;
 }
 
 .login-form {
-  border-radius: 6px;
-  background: #ffffff;
+ background-image: url("../assets/images/pic_htgl_dlk_bg.png");
+ background-size: cover;
   width: 400px;
   padding: 25px 25px 5px 25px;
   z-index: 1;
+  position: absolute;
+  top:25.5%;
+  left: 17.5%;
   .el-input {
     height: 38px;
     input {

+ 357 - 0
ruoyi-ui/src/views/shipinggaoj/NetworkManage/index.vue

@@ -0,0 +1,357 @@
+<template>
+  <div class="app-container " >
+    <div style="background-color: #fff;padding: 20px;border-radius: 10px; padding-bottom: 0;">
+      <p
+        style="margin: 0; font-weight: 800;font-size: 16px;color: #343434;display: flex;align-items: center;margin-bottom: 20px;border-left: 6px solid #03BF8A;margin-left: -20px;">
+        <!-- <img src="../../../assets/images/icon_htgl_btzs.png" alt="" style="width: 16px;height: 20px;"> -->
+        <span style="margin-left: 10px;">搜索条件</span>
+      </p>
+      <div style="padding-bottom: 0;margin-bottom: 20px;">
+        <el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch"
+          label-width="68px">
+          <el-form-item label="网络名称" prop="networkName">
+            <el-input v-model="queryParams.networkName" placeholder="请输入网络名称" clearable
+              @keyup.enter.native="handleQuery" />
+          </el-form-item>
+          <el-form-item label="网卡名称" prop="networkCardName">
+            <el-input v-model="queryParams.networkCardName" placeholder="请输入网卡名称" clearable
+              @keyup.enter.native="handleQuery" />
+          </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>
+      </div>
+    </div>
+
+    <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="['manage:NetworkManage: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="['manage:NetworkManage: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="['manage:NetworkManage: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="['manage:NetworkManage:export']">导出</el-button>
+      </el-col>
+      <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
+    </el-row>
+
+    <el-table :height="tableMaxHeight" v-loading="loading" :data="NetworkManageList" @selection-change="handleSelectionChange">
+      <el-table-column type="selection" width="55" align="center" />
+      <el-table-column label="网络名称" align="center" prop="networkName" show-overflow-tooltip />
+      <el-table-column label="网卡名称" align="center" prop="networkCardName" show-overflow-tooltip />
+      <el-table-column label="网络地址" align="center" prop="networkIp" show-overflow-tooltip />
+      <el-table-column label="子网掩码" align="center" prop="subnetMask" show-overflow-tooltip />
+      <el-table-column label="默认网关" align="center" prop="defaultGateway" show-overflow-tooltip />
+      <el-table-column label="物理地址" align="center" prop="physicalAddress" show-overflow-tooltip />
+      <el-table-column label="分配方式" align="center" prop="allocationScheme" show-overflow-tooltip />
+      <el-table-column label="域名服务器" align="center" prop="domainNameServer" show-overflow-tooltip />
+      <!-- <el-table-column label="备注" align="center" prop="remark" /> -->
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+        <template slot-scope="scope">
+          <el-button size="mini" style="width: 42px;height: 26px;
+                                   background: #E5F9F3;
+                                          border-radius: 4px;border: 1px solid #03BF8A;color: #03BF8A;
+                                   " type="text" plain @click="handleUpdate(scope.row)"
+            v-hasPermi="['manage:NetworkManage:edit']">修改</el-button>
+          <el-button size="mini" type="text" style="width: 42px;height: 26px;background: #FFF1EA;
+                                         border-radius: 4px;border: 1px solid #FE570E;color: #FE570E;"
+            @click="handleDelete(scope.row)" v-hasPermi="['manage:NetworkManage: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="800px" append-to-body>
+      <el-form ref="form" :model="form" :rules="rules" label-width="100px">
+        <el-row>
+          <el-col :span="12">
+            <el-form-item label="网络名称" prop="networkName">
+              <el-input v-model="form.networkName" placeholder="请输入网络名称" />
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="网卡名称" prop="networkCardName">
+              <el-input v-model="form.networkCardName" placeholder="请输入网卡名称" />
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="网络地址" prop="networkIp">
+              <el-input v-model="form.networkIp" placeholder="请输入网络地址" />
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="子网掩码" prop="subnetMask">
+              <el-input v-model="form.subnetMask" placeholder="请输入子网掩码" />
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="默认网关" prop="defaultGateway">
+              <el-input v-model="form.defaultGateway" placeholder="请输入默认网关" />
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="物理地址" prop="physicalAddress">
+              <el-input v-model="form.physicalAddress" placeholder="请输入物理地址" />
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="分配方式" prop="allocationScheme">
+              <el-input v-model="form.allocationScheme" placeholder="请输入分配方式" />
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="域名服务器" prop="domainNameServer">
+              <el-input v-model="form.domainNameServer" placeholder="请输入域名服务器 DNS" />
+            </el-form-item>
+          </el-col>
+          <el-col :span="24">
+            <el-form-item label="备注" prop="remark">
+              <el-input v-model="form.remark" type="textarea" placeholder="请输入内容" />
+            </el-form-item>
+          </el-col>
+        </el-row>
+
+
+
+
+
+
+
+
+        <!-- <el-form-item label="删除标志" prop="delFlag">
+          <el-input v-model="form.delFlag" placeholder="请输入删除标志" />
+        </el-form-item> -->
+
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button style="background-color:#03BF8A ; border-color: #03BF8A;" type="primary" @click="submitForm">确 定</el-button>
+               <el-button style="background-color:#DDEBE7 ; border-color: #DDEBE7; color: #475669;" @click="cancel">取 消</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+  import {
+    listNetworkManage,
+    getNetworkManage,
+    delNetworkManage,
+    addNetworkManage,
+    updateNetworkManage
+  } from "@/api/manage/NetworkManage"
+
+  export default {
+    name: "NetworkManage",
+    data() {
+      return {
+        // 遮罩层
+        loading: true,
+        // 选中数组
+        ids: [],
+        // 非单个禁用
+        single: true,
+        // 非多个禁用
+        multiple: true,
+        // 显示搜索条件
+        showSearch: true,
+        // 总条数
+        total: 0,
+        // 网络管理表格数据
+        NetworkManageList: [],
+        // 弹出层标题
+        title: "",
+        // 是否显示弹出层
+        open: false,
+        // 查询参数
+        queryParams: {
+          pageNum: 1,
+          pageSize: 10,
+          networkName: null,
+          networkCardName: null,
+          networkIp: null,
+          subnetMask: null,
+          defaultGateway: null,
+          physicalAddress: null,
+          allocationScheme: null,
+          domainNameServer: null,
+        },
+        // 表单参数
+        form: {},
+        // 表单校验
+        rules: {
+          networkName: [{
+            required: true,
+            message: "不能为空",
+            trigger: "blur"
+          }],
+        },
+          tableMaxHeight:'200',
+      }
+    },
+    created() {
+      this.getList()
+   window.onresize = () => {
+     	      this.changeTableMaxHeight()
+     	    }
+     	    this.changeTableMaxHeight()
+   },
+   mounted() {
+   	window.onresize = () => {
+   	          this.changeTableMaxHeight()
+   	        }
+   	        this.changeTableMaxHeight()
+   },
+    methods: {
+      /** 查询网络管理列表 */
+      getList() {
+        this.loading = true
+        listNetworkManage(this.queryParams).then(response => {
+          this.NetworkManageList = response.rows
+          this.total = response.total
+          this.loading = false
+        })
+      },
+      // 取消按钮
+      cancel() {
+        this.open = false
+        this.reset()
+      },
+      // 表单重置
+      reset() {
+        this.form = {
+          networkId: null,
+          networkName: null,
+          networkCardName: null,
+          networkIp: null,
+          subnetMask: null,
+          defaultGateway: null,
+          physicalAddress: null,
+          allocationScheme: null,
+          domainNameServer: null,
+          delFlag: null,
+          createBy: null,
+          createTime: null,
+          updateBy: null,
+          updateTime: null,
+          remark: 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.networkId)
+        this.single = selection.length !== 1
+        this.multiple = !selection.length
+      },
+      /** 新增按钮操作 */
+      handleAdd() {
+        this.reset()
+        this.open = true
+        this.title = "添加网络管理"
+      },
+      /** 修改按钮操作 */
+      handleUpdate(row) {
+        this.reset()
+        const networkId = row.networkId || this.ids
+        getNetworkManage(networkId).then(response => {
+          this.form = response.data
+          this.open = true
+          this.title = "修改网络管理"
+        })
+      },
+      /** 提交按钮 */
+      submitForm() {
+        this.$refs["form"].validate(valid => {
+          if (valid) {
+            if (this.form.networkId != null) {
+              updateNetworkManage(this.form).then(response => {
+                this.$modal.msgSuccess("修改成功")
+                this.open = false
+                this.getList()
+              })
+            } else {
+              addNetworkManage(this.form).then(response => {
+                this.$modal.msgSuccess("新增成功")
+                this.open = false
+                this.getList()
+              })
+            }
+          }
+        })
+      },
+      /** 删除按钮操作 */
+      handleDelete(row) {
+        const networkIds = row.networkId || this.ids
+        this.$modal.confirm('是否确认删除网络管理数据项?').then(function() {
+          return delNetworkManage(networkIds)
+        }).then(() => {
+          this.getList()
+          this.$modal.msgSuccess("删除成功")
+        }).catch(() => {})
+      },
+      /** 导出按钮操作 */
+      handleExport() {
+        this.download('manage/NetworkManage/export', {
+          ...this.queryParams
+        }, `NetworkManage_${new Date().getTime()}.xlsx`)
+      },
+      // 获取屏幕高度
+          showFilterForm () {
+                this.filterActive = !this.filterActive
+                this.changeTableMaxHeight()
+              },
+
+              changeTableMaxHeight () {
+                let height = document.body.offsetHeight // 网页可视区域高度
+
+                // if (this.filterActive) {
+                //   this.tableMaxHeight = height - 320
+                // } else {
+                  5
+                  this.tableMaxHeight = height - 250
+                // }
+                console.log(height,this.tableMaxHeight)
+              }
+    }
+  }
+</script>
+<style>
+  .el-table .el-table__header-wrapper th,
+  .el-table .el-table__fixed-header-wrapper th {
+    background-color: #F5F6F8;
+  }
+
+  .el-checkbox__input.is-checked .el-checkbox__inner {
+    background-color: #03BF8A;
+    border-color: #03BF8A;
+  }
+
+  .el-checkbox__input.is-indeterminate .el-checkbox__inner {
+    background-color: #03BF8A;
+    border-color: #03BF8A;
+  }
+</style>

+ 359 - 0
ruoyi-ui/src/views/shipinggaoj/channelNumber/index.vue

@@ -0,0 +1,359 @@
+<template>
+  <div class="app-container " >
+    <div style="background-color: #fff;padding: 20px;border-radius: 10px; padding-bottom: 0;">
+                  <p style="margin: 0; font-weight: 800;font-size: 16px;color: #343434;display: flex;align-items: center;margin-bottom: 20px;border-left: 6px solid #03BF8A;margin-left: -20px;">
+                    <!-- <img src="../../../assets/images/icon_htgl_btzs.png" alt="" style="width: 16px;height: 20px;"> -->
+                   <span style="margin-left: 10px;">搜索条件</span>
+                  </p>
+                  <div style="padding-bottom: 0;margin-bottom: 20px;">
+    <el-form  class="qucheu" :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="88px">
+      <el-form-item label="通道编号" prop="channelNum">
+        <el-input
+          v-model="queryParams.channelNum"
+          placeholder="请输入通道编号"
+          clearable
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="视频地址" prop="videoAddress">
+        <el-input
+          v-model="queryParams.videoAddress"
+          placeholder="请输入视频地址"
+          clearable
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item style="border: 0;">
+         <el-button style="background-color: #03BF8A; border-color: #03BF8A;" type="primary" size="mini"  @click="handleQuery">查询 </el-button>
+        <el-button  size="mini" @click="resetQuery">重置</el-button>
+      </el-form-item>
+    </el-form>
+    </div>
+    </div>
+
+    <el-row :gutter="10" class="mb8">
+      <el-col :span="1.5">
+        <el-button
+          type="success"
+          plain
+          size="mini"
+          @click="handleAdd"
+          v-hasPermi="['system:channelNumber: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:channelNumber:edit']"
+        >修改</el-button>
+      </el-col> -->
+      <el-col :span="1.5">
+        <el-button
+          type="danger"
+          plain
+          size="mini"
+          :disabled="multiple"
+          @click="handleDelete"
+          v-hasPermi="['system:channelNumber:remove']"
+        >删除</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="warning"
+          plain
+          size="mini"
+          @click="handleExport"
+          v-hasPermi="['system:channelNumber:export']"
+        >导出</el-button>
+      </el-col>
+      <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
+    </el-row>
+
+
+    <el-table  :height="tableMaxHeight" v-loading="loading" :data="channelNumberList" @selection-change="handleSelectionChange">
+      <el-table-column type="selection" width="55" align="center" />
+      <!-- <el-table-column label="通道ID" align="center" prop="channelId" /> -->
+      <el-table-column label="通道编号" align="center" prop="channelNum" />
+      <el-table-column label="视频地址" align="center" prop="videoAddress" />
+      <el-table-column label="通道描述" align="center" prop="channelDetails" />
+      <el-table-column label="探测协议类型" align="center" prop="protocolType">
+              <template slot-scope="scope">
+                <dict-tag :options="dict.type.probing_protocol" :value="scope.row.protocolType"/>
+              </template>
+            </el-table-column>
+      <!-- <el-table-column label="备注" align="center" prop="remark" /> -->
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+        <template slot-scope="scope">
+          <el-button
+             size="mini"
+                        style="width: 42px;height: 26px;
+                        background: #E5F9F3;
+                               border-radius: 4px;border: 1px solid #03BF8A;color: #03BF8A;
+                        "
+                       type="text"
+                       plain
+            @click="handleUpdate(scope.row)"
+            v-hasPermi="['system:channelNumber:edit']"
+          >修改</el-button>
+          <el-button
+            size="mini"
+                       type="text"
+                       style="width: 42px;height: 26px;background: #FFF1EA;
+                              border-radius: 4px;border: 1px solid #FE570E;color: #FE570E;"
+            @click="handleDelete(scope.row)"
+            v-hasPermi="['system:channelNumber: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="channelNum">
+          <el-input v-model="form.channelNum" placeholder="请输入通道编号" />
+        </el-form-item>
+        <el-form-item label="视频地址" prop="videoAddress">
+          <el-input v-model="form.videoAddress" placeholder="请输入视频地址" />
+        </el-form-item>
+        <el-form-item label="探测协议类型" prop="protocolType">
+                  <el-select v-model="form.protocolType" placeholder="请选择探测协议类型">
+                    <el-option
+                      v-for="dict in dict.type.probing_protocol"
+                      :key="dict.value"
+                      :label="dict.label"
+                      :value="dict.value"
+                    ></el-option>
+                  </el-select>
+                </el-form-item>
+        <el-form-item label="通道描述" prop="channelDetails">
+          <el-input v-model="form.channelDetails" type="textarea" placeholder="请输入内容" />
+        </el-form-item>
+       <!-- <el-form-item label="删除标志" prop="delFlag">
+          <el-input v-model="form.delFlag" placeholder="请输入删除标志" />
+        </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 style="background-color:#03BF8A ; border-color: #03BF8A;" type="primary" @click="submitForm">确 定</el-button>
+        <el-button style="background-color:#DDEBE7 ; border-color: #DDEBE7; color: #475669;" @click="cancel">取 消</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import { listChannelNumber, getChannelNumber, delChannelNumber, addChannelNumber, updateChannelNumber } from "@/api/system/channelNumber"
+
+export default {
+  name: "ChannelNumber",
+  dicts: ['probing_protocol'],
+  data() {
+    return {
+      // 遮罩层
+      loading: true,
+      // 选中数组
+      ids: [],
+      // 非单个禁用
+      single: true,
+      // 非多个禁用
+      multiple: true,
+      // 显示搜索条件
+      showSearch: true,
+      // 总条数
+      total: 0,
+      // 通道管理表格数据
+      channelNumberList: [],
+      // 弹出层标题
+      title: "",
+      // 是否显示弹出层
+      open: false,
+      // 查询参数
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        channelNum: null,
+        videoAddress: null,
+        protocolType: null,
+        channelDetails: null,
+      },
+      // 表单参数
+      form: {},
+      // 表单校验
+      rules: {
+        channelNum: [
+                  { required: true, message: "不能为空", trigger: "blur" }
+                ],
+      },
+       tableMaxHeight:'200',
+    }
+  },
+  created() {
+    this.getList()
+    window.onresize = () => {
+    	      this.changeTableMaxHeight()
+    	    }
+    	    this.changeTableMaxHeight()
+  },
+  mounted() {
+  	window.onresize = () => {
+  	          this.changeTableMaxHeight()
+  	        }
+  	        this.changeTableMaxHeight()
+  },
+  methods: {
+    /** 查询通道管理列表 */
+    getList() {
+      this.loading = true
+      listChannelNumber(this.queryParams).then(response => {
+        this.channelNumberList = response.rows
+        this.total = response.total
+        this.loading = false
+      })
+    },
+    // 取消按钮
+    cancel() {
+      this.open = false
+      this.reset()
+    },
+    // 表单重置
+    reset() {
+      this.form = {
+        channelId: null,
+        channelNum: null,
+        videoAddress: null,
+        protocolType: null,
+        channelDetails: null,
+        delFlag: null,
+        createBy: null,
+        createTime: null,
+        updateBy: null,
+        updateTime: null,
+        remark: 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.channelId)
+      this.single = selection.length!==1
+      this.multiple = !selection.length
+    },
+    /** 新增按钮操作 */
+    handleAdd() {
+      this.reset()
+      this.open = true
+      this.title = "添加通道管理"
+    },
+    /** 修改按钮操作 */
+    handleUpdate(row) {
+      this.reset()
+      const channelId = row.channelId || this.ids
+      getChannelNumber(channelId).then(response => {
+        this.form = response.data
+        this.open = true
+        this.title = "修改通道管理"
+      })
+    },
+    /** 提交按钮 */
+    submitForm() {
+      this.$refs["form"].validate(valid => {
+        if (valid) {
+          if (this.form.channelId != null) {
+            updateChannelNumber(this.form).then(response => {
+              this.$modal.msgSuccess("修改成功")
+              this.open = false
+              this.getList()
+            })
+          } else {
+            addChannelNumber(this.form).then(response => {
+              this.$modal.msgSuccess("新增成功")
+              this.open = false
+              this.getList()
+            })
+          }
+        }
+      })
+    },
+    /** 删除按钮操作 */
+    handleDelete(row) {
+      const channelIds = row.channelId || this.ids
+      this.$modal.confirm('是否确认删除通道管理数据项?').then(function() {
+        return delChannelNumber(channelIds)
+      }).then(() => {
+        this.getList()
+        this.$modal.msgSuccess("删除成功")
+      }).catch(() => {})
+    },
+    /** 导出按钮操作 */
+    handleExport() {
+      this.download('system/channelNumber/export', {
+        ...this.queryParams
+      }, `channelNumber_${new Date().getTime()}.xlsx`)
+    },
+    // 获取屏幕高度
+        showFilterForm () {
+              this.filterActive = !this.filterActive
+              this.changeTableMaxHeight()
+            },
+
+            changeTableMaxHeight () {
+              let height = document.body.offsetHeight // 网页可视区域高度
+              // if (this.filterActive) {
+              //   this.tableMaxHeight = height - 320
+              // } else {
+                this.tableMaxHeight = height - 250
+              // }
+              console.log(height)
+            }
+  }
+}
+</script>
+<style lang="scss">
+  .el-table .el-table__header-wrapper th, .el-table .el-table__fixed-header-wrapper th{
+    background-color:#F5F6F8;
+  }
+  .el-checkbox__input.is-checked .el-checkbox__inner{
+    background-color: #03BF8A;
+    border-color: #03BF8A;
+  }
+  .el-checkbox__input.is-indeterminate .el-checkbox__inner{
+    background-color: #03BF8A;
+    border-color: #03BF8A;
+  }
+  .qucheu{
+    .el-form-item--small.el-form-item{
+      border: 1px  solid #E6E6E6;
+    }
+    .el-input__inner{
+      border:0;
+    }
+  }
+
+
+</style>

+ 734 - 0
ruoyi-ui/src/views/shipinggaoj/gaojingguanli/index.vue

@@ -0,0 +1,734 @@
+<template>
+  <div class="app-container">
+    <div style="">
+      <div style="background-color: #fff;padding: 20px;border-radius: 10px; padding-bottom: 0;">
+        <p style="margin: 0; font-weight: 800;font-size: 16px;color: #343434;display: flex;align-items: center;margin-bottom: 20px;border-left: 6px solid #03BF8A;margin-left: -20px;">
+          <!-- <img src="../../../assets/images/icon_htgl_btzs.png" alt="" style="width: 16px;height: 20px;"> -->
+         <span style="margin-left: 10px;">搜索条件</span>
+        </p>
+        <div style="padding-bottom: 0;margin-bottom: 20px;">
+          <el-form class="qucheu" :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="88px">
+            <el-row>
+
+              <el-col :span="24">
+                <el-col :span="8">
+                  <el-form-item label="告警类别" prop="warnType">
+                          <el-select v-model="queryParams.warnType" placeholder="请选择告警类别" clearable>
+                            <el-option
+                              v-for="dict in dict.type.gaojing_type"
+                              :key="dict.value"
+                              :label="dict.label"
+                              :value="dict.value"
+                            />
+                          </el-select>
+                        </el-form-item>
+                </el-col>
+                <el-col :span="8">
+                 <el-form-item label="上报状态" prop="reportStatus">
+                         <el-select v-model="queryParams.reportStatus" placeholder="请选择上报状态" clearable>
+                           <el-option
+                             v-for="dict in dict.type.shagnt"
+                             :key="dict.value"
+                             :label="dict.label"
+                             :value="dict.value"
+                           />
+                         </el-select>
+                       </el-form-item>
+                </el-col>
+                <el-col :span="8">
+                 <el-form-item label="通道ID" prop="channelId">
+                         <el-input
+                           v-model="queryParams.channelId"
+                           placeholder="请输入通道ID"
+                           clearable
+                           @keyup.enter.native="handleQuery"
+                         />
+                       </el-form-item>
+                </el-col>
+
+              </el-col>
+              <el-col :span="12">
+                <el-form-item label="告警时间" prop="warnTime">
+                        <el-date-picker clearable
+                          v-model="queryParams.warnTime"
+                          type="date"
+                          value-format="yyyy-MM-dd"
+                          placeholder="请选择告警时间">
+                        </el-date-picker>
+                      </el-form-item>
+              </el-col>
+              <el-col :span="5">
+                <el-form-item class="butt" style="border: 0;">
+                  <el-button style="background-color: #03BF8A; border-color: #03BF8A;" type="primary" size="mini"  @click="handleQuery">查询 </el-button>
+                  <el-button size="mini"  @click="resetQuery">重置</el-button>
+                </el-form-item>
+              </el-col>
+            </el-row>
+
+          </el-form>
+        </div>
+      </div>
+
+
+      <div class="casr">
+
+              <el-row :gutter="10" class="mb8">
+                <el-col :span="1.5">
+                  <el-button
+                    type="success"
+                    plain
+                    size="mini"
+                    @click="handleAdd"
+                    v-hasPermi="['manage:warnManage:add']"
+                  >添加</el-button>
+                </el-col>
+                <!-- <el-col :span="1.5">
+                  <el-button
+                    type="success"
+                    plain
+                    size="mini"
+                    :disabled="singleg"
+                    @click="handleUpdateg"
+                    v-hasPermi="['wuYe:manual:edits']"
+                  >修改</el-button>
+                </el-col> -->
+                <el-col :span="1.5">
+                  <el-button
+                    type="danger"
+                    plain
+                    size="mini"
+                    @click="handleDeleteg"
+                    v-hasPermi="['manage:warnManage:remove']"
+                  >删除</el-button>
+                </el-col>
+                <el-col :span="1.5">
+                  <el-button
+                    type="warning"
+                    plain
+                    size="mini"
+                    @click="handleExport"
+                    v-hasPermi="['manage:warnManage:export']"
+                  >导出</el-button>
+                </el-col>
+                <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
+              </el-row>
+              <div class=" infinite-list" :style="dynamicStyle">
+                <el-row :gutter="10" v-if="warnManageList.length !=0" style="width: 100%;margin-left: 0;">
+                  <el-col :span="6" v-for="(item,index) in warnManageList" :key="index" style="cursor: pointer;">
+                    <div v-if="isshoe" @click="isac(item)" :class=" item.isnum ==true ? 'ingwe' :'' " style="position: relative; background-color: #fff;box-shadow: 0px 0px 10px 0px #CDCDCD;border-radius: 10px;margin-bottom: 10px;height: 370px;">
+                      <div class="quning">
+                        <div class="shipige">
+                          <div style="display: flex;align-items: center;">
+                            <img src="../../../assets/images/icon_gjgl_gx_normal.png" alt="" v-if="item.isnum == false">
+                            <img src="../../../assets/images/icon_gjgl_gx_selected.png" alt="" v-if="item.isnum == true">
+                            <p style="font-size: 14px;color: #333;font-weight: 700; margin-left: 5px;">告警任务2</p>
+                          </div>
+                          <p style="font-size: 14px; color: #aaa;font-weight: 500;">详情→</p>
+                        </div>
+                        <image-preview :src="item.warnImage" :width="100 +'%'" :height="150"  style=""/>
+
+                       <!-- <video
+                                 :id="'myVideo' + (index+1)"
+                                 data-setup="{}"
+                                 loop="loop"
+                                 :autoplay="false"
+                                 muted
+                                 controls
+                                 @play="videoPlay(item)"
+                                 poster=""
+                                 style="width: 100%;height: 150px;"
+                               >
+                               <!-- + baseUrl -->
+                                 <!-- <source  :src="defaultSettings.urls+ item.videoUrl " />
+                               </video> -->
+                      </div>
+                      <div class="goe">
+                        <div style="display: flex;align-items: center;margin-top: 8px;">
+                          <p>视频通道:</p>
+                          <p>{{item.channelId == null?'暂无数据' : item.channelId}}</p>
+                        </div>
+                        <div style="display: flex;align-items: center;margin-top: 8px;">
+                          <p>告警日期:</p>
+                          <p>{{item.warnTime == null?'暂无数据' : item.warnTime}}</p>
+                        </div>
+                        <div style="display: flex;align-items: center;margin-top: 8px;">
+                          <p>上报地址:</p>
+                          <p>{{item.reportAddress == null?'暂无数据' : item.reportAddress}}</p>
+                        </div>
+                        <div style="display: flex;align-items: center;margin-top: 8px;">
+                          <p>上报状态:</p>
+                          <div><dict-tag :options="dict.type.shagnt" :value="item.reportStatus"/></div>
+                        </div>
+                        <div style="display: flex;align-items: center;margin-top: 8px;">
+                          <p>告警内容:</p>
+                          <div><dict-tag :options="dict.type.gaojing_type" :value="item.warnType"/></div>
+                        </div>
+
+
+                      </div>
+                      <!-- <img v-if="item.isnum == true" src="../../../assets/images/icon_htgl_kp_gx.png" alt="" style="width: 35px;height: 35px;position: absolute;bottom: 0;right: 0;"> -->
+                    </div>
+                  </el-col>
+                </el-row>
+                <div style="margin-top: 20px;display: flex;justify-content: center;align-items: center;" v-if="warnManageList.length ==0">
+                   <img   src="../../../assets/images/zwshjbig.png" alt="" style="">
+                </div>
+              </div>
+      </div>
+
+
+      <paginations
+        v-show="total>0"
+        :total="total"
+        :page.sync="queryParams.pageNum"
+        :limit.sync="queryParams.pageSize"
+        @pagination="getList"
+      />
+    </div>
+
+    <!-- 添加或修改岗位对话框 -->
+    <el-dialog :title="title" :visible.sync="open" width="800px" append-to-body>
+      <el-form ref="form" :model="form" :rules="rules" label-width="120px">
+        <el-row>
+          <el-col :span="12">
+           <el-form-item label="告警类别" prop="warnType">
+                     <el-select style="width: 100%;" v-model="form.warnType" placeholder="请选择告警类别">
+                       <el-option
+                         v-for="dict in dict.type.gaojing_type"
+                         :key="dict.value"
+                         :label="dict.label"
+                         :value="dict.value"
+                       ></el-option>
+                     </el-select>
+                   </el-form-item>
+          </el-col>
+
+          <el-col :span="12" >
+           <el-form-item label="告警标识" prop="warnSign">
+                     <el-input v-model="form.warnSign" placeholder="请输入告警标识" />
+                   </el-form-item>
+          </el-col>
+
+          <el-col :span="12" >
+           <el-form-item label="通道Id" prop="channelId">
+                          <el-select style="width: 100%;" v-model="form.channelId" placeholder="请选择通道ID">
+                             <el-option
+                             v-for="dict in channelNumberList "
+                             :key="dict.channelId"
+                             :label="dict.channelNum"
+                             :value="dict.channelId"
+                             ></el-option>
+                           </el-select>
+                       </el-form-item>
+          </el-col>
+          <el-col :span="12" >
+            <el-form-item label="视频地址" prop="videoAddress">
+                      <el-input v-model="form.videoAddress" placeholder="请输入视频地址" />
+                    </el-form-item>
+          </el-col>
+          <el-col :span="12" >
+            <el-form-item label="上报地址" prop="reportAddress">
+                      <el-input v-model="form.reportAddress" placeholder="请输入上报地址" />
+                    </el-form-item>
+          </el-col>
+          <el-col :span="12" >
+           <el-form-item label="上报状态" prop="reportStatus">
+                     <el-select style="width: 100%;" v-model="form.reportStatus" placeholder="请选择上报状态">
+                       <el-option
+                         v-for="dict in dict.type.shagnt"
+                         :key="dict.value"
+                         :label="dict.label"
+                         :value="dict.value"
+                       ></el-option>
+                     </el-select>
+                   </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="告警时间" prop="warnTime">
+                      <el-date-picker style="width: 100%;" clearable
+                        v-model="form.warnTime"
+                        type="date"
+                        value-format="yyyy-MM-dd"
+                        placeholder="请选择告警时间">
+                      </el-date-picker>
+                    </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="备注" prop="remark">
+                      <el-input v-model="form.remark"  placeholder="请输入内容" />
+                    </el-form-item>
+          </el-col>
+          <el-col :span="24">
+            <el-form-item label="告警预览图片" prop="warnImage">
+                      <image-upload v-model="form.warnImage"/>
+                    </el-form-item>
+          </el-col>
+        </el-row>
+      </el-form>
+      <div slot="footer" class="dialog-footer" v-if="isredw">
+        <el-button type="primary" @click="submitForm">确 定</el-button>
+        <el-button @click="cancel">取 消</el-button>
+      </div>
+    </el-dialog>
+
+
+
+  </div>
+</template>
+
+<script>
+  // import { listNotice, getNotice, delNotice, addNotice, updateNotice } from "@/api/system/notice"
+import { listWarnManage, getWarnManage, delWarnManage, addWarnManage, updateWarnManage } from "@/api/manage/warnManage"
+// import 'videojs-flash'
+import { listChannelNumber, getChannelNumber, delChannelNumber, addChannelNumber, updateChannelNumber } from "@/api/system/channelNumber"
+const defaultSettings = require("@/settings.js");
+export default {
+  name: "WarnManage",
+  dicts: ['gaojing_type', 'source_type','alarm_task','shagnt'],
+  data() {
+    return {
+      // 遮罩层
+      loading: true,
+      defaultSettings:defaultSettings,
+      baseUrl: process.env.VUE_APP_BASE_API,
+      // 选中数组
+            ids: [],
+            // 非单个禁用
+            single: true,
+            // 非多个禁用
+            multiple: true,
+            // 显示搜索条件
+            showSearch: true,
+            // 总条数
+            total: 0,
+            // 告警管理表格数据
+            warnManageList: [],
+             channelNumberList:[],
+            // 弹出层标题
+            title: "",
+            // 是否显示弹出层
+            open: false,
+            // 查询参数
+            queryParams: {
+              pageNum: 1,
+              pageSize: 10,
+              warnType: null,
+              warnSign: null,
+              channelId: null,
+              videoAddress: null,
+              reportAddress: null,
+              reportStatus: null,
+              warnTime: null,
+              warnImage: null,
+            },
+            // 表单参数
+            form: {},
+            // 表单校验
+            rules: {
+              videoAddress: [
+                        { required: true, message: "不能为空", trigger: "blur" }
+                      ],
+              warnTime: [
+                        { required: true, message: "不能为空", trigger: "blur" }
+                      ],
+              warnImage: [
+                        { required: true, message: "不能为空", trigger: "blur" }
+                      ],
+            },
+      activeName:'1',
+      videoState: false, // 视频播放状态
+      poster:true,
+      controls:true,
+      videoData:{},
+       player: null,
+       isshoe:true,
+       isredw:true,
+       singleg:true,
+       manid:0,
+       getreadList:[],
+       startTime: 0,
+       yutim:true,
+       staffTrainTimeList:[],
+       tableMaxHeight:'200',
+      };
+    },
+    computed: {
+      dynamicStyle() {
+        return {
+          overflowY:'auto',
+          height: this.tableMaxHeight+ 'px',
+           paddingTop:'10px'
+        }
+      }
+      },
+  created() {
+    this.startTime = Date.now()
+    this.getList();
+    this.getListt()
+  window.onresize = () => {
+  	      this.changeTableMaxHeight()
+  	    }
+  	    this.changeTableMaxHeight()
+  },
+  mounted() {
+  	window.onresize = () => {
+  	          this.changeTableMaxHeight()
+  	        }
+  	        this.changeTableMaxHeight()
+  },
+
+
+  beforeDestroy() {
+      if (this.player) {
+        this.player.dispose()
+      }
+    },
+  methods: {
+    convertMillisecondsToMinutes(milliseconds) {
+        if (milliseconds) {
+          var minutes = Math.floor(milliseconds / 60000);
+          if(minutes == 0){
+            minutes = 0
+          }
+          // console.log(minutes)
+          // this.minToHm(minutes)
+          return minutes;
+        }
+      },
+       minToHm(min) {
+          let h = Math.floor(min / 60);
+          let m = min % 60;
+          let hDisplay = h ? `${h}小时` : '';
+          let mDisplay = m ? `${m}分钟` : '';
+          console.log(`${hDisplay}${mDisplay}`.trim())
+          return `${hDisplay}${mDisplay}`.trim();
+        },
+    /** 查询岗位列表 */
+    getList() {
+      this.loading = true;
+      this.isshoe = false
+      listWarnManage(this.queryParams).then(response => {
+        this.warnManageList   = response.rows;
+        this.warnManageList.filter(rou=>{
+          rou.isnum = false
+        })
+        this.isshoe = true
+
+        this.total = response.total;
+        this.loading = false;
+      });
+    },
+    /** 查询通道管理列表 */
+    getListt() {
+      this.loading = true
+      let snge={
+        pageNum: 1,
+        pageSize: 200,
+      }
+      listChannelNumber(snge).then(response => {
+        this.channelNumberList = response.rows
+        this.loading = false
+      })
+    },
+    getge(valy){
+        this.$nextTick(() => {
+             setTimeout(() => {
+        for(var i =0; i < valy.length;i++){
+          let du = document.getElementById("myVideo" + (i+1)) //获取组件下的video
+                 var hour = parseInt((du.duration) / 3600);
+                 var minute = parseInt((du.duration % 3600) / 60);
+                 var second = parseInt(du.duration % 60);
+                 let result = ''
+                 if (hour > 0) {
+                 result = this.formatTimeStr(hour) + ':' + this.formatTimeStr(minute) + ':' + this
+                 .formatTimeStr(second)
+                           } else {
+                              result = this.formatTimeStr(minute) + ':' + 
+                            this.formatTimeStr(second)
+                            }
+
+                       this.isshoe = false
+                       valy[i].result = result
+                       this.isshoe = true
+                       console.log(valy[i],result,du)
+          //                   return result //转化成分,秒
+                       }
+                      }, 1200)
+
+                    })
+    },
+    formatTimeStr(val) {
+            if (val > 9) {
+              return val
+            } else {
+              return '0' + val
+            }
+          },
+    // 取消按钮
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    // 获取当前时间
+    gettime(){
+      let nowDate = new Date()
+      				  let date = {
+      				    year: nowDate.getFullYear(),
+      				    month: nowDate.getMonth() + 1,
+      				    date: nowDate.getDate()
+      				  }
+                 // console.log(parseInt(date.date),date.month,4)
+                 if (date.month < 10) {
+                    date.month = '0' + date.month
+                  }
+      				   if (parseInt(date.date) < 10) {
+      				      date.date = '0' + date.date
+      				    }
+                  let nghe = date.year + '-' + date.month + '-' + date.date
+      				  return nghe
+
+    },
+    // 表单重置
+    reset() {
+       this.form = {
+               warnId: null,
+               warnType: null,
+               warnSign: null,
+               channelId: null,
+               videoAddress: null,
+               reportAddress: null,
+               reportStatus: null,
+               warnTime: null,
+               warnImage: null,
+               delFlag: null,
+               createBy: null,
+               createTime: null,
+               updateBy: null,
+               updateTime: null,
+               remark: 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.warnId)
+          this.single = selection.length!==1
+          this.multiple = !selection.length
+        },
+     /** 新增按钮操作 */
+        handleAdd() {
+          this.reset()
+          this.open = true
+          this.title = "添加告警管理"
+        },
+        /** 修改按钮操作 */
+        handleUpdate(row) {
+          this.reset()
+          const warnId = row.warnId || this.ids
+          getWarnManage(warnId).then(response => {
+            this.form = response.data
+            this.open = true
+            this.title = "修改告警管理"
+          })
+        },
+    getImageSrc(val) {
+          // 创建一个临时元素,将HTML内容插入其中
+          const tempElement = document.createElement('div');
+          tempElement.innerHTML = val;
+          // 查找 <img> 标签并获取 src 属性值
+          const imgElement = tempElement.querySelector('img');
+          if (imgElement) {
+            const srcValue = imgElement.getAttribute('src');
+            // this.imagePath=srcValue
+            console.log('Image src:', srcValue+"照片路径");
+          } else {
+            console.log('No <img> element found.');
+          }
+        },
+
+
+   /** 提交按钮 */
+       submitForm() {
+         this.$refs["form"].validate(valid => {
+           if (valid) {
+             if (this.form.warnId != null) {
+               updateWarnManage(this.form).then(response => {
+                 this.$modal.msgSuccess("修改成功")
+                 this.open = false
+                 this.getList()
+               })
+             } else {
+               addWarnManage(this.form).then(response => {
+                 this.$modal.msgSuccess("新增成功")
+                 this.open = false
+                 this.getList()
+               })
+             }
+           }
+         })
+       },
+       handleDeleteg() {
+           let nhde = []
+           let nsg = ''
+           this.warnManageList.filter(rou=>{
+             if(rou.isnum == true){
+               nhde.push(rou.warnId)
+             }
+           })
+           console.log(nhde)
+           nsg = nhde.join(',')
+            // return
+            this.$modal.confirm('是否确认删除数据项?').then(function() {
+              return delManual(nsg);
+            }).then(() => {
+              this.getList();
+              this.$modal.msgSuccess("删除成功");
+            }).catch(() => {});
+          },
+       /** 删除按钮操作 */
+       handleDelete(row) {
+         const warnIds = row.warnId || this.ids
+         this.$modal.confirm('是否确认删除告警管理编号为"' + warnIds + '"的数据项?').then(function() {
+           return delWarnManage(warnIds)
+         }).then(() => {
+           this.getList()
+           this.$modal.msgSuccess("删除成功")
+         }).catch(() => {})
+       },
+    /** 导出按钮操作 */
+       handleExport() {
+         this.download('manage/warnManage/export', {
+           ...this.queryParams
+         }, `warnManage_${new Date().getTime()}.xlsx`)
+       },
+
+
+    // 获取屏幕高度
+    showFilterForm () {
+          this.filterActive = !this.filterActive
+          this.changeTableMaxHeight()
+        },
+        changeTableMaxHeight () {
+          let height = document.body.offsetHeight // 网页可视区域高度
+          // if (this.filterActive) {
+          //   this.tableMaxHeight = height - 320
+          // } else {
+            this.tableMaxHeight = height - 150
+          // }
+          console.log(height)
+        }
+
+  }
+};
+</script>
+<style  lang="scss">
+  .quning{
+    .el-image{
+      box-shadow:0;
+      -webkit-box-shadow:0;
+    }
+  }
+  .qucheu{
+    .el-form-item--small.el-form-item{
+      border: 1px  solid #E6E6E6;
+    }
+    .el-input__inner{
+      border:0;
+    }
+  }
+  .nghsey{
+    .el-dialog__body{
+      padding: 0;
+      background-color: #F2F3FD;
+    }
+  }
+  .butt{
+    .el-button--small{
+      padding: 9px 23px !important;
+      font-size: 14px;
+      border: 0 !important;
+    }
+
+  }
+  .casr{
+    .el-tabs__item.is-active{
+      color: #196CFF;
+    }
+    .el-tabs--card > .el-tabs__header .el-tabs__item{
+      padding: 0  30px !important;
+    }
+  }
+  .el-table .el-table__header-wrapper th{
+    background-color:#F5F6F8;
+    color:#343434;
+  }
+  .el-table{
+    color:#343434;
+  }
+</style>
+<style scoped lang="scss">
+  .goe{
+    padding: 0 15px;
+    div{
+      // margin-bottom: 12px;
+    }
+    p{
+      margin: 0;
+      font-weight: 500;
+      font-size: 14px;
+      color: #AAAAAA;
+      // margin-top: 10px;
+      // margin-bottom: 3px;
+      // padding: 0 10px;
+      overflow: hidden;
+      text-overflow: ellipsis;
+      display:-webkit-box; //作为弹性伸缩盒子模型显示。
+      -webkit-box-orient:vertical; //设置伸缩盒子的子元素排列方式--从上到下垂直排列
+      -webkit-line-clamp:1; //显示的行
+      width: 30%;
+    }
+    p:nth-child(2){
+      // margin-bottom: 10px;
+      margin-top: 0;
+     font-weight: 400;
+     width: 70%;
+     font-size: 14px;
+     color: #333333;
+     display: flex;
+     justify-content: space-between;
+     align-items: center;
+     overflow: hidden;
+     text-overflow: ellipsis;
+     display:-webkit-box; //作为弹性伸缩盒子模型显示。
+     -webkit-box-orient:vertical; //设置伸缩盒子的子元素排列方式--从上到下垂直排列
+     -webkit-line-clamp:1; //显示的行
+     // padding-bottom: 10px;
+
+    }
+  }
+  .ingwe{
+    border: 2px solid #03BF8A;
+  }
+  .shipige{
+     padding: 15px;
+     display: flex;
+     justify-content: space-between;
+     align-items: center;
+    p{
+      margin: 0;
+
+    }
+  }
+  </style>
+
+

+ 949 - 0
ruoyi-ui/src/views/shipinggaoj/renyuan/index.vue

@@ -0,0 +1,949 @@
+<template>
+  <div class="app-container">
+    <div >
+      <div style="background-color: #fff;padding: 20px;border-radius: 10px; padding-bottom: 0;">
+              <p style="margin: 0; font-weight: 800;font-size: 16px;color: #343434;display: flex;align-items: center;margin-bottom: 20px;border-left: 6px solid #03BF8A;margin-left: -20px;">
+                <!-- <img src="../../../assets/images/icon_htgl_btzs.png" alt="" style="width: 16px;height: 20px;"> -->
+               <span style="margin-left: 10px;">搜索条件</span>
+              </p>
+              <div style="padding-bottom: 0;margin-bottom: 20px;">
+                <el-form class="qucheu" :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="108px">
+                  <el-row>
+
+                    <el-col :span="24">
+                      <el-col :span="8">
+                        <el-form-item label="人员姓名" prop="staffName">
+                                <el-input
+                                  v-model="queryParams.staffName"
+                                  placeholder="请输入人员姓名"
+                                  clearable
+                                  @keyup.enter.native="handleQuery"
+                                />
+                              </el-form-item>
+                      </el-col>
+                      <el-col :span="8">
+                       <el-form-item label="联系方式" prop="staffPhone">
+                               <el-input
+                                 v-model="queryParams.staffPhone"
+                                 placeholder="请输入人员联系方式"
+                                 clearable
+                                 @keyup.enter.native="handleQuery"
+                               />
+                             </el-form-item>
+                      </el-col>
+                      <el-col :span="8">
+                       <el-form-item label="紧急联系人" prop="emergencyContact">
+                               <el-input
+                                 v-model="queryParams.emergencyContact"
+                                 placeholder="请输入紧急联系人"
+                                 clearable
+                                 @keyup.enter.native="handleQuery"
+                               />
+                             </el-form-item>
+                      </el-col>
+
+                    </el-col>
+                    <el-col :span="8">
+                      <el-form-item label="紧急联系方式" prop="emergencyContactPhone">
+                              <el-input
+                                v-model="queryParams.emergencyContactPhone"
+                                placeholder="请输入紧急联系人手机"
+                                clearable
+                                @keyup.enter.native="handleQuery"
+                              />
+                            </el-form-item>
+                    </el-col>
+                    <el-col :span="8">
+                       <el-form-item label="创建时间" prop="createTime">
+                                              <el-date-picker clearable
+                                              style="width: 100%;"
+                                                v-model="queryParams.createTime"
+                                                type="date"
+                                                value-format="yyyy-MM-dd"
+                                                placeholder="请选择创建时间">
+                                              </el-date-picker>
+                                       </el-form-item>
+                    </el-col>
+                    <el-col :span="5">
+                      <el-form-item class="butt" style="border: 0;">
+                        <el-button style="background-color: #03BF8A; border-color: #03BF8A;" type="primary" size="mini"  @click="handleQuery">查询 </el-button>
+                        <el-button size="mini"  @click="resetQuery">重置</el-button>
+                      </el-form-item>
+                    </el-col>
+                  </el-row>
+
+                </el-form>
+              </div>
+            </div>
+
+
+      <div class="casr"  >
+              <el-row :gutter="10" class="mb8">
+                <!-- <el-col :span="1.5">
+                  <div style="font-weight: bold;font-size: 14px;color: #343434; display: flex;align-items: center;">
+                    当夜全选
+                  </div>
+                </el-col> -->
+                <el-col :span="1.5">
+                  <el-button
+                    type="success"
+                    plain
+                    size="mini"
+                    @click="handleAdd"
+                    v-hasPermi="['manage:staffManage:add']"
+                  >添加</el-button>
+                </el-col>
+                <!-- <el-col :span="1.5">
+                  <el-button
+                    type="success"
+                    plain
+                    size="mini"
+                    :disabled="single"
+                    @click="handleUpdate"
+                    v-hasPermi="['system:post:edit']"
+                  >修改</el-button>
+                </el-col>
+                <el-col :span="1.5">
+                  <el-button
+                    type="danger"
+                    plain
+                    size="mini"
+                    :disabled="multiple"
+                    @click="handleDelete"
+                    v-hasPermi="['system:post:remove']"
+                  >删除</el-button>
+                </el-col> -->
+                <el-col :span="1.5">
+                  <el-button
+                    type="warning"
+                    plain
+                    size="mini"
+                    @click="handleExport"
+                    v-hasPermi="['manage:staffManage:export']"
+                  >导出</el-button>
+                </el-col>
+                <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
+              </el-row>
+              <div class=" infinite-list" :style="dynamicStyle">
+                <el-row :gutter="10" v-if="staffManageList.length !=0" style="width:100%;margin-left: 0;">
+                  <el-col :span="6" v-for="(item,index) in staffManageList" :key="index"  >
+                    <!-- @click="isac(item)" -->
+                    <div v-if="isshoe"  :class=" item.isnum ==true ? 'ingwe' :'' " style="position: relative; background-color: #fff;box-shadow: 0px 0px 10px 0px #CDCDCD;border-radius: 4px;margin-bottom: 10px;">
+                      <div style="display: flex; align-items: center;padding: 15px 20px; position: relative;padding-bottom: 0;">
+                      <div>
+                         <image-preview :src="item.staffImage" :width="50" :height="50"  style="border-radius:50%;margin-top: -10px;"/>
+                         <!-- <img src="../../../assets/images/icon_htgl_rylb_mrtx.png" alt="" style="width: 50px;height: 50px;border-radius: 50%;" > -->
+                      </div>
+                      <div class="haned">
+                        <p style="margin-bottom: 5px;">
+                          <span style="font-weight: bold;font-size: 16px;color: #161616;margin-left: 15px;margin-right: 10px;">{{item.staffName ==null?'暂无数据' : item.staffName}}</span>
+                          <img v-hasPermi="['manage:staffManage:edit']" src="../../../assets/images/icon_htgl_rylb_bj.png" alt=""  style="cursor: pointer;" @click="handleUpdate(item)">
+                          <img v-hasPermi="['manage:staffManage:remove']" src="../../../assets/images/icon_htgl_rylb_del.png" alt=""  style="float: right;cursor: pointer;" @click="handleDelete(item)">
+                        </p>
+                        <div style="display: flex; margin-left: 15px;font-size: 14px;color: #666666;margin-top: 5px;">
+                          <p  style="text-align: left; width: 40%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;" > 电话号码:</p>
+                          <p style="width: 60%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;margin-left: 5px;font-size: 14px;color: #666666;">
+                            {{item.staffPhone ==null?'暂无数据' : item.staffPhone}}
+                          </p>
+                        </div>
+                        <div style="display: flex; margin-left: 15px;font-size: 14px;color: #666666;margin-top: 5px;">
+                          <el-tooltip class="item" effect="dark" content="紧急联系人" placement="top-start">
+                          <p style="width: 40%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;" >紧急联系人:</p>
+                          </el-tooltip>
+                          <p style="width: 60%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;margin-left: 5px;font-size: 14px;color: #666666;">
+                            {{item.emergencyContact ==null?'暂无数据' : item.emergencyContact}}
+                          </p>
+                        </div>
+                        <div style=" display: flex; margin-left: 15px;font-size: 14px;color: #666666;margin-top: 5px;">
+                          <el-tooltip class="item" effect="dark" content="紧急电话号码" placement="top-start">
+                          <p style="width: 40%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;">紧急电话号码:</p>
+                          </el-tooltip>
+                          <p style="width: 60%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;margin-left: 5px;font-size: 14px;color: #666666;">
+                            {{item.emergencyContactPhone ==null?'暂无数据' : item.emergencyContactPhone}}
+                          </p>
+                        </div>
+
+
+
+                      </div>
+
+
+
+
+                      </div>
+                       <!-- <div class="weit">
+                                              <p>开发部</p>
+                                              <p>白名单</p>
+                                            </div> -->
+
+
+                      <img v-if="item.isnum == true" src="../../../assets/images/icon_htgl_kp_gx.png" alt="" style="width: 35px;height: 35px;position: absolute;bottom: 0;right: 0;">
+                    </div>
+                  </el-col>
+                </el-row>
+                <div style="margin-top: 20px;display: flex;justify-content: center;align-items: center;" v-if="staffManageList.length ==0">
+                   <img   src="../../../assets/images/zwshjbig.png" alt="" style="">
+                </div>
+              </div>
+      </div>
+
+
+
+      <paginations
+        v-show="total>0"
+        :total="total"
+        :page.sync="queryParams.pageNum"
+        :limit.sync="queryParams.pageSize"
+        @pagination="getList"
+      />
+    </div>
+
+    <!-- 添加或修改岗位对话框 -->
+    <el-dialog :title="title" :visible.sync="open" width="600px" append-to-body>
+          <el-form ref="form" :model="form" :rules="rules" label-width="120px">
+            <el-row :gutter="20" class="ite">
+              <el-col :span="16">
+                <el-col :span="24">
+                  <el-form-item label="人员姓名" prop="staffName">
+                            <el-input v-model="form.staffName" placeholder="请输入人员姓名" />
+                          </el-form-item>
+                </el-col>
+                <el-col :span="24">
+                  <el-form-item label="人员联系方式" prop="staffPhone">
+                            <el-input v-model="form.staffPhone" placeholder="请输入人员联系方式" />
+                          </el-form-item>
+                </el-col>
+                <el-col :span="24">
+                  <el-form-item label="紧急联系人" prop="emergencyContact">
+                           <el-input v-model="form.emergencyContact" placeholder="请输入紧急联系人" />
+                         </el-form-item>
+                </el-col>
+                <el-col :span="24">
+                  <el-form-item label="紧急联系人手机" prop="emergencyContactPhone">
+                            <el-input v-model="form.emergencyContactPhone" placeholder="请输入紧急联系人手机" />
+                          </el-form-item>
+                </el-col>
+              </el-col>
+
+
+              <el-col :span="8" class="sgwe unimg" style="border: 1px solid #F8F8F8;height: 235px;">
+                  <div style=" margin:10px 0; font-weight: bold;font-size: 14px;color: #333333;text-align: center;">人脸照片</div>
+
+                  <image-uploadr :limit="1" v-model="form.staffImage"/>
+                  <div style="font-weight: bold;font-size: 14px;color: #03BF8A;text-align: center;margin-top: 10px;" @click="openClick">点击拍照</div>
+                  <!-- onTake -->
+              </el-col>
+
+               <!-- <el-col :span="24"> -->
+
+
+               <!-- </el-col> -->
+              </el-col>
+            </el-row>
+
+          </el-form>
+         <div slot="footer" class="dialog-footer">
+                       <el-button style="background-color:#03BF8A ; border-color: #03BF8A;" type="primary" @click="submitForm">确 定</el-button>
+                       <el-button style="background-color:#DDEBE7 ; border-color: #DDEBE7; color: #475669;" @click="cancel">取 消</el-button>
+                     </div>
+        </el-dialog>
+        <photo ref="photo" v-model="form.staffImage" :title="'图片拍照上传'" />
+                   <!--开启摄像头的弹窗-->
+                  <!-- <div class="info2" @click="onTake">
+                     <el-image :src="form.url" style="padding-left: 200px;width: 600px; height:400px"></el-image>
+                   </div> -->
+                   <!--开启摄像头的拍照和-->
+                   <el-dialog title="拍照上传" :visible.sync="visible" @close="onCancel1" width="1065px" append-to-body>
+                     <div class="box">
+                       <video id="videoCamera" class="canvas" :width="videoWidth" :height="videoHeight" autoPlay></video>
+                       <canvas id="canvasCamera" class="canvas" :width="videoWidth" :height="videoHeight"></canvas>
+                     </div>
+                     <div slot="footer">
+                       <el-button @click="drawImage" icon="el-icon-camera" size="small">
+                         拍照
+                       </el-button>
+                       <el-button v-if="os" @click="getCompetence" icon="el-icon-video-camera" size="small">
+                         打开摄像头
+                       </el-button>
+                       <el-button v-else @click="stopNavigator" icon="el-icon-switch-button" size="small">
+                         关闭摄像头
+                       </el-button>
+                       <el-button @click="resetCanvas" icon="el-icon-refresh" size="small">
+                         重置
+                       </el-button>
+                       <el-button @click="onCancel" icon="el-icon-circle-close"
+                                  v-hasPermi="['system:oss:upload']"
+                                  type="primary" size="small">
+                         完成
+                       </el-button>
+                     </div>
+                   </el-dialog>
+
+  </div>
+</template>
+
+<script>
+const defaultSettings = require("@/settings.js");
+import { listStaffManage, getStaffManage, delStaffManage, addStaffManage, updateStaffManage,unploa } from "@/api/manage/staffManage"
+export default {
+   name: "ResidentInfo",
+    dicts: ['affiliation_personnel', 'sys_yes_no', 'gender','zhuhu_type', 'relationship_householder','renzhen_sh'],
+  data() {
+    return {
+     // 遮罩层
+          // 遮罩层
+                loading: true,
+                // 选中数组
+                ids: [],
+                // 非单个禁用
+                single: true,
+                // 非多个禁用
+                multiple: true,
+                // 显示搜索条件
+                showSearch: true,
+                // 总条数
+                total: 0,
+                // 人员管理表格数据
+                staffManageList: [],
+                // 弹出层标题
+                title: "",
+                // 是否显示弹出层
+                open: false,
+                // 查询参数
+                queryParams: {
+                  pageNum: 1,
+                  pageSize: 10,
+                  staffName: null,
+                  staffPhone: null,
+                  emergencyContact: null,
+                  emergencyContactPhone: null,
+                  staffImage: null,
+                },
+                // 表单参数
+                form: {},
+                // 表单校验
+                rules: {
+                  staffName: [
+                            { required: true, message: "不能为空", trigger: "blur" }
+                          ],
+                  staffPhone: [
+                      { required: true, message: "不能为空", trigger: "blur" },
+                                       {
+                                         pattern: /^1[3|4|5|6|7|8|9][0-9]\d{8}$/,
+                                         message: "请输入正确的手机号码",
+                                          trigger: "blur"
+                                         }
+                  ],
+
+                },
+      activeName:'first',
+      videoState: false, // 视频播放状态
+      poster:true,
+      controls:true,
+      videoData:{},
+       player: null,
+       isshoe:true,
+       tableMaxHeight:'200',
+       tenantListtw:[],
+       houseInfoLisen:[],
+       isxin:false,
+      imgSrc: "",
+              visible: false,//弹窗
+              loading: false,//上传按钮加载
+              open: false,//控制摄像头开关
+              thisVideo: null,
+              thisContext: null,
+              thisCancas: null,
+              videoWidth: 500,
+              videoHeight: 400
+
+    };
+  },
+  computed: {
+    dynamicStyle() {
+      return {
+        overflow:'auto',
+        height: this.tableMaxHeight+ 'px',
+        paddingTop:'10px'
+      }
+    }
+    },
+  created() {
+    // if(this.$route.query.id != undefined){
+    //    this.queryParams.houseId = this.$route.query.id  - 0
+    // }
+    // this.usename = this.$store.state.user.name
+    this.getList();
+
+ window.onresize = () => {
+ 	      this.changeTableMaxHeight()
+ 	    }
+ 	    this.changeTableMaxHeight()
+ },
+ mounted() {
+ 	window.onresize = () => {
+ 	          this.changeTableMaxHeight()
+ 	        }
+ 	        this.changeTableMaxHeight()
+ },
+  beforeDestroy() {
+      if (this.player) {
+        this.player.dispose()
+      }
+    },
+  methods: {
+    openClick() {
+            this.$refs['photo'].dialogPhotoVisible = true
+        },
+    /** 查询岗位列表 */
+    getList() {
+   this.loading = true;
+      listStaffManage(this.queryParams).then(response => {
+        this.staffManageList   = response.rows;
+        this.staffManageList  .filter(rou=>{
+          rou.imges = []
+          if(rou.idCardFront != null && rou.idCardFront != ''){
+            rou.imges.push(rou.idCardFront)
+          }
+          if(rou.idCardBack != null && rou.idCardBack != ''){
+            rou.imges.push(rou.idCardBack)
+          }
+          rou.isnum = false
+        })
+        this.total = response.total;
+        this.loading = false;
+      });
+    },
+
+     shiegw(val){
+       console.log(val)
+       	var _IDRe18 = /^([1-6][1-9]|50)\d{4}(18|19|20)\d{2}((0[1-9])|10|11|12)(([0-2][1-9])|10|20|30|31)\d{3}[0-9Xx]$/
+       	// var _IDre15 =  /^([1-6][1-9]|50)\d{4}\d{2}((0[1-9])|10|11|12)(([0-2][1-9])|10|20|30|31)\d{3}$/
+       	// 校验身份证:
+       	// return (_IDRe18.test(idNo) || _IDre15.test(idNo)) ? true : false;
+        if(_IDRe18.test(this.form.residentIdCard) == true){
+          let sge = this.getInfo( this.form.residentIdCard)
+          this.form.yearsOld = sge.age
+          this.form.residentGender = sge.sex + ''
+          this.form.residentBirthday = sge.birth
+          console.log(sge)
+        }
+
+     },
+
+   uploadedSuccessfully(row){
+     console.log('上传重构',row)
+     if(row.length !=0){
+       row.filter(ru=>{
+         this.form.residentName = ru.realName
+         this.form.residentIdCard = ru.idCard
+         let sge = this.getInfo( this.form.residentIdCard)
+         this.form.yearsOld = sge.age
+         this.form.residentGender = sge.sex + ''
+         // this.form.residentBirthday = sge.birth
+       })
+
+     }
+   },
+    // 取消按钮
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    // 表单重置
+    reset() {
+   this.form = {
+           staffId: null,
+           staffName: null,
+           staffPhone: null,
+           emergencyContact: null,
+           emergencyContactPhone: null,
+           staffImage: null,
+           delFlag: null,
+           createBy: null,
+           createTime: null,
+           updateBy: null,
+           updateTime: null,
+           remark: 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.staffId)
+         this.single = selection.length!==1
+         this.multiple = !selection.length
+       },
+    /** 新增按钮操作 */
+        handleAdd() {
+          this.reset()
+          this.open = true
+          this.title = "添加人员管理"
+        },
+        /** 修改按钮操作 */
+        handleUpdate(row) {
+          this.reset()
+          const staffId = row.staffId || this.ids
+          getStaffManage(staffId).then(response => {
+            this.form = response.data
+            this.open = true
+            this.title = "修改人员管理"
+          })
+        },
+    /** 提交按钮 */
+        submitForm() {
+
+          this.$refs["form"].validate(valid => {
+            if (valid) {
+              if (this.form.staffId != null) {
+                updateStaffManage(this.form).then(response => {
+                  this.$modal.msgSuccess("修改成功")
+                  this.open = false
+                  this.getList()
+                })
+              } else {
+                addStaffManage(this.form).then(response => {
+                  this.$modal.msgSuccess("新增成功")
+                  this.open = false
+                  this.getList()
+                })
+              }
+            }
+          })
+        },
+        /** 删除按钮操作 */
+        handleDelete(row) {
+          const staffIds = row.staffId || this.ids
+          this.$modal.confirm('是否确认删除人员管理编号为"' + staffIds + '"的数据项?').then(function() {
+            return delStaffManage(staffIds)
+          }).then(() => {
+            this.getList()
+            this.$modal.msgSuccess("删除成功")
+          }).catch(() => {})
+        },
+    /** 导出按钮操作 */
+       handleExport() {
+         this.download('manage/staffManage/export', {
+           ...this.queryParams
+         }, `staffManage_${new Date().getTime()}.xlsx`)
+       },
+
+      handleClick(){
+
+      },
+    isac(val){
+      console.log(5,val)
+      val.isnum = !val.isnum
+      this.isshoe = false
+      this.isshoe = true
+    },
+    itneg(item){
+      this.queryParams.houseId = item.houseId
+      this.queryParams.detailedAddress = item.detailedAddress
+    },
+    itnegadd(item){
+      this.form.houseId = item.houseId
+      this.form.detailedAddress = item.detailedAddress
+    },
+    // 获取屏幕高度
+    showFilterForm () {
+          this.filterActive = !this.filterActive
+          this.changeTableMaxHeight()
+        },
+
+        changeTableMaxHeight () {
+          let height = document.body.offsetHeight // 网页可视区域高度
+          // if (this.filterActive) {
+          //   this.tableMaxHeight = height - 320
+          // } else {
+            this.tableMaxHeight = height - 150
+          // }
+          console.log(height)
+        },
+     onTake() {
+          this.visible = true;
+          this.getCompetence();
+        },
+
+        /*关闭弹窗,以及关闭摄像头功能*/
+        onCancel1() {
+          this.visible = false;
+          this.stopNavigator(); // 关闭摄像头
+        },
+
+        // 调用摄像头权限
+        getCompetence() {
+          //必须在model中render后才可获取到dom节点,直接获取无法获取到model中的dom节点
+          this.$nextTick(() => {
+            const _this = this;
+            this.os = false; //切换成关闭摄像头
+            // 获取画布节点
+            this.thisCancas = document.getElementById("canvasCamera");
+            // 为画布指定绘画为2d类型
+            this.thisContext = this.thisCancas.getContext("2d");
+            //获取video节点
+            this.thisVideo = document.getElementById("videoCamera");
+            // 旧版本浏览器可能根本不支持mediaDevices,我们首先设置一个空对象
+            if (navigator.mediaDevices === undefined) {
+              navigator.menavigatordiaDevices = {};
+            }
+            // 一些浏览器实现了部分mediaDevices,我们不能只分配一个对象
+            // 使用getUserMedia,因为它会覆盖现有的属性。
+            // 这里,如果缺少getUserMedia属性,就添加它。
+            if (navigator.mediaDevices.getUserMedia === undefined) {
+              navigator.mediaDevices.getUserMedia = function(constraints) {
+                // 首先获取现存的getUserMedia(如果存在)
+                let getUserMedia =
+                  navigator.webkitGetUserMedia ||
+                  navigator.mozGetUserMedia ||
+                  navigator.getUserMedia;
+                // 有些浏览器不支持,会返回错误信息
+                // 保持接口一致
+                if (!getUserMedia) {
+                  return Promise.reject(
+                    new Error("getUserMedia is not implemented in this browser")
+                  );
+                }
+                // 否则,使用Promise将调用包装到旧的navigator.getUserMedia
+                return new Promise(function(resolve, reject) {
+                  getUserMedia.call(navigator, constraints, resolve, reject);
+                });
+              };
+            }
+            const constraints = {
+              audio: false,
+              video: {
+                width: _this.videoWidth,
+                height: _this.videoHeight,
+                transform: "scaleX(-1)"
+              }
+            };
+            navigator.mediaDevices
+              .getUserMedia(constraints)
+              .then(function(stream) {
+                // 旧的浏览器可能没有srcObject
+                if ("srcObject" in _this.thisVideo) {
+                  _this.thisVideo.srcObject = stream;
+                } else {
+                  // 避免在新的浏览器中使用它,因为它正在被弃用。
+                  _this.thisVideo.src = window.URL.createObjectURL(stream);
+                }
+                _this.thisVideo.onloadedmetadata = function(e) {
+                  console.log(e)
+                  _this.thisVideo.play();
+                };
+              })
+              .catch(err => {
+                console.log(err)
+                this.$notify({
+                  title: "警告",
+                  message: "没有开启摄像头权限或浏览器版本不兼容.",
+                  type: "warning"
+                });
+              });
+          });
+        },
+
+        //调用摄像头 --- 进行绘制图片
+        drawImage() {
+          // 点击,canvas画图
+          this.thisContext.drawImage(
+            this.thisVideo,
+            0,
+            0,
+            this.videoWidth,
+            this.videoHeight
+          );
+          // 获取图片base64链接
+          this.imgSrc = this.thisCancas.toDataURL("image/png");
+
+          /*const imgSrc=this.imgSrc;*/
+        },
+        //清空画布
+        clearCanvas(id) {
+          let c = document.getElementById(id);
+          let cxt = c.getContext("2d");
+          cxt.clearRect(0, 0, c.width, c.height);
+        },
+
+        //重置画布
+        resetCanvas() {
+          // this.imgSrc = "";
+          this.clearCanvas("canvasCamera");
+        },
+
+        //关闭摄像头
+        stopNavigator() {
+          if (this.thisVideo && this.thisVideo !== null) {
+            this.thisVideo.srcObject.getTracks()[0].stop();
+            this.os = true; //切换成打开摄像头
+          }
+        },
+        /*调用摄像头拍照结束*/
+         /*完成拍照并对其照片进行上传*/
+            onCancel() {
+              this.visible = false;
+              /* this.resetCanvas();*/
+              // console.log(this.imgSrc);
+               const file = this.imgSrc; // 把整个base64给file
+                        const time = (new Date()).valueOf();//生成时间戳
+                        const name = time + ".png"; // 定义文件名字(例如:abc.png , cover.png)
+                        const conversions = this.base64ImgtoFile(file, name); // 调用base64转图片方法
+                        const data = new FormData();
+                        data.append('file', conversions);
+
+              // this.imgFile = this.dataURLtoFile(this.imgSrc, new Date() + ".png");
+              // console.log(this.imgFile);
+              // this.stopNavigator();
+              // // let par = {
+              // //   photo: this.imgFile,
+              // // };
+              // let data = new FormData();
+              // data.append("file", this.imgFile); //1是图片,2是视频
+              // // data.append("code", this.addForm.code);
+              // // checkbeforepersonalphoto上传图片的接口
+              unploa(data).then(res => {
+                console.log(res)
+                if (res.code == "200") {
+                  this.$message({
+                    message: "上传成功",
+                    type: "success"
+                  });
+                  this.form.url = res.data.url;
+                  this.form.osid = res.data.ossId;
+                }
+              });
+            },
+         base64ImgtoFile(dataurl, filename = 'file') {
+           console.log(dataurl)
+           let arr = dataurl.split(',')
+           let mime = arr[0].match(/:(.*?);/)[1]
+           let suffix = mime.split('/')[1]
+           let bstr = atob(arr[1])
+           let n = bstr.length
+           console.log(bstr)
+           let u8arr = new Uint8Array(n)
+           while (n--) {
+             u8arr[n] = bstr.charCodeAt(n)
+           }
+           console.log(u8arr)
+           console.log(new File([u8arr], `${filename}.${suffix}`, {
+             type: mime
+           }))
+           return new File([u8arr], `${filename}.${suffix}`, {
+             type: mime
+           })
+         },
+
+           dataURLtoFile(dataurl, filename) {
+                   let arr = dataurl.split(',');
+                   let mime = arr[0].match(/:(.*?);/)[1];
+                   let bstr = atob(arr[1]);
+                   let n = bstr.length;
+                   let u8arr = new Uint8Array(n);
+                   while (n--) {
+                     u8arr[n] = bstr.charCodeAt(n)
+                   }
+                   console.log(new File([u8arr], filename, {type: mime}))
+                   return new File([u8arr], filename, {type: mime})
+                 },
+
+
+
+
+  }
+};
+</script>
+<style  lang="scss">
+  .ite{
+    .el-form-item{
+      margin-bottom: 30px;
+    }
+  }
+  .ingsek{
+   .el-carousel__container{
+  	 height: 150px;
+   }
+   .el-carousel--horizontal{
+     width: 100%;
+   }
+  }
+  .shefnze{
+    .el-upload--picture-card{
+      width: 80px;
+      height: 80px;
+      line-height: 80px;
+    }
+    .el-upload-list--picture-card .el-upload-list__item{
+      width: 80px;
+      height: 80px;
+    }
+    .el-upload__tip{
+      overflow: hidden;
+        text-overflow: ellipsis;
+        white-space: nowrap;
+    }
+  }
+  .ngeshimg{
+    .el-upload--picture-card{
+      width: 36px;
+      height: 36px;
+      line-height: 36px;
+      position: absolute;
+      top:0;
+      right: 0;
+    }
+    .component-upload-image{
+      position: absolute;
+      top:0;
+      right: 0;
+    }
+    .el-upload--picture-card i{
+      font-size: 20px;
+    }
+    .el-upload-list--picture-card .el-upload-list__item{
+      width: 58px;
+      height: 36px;
+      position: absolute;
+      top:0;
+      right: -10px;
+    }
+  }
+  .unimg{
+    .el-upload--picture-card{
+      width:140px;
+      height: 160px;
+      margin-left: 15px;
+      // line-height: 102px;
+      background-color:#f8f8f8;
+      border: 0;
+    }
+   .el-upload-list--picture-card .el-upload-list__item{
+       margin-left: 15px;
+    }
+  }
+
+  .bnjle{
+    margin-left: 20px;
+  }
+  .butt{
+    .el-button--small{
+      padding: 9px 23px !important;
+      font-size: 14px;
+    }
+  }
+  .casr{
+    .el-tabs__item.is-active{
+      color: #196CFF;
+    }
+    .el-tabs--card > .el-tabs__header .el-tabs__item{
+      padding: 0  30px !important;
+    }
+  }
+  .el-table .el-table__header-wrapper th{
+    background-color:#F5F6F8;
+    color:#343434;
+  }
+  .el-table{
+    color:#343434;
+  }
+</style>
+<style scoped lang="scss">
+  .goe{
+    p{
+      margin: 0;
+      font-weight: 800;
+      font-size: 16px;
+      color: #161616;
+      margin-top: 10px;
+      margin-bottom: 3px;
+      padding: 0 10px;
+      overflow: hidden;
+      text-overflow: ellipsis;
+      display:-webkit-box; //作为弹性伸缩盒子模型显示。
+      -webkit-box-orient:vertical; //设置伸缩盒子的子元素排列方式--从上到下垂直排列
+      -webkit-line-clamp:1; //显示的行
+    }
+    p:nth-child(2){
+
+    }
+  }
+  .ingwe{
+    border: 2px solid #196CFF;
+  }
+  .renyuangs{
+    p{
+      font-weight: 500;
+      font-size: 14px;
+      color: #161616;
+      padding: 0;
+    }
+    div{
+      font-weight: 500;
+      font-size: 14px;
+      color: #161616;
+      padding: 0;
+      display: flex;
+    }
+  }
+  .tongty{
+    display: flex;
+    align-items: center;
+  }
+  .bortt{
+    border-top: 1px solid #DADADA;
+    margin-top: 15px;
+
+    p{
+      margin: 0;
+      font-weight: bold;
+      font-size: 14px;
+      color: #5F8BF4;
+      width:50%;
+      padding: 10px;
+      text-align: center;
+    }
+  }
+  .wide{
+      width:100% !important;
+    }
+    .haned{
+      flex:1;
+      padding-bottom: 15px;
+      p{
+        margin: 0;
+      }
+    }
+    .weit{
+      display: flex;
+      padding-left: 85px;
+      padding-bottom: 10px;
+      margin-top: 10px;
+      p{
+        margin: 0;
+        font-weight: 500;
+        font-size: 14px;
+        color: #009FE8;
+        border-radius: 10px;
+        border: 1px solid #009FE8;
+        padding: 2px  5px;
+        margin-right: 10px;
+      }
+      p:nth-child(2){
+        color: #FFAB2B;
+        border: 1px solid #FFAB2B;
+      }
+    }
+  </style>
+
+

+ 1112 - 0
ruoyi-ui/src/views/shipinggaoj/shebe/index.vue

@@ -0,0 +1,1112 @@
+<template>
+  <div class="app-container" style="padding-top: 20px;height: 120vh;">
+    <div class="ntgs">
+    <el-row :gutter="10" class="mb8">
+     <div class="iuer" style="margin-bottom:10px;">
+       <div style="display: flex;align-items: center; " class="ingaqe">
+		    <!-- <p class="lqw" style="font-weight: 700;font-size: 15px; margin-bottom: 0;"> <img src="../../../assets/images/icon_yq_htgl_btzs.png" alt="" style="width:10px;height: 10px;margin-right: 10px;"> 门禁信息</p> -->
+            <el-select v-model="queryParams.name" placeholder="请选监控名称" clearable>
+              <el-option
+                v-for="dict in postList"
+                :key="dict.indexCode"
+                :label="dict.name"
+                :value="dict.name"
+              />
+            </el-select>
+			<div class="ksfpofg" @click="handleQuery">
+				<!-- <img src="../../../assets/images/icon_sslb_ss.png" alt="" style="width:10px;height: 10px;"> -->
+						  搜索
+						  </div>
+       </div>
+	   <!-- <div class="ite">
+	      <div class="ksfpo" @click="osge"  v-hasPermi="['system:camera:openDz']">
+			  <img src="../../../assets/images/icon_ssjk_kman_open.png" alt="" style="width:10px;height: 10px;">
+			  开门</div>
+		  <div class="ksfpo ksfpok" @click="osgef" v-hasPermi="['system:camera:closeDz']">
+		  			  <img src="../../../assets/images/icon_ssjk_kman_close.png" alt="" style="width:10px;height: 10px;">
+		  			  关门</div>
+	   </div> -->
+<!--  -->
+     </div>
+      <!-- <el-col :span="1.5">
+        <el-button
+          type="primary"
+          plain
+          icon="el-icon-plus"
+          size="mini"
+          @click="handleAdd"
+          v-hasPermi="['investigate:table:add']"
+        >新增</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="['investigate:table: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="['investigate:table:export']"
+        >导出</el-button>
+      </el-col> -->
+      <!-- <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar> -->
+    </el-row>
+
+	<div>
+		<el-row :gutter="20">
+          <!-- postList -->
+					<el-col :span='5'>
+						<div style="background-color: #fff;border-radius: 10px;padding: 20px 20px;height: 100vh;">
+              <p style="margin: 0;border-left: 6px solid #03BF8A;margin-left: -20px;padding-left: 10px;font-weight: 800;">通道列表</p>
+              <div style=" height: 36px;;line-height: 36px;margin-top: 10px;"v-for="(item,index) in 6">
+                              <div style="display: flex;align-items: center;justify-content: space-between;">
+                                <div style="font-size: 16px;
+              color: #333333;">通道01</div>
+                                <img src="../../../assets/images/icon_htgl_zd.png" alt="" style="width: 10px;height: 12px;">
+                              </div>
+                          </div>
+            </div>
+					</el-col>
+        <!-- v-if="isshoe" -->
+        <el-col :span='19' style="padding-left: 30px; background-color: #fff;border-radius: 10px;padding: 20px;" >
+          <div style="display: flex;align-items: center;justify-content: space-between;">
+            <p style="margin: 0;border-left: 6px solid #03BF8A;margin-left: -20px;padding-left: 10px;font-weight: 800;">实时预览</p>
+            <div>
+              <el-button type="danger" plain>删除</el-button>
+              <el-button type="warning" plain>置顶</el-button>
+              <el-button type="success" plain>关闭</el-button>
+            </div>
+          </div>
+          344
+        						<!-- <video
+        						      class="videosmall"
+        						      ref="videosmallone"
+        						      preload="auto"
+        						      muted
+        						      autoplay
+        							  width="95%"
+        						      type="rtmp/flv"
+        						    >
+        						      <source src="" />
+        						    </video> -->
+        					</el-col>
+
+			<!-- <el-col :span="24">
+				<div class="ihgswq wrapper"  ref="wrapper" style=" overflow: hidden;">
+						  <div class="fijge content nhgwesvq" ref="content" style="width:1610px;">
+									<div class='shotw '   v-for="(item,index) in postList" :key="index" @click="isfgw(item)" >
+											  <img src="../../../assets/images/fengm.png" alt="">
+												<img src="../../../assets/images/icon_spjk_play.png" alt="" class="iges">
+											  <p style="font-size: 14px;">{{item.name}}</p>
+									</div>
+						  </div>
+				</div>
+			</el-col> -->
+		</el-row>
+
+
+	   <pagination
+	     v-show="total>0"
+	     :total="total"
+	     :page.sync="queryParams.pageNo"
+	     :limit.sync="queryParams.pageSize"
+	     @pagination="getList"
+	   />
+	</div>
+
+
+	</div>
+
+    <!-- 添加或修改岗位对话框 -->
+    <el-dialog :title="title" :visible.sync="open" width="500px" append-to-body>
+      <el-form ref="form" :model="form" :rules="rules" label-width="100px">
+		  <el-row>
+			  <el-col :span="24">
+			  		<el-form-item label="接待人员" prop="receptionId">
+			  			<el-select  style="width:100%;" v-model="form.receptionId" placeholder="请选择">
+			  			    <el-option
+			  			      v-for="item in ksjegsg"
+			  			      :key="item.receptionId"
+			  			      :label="item.receptionName"
+			  			      :value="item.receptionId"
+                    @click.native="nhgwel(item)"
+			  			      >
+			  			    </el-option>
+			  			  </el-select>
+			  		</el-form-item>
+			  </el-col>
+		  </el-row>
+      </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="titles" :visible.sync="opens" width="1000px" append-to-body>
+      <el-form ref="forms" :model="forms" :rules="ruless" label-width="120px">
+      <el-row>
+    	  <el-col :span="8">
+    	  		<el-form-item label="人员类型" prop="recordType">
+    	        <el-select v-model="forms.recordType" placeholder="请选择人员类型" >
+    	          <el-option
+    	            v-for="dict in dict.type.fange"
+    	            :key="dict.value"
+    	            :label="dict.label"
+    	            :value="dict.value"
+    	          />
+    	        </el-select>
+    	  		 </el-form-item>
+    	  </el-col>
+    	  <el-col :span="8">
+    	  		<el-form-item label="联系人" prop="recordName">
+    	  		          <el-input v-model="forms.recordName" placeholder="请输入联系人" />
+    	  		        </el-form-item>
+    	  </el-col>
+    	  <el-col :span="8">
+    	  		 <el-form-item label="联系方式" prop="recordPhone">
+    	  		          <el-input v-model="forms.recordPhone" placeholder="请输入联系方式" />
+    	  		        </el-form-item>
+    	  </el-col>
+
+    	  <el-col :span="8">
+    	  		<el-form-item label="出入时间" prop="recordDateTime">
+    	  		          <el-date-picker style="width:100%" clearable
+    	  		            v-model="forms.recordDateTime"
+    	  		            type="date"
+    	  		            value-format="yyyy-MM-dd"
+    	  		            placeholder="请选择	出入时间">
+    	  		          </el-date-picker>
+    	  		        </el-form-item>
+    	  </el-col>
+    	  <el-col :span="8">
+    	  		<el-form-item label="记录来源" prop="recordSource">
+    	        <el-select v-model="forms.recordSource" placeholder="请选择记录来源" >
+    	          <el-option
+    	            v-for="dict in dict.type.jluly"
+    	            :key="dict.value"
+    	            :label="dict.label"
+    	            :value="dict.value"
+    	          />
+    	        </el-select>
+    	  		 </el-form-item>
+    	  </el-col>
+    	  <el-col :span="8">
+    	  		<el-form-item label="备注" prop="visitRemark">
+    	  		          <el-input v-model="forms.visitRemark" placeholder="请输入备注" />
+    	  		        </el-form-item>
+    	  </el-col>
+      </el-row>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitForms">确 定</el-button>
+        <el-button @click="cancel">取 消</el-button>
+      </div>
+    </el-dialog>
+
+	<el-dialog title="页面二维码" :visible.sync="opent" width="200px" style="padding: 0;" class="nhgrls" append-to-body>
+	  <div v-show="opent" style="display: flex;justify-content: center;align-items: center;">
+		  <!-- <span>{{'https://qszdh.qs163.cn/pages/index/index?id=' + this.bg}}</span> -->
+			   <!-- <vue-qr   :text="'https://qszdh.qs163.cn/pages/index/index?id=' + this.bg" :size="200"></vue-qr> -->
+	  </div>
+	</el-dialog>
+  </div>
+</template>
+
+<script>
+// import { listPost, getPost, delPost, addPost, updatePost,updateFs,updateGx } from "@/api/kaoch/renyuan";
+// import { listReservat,camera,cameraIndexCode, listReservatd, getReservat, delReservat, addReservat, updateReservat,setPass,delReservathx,openDz,closeDz } from "@/api/tonggi/houtai";
+// import vueQr from "vue-qr";
+// import videojs from 'video.js'
+// import 'video.js/dist/video-js.css'
+// import {videoPlayer} from 'vue-video-player'
+// import 'videojs-flash'
+// import flvjs from 'flv.js/dist/flv.min.js'
+// import flvjs from "flv.js";
+import Bscroll from "better-scroll";
+export default {
+  name: "Post",
+  dicts: ['sys_normal_disable','sys_yes_no','youke','tjzh','youkes','lafafen','fange','jluly'],
+  // components: {
+  //     vueQr,
+	 //  videoPlayer
+  //   },
+  data() {
+    return {
+      // 遮罩层
+      loading: true,
+	  opent:false,
+	  bg:null,
+    titles:'',
+	editableTabsValue:'6',
+    opens:false,
+	  imageUrl:'@/assets/logo/logo.png',
+	  printObj: {
+	           id: "nhgrew", // 这里是要打印元素的ID
+	           popTitle: "", // 打印的标题
+	         },
+	  pickerOptions:{
+	            disabledDate (time) {
+	              //disabledDate 文档上:设置禁用状态,参数为当前日期,要求返回 Boolean
+	              // return time.getTime() > Date.now()//选当前时间之前的时间
+	              return time.getTime() < Date.now()  - 8.64e7;//选当前时间之后的时间
+	            }
+	        },
+      // 选中数组
+      ids: [],
+      // 非单个禁用
+      single: true,
+	  checkedScoreDataDetails: [],
+	  scoreDataDetailsList:[],
+	  tabPosition:'left',
+      // 非多个禁用
+      multiple: true,
+      // 显示搜索条件
+      showSearch: true,
+      // 总条数
+      total: 0,
+      // 岗位表格数据
+      postList: [],
+      // 弹出层标题
+      title: "",
+      // 是否显示弹出层
+      open: false,
+      // 查询参数
+      queryParams: {
+        pageNo: 1,
+        pageSize:500,
+		name:null,
+        postCode: undefined,
+        postName: undefined,
+        status: undefined,
+        reservatType:undefined
+      },
+      // 表单参数
+      form: {},
+      // 表单校验
+      rules: {
+        receptionId: [
+          { required: true, message: "不能为空", trigger: "blur" }
+        ],
+
+
+      },
+      ruless:{
+        visitName: [
+          { required: true, message: "不能为空", trigger: "blur" }
+        ],
+        visitPhone: [
+          { required: true, message: "不能为空", trigger: "blur" }
+        ],
+        visitNum: [
+          { required: true, message: "不能为空", trigger: "blur" }
+        ],
+        visitDate: [
+          { required: true, message: "不能为空", trigger: "blur" }
+        ],
+        visitTime: [
+          { required: true, message: "不能为空", trigger: "blur" }
+        ],
+
+      },
+      forms:{},
+			tableMaxHeight:'200',
+      kje:0,
+      ksjegsg:[],
+	   Scroll: null,
+	   videoShow: false,
+	flvPlayer:null,
+	player: null,
+	name:null,
+	isshiwa:false,
+	isjfwe:{},
+	isshoe:false
+
+
+    };
+  },
+  created() {
+    // this.getList();
+  window.onresize = () => {
+  	      this.changeTableMaxHeight()
+  	    }
+  	    this.changeTableMaxHeight()
+  },
+  mounted() {
+  	window.onresize = () => {
+  	          this.changeTableMaxHeight()
+  	        }
+  	        this.changeTableMaxHeight()
+
+		this.$nextTick(() => {
+		        this.initScroll()
+		    })
+
+  },
+   beforeDestroy() {
+      this.destoryVideo()
+    },
+  methods: {
+
+
+	  init(val) { //这个val 就是一个地址,例如: http://192.168.2.201:85/live/9311272c49b845baa2b2810ad9bf3f68.flv 这是个服务器返回给我的一个监控视频流地址
+	        setTimeout(() => { //使用定时器是因为,在mounted声明周期里调用,可能会出现DOM没加载出来的原因
+	          var videoElement = this.$refs.videosmallone; // 获取到html中的video标签
+			  this.isshiwa = true
+	          if (flvjs.isSupported()) {
+	          //因为我这个是复用组件,进来先判断 player是否存在,如果存在,销毁掉它,不然会占用TCP名额
+	            if (this.player !== null) {
+	              this.player.pause();
+	              this.player.unload();
+	              this.player.detachMediaElement();
+	              this.player.destroy();
+	              this.player = null;
+	            }
+	            this.player = flvjs.createPlayer( //创建直播流,加载到DOM中去
+	              {
+	                type: "flv",
+	                url: val, //你的url地址
+	                isLive: true, //数据源是否为直播流
+	                hasAudio: false, //数据源是否包含有音频
+	                hasVideo: true, //数据源是否包含有视频
+	                enableStashBuffer: true, //是否启用缓存区
+	              },
+	              {
+	                enableWorker: false, //不启用分离线程
+	                enableStashBuffer: false, //关闭IO隐藏缓冲区
+	                autoCleanupSourceBuffer: true, //自动清除缓存
+	                lazyLoad: false,
+	              }
+	            );
+				this.isshoe = true
+	            this.player.attachMediaElement(videoElement); //放到dom中去
+
+	            //!!!!!!这里需要注意,有的时候load加载完成不一定可以播放,要是播放不成功,用settimeout 给下面的this.player.play() 延时几百毫秒再播放
+	            // setTimeout(this.player.play(), 48000);
+				setTimeout(() =>{
+					//到时间时只执行一次就停止
+					this.player.load();//准备完成
+					this.player.play()
+					console.log('播放')
+				},900)
+
+
+	          }
+	        }, 500);
+	      },
+
+	  createVideo() {
+	        if (flvjs.isSupported()) {
+				console.log(1)
+	          var videoElement = document.getElementById('myFlvVideo')
+			  console.log(videoElement,flvjs)
+	          this.flvPlayer = flvjs.createPlayer(
+	            {
+	              type: 'application/x-mpegURL',
+	              isLive: true,
+	              hasAudio: false,
+	              url:'https://stream1.freetv.fun/86d463c0006da643e45e26b34875df87059dcba13e69d0a5471b185793c122a2.m3u8'
+	            },
+	            {
+	              cors: true, // 是否跨域
+	              enableWorker: false, // 是否多线程工作
+	              enableStashBuffer: false, // 是否启用缓存
+	              stashInitialSize: 400, // 缓存大小(kb)  默认384kb
+	              autoCleanupSourceBuffer: true // 是否自动清理缓存
+	            }
+	          )
+	          this.flvPlayer.attachMediaElement(videoElement)
+	          this.flvPlayer.load()
+	          this.flvPlayer.play()
+			  console.log(1244)
+	          // 报错重连
+	          this.flvPlayer.on(flvjs.Events.ERROR, (errType, errDetail) => {
+	            console.log('errorType:', errType)
+	            console.log('errorDetail:', errDetail)
+	            if (this.flvPlayer) {
+	              this.destoryVideo()
+	              this.createVideo()
+	            }
+	          })
+	        }
+
+			console.log(this.flvPlayer.play())
+	      },
+	      destoryVideo() {
+	        this.player.pause()
+	        this.player.unload()
+	        this.player.detachMediaElement()
+	        this.player.destroy()
+	        this.player = null
+	      },
+
+	  initScroll() {
+	    	  // 给内层盒子设置宽度,不设置宽度的话无法滚动
+	    	  // let width = this.goods.length * 60
+	    	  // // 如果有外边距,可以这样写。需要去掉最后一个元素的外边距,在后面减一下
+	    	  // let width = this.goodslength * (60 + 10) - 10
+			  let width = 6 * (200 + 10) - 10
+	        // this.$refs.content.style.width = width + 'px'
+	        this.$nextTick(()=>{
+	          if(!this.Scroll) {
+	            this.Scroll = new Bscroll(this.$refs.wrapper,{
+	              click: true,      // 配置允许点击事件
+	              scrollX: true,    // 开启横向滚动
+	              eventPassthrough: 'vertical',  // 当设置 eventPassthrough 为 'vertical' 的时候,scrollY 无效
+				  mouseWheel: true,
+				  scrollbar: { // 滚动条, 要加相对位置
+				              fade: true
+				            }
+	            })
+	          } else {
+	            this.Scroll.refresh()     // 重新计算 better-scroll,当 DOM 结构发生变化的时确保滚动效果正常
+	          }
+	        })
+	      },
+
+    /** 查询岗位列表 */
+    getList() {
+      this.loading = true;
+	  // this.queryParams
+      camera(this.queryParams).then(response => {
+        this.postList = response.data.data.list;
+		if(response.data.data != null){
+		if(response.data.data.list.length != 0){
+			let ne = response.data.data.list[0]
+			response.data.data.list.filter(rtu=>{
+				if(rtu.name == '后门道闸'){
+					console.log(3,rtu)
+					ne = rtu
+					return
+				}
+			})
+			this.isfgw(ne)
+			this.isjfwe =ne
+
+		}
+		}
+        // this.postList=[{'nsje':null,'visitPhone':null,'isReception':'Y'}]
+        this.total = response.data.data.total;
+        this.loading = false;
+      });
+    },
+    getListh() {
+      this.loading = true;
+      listReservatd().then(response => {
+        // this.postList = response.rows;
+        this.ksjegsg= response.data
+        // this.total = response.total;
+        this.loading = false;
+      });
+    },
+	isfgw(val){
+		this.isjfwe = val
+		let nhge={cameraIndexCode:val.indexCode}
+		this.isshiwa = false
+		this.isshoe= false
+	   cameraIndexCode(nhge.cameraIndexCode).then(response => {
+		   console.log(response.data.data.url)
+		   this.isshoe= true
+		  this.init(response.data.data.url)
+		   this.isshiwa = true
+	  // this.postList = response.rows;
+	  // this.total = response.total;
+	  });
+		console.log(val,4)
+	},
+	osge(){
+		console.log(this.isjfwe,45)
+		if(this.isjfwe.name == '后门道闸'){
+			this.isjfwe.name ='后门抓拍一体机1'
+		}
+		let nge={equipmentName:this.isjfwe.name}
+		openDz(nge).then(response => {
+
+		});
+	},
+	osgef(){
+		if(this.isjfwe.name == '后门道闸'){
+			this.isjfwe.name ='后门抓拍一体机1'
+		}
+		let nge={equipmentName:this.isjfwe.name}
+		closeDz(nge).then(response => {
+		  // this.postList = response.rows;
+		});
+	},
+
+    ilw(row,val){
+      this.kje = val
+      // console.log(row)
+      if(row.value == 0){
+          this.queryParams.reservatType = undefined
+      }else{
+        this.queryParams.reservatType = row.value
+      }
+    console.log(this.kje)
+      this.queryParams.pageNum  = 1
+      this.getList()
+    },
+  nhgwel(item){
+    this.form.receptionId = item.receptionId
+    this.form.receptionName = item.receptionName
+    this.form.receptionPhone = item.phonenumber
+
+  },
+    getPass(row) {
+      const _this = this
+      this.$confirm('是否审核通过', "提醒", {
+        confirmButtonText: "确定",
+        cancelButtonText: "取消",
+        type: "warning"
+      }).then(function() {
+        return setPass({
+        visitType: 3,
+        reservatId: row.reservatId,
+        // xmStatus:row.xmStatus
+      })
+      }).then(() => {
+    	   _this.getList();
+        _this.msgSuccess("提交成功");
+      })
+    },
+    infoBtn(row) {
+    	const _this = this
+    	this.$confirm('是否拒绝', "提醒", {
+    	  confirmButtonText: "确定",
+    	  cancelButtonText: "取消",
+    	  type: "warning"
+    	}).then(function() {
+    	  return setPass({
+    	  visitType: 2,
+    	   reservatId: row.reservatId,
+    	  // xmStatus:row.xmStatus
+    	})
+    	}).then(() => {
+    	  _this.getList();
+    	  _this.msgSuccess("提交成功");
+    	})
+
+    },
+    // 取消按钮
+    cancel() {
+      this.open = false;
+	  this.opens = false;
+      this.reset();
+    },
+    // 表单重置
+    reset() {
+      this.form = {
+		receptionId:undefined,
+        receptionPhone:undefined,
+        // postSort: 0,
+        // status: "0",
+        receptionName: undefined
+      };
+      this.resetForm("form");
+    },
+    /** 搜索按钮操作 */
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      this.getList();
+    },
+    /** 重置按钮操作 */
+    resetQuery() {
+      this.resetForm("queryForm");
+      this.handleQuery();
+    },
+    // 多选框选中数据
+    handleSelectionChange(selection) {
+      this.ids = selection.map(item => item.reservatId)
+      this.single = selection.length!=1
+      this.multiple = !selection.length
+    },
+    nhgeo(row){
+      this.reset();
+     this.open = true;
+     this.title = "分配接待人员";
+     this.form.reservatId = row.reservatId;
+     this.form.reservatConfigTimeId=row.reservatConfigTimeId;
+     this.form.visitDate=row.visitDate
+    },
+    handleDeleteh(row){
+      this.$router.push({
+        path: '/bjqs',
+      		query: {
+      			'id':row.reservatId,
+      			'name':null,
+      			'names':null,
+      			'isxz':1
+      		}
+      })
+    },
+    /** 新增按钮操作 */
+    handleAdd() {
+      this.forms = {
+        reservatType:'1'
+      }
+      this.opens = true;
+      this.titles = "添加预约人员";
+	  // this.scoreDataDetailsList = []
+	  // this.$router.push({
+	  //   path: '/system/bjq',
+	  // })
+	  // this.$router.push({
+	  //   path: '/bjqs',
+	  // 		query: {
+	  // 			'id':null,
+	  // 			'name':null,
+	  // 			'names':null,
+	  // 			'isxz':1
+	  // 		}
+	  // })
+    },
+    /** 修改按钮操作 */
+    handleUpdate(row) {
+      this.reset();
+           const recordId = row.recordId || this.ids
+           getReservat(recordId).then(response => {
+             this.forms = response.data;
+             this.opens = true;
+             this.title = "修改访问记录";
+           });
+    },
+    /** 提交按钮 */
+    submitForm: function() {
+      this.$refs["form"].validate(valid => {
+              if (valid) {
+                // if (this.form.reservatId != null) {
+                  updateReservat(this.form).then(response => {
+                    this.$modal.msgSuccess("操作成功");
+                    this.open = false;
+                    this.getList();
+                  });
+                // } else {
+                //   addReservat(this.form).then(response => {
+                //     this.$modal.msgSuccess("新增成功");
+                //     this.open = false;
+                //     this.getList();
+                //   });
+                // }
+              }
+            });
+    },
+    submitForms: function() {
+      this.$refs["forms"].validate(valid => {
+              if (valid) {
+                // if (this.form.reservatId != null) {
+                  // updateReservat(this.forms).then(response => {
+                  //   this.$modal.msgSuccess("操作成功");
+                  //   this.open = false;
+                  //   this.getList();
+                  // });
+                // } else {
+                  this.forms.visitTime = this.forms.visitTime + '-' + this.forms.visitTime
+                  addReservat(this.forms).then(response => {
+                    this.$modal.msgSuccess("新增成功");
+                    this.opens = false;
+                    this.getList();
+                  });
+                // }
+              }
+            });
+    },
+
+	nglqw(val){
+		this.opent = true
+		this.bg = val.investigateTableId
+	},
+
+
+	iszheg(event){
+	 console.log(event);
+
+
+	 // 校验身份证:
+	 console.log(reg.test(this.form.idCard),23741)
+	 		if ( reg.test(this.form.idCard)|| _IDre15.test(this.form.idCard)) {
+	 			// this.idea();
+	 			this.go(this.form.idCard);
+	 			// callback()
+	 		} else {
+	   if(ncjsle.test(this.form.idCard) || nhyeli.test(this.form.idCard)){
+	      console.log(3)
+	   }else{
+	     if(gnse.test(this.form.idCard)  ){
+	         console.log(4)
+	     }else{
+	       if(tw.test(this.form.idCard) || twe.test(this.form.idCard)){
+	         console.log(5)
+	       }else{
+	         this.$message.error('证件格式不正确');
+	       }
+	     }
+
+	   }
+	 		}
+	},
+	erw(row){
+		this.$router.push({
+		  path: '/reny/ewm',
+		  query:{
+			   'tenantId':row.investigateTableId
+			  }
+		})
+	},
+
+	hussar_17Click(val) {
+	        const _this = this
+	        var url =process.env.VUE_APP_BASE_API + 'pages/index/index?id=' + val.investigateTableId;
+			 console.log(url,this.$refs.canvas,6)
+			this.opent = true
+	        QRCode.toCanvas(
+	                      canvas,
+	                      url,//生成二维码的数据
+	                      {width: 100, height:100, margin: 1.5},//margin调整二维码的白边大小
+	                      function (error) {
+	                        if (error) {
+	                          console.log(error);
+	                        }
+	                      }
+	                    );
+
+	        // console.log(qrcode,987)
+	      },
+	/** 成绩_子添加按钮操作 */
+	handleAddScoreDataDetails() {
+
+	  let obj = {};
+	  obj.duty = "";
+	  obj.idCard = "";
+	  obj.phonenumber = "";
+	  obj.userName = "";
+	  this.scoreDataDetailsList.push(obj);
+	  console.log(this.scoreDataDetailsList)
+	},
+	/** 成绩_子删除按钮操作 */
+	handleDeleteScoreDataDetails() {
+	  if (this.checkedScoreDataDetails.length == 0) {
+	    this.$modal.msgError("请先选择要删除的数据");
+	  } else {
+	    const scoreDataDetailsList = this.scoreDataDetailsList;
+	    const checkedScoreDataDetails = this.checkedScoreDataDetails;
+	    this.scoreDataDetailsList = scoreDataDetailsList.filter(function(item) {
+	      return checkedScoreDataDetails.indexOf(item.index) == -1
+	    });
+	  }
+	},
+	/** 复选框选中数据 */
+	handleScoreDataDetailsSelectionChange(selection) {
+	  this.checkedScoreDataDetails = selection.map(item => item.index)
+	},
+	/** 成绩_子序号 */
+	rowScoreDataDetailsIndex({ row, rowIndex }) {
+	  row.index = rowIndex + 1;
+	},
+    /** 删除按钮操作 */
+    handleDelete(row) {
+      const postIds = row.recordId || this.ids;
+      delReservat(postIds).then(response => {
+       this.$modal.msgSuccess("操作成功");
+        this.getList();
+      });
+
+      // this.$modal.confirm('是否确认删除数据项?').then(function() {
+      //   return delPost(postIds);
+      // }).then(() => {
+      //   this.getList();
+      //   this.$modal.msgSuccess("删除成功");
+      // }).catch(() => {});
+    },
+    handleDeletehx(row) {
+      const postIds = row.reservatId || this.ids;
+      let nhg={}
+      nhg.reservatId = postIds
+      delReservathx(nhg).then(response => {
+       this.$modal.msgSuccess("操作成功");
+        this.getList();
+      });
+
+      // this.$modal.confirm('是否确认删除数据项?').then(function() {
+      //   return delPost(postIds);
+      // }).then(() => {
+      //   this.getList();
+      //   this.$modal.msgSuccess("删除成功");
+      // }).catch(() => {});
+    },
+	// 发送短信
+	handleUpdatefas(row){
+		updateFs(row).then(response => {
+		 this.$modal.msgSuccess("发送成功");
+		  // this.getList();
+		});
+	},
+	handleDeletegx(row){
+		updateGx(row).then(response => {
+		  this.$modal.msgSuccess("发送成功");
+		  // this.getList();
+		});
+	},
+    /** 导出按钮操作 */
+    handleExport() {
+      this.download('system/reservat/export', {
+        ...this.queryParams
+      }, `预约人员.xlsx`)
+    },
+		// 获取屏幕高度
+		showFilterForm () {
+		      this.filterActive = !this.filterActive
+		      this.changeTableMaxHeight()
+		    },
+
+		    changeTableMaxHeight () {
+		      let height = document.body.offsetHeight // 网页可视区域高度
+		      // if (this.filterActive) {
+		      //   this.tableMaxHeight = height - 320
+		      // } else {
+		        this.tableMaxHeight = height - 350
+		      // }
+		      console.log(height)
+		    }
+  }
+};
+</script>
+
+<style lang="scss">
+	.isjses{
+		.el-tabs--left .el-tabs__nav-wrap.is-left::after{
+			width:6px;
+		}
+		.el-tabs--left .el-tabs__active-bar.is-left,{
+			width:6px;
+		}
+	}
+	.ingaqe{
+		.el-input--medium{
+			width:100%;
+		}
+	}
+	.nhgrls{
+		.el-dialog__body{
+			padding: 0;
+		}
+	}
+  .hyr{
+    span{
+      text-decoration:underline;
+    }
+  }
+</style>
+<style scoped lang="scss">
+	.nghwgq{
+		display: flex;
+		flex-direction: column;
+		justify-content: center;
+		align-items: center;
+		margin-top: 90px;
+		div{
+			color:#aaa;
+		}
+	}
+	.ihgswq{
+		// width:100%;
+		// overflow-x: hidden;
+		// margin-top: 30px;
+	}
+	.fijge{
+		// width: 110%;
+		display: flex;
+		display: -webkit-flex;
+		justify-content: space-between;
+		.shotw{
+			position: relative;
+			// width:32%;
+			width: 238px;
+			height: 140px;
+			margin-left: 0;
+			margin-right: 20px;
+			margin-bottom: 15px;
+			img{
+				height: 100%;
+				cursor:pointer;
+			}
+		  p{
+			  // bottom:-10px;
+			  margin: 0;
+			  font-weight: bold;
+			  font-size: 16px;
+			   padding: 5px  10px;
+			   cursor:pointer;
+		  }
+		  .iges{
+			position: absolute;
+			top:50%;
+			left:50%;
+			width:30px;
+			height: 30px;
+			transform: translate(-50%,-50%);
+			cursor:pointer;
+		  }
+		}
+	}
+	.nhgwesvq{
+		width:1610px !important;
+	}
+	.shotw{
+		position: relative;
+		margin-left: -20px;
+		margin-right: -20px;
+		img{
+			width:100%;
+			height: 80vh;
+		}
+	  p{
+	     position: absolute;
+		 bottom: 0;
+		 left:0;
+		 background-color: rgba(0, 0, 0, .5);
+		 width: 100%;
+		 padding: 13px  5px;
+		 color:#fff;
+		 font-weight: bold;
+		 font-size: 18px;
+	  }
+	  .p{
+		  top:0px;
+		  height: 60px;
+		  margin: 0;
+		  padding-left: 20px;
+	  }
+	}
+
+
+	.ksfpo{
+		background-color: #3464EB;
+		padding: 6px 12px;
+		border-radius: 4px ;
+		color:#fff;
+		cursor:pointer;
+	}
+	.ksfpok{
+		background-color: #FFFFFF;
+		padding: 5px 11px;
+		border-radius: 4px;
+		color:#3464EB;
+		border: 1px solid #3464EB;
+		margin-left: 10px;
+		cursor:pointer;
+	}
+	.ksfpofg{
+		background-color: #75DB75;
+		padding: 5px 11px;
+		border-radius: 4px;
+		color:#FFFFFF;
+		border: 1px solid #75DB75;
+		margin-left: 10px;
+		cursor:pointer;
+	}
+  .iuer{
+    display: flex;
+    justify-content: space-between;
+    align-items: center;
+    .ite{
+      display: flex;
+      justify-content: space-between;
+      align-items: center;
+      p{
+        cursor:pointer;
+        margin: 0;
+        font-size: 15px;
+        font-family: PingFang SC;
+        font-weight: 500;
+        color:#666666;
+        padding: 4px 12px;
+        background: #Fff;
+        border-radius: 4px;
+        margin-right: 20px;
+		position: relative;
+      }
+      .actt{
+        background: #fff;
+        // border-bottom: 3px solid #5974E0;
+        // border-radius: 0;
+		// border-bottom-right-radius: 4px;
+        color: #5974E0;
+      }
+	  .actt{
+		    &::after {
+		          content: "";
+		          width: 40%;
+		          height: 5px;
+				  border-radius: 3px;
+		          transform: translate(-50%);
+		          background-color: #5974E0;
+		          position: absolute;
+		          left: 50%;
+		          bottom:-3px;
+		        }
+
+	  }
+
+    }
+  }
+  .lqw{
+    padding: 0 10px;
+    margin: 0;
+    margin-bottom: 20px;
+  }
+.nhgel{
+  height: 170px;
+  background-color: #313b61;
+  width: 100%;
+  position: absolute;
+  top:0;
+  left:0;
+  z-index: 0;
+}
+	.app-container{
+		background-color: #f3f4f6;
+		padding-top: 10px;
+		height: 180vh;
+
+	}
+	.ntgs{
+	position: relative;
+		// background-color: #fff;
+		padding: 5px;
+		// border-radius: 5px;
+		padding-top: 10px;
+	     padding: 10px 20px;
+		.pagination-container{
+			height: 50px;
+		}
+	}
+	.nghfs{
+	position: relative;
+		background-color: #fff;
+		padding-top: 18px !important;
+		padding: 5px;
+		// border-radius: 5px;
+		// margin-bottom: 20px;
+	}
+	.ksf{
+		img{
+			width:100%;
+			height: 100%;
+		}
+	}
+   .ingwfaq{
+	   font-weight: bold;
+	   font-size: 16px;
+   }
+</style>

+ 476 - 0
ruoyi-ui/src/views/shipinggaoj/shebei/index.vue

@@ -0,0 +1,476 @@
+<template>
+  <div class="app-container">
+    <div style="background-color: #fff;padding: 20px;border-radius: 10px; padding-bottom: 0;">
+                  <p style="margin: 0; font-weight: 800;font-size: 16px;color: #343434;display: flex;align-items: center;margin-bottom: 20px;border-left: 6px solid #03BF8A;margin-left: -20px;">
+                    <!-- <img src="../../../assets/images/icon_htgl_btzs.png" alt="" style="width: 16px;height: 20px;"> -->
+                   <span style="margin-left: 10px;">搜索条件</span>
+                  </p>
+                  <div style="padding-bottom: 0;margin-bottom: 20px;">
+                    <el-form class="qucheu" :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="88px">
+                      <el-row>
+
+                        <el-col :span="24">
+                          <el-col :span="8">
+                            <el-form-item label="设备编号" prop="equipmentNum">
+                                    <el-input
+                                      v-model="queryParams.equipmentNum"
+                                      placeholder="请输入设备编号"
+                                      clearable
+                                      @keyup.enter.native="handleQuery"
+                                    />
+                                  </el-form-item>
+                          </el-col>
+                          <el-col :span="8">
+                           <el-form-item label="设备名称" prop="equipmentName">
+                                   <el-input
+                                   style="width: 100%;"
+                                     v-model="queryParams.equipmentName"
+                                     placeholder="请输入设备名称"
+                                     clearable
+                                     @keyup.enter.native="handleQuery"
+                                   />
+                                 </el-form-item>
+                          </el-col>
+                          <el-col :span="8">
+                             <el-form-item label="安装时间" prop="equipmentTime">
+                                     <el-date-picker style="width: 100%;" clearable
+                                       v-model="queryParams.equipmentTime"
+                                       type="date"
+                                       value-format="yyyy-MM-dd"
+                                       placeholder="请选择安装时间">
+                                     </el-date-picker>
+                                   </el-form-item>
+                          </el-col>
+
+                        </el-col>
+                        <el-col :span="8">
+                          <el-form-item label="运行状态" prop="runState">
+                                 <el-select v-model="queryParams.manualType" placeholder="请选择运行状态" clearable>
+                                    <el-option
+                                    v-for="dict in dict.type.sys_job_status"
+                                                                        :key="dict.value"
+                                                                        :label="dict.label"
+                                                                        :value="dict.value"
+                                                                      />
+                                                                    </el-select>
+                                </el-form-item>
+
+                        </el-col>
+
+                        <el-col :span="8">
+                          <el-form-item label="设备地址" prop="equipmentAddress">
+                                  <el-input
+                                    v-model="queryParams.equipmentAddress"
+                                    placeholder="请输入设备地址"
+                                    clearable
+                                    @keyup.enter.native="handleQuery"
+                                  />
+                                </el-form-item>
+                        </el-col>
+
+                        <el-col :span="5">
+                          <el-form-item class="butt" style="border: 0;">
+                            <el-button style="background-color: #03BF8A; border-color: #03BF8A;" type="primary" size="mini"  @click="handleQuery">查询 </el-button>
+                            <el-button size="mini"  @click="resetQuery">重置</el-button>
+                          </el-form-item>
+                        </el-col>
+                      </el-row>
+
+                    </el-form>
+                  </div>
+                </div>
+
+    <el-row :gutter="10" class="mb8">
+      <el-col :span="1.5">
+        <el-button
+          type="success"
+          plain
+          size="mini"
+          @click="handleAdd"
+          v-hasPermi="['system:equipmentManage: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:equipmentManage:edit']"
+        >修改</el-button>
+      </el-col> -->
+      <el-col :span="1.5">
+        <el-button
+          type="danger"
+          plain
+          size="mini"
+          :disabled="multiple"
+          @click="handleDelete"
+          v-hasPermi="['system:equipmentManage:remove']"
+        >删除</el-button>
+      </el-col>
+      <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
+    </el-row>
+
+    <el-table :height="tableMaxHeight" v-loading="loading" :data="equipmentManageList" @selection-change="handleSelectionChange">
+      <el-table-column type="selection" width="55" align="center" />
+      <el-table-column label="设备编号" align="center" prop="equipmentNum" show-overflow-tooltip/>
+            <el-table-column label="设备名称" align="center" prop="equipmentName" show-overflow-tooltip/>
+            <el-table-column label="设备类型" align="center" prop="equipmentType" show-overflow-tooltip>
+              <template slot-scope="scope">
+                <dict-tag :options="dict.type.shebie_type" :value="scope.row.equipmentType"/>
+              </template>
+            </el-table-column>
+            <el-table-column label="设备地址" align="center" prop="equipmentAddress" show-overflow-tooltip />
+            <el-table-column label="设备区域" align="center" prop="equipmentRegion" show-overflow-tooltip />
+            <el-table-column label="安装时间" align="center" prop="equipmentTime" width="180">
+              <template slot-scope="scope">
+                <span>{{ scope.row.equipmentTime }}</span>
+              </template>
+            </el-table-column>
+            <el-table-column label="设备状态" align="center" key="runState" >
+              <template slot-scope="scope">
+                <el-switch v-model="scope.row.runState" active-value="0" inactive-value="1" @change="handleStatusChange(scope.row)"></el-switch>
+              </template>
+            </el-table-column>
+            <el-table-column label="设备图片" align="center" prop="equipmentImage" width="100">
+              <template slot-scope="scope">
+                <image-preview :src="scope.row.equipmentImage" :width="50" :height="50"/>
+              </template>
+            </el-table-column>
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+        <template slot-scope="scope">
+          <el-button
+            size="mini"
+            style="width: 42px;height: 26px;"
+           type="success"
+           plain
+            @click="handleUpdate(scope.row)"
+            v-hasPermi="['system:equipmentManage:edit']"
+          >修改</el-button>
+          <el-button
+            size="mini"
+            type="text"
+            style="width: 42px;height: 26px;background: #FFF1EA;
+                   border-radius: 4px;border: 1px solid #FE570E;color: #FE570E;"
+            @click="handleDelete(scope.row)"
+            v-hasPermi="['system:equipmentManage: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="780px" append-to-body>
+      <el-form ref="form" :model="form" :rules="rules" label-width="80px">
+        <el-row>
+          <el-col :span="12">
+            <el-form-item label="设备编号" prop="equipmentNum">
+                      <el-input v-model="form.equipmentNum" placeholder="请输入设备编号" />
+                    </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="设备名称" prop="equipmentName">
+                      <el-input v-model="form.equipmentName" placeholder="请输入设备名称" />
+                    </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="设备区域" prop="equipmentRegion">
+                      <el-input v-model="form.equipmentRegion" placeholder="请输入设备区域" />
+                    </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="设备地址" prop="equipmentAddress">
+                      <el-input v-model="form.equipmentAddress" placeholder="请输入设备地址" />
+                    </el-form-item>
+          </el-col>
+
+          <el-col :span="12">
+             <el-form-item label="安装时间" prop="equipmentTime">
+                      <el-date-picker style="width: 100%;" clearable
+                        v-model="form.equipmentTime"
+                        type="date"
+                        value-format="yyyy-MM-dd"
+                        placeholder="请选择安装时间">
+                      </el-date-picker>
+                    </el-form-item>
+          </el-col>
+          <el-col :span="12">
+             <el-form-item label="运行状态" prop="runState">
+               <el-select style="width: 100%;" v-model="form.runState" placeholder="请选择运行状态" >
+                    <el-option
+                      v-for="dict in dict.type.sys_job_status"
+                      :key="dict.value"
+                      :label="dict.label"
+                      :value="dict.value"
+                       />
+                    </el-select>
+             </el-form-item>
+          </el-col>
+          <el-col :span="12">
+             <el-form-item label="设备类型" prop="equipmentType">
+                       <el-select style="width: 100%;"  v-model="form.equipmentType" placeholder="请选择设备类型">
+                         <el-option
+                           v-for="dict in dict.type.shebie_type"
+                           :key="dict.value"
+                           :label="dict.label"
+                           :value="dict.value"
+                         ></el-option>
+                       </el-select>
+                     </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="备注" prop="remark">
+                      <el-input v-model="form.remark"  placeholder="请输入内容" />
+                    </el-form-item>
+          </el-col>
+          <el-col :span="24">
+            <el-form-item label="设备图片" prop="equipmentImage">
+                      <image-upload v-model="form.equipmentImage"/>
+                    </el-form-item>
+          </el-col>
+
+        </el-row>
+      </el-form>
+       <div slot="footer" class="dialog-footer">
+              <el-button style="background-color:#03BF8A ; border-color: #03BF8A;" type="primary" @click="submitForm">确 定</el-button>
+              <el-button style="background-color:#DDEBE7 ; border-color: #DDEBE7; color: #475669;" @click="cancel">取 消</el-button>
+            </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import { listEquipmentManage, getEquipmentManage, delEquipmentManage, addEquipmentManage, updateEquipmentManage } from "@/api/manage/equipmentManage"
+
+export default {
+  name: "EquipmentManage",
+  dicts: ['sys_job_status', 'sys_notice_type','shebie_type'],
+  data() {
+    return {
+      // 遮罩层
+      // 遮罩层
+            loading: true,
+            // 选中数组
+            ids: [],
+            // 非单个禁用
+            single: true,
+            // 非多个禁用
+            multiple: true,
+            // 显示搜索条件
+            showSearch: true,
+            // 总条数
+            total: 0,
+            // 设备管理表格数据
+            equipmentManageList: [],
+            // 弹出层标题
+            title: "",
+            // 是否显示弹出层
+            open: false,
+            // 查询参数
+            queryParams: {
+              pageNum: 1,
+              pageSize: 10,
+              equipmentNum: null,
+              equipmentName: null,
+              equipmentType: null,
+              equipmentAddress: null,
+              equipmentRegion: null,
+              equipmentTime: null,
+              equipmentImage: null,
+              runState: null,
+            },
+            // 表单参数
+            form: {},
+            // 表单校验
+            rules: {
+            },
+      tableMaxHeight:'200',
+    }
+  },
+  created() {
+    this.getList()
+   window.onresize = () => {
+        	      this.changeTableMaxHeight()
+        	    }
+        	    this.changeTableMaxHeight()
+      },
+      mounted() {
+      	window.onresize = () => {
+      	          this.changeTableMaxHeight()
+      	        }
+      	        this.changeTableMaxHeight()
+      },
+  methods: {
+    /** 查询设备管理列表 */
+        getList() {
+          this.loading = true
+          listEquipmentManage(this.queryParams).then(response => {
+            this.equipmentManageList = response.rows
+            this.total = response.total
+            this.loading = false
+          })
+        },
+        // 取消按钮
+        cancel() {
+          this.open = false
+          this.reset()
+        },
+        // 获取当前时间
+        gettime(){
+          let nowDate = new Date()
+          				  let date = {
+          				    year: nowDate.getFullYear(),
+          				    month: nowDate.getMonth() + 1,
+          				    date: nowDate.getDate()
+          				  }
+                     if (parseInt(date.month) < 10) {
+                        date.month = '0' + date.month
+                      }
+          				   if (parseInt(date.date) < 10) {
+          				      date.date = '0' + date.date
+          				    }
+                      let nghe = date.year + '-' + date.month + '-' + date.date
+          				  return nghe
+
+        },
+        // 表单重置
+        reset() {
+          this.form = {
+            equipmentId: null,
+            equipmentNum: null,
+            equipmentName: null,
+            equipmentType: null,
+            equipmentAddress: null,
+            equipmentRegion: null,
+            equipmentTime: this.gettime(),
+            equipmentImage: null,
+            runState: '0',
+            delFlag: null,
+            createBy: null,
+            createTime: null,
+            updateBy: null,
+            updateTime: null,
+            remark: 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.equipmentId)
+          this.single = selection.length!==1
+          this.multiple = !selection.length
+        },
+        /** 新增按钮操作 */
+        handleAdd() {
+          this.reset()
+          this.open = true
+          this.title = "添加设备管理"
+        },
+        /** 修改按钮操作 */
+        handleUpdate(row) {
+          this.reset()
+          const equipmentId = row.equipmentId || this.ids
+          getEquipmentManage(equipmentId).then(response => {
+            this.form = response.data
+            this.open = true
+            this.title = "修改设备管理"
+          })
+        },
+        /** 提交按钮 */
+        submitForm() {
+          this.$refs["form"].validate(valid => {
+            if (valid) {
+              if (this.form.equipmentId != null) {
+                updateEquipmentManage(this.form).then(response => {
+                  this.$modal.msgSuccess("修改成功")
+                  this.open = false
+                  this.getList()
+                })
+              } else {
+                addEquipmentManage(this.form).then(response => {
+                  this.$modal.msgSuccess("新增成功")
+                  this.open = false
+                  this.getList()
+                })
+              }
+            }
+          })
+        },
+    handleStatusChange(row) {
+      let text = row.status === "0" ? "启用" : "停用"
+      updateEquipmentManage(row).then(response => {
+        this.$modal.msgSuccess("操作成功")
+        row.status = row.status === "0" ? "1" : "0"
+        this.getList()
+
+      })
+    },
+    /** 删除按钮操作 */
+        handleDelete(row) {
+          const equipmentIds = row.equipmentId || this.ids
+          this.$modal.confirm('是否确认删除设备管理数据项?').then(function() {
+            return delEquipmentManage(equipmentIds)
+          }).then(() => {
+            this.getList()
+            this.$modal.msgSuccess("删除成功")
+          }).catch(() => {})
+        },
+         handleExport() {
+              this.download('system/equipmentManage/export', {
+                ...this.queryParams
+              }, `equipmentManage_${new Date().getTime()}.xlsx`)
+            },
+    // 获取屏幕高度
+                showFilterForm () {
+                      this.filterActive = !this.filterActive
+                      this.changeTableMaxHeight()
+                    },
+
+                    changeTableMaxHeight () {
+                      let height = document.body.offsetHeight // 网页可视区域高度
+                      // if (this.filterActive) {
+                      //   this.tableMaxHeight = height - 320
+                      // } else {
+                        this.tableMaxHeight = height - 250
+                      // }
+                      console.log(height)
+                    }
+  }
+}
+</script>
+<style>
+  .el-table .el-table__header-wrapper th, .el-table .el-table__fixed-header-wrapper th{
+    background-color:#F5F6F8;
+  }
+  .el-checkbox__input.is-checked .el-checkbox__inner{
+    background-color: #03BF8A;
+    border-color: #03BF8A;
+  }
+  .el-checkbox__input.is-indeterminate .el-checkbox__inner{
+    background-color: #03BF8A;
+    border-color: #03BF8A;
+  }
+
+
+</style>

+ 415 - 0
ruoyi-ui/src/views/shipinggaoj/taskManage/index.vue

@@ -0,0 +1,415 @@
+<template>
+  <div class="app-container">
+    <div style="background-color: #fff;padding: 20px;border-radius: 10px; padding-bottom: 0;">
+                  <p style="margin: 0; font-weight: 800;font-size: 16px;color: #343434;display: flex;align-items: center;margin-bottom: 20px;border-left: 6px solid #03BF8A;margin-left: -20px;">
+                    <!-- <img src="../../../assets/images/icon_htgl_btzs.png" alt="" style="width: 16px;height: 20px;"> -->
+                   <span style="margin-left: 10px;">搜索条件</span>
+                  </p>
+                  <div style="padding-bottom: 0;margin-bottom: 20px;">
+    <el-form class="qucheu" :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="88px">
+      <el-form-item label="任务编号" prop="taskNum">
+        <el-input
+          v-model="queryParams.taskNum"
+          placeholder="请输入任务编号"
+          clearable
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item style="border: 0;">
+        <el-button style="background-color: #03BF8A; border-color: #03BF8A;" type="primary"  size="mini" @click="handleQuery">搜索</el-button>
+        <el-button  size="mini" @click="resetQuery">重置</el-button>
+      </el-form-item>
+    </el-form>
+    </div>
+    </div>
+
+    <el-row :gutter="10" class="mb8">
+      <el-col :span="1.5">
+        <el-button
+          type="success"
+          plain
+          size="mini"
+          @click="handleAdd"
+          v-hasPermi="['manage:taskManage: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="['manage:taskManage:edit']"
+        >修改</el-button>
+      </el-col> -->
+      <el-col :span="1.5">
+        <el-button
+          type="danger"
+          plain
+          size="mini"
+          :disabled="multiple"
+          @click="handleDelete"
+          v-hasPermi="['manage:taskManage:remove']"
+        >删除</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="warning"
+          plain
+          size="mini"
+          @click="handleExport"
+          v-hasPermi="['manage:taskManage:export']"
+        >导出</el-button>
+      </el-col>
+      <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
+    </el-row>
+
+    <el-table :height="tableMaxHeight" v-loading="loading" :data="taskManageList" @selection-change="handleSelectionChange">
+      <el-table-column type="selection" width="55" align="center" />
+      <el-table-column label="任务编号" align="center" prop="taskNum" />
+      <el-table-column label="任务描述" align="center" prop="taskDetails" />
+      <el-table-column label="通道ID" align="center" prop="channelId" />
+      <el-table-column label="视频地址" align="center" prop="videoAddress" />
+      <el-table-column label="上报地址" align="center" prop="reportAddress" />
+      <el-table-column label="算法编号" align="center" prop="algorithmSet" />
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+        <template slot-scope="scope">
+          <el-button
+            size="mini"
+                                   style="width: 42px;height: 26px;
+                                   background: #E5F9F3;
+                                          border-radius: 4px;border: 1px solid #03BF8A;color: #03BF8A;
+                                   "
+                                  type="text"
+            @click="handleUpdate(scope.row)"
+            v-hasPermi="['manage:taskManage:edit']"
+          >修改</el-button>
+          <el-button
+            size="mini"
+                                   type="text"
+                                   style="width: 42px;height: 26px;background: #FFF1EA;
+                                          border-radius: 4px;border: 1px solid #FE570E;color: #FE570E;"
+            @click="handleDelete(scope.row)"
+            v-hasPermi="['manage:taskManage: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="700px" append-to-body>
+      <el-form ref="form" :model="form" :rules="rules" label-width="80px">
+        <el-row>
+          <el-col :span="12">
+            <el-form-item label="任务编号" prop="taskNum">
+              <el-input v-model="form.taskNum" placeholder="请输入任务编号" />
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="视频地址" prop="videoAddress">
+              <el-input v-model="form.videoAddress" placeholder="请输入视频地址" />
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="上报地址" prop="reportAddress">
+              <el-input v-model="form.reportAddress" placeholder="请输入上报地址" />
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="通道编号" prop="channelId">
+               <el-select style="width: 100%;" v-model="form.channelId" placeholder="请选择通道ID">
+                  <el-option
+                  v-for="dict in channelNumberList "
+                  :key="dict.channelId"
+                  :label="dict.channelNum"
+                  :value="dict.channelId"
+                  ></el-option>
+                </el-select>
+            </el-form-item>
+          </el-col>
+          <el-col :span="24">
+            <el-form-item label="算法编号" prop="algorithmSet">
+              <el-select multiple  style="width: 100%;" v-model="form.algorithmSet" placeholder="请选择算法编号">
+                                <el-option
+                                v-for="dict in dict.type.algorithm_settings"
+                                :key="dict.value"
+                                :label="dict.label"
+                                :value="dict.value"
+                                ></el-option>
+               </el-select>
+            </el-form-item>
+          </el-col>
+
+
+          <el-col :span="12">
+            <el-form-item label="任务描述" prop="taskDetails">
+              <el-input v-model="form.taskDetails"  placeholder="请输入内容" />
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="备注" prop="remark">
+              <el-input v-model="form.remark"  placeholder="请输入内容" />
+            </el-form-item>
+          </el-col>
+
+        </el-row>
+
+
+        <!-- <el-form-item label="通道ID" prop="channelId">
+          <el-input v-model="form.channelId" placeholder="请输入通道ID" />
+        </el-form-item> -->
+
+
+
+
+
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+         <el-button style="background-color:#03BF8A ; border-color: #03BF8A;" type="primary" @click="submitForm">确 定</el-button>
+                <el-button style="background-color:#DDEBE7 ; border-color: #DDEBE7; color: #475669;" @click="cancel">取 消</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import { listTaskManage, getTaskManage, delTaskManage, addTaskManage, updateTaskManage } from "@/api/manage/taskManage"
+import { listChannelNumber, getChannelNumber, delChannelNumber, addChannelNumber, updateChannelNumber } from "@/api/system/channelNumber"
+export default {
+  name: "TaskManage",
+  dicts: ['algorithm_settings'],
+  data() {
+    return {
+      // 遮罩层
+      loading: true,
+      // 选中数组
+      ids: [],
+      // 非单个禁用
+      single: true,
+      // 非多个禁用
+      multiple: true,
+      // 显示搜索条件
+      showSearch: true,
+      // 总条数
+      total: 0,
+      // 任务管理表格数据
+      taskManageList: [],
+      channelNumberList:[],
+      // 弹出层标题
+      title: "",
+      // 是否显示弹出层
+      open: false,
+      // 查询参数
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        taskNum: null,
+        taskDetails: null,
+        channelId: null,
+        videoAddress: null,
+        reportAddress: null,
+        algorithmSet: null,
+      },
+      // 表单参数
+      form: {},
+      // 表单校验
+      rules: {
+        taskNum: [
+                  { required: true, message: "不能为空", trigger: "blur" }
+                ],
+        algorithmSet: [
+                  { required: true, message: "不能为空", trigger: "blur" }
+                ],
+      },
+      tableMaxHeight:'200',
+    }
+  },
+  created() {
+    this.getList()
+    this.getListt()
+   window.onresize = () => {
+      	      this.changeTableMaxHeight()
+      	    }
+      	    this.changeTableMaxHeight()
+    },
+    mounted() {
+    	window.onresize = () => {
+    	          this.changeTableMaxHeight()
+    	        }
+    	        this.changeTableMaxHeight()
+    },
+  methods: {
+    /** 查询任务管理列表 */
+    getList() {
+      this.loading = true
+      listTaskManage(this.queryParams).then(response => {
+        this.taskManageList = response.rows
+        this.total = response.total
+        this.loading = false
+      })
+    },
+    /** 查询通道管理列表 */
+    getListt() {
+      this.loading = true
+      let snge={
+        pageNum: 1,
+        pageSize: 200,
+      }
+      listChannelNumber(snge).then(response => {
+        this.channelNumberList = response.rows
+        this.loading = false
+      })
+    },
+    // 取消按钮
+    cancel() {
+      this.open = false
+      this.reset()
+    },
+    // 表单重置
+    reset() {
+      this.form = {
+        taskId: null,
+        taskNum: null,
+        taskDetails: null,
+        channelId: null,
+        videoAddress: null,
+        reportAddress: null,
+        algorithmSet: null,
+        delFlag: null,
+        createBy: null,
+        createTime: null,
+        updateBy: null,
+        updateTime: null,
+        remark: 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.taskId)
+      this.single = selection.length!==1
+      this.multiple = !selection.length
+    },
+    /** 新增按钮操作 */
+    handleAdd() {
+      this.reset()
+      this.open = true
+      this.title = "添加任务管理"
+    },
+    /** 修改按钮操作 */
+    handleUpdate(row) {
+      this.reset()
+      const taskId = row.taskId || this.ids
+      getTaskManage(taskId).then(response => {
+        this.form = response.data
+        if(this.form.algorithmSet != null){
+          if(this.form.algorithmSet.length !=0){
+            this.form.algorithmSet = this.form.algorithmSet.split(',')
+          }
+        }
+        this.open = true
+        this.title = "修改任务管理"
+      })
+    },
+    /** 提交按钮 */
+    submitForm() {
+      this.$refs["form"].validate(valid => {
+        if (valid) {
+          if(this.form.algorithmSet != null){
+            if(this.form.algorithmSet.length !=0){
+              this.form.algorithmSet = this.form.algorithmSet.join(',')
+            }
+          }
+          if (this.form.taskId != null) {
+            updateTaskManage(this.form).then(response => {
+              this.$modal.msgSuccess("修改成功")
+              this.open = false
+              this.getList()
+            })
+          } else {
+            addTaskManage(this.form).then(response => {
+              this.$modal.msgSuccess("新增成功")
+              this.open = false
+              this.getList()
+            })
+          }
+        }
+      })
+    },
+    /** 删除按钮操作 */
+    handleDelete(row) {
+      const taskIds = row.taskId || this.ids
+      this.$modal.confirm('是否确认删除任务管理编号为"' + taskIds + '"的数据项?').then(function() {
+        return delTaskManage(taskIds)
+      }).then(() => {
+        this.getList()
+        this.$modal.msgSuccess("删除成功")
+      }).catch(() => {})
+    },
+    /** 导出按钮操作 */
+    handleExport() {
+      this.download('manage/taskManage/export', {
+        ...this.queryParams
+      }, `taskManage_${new Date().getTime()}.xlsx`)
+    },
+    // 获取屏幕高度
+            showFilterForm () {
+                  this.filterActive = !this.filterActive
+                  this.changeTableMaxHeight()
+                },
+
+                changeTableMaxHeight () {
+                  let height = document.body.offsetHeight // 网页可视区域高度
+                  // if (this.filterActive) {
+                  //   this.tableMaxHeight = height - 320
+                  // } else {
+                    this.tableMaxHeight = height - 250
+                  // }
+                  console.log(height)
+                }
+  }
+}
+</script>
+<style lang="scss">
+  .el-table .el-table__header-wrapper th, .el-table .el-table__fixed-header-wrapper th{
+    background-color:#F5F6F8;
+  }
+  .el-checkbox__input.is-checked .el-checkbox__inner{
+    background-color: #03BF8A;
+    border-color: #03BF8A;
+  }
+  .el-checkbox__input.is-indeterminate .el-checkbox__inner{
+    background-color: #03BF8A;
+    border-color: #03BF8A;
+  }
+  .qucheu{
+    .el-form-item--small.el-form-item{
+      border: 1px  solid #E6E6E6;
+    }
+    .el-input__inner{
+      border:0;
+    }
+  }
+
+
+</style>

+ 1 - 1
ruoyi-ui/src/views/system/dept/index.vue

@@ -1,6 +1,6 @@
 <template>
   <div class="app-container">
-    <el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch">
+    <el-form style="background-color: #fff;padding: 10px;border-radius: 10px;margin-bottom: 20px;" :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch">
       <el-form-item label="部门名称" prop="deptName">
         <el-input
           v-model="queryParams.deptName"

+ 2 - 2
ruoyi-ui/src/views/system/dict/data.vue

@@ -1,6 +1,6 @@
 <template>
   <div class="app-container">
-    <el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
+    <el-form style="background-color: #fff;padding: 10px;border-radius: 10px;margin-bottom: 20px;" :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
       <el-form-item label="字典名称" prop="dictType">
         <el-select v-model="queryParams.dictType">
           <el-option
@@ -399,4 +399,4 @@ export default {
     }
   }
 }
-</script>
+</script>

+ 2 - 2
ruoyi-ui/src/views/system/dict/index.vue

@@ -1,6 +1,6 @@
 <template>
   <div class="app-container">
-    <el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
+    <el-form style="background-color: #fff;padding: 10px;border-radius: 10px;margin-bottom: 20px;" :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
       <el-form-item label="字典名称" prop="dictName">
         <el-input
           v-model="queryParams.dictName"
@@ -344,4 +344,4 @@ export default {
     }
   }
 }
-</script>
+</script>

+ 1 - 1
ruoyi-ui/src/views/system/menu/index.vue

@@ -1,6 +1,6 @@
 <template>
   <div class="app-container">
-    <el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch">
+    <el-form style="background-color: #fff;padding: 10px;border-radius: 10px;margin-bottom: 20px;" :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch">
       <el-form-item label="菜单名称" prop="menuName">
         <el-input
           v-model="queryParams.menuName"

+ 2 - 2
ruoyi-ui/src/views/system/role/index.vue

@@ -1,6 +1,6 @@
 <template>
   <div class="app-container">
-    <el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch">
+    <el-form style="background-color: #fff;padding: 10px;border-radius: 10px;margin-bottom: 20px;" :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch">
       <el-form-item label="角色名称" prop="roleName">
         <el-input
           v-model="queryParams.roleName"
@@ -602,4 +602,4 @@ export default {
     }
   }
 }
-</script>
+</script>

+ 13 - 5
ruoyi-ui/src/views/system/user/index.vue

@@ -1,9 +1,9 @@
 <template>
-  <div class="app-container">
+  <div class="app-container heue">
     <el-row :gutter="20">
       <splitpanes :horizontal="this.$store.getters.device === 'mobile'" class="default-theme">
         <!--部门数据-->
-        <pane size="16">
+        <!-- <pane size="16">
           <el-col>
             <div class="head-container">
               <el-input v-model="deptName" placeholder="请输入部门名称" clearable size="small" prefix-icon="el-icon-search" style="margin-bottom: 20px" />
@@ -12,11 +12,11 @@
               <el-tree :data="deptOptions" :props="defaultProps" :expand-on-click-node="false" :filter-node-method="filterNode" ref="tree" node-key="id" default-expand-all highlight-current @node-click="handleNodeClick" />
             </div>
           </el-col>
-        </pane>
+        </pane> -->
         <!--用户数据-->
         <pane size="84">
           <el-col>
-            <el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
+            <el-form style="background-color: #fff;padding: 10px;border-radius: 10px;margin-bottom: 20px;" :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
               <el-form-item label="用户名称" prop="userName">
                 <el-input v-model="queryParams.userName" placeholder="请输入用户名称" clearable style="width: 240px" @keyup.enter.native="handleQuery" />
               </el-form-item>
@@ -550,4 +550,12 @@ export default {
     }
   }
 }
-</script>
+</script>
+<style>
+  .heue{
+    height: 100vh;
+  }
+  .heue .splitpanes.default-theme .splitpanes__pane{
+    background: linear-gradient(180deg, #E7F5F1, #F6F9FA);
+  }
+</style>

+ 40 - 12
ruoyi-ui/src/views/system/user/profile/userAvatar.vue

@@ -132,18 +132,46 @@ export default {
     },
     // 上传图片
     uploadImg() {
-      this.$refs.cropper.getCropBlob(data => {
-        let formData = new FormData()
-        formData.append("avatarfile", data, this.options.filename)
-        uploadAvatar(formData).then(response => {
-          this.open = false
-          this.options.img = process.env.VUE_APP_BASE_API + response.imgUrl
-          store.commit('SET_AVATAR', this.options.img)
-          this.$modal.msgSuccess("修改成功")
-          this.visible = false
-        })
-      })
-    },
+          console.log(this.options)
+          this.$refs.cropper.getCropBlob(data => {
+            // 将base64的数据部分提取出来
+              const parts = this.options.img.split(';base64,');
+              const contentType = parts[0].split(':')[1];
+              const raw = atob(parts[1]);
+              // 将原始数据转换为Uint8Array
+              const rawLength = raw.length;
+              const uInt8Array = new Uint8Array(rawLength);
+              for (let i = 0; i < rawLength; ++i) {
+                uInt8Array[i] = raw.charCodeAt(i);
+              }
+              // 使用Blob创建一个新的文件
+                const blob = new Blob([uInt8Array], {type: contentType});
+                // 创建File对象
+                  const file = new File([blob], 'image.png', {type: contentType});
+            let formData = new FormData();
+            // let  dar={'name':this.options.img,'filePath':this.options.img}
+            // // 将对象转换为 JSON 字符串
+            //       const jsonString = JSON.stringify(dar);
+            //       // 创建一个 Blob 对象
+            //       const blob = new Blob([jsonString], { type: 'application/json' });
+            //       // 创建一个读取 Blob 的流
+            //       const stream = blob.stream();
+            //       console.log(data,stream,5)
+
+                    // 转为 base64
+                    // let reader = new FileReader();
+            formData.append("avatarfile", file);
+            // let file = formData.get("avatarfile");
+            console.log(file)
+            uploadAvatar(formData).then(response => {
+              this.open = false;
+              this.options.img = process.env.VUE_APP_BASE_API + response.imgUrl;
+              store.commit('SET_AVATAR', this.options.img);
+              this.$modal.msgSuccess("修改成功");
+              this.visible = false;
+            });
+          });
+        },
     // 实时预览
     realTime(data) {
       this.previews = data

+ 3 - 2
ruoyi-ui/vue.config.js

@@ -1,5 +1,6 @@
 'use strict'
 const path = require('path')
+const defaultSettings = require('./src/settings.js')
 
 function resolve(dir) {
   return path.join(__dirname, dir)
@@ -7,9 +8,9 @@ function resolve(dir) {
 
 const CompressionPlugin = require('compression-webpack-plugin')
 
-const name = process.env.VUE_APP_TITLE || '若依管理系统' // 网页标题
+const name = process.env.VUE_APP_TITLE || 'AI-Hub智能处理平台' // 网页标题
 
-const baseUrl = 'http://localhost:8080' // 后端接口
+const baseUrl = defaultSettings.urls // 后端接口
 
 const port = process.env.port || process.env.npm_config_port || 80 // 端口