فهرست منبع

feat:水电水计和管理机列表页面

zhb 9 ماه پیش
والد
کامیت
fc0c1fb6f3
100فایلهای تغییر یافته به همراه1393 افزوده شده و 28 حذف شده
  1. 367 0
      src/api/iotm/buglight/index.js
  2. 577 0
      src/api/iotm/insectLamp/index.js
  3. 10 0
      src/api/iotm/supplier/index.js
  4. BIN
      src/assets/icons/PlanNoData.png
  5. BIN
      src/assets/icons/air.png
  6. BIN
      src/assets/icons/air_humidity.png
  7. BIN
      src/assets/icons/air_pressure.png
  8. BIN
      src/assets/icons/air_pressure_analog.png
  9. BIN
      src/assets/icons/air_pressure_digital.png
  10. BIN
      src/assets/icons/air_temperature.png
  11. BIN
      src/assets/icons/altitude.png
  12. BIN
      src/assets/icons/ammonia.png
  13. BIN
      src/assets/icons/ammonia_nitrogen.png
  14. BIN
      src/assets/icons/co.png
  15. BIN
      src/assets/icons/co2.png
  16. BIN
      src/assets/icons/current.png
  17. BIN
      src/assets/icons/dew_point_temperature.png
  18. BIN
      src/assets/icons/diffuse_radiation.png
  19. BIN
      src/assets/icons/direct_radiation.png
  20. BIN
      src/assets/icons/direction.png
  21. BIN
      src/assets/icons/dissolved_oxygen.png
  22. BIN
      src/assets/icons/dust.png
  23. BIN
      src/assets/icons/ec.png
  24. BIN
      src/assets/icons/evaporation.png
  25. BIN
      src/assets/icons/feng-open.png
  26. BIN
      src/assets/icons/feng.png
  27. BIN
      src/assets/icons/flowStatistics.png
  28. BIN
      src/assets/icons/has_rainsnow.png
  29. BIN
      src/assets/icons/heat_flux.png
  30. BIN
      src/assets/icons/humidity.png
  31. BIN
      src/assets/icons/icon-monitor-open.png
  32. BIN
      src/assets/icons/icon-monitor.png
  33. BIN
      src/assets/icons/illumination.png
  34. BIN
      src/assets/icons/irrigation-open.png
  35. BIN
      src/assets/icons/irrigation.png
  36. BIN
      src/assets/icons/juan-open.png
  37. BIN
      src/assets/icons/juan.png
  38. BIN
      src/assets/icons/latitude.png
  39. BIN
      src/assets/icons/lights.png
  40. BIN
      src/assets/icons/liquid_level.png
  41. BIN
      src/assets/icons/longitude.png
  42. BIN
      src/assets/icons/lst.png
  43. BIN
      src/assets/icons/lsw.png
  44. BIN
      src/assets/icons/nai.png
  45. BIN
      src/assets/icons/nitrogen.png
  46. BIN
      src/assets/icons/noise.png
  47. BIN
      src/assets/icons/par.png
  48. BIN
      src/assets/icons/patch_temperature.png
  49. BIN
      src/assets/icons/ph.png
  50. BIN
      src/assets/icons/phosphorus.png
  51. BIN
      src/assets/icons/pm.png
  52. BIN
      src/assets/icons/pm10.png
  53. BIN
      src/assets/icons/pm2.png
  54. BIN
      src/assets/icons/pm25.png
  55. BIN
      src/assets/icons/potassium.png
  56. BIN
      src/assets/icons/radiant_exposure.png
  57. BIN
      src/assets/icons/radiation.png
  58. BIN
      src/assets/icons/radiation_sum.png
  59. BIN
      src/assets/icons/rainfall.png
  60. BIN
      src/assets/icons/rainfall_sum.png
  61. BIN
      src/assets/icons/salinity.png
  62. BIN
      src/assets/icons/seston.png
  63. BIN
      src/assets/icons/sf.png
  64. BIN
      src/assets/icons/signal.png
  65. BIN
      src/assets/icons/soil_humidity.png
  66. BIN
      src/assets/icons/soil_ph.png
  67. BIN
      src/assets/icons/soil_temperature.png
  68. BIN
      src/assets/icons/soilconstant.png
  69. BIN
      src/assets/icons/soiltemp.png
  70. BIN
      src/assets/icons/stem.png
  71. BIN
      src/assets/icons/steriliser-open.png
  72. BIN
      src/assets/icons/steriliser.png
  73. BIN
      src/assets/icons/sunlight.png
  74. BIN
      src/assets/icons/swp.png
  75. BIN
      src/assets/icons/tbq_radiation_sum.png
  76. BIN
      src/assets/icons/temp.png
  77. BIN
      src/assets/icons/temperature.png
  78. BIN
      src/assets/icons/tilth.png
  79. BIN
      src/assets/icons/transparency.png
  80. BIN
      src/assets/icons/turbidity.png
  81. BIN
      src/assets/icons/ultrasonic_wind_speed.png
  82. BIN
      src/assets/icons/uv.png
  83. BIN
      src/assets/icons/visibility.png
  84. BIN
      src/assets/icons/voltage.png
  85. BIN
      src/assets/icons/water.png
  86. BIN
      src/assets/icons/water_level.png
  87. BIN
      src/assets/icons/water_temperature.png
  88. BIN
      src/assets/icons/weatherStation.png
  89. BIN
      src/assets/icons/weatherStation2.png
  90. BIN
      src/assets/icons/windDirection.png
  91. BIN
      src/assets/icons/wind_direction.png
  92. BIN
      src/assets/icons/wind_velocity.png
  93. BIN
      src/assets/icons/wind_velocity_avg.png
  94. BIN
      src/assets/icons/wind_velocity_max.png
  95. 12 0
      src/assets/styles/variables.scss
  96. 130 0
      src/components/Dialog/index.vue
  97. 126 19
      src/components/Table/index.vue
  98. 112 9
      src/layout/CommonLayout.vue
  99. 59 0
      src/layout/components/PageHeader/index.vue
  100. 0 0
      src/main.js

+ 367 - 0
src/api/iotm/buglight/index.js

@@ -0,0 +1,367 @@
+import request from '@/utils/request';
+// 数据日志
+export const dateList = (params) => {
+  return request({
+    url: '/iotmprod-api/iot/device/cbd/data/list',
+    method: 'get',
+    params
+  });
+};
+export const datebzyList = (params) => {
+  return request({
+    url: '/iotmprod-api/iot/device/bzy/data/list',
+    method: 'get',
+    params
+  });
+};
+// 编辑测报灯配置
+export const configEdit = (data) => {
+  return request({
+    url: '/device/cbd/config/edit',
+    method: 'post',
+    data
+  });
+};
+// 杀虫灯配置
+export const scdControlEdit = (data) => {
+  return request({
+    url: '/iotmprod-api/iot/scd/yf/control/edit',
+    method: 'post',
+    data
+  });
+};
+// 查询孢子仪设备上报接口
+export const configBzyEdit = (data) => {
+  return request({
+    url: '/device/bzy/config/edit',
+    method: 'post',
+    data
+  });
+};
+//
+export const dateBzyList = (params) => {
+  return request({
+    url: '/device/bzy/list',
+    method: 'get',
+    params
+  });
+};
+// 编辑测报灯配置
+export const deviceconfigInfo = (params) => {
+  return request({
+    url: '/iotmprod-api/iot/deviceconfig/info',
+    method: 'get',
+    params
+  });
+};
+// 查询设备列表
+export const firmList = (params) => {
+  return request({
+    url: '/iotmprod-api/iot/firm/list',
+    method: 'get',
+    params
+  });
+};
+// 新增厂商
+export const firmAdd = (data) => {
+  return request({
+    url: '/iotmprod-api/iot/firm/add',
+    method: 'post',
+    data
+  });
+};
+// 编辑厂商
+export const firmEdit = (data) => {
+  return request({
+    url: '/iotmprod-api/iot/firm/edit',
+    method: 'put',
+    data
+  });
+};
+// 删除厂商
+export const firmDelet = (params) => {
+  return request({
+    url: '/iotmprod-api/iot/firm/delete',
+    method: 'delete',
+    params
+  });
+};
+// 查询厂商配置信息
+export const firmdevlist = (params) => {
+  return request({
+    url: '/iotmprod-api/iot/firmdev/list',
+    method: 'get',
+    params
+  });
+};
+// 设备类型列表
+export const devicetypelist = (params) => {
+  return request({
+    url: '/iotmprod-api/iot/devicetype/list',
+    method: 'get',
+    params
+  });
+};
+// 设备类型列表
+export const devicetypetype = (pid) => {
+  return request({
+    url: `/iotmprod-api/iot/devicetype/type/${pid}`,
+    method: 'get'
+  });
+};
+// 配置信息
+export const batchAdd = (data) => {
+  return request({
+    url: '/iotmprod-api/iot/firmdev/batch/add',
+    method: 'post',
+    data
+  });
+};
+// 识别数据列表
+export const pestrecogList = (params) => {
+  return request({
+    url: '/iotmprod-api/iot/pestrecog/list',
+    method: 'get',
+    params: { ...params, orderByColumn: 'pestrecogCreatedDate', isAsc: 'desc' }
+  });
+};
+// 识别数据害虫列表
+export const pestList = (params) => {
+  return request({
+    url: '/iotmprod-api/iot/pestrecog/group/pest/list',
+    method: 'get',
+    params
+  });
+};
+// 导出识别数据
+export const dataExport = (params) => {
+  return request({
+    url: 'iot/pestrecog/data/export',
+    method: 'get',
+    params
+  });
+};
+// 获取水肥机配置
+export const ctrlList = (deviceId) => {
+  return request({
+    url: `/iotmprod-api/iot/sf/bind/ctrl/already/list/${deviceId}`,
+    method: 'get'
+  });
+};
+// 获取水肥机配置
+export const ctrlSend = (data) => {
+  return request({
+    url: `/iotmprod-api/iot/sf/bind/common/ctrl/send`,
+    method: 'post',
+    data
+  });
+};
+// 获取水肥机执行日志;
+export const logList = (params) => {
+  return request({
+    url: `/iotmprod-api/iot/cmd/log/list`,
+    method: 'get',
+    params
+  });
+};
+// 获取水肥机执行日志;
+export const infoStatus = (deviceId) => {
+  return request({
+    url: `/iotmprod-api/iot/sf/bind/info/status/${deviceId}`,
+    method: 'get'
+  });
+};
+// 获取水肥机的可控设备
+export const bindctrlList = (deviceId) => {
+  return request({
+    url: `/iotmprod-api/iot/sf/bind/ctrl/list/${deviceId}`,
+    method: 'get'
+  });
+};
+// 删除绑定
+export const deleteBind = (deviceId) => {
+  return request({
+    url: `/iotmprod-api/iot/sf/bind/delete/${deviceId}`,
+    method: 'delete'
+  });
+};
+// 添加
+export const bucketAdd = (data) => {
+  return request({
+    url: `/iotmprod-api/iot/sf/bind/add`,
+    method: 'post',
+    data
+  });
+};
+export const addBucketAdd = (data) => {
+  return request({
+    url: '/iotmprod-api/iot/sf/bind//bucket/add',
+    method: 'post',
+    data
+  });
+};
+export const bucketUpdate = (data) => {
+  return request({
+    url: '/iotmprod-api/iot/sf/bind/bucket/update',
+    method: 'post',
+    data
+  });
+};
+// 修改电磁阀和肥泵水泵
+export const bindUpdate = (data) => {
+  return request({
+    url: '/iotmprod-api/iot/sf/bind/update',
+    method: 'post',
+    data
+  });
+};
+
+export function deviceBzyStat(params) {
+  return request({
+    url: `/device/bzy/ath/stat`,
+    method: 'get',
+    params: params
+  });
+}
+// 清虫
+export function clearProgress(devBid) {
+  return request({
+    url: `/iotmprod-api/iot/scd/yf/clear/${devBid}`,
+    method: 'get'
+  });
+}
+// 获取杀虫灯数据列表
+export function yfDataList(params) {
+  return request({
+    url: `/iotmprod-api/iot/scd/yf/data/list`,
+    method: 'get',
+    params
+  });
+}
+// 获取杀虫灯折线图列表
+export function yfPolyline(params) {
+  return request({
+    url: `/iotmprod-api/iot/scd/yf/polyline`,
+    method: 'get',
+    params
+  });
+}
+export function deviceconfigEdit(data) {
+  return request({
+    url: `/iotmprod-api/iot/deviceconfig/edit`,
+    method: 'put',
+    data
+  });
+}
+export function deviceExtEdit(data) {
+  return request({
+    url: `/iotmprod-api/iot/device/ext/edit`,
+    method: 'put',
+    data
+  });
+}
+export function deviceRefresh(devBid) {
+  return request({
+    url: `/iotmprod-api/iot/device/refresh/${devBid}`,
+    method: 'get'
+  });
+}
+export function cmdtaskList(params) {
+  return request({
+    url: `iot/cmdtask/list`,
+    method: 'get',
+    params
+  });
+}
+export function firmdevList(params) {
+  return request({
+    url: `/iotmprod-api/iot/firmdev/list`,
+    method: 'get',
+    params
+  });
+}
+// 新增设备配置
+export const firmdevAdd = (data) => {
+  return request({
+    url: '/iotmprod-api/iot/firmdev/add',
+    method: 'post',
+    data
+  });
+};
+// 编辑设备配置
+export const firmdevEdit = (data) => {
+  return request({
+    url: '/iotmprod-api/iot/firmdev/edit',
+    method: 'put',
+    data
+  });
+};
+// 删除设备配置
+export const firmdevDelete = (firmBids) => {
+  return request({
+    url: `/iotmprod-api/iot/firmdev/delete/${firmBids}`,
+    method: 'delete'
+  });
+};
+// 控制设置列表
+export function autoconfigList(params) {
+  return request({
+    url: `/iotmprod-api/iot/autoconfig/list`,
+    method: 'get',
+    params
+  });
+}
+// 控制设置新增
+export const autoconfigAdd = (data) => {
+  return request({
+    url: '/iotmprod-api/iot/autoconfig/add',
+    method: 'post',
+    data
+  });
+};
+// 控制设置编辑
+export const autoconfigEdit = (data) => {
+  return request({
+    url: '/iotmprod-api/iot/autoconfig/edit',
+    method: 'put',
+    data
+  });
+};
+// 条件数据项列表
+export function dataitemList(devBid) {
+  return request({
+    url: `/iotmprod-api/iot/autoconfig/dataitem/list/${devBid}`,
+    method: 'get'
+  });
+}
+// 控制设置删除
+export const autoconfigDelete = (acBid) => {
+  return request({
+    url: `/iotmprod-api/iot/autoconfig/delete/${acBid}`,
+    method: 'delete'
+  });
+};
+
+// 获取控制设置详情
+export const autoconfigInfo = (acBid) => {
+  return request({
+    url: `/iotmprod-api/iot/autoconfig/info/${acBid}`,
+    method: 'get'
+  });
+};
+// 获取操作记录
+export const autologList = (params) => {
+  return request({
+    url: `/iotmprod-api/iot/autolog/list`,
+    method: 'get',
+    params
+  });
+};
+// 控制设置启动/禁用
+export const autoconfigeEable = (data) => {
+  return request({
+    url: `/iotmprod-api/iot/autoconfig/enable`,
+    method: 'put',
+    data
+  });
+};

+ 577 - 0
src/api/iotm/insectLamp/index.js

@@ -0,0 +1,577 @@
+import request from '@/utils/request';
+
+// 查询测报灯列表
+export function iotdeviceList(query) {
+  return request({
+    url: '/iotmprod-api/iot/device/list',
+    method: 'get',
+    params: {
+      ...query,
+      orderByColumn: 'devCreateddate desc,devBid',
+      isAsc: 'desc'
+    }
+  });
+}
+// 性诱3 列表
+export function iotXY3deviceList(query) {
+  return request({
+    url: '/iotmprod-api/iot/device/xyIII/list',
+    method: 'get',
+    params: {
+      ...query,
+      orderByColumn: 'devCreateddate desc,devBid',
+      isAsc: 'desc'
+    }
+  });
+}
+
+// 查询水肥列表
+export function iotSfdeviceList(query) {
+  return request({
+    url: '/iotmprod-api/iot/device/sf/list',
+    method: 'get',
+    params: {
+      ...query,
+      orderByColumn: 'devCreateddate desc,devBid',
+      isAsc: 'desc'
+    }
+  });
+}
+export function warnconfigdevlist(query) {
+  return request({
+    url: '/iotmprod-api/iot/warnconfig/devlist',
+    method: 'get',
+    params: query
+  });
+}
+export function sporeList(query) {
+  return request({
+    url: '/iotmprod-api/iot/spore/list',
+    method: 'get',
+    params: query
+  });
+}
+//测报灯编辑设备信息
+export function iotdeviceEdit(data) {
+  return request({
+    url: '/iotmprod-api/iot/device/edit',
+    method: 'put',
+    data
+  });
+}
+//设备详情
+export function iotdeviceInfo(query) {
+  return request({
+    url: '/iotmprod-api/iot/device/info',
+    method: 'get',
+    params: query
+  });
+}
+// 删除设备
+export function iotdeviceDelete(query) {
+  return request({
+    url: '/iotmprod-api/iot/device/delete',
+    method: 'delete',
+    params: query
+  });
+}
+//根据害虫进行区分统计
+export function pestrecogGroupName(query) {
+  return request({
+    url: '/iotmprod-api/iot/pestrecog/group/name',
+    method: 'get',
+    params: query
+  });
+}
+//查询害虫信息
+export function iotpestInfo(query) {
+  return request({
+    url: '/iotmprod-api/iot/pest/info',
+    method: 'get',
+    params: query
+  });
+}
+//根据害虫业务标识查询始见期高峰期终见期
+export function iotpestrecogPeriod(query) {
+  return request({
+    url: '/iotmprod-api/iot/pestrecog/period',
+    method: 'get',
+    params: query
+  });
+}
+//虫情趋势矩阵
+export function pestrecogGroupDate(query) {
+  return request({
+    url: '/iotmprod-api/iot/pestrecog/group/date/name',
+    method: 'get',
+    params: query
+  });
+}
+
+//增加设备
+export function iotdeviceAdd(data) {
+  return request({
+    url: '/iotmprod-api/iot/device/add',
+    method: 'post',
+    data: data
+  });
+}
+//灭菌设备控制接口
+export function iotHpfZnkgCtrl(data) {
+  return request({
+    url: '/iotmprod-api/iot/hpf/znkg/ctrl',
+    method: 'post',
+    data: data
+  });
+}
+//文件导入设备
+export function iotdeviceImport(data) {
+  return request({
+    url: '/iotmprod-api/iot/device/import',
+    method: 'post',
+    data: data
+  });
+}
+export function pestTakePhoto(devBid, params) {
+  return request({
+    url: `/device/cbd/takephoto/${devBid}`,
+    method: 'get',
+    params
+  });
+}
+export function postCbdrecogAgain(data) {
+  return request({
+    url: `/iotmprod-api/iot/cbdrecog/again`,
+    method: 'post',
+    data
+  });
+}
+export function pestBzyTakePhoto(devBid, params) {
+  return request({
+    url: `/device/bzy/takephoto/${devBid}`,
+    method: 'get',
+    params
+  });
+}
+export function fetchWarntypeList(params) {
+  return request({
+    url: `/iotmprod-api/iot/warnconfig/warntype/list`,
+    method: 'get',
+    params
+  });
+}
+
+// 获取虫情数据识别统计数据
+export function fetchPestIdentifyStatistics(params) {
+  return request({
+    url: `/iotmprod-api/iot/cbdimg/sum/info`,
+    method: 'get',
+    params
+  });
+}
+// 获取孢子数据识别统计数据
+export function fetchbzyimgStatistics(params) {
+  return request({
+    url: `/iotmprod-api/iot/bzyimg/sum/info`,
+    method: 'get',
+    params
+  });
+}
+
+// 获取图片识别率折线图数据
+export function fetchPestImgIdentifyLineDataList(params) {
+  return request({
+    url: `/iotmprod-api/iot/cbdimg/group/date/list`,
+    method: 'get',
+    params
+  });
+}
+// 获取图片识别率折线图数据
+export function fetchByzPestImgIdentifyLineDataList(params) {
+  return request({
+    url: `/iotmprod-api/iot/bzyimg/group/date/list`,
+    method: 'get',
+    params
+  });
+}
+// 获取图片识别详情
+export function fetchPestImgIdentifyDetail(params) {
+  return request({
+    url: `/iotmprod-api/iot/cbdrecog/info`,
+    method: 'get',
+    params
+  });
+}
+// 获取图片识别详情
+export function fetchBzyPestImgIdentifyDetail(params) {
+  return request({
+    url: `/iotmprod-api/iot/bzyrecog/info`,
+    method: 'get',
+    params
+  });
+}
+// 获取图片列表
+export function fetchPestImgDataSourceList(params) {
+  return request({
+    url: `/iotmprod-api/iot/cbdimg/list`,
+    method: 'get',
+    params: { ...params, orderByColumn: 'cbdimgCreatedDate', isAsc: 'desc' }
+  });
+}
+// 获取图片列表
+export function fetchBzyimgImgDataSourceList(params) {
+  return request({
+    url: `/iotmprod-api/iot/bzyimg/list`,
+    method: 'get',
+    params: { ...params, orderByColumn: 'bzyimgCreatedDate', isAsc: 'desc' }
+  });
+}
+export function updateCBDManualMarkData(data) {
+  return request({
+    url: `/iotmprod-api/iot/cbdrecog/artificial/update`,
+    method: 'post',
+    data
+  });
+}
+export function updateBZYManualMarkData(data) {
+  return request({
+    url: `/iotmprod-api/iot/bzyrecog/artificial/update`,
+    method: 'post',
+    data
+  });
+}
+export function resetCBDManualMarkData(data) {
+  return request({
+    url: `/iotmprod-api/iot/cbdrecog/artificial/reset`,
+    method: 'post',
+    data
+  });
+}
+export function resetBZYManualMarkData(data) {
+  return request({
+    url: `/iotmprod-api/iot/bzyrecog/artificial/reset`,
+    method: 'post',
+    data
+  });
+}
+
+export function multiDeletePestImgList(params) {
+  return request({
+    url: `/iotmprod-api/iot/cbdimg/delete`,
+    method: 'delete',
+    params
+  });
+}
+export function multibzyDeletePestImgList(params) {
+  return request({
+    url: `/iotmprod-api/iot/bzyimg/delete`,
+    method: 'delete',
+    params
+  });
+}
+// 设备即时数据
+export function iotdataList(query) {
+  const { devBid } = query;
+  return request({
+    url: `/iotmprod-api/iot/device/data/latest/${devBid}`,
+    method: 'get'
+  });
+}
+// 设备24小时(最大值、最小值)数据
+export function iotdataLast(query) {
+  const { devBid } = query;
+  return request({
+    url: `/iotmprod-api/iot/device/data/last24h/${devBid}`,
+    method: 'get'
+  });
+}
+// 设备历史数据列表(时间段查询)
+export function iotdeviceDataList(query) {
+  return request({
+    url: '/iotmprod-api/iot/device/data/list',
+    method: 'get',
+    params: { orderByColumn: 'time', isAsc: 'desc', ...query }
+  });
+}
+// 卷膜控制状态查询接口
+export function iotdeviceCtrlstatus(query) {
+  const { devBid } = query;
+  return request({
+    url: `/iotmprod-api/iot/device/ctrlstatus/${devBid}`,
+    method: 'get',
+    params: { ...query, orderByColumn: 'devUpdateddate', isAsc: 'desc' }
+  });
+}
+// 卷膜控制接口
+export function deviceCtrl(data) {
+  return request({
+    url: `/iotmprod-api/iot/device/ctrl`,
+    method: 'post',
+    data
+  });
+}
+
+// 批量设置
+export function factorBatchEdit(data) {
+  return request({
+    url: `/iotmprod-api/iot/device/factor/batchedit`,
+    method: 'put',
+    data
+  });
+}
+// 查询托管设备列表
+export function hostingList(params) {
+  return request({
+    url: `/iotmprod-api/iot/device/hosting/list`,
+    method: 'get',
+    params
+  });
+}
+// 托管任务执行详情
+export function hostingTaskInfo(params) {
+  return request({
+    url: `/iotmprod-api/iot/device/hosting/task/info`,
+    method: 'get',
+    params
+  });
+}
+// 托管开启中止
+export function hostingTaskctrl(data) {
+  return request({
+    url: `/iotmprod-api/iot/device/hosting/task/ctrl`,
+    method: 'post',
+    data
+  });
+}
+
+// 执行记录
+export function hostingTasklog(params) {
+  return request({
+    url: `/iotmprod-api/iot/device/hosting/task/list`,
+    method: 'get',
+    params
+  });
+}
+// 任务执行进度信息
+export function hostingProgress(params) {
+  return request({
+    url: `/iotmprod-api/iot/device/hosting/task/progress`,
+    method: 'get',
+    params
+  });
+}
+// 云飞植保专家ai接口
+//http://api.nyzhwlw.com:10004/api/v1/get_kdxf_contxt?contxt=%E6%A3%89%E9%93%83%E8%99%AB
+export function apikdxfcontext(params) {
+  return request({
+    url: `http://api.nyzhwlw.com:10004/api/v1/get_kdxf_contxt`,
+    method: 'get',
+    params: params
+  });
+}
+
+// 水肥编辑
+export const sfEdit = (data) => {
+  return request({
+    url: '/iotmprod-api/iot/device/sf/edit',
+    method: 'post',
+    data
+  });
+};
+// 水肥编辑
+export const landLimit = (landId) => {
+  return request({
+    url: `iot/device/sf/land/limit/${landId}`,
+    method: 'get'
+  });
+};
+export const dataList = (params) => {
+  return request({
+    url: `/ybq/data/predict/list`,
+    method: 'get',
+    params
+  });
+};
+// 气象数据列表
+export const envList = (params) => {
+  return request({
+    url: `/ybq/data/env/list`,
+    method: 'get',
+    params
+  });
+}; // 气象数据折线图
+export const envStat = (params) => {
+  return request({
+    url: `/ybq/data/env/stat`,
+    method: 'get',
+    params
+  });
+};
+// 获取性诱测报数据列表
+export const xycbDataList = (params) => {
+  return request({
+    url: `/iotmprod-api/iot/xycb/data/list`,
+    method: 'get',
+    params
+  });
+};
+// 获取性诱测报折线图数据
+export const xycbPolyline = (params) => {
+  return request({
+    url: `/iotmprod-api/iot/xycb/polyline`,
+    method: 'get',
+    params
+  });
+};
+//获取性诱测报设备信息
+export const xycbInfo = (params) => {
+  return request({
+    url: `/iotmprod-api/iot/xycb/info`,
+    method: 'get',
+    params
+  });
+};
+//设置诱芯列表信息
+export const xycbLureList = (params) => {
+  return request({
+    url: `/iotmprod-api/iot/xycb/lure/list`,
+    method: 'get',
+    params
+  });
+};
+//修改诱芯信息
+export const xycbLure = (data) => {
+  return request({
+    url: `/iotmprod-api/iot/xycb/lure`,
+    method: 'post',
+    data
+  });
+};
+// 新浦会温室控制设备控制接口
+export const xphWskzbLure = (data) => {
+  return request({
+    url: `/iotmprod-api/iot/xph/wskz/ctrl`,
+    method: 'post',
+    data
+  });
+};
+//获取设备控制日志列表接口
+export const ctrlLog = (params) => {
+  return request({
+    url: `/iotmprod-api/iot/xph/ctrl/log`,
+    method: 'get',
+    params
+  });
+};
+//获取新浦会可控制设备列表接口
+export const ctrlDeviceList = (params) => {
+  return request({
+    url: `/iotmprod-api/iot/xph/ctrl/list`,
+    method: 'get',
+    params
+  });
+};
+
+export const addDiySporoImg = (data) => {
+  return request({
+    url: `/iotmprod-api/iot/bzyimg/add`,
+    method: 'post',
+    data
+  });
+};
+
+// 获取图片识别详情
+export function fetchBzbzyPestImgIdentifyDetail(params) {
+  return request({
+    url: `/iotmprod-api/iot/bzyrecog/disease/info`,
+    method: 'get',
+    params
+  });
+}
+
+export function updateBZBZYManualMarkData(data) {
+  return request({
+    url: `/iotmprod-api/iot/bzyrecog/disease/update`,
+    method: 'post',
+    data
+  });
+}
+
+export function fetchZWBXList(params) {
+  return request({
+    url: `/iotmprod-api/iot/zwbx/list`,
+    method: 'get',
+    params
+  });
+}
+
+export function addZWBXRecordData(data) {
+  return request({
+    url: `/iotmprod-api/iot/zwbx/add`,
+    method: 'post',
+    data
+  });
+}
+
+export function updateZWBXRecordData(data) {
+  return request({
+    url: `/iotmprod-api/iot/zwbx/edit`,
+    method: 'put',
+    data
+  });
+}
+
+export function deleteZWBXRecordData(bids, data) {
+  return request({
+    url: `/iotmprod-api/iot/zwbx/delete/${bids}`,
+    method: 'delete',
+    data
+  });
+}
+
+export function fetchZWBXRecordData(bid) {
+  return request({
+    url: `/iotmprod-api/iot/zwbx/info/${bid}`,
+    method: 'get'
+  });
+}
+
+export function fetchJHWList(params) {
+  return request({
+    url: `/iotmprod-api/iot/jhw/list`,
+    method: 'get',
+    params
+  });
+}
+
+export function addJHWRecordData(data) {
+  return request({
+    url: `/iotmprod-api/iot/jhw/add`,
+    method: 'post',
+    data
+  });
+}
+
+export function updateJHWRecordData(data) {
+  return request({
+    url: `/iotmprod-api/iot/jhw/edit`,
+    method: 'put',
+    data
+  });
+}
+
+export function deleteJHWRecordData(bids, data) {
+  return request({
+    url: `/iotmprod-api/iot/jhw/delete/${bids}`,
+    method: 'delete',
+    data
+  });
+}
+
+export function getxycbImageList(params) {
+  return request({
+    url: `/iotmprod-api/iot/xycb/image/list`,
+    method: 'get',
+    params
+  });
+}

+ 10 - 0
src/api/iotm/supplier/index.js

@@ -0,0 +1,10 @@
+import request from '@/utils/request';
+
+// 查询供应商列表
+export function iotfirmList(query) {
+  return request({
+    url: '/iotmprod-api/iot/firm/list',
+    method: 'get',
+    params: query
+  });
+}

BIN
src/assets/icons/PlanNoData.png


BIN
src/assets/icons/air.png


BIN
src/assets/icons/air_humidity.png


BIN
src/assets/icons/air_pressure.png


BIN
src/assets/icons/air_pressure_analog.png


BIN
src/assets/icons/air_pressure_digital.png


BIN
src/assets/icons/air_temperature.png


BIN
src/assets/icons/altitude.png


BIN
src/assets/icons/ammonia.png


BIN
src/assets/icons/ammonia_nitrogen.png


BIN
src/assets/icons/co.png


BIN
src/assets/icons/co2.png


BIN
src/assets/icons/current.png


BIN
src/assets/icons/dew_point_temperature.png


BIN
src/assets/icons/diffuse_radiation.png


BIN
src/assets/icons/direct_radiation.png


BIN
src/assets/icons/direction.png


BIN
src/assets/icons/dissolved_oxygen.png


BIN
src/assets/icons/dust.png


BIN
src/assets/icons/ec.png


BIN
src/assets/icons/evaporation.png


BIN
src/assets/icons/feng-open.png


BIN
src/assets/icons/feng.png


BIN
src/assets/icons/flowStatistics.png


BIN
src/assets/icons/has_rainsnow.png


BIN
src/assets/icons/heat_flux.png


BIN
src/assets/icons/humidity.png


BIN
src/assets/icons/icon-monitor-open.png


BIN
src/assets/icons/icon-monitor.png


BIN
src/assets/icons/illumination.png


BIN
src/assets/icons/irrigation-open.png


BIN
src/assets/icons/irrigation.png


BIN
src/assets/icons/juan-open.png


BIN
src/assets/icons/juan.png


BIN
src/assets/icons/latitude.png


BIN
src/assets/icons/lights.png


BIN
src/assets/icons/liquid_level.png


BIN
src/assets/icons/longitude.png


BIN
src/assets/icons/lst.png


BIN
src/assets/icons/lsw.png


BIN
src/assets/icons/nai.png


BIN
src/assets/icons/nitrogen.png


BIN
src/assets/icons/noise.png


BIN
src/assets/icons/par.png


BIN
src/assets/icons/patch_temperature.png


BIN
src/assets/icons/ph.png


BIN
src/assets/icons/phosphorus.png


BIN
src/assets/icons/pm.png


BIN
src/assets/icons/pm10.png


BIN
src/assets/icons/pm2.png


BIN
src/assets/icons/pm25.png


BIN
src/assets/icons/potassium.png


BIN
src/assets/icons/radiant_exposure.png


BIN
src/assets/icons/radiation.png


BIN
src/assets/icons/radiation_sum.png


BIN
src/assets/icons/rainfall.png


BIN
src/assets/icons/rainfall_sum.png


BIN
src/assets/icons/salinity.png


BIN
src/assets/icons/seston.png


BIN
src/assets/icons/sf.png


BIN
src/assets/icons/signal.png


BIN
src/assets/icons/soil_humidity.png


BIN
src/assets/icons/soil_ph.png


BIN
src/assets/icons/soil_temperature.png


BIN
src/assets/icons/soilconstant.png


BIN
src/assets/icons/soiltemp.png


BIN
src/assets/icons/stem.png


BIN
src/assets/icons/steriliser-open.png


BIN
src/assets/icons/steriliser.png


BIN
src/assets/icons/sunlight.png


BIN
src/assets/icons/swp.png


BIN
src/assets/icons/tbq_radiation_sum.png


BIN
src/assets/icons/temp.png


BIN
src/assets/icons/temperature.png


BIN
src/assets/icons/tilth.png


BIN
src/assets/icons/transparency.png


BIN
src/assets/icons/turbidity.png


BIN
src/assets/icons/ultrasonic_wind_speed.png


BIN
src/assets/icons/uv.png


BIN
src/assets/icons/visibility.png


BIN
src/assets/icons/voltage.png


BIN
src/assets/icons/water.png


BIN
src/assets/icons/water_level.png


BIN
src/assets/icons/water_temperature.png


BIN
src/assets/icons/weatherStation.png


BIN
src/assets/icons/weatherStation2.png


BIN
src/assets/icons/windDirection.png


BIN
src/assets/icons/wind_direction.png


BIN
src/assets/icons/wind_velocity.png


BIN
src/assets/icons/wind_velocity_avg.png


BIN
src/assets/icons/wind_velocity_max.png


+ 12 - 0
src/assets/styles/variables.scss

@@ -11,6 +11,7 @@ $panGreen: #30b08f;
 // 默认菜单主题风格
 $base-menu-color: #fff;
 $base-menu-color-active: #14a478;
+$base-menu-color-error: #ff5951;
 $base-menu-background: #192f28;
 $base-menu-active: #193a30;
 $base-logo-title-color: #ffffff;
@@ -61,7 +62,18 @@ $plan-document-title-content-color: #bbbbbb;
   subMenuBackground: $base-sub-menu-background;
   subMenuHover: $base-sub-menu-hover;
   sideBarWidth: $base-sidebar-width;
+  logoBackground: transparent;
+  logoLightBackground: transparent;
   logoTitleColor: $base-logo-title-color;
   logoLightTitleColor: $base-logo-light-title-color;
   homeCropTabButtonBackgroundColor: $home-crop-tab-button-background-color;
 }
+
+//设备列表卡片背景颜色
+$tmn-list-card-bgc-color: #f5f7fa;
+//边框圆角
+$card-border-radius: 4px;
+//盒子内边距
+$card-padding: 16px;
+//设备列表盒子上下之间的外边距
+$card-margin: 16px;

+ 130 - 0
src/components/Dialog/index.vue

@@ -0,0 +1,130 @@
+<template>
+  <el-dialog
+    :visible.sync="dialogVisible"
+    :title="title"
+    :width="width"
+    :append-to-body="true"
+    :close-on-click-modal="false"
+    :close-on-press-escape="false"
+    :destroy-on-close="true"
+    :lock-scroll="false"
+    :top="top"
+    v-bind="args"
+    @open="handleOpen"
+    @close="handleClose"
+    @opened="handleOpened"
+    @closed="handleClosed"
+  >
+    <template #default>
+      <slot></slot>
+    </template>
+    <template #title>
+      <slot name="title"></slot>
+    </template>
+    <template #footer>
+      <slot name="footer"></slot>
+    </template>
+  </el-dialog>
+</template>
+<script>
+export default {
+  props: {
+    visible: {
+      type: Boolean,
+      default: false
+    },
+    title: {
+      type: String,
+      default: ''
+    },
+    width: {
+      type: String,
+      default: '50%'
+    },
+    top: {
+      type: String,
+      default: '15vh'
+    },
+    args: {
+      type: Object,
+      default: () => ({})
+    }
+  },
+  data() {
+    return {
+      dialogVisible: false
+    };
+  },
+  watch: {
+    visible(val) {
+      if (val !== this.dialogVisible) {
+        this.dialogVisible = val;
+      }
+    }
+  },
+  methods: {
+    handleOpen() {
+      this.$emit('open');
+    },
+    handleClose() {
+      this.$emit('update:visible', false);
+      this.$emit('close');
+    },
+    handleOpened() {
+      this.$emit('opened');
+    },
+    handleClosed() {
+      this.$emit('closed');
+    }
+  }
+};
+</script>
+
+<style lang="scss" scoped>
+::v-deep .el-dialog {
+  max-height: 80vh;
+  overflow: hidden;
+
+  &__header {
+    border-bottom: 1px solid #dcdfe6;
+    padding: 8px 24px;
+    border-radius: 4px 4px 0 0;
+  }
+
+  &__title {
+    font-size: 16px;
+    line-height: 24px;
+    color: #303133;
+  }
+
+  &__headerbtn {
+    top: 8px;
+  }
+
+  &__body {
+    padding: 24px;
+    max-height: calc(80vh - 110px);
+    overflow: auto;
+  }
+
+  &__footer {
+    padding: 16px 24px;
+    border-radius: 0 0 4px 4px;
+    border-top: 1px solid #dcdfe6;
+    text-align: right;
+  }
+}
+
+::v-deep .grouprubric {
+  color: #999999;
+  font-size: 13px;
+}
+
+::v-deep .el-form-item {
+  margin-bottom: 18px;
+}
+
+::v-deep .el-dialog__wrapper {
+  overflow: hidden;
+}
+</style>

+ 126 - 19
src/components/Table/index.vue

@@ -1,12 +1,12 @@
 <template>
-  <div>
+  <div class="Btable-container">
     <el-table
       ref="BTable"
       :data="localDataSource"
       :border="border"
       v-bind="args"
-      row-key="id"
-      :show-summary="totalPrice"
+      height="100%"
+      :show-summary="amount"
       :summary-method="getSummaries"
       class="b-table"
       @selection-change="handleSelectionChange"
@@ -14,9 +14,9 @@
       @sort-change="handleSortChange"
       @current-change="handleCurrentChange"
       v-loading="loading"
-      :tree-props="{ children: 'children', hasChildren: 'hasChildren' }"
       :header-row-style="{ background: '#E5EEED' }"
       :header-cell-style="{ background: '#E5EEED' }"
+      row-class-name="my-expand-row"
     >
       <!-- 多选 -->
       <el-table-column
@@ -32,7 +32,7 @@
         align="center"
         label="序号"
         type="index"
-        width="50"
+        width="100"
       ></el-table-column>
       <!-- 普通列 -->
       <template v-for="(item, i) in columns">
@@ -40,6 +40,7 @@
         <el-table-column
           v-if="item.customRender"
           show-overflow-tooltip
+          :fixed="item.fixed"
           v-bind="item"
           :key="i + (item.key || '')"
         >
@@ -47,15 +48,29 @@
             <slot :name="item.customRender" v-bind="scope"></slot>
           </template>
         </el-table-column>
-        <el-table-column v-else v-bind="item" :key="i" />
+        <el-table-column v-else v-bind="item" show-overflow-tooltip :key="i" />
       </template>
+      <el-table-column v-if="isExpand" type="expand">
+        <template slot-scope="scope">
+          <slot v-bind="scope"></slot>
+        </template>
+      </el-table-column>
     </el-table>
     <div v-if="showPagination" class="pagination">
       <el-pagination
         background
-        layout="total, prev, pager, next"
+        @size-change="handleSizeChange"
+        :pager-count="pagerCount"
+        :layout="
+          !isInitlayout
+            ? pageSizes.length > 0
+              ? 'total, sizes,prev, pager, next, jumper'
+              : 'total, prev, pager, next'
+            : layoutInitData
+        "
         :current-page.sync="localPagination.page"
         :page-size="localPagination.perPage"
+        :page-sizes="pageSizes"
         :total="localPagination.total"
         @current-change="handlePageChange"
       ></el-pagination>
@@ -63,7 +78,7 @@
   </div>
 </template>
 <script>
-import { assign } from 'lodash-es';
+import { assign, map, flatMap, values } from 'lodash-es';
 
 export default {
   name: 'BTable',
@@ -72,6 +87,10 @@ export default {
       type: Function,
       required: true
     },
+    pageSizes: {
+      type: Array,
+      default: () => []
+    },
     columns: {
       type: Array,
       required: true
@@ -80,6 +99,14 @@ export default {
       type: Number,
       default: 1
     },
+    isInitlayout: {
+      type: Boolean,
+      default: false
+    },
+    layoutInitData: {
+      type: String,
+      default: 'total, prev, pager, next'
+    },
     perPage: {
       type: Number,
       default: 10
@@ -88,6 +115,10 @@ export default {
       type: Boolean,
       default: true
     },
+    isDefaultLoad: {
+      type: Boolean,
+      default: true
+    },
     isShowIndex: {
       type: Boolean,
       default: false
@@ -96,6 +127,10 @@ export default {
       type: Boolean,
       default: false
     },
+    isExpand: {
+      type: Boolean,
+      default: false
+    },
     args: {
       type: Object,
       default: () => ({})
@@ -108,13 +143,22 @@ export default {
       type: Function,
       default: () => true
     },
+    pagerCount: {
+      type: Number,
+      default: 7
+    },
     border: {
       type: Boolean,
       default: () => false
+    },
+    rowKey: {
+      type: String,
+      default: 'id'
     }
   },
   data() {
     return {
+      isFirstLoad: true,
       totalPrice: false,
       loading: false,
       localPagination: {
@@ -124,6 +168,7 @@ export default {
       },
       localDataSource: [],
       selectedData: [],
+      selectedPageData: {},
       // 默认排序
       defaultSort: { prop: 'loginTime', order: 'descending' }
     };
@@ -134,9 +179,19 @@ export default {
     }
   },
   mounted() {
-    this.loadData();
+    if (this.isDefaultLoad) {
+      this.loadData();
+    }
   },
   methods: {
+    getCellClassName({ column, row }) {
+      if (column.type === 'expand') {
+        return 'move-expand-icon';
+      }
+    },
+    toggleRowExpansion(item, flag) {
+      this.$refs.BTable.toggleRowExpansion(item, flag);
+    },
     // 只计算最后一列的合计
     getSummaries(param) {
       const { columns, data } = param;
@@ -167,9 +222,14 @@ export default {
       return sums;
     },
     getIndex(index) {
-      return (this.localPagination.page - 1) * this.perPage + index + 1;
+      const { page } = this.localPagination;
+      return (page - 1) * 10 + index + 1;
     },
-    loadData(pagination) {
+    loadData(pagination, isReload = false) {
+      if (isReload) {
+        this.selectedPageData = {};
+      }
+
       const { page, perPage } = this.localPagination;
       const parameter = this.showPagination
         ? assign({}, { pageNum: page, pageSize: perPage }, pagination)
@@ -181,11 +241,9 @@ export default {
         typeof result.then === 'function'
       ) {
         this.loading = true;
+
         result
           .then((r) => {
-            if (r.total == undefined) {
-              r.total = r.data.length;
-            }
             const {
               // eslint-disable-next-line camelcase
               total,
@@ -194,7 +252,7 @@ export default {
 
             if (this.showPagination) {
               this.localPagination = assign({}, this.localPagination, {
-                total: total // 返回结果中的总记录数
+                total: total === undefined ? (data && data.length) || 0 : total // 返回结果中的总记录数
               });
               // eslint-disable-next-line camelcase
               this.localDataSource = data || [];
@@ -202,6 +260,21 @@ export default {
               this.localDataSource = r.data;
             }
 
+            // 处理选中状态
+            if (this.isShowSelection) {
+              const currentSelectedIds =
+                this.selectedPageData[this.localPagination.page] || [];
+
+              this.$nextTick(() => {
+                this.localDataSource &&
+                  this.localDataSource.forEach((row) => {
+                    if (currentSelectedIds.includes(row[this.rowKey])) {
+                      this.$refs.BTable.toggleRowSelection(row, true);
+                    }
+                  });
+              });
+            }
+
             this.$emit('data-change', this.localDataSource);
 
             // 动态显示隐藏合计
@@ -209,18 +282,40 @@ export default {
 
             this.loading = false;
           })
+          .catch((err) => {
+            console.error(err);
+          })
           .finally(() => {
             this.loading = false;
+
+            if (this.isFirstLoad) {
+              this.isFirstLoad = false;
+
+              this.$refs.BTable.doLayout();
+            }
           });
       }
     },
     handlePageChange() {
       this.$emit('page-change');
+      this.selectedData =
+        this.selectedPageData[this.localPagination.page] || [];
+      this.loadData({ pageNum: this.localPagination.page });
+    },
+    handleSizeChange(val) {
+      this.localPagination.perPage = val;
+      this.$emit('size-change');
       this.loadData({ pageNum: this.localPagination.page });
     },
     handleSelectionChange(val) {
-      this.selectedData = val;
+      const ids = map(val, this.rowKey);
+      this.selectedData = ids;
+      this.selectedPageData[this.localPagination.page] = ids;
       this.$emit('selection-change', val);
+      this.$emit(
+        'selection-change-all',
+        flatMap(values(this.selectedPageData))
+      );
     },
     handleSelect(val, row) {
       this.$emit('select', val, row);
@@ -240,20 +335,32 @@ export default {
       if (bool) {
         this.localPagination = {
           page: 1,
-          perPage: this.perPage,
+          perPage: this.localPagination.perPage,
           total: 0
         };
       }
 
-      this.loadData();
+      this.loadData(null, bool);
     }
   }
 };
 </script>
 
 <style lang="scss" scoped>
+.Btable-container {
+  width: 100%;
+  height: 100%;
+  display: flex;
+  flex-direction: column;
+  justify-content: space-between;
+
+  ::v-deep .el-table {
+    overflow-y: auto;
+  }
+}
+
 .pagination {
-  margin: 20px 0;
+  margin: 20px 0 10px 0;
   display: flex;
   align-items: center;
   justify-content: flex-end;

+ 112 - 9
src/layout/CommonLayout.vue

@@ -1,37 +1,137 @@
 <template>
-  <div class="common-page">
-    <div class="common-page__header">
-      <slot name="header"></slot>
+  <div class="layout-common-page">
+    <div
+      class="layout-common-page__header"
+      :class="{ 'vertical-none': vertitalPaddingNone }"
+      v-if="$slots.header || showBack"
+    >
+      <PageHeader
+        @back="handleBack"
+        v-if="showBack"
+        :title="headerTitle"
+        :content="headerContent"
+      >
+        <template #content>
+          <slot name="headerContent"></slot>
+        </template>
+      </PageHeader>
+      <div class="layout-common-page__header__main">
+        <slot name="header"></slot>
+      </div>
+      <div v-if="showSelector">
+        <el-date-picker
+          v-model="dateRange"
+          value-format="yyyy-MM-dd HH:mm:ss"
+          type="daterange"
+          range-separator="-"
+          start-placeholder="开始日期"
+          end-placeholder="结束日期"
+          :clearable="false"
+          :default-time="['00:00:00', '23:59:59']"
+          @change="selectorChange"
+        ></el-date-picker>
+      </div>
     </div>
-    <div class="common-page__body">
+    <div class="layout-common-page__body">
       <slot></slot>
     </div>
   </div>
 </template>
 
 <script>
+import PageHeader from './components/PageHeader/index.vue';
+import dayjs from 'dayjs';
+
 export default {
+  props: {
+    showBack: {
+      type: Boolean,
+      default: false
+    },
+    vertitalPaddingNone: {
+      type: Boolean,
+      default: false
+    },
+    headerTitle: {
+      type: String,
+      default: '返回'
+    },
+    headerContent: {
+      type: String,
+      default: ''
+    },
+    showSelector: {
+      type: Boolean,
+      default: false
+    }
+  },
+  components: {
+    PageHeader
+  },
   data() {
-    return {};
+    return {
+      dateRange: [],
+      nowdate: dayjs().endOf('day').format('YYYY-MM-DD HH:mm:ss'),
+      oneMonthAgo: dayjs()
+        .subtract(1, 'month')
+        .startOf('day')
+        .format('YYYY-MM-DD HH:mm:ss')
+    };
+  },
+  created() {
+    this.dateRange = [this.oneMonthAgo, this.nowdate];
+    this.$emit('selectorChange', this.dateRange);
+  },
+  methods: {
+    handleBack() {
+      if (history.length > 1) {
+        this.$router.go(-1);
+      }
+    },
+    selectorChange(date) {
+      this.$emit('selectorChange', date);
+    },
+    handelDate() {
+      this.$emit('selectorChange', []);
+      this.dateRange = [];
+    }
   }
 };
 </script>
 
 <style lang="scss" scoped>
-.common-page {
+.layout-common-page {
   display: flex;
-  padding: 16px;
   flex-direction: column;
   box-sizing: border-box;
-  background-color: #f1f3f4;
+  background-color: #e2ecef;
   height: 100%;
   &__header {
+    width: 100%;
+    padding: 16px 24px;
     flex: 0 0 auto;
-    margin-bottom: 16px;
+    display: flex;
+    align-items: center;
+    justify-content: space-between;
+    background-color: #fff;
+
+    &.vertical-none {
+      padding-top: 0;
+      padding-bottom: 0;
+    }
+
+    &__main {
+      flex: 1 1 auto;
+    }
+
+    ::v-deep .el-form-item {
+      margin-bottom: 0 !important;
+    }
   }
 
   &__body {
     height: 0;
+    padding: 16px;
     flex: 1 1 auto;
     overflow-x: hidden;
     overflow-y: auto;
@@ -39,6 +139,9 @@ export default {
 
   ::v-deep .el-card {
     height: 100%;
+    &__body {
+      height: 100%;
+    }
   }
 }
 </style>

+ 59 - 0
src/layout/components/PageHeader/index.vue

@@ -0,0 +1,59 @@
+<template>
+  <div class="content-header">
+    <div class="content-header__left" @click="$emit('back')">
+      <i class="el-icon-arrow-left header-icon"></i>
+      <div class="content-header__title">
+        <slot name="title">{{ title }}</slot>
+      </div>
+    </div>
+    <div class="content-header__content">
+      <slot name="content">{{ content }}</slot>
+    </div>
+  </div>
+</template>
+
+<script>
+export default {
+  name: 'PageHeader',
+  props: {
+    title: {
+      type: String,
+      default() {
+        return '返回';
+      }
+    },
+    content: String
+  }
+};
+</script>
+
+<style lang="scss" scoped>
+.content-header {
+  display: flex;
+  align-items: center;
+
+  &__left {
+    display: flex;
+    align-items: center;
+    margin-right: 16px;
+    cursor: pointer;
+
+    .header-icon {
+      font-size: 20px;
+      color: #666;
+      margin-right: 4px;
+    }
+  }
+
+  &__title {
+    color: #333;
+    font-weight: 700;
+    font-size: 16px;
+  }
+
+  &__content {
+    font-size: 16px;
+    color: #999;
+  }
+}
+</style>

+ 0 - 0
src/main.js


برخی فایل ها در این مقایسه diff نمایش داده نمی شوند زیرا تعداد فایل ها بسیار زیاد است