From 4bb904fc27caf0576ed7dbf46d5909a7b1f778c0 Mon Sep 17 00:00:00 2001
From: chenyao <1219716595@qq.com>
Date: Mon, 14 Jul 2025 09:52:28 +0800
Subject: [PATCH] Merge branch 'test' of http://139.196.74.78:10010/r/drone/drone-web-manage into test
---
src/views/tickets/ticket.vue | 186
src/views/wel/components/statistics.vue | 33
src/views/wel/index.vue | 461 +-
src/assets/images/task/zxz.png | 0
public/fonts/font.css | 30
src/option/system/dictbiz.js | 8
src/views/resource/oss.vue | 277
src/views/job/jobserver.vue | 216
src/page/index/top/top-qna.vue | 183
src/views/resource/waylineFile.vue | 189
src/api/helpCenter/helpCenter.js | 27
src/views/system/helpCenter.vue | 162
src/views/device/airport.vue | 96
src/option/system/dict.js | 8
src/views/job/components/TaskTop/TaskTotal.vue | 4
src/views/dataCenter/components/searchData.vue | 95
src/views/job/jobinfo.vue | 258
index.html | 2
src/styles/variables.scss | 4
src/utils/cesium/publicCesium.js | 4
src/views/dataCenter/components/dataCenterMap.vue | 21
src/views/job/components/TaskTop/TaskTop.vue | 22
src/styles/base.scss | 111
src/views/resource/attach.vue | 219
src/buildConfig/buildConfig/config.default.js | 5
src/views/authority/apiscope.vue | 368 -
src/views/base/region.vue | 307
src/views/system/dict.vue | 8
src/components/basic-container/main.vue | 42
src/permission.js | 12
src/store/modules/user.js | 2
src/views/authority/datascope.vue | 427 +-
src/views/monitor/log/error.vue | 109
src/assets/images/helpCenter/helpIcon.png | 0
src/views/job/components/TaskTop/TaskTime.vue | 4
src/views/system/menu.vue | 261
.env.jiangwu | 42
src/buildConfig/config.js | 14
src/styles/common.scss | 20
src/views/authority/role.vue | 263
.env.development | 3
src/views/device/fly.vue | 303 -
src/views/tickets/orderLog.vue | 204
vite.config.mjs | 30
src/views/job/components/TaskTop/TaskIndustry.vue | 21
src/components/wel-container/main.vue | 84
src/main.js | 11
.env.production | 19
public/fonts/SourceHanSansCN-Regular.woff2 | 0
src/views/system/client.vue | 188
src/page/login/index.vue | 9
src/views/job/components/TaskIntermediateContent/TaskIntermediateContent.vue | 117
src/views/odm/task.vue | 277
src/views/system/userinfo.vue | 15
src/components/basic-main-content/main.vue | 49
src/page/index/index.vue | 51
src/router/views/index.js | 16
src/views/device/index.vue | 80
src/views/system/sysConfig.vue | 220
src/views/system/user.vue | 614 +-
src/views/job/jobstatistics.vue | 11
src/views/device/components/firmwareManage.vue | 14
src/views/device/devicePerMenu.vue | 179
src/views/wel/components/backlog.vue | 222
src/buildConfig/buildConfig/config.jiangwu.js | 12
src/assets/images/uoload-success.png | 0
src/option/job/jobserver.js | 15
src/views/license/license.vue | 176
.env.localhost | 41
src/views/algorithmRepository/algorithmRepository.vue | 78
src/api/dataCenter/dataCenter.js | 4
src/axios.js | 16
src/views/resource/wayline.vue | 241
src/views/wel/components/calendarBox.vue | 139
src/views/resource/media.vue | 346 +-
src/views/system/dept.vue | 403 +-
src/views/wel/components/flyratio.vue | 3
src/views/job/components/TaskTop/TaskEvent.vue | 13
src/views/device/components/devicePerShare.vue | 210
src/views/device/addDevice.vue | 254
src/option/job/jobinfo.js | 27
src/styles/element-ui.scss | 77
src/assets/images/task/qxzx.png | 0
src/views/job/components/SearchBox.vue | 3
/dev/null | 0
src/assets/images/upload-error.png | 0
src/views/dataCenter/dataCenter.vue | 606 +-
package.json | 4
src/page/index/top/index.vue | 17
src/views/monitor/log/api.vue | 113
public/fonts/SourceHanSansCN-Bold.woff2 | 0
91 files changed, 5,210 insertions(+), 4,825 deletions(-)
diff --git a/.env.development b/.env.development
index 488c30a..1281a23 100644
--- a/.env.development
+++ b/.env.development
@@ -26,7 +26,8 @@
VITE_APP_AIRLINE_URL = https://wrj.shuixiongit.com/minio/cloud-bucket
# 图片存放地址
-VITE_APP_TERRAIN_URL = https://wrj.shuixiongit.com/aiskyminio/cloud-bucket/all_terrain
+VITE_APP_TERRAIN_URL = https://wrj.shuixiongit.com/aiskyminio/cloud-bucket/ztzf_terrain/all_terrain
+
# 算法仓库图片地址
VITE_APP_PICTURE_URL = https://wrj.shuixiongit.com/aiskyminio/cloud-bucket
diff --git a/.env.jiangwu b/.env.jiangwu
new file mode 100644
index 0000000..df5b435
--- /dev/null
+++ b/.env.jiangwu
@@ -0,0 +1,42 @@
+
+NODE_ENV = 'jiangwu'
+
+#生产环境配置
+VITE_APP_ENV = 'jiangwu'
+
+#接口地址
+#填写前缀 [/api] 需要用nginx进行反向代理
+#填写地址 [https://api.bladex.cn] 只需要保证接口支持跨域即可, 无需再做代理
+VITE_APP_API=/api
+
+#页面基础路径
+VITE_APP_BASE=/manage
+
+# 服务地址
+VITE_APP_URL = http://192.168.253.121:8080/api
+
+# 域名
+VITE_APP_AREA_NAME = http://192.168.253.121:8080/
+
+#新大屏地址
+VITE_APP_DASHBOARD_URL = 'http://192.168.253.121:8080/command-center-dashboard/'
+
+# ws地址
+VITE_APP_WS_API_URL = ws://192.168.253.121:8080
+
+# 航线文件地址
+VITE_APP_AIRLINE_URL = http://192.168.253.121:9000/cloud-bucket
+
+# 算法仓库图片地址
+VITE_APP_PICTURE_URL = http://192.168.253.121:9000/aiskyminio/cloud-bucket
+
+# 是否在打包时开启压缩,支持 gzip 和 brotli
+VITE_BUILD_COMPRESS = gzip
+
+VITE_APP_OFFLINE_MAP_URL = http://192.168.253.121:9000/cloud-bucket/offline_map
+
+# 地形存放地址
+VITE_APP_TERRAIN_URL = http://192.168.253.121:9000/cloud-bucket/ztzf_terrain
+
+# 图片资源存放地址
+VITE_APP_IMAGESOURCE_URL = http://192.168.253.121:9000/cloud-bucket
diff --git a/.env.localhost b/.env.localhost
new file mode 100644
index 0000000..e3fe6b3
--- /dev/null
+++ b/.env.localhost
@@ -0,0 +1,41 @@
+NODE_ENV = 'development'
+
+#开发环境配置
+VITE_APP_ENV = 'development'
+
+#接口地址
+VITE_APP_API=/api
+
+#页面基础路径
+VITE_APP_BASE=/manage
+
+# 服务地址
+VITE_APP_URL = http://192.168.1.227:80/api
+#VITE_APP_URL= http://192.168.1.168 rjg
+#VITE_APP_URL= http://192.168.1.33
+#新大屏地址
+VITE_APP_DASHBOARD_URL = 'http://192.168.1.227:80/command-center-dashboard/'
+
+# 域名
+VITE_APP_AREA_NAME = http://192.168.1.227:80
+
+# ws地址
+VITE_APP_WS_API_URL = wss://192.168.1.227:80
+
+# 航线文件地址
+VITE_APP_AIRLINE_URL = http://192.168.1.227:80/minio/cloud-bucket
+
+# 图片存放地址
+VITE_APP_TERRAIN_URL = https://wrj.shuixiongit.com/aiskyminio/cloud-bucket/ztzf_terrain/all_terrain
+
+# 算法仓库图片地址
+VITE_APP_PICTURE_URL = http://192.168.1.227:80/aiskyminio/cloud-bucket
+
+# 是否在打包时开启压缩,支持 gzip 和 brotli
+VITE_BUILD_COMPRESS = gzip
+
+#页面基础路径
+# VITE_APP_BASE_COMMAND = /drone-web-manage/
+#天地图token 浏览器端口
+VITE_APP_TDT_TOKEN = e110584a27d506da2740edca951683f4
+VITE_APP_CESIUM_TOKEN = eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJqdGkiOiJkYTZlNGNlYS01NTU1LTQ1MGEtYmNlZS0yNTE2NDk5YWM2MjEiLCJpZCI6MTc5Njk2LCJpYXQiOjE3MDA1NDcwMjV9.qcl4AH2731cfFd0-I1ZLUINPXqvglLkDFD-UGR2zU5M
diff --git a/.env.production b/.env.production
index aca80bd..184ae38 100644
--- a/.env.production
+++ b/.env.production
@@ -1,3 +1,13 @@
+###
+ # @Author : yuan
+ # @Date : 2025-06-26 15:18:36
+ # @LastEditors : yuan
+ # @LastEditTime : 2025-07-01 16:34:42
+ # @FilePath : \.env.production
+ # @Description :
+ # Copyright 2025 OBKoro1, All Rights Reserved.
+ # 2025-06-26 15:18:36
+###
NODE_ENV = 'production'
#生产环境配置
@@ -27,9 +37,16 @@
VITE_APP_AIRLINE_URL = https://wrj.shuixiongit.com/aiskyminio/cloud-bucket
# 图片存放地址
-VITE_APP_TERRAIN_URL = https://wrj.shuixiongit.com/aiskyminio/cloud-bucket/all_terrain
+VITE_APP_TERRAIN_URL = https://wrj.shuixiongit.com/aiskyminio/cloud-bucket/ztzf_terrain/all_terrain
+
# 算法仓库图片地址
VITE_APP_PICTURE_URL = https://wrj.shuixiongit.com/aiskyminio/cloud-bucket
# 是否在打包时开启压缩,支持 gzip 和 brotli
VITE_BUILD_COMPRESS = gzip
+
+#页面基础路径
+# VITE_APP_BASE_COMMAND = /drone-web-manage/
+#天地图token 浏览器端口
+VITE_APP_TDT_TOKEN = e110584a27d506da2740edca951683f4
+VITE_APP_CESIUM_TOKEN = eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJqdGkiOiJkYTZlNGNlYS01NTU1LTQ1MGEtYmNlZS0yNTE2NDk5YWM2MjEiLCJpZCI6MTc5Njk2LCJpYXQiOjE3MDA1NDcwMjV9.qcl4AH2731cfFd0-I1ZLUINPXqvglLkDFD-UGR2zU5M
diff --git a/index.html b/index.html
index eef1ec7..f765310 100644
--- a/index.html
+++ b/index.html
@@ -1,5 +1,5 @@
<!DOCTYPE html>
-<html lang="en">
+<html lang="zh-CN">
<head>
<meta charset="UTF-8" />
diff --git a/package.json b/package.json
index 2e00a88..056da91 100644
--- a/package.json
+++ b/package.json
@@ -2,10 +2,12 @@
"name": "saber",
"version": "4.1.0",
"scripts": {
- "dev": "vite --mode development",
+ "dev": "vite --host",
+ "base": "vite --host --mode localhost",
"prod": "vite --mode production",
"build:test": "vite build --mode development",
"build:prod": "vite build --mode production",
+ "build:jiangwu": "vite build --mode jiangwu",
"serve": "vite preview --host"
},
"dependencies": {
diff --git a/public/fonts/SourceHanSansCN-Bold.otf b/public/fonts/SourceHanSansCN-Bold.otf
deleted file mode 100644
index 4b3429a..0000000
--- a/public/fonts/SourceHanSansCN-Bold.otf
+++ /dev/null
Binary files differ
diff --git a/public/fonts/SourceHanSansCN-Bold.woff2 b/public/fonts/SourceHanSansCN-Bold.woff2
new file mode 100644
index 0000000..deac255
--- /dev/null
+++ b/public/fonts/SourceHanSansCN-Bold.woff2
Binary files differ
diff --git a/public/fonts/SourceHanSansCN-Medium.otf b/public/fonts/SourceHanSansCN-Medium.otf
deleted file mode 100644
index 53e03e0..0000000
--- a/public/fonts/SourceHanSansCN-Medium.otf
+++ /dev/null
Binary files differ
diff --git a/public/fonts/SourceHanSansCN-Regular.otf b/public/fonts/SourceHanSansCN-Regular.otf
deleted file mode 100644
index 886f82f..0000000
--- a/public/fonts/SourceHanSansCN-Regular.otf
+++ /dev/null
Binary files differ
diff --git a/public/fonts/SourceHanSansCN-Regular.woff2 b/public/fonts/SourceHanSansCN-Regular.woff2
new file mode 100644
index 0000000..1f71f8e
--- /dev/null
+++ b/public/fonts/SourceHanSansCN-Regular.woff2
Binary files differ
diff --git a/public/fonts/font.css b/public/fonts/font.css
index f429581..9451657 100644
--- a/public/fonts/font.css
+++ b/public/fonts/font.css
@@ -1,47 +1,36 @@
@font-face {
font-family: "Source Han Sans CN";
- src: url("SourceHanSansCN-Regular.otf") format("opentype");
+ src: url("SourceHanSansCN-Regular.woff2") format("opentype");
font-weight: 400;
font-style: normal;
+ font-display: swap;
}
@font-face {
font-family: "Source Han Sans CN";
- src: url("SourceHanSansCN-Medium.otf") format("opentype");
- font-weight: 500;
- font-style: normal;
-}
-
-@font-face {
- font-family: "Source Han Sans CN";
- src: url("SourceHanSansCN-Bold.otf") format("opentype") ;
+ src: url("SourceHanSansCN-Bold.woff2") format("opentype") ;
font-weight: 700;
font-style: normal;
+ font-display: swap;
}
@font-face {
font-family: "Segoe UI";
- src: url("SourceHanSansCN-Regular.otf") format("opentype");
+ src: url("SourceHanSansCN-Regular.woff2") format("opentype");
font-weight: 400;
font-style: normal;
+ font-display: swap;
}
+
@font-face {
font-family: "Segoe UI";
- src: url("SourceHanSansCN-Medium.otf") format("opentype");
- font-weight: 500;
- font-style: normal;
-}
-
-@font-face {
- font-family: "Segoe UI";
- src: url("SourceHanSansCN-Bold.otf") format("opentype") ;
+ src: url("SourceHanSansCN-Bold.woff2") format("opentype") ;
font-weight: 700;
font-style: normal;
+ font-display: swap;
}
-
-
/* 额外的标题字体 */
@@ -50,4 +39,5 @@
src: url("YouSheBiaoTiHei.TTF") format("truetype");
font-weight: normal;
font-style: normal;
+ font-display: swap;
}
diff --git a/src/api/dataCenter/dataCenter.js b/src/api/dataCenter/dataCenter.js
index e520c23..2c0a1a4 100644
--- a/src/api/dataCenter/dataCenter.js
+++ b/src/api/dataCenter/dataCenter.js
@@ -2,7 +2,7 @@
// 列表接口
export const getaiImagesPageAPI = (data,params) => {
return request({
- url: `/blade-resource//attach/attachmentsPage`,
+ url: `/blade-resource/attach/attachmentsPage`,
method: 'post',
data,params
})
@@ -63,4 +63,4 @@
jobId,
},
})
-}
\ No newline at end of file
+}
diff --git a/src/api/helpCenter/helpCenter.js b/src/api/helpCenter/helpCenter.js
new file mode 100644
index 0000000..f38c23c
--- /dev/null
+++ b/src/api/helpCenter/helpCenter.js
@@ -0,0 +1,27 @@
+import request from '@/axios';
+// 文件上传
+export const uploadFileAPI = (data,params) => {
+ return request({
+ url: `/blade-resource/oss/endpoint/put-file`,
+ method: 'post',
+ data,params
+ })
+ };
+
+// 列表
+export const listDataAPI = () => {
+ return request({
+ url: `/blade-system/helpCenter/list`,
+ method: 'get',
+
+ })
+ };
+
+//更新
+export const updataDataAPI = (data,params) => {
+ return request({
+ url: `/blade-system/helpCenter/update`,
+ method: 'put',
+ data,params
+ })
+ };
diff --git a/src/assets/images/helpCenter/helpIcon.png b/src/assets/images/helpCenter/helpIcon.png
new file mode 100644
index 0000000..18cc524
--- /dev/null
+++ b/src/assets/images/helpCenter/helpIcon.png
Binary files differ
diff --git a/src/assets/images/task/qxzx.png b/src/assets/images/task/qxzx.png
index 221f66f..b3cf5b0 100644
--- a/src/assets/images/task/qxzx.png
+++ b/src/assets/images/task/qxzx.png
Binary files differ
diff --git a/src/assets/images/task/zxz.png b/src/assets/images/task/zxz.png
index 7081996..2390bdf 100644
--- a/src/assets/images/task/zxz.png
+++ b/src/assets/images/task/zxz.png
Binary files differ
diff --git a/src/assets/images/uoload-success.png b/src/assets/images/uoload-success.png
index 903fb38..d8f7d0b 100644
--- a/src/assets/images/uoload-success.png
+++ b/src/assets/images/uoload-success.png
Binary files differ
diff --git a/src/assets/images/upload-error.png b/src/assets/images/upload-error.png
index 7b4ee58..4fd7c2c 100644
--- a/src/assets/images/upload-error.png
+++ b/src/assets/images/upload-error.png
Binary files differ
diff --git a/src/axios.js b/src/axios.js
index 979b7c0..d9ad49d 100644
--- a/src/axios.js
+++ b/src/axios.js
@@ -34,7 +34,7 @@
baseUrl
} from '@/config/env';
import crypto from '@/utils/crypto';
-
+const adminUrl = import.meta.env.VITE_APP_DASHBOARD_URL
// 全局未授权错误提示状态,只提示一次
let isErrorShown = false;
@@ -170,9 +170,10 @@
removeToken();
removeRefreshToken();
// 重定向到登录页
- store.dispatch('FedLogOut').then(() => router.push({
- path: '/login'
- }));
+ // store.dispatch('FedLogOut').then(() => router.push({
+ // path: '/login'
+ // }));
+ store.dispatch('FedLogOut').then(() => window.location.replace(`${adminUrl}#/login`));
return Promise.reject(new Error(message));
});
}
@@ -190,9 +191,10 @@
removeToken();
removeRefreshToken();
// 重定向到登录页
- store.dispatch('FedLogOut').then(() => router.push({
- path: '/login'
- }));
+ // store.dispatch('FedLogOut').then(() => router.push({
+ // path: '/login'
+ // }));
+ store.dispatch('FedLogOut').then(() => window.location.replace(`${adminUrl}#/login`));
return Promise.reject(new Error(message));
}
// 如果请求为oauth2错误码则首次报错时提示
diff --git a/src/buildConfig/buildConfig/config.default.js b/src/buildConfig/buildConfig/config.default.js
new file mode 100644
index 0000000..d34e0fa
--- /dev/null
+++ b/src/buildConfig/buildConfig/config.default.js
@@ -0,0 +1,5 @@
+export default function getBaseConfig () {
+ return {
+ loginTitle: '中图智飞低空智能感知网平台', //登陆页面标题
+ }
+}
\ No newline at end of file
diff --git a/src/buildConfig/buildConfig/config.jiangwu.js b/src/buildConfig/buildConfig/config.jiangwu.js
new file mode 100644
index 0000000..f13287c
--- /dev/null
+++ b/src/buildConfig/buildConfig/config.jiangwu.js
@@ -0,0 +1,12 @@
+export default function getBaseConfig () {
+ return {
+ userLoginTitle (key) {
+ return '大吉山钨业无人机安防监测平台'
+ },
+
+ loginTitle: '大吉山钨业无人机安防监测平台',
+
+
+
+ }
+}
\ No newline at end of file
diff --git a/src/buildConfig/config.js b/src/buildConfig/config.js
new file mode 100644
index 0000000..698cc2c
--- /dev/null
+++ b/src/buildConfig/config.js
@@ -0,0 +1,14 @@
+
+// 直接导入所有配置文件
+import jiangwuConfig from '@/buildConfig/buildConfig/config.jiangwu.js'
+import defaultConfig from '@/buildConfig/buildConfig/config.default.js'
+
+// 根据环境变量选择配置
+const env = import.meta.env.VITE_APP_ENV || 'default'
+const configMap = {
+ jiangwu: jiangwuConfig,
+ default: defaultConfig
+}
+
+// 导出配置函数
+export default configMap[env] || configMap.default
\ No newline at end of file
diff --git a/src/components/basic-container/main.vue b/src/components/basic-container/main.vue
index 6a357d5..43a90ae 100644
--- a/src/components/basic-container/main.vue
+++ b/src/components/basic-container/main.vue
@@ -1,3 +1,13 @@
+<!--
+ * @Author : yuan
+ * @Date : 2025-06-14 15:19:16
+ * @LastEditors : yuan
+ * @LastEditTime : 2025-06-27 14:34:02
+ * @FilePath : \src\components\basic-container\main.vue
+ * @Description :
+ * Copyright 2025 OBKoro1, All Rights Reserved.
+ * 2025-06-14 15:19:16
+-->
<template>
<div class="basic-container" :style="styleName" :class="{ 'basic-container--block': block }">
<el-card class="basic-container__card">
@@ -23,25 +33,41 @@
},
},
computed: {
- styleName() {
+ styleName () {
return {
borderRadius: `${this.radius}px`,
background: this.background,
- };
+ }
},
},
-};
+}
</script>
-<style lang="scss">
+<style lang="scss" scoped>
.basic-container {
- padding: 0 10px;
- box-sizing: border-box;
+ height: 0;
+ flex: 1;
+
+ padding: 10px;
+ // box-sizing: border-box;
// height: 100%;
- .basic-container__card{
+ .basic-container__card {
height: 100% !important;
- overflow: auto;
+ overflow: hidden;
+
+ .el-card__body {
+ display: flex;
+ flex-direction: column;
+ height: 100% !important;
+ overflow: hidden;
+ box-sizing: border-box;
+
+ &>div {
+ height: 0;
+ flex: 1;
+ }
+ }
}
&--block {
diff --git a/src/components/basic-main-content/main.vue b/src/components/basic-main-content/main.vue
new file mode 100644
index 0000000..071a567
--- /dev/null
+++ b/src/components/basic-main-content/main.vue
@@ -0,0 +1,49 @@
+<!--
+ * @Author : yuan
+ * @Date : 2025-06-14 15:19:16
+ * @LastEditors : yuan
+ * @LastEditTime : 2025-06-27 14:33:15
+ * @FilePath : \src\components\basic-main-content\main.vue
+ * @Description :
+ * Copyright 2025 OBKoro1, All Rights Reserved.
+ * 2025-06-14 15:19:16
+-->
+<template>
+ <div class="basic-main-content">
+ <slot></slot>
+ </div>
+</template>
+
+<script>
+export default {
+ name: 'basicMainContent',
+ props: {
+ radius: {
+ type: [String, Number],
+ default: 10,
+ },
+ background: {
+ type: String,
+ },
+ block: {
+ type: Boolean,
+ default: false,
+ },
+ },
+ computed: {
+ styleName () {
+ return {
+ borderRadius: `${this.radius}px`,
+ background: this.background,
+ }
+ },
+ },
+}
+</script>
+
+<style lang="scss" scoped>
+.basic-main-content {
+ height: 0;
+ flex: 1;
+}
+</style>
diff --git a/src/components/wel-container/main.vue b/src/components/wel-container/main.vue
new file mode 100644
index 0000000..5ae84fd
--- /dev/null
+++ b/src/components/wel-container/main.vue
@@ -0,0 +1,84 @@
+<template>
+ <div class="wel-container" :style="styleName" :class="{ 'wel-container--block': block }">
+ <el-card class="wel-container__card">
+ <slot></slot>
+ </el-card>
+ </div>
+</template>
+
+<script>
+export default {
+ name: 'welContainer',
+ props: {
+ radius: {
+ type: [String, Number],
+ default: 10,
+ },
+ background: {
+ type: String,
+ },
+ block: {
+ type: Boolean,
+ default: false,
+ },
+ },
+ computed: {
+ styleName () {
+ return {
+ borderRadius: `${this.radius}px`,
+ background: this.background,
+ }
+ },
+ },
+}
+</script>
+
+<style lang="scss" scoped>
+.wel-container {
+ height: 0;
+ flex: 1;
+ padding-top: 0 !important;
+
+ // box-sizing: border-box;
+ // height: 100%;
+ .el-card {
+ background-color: transparent !important;
+ }
+
+ .wel-container__card {
+ height: 100% !important;
+ overflow: hidden;
+
+ :deep(.el-card__body) {
+ display: flex;
+ flex-direction: column;
+ height: 100% !important;
+ overflow: hidden;
+ box-sizing: border-box;
+ padding: 10px !important;
+ padding-top: 0 !important;
+
+ &>div {
+ height: 0;
+ flex: 1;
+ }
+ }
+ }
+
+ &--block {
+ height: 100%;
+
+ .wel-container__card {
+ height: 100%;
+ }
+ }
+
+ &__card {
+ width: 100%;
+ }
+
+ &:first-child {
+ padding-top: 0;
+ }
+}
+</style>
diff --git a/src/main.js b/src/main.js
index e24d589..886400b 100644
--- a/src/main.js
+++ b/src/main.js
@@ -30,6 +30,9 @@
import avueUeditor from 'avue-plugin-ueditor'
import basicBlock from 'components/basic-block/main.vue'
import basicContainer from 'components/basic-container/main.vue'
+import welContainer from 'components/wel-container/main.vue'
+import basicMainContent from 'components/basic-main-content/main.vue'
+
import thirdRegister from './components/third-register/main.vue'
import NfDesignBase from '@saber/nf-design-base-elp'
import flowDesign from './components/flow-design/main.vue'
@@ -49,7 +52,7 @@
window.DC = Object.create(DC)
import { onResize } from '@/utils/rem'
onResize()
-const { VITE_APP_BASE,VITE_APP_CESIUM_TOKEN } = import.meta.env
+const { VITE_APP_BASE, VITE_APP_CESIUM_TOKEN } = import.meta.env
window.CESIUM_BASE_URL = `${VITE_APP_BASE}/cesiumPu`
Cesium.Ion.defaultAccessToken = VITE_APP_CESIUM_TOKEN
@@ -86,6 +89,9 @@
app.component(key, component)
}
app.component('basicContainer', basicContainer)
+app.component('welContainer', welContainer)
+app.component('basicMainContent', basicMainContent)
+
app.component('basicBlock', basicBlock)
app.component('thirdRegister', thirdRegister)
app.component('flowDesign', flowDesign)
@@ -95,6 +101,9 @@
app.config.globalProperties.$dayjs = dayjs
app.config.globalProperties.website = website
app.config.globalProperties.getScreen = getScreen
+app.config.globalProperties.pxToVh = height => height / 10.8 + 'vh'
+app.config.globalProperties.pxToRem = width => width * 0.1 + 'rem'
+
app.use(error)
app.use(i18n)
app.use(store)
diff --git a/src/option/job/jobinfo.js b/src/option/job/jobinfo.js
index 167c814..369bcf4 100644
--- a/src/option/job/jobinfo.js
+++ b/src/option/job/jobinfo.js
@@ -19,7 +19,7 @@
label: '工作流',
value: 5,
},
-];
+]
export const executeTypeDic = [
{
@@ -34,7 +34,7 @@
label: 'MapReduce',
value: 3,
},
-];
+]
export const processorTypeDic = [
{
@@ -45,7 +45,7 @@
label: '外部处理器(动态加载)',
value: 4,
},
-];
+]
export const dispatchStrategyDic = [
{
@@ -56,7 +56,7 @@
label: 'RANDOM',
value: 2,
},
-];
+]
export const enableDic = [
{
@@ -67,7 +67,7 @@
label: '启用',
value: 1,
},
-];
+]
export const logTypeDic = [
{
@@ -90,7 +90,7 @@
label: 'NULL',
value: 999,
},
-];
+]
export const logLevelDic = [
{
@@ -113,7 +113,7 @@
label: 'OFF',
value: 99,
},
-];
+]
export default {
tip: false,
@@ -129,6 +129,10 @@
dialogWidth: 1200,
dialogClickModal: false,
tabs: true,
+
+ height: 'auto',
+ calcHeight: 20,
+
column: [
{
label: '任务应用',
@@ -141,6 +145,7 @@
},
search: true,
display: false,
+ showOverflowTooltip: true,
},
{
label: '任务ID',
@@ -149,6 +154,7 @@
search: true,
width: 80,
display: false,
+ showOverflowTooltip: true,
},
{
label: '任务名称',
@@ -157,6 +163,7 @@
search: true,
width: 200,
display: false,
+ showOverflowTooltip: true,
},
{
label: '定时信息',
@@ -173,6 +180,7 @@
],
width: 120,
display: false,
+ showOverflowTooltip: true,
},
{
label: '执行类型',
@@ -189,6 +197,7 @@
],
width: 110,
display: false,
+ showOverflowTooltip: true,
},
{
label: '处理器类型',
@@ -205,6 +214,7 @@
],
width: 180,
display: false,
+ showOverflowTooltip: true,
},
{
label: '任务状态',
@@ -215,6 +225,7 @@
slot: true,
width: 100,
display: false,
+ showOverflowTooltip: true,
},
],
group: [
@@ -510,4 +521,4 @@
],
},
],
-};
+}
diff --git a/src/option/job/jobserver.js b/src/option/job/jobserver.js
index 5ac5689..ebf0fc2 100644
--- a/src/option/job/jobserver.js
+++ b/src/option/job/jobserver.js
@@ -1,3 +1,13 @@
+/*
+ * @Author : yuan
+ * @Date : 2025-06-14 15:19:16
+ * @LastEditors : yuan
+ * @LastEditTime : 2025-06-26 17:24:02
+ * @FilePath : \src\option\job\jobserver.js
+ * @Description :
+ * Copyright 2025 OBKoro1, All Rights Reserved.
+ * 2025-06-14 15:19:16
+ */
export default {
tip: false,
searchShow: true,
@@ -10,6 +20,9 @@
labelWidth: 100,
menuWidth: 350,
dialogClickModal: false,
+
+ height: 'auto',
+ calcHeight: 20,
column: [
{
label: '服务名称',
@@ -73,4 +86,4 @@
span: 24,
},
],
-};
+}
diff --git a/src/option/system/dict.js b/src/option/system/dict.js
index 7a2cd7c..e64065b 100644
--- a/src/option/system/dict.js
+++ b/src/option/system/dict.js
@@ -9,6 +9,10 @@
menuWidth: 250,
dialogWidth: 880,
dialogClickModal: false,
+
+ height: 'auto',
+ calcHeight: 20,
+
column: [
{
label: '字典编号',
@@ -83,7 +87,7 @@
hide: true,
},
],
-};
+}
export const optionChild = {
tip: false,
@@ -203,4 +207,4 @@
hide: true,
},
],
-};
+}
diff --git a/src/option/system/dictbiz.js b/src/option/system/dictbiz.js
index 2b3bce3..e3a2742 100644
--- a/src/option/system/dictbiz.js
+++ b/src/option/system/dictbiz.js
@@ -9,6 +9,10 @@
menuWidth: 250,
dialogWidth: 880,
dialogClickModal: false,
+
+ height: 'auto',
+ calcHeight: 20,
+
column: [
{
label: '字典编号',
@@ -84,7 +88,7 @@
hide: true,
},
],
-};
+}
export const optionChild = {
tip: false,
@@ -204,4 +208,4 @@
hide: true,
},
],
-};
+}
diff --git a/src/page/index/index.vue b/src/page/index/index.vue
index c925305..c0b819c 100644
--- a/src/page/index/index.vue
+++ b/src/page/index/index.vue
@@ -13,9 +13,9 @@
<div class="tags-box">
<tags />
</div>
- <search class="avue-view" v-show="isSearch"></search>
+ <search class="main-avue-view-container" v-show="isSearch"></search>
<!-- 主体视图层 -->
- <div id="avue-view" v-show="!isSearch" v-if="isRefresh">
+ <div class="main-avue-view-container" v-show="!isSearch" v-if="isRefresh">
<router-view #="{ Component }">
<keep-alive :include="$store.getters.tagsKeep">
<component :is="Component" />
@@ -29,15 +29,15 @@
</template>
<script>
-import index from '@/mixins/index';
-import wechat from './wechat.vue';
+import index from '@/mixins/index'
+import wechat from './wechat.vue'
//import { validatenull } from 'utils/validate';
-import { mapGetters } from 'vuex';
-import tags from './tags.vue';
-import search from './search.vue';
-import logo from './logo.vue';
-import top from './top/index.vue';
-import sidebar from './sidebar/index.vue';
+import { mapGetters } from 'vuex'
+import tags from './tags.vue'
+import search from './search.vue'
+import logo from './logo.vue'
+import top from './top/index.vue'
+import sidebar from './sidebar/index.vue'
export default {
mixins: [index],
@@ -50,10 +50,10 @@
wechat,
},
name: 'index',
- provide() {
+ provide () {
return {
index: this,
- };
+ }
},
computed: {
...mapGetters([
@@ -65,27 +65,27 @@
'menu',
'setting',
]),
- validSidebar() {
+ validSidebar () {
return !(
(this.$route.meta || {}).menu === false || (this.$route.query || {}).menu === 'false'
- );
+ )
},
},
props: [],
methods: {
//打开菜单
- openMenu(item = {}) {
+ openMenu (item = {}) {
this.$store.dispatch('GetMenu', item.id).then(data => {
if (data.length !== 0) {
this.$router.$avueRouter.formatRoutes(data, true)
// 获取url里面的redirect
- const redirect = decodeURIComponent(this.$route.query.redirect || '');
- if (redirect){
- console.log('redirect',redirect);
- const [path, queryString] = redirect.split('?');
- const query = queryString ? Object.fromEntries(new URLSearchParams(queryString)) : {};
- this.$router.push({ path,query})
+ const redirect = decodeURIComponent(this.$route.query.redirect || '')
+ if (redirect) {
+ console.log('redirect', redirect)
+ const [path, queryString] = redirect.split('?')
+ const query = queryString ? Object.fromEntries(new URLSearchParams(queryString)) : {}
+ this.$router.push({ path, query })
}
}
//当点击顶部菜单后默认打开第一个菜单
@@ -109,15 +109,13 @@
}, itemActive.meta)
});
}*/
- });
+ })
},
},
-};
+}
</script>
<style lang="scss" scoped>
-:deep(.basic-container){
-height: none !important;}
// #avue-view{
// :deep(){
// .avue-crud__body{
@@ -129,9 +127,10 @@
// }
// }
-.tags-box{
+.tags-box {
background: transparent;
padding: 0 10px;
--el-color-primary: rgba(20, 65, 255, 1);
+ height: pxToVh(55);
}
</style>
diff --git a/src/page/index/top/index.vue b/src/page/index/top/index.vue
index 1ebd127..9026c9a 100644
--- a/src/page/index/top/index.vue
+++ b/src/page/index/top/index.vue
@@ -7,18 +7,18 @@
</div>
</div>
<div class="top-bar__title">
-<!-- <top-menu ref="topMenu" v-if="setting.menu"></top-menu>-->
+<!--<top-menu ref="topMenu" v-if="setting.menu"></top-menu>-->
<top-search class="top-bar__item" v-if="setting.search"></top-search>
</div>
<div class="top-bar__right">
<div class="icon-box">
<top-lock v-if="setting.lock"/>
- <top-qna title="帮助中心"/>
+ <top-qna />
<top-full v-if="setting.fullscreen" title="全屏"/>
- <img @click="jumpMH" src="@/assets/images/mh.png" alt="进入门户" title="进入门户" width="20" height="20">
+ <img class="gateway" @click="jumpMH" src="@/assets/images/mh.png" alt="进入门户" title="进入门户" width="20" height="20">
</div>
<div class="top-user">
- <img class="top-bar__img" :src="userInfo.avatar " />
+ <img class="top-bar__img" :src="userInfo.avatar " alt=""/>
<el-dropdown>
<span class="el-dropdown-link">
@@ -102,7 +102,9 @@
type: 'warning',
}).then(() => {
this.$store.dispatch('LogOut').then(() => {
- this.$router.push({ path: '/login' })
+ // this.$router.push({ path: '/login' })
+ const adminUrl = import.meta.env.VITE_APP_DASHBOARD_URL
+ window.location.replace(`${adminUrl}#/login`)
})
})
},
@@ -133,6 +135,7 @@
flex: 1;
display: flex;
align-items: center;
+ height: pxToVh(80);
}
.top-bar__right {
@@ -145,6 +148,10 @@
display: flex;
align-items: center;
gap: 0 20px;
+ .gateway{
+ width: 25px;
+ height: 25px;
+ }
>*{
cursor: pointer;
}
diff --git a/src/page/index/top/top-qna.vue b/src/page/index/top/top-qna.vue
index 89435d5..5c5b028 100644
--- a/src/page/index/top/top-qna.vue
+++ b/src/page/index/top/top-qna.vue
@@ -1,66 +1,84 @@
<template>
- <div class="top-qna" @mouseenter="disableTooltip" @mouseleave="enableTooltip">
- <el-tooltip :disabled="tooltipDisabled" content="帮助中心" placement="bottom">
- <el-icon @click="showHelp" class="help-icon">
+ <div class="top-qna">
+ <el-dropdown @command="dropdownClick">
+ <!-- <img class="help-icon" alt="" src="@/assets/images/helpCenter/helpIcon.png" /> -->
+ <el-icon class="help-icon" color="#707070" size="17">
<QuestionFilled />
</el-icon>
- </el-tooltip>
- <el-dialog v-model="dialogVisible" title="帮助中心" width="30%" @close="closeDialog">
- <div class="dialog-content">
- <div class="qa-item">
- <span class="qa-title">Q1:智飞机场 2 支持哪些无人机?</span>
- <span class="qa-text">
- A1:智飞机场 2 仅支持 DJI Matrice 3D 系列无人机。
- </span>
- </div>
- <div class="qa-item">
- <span class="qa-title">Q2:智飞机场 2 如何应对意外断电?</span>
- <span class="qa-text">
- A2:若发生意外断电,机场仍可借助内置蓄电池独立工作超 5 小时,为飞行器预留充足的返航降落时间。
- 断电后,机场不支持飞行器充电、空调、舱盖加热、风速计加热等功能,请及时排查故障。
- </span>
- </div>
- <div class="qa-item">
- <span class="qa-title">Q3:智飞机场 2 和第一代智飞机场有什么区别?</span>
- <span class="qa-text">
- A3:相对于第一代智飞机场,智飞机场 2 在体积、重量上大幅下降,不仅轻量化、易部署,
- 且具备更强大的作业能力和云端智能功能,大幅降低了无人值守作业门槛,作业效率和质量也上升至全新高度。
- </span>
- </div>
- </div>
- <template #footer>
- <span class="dialog-footer">
- <el-button @click="closeDialog">关闭</el-button>
- </span>
+ <template #dropdown>
+ <el-dropdown-menu>
+ <el-dropdown-item command="guide">入门指南</el-dropdown-item>
+ <el-dropdown-item command="systemupdate">系统更新</el-dropdown-item>
+ </el-dropdown-menu>
</template>
- </el-dialog>
+ </el-dropdown>
</div>
</template>
-<script>
-export default {
- name: 'top-qna',
- data() {
- return {
- dialogVisible: false, // 确保初始值为 false
- tooltipDisabled: false, // 控制 tooltip 是否显示
- };
- },
- methods: {
- showHelp() {
- this.dialogVisible = true;
- },
- closeDialog() {
- this.dialogVisible = false;
- },
- disableTooltip() {
- this.tooltipDisabled = true; // 禁用 tooltip
- },
- enableTooltip() {
- this.tooltipDisabled = false; // 启用 tooltip
- },
- },
+<script setup>
+import { listDataAPI } from '@/api/helpCenter/helpCenter';
+import { useRouter } from 'vue-router';
+import { ElMessage } from 'element-plus';
+const router = useRouter();
+const systemupdateFilePath = ref(null);
+const rumenPath = ref(null);
+const fileData = ref([]);
+const loading = ref(false);
+const getlistDataAPI = async () => {
+ loading.value = true;
+ try {
+ const res = await listDataAPI();
+ if (res.data.code === 200 && res.data.data) {
+ fileData.value = res.data.data;
+ const systemUpdateItem = res.data.data.find(item => item.id === 4); //系统更新
+ const rumenItem = res.data.data.find(item => item.id === 2); //入门指南
+
+ if (systemUpdateItem) {
+ systemupdateFilePath.value = systemUpdateItem.filePath;
+ } else {
+ console.warn('暂无系统更新');
+ }
+
+ if (rumenItem) {
+ rumenPath.value = rumenItem.filePath;
+ } else {
+ console.warn('暂无入门指南');
+ }
+ } else {
+ ElMessage.error('获取帮助数据失败');
+ }
+ } catch (error) {
+ console.error('获取数据出错:', error);
+ ElMessage.error('请求失败');
+ } finally {
+ loading.value = false;
+ }
};
+const dropdownClick = val => {
+ if (loading.value) {
+ ElMessage.warning('数据正在加载,请稍后');
+ return;
+ }
+
+ if (val === 'guide') {
+ if (!rumenPath.value) {
+ ElMessage.warning('暂无入门指南文件');
+ return;
+ }
+
+ window.open(rumenPath.value, '_blank');
+ } else if (val === 'systemupdate') {
+ if (!systemupdateFilePath.value) {
+ ElMessage.warning('暂无系统更新文件');
+ return;
+ }
+ window.open(systemupdateFilePath.value, '_blank');
+ }
+};
+
+onMounted(() => {
+ getlistDataAPI();
+});
</script>
<style lang="scss" scoped>
@@ -70,57 +88,12 @@
font-size: 18px;
justify-content: center;
cursor: pointer;
-}
-
-/* 优化弹出框样式 */
-:deep(.el-dialog) {
- border-radius: 8px; /* 圆角边框 */
- overflow: visible; /* 防止内容溢出 */
- .el-dialog__header {
- padding: 15px 20px;
- border-bottom: 1px solid #e8e8e8; /* 标题下边框 */
- .el-dialog__title {
- font-size: 16px;
- font-weight: bold;
- color: #333;
- }
+ .help-icon {
+ width: 25px;
+ height: 25px;
}
- .el-dialog__body {
- padding: 20px;
- max-height: none; /* 取消高度限制 */
- overflow: visible; /* 取消滚动条 */
- word-wrap: break-word; /* 自动换行 */
- word-break: break-word; /* 防止长单词溢出 */
- white-space: normal; /* 确保文字自动换行 */
- }
- .el-dialog__footer {
- padding: 10px 20px;
- border-top: 1px solid #e8e8e8; /* 底部上边框 */
- text-align: right;
- }
-}
-
-/* 优化内容样式 */
-.dialog-content {
- .qa-item {
- margin-bottom: 15px;
- padding: 10px;
- border: 1px solid #e8e8e8; /* 边框 */
- border-radius: 4px; /* 圆角 */
- background-color: #f9f9f9; /* 背景色 */
- .qa-title {
- font-size: 14px;
- font-weight: bold;
- color: #333;
- display: block; /* 确保换行 */
- margin-bottom: 5px;
- }
- .qa-text {
- font-size: 14px;
- color: #666;
- line-height: 1.6; /* 行间距 */
- display: block; /* 确保换行 */
- }
+ .theme-white .el-dropdown {
+ color: none !important;
}
}
</style>
diff --git a/src/page/login/index.vue b/src/page/login/index.vue
index 839ea1d..4453760 100644
--- a/src/page/login/index.vue
+++ b/src/page/login/index.vue
@@ -39,7 +39,8 @@
import { getQueryString, getTopUrl } from '@/utils/util';
import { getDetail } from '@/api/system/sysConfig'
import website from '@/config/website';
-
+import getBaseConfig from '@/buildConfig/config'
+const { loginTitle} = getBaseConfig()
export default {
name: 'login',
components: {
@@ -51,7 +52,7 @@
data() {
return {
login:{
- info: '中图智绘低空无人机监测网平台'
+ info: loginTitle
},
website: website,
time: '',
@@ -72,7 +73,10 @@
created() {
this.handleLogin();
this.getTime();
+ if(!loginTitle) {
this.getSysConfigInfo();
+ }
+
},
mounted() {},
computed: {
@@ -85,6 +89,7 @@
let sysConfigId = this.$route.query?.id || 1;
getDetail(sysConfigId).then(res=>{
this.login.info = res.data.data.name
+
})
},
getTime() {
diff --git a/src/permission.js b/src/permission.js
index f12dc4e..5272458 100644
--- a/src/permission.js
+++ b/src/permission.js
@@ -18,7 +18,7 @@
NProgress.configure({ showSpinner: false })
const lockPage = '/lock' //锁屏页
const urlParams = getUrlParams(window.location.href)
-
+const adminUrl = import.meta.env.VITE_APP_DASHBOARD_URL
function findRouteByPath (routes, targetPath) {
// 遍历数组中的每个路由对象
for (const route of routes) {
@@ -93,9 +93,10 @@
} else {
const systemToken = store.getters.token || urlParams?.token
if (systemToken === 0) {
- store.dispatch('FedLogOut').then(() => {
- next({ path: '/login' })
- })
+ // store.dispatch('FedLogOut').then(() => {
+ // next({ path: '/login' })
+ // })
+ store.dispatch('FedLogOut').then(() => window.location.replace(`${adminUrl}#/login`));
} else {
const meta = to.meta || {}
const query = to.query || {}
@@ -120,7 +121,8 @@
if (meta.isAuth === false) {
next()
} else {
- next('/login')
+ // next('/login')
+ window.location.replace(`${adminUrl}#/login`)
}
}
})
diff --git a/src/router/views/index.js b/src/router/views/index.js
index d2da43f..568b2c8 100644
--- a/src/router/views/index.js
+++ b/src/router/views/index.js
@@ -141,4 +141,20 @@
},
],
},
+
+ {
+ path: '/helpCenter',
+ component: Layout,
+ redirect: '/system/helpCenter',
+ children: [
+ {
+ path: 'system',
+ name: '帮助中心',
+ meta: {
+ i18n: 'info',
+ },
+ component: () => import(/* webpackChunkName: "views" */ '@/views/system/helpCenter.vue'),
+ },
+ ],
+ },
];
diff --git a/src/store/modules/user.js b/src/store/modules/user.js
index 3b6a410..ee2940d 100644
--- a/src/store/modules/user.js
+++ b/src/store/modules/user.js
@@ -39,7 +39,7 @@
token: getStore({ name: 'token' }) || '',
refreshToken: getStore({ name: 'refreshToken' }) || '',
parentDeptInfo: getStore({ name: 'parentDeptInfo' }) || '',
-
+
},
actions: {
//根据用户名登录
diff --git a/src/styles/base.scss b/src/styles/base.scss
new file mode 100644
index 0000000..f8d2671
--- /dev/null
+++ b/src/styles/base.scss
@@ -0,0 +1,111 @@
+.manage-flex {
+ display: flex;
+}
+
+.manage-f-d-c {
+ flex-direction: column;
+}
+
+.manage-flex-1 {
+ flex: 1;
+}
+
+.manage-flex-2 {
+ flex: 2;
+}
+
+.manage-flex-3 {
+ flex: 3;
+}
+
+.manage-flex-4 {
+ flex: 4;
+}
+
+.manage-flex-5 {
+ flex: 5;
+}
+
+.manage-flex-6 {
+ flex: 6;
+}
+
+.manage-flex-7 {
+ flex: 7;
+}
+
+.manage-flex-8 {
+ flex: 8;
+}
+
+.manage-flex-9 {
+ flex: 9;
+}
+
+.manage-w-0 {
+ width: 0;
+}
+
+.manage-w-100 {
+ width: 100%;
+}
+
+.manage-h-0 {
+ height: 0;
+}
+
+.manage-h-100 {
+ height: 100%;
+}
+
+.manage-m-all-10 {
+ margin: 10px;
+}
+
+.manage-m-t-0 {
+ margin-top: 0px;
+}
+
+.manage-m-t-10 {
+ margin-top: 10px;
+}
+
+.manage-m-t-20 {
+ margin-top: 20px;
+}
+
+.manage-p-all-10 {
+ padding: 10px;
+}
+
+.manage-p-all-16 {
+ padding: 16px;
+}
+
+.manage-p-all-20 {
+ padding: 20px;
+}
+
+.manage-p-t-0 {
+ padding-top: 0;
+}
+
+.manage-p-b-0 {
+ padding-bottom: 0;
+}
+
+.manage-b-c-w {
+ background-color: white;
+}
+
+.manage-b-r-5 {
+ border-radius: 5px;
+}
+
+.manage-overflow-h {
+ overflow: hidden;
+}
+
+.manage-box-s-b-b {
+ box-sizing: border-box;
+}
\ No newline at end of file
diff --git a/src/styles/common.scss b/src/styles/common.scss
index 488a42d..86695a3 100644
--- a/src/styles/common.scss
+++ b/src/styles/common.scss
@@ -1,5 +1,6 @@
// 全局变量
@import './variables.scss';
+@import './base.scss';
a {
text-decoration: none;
@@ -20,9 +21,9 @@
.avue-layout {
display: flex;
- height: 1080px;
- width: 1920px;
- background: url("@/assets/images/layoutBg.png") no-repeat center / 100% 100%;
+ width: 100%;
+ height: 100%;
+ background: url("@/assets/images/layoutBg.png") no-repeat center / 100% 100%;
overflow: hidden;
&--horizontal {
@@ -85,9 +86,12 @@
margin-bottom: 0;
}
-.avue-view {
- width: 100%;
- box-sizing: border-box;
+.main-avue-view-container {
+ height: 0;
+ flex: 1;
+ display: flex;
+ flex-direction: column;
+ overflow: hidden;
}
.avue-footer {
@@ -155,7 +159,7 @@
}
}
-.ztzf-cesium{
+.ztzf-cesium {
.cesium-viewer {
height: 100%;
overflow: hidden;
@@ -179,4 +183,4 @@
.cesium-viewer-bottom {
display: none;
}
-}
+}
\ No newline at end of file
diff --git a/src/styles/element-ui.scss b/src/styles/element-ui.scss
index a9a7ece..47078bb 100644
--- a/src/styles/element-ui.scss
+++ b/src/styles/element-ui.scss
@@ -31,12 +31,20 @@
padding: 0 !important;
}
-.el-dropdown-menu__item--divided:before, .el-menu, .el-menu--horizontal > .el-menu-item:not(.is-disabled):focus, .el-menu--horizontal > .el-menu-item:not(.is-disabled):hover, .el-menu--horizontal > .el-sub-menu .el-sub-menu__title:hover {
+.el-dropdown-menu__item--divided:before,
+.el-menu,
+.el-menu--horizontal>.el-menu-item:not(.is-disabled):focus,
+.el-menu--horizontal>.el-menu-item:not(.is-disabled):hover,
+.el-menu--horizontal>.el-sub-menu .el-sub-menu__title:hover {
background-color: transparent;
}
-.el-dropdown-menu__item--divided:before, .el-menu, .el-menu--horizontal > .el-menu-item:not(.is-disabled):focus, .el-menu--horizontal > .el-menu-item:not(.is-disabled):hover, .el-menu--horizontal > .el-sub-menu .el-sub-menu__title:hover {
+.el-dropdown-menu__item--divided:before,
+.el-menu,
+.el-menu--horizontal>.el-menu-item:not(.is-disabled):focus,
+.el-menu--horizontal>.el-menu-item:not(.is-disabled):hover,
+.el-menu--horizontal>.el-sub-menu .el-sub-menu__title:hover {
background-color: transparent !important;
}
@@ -49,11 +57,13 @@
background-color: transparent;
}
-.el-button.is-text:not(.is-disabled):focus, .el-button.is-text:not(.is-disabled):hover {
+.el-button.is-text:not(.is-disabled):focus,
+.el-button.is-text:not(.is-disabled):hover {
background-color: transparent;
}
-.avue-icon i, .avue-icon svg {
+.avue-icon i,
+.avue-icon svg {
line-height: 20px;
}
@@ -66,36 +76,43 @@
justify-content: space-between;
.el-dialog {
- position: relative;
- padding: 0;
+ position: relative;
+ padding: 0;
+ overflow: hidden;
+
+ .el-dialog__body {
+ width: 100%;
+ height: 100%;
+
+ iframe {
+ width: 100%;
+ height: 100%;
+ }
+ }
+
+ .el-dialog__header {
+ height: 0;
overflow: hidden;
+ padding: 0;
- .el-dialog__body {
- width: 100%;
- height: 100%;
+ .el-dialog__headerbtn {
+ position: absolute;
+ left: 0;
+ top: 14px;
- iframe {
- width: 100%;
- height: 100%;
- }
+ .el-dialog__close {
+ color: #fff;
+ font-size: 35px;
+ z-index: 99;
+ }
}
+ }
+ }
+}
- .el-dialog__header {
- height: 0;
- overflow: hidden;
- padding: 0;
-
- .el-dialog__headerbtn {
- position: absolute;
- left: 0;
- top: 14px;
-
- .el-dialog__close {
- color: #fff;
- font-size: 35px;
- z-index: 99;
- }
- }
- }
+.ztzf-drawer-body-basic-container {
+ .el-drawer__body {
+ display: flex;
+ flex-direction: column;
}
}
\ No newline at end of file
diff --git a/src/styles/variables.scss b/src/styles/variables.scss
index ef29df7..8c395ec 100644
--- a/src/styles/variables.scss
+++ b/src/styles/variables.scss
@@ -1,3 +1,7 @@
$sidebar_width: 230px;
$sidebar_collapse: 60px;
$top_height: 50px;
+
+@function pxToVh($px) {
+ @return calc($px / 1080) * 100vh;
+}
diff --git a/src/utils/cesium/publicCesium.js b/src/utils/cesium/publicCesium.js
index d511963..a5e96b1 100644
--- a/src/utils/cesium/publicCesium.js
+++ b/src/utils/cesium/publicCesium.js
@@ -70,7 +70,7 @@
baseLayer: false,
fullscreenButton: false,
}
-
+
this.viewer = new Viewer(options.dom, viewerOptions)
this.viewer.imageryLayers.removeAll()
@@ -84,7 +84,7 @@
if (terrain) {
try {
- Cesium.CesiumTerrainProvider.fromUrl(`${import.meta.env.VITE_APP_TERRAIN_URL}/all_terrain`, {
+ Cesium.CesiumTerrainProvider.fromUrl(`${import.meta.env.VITE_APP_TERRAIN_URL}`, {
requestVertexNormals: true, // 启用地形法线增强立体感
requestWaterMask: true, // 启用水体遮罩效果
}).then(terrainProvider => {
diff --git a/src/views/algorithmRepository/algorithmRepository.vue b/src/views/algorithmRepository/algorithmRepository.vue
index 2898bd2..ad3ee3a 100644
--- a/src/views/algorithmRepository/algorithmRepository.vue
+++ b/src/views/algorithmRepository/algorithmRepository.vue
@@ -42,7 +42,10 @@
v-model="taskData"
placeholder="请选择日期"
@change="changeselect"
+ clearable
+
/>
+ <!-- @clear="handleDateClear" -->
</div>
<div class="item">
<div class="itemchild">机巢查询:</div>
@@ -58,18 +61,19 @@
</div>
</div>
- <div
+ <div v-if="detailData.length > 0" class="pictureBox">
+ <div
class="pictureitem"
- v-if="detailData.length > 0"
+
v-loading="loading"
element-loading-text="加载中"
>
<div class="imgitem" v-for="(item, index) in detailData" :key="index">
<el-image
ref="imageRef"
- :src="item.url"
+ :src="getSmallImg(item.url)"
show-progress
- :preview-src-list="detailData.map(i => i.url)"
+ :preview-src-list="[getShowImg(item.url)]"
fit="cover"
/>
@@ -79,6 +83,7 @@
</div>
</div>
</div>
+ </div>
<el-empty class="custom-empty" v-else>
<template #description>
<span class="custom-text">暂无数据</span>
@@ -88,7 +93,7 @@
<el-pagination
class="pageStyle"
background
- :page-sizes="[10, 20, 30, 50]"
+ :page-sizes="[15, 20, 30, 50]"
v-model:current-page="params.current"
v-model:page-size="params.size"
layout="total, prev, pager, next,sizes, jumper"
@@ -102,12 +107,10 @@
</template>
<script setup>
-defineOptions({
- name: 'algorithmRepository',
-});
+
import { getDictionaryByCode } from '@/api/system/dictbiz';
import { getalgorithmList, selectDeviceList } from '@/api/algorithm';
-import { getSmallImg } from '@/utils/util';
+import { getSmallImg,getShowImg } from '@/utils/util';
import { useRouter } from 'vue-router';
const router = useRouter();
const baseUrl = import.meta.env.VITE_APP_PICTURE_URL;
@@ -124,13 +127,9 @@
device_name: '',
name: '',
current: 1,
- size: 10,
+ size: 15,
});
-// const getSmallImg = (url) => {
-
-// return url ? encodeURI(url.substring(0, url.lastIndexOf('.')) + '_small' + url.substring(url.lastIndexOf('.'))) : ''
-// }
// 请求字典字段
let AlgorithmData = ref([]);
const detailData = ref([]);
@@ -157,7 +156,15 @@
};
// 详情
const getList = () => {
- getalgorithmList(params.value).then(res => {
+const detailParams={
+ ai_type_key: params.value.ai_type_key,
+ start_date:params.value.start_date,
+ end_date: params.value.end_date,
+ device_name: params.value.device_name,
+ name:params.value.name,
+}
+ getalgorithmList(detailParams,{ current: params.value.current,
+ size: params.value.size,}).then(res => {
loading.value = true;
detailData.value = res.data.data.records;
total.value = res.data.data.total;
@@ -177,19 +184,31 @@
params.value.start_date = taskData.value.length ? `${taskData.value[0]} 00:00:00` : null;
params.value.end_date = taskData.value.length ? `${taskData.value[1]} 23:59:59` : null;
};
-const handleSearch = () => {
+// 处理日期清空
+const handleDateClear = () => {
+ taskData.value = ''; // 清空绑定的日期数据
+ params.value.start_date = null; // 重置开始日期参数
+ params.value.end_date = null; // 重置结束日期参数
getList();
};
+const handleSearch = () => {
+ getList();
+
+};
const handleReset = () => {
+taskData.value =''
params.value.start_date = null;
params.value.end_date = null;
params.value.device_name = '';
params.value.name = '';
getList();
+
};
const goback = () => {
showDetail.value = false;
activeItem.value = null;
+ params.value.current =1
+ params.value.size=15
};
// 分页大小改变
const handleSizeChange = val => {
@@ -208,15 +227,19 @@
</script>
<style scoped lang="scss">
+.algorithContainer {
+height: 100%;
+overflow: auto;
+}
.algorithItem {
- padding: 20px;
+ // padding: 20px;
display: grid;
grid-template-columns: repeat(5, 1fr);
- gap: 53px;
+ // gap: 13px;
text-align: center;
vertical-align: middle;
.item {
- height: 300px;
+ height: 267px;
display: flex;
flex-direction: column;
justify-content: center;
@@ -231,11 +254,12 @@
.imgicon {
width: 100px;
height: 100px;
- margin-bottom: 47px;
+ margin-bottom: 17px;
}
&:hover {
background: url('/src/assets/images/ht-sfbg-hover.png') no-repeat center;
background-size: 100% 100%;
+ cursor: pointer;
}
&.active-bg {
background: url('/src/assets/images/ht-sfbg-click.png') no-repeat center;
@@ -275,18 +299,24 @@
}
.algorithItemDetail {
padding: 20px;
-
+
+ .pictureBox {
+ // height: 625px;
+ height: pxToVh(760);
+ overflow: auto;
+ }
.pictureitem {
+
display: grid;
grid-template-columns: repeat(5, 1fr);
- gap: 24px;
+ gap: 14px;
.imgitem {
border-radius: 12px 12px 0 0;
overflow: hidden;
.el-image {
width: 100%;
- height: 200px;
+ height: 170px;
display: block;
margin: 0;
padding: 0;
@@ -295,7 +325,7 @@
display: flex;
justify-content: space-between;
align-items: center;
- height: 42px;
+ height: 35px;
border-radius: 0 0 12px 12px;
overflow: hidden;
background: linear-gradient(180deg, #ffffff 0%, #e5edff 100%);
diff --git a/src/views/authority/apiscope.vue b/src/views/authority/apiscope.vue
index 32c2d0e..f0159ff 100644
--- a/src/views/authority/apiscope.vue
+++ b/src/views/authority/apiscope.vue
@@ -1,39 +1,17 @@
<template>
<basic-container>
- <avue-crud
- :option="option"
- :table-loading="loading"
- :data="data"
- ref="crud"
- v-model="form"
- :permission="permissionList"
- :before-open="beforeOpen"
- @row-del="rowDel"
- @row-update="rowUpdate"
- @row-save="rowSave"
- @search-change="searchChange"
- @search-reset="searchReset"
- @selection-change="selectionChange"
- @current-change="currentChange"
- @size-change="sizeChange"
- @refresh-change="refreshChange"
- @on-load="onLoad"
- @tree-load="treeLoad"
- >
+ <avue-crud :option="option" :table-loading="loading" :data="data" ref="crud" v-model="form"
+ :permission="permissionList" :before-open="beforeOpen" @row-del="rowDel" @row-update="rowUpdate"
+ @row-save="rowSave" @search-change="searchChange" @search-reset="searchReset" @selection-change="selectionChange"
+ @current-change="currentChange" @size-change="sizeChange" @refresh-change="refreshChange" @on-load="onLoad"
+ @tree-load="treeLoad">
<template #menu="{ row }">
- <el-button
- type="primary"
- text
- icon="el-icon-setting"
- v-if="permission.api_scope_setting"
- plain
- style="border: 0; background-color: transparent !important"
- @click.stop="handleDataScope(row)"
- >权限配置
+ <el-button type="primary" text icon="el-icon-setting" v-if="permission.api_scope_setting" plain
+ style="border: 0; background-color: transparent !important" @click.stop="handleDataScope(row)">权限配置
</el-button>
</template>
<template #name="{ row }">
- <i :class="row.source" class="namei"/>
+ <i :class="row.source" class="namei" />
<span>{{ row.name }}</span>
</template>
<template #source="{ row }">
@@ -42,36 +20,16 @@
</div>
</template>
</avue-crud>
- <el-drawer
- :title="`[${scopeMenuName}] 接口权限配置`"
- v-model="drawerVisible"
- :direction="direction"
- append-to-body
- :before-close="handleDrawerClose"
- size="1000px"
- >
+ <el-drawer :title="`[${scopeMenuName}] 接口权限配置`" v-model="drawerVisible" :direction="direction" append-to-body
+ :before-close="handleDrawerClose" size="1000px">
<basic-container>
- <avue-crud
- :option="optionScope"
- :data="dataScope"
- :page="pageScope"
- v-model="formScope"
- :table-loading="scopeLoading"
- ref="crudScope"
- @row-del="rowDelScope"
- @row-update="rowUpdateScope"
- @row-save="rowSaveScope"
- :before-open="beforeOpenScope"
- @search-change="searchChangeScope"
- @search-reset="searchResetScope"
- @selection-change="selectionChangeScope"
- @current-change="currentChangeScope"
- @size-change="sizeChangeScope"
- @on-load="onLoadScope"
- >
+ <avue-crud :option="optionScope" :data="dataScope" :page="pageScope" v-model="formScope"
+ :table-loading="scopeLoading" ref="crudScope" @row-del="rowDelScope" @row-update="rowUpdateScope"
+ @row-save="rowSaveScope" :before-open="beforeOpenScope" @search-change="searchChangeScope"
+ @search-reset="searchResetScope" @selection-change="selectionChangeScope" @current-change="currentChangeScope"
+ @size-change="sizeChangeScope" @on-load="onLoadScope">
<template #menu-left>
- <el-button type="danger" icon="el-icon-delete" plain @click="handleDeleteScope"
- >删 除
+ <el-button type="danger" icon="el-icon-delete" plain @click="handleDeleteScope">删 除
</el-button>
</template>
<template #scopeType="{ row }">
@@ -84,19 +42,19 @@
</template>
<script>
-import { add, remove, update, getLazyMenuList, getMenu } from '@/api/system/menu';
+import { add, remove, update, getLazyMenuList, getMenu } from '@/api/system/menu'
import {
addApiScope,
removeApiScope,
updateApiScope,
getListApiScope,
getMenuApiScope,
-} from '@/api/system/scope';
-import { mapGetters } from 'vuex';
-import iconList from '@/config/iconList';
+} from '@/api/system/scope'
+import { mapGetters } from 'vuex'
+import iconList from '@/config/iconList'
export default {
- data() {
+ data () {
return {
form: {},
selectionList: [],
@@ -131,6 +89,10 @@
delBtn: false,
menuWidth: 150,
dialogClickModal: false,
+
+ height: 'auto',
+ calcHeight: 20,
+
column: [
{
label: '菜单名称',
@@ -386,108 +348,108 @@
],
},
dataScope: [],
- };
+ }
},
computed: {
...mapGetters(['permission']),
- permissionList() {
+ permissionList () {
return {
addBtn: this.validData(this.permission.menu_add, false),
viewBtn: this.validData(this.permission.menu_view, false),
delBtn: this.validData(this.permission.menu_delete, false),
editBtn: this.validData(this.permission.menu_edit, false),
- };
+ }
},
- ids() {
- let ids = [];
+ ids () {
+ let ids = []
this.selectionList.forEach(ele => {
- ids.push(ele.id);
- });
- return ids.join(',');
+ ids.push(ele.id)
+ })
+ return ids.join(',')
},
- scopeIds() {
- let ids = [];
+ scopeIds () {
+ let ids = []
this.selectionListScope.forEach(ele => {
- ids.push(ele.id);
- });
- return ids.join(',');
+ ids.push(ele.id)
+ })
+ return ids.join(',')
},
},
methods: {
// 菜单管理模块
- rowSave(row, done, loading) {
+ rowSave (row, done, loading) {
add(row).then(
() => {
- this.onLoad(this.page);
+ this.onLoad(this.page)
this.$message({
type: 'success',
message: '操作成功!',
- });
- done();
+ })
+ done()
},
error => {
- window.console.log(error);
- loading();
+ window.console.log(error)
+ loading()
}
- );
+ )
},
- rowUpdate(row, index, done, loading) {
+ rowUpdate (row, index, done, loading) {
update(row).then(
() => {
- this.onLoad(this.page);
+ this.onLoad(this.page)
this.$message({
type: 'success',
message: '操作成功!',
- });
- done();
+ })
+ done()
},
error => {
- window.console.log(error);
- loading();
+ window.console.log(error)
+ loading()
}
- );
+ )
},
- rowDel(row) {
+ rowDel (row) {
this.$confirm('确定将选择数据删除?', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning',
})
.then(() => {
- return remove(row.id);
+ return remove(row.id)
})
.then(() => {
- this.onLoad(this.page);
+ this.onLoad(this.page)
this.$message({
type: 'success',
message: '操作成功!',
- });
- });
+ })
+ })
},
- searchReset() {
- this.query = {};
- this.parentId = 0;
- this.onLoad(this.page);
+ searchReset () {
+ this.query = {}
+ this.parentId = 0
+ this.onLoad(this.page)
},
- searchChange(params, done) {
- this.query = params;
- this.parentId = '';
- this.page.currentPage = 1;
- this.onLoad(this.page, params);
- done();
+ searchChange (params, done) {
+ this.query = params
+ this.parentId = ''
+ this.page.currentPage = 1
+ this.onLoad(this.page, params)
+ done()
},
- selectionChange(list) {
- this.selectionList = list;
+ selectionChange (list) {
+ this.selectionList = list
},
- selectionClear() {
- this.selectionList = [];
- this.$refs.crud.toggleSelection();
+ selectionClear () {
+ this.selectionList = []
+ this.$refs.crud.toggleSelection()
},
- handleDelete() {
+ handleDelete () {
if (this.selectionList.length === 0) {
- this.$message.warning('请选择至少一条数据');
- return;
+ this.$message.warning('请选择至少一条数据')
+ return
}
this.$confirm('确定将选择数据删除?', {
confirmButtonText: '确定',
@@ -495,119 +457,119 @@
type: 'warning',
})
.then(() => {
- return remove(this.ids);
+ return remove(this.ids)
})
.then(() => {
- this.onLoad(this.page);
+ this.onLoad(this.page)
this.$message({
type: 'success',
message: '操作成功!',
- });
- this.$refs.crud.toggleSelection();
- });
+ })
+ this.$refs.crud.toggleSelection()
+ })
},
- beforeOpen(done, type) {
+ beforeOpen (done, type) {
if (['edit', 'view'].includes(type)) {
getMenu(this.form.id).then(res => {
- this.form = res.data.data;
- });
+ this.form = res.data.data
+ })
}
- done();
+ done()
},
- currentChange(currentPage) {
- this.page.currentPage = currentPage;
+ currentChange (currentPage) {
+ this.page.currentPage = currentPage
},
- sizeChange(pageSize) {
- this.page.pageSize = pageSize;
+ sizeChange (pageSize) {
+ this.page.pageSize = pageSize
},
- refreshChange() {
- this.onLoad(this.page, this.query);
+ refreshChange () {
+ this.onLoad(this.page, this.query)
},
- onLoad(page, params = {}) {
- this.loading = true;
+ onLoad (page, params = {}) {
+ this.loading = true
getLazyMenuList(this.parentId, Object.assign(params, this.query)).then(res => {
- this.data = res.data.data;
- this.loading = false;
- this.selectionClear();
- });
+ this.data = res.data.data
+ this.loading = false
+ this.selectionClear()
+ })
},
- treeLoad(tree, treeNode, resolve) {
- const parentId = tree.id;
+ treeLoad (tree, treeNode, resolve) {
+ const parentId = tree.id
getLazyMenuList(parentId).then(res => {
- resolve(res.data.data);
- });
+ resolve(res.data.data)
+ })
},
// 数据权限模块
- handleDataScope(row) {
- this.drawerVisible = true;
- this.scopeMenuId = row.id;
- this.scopeMenuName = row.name;
- this.onLoadScope(this.pageScope);
+ handleDataScope (row) {
+ this.drawerVisible = true
+ this.scopeMenuId = row.id
+ this.scopeMenuName = row.name
+ this.onLoadScope(this.pageScope)
},
- handleDrawerClose(hide) {
- hide();
+ handleDrawerClose (hide) {
+ hide()
},
- rowSaveScope(row, done, loading) {
+ rowSaveScope (row, done, loading) {
row = {
...row,
menuId: this.scopeMenuId,
- };
+ }
addApiScope(row).then(
() => {
- this.onLoadScope(this.pageScope);
+ this.onLoadScope(this.pageScope)
this.$message({
type: 'success',
message: '操作成功!',
- });
- done();
+ })
+ done()
},
error => {
- window.console.log(error);
- loading();
+ window.console.log(error)
+ loading()
}
- );
+ )
},
- rowUpdateScope(row, index, done, loading) {
+ rowUpdateScope (row, index, done, loading) {
row = {
...row,
menuId: this.scopeMenuId,
- };
+ }
updateApiScope(row).then(
() => {
- this.onLoadScope(this.pageScope);
+ this.onLoadScope(this.pageScope)
this.$message({
type: 'success',
message: '操作成功!',
- });
- done();
+ })
+ done()
},
error => {
- window.console.log(error);
- loading();
+ window.console.log(error)
+ loading()
}
- );
+ )
},
- rowDelScope(row) {
+ rowDelScope (row) {
this.$confirm('确定将选择数据删除?', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning',
})
.then(() => {
- return removeApiScope(row.id);
+ return removeApiScope(row.id)
})
.then(() => {
- this.onLoadScope(this.pageScope);
+ this.onLoadScope(this.pageScope)
this.$message({
type: 'success',
message: '操作成功!',
- });
- });
+ })
+ })
},
- handleDeleteScope() {
+ handleDeleteScope () {
if (this.selectionListScope.length === 0) {
- this.$message.warning('请选择至少一条数据');
- return;
+ this.$message.warning('请选择至少一条数据')
+ return
}
this.$confirm('确定将选择数据删除?', {
confirmButtonText: '确定',
@@ -615,71 +577,63 @@
type: 'warning',
})
.then(() => {
- return removeApiScope(this.scopeIds);
+ return removeApiScope(this.scopeIds)
})
.then(() => {
- this.onLoadScope(this.pageScope);
+ this.onLoadScope(this.pageScope)
this.$message({
type: 'success',
message: '操作成功!',
- });
- this.$refs.crudScope.toggleSelection();
- });
+ })
+ this.$refs.crudScope.toggleSelection()
+ })
},
- beforeOpenScope(done, type) {
+ beforeOpenScope (done, type) {
if (['edit', 'view'].includes(type)) {
getMenuApiScope(this.formScope.id).then(res => {
- this.formScope = res.data.data;
- });
+ this.formScope = res.data.data
+ })
}
- done();
+ done()
},
- searchResetScope() {
- this.onLoadScope(this.pageScope);
+ searchResetScope () {
+ this.onLoadScope(this.pageScope)
},
- searchChangeScope(params, done) {
- this.onLoadScope(this.pageScope, params);
- done();
+ searchChangeScope (params, done) {
+ this.onLoadScope(this.pageScope, params)
+ done()
},
- selectionChangeScope(list) {
- this.selectionListScope = list;
+ selectionChangeScope (list) {
+ this.selectionListScope = list
},
- currentChangeScope(currentPage) {
- this.pageScope.currentPage = currentPage;
+ currentChangeScope (currentPage) {
+ this.pageScope.currentPage = currentPage
},
- sizeChangeScope(pageSize) {
- this.pageScope.pageSize = pageSize;
+ sizeChangeScope (pageSize) {
+ this.pageScope.pageSize = pageSize
},
- onLoadScope(page, params = {}) {
- this.scopeLoading = true;
+ onLoadScope (page, params = {}) {
+ this.scopeLoading = true
const values = {
...params,
menuId: this.scopeMenuId,
- };
+ }
getListApiScope(page.currentPage, page.pageSize, Object.assign(values, this.query)).then(
res => {
- const data = res.data.data;
- this.pageScope.total = data.total;
- this.dataScope = data.records;
- this.selectionListScope = [];
- this.scopeLoading = false;
+ const data = res.data.data
+ this.pageScope.total = data.total
+ this.dataScope = data.records
+ this.selectionListScope = []
+ this.scopeLoading = false
}
- );
+ )
},
},
-};
+}
</script>
<style scoped lang="scss">
.namei {
margin-right: 5px;
}
- :deep(){
- .avue-crud__body{
- .el-form{
- height: 745px;
- overflow: auto;
- }
- }
- }
</style>
\ No newline at end of file
diff --git a/src/views/authority/datascope.vue b/src/views/authority/datascope.vue
index f159d3f..10b4f8c 100644
--- a/src/views/authority/datascope.vue
+++ b/src/views/authority/datascope.vue
@@ -1,40 +1,17 @@
<template>
<basic-container>
- <avue-crud
- :option="option"
- :table-loading="loading"
- :data="data"
- ref="crud"
- v-model="form"
- :permission="permissionList"
- :before-open="beforeOpen"
- :before-close="beforeClose"
- @row-del="rowDel"
- @row-update="rowUpdate"
- @row-save="rowSave"
- @search-change="searchChange"
- @search-reset="searchReset"
- @selection-change="selectionChange"
- @current-change="currentChange"
- @size-change="sizeChange"
- @refresh-change="refreshChange"
- @on-load="onLoad"
- @tree-load="treeLoad"
- >
+ <avue-crud :option="option" :table-loading="loading" :data="data" ref="crud" v-model="form"
+ :permission="permissionList" :before-open="beforeOpen" :before-close="beforeClose" @row-del="rowDel"
+ @row-update="rowUpdate" @row-save="rowSave" @search-change="searchChange" @search-reset="searchReset"
+ @selection-change="selectionChange" @current-change="currentChange" @size-change="sizeChange"
+ @refresh-change="refreshChange" @on-load="onLoad" @tree-load="treeLoad">
<template #menu="{ row }">
- <el-button
- type="primary"
- text
- icon="el-icon-setting"
- v-if="permission.data_scope_setting"
- plain
- style="border: 0; background-color: transparent !important"
- @click.stop="handleDataScope(row)"
- >权限配置
+ <el-button type="primary" text icon="el-icon-setting" v-if="permission.data_scope_setting" plain
+ style="border: 0; background-color: transparent !important" @click.stop="handleDataScope(row)">权限配置
</el-button>
</template>
<template #name="{ row }">
- <i :class="row.source" class="namei" />
+ <i :class="row.source" class="namei" />
<span>{{ row.name }}</span>
</template>
<template #source="{ row }">
@@ -43,36 +20,16 @@
</div>
</template>
</avue-crud>
- <el-drawer
- :title="`[${scopeMenuName}] 数据权限配置`"
- v-model="drawerVisible"
- :direction="direction"
- append-to-body
- :before-close="handleDrawerClose"
- size="1000px"
- >
+ <el-drawer :title="`[${scopeMenuName}] 数据权限配置`" v-model="drawerVisible" :direction="direction" append-to-body
+ :before-close="handleDrawerClose" size="1000px">
<basic-container>
- <avue-crud
- :option="optionScope"
- :data="dataScope"
- :page="pageScope"
- v-model="formScope"
- :table-loading="scopeLoading"
- ref="crudScope"
- @row-del="rowDelScope"
- @row-update="rowUpdateScope"
- @row-save="rowSaveScope"
- :before-open="beforeOpenScope"
- @search-change="searchChangeScope"
- @search-reset="searchResetScope"
- @selection-change="selectionChangeScope"
- @current-change="currentChangeScope"
- @size-change="sizeChangeScope"
- @on-load="onLoadScope"
- >
+ <avue-crud :option="optionScope" :data="dataScope" :page="pageScope" v-model="formScope"
+ :table-loading="scopeLoading" ref="crudScope" @row-del="rowDelScope" @row-update="rowUpdateScope"
+ @row-save="rowSaveScope" :before-open="beforeOpenScope" @search-change="searchChangeScope"
+ @search-reset="searchResetScope" @selection-change="selectionChangeScope" @current-change="currentChangeScope"
+ @size-change="sizeChangeScope" @on-load="onLoadScope">
<template #menu-left>
- <el-button type="danger" icon="el-icon-delete" plain @click="handleDeleteScope"
- >删 除
+ <el-button type="danger" icon="el-icon-delete" plain @click="handleDeleteScope">删 除
</el-button>
</template>
<template #scopeType="{ row }">
@@ -85,20 +42,20 @@
</template>
<script>
-import { add, remove, update, getLazyMenuList, getMenu } from '@/api/system/menu';
+import { add, remove, update, getLazyMenuList, getMenu } from '@/api/system/menu'
import {
addDataScope,
removeDataScope,
updateDataScope,
getListDataScope,
getMenuDataScope,
-} from '@/api/system/scope';
-import { mapGetters } from 'vuex';
-import iconList from '@/config/iconList';
-import func from '@/utils/func';
+} from '@/api/system/scope'
+import { mapGetters } from 'vuex'
+import iconList from '@/config/iconList'
+import func from '@/utils/func'
export default {
- data() {
+ data () {
return {
form: {},
selectionList: [],
@@ -135,6 +92,10 @@
delBtn: false,
menuWidth: 150,
dialogClickModal: false,
+
+ height: 'auto',
+ calcHeight: 20,
+
column: [
{
label: '菜单名称',
@@ -427,150 +388,150 @@
],
},
dataScope: [],
- };
+ }
},
watch: {
- 'formScope.scopeType'() {
- this.initScope();
+ 'formScope.scopeType' () {
+ this.initScope()
},
},
computed: {
...mapGetters(['permission']),
- permissionList() {
+ permissionList () {
return {
addBtn: this.validData(this.permission.menu_add, false),
viewBtn: this.validData(this.permission.menu_view, false),
delBtn: this.validData(this.permission.menu_delete, false),
editBtn: this.validData(this.permission.menu_edit, false),
- };
+ }
},
- ids() {
- let ids = [];
+ ids () {
+ let ids = []
this.selectionList.forEach(ele => {
- ids.push(ele.id);
- });
- return ids.join(',');
+ ids.push(ele.id)
+ })
+ return ids.join(',')
},
- scopeIds() {
- let ids = [];
+ scopeIds () {
+ let ids = []
this.selectionListScope.forEach(ele => {
- ids.push(ele.id);
- });
- return ids.join(',');
+ ids.push(ele.id)
+ })
+ return ids.join(',')
},
},
methods: {
- initScope() {
- const scopeType = func.toInt(this.formScope.scopeType);
- const watchMode = this.watchMode;
+ initScope () {
+ const scopeType = func.toInt(this.formScope.scopeType)
+ const watchMode = this.watchMode
let column = '-',
- name = '暂无';
+ name = '暂无'
if (scopeType === 1) {
- column = '-';
- name = '全部可见';
+ column = '-'
+ name = '全部可见'
} else if (scopeType === 2) {
- column = 'create_user';
- name = '本人可见';
+ column = 'create_user'
+ name = '本人可见'
} else if (scopeType === 3) {
- column = 'create_dept';
- name = '所在机构可见';
+ column = 'create_dept'
+ name = '所在机构可见'
} else if (scopeType === 4) {
- column = 'create_dept';
- name = '所在机构可见及子级可见';
+ column = 'create_dept'
+ name = '所在机构可见及子级可见'
} else if (scopeType === 5) {
- column = '';
- name = '自定义';
+ column = ''
+ name = '自定义'
}
this.$refs.crudScope.option.column.filter(item => {
if (watchMode) {
if (item.prop === 'scopeName') {
- this.formScope.scopeName = `${this.scopeMenuName} [${name}]`;
+ this.formScope.scopeName = `${this.scopeMenuName} [${name}]`
}
if (item.prop === 'resourceCode') {
- this.formScope.resourceCode = this.scopeMenuCode;
+ this.formScope.resourceCode = this.scopeMenuCode
}
if (item.prop === 'scopeColumn') {
- this.formScope.scopeColumn = column;
+ this.formScope.scopeColumn = column
}
}
if (item.prop === 'scopeValue') {
- item.display = scopeType === 5;
+ item.display = scopeType === 5
}
- });
+ })
},
// 菜单管理模块
- rowSave(row, done, loading) {
+ rowSave (row, done, loading) {
add(row).then(
() => {
- this.onLoad(this.page);
+ this.onLoad(this.page)
this.$message({
type: 'success',
message: '操作成功!',
- });
- done();
+ })
+ done()
},
error => {
- window.console.log(error);
- loading();
+ window.console.log(error)
+ loading()
}
- );
+ )
},
- rowUpdate(row, index, done, loading) {
+ rowUpdate (row, index, done, loading) {
update(row).then(
() => {
- this.onLoad(this.page);
+ this.onLoad(this.page)
this.$message({
type: 'success',
message: '操作成功!',
- });
- done();
+ })
+ done()
},
error => {
- window.console.log(error);
- loading();
+ window.console.log(error)
+ loading()
}
- );
+ )
},
- rowDel(row) {
+ rowDel (row) {
this.$confirm('确定将选择数据删除?', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning',
})
.then(() => {
- return remove(row.id);
+ return remove(row.id)
})
.then(() => {
- this.onLoad(this.page);
+ this.onLoad(this.page)
this.$message({
type: 'success',
message: '操作成功!',
- });
- });
+ })
+ })
},
- searchReset() {
- this.query = {};
- this.parentId = 0;
- this.onLoad(this.page);
+ searchReset () {
+ this.query = {}
+ this.parentId = 0
+ this.onLoad(this.page)
},
- searchChange(params, done) {
- this.query = params;
- this.parentId = '';
- this.page.currentPage = 1;
- this.onLoad(this.page, params);
- done();
+ searchChange (params, done) {
+ this.query = params
+ this.parentId = ''
+ this.page.currentPage = 1
+ this.onLoad(this.page, params)
+ done()
},
- selectionChange(list) {
- this.selectionList = list;
+ selectionChange (list) {
+ this.selectionList = list
},
- selectionClear() {
- this.selectionList = [];
- this.$refs.crud.toggleSelection();
+ selectionClear () {
+ this.selectionList = []
+ this.$refs.crud.toggleSelection()
},
- handleDelete() {
+ handleDelete () {
if (this.selectionList.length === 0) {
- this.$message.warning('请选择至少一条数据');
- return;
+ this.$message.warning('请选择至少一条数据')
+ return
}
this.$confirm('确定将选择数据删除?', {
confirmButtonText: '确定',
@@ -578,124 +539,124 @@
type: 'warning',
})
.then(() => {
- return remove(this.ids);
+ return remove(this.ids)
})
.then(() => {
- this.onLoad(this.page);
+ this.onLoad(this.page)
this.$message({
type: 'success',
message: '操作成功!',
- });
- this.$refs.crud.toggleSelection();
- });
+ })
+ this.$refs.crud.toggleSelection()
+ })
},
- beforeOpen(done, type) {
+ beforeOpen (done, type) {
if (['edit', 'view'].includes(type)) {
getMenu(this.form.id).then(res => {
- this.form = res.data.data;
- });
+ this.form = res.data.data
+ })
}
- done();
+ done()
},
- beforeClose(done) {
- this.formScope = {};
- done();
+ beforeClose (done) {
+ this.formScope = {}
+ done()
},
- currentChange(currentPage) {
- this.page.currentPage = currentPage;
+ currentChange (currentPage) {
+ this.page.currentPage = currentPage
},
- sizeChange(pageSize) {
- this.page.pageSize = pageSize;
+ sizeChange (pageSize) {
+ this.page.pageSize = pageSize
},
- refreshChange() {
- this.onLoad(this.page, this.query);
+ refreshChange () {
+ this.onLoad(this.page, this.query)
},
- onLoad(page, params = {}) {
- this.loading = true;
+ onLoad (page, params = {}) {
+ this.loading = true
getLazyMenuList(this.parentId, Object.assign(params, this.query)).then(res => {
- this.data = res.data.data;
- this.loading = false;
- this.selectionClear();
- });
+ this.data = res.data.data
+ this.loading = false
+ this.selectionClear()
+ })
},
- treeLoad(tree, treeNode, resolve) {
- const parentId = tree.id;
+ treeLoad (tree, treeNode, resolve) {
+ const parentId = tree.id
getLazyMenuList(parentId).then(res => {
- resolve(res.data.data);
- });
+ resolve(res.data.data)
+ })
},
// 数据权限模块
- handleDataScope(row) {
- this.drawerVisible = true;
- this.scopeMenuId = row.id;
- this.scopeMenuCode = row.code;
- this.scopeMenuName = row.name;
- this.onLoadScope(this.pageScope);
+ handleDataScope (row) {
+ this.drawerVisible = true
+ this.scopeMenuId = row.id
+ this.scopeMenuCode = row.code
+ this.scopeMenuName = row.name
+ this.onLoadScope(this.pageScope)
},
- handleDrawerClose(hide) {
- hide();
+ handleDrawerClose (hide) {
+ hide()
},
- rowSaveScope(row, done, loading) {
+ rowSaveScope (row, done, loading) {
row = {
...row,
menuId: this.scopeMenuId,
- };
+ }
addDataScope(row).then(
() => {
- this.onLoadScope(this.pageScope);
+ this.onLoadScope(this.pageScope)
this.$message({
type: 'success',
message: '操作成功!',
- });
- done();
+ })
+ done()
},
error => {
- window.console.log(error);
- loading();
+ window.console.log(error)
+ loading()
}
- );
+ )
},
- rowUpdateScope(row, index, done, loading) {
+ rowUpdateScope (row, index, done, loading) {
row = {
...row,
menuId: this.scopeMenuId,
- };
+ }
updateDataScope(row).then(
() => {
- this.onLoadScope(this.pageScope);
+ this.onLoadScope(this.pageScope)
this.$message({
type: 'success',
message: '操作成功!',
- });
- done();
+ })
+ done()
},
error => {
- window.console.log(error);
- loading();
+ window.console.log(error)
+ loading()
}
- );
+ )
},
- rowDelScope(row) {
+ rowDelScope (row) {
this.$confirm('确定将选择数据删除?', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning',
})
.then(() => {
- return removeDataScope(row.id);
+ return removeDataScope(row.id)
})
.then(() => {
- this.onLoadScope(this.pageScope);
+ this.onLoadScope(this.pageScope)
this.$message({
type: 'success',
message: '操作成功!',
- });
- });
+ })
+ })
},
- handleDeleteScope() {
+ handleDeleteScope () {
if (this.selectionListScope.length === 0) {
- this.$message.warning('请选择至少一条数据');
- return;
+ this.$message.warning('请选择至少一条数据')
+ return
}
this.$confirm('确定将选择数据删除?', {
confirmButtonText: '确定',
@@ -703,76 +664,68 @@
type: 'warning',
})
.then(() => {
- return removeDataScope(this.scopeIds);
+ return removeDataScope(this.scopeIds)
})
.then(() => {
- this.onLoadScope(this.pageScope);
+ this.onLoadScope(this.pageScope)
this.$message({
type: 'success',
message: '操作成功!',
- });
- this.$refs.crudScope.toggleSelection();
- });
+ })
+ this.$refs.crudScope.toggleSelection()
+ })
},
- beforeOpenScope(done, type) {
+ beforeOpenScope (done, type) {
if (['add'].includes(type)) {
- this.watchMode = true;
- this.initScope();
+ this.watchMode = true
+ this.initScope()
}
if (['edit', 'view'].includes(type)) {
- this.watchMode = false;
+ this.watchMode = false
getMenuDataScope(this.formScope.id).then(res => {
- this.formScope = res.data.data;
- });
+ this.formScope = res.data.data
+ })
}
- done();
+ done()
},
- searchResetScope() {
- this.onLoadScope(this.pageScope);
+ searchResetScope () {
+ this.onLoadScope(this.pageScope)
},
- searchChangeScope(params, done) {
- this.onLoadScope(this.pageScope, params);
- done();
+ searchChangeScope (params, done) {
+ this.onLoadScope(this.pageScope, params)
+ done()
},
- selectionChangeScope(list) {
- this.selectionListScope = list;
+ selectionChangeScope (list) {
+ this.selectionListScope = list
},
- currentChangeScope(currentPage) {
- this.pageScope.currentPage = currentPage;
+ currentChangeScope (currentPage) {
+ this.pageScope.currentPage = currentPage
},
- sizeChangeScope(pageSize) {
- this.pageScope.pageSize = pageSize;
+ sizeChangeScope (pageSize) {
+ this.pageScope.pageSize = pageSize
},
- onLoadScope(page, params = {}) {
- this.scopeLoading = true;
+ onLoadScope (page, params = {}) {
+ this.scopeLoading = true
const values = {
...params,
menuId: this.scopeMenuId,
- };
+ }
getListDataScope(page.currentPage, page.pageSize, Object.assign(values, this.query)).then(
res => {
- const data = res.data.data;
- this.pageScope.total = data.total;
- this.dataScope = data.records;
- this.selectionListScope = [];
- this.scopeLoading = false;
+ const data = res.data.data
+ this.pageScope.total = data.total
+ this.dataScope = data.records
+ this.selectionListScope = []
+ this.scopeLoading = false
}
- );
+ )
},
},
-};
+}
</script>
<style scoped lang="scss">
.namei {
margin-right: 5px;
}
- :deep(){
- .avue-crud__body{
- .el-form{
- height: 745px;
- overflow: auto;
- }
- }
- }
</style>
\ No newline at end of file
diff --git a/src/views/authority/role.vue b/src/views/authority/role.vue
index 9fe617b..65400e6 100644
--- a/src/views/authority/role.vue
+++ b/src/views/authority/role.vue
@@ -1,39 +1,13 @@
<template>
<basic-container>
- <avue-crud
- :option="option"
- :table-loading="loading"
- :data="data"
- ref="crud"
- v-model="form"
- :permission="permissionList"
- :before-open="beforeOpen"
- @row-del="rowDel"
- @row-update="rowUpdate"
- @row-save="rowSave"
- @search-change="searchChange"
- @search-reset="searchReset"
- @selection-change="selectionChange"
- @current-change="currentChange"
- @size-change="sizeChange"
- @refresh-change="refreshChange"
- @on-load="onLoad"
- >
+ <avue-crud :option="option" :table-loading="loading" :data="data" ref="crud" v-model="form"
+ :permission="permissionList" :before-open="beforeOpen" @row-del="rowDel" @row-update="rowUpdate"
+ @row-save="rowSave" @search-change="searchChange" @search-reset="searchReset" @selection-change="selectionChange"
+ @current-change="currentChange" @size-change="sizeChange" @refresh-change="refreshChange" @on-load="onLoad">
<template #menu-left>
- <el-button
- type="danger"
- icon="el-icon-delete"
- v-if="permission.role_delete"
- plain
- @click="handleDelete"
- >删 除
+ <el-button type="danger" icon="el-icon-delete" v-if="permission.role_delete" plain @click="handleDelete">删 除
</el-button>
- <el-button
- icon="el-icon-setting"
- v-if="userInfo.role_name.includes('admin')"
- @click="handleRole"
- plain
- >权限设置
+ <el-button icon="el-icon-setting" v-if="userInfo.role_name.includes('admin')" @click="handleRole" plain>权限设置
</el-button>
<!-- -->
</template>
@@ -41,14 +15,8 @@
<el-dialog title="角色权限配置" append-to-body v-model="box" width="345px">
<el-tabs type="border-card">
<el-tab-pane label="菜单权限">
- <el-tree
- :data="menuGrantList"
- show-checkbox
- node-key="id"
- ref="treeMenu"
- :default-checked-keys="menuTreeObj"
- :props="props"
- >
+ <el-tree :data="menuGrantList" show-checkbox node-key="id" ref="treeMenu" :default-checked-keys="menuTreeObj"
+ :props="props">
</el-tree>
</el-tab-pane>
<!-- <el-tab-pane label="数据权限">
@@ -94,12 +62,12 @@
grantTree,
remove,
update,
-} from '@/api/system/role';
-import { mapGetters } from 'vuex';
-import website from '@/config/website';
+} from '@/api/system/role'
+import { mapGetters } from 'vuex'
+import website from '@/config/website'
export default {
- data() {
+ data () {
return {
form: {},
box: false,
@@ -134,6 +102,10 @@
viewBtn: true,
dialogWidth: 900,
dialogClickModal: false,
+
+ height: 'auto',
+ calcHeight: 20,
+
column: [
{
label: '角色名称',
@@ -218,152 +190,152 @@
],
},
data: [],
- };
+ }
},
computed: {
...mapGetters(['userInfo', 'permission']),
- permissionList() {
+ permissionList () {
return {
addBtn: this.validData(this.permission.role_add, false),
viewBtn: this.validData(this.permission.role_view, false),
delBtn: this.validData(this.permission.role_delete, false),
editBtn: this.validData(this.permission.role_edit, false),
- };
+ }
},
- ids() {
- let ids = [];
+ ids () {
+ let ids = []
this.selectionList.forEach(ele => {
- ids.push(ele.id);
- });
- return ids.join(',');
+ ids.push(ele.id)
+ })
+ return ids.join(',')
},
- idsArray() {
- let ids = [];
+ idsArray () {
+ let ids = []
this.selectionList.forEach(ele => {
- ids.push(ele.id);
- });
- return ids;
+ ids.push(ele.id)
+ })
+ return ids
},
},
methods: {
- initData(roleId) {
+ initData (roleId) {
getRoleTreeById(roleId).then(res => {
- const column = this.findObject(this.option.column, 'parentId');
- column.dicData = res.data.data;
- });
+ const column = this.findObject(this.option.column, 'parentId')
+ column.dicData = res.data.data
+ })
},
- submit() {
- const menuList = this.$refs.treeMenu.getCheckedKeys();
+ submit () {
+ const menuList = this.$refs.treeMenu.getCheckedKeys()
// const dataScopeList = this.$refs.treeDataScope.getCheckedKeys();
- const dataScopeList = [];
+ const dataScopeList = []
// const apiScopeList = this.$refs.treeApiScope.getCheckedKeys();
- const apiScopeList = [];
+ const apiScopeList = []
grant(this.idsArray, menuList, dataScopeList, apiScopeList).then(() => {
- this.box = false;
+ this.box = false
this.$message({
type: 'success',
message: '操作成功!',
- });
- this.onLoad(this.page);
- });
+ })
+ this.onLoad(this.page)
+ })
},
- rowSave(row, done, loading) {
+ rowSave (row, done, loading) {
add(row).then(
() => {
- this.onLoad(this.page);
+ this.onLoad(this.page)
this.$message({
type: 'success',
message: '操作成功!',
- });
- done();
+ })
+ done()
},
error => {
- window.console.log(error);
- loading();
+ window.console.log(error)
+ loading()
}
- );
+ )
},
- rowUpdate(row, index, done, loading) {
+ rowUpdate (row, index, done, loading) {
update(row).then(
() => {
- this.onLoad(this.page);
+ this.onLoad(this.page)
this.$message({
type: 'success',
message: '操作成功!',
- });
- done();
+ })
+ done()
},
error => {
- window.console.log(error);
- loading();
+ window.console.log(error)
+ loading()
}
- );
+ )
},
- rowDel(row) {
+ rowDel (row) {
this.$confirm('确定将选择数据删除?', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning',
})
.then(() => {
- return remove(row.id);
+ return remove(row.id)
})
.then(() => {
- this.onLoad(this.page);
+ this.onLoad(this.page)
this.$message({
type: 'success',
message: '操作成功!',
- });
- });
+ })
+ })
},
- searchReset() {
- this.query = {};
- this.onLoad(this.page);
+ searchReset () {
+ this.query = {}
+ this.onLoad(this.page)
},
- searchChange(params, done) {
- this.query = params;
- this.page.currentPage = 1;
- this.onLoad(this.page, params);
- done();
+ searchChange (params, done) {
+ this.query = params
+ this.page.currentPage = 1
+ this.onLoad(this.page, params)
+ done()
},
- selectionChange(list) {
- this.selectionList = list;
+ selectionChange (list) {
+ this.selectionList = list
},
- selectionClear() {
- this.selectionList = [];
- this.$refs.crud.toggleSelection();
+ selectionClear () {
+ this.selectionList = []
+ this.$refs.crud.toggleSelection()
},
- beforeOpen(done, type) {
+ beforeOpen (done, type) {
if (['add', 'edit'].includes(type)) {
- this.initData(this.form.id);
+ this.initData(this.form.id)
}
- done();
+ done()
},
- handleRole() {
+ handleRole () {
if (this.selectionList.length !== 1) {
- this.$message.warning('只能选择一条数据');
- return;
+ this.$message.warning('只能选择一条数据')
+ return
}
- this.menuTreeObj = [];
- this.dataScopeTreeObj = [];
- this.apiScopeTreeObj = [];
+ this.menuTreeObj = []
+ this.dataScopeTreeObj = []
+ this.apiScopeTreeObj = []
grantTree().then(res => {
- this.menuGrantList = res.data.data.menu;
- this.dataScopeGrantList = res.data.data.dataScope;
- this.apiScopeGrantList = res.data.data.apiScope;
+ this.menuGrantList = res.data.data.menu
+ this.dataScopeGrantList = res.data.data.dataScope
+ this.apiScopeGrantList = res.data.data.apiScope
getRole(this.ids).then(res => {
- this.menuTreeObj = res.data.data.menu;
- this.dataScopeTreeObj = res.data.data.dataScope;
- this.apiScopeTreeObj = res.data.data.apiScope;
- this.box = true;
- });
- });
+ this.menuTreeObj = res.data.data.menu
+ this.dataScopeTreeObj = res.data.data.dataScope
+ this.apiScopeTreeObj = res.data.data.apiScope
+ this.box = true
+ })
+ })
},
- handleDelete() {
+ handleDelete () {
if (this.selectionList.length === 0) {
- this.$message.warning('请选择至少一条数据');
- return;
+ this.$message.warning('请选择至少一条数据')
+ return
}
this.$confirm('确定将选择数据删除?', {
confirmButtonText: '确定',
@@ -371,44 +343,35 @@
type: 'warning',
})
.then(() => {
- return remove(this.ids);
+ return remove(this.ids)
})
.then(() => {
- this.onLoad(this.page);
+ this.onLoad(this.page)
this.$message({
type: 'success',
message: '操作成功!',
- });
- this.$refs.crud.toggleSelection();
- });
+ })
+ this.$refs.crud.toggleSelection()
+ })
},
- currentChange(currentPage) {
- this.page.currentPage = currentPage;
+ currentChange (currentPage) {
+ this.page.currentPage = currentPage
},
- sizeChange(pageSize) {
- this.page.pageSize = pageSize;
+ sizeChange (pageSize) {
+ this.page.pageSize = pageSize
},
- refreshChange() {
- this.onLoad(this.page, this.query);
+ refreshChange () {
+ this.onLoad(this.page, this.query)
},
- onLoad(page, params = {}) {
- this.loading = true;
+ onLoad (page, params = {}) {
+ this.loading = true
getList(page.currentPage, page.pageSize, Object.assign(params, this.query)).then(res => {
- this.data = res.data.data;
- this.loading = false;
- this.selectionClear();
- });
+ this.data = res.data.data
+ this.loading = false
+ this.selectionClear()
+ })
},
},
-};
+}
</script>
-<style scoped lang="scss">
- :deep(){
- .avue-crud__body{
- .el-form{
- height: 745px;
- overflow: auto;
- }
- }
- }
-</style>
\ No newline at end of file
+<style scoped lang="scss"></style>
\ No newline at end of file
diff --git a/src/views/base/region.vue b/src/views/base/region.vue
index 012b64e..79c0f49 100644
--- a/src/views/base/region.vue
+++ b/src/views/base/region.vue
@@ -1,111 +1,93 @@
<template>
- <el-row>
- <el-col :span="9">
- <div class="box">
+ <div class="manage-p-all-10 manage-p-t-0 manage-h-0 manage-flex-1 manage-flex">
+ <div
+ class="manage-p-all-20 manage-flex-2 manage-h-100 manage-b-r-5 manage-box-s-b-b manage-overflow-h manage-b-c-w">
+ <div class="box ">
<el-scrollbar>
- <basic-container>
+ <div class="manage-w-100 manage-h-100">
<avue-tree :option="treeOption" :data="treeData" @node-click="nodeClick" />
- </basic-container>
+ </div>
</el-scrollbar>
</div>
- </el-col>
- <el-col :span="15">
- <basic-container>
- <el-button-group>
- <el-button
- v-if="permission.region_add"
- type="primary"
- icon="el-icon-plus"
- @click="addChildren"
- >新增下级
- </el-button>
- <el-button
- v-if="permission.region_delete"
- type="primary"
- icon="el-icon-delete"
- @click="handleDelete"
- >删除
- </el-button>
- <el-button
- v-if="permission.region_import"
- type="primary"
- icon="el-icon-upload"
- @click="handleImport"
- >导入
- </el-button>
- <el-button
- v-if="permission.region_export"
- type="primary"
- icon="el-icon-download"
- @click="handleExport"
- >导出
- </el-button>
- <el-button
- v-if="permission.region_debug"
- type="primary"
- icon="el-icon-video-play"
- @click="handleDebug"
- >调试
- </el-button>
- </el-button-group>
- </basic-container>
- <basic-container>
- <avue-form ref="form" :option="regionOption" v-model="regionForm" @submit="handleSubmit">
- <template #code="{}">
- <el-input placeholder="请输入 区划子编号" v-model="regionForm.subCode">
- <template #prepend>{{ regionForm.parentCode }}</template>
- </el-input>
- </template>
- </avue-form>
- <el-dialog title="行政区划数据导入" append-to-body v-model="excelBox" width="555px">
- <avue-form :option="excelOption" v-model="excelForm" :upload-after="uploadAfter">
- <template #excelTemplate>
- <el-button type="primary" @click="handleTemplate">
- 点击下载<i class="el-icon-download el-icon--right"></i>
- </el-button>
+ </div>
+
+ <div
+ class="manage-p-all-10 manage-p-t-0 manage-p-b-0 manage-flex-4 manage-h-100 manage-flex manage-box-s-b-b manage-f-d-c">
+ <div class="manage-p-all-20 manage-flex manage-f-d-c manage-h-100 manage-box-s-b-b manage-b-c-w manage-b-r-5">
+ <div>
+ <el-button-group>
+ <el-button v-if="permission.region_add" type="primary" icon="el-icon-plus" @click="addChildren">新增下级
+ </el-button>
+ <el-button v-if="permission.region_delete" type="primary" icon="el-icon-delete" @click="handleDelete">删除
+ </el-button>
+ <el-button v-if="permission.region_import" type="primary" icon="el-icon-upload" @click="handleImport">导入
+ </el-button>
+ <el-button v-if="permission.region_export" type="primary" icon="el-icon-download" @click="handleExport">导出
+ </el-button>
+ <el-button v-if="permission.region_debug" type="primary" icon="el-icon-video-play" @click="handleDebug">调试
+ </el-button>
+ </el-button-group>
+ </div>
+
+ <div class="manage-m-t-20 manage-h-0 manage-flex-1 ">
+ <avue-form ref="form" :option="regionOption" v-model="regionForm" @submit="handleSubmit">
+ <template #code="{ }">
+ <el-input placeholder="请输入 区划子编号" v-model="regionForm.subCode">
+ <template #prepend>{{ regionForm.parentCode }}</template>
+ </el-input>
</template>
</avue-form>
- </el-dialog>
- <el-dialog title="行政区划数据调试" append-to-body v-model="debugBox" width="350px">
- <avue-form :option="debugOption" v-model="debugForm" />
- </el-dialog>
- </basic-container>
- </el-col>
- </el-row>
+ <el-dialog title="行政区划数据导入" append-to-body v-model="excelBox" width="555px">
+ <avue-form :option="excelOption" v-model="excelForm" :upload-after="uploadAfter">
+ <template #excelTemplate>
+ <el-button type="primary" @click="handleTemplate">
+ 点击下载<i class="el-icon-download el-icon--right"></i>
+ </el-button>
+ </template>
+ </avue-form>
+ </el-dialog>
+ <el-dialog title="行政区划数据调试" append-to-body v-model="debugBox" width="350px">
+ <avue-form :option="debugOption" v-model="debugForm" />
+ </el-dialog>
+ </div>
+ </div>
+ </div>
+ </div>
</template>
<script>
-import { getLazyTree, getDetail, submit, remove } from '@/api/base/region';
-import { exportBlob } from '@/api/common';
-import { mapGetters } from 'vuex';
-import { validatenull } from '@/utils/validate';
-import { downloadXls } from '@/utils/util';
-import { getToken } from '@/utils/auth';
-import NProgress from 'nprogress';
-import 'nprogress/nprogress.css';
+import { getLazyTree, getDetail, submit, remove } from '@/api/base/region'
+import { exportBlob } from '@/api/common'
+import { mapGetters } from 'vuex'
+import { validatenull } from '@/utils/validate'
+import { downloadXls } from '@/utils/util'
+import { getToken } from '@/utils/auth'
+import NProgress from 'nprogress'
+import 'nprogress/nprogress.css'
export default {
- data() {
+ data () {
return {
topCode: '00',
treeCode: '',
treeParentCode: '',
+ loading: null,
treeData: [],
treeOption: {
nodeKey: 'id',
lazy: true,
treeLoad: function (node, resolve) {
- const parentCode = node.level === 0 ? '000000000000' : node.data.id;
+ const parentCode = node.level === 0 ? '000000000000' : node.data.id
getLazyTree(parentCode).then(res => {
resolve(
res.data.data.map(item => {
return {
...item,
leaf: !item.hasChildren,
- };
+ }
})
- );
- });
+ )
+ })
},
addBtn: false,
menu: false,
@@ -310,96 +292,99 @@
},
],
},
- };
+ }
},
watch: {
- 'regionForm.subCode'() {
- this.regionForm.code = this.regionForm.parentCode + this.regionForm.subCode;
+ 'regionForm.subCode' () {
+ this.regionForm.code = this.regionForm.parentCode + this.regionForm.subCode
},
- 'excelForm.isCovered'() {
+ 'excelForm.isCovered' () {
if (this.excelForm.isCovered !== '') {
- const column = this.findObject(this.excelOption.column, 'excelFile');
- column.action = `/blade-system/region/import-region?isCovered=${this.excelForm.isCovered}`;
+ const column = this.findObject(this.excelOption.column, 'excelFile')
+ column.action = `/blade-system/region/import-region?isCovered=${this.excelForm.isCovered}`
}
},
},
computed: {
...mapGetters(['permission']),
- permissionList() {
+ permissionList () {
return {
addBtn: this.validData(this.permission.region_add, false),
viewBtn: this.validData(this.permission.region_view, false),
delBtn: this.validData(this.permission.region_delete, false),
editBtn: this.validData(this.permission.region_edit, false),
- };
+ }
},
- ids() {
- let ids = [];
+ ids () {
+ let ids = []
this.selectionList.forEach(ele => {
- ids.push(ele.id);
- });
- return ids.join(',');
+ ids.push(ele.id)
+ })
+ return ids.join(',')
},
},
methods: {
- initTree() {
- this.treeData = [];
+ initTree () {
+ this.treeData = []
getLazyTree(this.topCode).then(res => {
this.treeData = res.data.data.map(item => {
return {
...item,
leaf: !item.hasChildren,
- };
- });
- });
+ }
+ })
+ })
},
- nodeClick(data) {
- const column = this.findObject(this.regionOption.column, 'parentCode');
- column.disabled = true;
- this.treeCode = data.id;
- this.treeParentCode = data.parentId;
+ nodeClick (data) {
+ const column = this.findObject(this.regionOption.column, 'parentCode')
+ column.disabled = true
+ this.treeCode = data.id
+ this.treeParentCode = data.parentId
getDetail(this.treeCode).then(res => {
- this.regionForm = res.data.data;
- this.regionForm.subCode = this.regionForm.code.replace(this.regionForm.parentCode, '');
- });
+ this.regionForm = res.data.data
+ this.regionForm.subCode = this.regionForm.code.replace(this.regionForm.parentCode, '')
+ })
},
- addChildren() {
+ addChildren () {
if (validatenull(this.regionForm.code) || validatenull(this.regionForm.name)) {
- this.$message.warning('请先选择一项区划');
- return;
+ this.$message.warning('请先选择一项区划')
+ return
}
- this.regionForm.parentCode = this.regionForm.code;
- this.regionForm.parentName = this.regionForm.name;
- this.regionForm.code = '';
- this.regionForm.subCode = '';
- this.regionForm.name = '';
+ this.regionForm.parentCode = this.regionForm.code
+ this.regionForm.parentName = this.regionForm.name
+ this.regionForm.code = ''
+ this.regionForm.subCode = ''
+ this.regionForm.name = ''
this.regionForm.regionLevel =
- this.regionForm.regionLevel === 5 ? 5 : this.regionForm.regionLevel + 1;
+ this.regionForm.regionLevel === 5 ? 5 : this.regionForm.regionLevel + 1
},
- handleSubmit(form, done, loading) {
- const parentCode = form.parentCode === this.topCode ? '' : form.parentCode;
- form.code = parentCode + form.subCode;
+ handleSubmit (form, done, loading) {
+ const parentCode = form.parentCode === this.topCode ? '' : form.parentCode
+ // form.code = parentCode + form.subCode;
+ form.code = form.subCode
submit(form).then(
() => {
this.$message({
type: 'success',
message: '操作成功!',
- });
- this.initTree();
- this.regionForm.subCode = '';
- this.$refs.form.resetForm();
- done();
+ })
+ this.initTree()
+ this.regionForm.subCode = ''
+ this.$refs.form.resetForm()
+ done()
+ console.log('成功')
+
},
error => {
- loading();
- window.console.log(error);
+ // loading();
+ window.console.log(error)
}
- );
+ )
},
- handleDelete() {
+ handleDelete () {
if (validatenull(this.regionForm.code)) {
- this.$message.warning('请先选择一项区划');
- return;
+ this.$message.warning('请先选择一项区划')
+ return
}
this.$confirm(`确定将 [${this.regionForm.name}] 数据删除?`, {
confirmButtonText: '确定',
@@ -407,66 +392,66 @@
type: 'warning',
})
.then(() => {
- return remove(this.treeCode);
+ return remove(this.treeCode)
})
.then(() => {
this.$message({
type: 'success',
message: '操作成功!',
- });
- this.initTree();
- this.regionForm.subCode = '';
- this.$refs.form.resetForm();
- });
+ })
+ this.initTree()
+ this.regionForm.subCode = ''
+ this.$refs.form.resetForm()
+ })
},
- uploadAfter(res, done, loading, column) {
- window.console.log(column);
- this.excelBox = false;
- this.initTree();
- done();
+ uploadAfter (res, done, loading, column) {
+ window.console.log(column)
+ this.excelBox = false
+ this.initTree()
+ done()
},
- handleDebug() {
- this.debugBox = true;
+ handleDebug () {
+ this.debugBox = true
},
- handleImport() {
- this.excelBox = true;
+ handleImport () {
+ this.excelBox = true
},
- handleExport() {
+ handleExport () {
this.$confirm('是否导出行政区划数据?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning',
}).then(() => {
- NProgress.start();
+ NProgress.start()
exportBlob(
`/blade-system/region/export-region?${this.website.tokenHeader}=${getToken()}`
).then(res => {
- downloadXls(res.data, `行政区划数据${this.$dayjs().format('YYYY-MM-DD HH:mm:ss')}.xlsx`);
- NProgress.done();
- });
- });
+ downloadXls(res.data, `行政区划数据${this.$dayjs().format('YYYY-MM-DD HH:mm:ss')}.xlsx`)
+ NProgress.done()
+ })
+ })
},
- handleTemplate() {
+ handleTemplate () {
exportBlob(
`/blade-system/region/export-template?${this.website.tokenHeader}=${getToken()}`
).then(res => {
- downloadXls(res.data, '行政区划模板.xlsx');
- });
+ downloadXls(res.data, '行政区划模板.xlsx')
+ })
},
},
-};
+}
</script>
-<style>
+<style lang="scss" scoped>
.box {
- height: 800px;
-}
-
-.el-scrollbar {
height: 100%;
}
-.box .el-scrollbar__wrap {
- overflow: scroll;
+::v-deep(.el-scrollbar) {
+ height: 100%;
+
+ .el-scrollbar__wrap {
+ overflow: auto;
+ }
}
</style>
diff --git a/src/views/dataCenter/components/dataCenterMap.vue b/src/views/dataCenter/components/dataCenterMap.vue
index 39930fd..cc787c7 100644
--- a/src/views/dataCenter/components/dataCenterMap.vue
+++ b/src/views/dataCenter/components/dataCenterMap.vue
@@ -111,13 +111,11 @@
restoreAllIcons();
if (currentClickEntity.billboard) {
const status = currentClickEntity?.properties?._customData?._value?.data.status;
- console.log('stayus', currentClickEntity?.properties?._customData?._value?.data);
currentClickEntity.billboard.image =
status === 1 || status === null ? activeIcon : getEventActiveImage(status);
currentClickEntity.billboard.scale = 1; // 可选缩放效果
activeEntity.value = currentClickEntity;
}
-
removeLabel();
viewer.scene.postRender.addEventListener(labelBoxUpdate);
};
@@ -128,7 +126,6 @@
handler = new Cesium.ScreenSpaceEventHandler(viewer?.scene.canvas);
handler.setInputAction(singleMachineEvent, Cesium.ScreenSpaceEventType.LEFT_CLICK);
};
-
// 清除所有数据点实体
const clearDataPoints = () => {
if (!viewer) return;
@@ -138,7 +135,6 @@
dataPointEntities.value = [];
activeEntity.value = null;
};
-
const removeHandler = () => {
handler?.removeInputAction(Cesium.ScreenSpaceEventType.LEFT_CLICK);
handler?.destroy();
@@ -147,11 +143,7 @@
const renderDataPoint = mapList => {
if (!viewer || !mapList?.length) return;
-
- // 清除旧实体
clearDataPoints();
-
- // 添加新实体
mapList.forEach((item, index) => {
const entity = viewer?.entities.add({
id: `dataCenter-point-${index}-${Date.now()}`,
@@ -210,12 +202,9 @@
viewerRef.value = viewer;
isViewerReady.value = true;
-
// 初始化事件处理器
handlerInit();
isMapInitialized.value = true;
- console.log('地图初始化完成');
- // 初始化后立即渲染已有数据
if (dataPointList.value.length > 0) {
renderDataPoint(dataPointList.value);
}
@@ -243,9 +232,7 @@
try {
const res = await getMapInfoAPI(ids);
dataPointList.value = res.data.data || [];
- console.log('dataPointList.value', dataPointList.value);
-
- // 确保地图已初始化后再渲染
+
if (isMapInitialized.value && viewer) {
renderDataPoint(dataPointList.value);
}
@@ -255,13 +242,7 @@
};
const isViewerReady = ref(false);
-/**
- * 初始化标注添加
- * @param data 数据
- */
const initEntityOrPopup = data => {
- console.log('data', data);
-
//地图点在范围内
watch(
() => isMapInitialized.value,
diff --git a/src/views/dataCenter/components/searchData.vue b/src/views/dataCenter/components/searchData.vue
index b2ec5a7..e73a238 100644
--- a/src/views/dataCenter/components/searchData.vue
+++ b/src/views/dataCenter/components/searchData.vue
@@ -73,6 +73,7 @@
</el-form-item>
<el-form-item label="文件类别:">
<el-select
+ :disabled="disabled"
:teleported="false"
v-model="searchForm.photoType"
placeholder="请选择"
@@ -98,8 +99,12 @@
</div>
<div class="search-first">
<div class="search-btn">
- <el-button type="primary" icon="el-icon-download" @click="allDownloadFun">全部下载</el-button>
- <el-button type="success" plain icon="el-icon-download" @click="downloadFun">下载</el-button>
+ <el-button type="primary" icon="el-icon-download" @click="allDownloadFun"
+ >全部下载</el-button
+ >
+ <el-button type="success" plain icon="el-icon-download" @click="downloadFun"
+ >下载</el-button
+ >
</div>
</div>
</el-form>
@@ -112,17 +117,34 @@
import dayjs from 'dayjs';
import { useStore } from 'vuex';
import { getRegionTreeAll, getDeviceRegion, deptsByAreaCode } from '@/api/job/task';
+import { watch } from 'vue';
const store = useStore();
const userAreaCode = computed(() => store.getters.userInfo.detail.areaCode);
const selectedAreaCode = computed(() => store.state.user.selectedAreaCode);
-const emit = defineEmits(['search','downFun','allDownFun']);
+const emit = defineEmits(['search', 'downFun', 'allDownFun']);
+const startTime = dayjs().subtract(6, 'day').startOf('day');
+const endTime = dayjs().endOf('day');
+const timeRange = [startTime.format('YYYY-MM-DD HH:mm:ss'), endTime.format('YYYY-MM-DD HH:mm:ss')];
+const dateRange = ref(timeRange);
+const timeFormat = 'YYYY-MM-DD HH:mm:ss';
+const searchForm = reactive({
+ jobName: '', //任务名称
+ name: '', //文件名称
+ areaCode: userAreaCode.value, // 区域code
+ endTime: endTime.format(timeFormat), // 结束时间
+ startTime: startTime.format(timeFormat), // 开始时间
+ deviceSn: '', // 所属机巢
+ resultType: '', //文件格式
+ photoType: '', //文件类别
+});
+const disabled = ref(false);
const treeProps = {
label: 'name',
value: 'id',
children: 'childrens',
};
const fileFormatOption = [
-{
+ {
value: '',
label: '全部',
},
@@ -157,21 +179,17 @@
label: '红外',
},
];
-const startTime = dayjs().subtract(6, 'day').startOf('day')
-const endTime = dayjs().endOf('day')
-const timeRange = [startTime.format('YYYY-MM-DD HH:mm:ss'), endTime.format('YYYY-MM-DD HH:mm:ss')]
-const dateRange = ref(timeRange);
-const timeFormat = 'YYYY-MM-DD HH:mm:ss';
-const searchForm = reactive({
- jobName: '', //任务名称
- name: '', //文件名称
- areaCode: userAreaCode.value, // 区域code
- endTime: endTime.format(timeFormat), // 结束时间
- startTime: startTime.format(timeFormat), // 开始时间
- deviceSn: '', // 所属机巢
- resultType: '', //文件格式
- photoType: '', //文件类别
-});
+watch(
+ () => searchForm.resultType,
+ newVal => {
+ if (newVal === '4') {
+ disabled.value = true;
+ } else {
+ disabled.value = false;
+ }
+ },
+ { deep: true }
+);
// 部门
let deptTreeData = ref([]);
@@ -186,9 +204,9 @@
const start = dayjs(val[0]);
const end = dayjs(val[1]);
const diff = end.diff(start, 'day');
-
- if (diff > 31) {
- ElMessage.warning('日期范围不能超过31天');
+ const maxDays = 365;
+ if (diff > maxDays) {
+ ElMessage.warning('日期范围不能超过一年');
dateRange.value = [];
// 重置为默认时间范围
setTimeout(() => {
@@ -196,12 +214,12 @@
}, 0);
return;
}
-
+
// 更新搜索表单中的时间
searchForm.startTime = start.format(timeFormat);
searchForm.endTime = end.format(timeFormat);
}
- //handleSearch();
+
};
// 部门下得机巢
const requestDockInfo = () => {
@@ -224,7 +242,7 @@
searchForm.deviceSn = signDevice_sn.value;
}
// 所属部门重新请求值
-
+
deptData.value = [];
getDeptsByAreaCode();
};
@@ -256,26 +274,25 @@
// 清空
const handleReset = () => {
dateRange.value = timeRange;
-searchForm.jobName = ''
-searchForm.name = ''
-searchForm.areaCode = userAreaCode.value
-searchForm.endTime = endTime.format(timeFormat)
-searchForm.startTime = startTime.format(timeFormat)
-searchForm.deviceSn = ''
-searchForm.resultType = ''
-searchForm.photoType = ''
+ searchForm.jobName = '';
+ searchForm.name = '';
+ searchForm.areaCode = userAreaCode.value;
+ searchForm.endTime = endTime.format(timeFormat);
+ searchForm.startTime = startTime.format(timeFormat);
+ searchForm.deviceSn = '';
+ searchForm.resultType = '';
+ searchForm.photoType = '';
handleNodeClick({ id: userAreaCode.value });
handleSearch();
-
};
// 下载
-const downloadFun =()=>{
+const downloadFun = () => {
emit('downFun');
-}
+};
// 全部下载
-const allDownloadFun =()=>{
- emit('allDownFun');
-}
+const allDownloadFun = () => {
+ emit('allDownFun');
+};
onMounted(() => {
requestDockInfo();
});
diff --git a/src/views/dataCenter/dataCenter.vue b/src/views/dataCenter/dataCenter.vue
index df7483b..c12fd85 100644
--- a/src/views/dataCenter/dataCenter.vue
+++ b/src/views/dataCenter/dataCenter.vue
@@ -1,258 +1,259 @@
<template>
- <div class="dataCenter-table">
- <searchData
- @search="searchClick"
- @downFun="downloadFile"
- @allDownFun="aLLDownloadFile"
- ></searchData>
- <!-- 表格部分 -->
- <div class="dataTable">
- <el-table
- v-loading="loadings"
- element-loading-text="加载中"
- stripe
- :data="tableData"
- class="custom-header"
- @selection-change="handleSelectionChange"
- >
- <el-table-column type="selection" width="55" />
- <el-table-column label="序号" type="index" width="60">
- <template #default="{ $index }">
- {{
- ($index + 1 + (jobListParams.current - 1) * jobListParams.size)
- .toString()
- .padStart(2, '0')
- }}
- </template>
- </el-table-column>
- <el-table-column prop="regionName" label="所属区域" v-if="!isDistrictLevel">
- <template #default="scope">
- <span>{{ processAddress(scope.row.regionName) }}</span>
- </template>
- </el-table-column>
- <el-table-column property="nestName" label="所属机巢" />
- <el-table-column property="jobName" label="任务名称" show-overflow-tooltip />
- <el-table-column prop="nickName" label="文件名称" show-overflow-tooltip />
- <el-table-column property="link" label="缩图" width="120">
- <template #default="scope">
- <img
- class="quanjing"
- @click="clickpanorama(scope.row)"
- v-if="scope.row?.resultType === 5"
- :src="scope.row?.smallUrl"
- alt=""
- />
- <img
- v-else-if="scope.row?.resultType === 1"
- :src="convertVideoUrlToThumbnail(scope.row?.link)"
- alt=""
- class="imageBox"
- @click="enterFullScreen(scope.row)"
- />
- <!-- 正射 -->
- <img
- v-else-if="scope.row?.resultType === 4"
- :src="getzsSmallImg(scope.row?.link)"
- alt=""
- class="imageBox"
- />
- <el-image
- v-else
- :src="scope.row?.smallUrl"
- :preview-src-list="[scope.row?.showUrl]"
- fit="cover"
- preview-teleported
- />
- </template>
- </el-table-column>
- <el-table-column prop="jobTime" label="任务时间" />
- <el-table-column property="photoType" label="文件类别">
- <template #default="scope">
- <span>{{ photoTypeMap[scope.row.photoType] }}</span>
- </template>
- </el-table-column>
- <el-table-column property="resultType" label="文件格式">
- <template #default="{ row }">
- <span>{{ resultTypeMap[row?.resultType] }}</span>
- </template>
- </el-table-column>
- <el-table-column label="操作" width="150" align="center">
- <template #default="scope">
- <span class="look" @click="lookDetail(scope.row)">查看</span>
- <span class="delete" @click="deleteDetail(scope.row)" v-if="scope.row.resultType !== 2"
- >删除</span
- >
+ <div
+ class="manage-m-all-10 manage-m-t-0 manage-p-all-20 manage-h-0 manage-flex-1 manage-flex manage-f-d-c manage-b-r-5 manage-b-c-w"
+ >
+ <div class="dataCenter-table">
+ <searchData
+ @search="searchClick"
+ @downFun="downloadFile"
+ @allDownFun="aLLDownloadFile"
+ ></searchData>
+ <!-- 表格部分 -->
+ <div class="dataTable">
+ <el-table
+ v-loading="loadings"
+ element-loading-text="加载中"
+ stripe
+ :data="tableData"
+ class="custom-header"
+ @selection-change="handleSelectionChange"
+ >
+ <el-table-column type="selection" width="55" />
+ <el-table-column label="序号" type="index" width="60">
+ <template #default="{ $index }">
+ {{
+ ($index + 1 + (jobListParams.current - 1) * jobListParams.size)
+ .toString()
+ .padStart(2, '0')
+ }}
+ </template>
+ </el-table-column>
+ <el-table-column prop="regionName" label="所属区域" v-if="!isDistrictLevel">
+ <template #default="scope">
+ <span>{{ processAddress(scope.row.regionName) }}</span>
+ </template>
+ </el-table-column>
+ <el-table-column property="nestName" label="所属机巢" />
+ <el-table-column property="jobName" label="任务名称" show-overflow-tooltip />
+ <el-table-column prop="nickName" label="文件名称" show-overflow-tooltip />
+ <el-table-column property="link" label="缩略图" width="120">
+ <template #default="scope">
+ <img
+ class="quanjing"
+ @click="clickpanorama(scope.row)"
+ v-if="scope.row?.resultType === 5"
+ :src="scope.row?.smallUrl"
+ alt=""
+ />
+ <img
+ v-else-if="scope.row?.resultType === 1"
+ :src="convertVideoUrlToThumbnail(scope.row?.link)"
+ alt=""
+ class="imageBox"
+ @click="enterFullScreen(scope.row)"
+ />
+ <!-- 正射 -->
+ <el-image
+ v-else-if="scope.row?.resultType === 4"
+ :src="getzsSmallImg(scope.row?.link)"
+ :preview-src-list="[getzsSmallImg(scope.row?.link)]"
+ fit="cover"
+ preview-teleported
+ />
+ <el-image
+ v-else
+ :src="scope.row?.smallUrl"
+ :preview-src-list="[scope.row?.showUrl]"
+ fit="cover"
+ preview-teleported
+ />
+ </template>
+ </el-table-column>
+ <el-table-column prop="jobTime" label="任务时间" />
+ <el-table-column property="photoType" label="文件类别">
+ <template #default="scope">
+ <span>{{
+ photoTypeMap[scope.row.photoType] ? photoTypeMap[scope.row.photoType] : '--'
+ }}</span>
+ </template>
+ </el-table-column>
+ <el-table-column property="resultType" label="文件格式">
+ <template #default="{ row }">
+ <span>{{ resultTypeMap[row?.resultType] }}</span>
+ </template>
+ </el-table-column>
+ <el-table-column label="操作" width="150" align="center">
+ <template #default="scope">
+ <span class="look" @click="lookDetail(scope.row)">查看</span>
+ <span
+ class="delete"
+ @click="deleteDetail(scope.row)"
+ v-if="scope.row.resultType !== 2"
+ >删除</span
+ >
- <span
- class="location"
- @click="positionDetail(scope.row)"
- v-if="shouldShowLocation(scope.row)"
- >定位</span
- >
- </template>
- </el-table-column>
- </el-table>
- </div>
- <!-- 分页 -->
- <div class="pagination">
- <el-pagination
- v-model:current-page="jobListParams.current"
- v-model:page-size="jobListParams.size"
- :page-sizes="[10, 20, 30, 40]"
- background
- layout="total, sizes, prev, pager, next, jumper"
- :total="total"
- @size-change="handleSizeChange"
- @current-change="handleCurrentChange"
- />
- </div>
- <!-- 查看弹框 -->
- <el-dialog v-model="dialogVisible" width="60%" append-to-body @close="dialogClose">
- <template #header="{ titleId, titleClass }">
- <div class="my-header">
- <h4 :id="titleId" :class="titleClass">{{ detailTitle }}</h4>
+ <span
+ class="location"
+ @click="positionDetail(scope.row)"
+ v-if="shouldShowLocation(scope.row)"
+ >定位</span
+ >
+ </template>
+ </el-table-column>
+ </el-table>
+ </div>
+ <!-- 分页 -->
+ <div class="pagination">
+ <el-pagination
+ v-model:current-page="jobListParams.current"
+ v-model:page-size="jobListParams.size"
+ :page-sizes="[10, 20, 30, 40]"
+ background
+ layout="total, sizes, prev, pager, next, jumper"
+ :total="total"
+ @size-change="handleSizeChange"
+ @current-change="handleCurrentChange"
+ />
+ </div>
+ <!-- 查看弹框 -->
+ <el-dialog
+ v-model="dialogVisible"
+ width="60%"
+ append-to-body
+ @close="dialogClose"
+ align-center
+ >
+ <template #header="{ titleId, titleClass }">
+ <div class="my-header">
+ <!-- <h4 :id="titleId" :class="titleClass">{{ detailTitle }}</h4> -->
+ <h4 :id="titleId" :class="titleClass">详情</h4>
+ </div>
+ </template>
+ <div class="detailContainer">
+ <div class="leftImg">
+ <!-- 视频 -->
+ <video
+ v-if="dialogDetailList?.resultType === 1"
+ style="width: 100%"
+ class="videoItem"
+ ref="videoRefs"
+ controls
+ autoplay
+ :src="dialogDetailList.link"
+ ></video>
+ <!-- 地图 -->
+ <div
+ v-else-if="dialogDetailList?.resultType === 4"
+ id="detaildataCenterMap"
+ class="ztzf-cesium"
+ ></div>
+ <img v-else :src="getSmallImg(dialogDetailList?.link)" alt="" />
+ </div>
+ <div class="rightDetail">
+ <div class="title">
+ <div class="inputEdit">
+ 文件名称:<span class="fileTitle" v-if="!dialogDetailList?.checkedinput">{{
+ dialogDetailList?.nickName ? dialogDetailList?.nickName : '--'
+ }}</span>
+ <el-input
+ v-else
+ v-model="dialogDetailList.nickName"
+ @blur="saveTitle(dialogDetailList)"
+ @keyup.enter="saveTitle(dialogDetailList)"
+ class="title-input"
+ clearable
+ />
+ <span class="editname" @click="editTitle(dialogDetailList)"
+ ><el-icon> <Edit /> </el-icon
+ ></span>
+ </div>
+ </div>
+ <div>任务名称:{{ dialogDetailList?.jobName ? dialogDetailList?.jobName : '--' }}</div>
+ <div>
+ 所属区域:{{ dialogDetailList?.regionName ? dialogDetailList?.regionName : '--' }}
+ </div>
+ <div>
+ 拍摄机巢:{{ dialogDetailList?.nestName ? dialogDetailList?.nestName : '--' }}
+ </div>
+ <div v-if="dialogDetailList?.resultType != 4">
+ 照片位置:{{ _.round(dialogDetailList?.longitude, 3) }},{{
+ _.round(dialogDetailList?.latitude, 3)
+ }}
+ </div>
+ <div>任务时间:{{ dialogDetailList?.jobTime ? dialogDetailList?.jobTime : '--' }}</div>
+ <div>
+ 拍摄时间:{{ dialogDetailList?.createTime ? dialogDetailList?.createTime : '--' }}
+ </div>
+ <div>
+ 文件类型:{{
+ photoTypeMap[dialogDetailList?.photoType]
+ ? photoTypeMap[dialogDetailList?.photoType]
+ : '--'
+ }}
+ </div>
+ <div>
+ 文件格式:{{
+ resultTypeMap[dialogDetailList?.resultType]
+ ? resultTypeMap[dialogDetailList?.resultType]
+ : '--'
+ }}
+ </div>
+ <div>
+ 文件大小:{{
+ bytesToMB(dialogDetailList?.attachSize)
+ ? bytesToMB(dialogDetailList?.attachSize)
+ : '--'
+ }}
+ </div>
+ <div>
+ <el-button
+ type="success"
+ plain
+ icon="el-icon-download"
+ @click="detailDownLoad(dialogDetailList)"
+ >下载</el-button
+ >
+ </div>
+ </div>
</div>
- </template>
- <div class="detailContainer">
- <div class="leftImg">
- <!-- <img
- v-if="dialogDetailList?.resultType === 1"
- :src="convertVideoUrlToThumbnail(dialogDetailList?.link)"
- alt=""
- class="imageBox"
- /> -->
- <!-- 视频 -->
+ </el-dialog>
+ <!-- 全景预览 -->
+ <PanoramaPopup
+ v-model:panoramaParamsShow="panoramaParamsShow"
+ v-model:panoramaParamsUrl="panoramaParamsUrl"
+ >
+ </PanoramaPopup>
+ <!-- 视频预览 -->
+ <el-dialog
+ :title="currentVideoTitle"
+ modal-class="videoDialog"
+ append-to-body
+ width="54%"
+ v-model="VideoShow"
+ :close-on-click-modal="false"
+ :destroy-on-close="true"
+ @close="currentVideoIndex = -1"
+ >
+ <div class="video-container">
<video
- v-if="dialogDetailList?.resultType === 1"
style="width: 100%"
- class="imageBox"
+ class="videoBox"
ref="videoRefs"
controls
autoplay
- :src="dialogDetailList.link"
+ :src="currentVideoUrl"
></video>
- <!-- 全景 -->
- <!-- <img
- class="quanjing"
- @click="clickpanorama(dialogDetailList)"
- v-else-if="dialogDetailList?.resultType === 5"
- :src="dialogDetailList?.resultType?.smallUrl"
- alt=""
- /> -->
- <!-- 地图 -->
- <div
- v-else-if="dialogDetailList?.resultType === 4"
- id="detaildataCenterMap"
- class="ztzf-cesium"
- ></div>
- <img v-else :src="getSmallImg(dialogDetailList?.link)" alt="" />
</div>
- <div class="rightDetail">
- <div class="title">
- <div class="inputEdit">
- 文件名称:<span class="fileTitle" v-if="!dialogDetailList?.checkedinput">{{
- dialogDetailList?.nickName ? dialogDetailList?.nickName : '--'
- }}</span>
- <el-input
- v-else
- v-model="dialogDetailList.nickName"
- @keyup.enter="saveTitle()"
- class="title-input"
- clearable
- />
- </div>
- <div class="editname">
- <span v-if="!dialogDetailList?.checkedinput" @click="editTitle(dialogDetailList)"
- ><el-icon><Edit /></el-icon
- ></span>
- <div v-else class="suffixBoxEdit">
- <div class="editText" @click="submitEditSuffix(dialogDetailList)">✔</div>
- <div class="editText" @click="cancelEditSuffix(dialogDetailList)">✖</div>
- </div>
- </div>
- </div>
- <div>任务名称:{{ dialogDetailList?.jobName ? dialogDetailList?.jobName : '--' }}</div>
- <div>
- 所属区域:{{ dialogDetailList?.regionName ? dialogDetailList?.regionName : '--' }}
- </div>
- <div>拍摄机巢:{{ dialogDetailList?.nestName ? dialogDetailList?.nestName : '--' }}</div>
- <div>
- 照片位置:{{ _.round(dialogDetailList?.longitude, 3) }},{{
- _.round(dialogDetailList?.latitude, 3)
- }}
- </div>
- <div>任务时间:{{ dialogDetailList?.jobTime ? dialogDetailList?.jobTime : '--' }}</div>
- <div>
- 拍摄时间:{{ dialogDetailList?.createTime ? dialogDetailList?.createTime : '--' }}
- </div>
- <div>
- 文件类型:{{
- photoTypeMap[dialogDetailList?.photoType]
- ? photoTypeMap[dialogDetailList?.photoType]
- : '--'
- }}
- </div>
- <div>
- 文件格式:{{
- resultTypeMap[dialogDetailList?.resultType]
- ? resultTypeMap[dialogDetailList?.resultType]
- : '--'
- }}
- </div>
- <div>
- 照片文件大小:{{
- bytesToMB(dialogDetailList?.attachSize)
- ? bytesToMB(dialogDetailList?.attachSize)
- : '--'
- }}
- </div>
- <div>
- <el-button
- type="success"
- plain
- icon="el-icon-download"
- @click="detailDownLoad(dialogDetailList)"
- >下载</el-button
- >
- </div>
- </div>
- </div>
- </el-dialog>
- <!-- 全景预览 -->
- <PanoramaPopup
- v-model:panoramaParamsShow="panoramaParamsShow"
- v-model:panoramaParamsUrl="panoramaParamsUrl"
- ></PanoramaPopup>
- <!-- 视频预览 -->
- <el-dialog
- :title="currentVideoTitle"
- modal-class="videoDialog"
- append-to-body
- width="54%"
- v-model="VideoShow"
- :close-on-click-modal="false"
- :destroy-on-close="true"
- @close="currentVideoIndex = -1"
- >
- <div class="video-container">
- <video
- style="width: 100%"
- class="videoBox"
- ref="videoRefs"
- controls
- autoplay
- :src="currentVideoUrl"
- ></video>
- </div>
- </el-dialog>
- <!-- 地图弹框 -->
- <dataCenterMap
- ref="mapComponent"
- v-model:show="dataCenterMapVisible"
- :jobId="jobId"
- @lookDetail="lookDetail"
- :dotData="mapList"
- ></dataCenterMap>
+ </el-dialog>
+ <!-- 地图弹框 -->
+ <dataCenterMap
+ ref="mapComponent"
+ v-model:show="dataCenterMapVisible"
+ :jobId="jobId"
+ @lookDetail="lookDetail"
+ :dotData="mapList"
+ ></dataCenterMap>
+ </div>
</div>
</template>
@@ -268,12 +269,10 @@
const isShow = defineModel('show');
const viewerRef = shallowRef(null);
let viewer = null;
-
const viewInstance = shallowRef(null);
const store = useStore();
const currentAreaPosition = ref({ height: 1987280, latitude: 27.636112, longitude: 115.732975 });
let handler = null;
-
import EventBus from '@/utils/eventBus';
import dataCenterMap from '@/views/dataCenter/components/dataCenterMap.vue';
import PanoramaPopup from '@/components/PanoramaPopup/PanoramaPopup.vue'; //全景
@@ -294,7 +293,7 @@
import dayjs from 'dayjs';
function bytesToMB(bytes, decimalPlaces = 2) {
- if (typeof bytes !== 'number' || bytes < 0) return '无效输入';
+ if (typeof bytes !== 'number' || bytes < 0) return '0';
return (bytes / 1048576).toFixed(decimalPlaces) + ' MB';
}
// 视频一帧
@@ -328,24 +327,20 @@
// 处理区域名称的函数
function processAddress(str) {
if (!str) return '';
-
const parts = str.split(',');
-
// 省级账号:显示市和区(去除省级)
if (isProvinceLevel.value) {
return parts.filter(part => !part.endsWith('省')).join(',');
}
-
// 市级账号:只显示区(去除省和市)
if (isCityLevel.value) {
return parts.filter(part => !part.endsWith('省') && !part.endsWith('市')).join(',');
}
-
// 区县级账号:不显示区域信息(在模板中已隐藏该列)
return '';
}
const showRegionColumn = computed(() => {
- // 检查表格数据中是否有任何行的 regionName 处理后不为空
+ // 是否显示列
return tableData.value.some(row => {
const processed = processAddress(row.regionName || '');
return processed !== '';
@@ -388,8 +383,12 @@
orderByCreateTime: jobListParams.orderByCreateTime,
...jobListParams.searchParams,
};
- getaiImagesPageAPI(params, { current: jobListParams.current, size: jobListParams.size }).then(
- res => {
+
+ getaiImagesPageAPI(params, {
+ current: jobListParams.current,
+ size: jobListParams.size,
+ })
+ .then(res => {
total.value = res.data.data.total;
tableData.value = res.data.data.records.map(i => ({
...i,
@@ -399,10 +398,14 @@
showUrl: getShowImg(i?.link),
file_name: i.name.split('/').pop(),
}));
-
- loadings.value = false;
- }
- );
+ })
+ .catch(error => {
+ // 可选:这里可以添加错误处理逻辑
+ console.error('获取数据失败:', error);
+ })
+ .finally(() => {
+ loadings.value = false; // 无论成功失败都会执行
+ });
};
// 查询
const searchClick = params => {
@@ -463,9 +466,8 @@
if (!list?.length) return ElMessage.warning('请选择文件');
if (list.length === 1) {
list.forEach((item, index) => {
- setTimeout(() => {
- aLinkDownload(item.url, item?.nickName);
- }, index * 500); // 每个文件下载间隔50毫秒
+ const suffix = item.url.split('.').pop();
+ aLinkDownload(item.url, item.nickName + '.' + suffix);
});
} else {
loading = ElLoading.service({ background: 'rgba(0, 0, 0, 0.5)', text: '打包中,请稍等...' });
@@ -494,7 +496,8 @@
fileDownload();
};
const detailDownLoad = val => {
- aLinkDownload(val.link, val?.nickName);
+ const suffix = val.link?.split('.').pop();
+ aLinkDownload(val.link, val?.nickName + '.' + suffix);
};
// 全部下载
const aLLDownloadFile = () => {
@@ -534,14 +537,7 @@
val.checkedinput = true;
fileNameedit.value = val?.nickName;
};
-// 取消
-const cancelEditSuffix = item => {
- item.nickName = fileNameedit.value;
- item.checkedinput = false;
-};
-const submitEditSuffix = item => {
- saveTitle(item);
-};
+
// 通用空值检查函数
const validateNickname = (name, fieldName) => {
if (!name || name.trim() === '') {
@@ -588,7 +584,6 @@
const isMapInitialized = ref(false); //地图加载
const initMap = () => {
if (viewer || isMapInitialized.value) return;
-
const container = document.getElementById('detaildataCenterMap');
if (!container) {
console.error('地图容器未找到');
@@ -602,10 +597,7 @@
});
viewer = viewInstance.value.getViewer();
viewerRef.value = viewer;
-
isMapInitialized.value = true;
-
- // console.log('地图初始化完成');
};
// 判断是否是正射
function isTifFile(filename) {
@@ -631,8 +623,6 @@
dialogVisible.value = true;
detailTitle.value = val.nickName;
dialogDetailList.value = val;
- console.log('3333', detailTitle.value, dialogDetailList.value);
-
await nextTick();
initMap();
positiongeom.value = res.data.data.geom;
@@ -644,7 +634,6 @@
url: `${import.meta.env.VITE_APP_AREA_NAME}/webodm${res.data.data.orthoimageApi}?jwt=${
res.data.data.odmToken.split(' ')[1]
}`,
- // maximumLevel: 12,
})
);
yxShowBox.value = true;
@@ -663,8 +652,12 @@
const viewer = viewInstance.value.getViewer();
if (viewer && viewer.camera) {
viewer.camera.flyToBoundingSphere(boundingSphere, {
- duration: 0, // 飞行动画持续时间(秒)
- offset: new Cesium.HeadingPitchRange(0, -0.5, boundingSphere.radius * 1.5),
+ duration: 0, // 增加动画时间使过渡更平滑
+ offset: new Cesium.HeadingPitchRange(
+ Cesium.Math.toRadians(-45), // 航向角:-45度(东北方向)
+ Cesium.Math.toRadians(-90), // 俯仰角:-30度(向下倾斜30度)
+ boundingSphere.radius * 2.5 // 距离:2.5倍半径
+ ),
});
} else {
console.error('无法获取有效的 Viewer 或 camera 对象');
@@ -722,32 +715,40 @@
<style scoped lang="scss">
.dataCenter-table {
- margin: 0 18px 16px 10px;
- background-color: #ffffff;
- padding: 14px 18px;
+ height: 0;
+ flex: 1;
+ display: flex;
+ flex-direction: column;
+
.dataTable {
- height: 700px;
+ height: 0;
+ flex: 1;
overflow: auto;
+
.look {
color: #1c5cff;
cursor: pointer;
margin-right: 10px;
}
+
.delete {
color: #ff241c;
margin-right: 10px;
cursor: pointer;
}
+
.location {
color: #19876d;
cursor: pointer;
}
}
+
.pagination {
display: flex;
justify-content: end;
margin-top: 20px;
}
+
.quanjing,
.el-image,
.imageBox {
@@ -755,54 +756,74 @@
width: 76px;
height: 72px;
}
+
.videoDialog :deep(.el-dialog) {
height: 600px;
width: 54%;
}
+
.video-container {
width: 100%;
- aspect-ratio: 16/9; /* 按视频比例设置(如16:9) */
- overflow: hidden; /* 隐藏溢出部分 */
+ aspect-ratio: 16/9;
+ /* 按视频比例设置(如16:9) */
+ overflow: hidden;
+ /* 隐藏溢出部分 */
}
+
.videoBox {
width: 100%;
height: 100%;
- object-fit: contain; /* 保持比例完整显示 */
+ object-fit: contain;
+ /* 保持比例完整显示 */
display: block;
}
}
+
:deep(.custom-header th.el-table__cell) {
color: rgba(0, 0, 0, 0.85);
}
+
// 弹框
.detailContainer {
display: flex;
justify-content: space-between;
+ align-items: center;
.leftImg {
width: 70%;
height: 500px;
+ overflow: hidden;
img {
width: 100%;
height: 100%;
+ }
+ .videoItem {
+ width: 100%;
+ height: 100%;
+ object-fit: cover;
}
#detaildataCenterMap {
width: 100%;
height: 100%;
}
}
+
.rightDetail {
width: 30%;
padding-left: 40px;
+
.title {
display: flex;
margin: 0 !important;
+
.editname {
cursor: pointer;
}
+
.inputEdit {
display: flex;
align-items: center;
width: 100%;
+
.fileTitle {
width: 70%;
white-space: nowrap;
@@ -811,46 +832,57 @@
}
}
}
+
div {
margin-bottom: 20px;
}
}
}
+
.my-header :deep(.el-dialog__title) {
margin: 0 !important;
height: 19px;
}
+
.my-header {
display: flex;
align-items: center;
+
.el-button {
margin-left: 20px;
}
}
+
.title-input {
margin-bottom: 0 !important;
width: 70%;
}
+
.editname {
margin-bottom: 0 !important;
}
+
.suffixBoxEdit {
display: flex;
// align-items: center;
justify-content: space-between;
margin-bottom: 0 !important;
font-size: 16px;
+
> .editText {
cursor: pointer;
margin-right: 6px;
+
&:hover {
transform: scale(1.2);
}
}
+
.editimg {
cursor: pointer;
width: 15px;
height: 15px;
+
&:hover {
transform: scale(1.2);
}
diff --git a/src/views/device/addDevice.vue b/src/views/device/addDevice.vue
index 52b0b32..88a8a89 100644
--- a/src/views/device/addDevice.vue
+++ b/src/views/device/addDevice.vue
@@ -1,20 +1,20 @@
<template>
<basic-container>
- <avue-crud :option="option" :table-loading="loading" :data="data" v-model:page="page" ref="crud" @row-del="rowDel"
- v-model="form" :permission="permissionList" @row-update="rowUpdate" @row-save="rowSave"
+ <avue-crud :option="option" :table-loading="loading" :data="data" v-model:page="page" ref="crud"
+ @row-del="rowDel" v-model="form" :permission="permissionList" @row-update="rowUpdate" @row-save="rowSave"
:before-open="beforeOpen" @search-change="searchChange" @search-reset="searchReset"
@selection-change="selectionChange" @current-change="currentChange" @size-change="sizeChange"
@refresh-change="refreshChange" @on-load="onLoad">
<template #menu="scope">
- <el-button type="primary" text icon="el-icon-copy-document" @click.stop="copyInfo(scope.row, scope.index)"
- v-if="userInfo.role_name.includes('admin')">复制
+ <el-button type="primary" text icon="el-icon-copy-document"
+ @click.stop="copyInfo(scope.row, scope.index)" v-if="userInfo.role_name.includes('admin')">复制
</el-button>
</template>
</avue-crud>
</basic-container>
</template>
-
+
<script>
import {
getList,
@@ -22,21 +22,21 @@
update,
add,
getDetail,
-} from '@/api/device/workspaces';
+} from '@/api/device/workspaces'
-import { getLazyTree } from '@/api/base/region';
+import { getLazyTree } from '@/api/base/region'
-import { mapGetters } from 'vuex';
-import { getWebsocketUrl } from '@/websocket/util/config';
-import ConnectWebSocket from '@/websocket';
-import { $Clipboard } from "@smallwei/avue";
+import { mapGetters } from 'vuex'
+import { getWebsocketUrl } from '@/websocket/util/config'
+import ConnectWebSocket from '@/websocket'
+import { $Clipboard } from "@smallwei/avue"
export default {
components: {
},
- data() {
+ data () {
return {
// 用于记录已经创建的websocket,防止重复创建
webSocketIdSet: new Set(),
@@ -65,8 +65,7 @@
menuWidth: 300,
lazy: true,
tree: true,
- // height: '460',
- // calcHeight: 32,
+
// dialogWidth: 1050,
tip: false,
searchShow: true,
@@ -79,6 +78,9 @@
addBtn: true,
dialogClickModal: false,
grid: false,
+
+ height: 'auto',
+ calcHeight: 20,
column: [
{
label: '工作空间名称',
@@ -197,39 +199,39 @@
},
data: [],
- };
+ }
},
computed: {
...mapGetters(['userInfo', 'permission']),
- permissionList() {
+ permissionList () {
return {
addBtn: this.validData(this.permission.airport_add, false),
viewBtn: this.validData(this.permission.airport_view, true),
delBtn: this.validData(this.permission.airport_delete, false),
editBtn: this.validData(this.permission.airport_edit, false),
- };
+ }
},
- ids() {
- let ids = [];
+ ids () {
+ let ids = []
this.selectionList.forEach(ele => {
- ids.push(ele.id);
- });
- return ids.join(',');
+ ids.push(ele.id)
+ })
+ return ids.join(',')
},
},
- destroyed() {
+ destroyed () {
this.websocketMap.forEach((k, v) => {
if (null != v) {
v.close()
this.websocketMap.delete(k)
this.webSocketIdSet.delete(k)
}
- });
+ })
},
methods: {
- copyInfo(row, index) {
- if(import.meta.env.VITE_APP_ENV==='development'){
+ copyInfo (row, index) {
+ if (import.meta.env.VITE_APP_ENV === 'development') {
// alert('地址'+import.meta.env.VITE_APP_ENV);
let params = `
host: tcp://139.196.74.78:1883
@@ -238,111 +240,112 @@
组织id:${row.bing_id}
设备码:${row.bind_code}
机场名称:${row.workspace_name}
- aircrattName:${row.workspace_desc}`;
- $Clipboard({
- text: params,
- }).then(() => {
- this.$message.success("复制成功");
- }).catch(() => {
- this.$message.error("复制失败");
- });
- }else{
- // alert('地址'+import.meta.env.VITE_APP_ENV);
- let params = `
+ aircrattName:${row.workspace_desc}`
+ $Clipboard({
+ text: params,
+ }).then(() => {
+ this.$message.success("复制成功")
+ }).catch(() => {
+ this.$message.error("复制失败")
+ })
+ } else {
+ // alert('地址'+import.meta.env.VITE_APP_ENV);
+ let params = `
host: tcp://101.132.85.201:1883
账号:drone
密码:drone@123
组织id:${row.bing_id}
设备码:${row.bind_code}
机场名称:${row.workspace_name}
- aircrattName:${row.workspace_desc}`;
- $Clipboard({
- text: params,
- }).then(() => {
- this.$message.success("复制成功");
- }).catch(() => {
- this.$message.error("复制失败");
- });}
+ aircrattName:${row.workspace_desc}`
+ $Clipboard({
+ text: params,
+ }).then(() => {
+ this.$message.success("复制成功")
+ }).catch(() => {
+ this.$message.error("复制失败")
+ })
+ }
},
- init() {
- this.onLoad(this.page);
+ init () {
+ this.onLoad(this.page)
},
- handleOpenRemoteDebugging(row) {
- this.curDeviceInfo = row;
- this.remoteDebuggingShow = true;
+ handleOpenRemoteDebugging (row) {
+ this.curDeviceInfo = row
+ this.remoteDebuggingShow = true
},
- rowSave(row, done, loading) {
+ rowSave (row, done, loading) {
add(row).then(
() => {
- this.onLoad(this.page);
+ this.onLoad(this.page)
this.$message({
type: 'success',
message: '操作成功!',
- });
- done();
+ })
+ done()
},
error => {
- window.console.log(error);
- loading();
+ window.console.log(error)
+ loading()
}
- );
+ )
},
- rowUpdate(row, index, done, loading) {
+ rowUpdate (row, index, done, loading) {
update(row).then(
() => {
- this.onLoad(this.page);
+ this.onLoad(this.page)
this.$message({
type: 'success',
message: '操作成功!',
- });
- done();
+ })
+ done()
},
error => {
- window.console.log(error);
- loading();
+ window.console.log(error)
+ loading()
}
- );
+ )
},
- rowDel(row) {
+ rowDel (row) {
this.$confirm('确定将选择数据删除?', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning',
})
.then(() => {
- return remove(row.id);
+ return remove(row.id)
})
.then(() => {
- this.onLoad(this.page);
+ this.onLoad(this.page)
this.$message({
type: 'success',
message: '操作成功!',
- });
- });
+ })
+ })
},
- searchReset() {
- this.query = {};
- this.onLoad(this.page);
+ searchReset () {
+ this.query = {}
+ this.onLoad(this.page)
},
- searchChange(params, done) {
- this.query = params;
- this.page.currentPage = 1;
- this.onLoad(this.page, params);
- done();
+ searchChange (params, done) {
+ this.query = params
+ this.page.currentPage = 1
+ this.onLoad(this.page, params)
+ done()
},
- selectionChange(list) {
- this.selectionList = list;
+ selectionChange (list) {
+ this.selectionList = list
},
- selectionClear() {
- this.selectionList = [];
- this.$refs.crud.toggleSelection();
+ selectionClear () {
+ this.selectionList = []
+ this.$refs.crud.toggleSelection()
},
- handleDelete() {
+ handleDelete () {
if (this.selectionList.length === 0) {
- this.$message.warning('请选择至少一条数据');
- return;
+ this.$message.warning('请选择至少一条数据')
+ return
}
this.$confirm('确定将选择数据删除?', {
confirmButtonText: '确定',
@@ -350,86 +353,78 @@
type: 'warning',
})
.then(() => {
- return remove(this.ids);
+ return remove(this.ids)
})
.then(() => {
- this.onLoad(this.page);
+ this.onLoad(this.page)
this.$message({
type: 'success',
message: '操作成功!',
- });
- this.$refs.crud.toggleSelection();
- });
+ })
+ this.$refs.crud.toggleSelection()
+ })
},
- beforeOpen(done, type) {
+ beforeOpen (done, type) {
if (['edit', 'view'].includes(type)) {
getDetail(this.form.id).then(res => {
- this.form = res.data.data;
- });
+ this.form = res.data.data
+ })
}
- done();
+ done()
},
- currentChange(currentPage) {
- this.page.currentPage = currentPage;
+ currentChange (currentPage) {
+ this.page.currentPage = currentPage
},
- sizeChange(pageSize) {
- this.page.pageSize = pageSize;
+ sizeChange (pageSize) {
+ this.page.pageSize = pageSize
},
- refreshChange() {
- this.onLoad(this.page, this.query);
+ refreshChange () {
+ this.onLoad(this.page, this.query)
},
- onLoad(page, params = {}) {
- const { releaseTimeRange } = this.query;
+ onLoad (page, params = {}) {
+ const { releaseTimeRange } = this.query
let values = {
...params,
...this.query,
- };
+ }
if (releaseTimeRange) {
values = {
...values,
releaseTime_datege: releaseTimeRange[0],
releaseTime_datelt: releaseTimeRange[1],
- };
- values.releaseTimeRange = null;
+ }
+ values.releaseTimeRange = null
}
- values['type'] = 1;
- this.loading = true;
+ values['type'] = 1
+ this.loading = true
getList(page.currentPage, page.pageSize, values).then(res => {
- const data = res.data.data;
- this.page.total = data.total;
+ const data = res.data.data
+ this.page.total = data.total
// data.records.forEach(e => {
// e['hasChildren'] = e.has_children;
// if (e.firmware_status == 4) {
// this.connectWebSocket(e);
// }
// });
- this.data = data.records;
- this.loading = false;
- this.selectionClear();
- });
+ this.data = data.records
+ this.loading = false
+ this.selectionClear()
+ })
},
- treeLoad(tree, treeNode, resolve) {
+ treeLoad (tree, treeNode, resolve) {
var params = {
childSn: tree.child_sn,
- };
+ }
getList(1, 10, params).then(res => {
- const data = res.data.data.records;
- resolve(data);
- });
+ const data = res.data.data.records
+ resolve(data)
+ })
},
},
-};
+}
</script>
-
+
<style lang="scss" scoped>
- :deep(){
- .avue-crud__body{
- .el-form{
- height: 745px;
- overflow: auto;
- }
- }
- }
.firmware_status {
background-color: aqua;
border-radius: 4px;
@@ -448,5 +443,4 @@
border-color: #409eff;
}
}
-</style>
-
\ No newline at end of file
+</style>
\ No newline at end of file
diff --git a/src/views/device/airport.vue b/src/views/device/airport.vue
index 7083e01..5d2415f 100644
--- a/src/views/device/airport.vue
+++ b/src/views/device/airport.vue
@@ -1,5 +1,5 @@
<template>
- <basic-container>
+ <basic-main-content>
<avue-crud
:option="option"
:table-loading="loading"
@@ -185,6 +185,7 @@
</el-dialog>
<el-drawer
+ class="ztzf-drawer-body-basic-container"
title="机场授权管理"
size="60%"
append-to-body
@@ -202,7 +203,7 @@
>
</DockControlPanel>
</el-drawer>
- </basic-container>
+ </basic-main-content>
</template>
<script>
@@ -270,8 +271,7 @@
option: {
lazy: true,
tree: true,
- height: '460',
- calcHeight: 32,
+
dialogWidth: 1050,
tip: false,
searchShow: true,
@@ -284,6 +284,10 @@
addBtn: false,
dialogClickModal: false,
grid: false,
+
+ height: 'auto',
+ calcHeight: 180,
+
column: [
{
label: '设备型号',
@@ -428,10 +432,20 @@
},
{
label: '行政区划',
+ prop: 'area_name',
+ hide: true,
+ editDisplay: false, //编辑显示
+ viewDisplay: true, //查看显示
+ labelWidth: 130,
+ },
+ {
+ label: '行政区划',
prop: 'area_code',
type: 'cascader',
labelWidth: 130,
hide: true,
+ editDisplay: true,
+ viewDisplay: false,
props: {
label: 'title',
value: 'value',
@@ -494,6 +508,26 @@
}
},
},
+
+ {
+ hide: true,
+ label: '保险有效期',
+ prop: 'duration_of_insurance',
+ labelWidth: 130,
+ type: 'daterange',
+ format: 'YYYY-MM-DD',
+ valueFormat: 'YYYY-MM-DD HH:mm:ss',
+ startPlaceholder: '保险开始日期',
+ endPlaceholder: '保险结束日期',
+ rules: [
+ {
+ required: true,
+ message: '请选择保险有效期',
+ trigger: 'blur',
+ },
+ ],
+ },
+
{
label: '在线时间',
prop: 'login_time',
@@ -513,14 +547,25 @@
},
],
},
+ {
+ label: '在线状态',
+ prop: 'cnstatus',
+ hide: true,
+ addDisplay: false,
+ editDisplay: false,
+ viewDisplay: true,
+ labelWidth: 130,
+ },
{
label: '在线状态',
prop: 'status',
addDisplay: false,
editDisplay: false,
+ viewDisplay: false,
labelWidth: 130,
slot: true,
width: 100,
+
rules: [
{
required: true,
@@ -531,12 +576,24 @@
},
{
label: '机场状态',
- prop: 'mode_code',
+ prop: 'cnmode_code',
+ hide: true,
addDisplay: false,
editDisplay: false,
+ viewDisplay: true,
+ labelWidth: 130,
+ },
+ {
+ label: '机场状态',
+ prop: 'mode_code',
+
+ addDisplay: false,
+ editDisplay: false,
+ viewDisplay: false,
labelWidth: 130,
slot: true,
width: 100,
+
rules: [
{
required: true,
@@ -566,10 +623,10 @@
...mapGetters(['permission']),
permissionList() {
return {
- addBtn: this.validData(this.permission.airport_add, true),
- viewBtn: this.validData(this.permission.airport_view, true),
- delBtn: this.validData(this.permission.airport_delete, true),
- editBtn: this.validData(this.permission.airport_edit, true),
+ addBtn: this.validData(this.permission.air_add, true),
+ viewBtn: this.validData(this.permission.air_view, true),
+ delBtn: this.validData(this.permission.air_delete, true),
+ editBtn: this.validData(this.permission.air_edit, true),
};
},
ids() {
@@ -967,7 +1024,11 @@
const submitData = {
...row,
area_code: row.area_code.split(',').pop(),
+ insure_start_time: row.duration_of_insurance[0],
+ insure_expired_time: row.duration_of_insurance[1],
};
+
+ delete submitData.duration_of_insurance;
update(submitData).then(
() => {
@@ -1065,10 +1126,16 @@
this.form = {
...data,
area_code: this.getFullAreaCode(data.area_code),
+ area_name: this.form.area_name,
+ cnmode_code: this.getDockModeText(this.form.mode_code),
+ cnstatus:this.form.status === false ? '离线':'在线',
+ duration_of_insurance: [data?.insure_start_time || '', data?.insure_expired_time || ''],
};
+ console.log('this.form', this.form);
+
+ done();
});
}
- done();
},
currentChange(currentPage) {
this.page.currentPage = currentPage;
@@ -1129,40 +1196,48 @@
color: #40cb8b;
font-size: 13px;
}
+
.status1 {
float: right;
color: #8492a6;
font-size: 13px;
}
+
.online {
margin-left: 5px;
}
+
.onlineStatus1 {
display: flex;
flex-direction: column;
align-items: center;
}
+
.onlineStatus {
display: flex;
flex-direction: row;
align-items: center;
}
+
.onlineStatus-dot {
width: 15px;
height: 15px;
background-color: #40cb8b;
border-radius: 50%;
}
+
.onlineStatus-dot1 {
width: 15px;
height: 15px;
background-color: #de5e5e;
border-radius: 50%;
}
+
.firmware_status {
background-color: aqua;
border-radius: 4px;
}
+
.firmware_status:hover {
cursor: pointer;
/* color: aqua; */
@@ -1170,6 +1245,7 @@
.active-element {
cursor: pointer;
+
&:hover {
background-color: #409eff;
border-color: #409eff;
diff --git a/src/views/device/components/devicePerShare.vue b/src/views/device/components/devicePerShare.vue
index 0abf44a..2ee9ac6 100644
--- a/src/views/device/components/devicePerShare.vue
+++ b/src/views/device/components/devicePerShare.vue
@@ -1,35 +1,20 @@
<template>
<basic-container>
- <avue-crud
- :option="option"
- :table-loading="loading"
- :data="data"
- v-model:page="page"
- ref="crud"
- @row-del="rowDel"
- v-model="form"
- :permission="permissionList"
- @row-save="rowSave"
- @row-update="rowUpdate"
- :before-open="beforeOpen"
- @search-change="searchChange"
- @search-reset="searchReset"
- @selection-change="selectionChange"
- @current-change="currentChange"
- @size-change="sizeChange"
- @refresh-change="refreshChange"
- >
+ <avue-crud :option="option" :table-loading="loading" :data="data" v-model:page="page" ref="crud" @row-del="rowDel"
+ v-model="form" :permission="permissionList" @row-save="rowSave" @row-update="rowUpdate" :before-open="beforeOpen"
+ @search-change="searchChange" @search-reset="searchReset" @selection-change="selectionChange"
+ @current-change="currentChange" @size-change="sizeChange" @refresh-change="refreshChange">
</avue-crud>
</basic-container>
</template>
<script>
-import { getList, remove, add, update } from '@/api/device/devicePerShare';
-import { getDeptTreeByNotItself } from '@/api/system/dept';
-import { mapGetters } from 'vuex';
+import { getList, remove, add, update } from '@/api/device/devicePerShare'
+import { getDeptTreeByNotItself } from '@/api/system/dept'
+import { mapGetters } from 'vuex'
export default {
- data() {
+ data () {
return {
deptId: '',
deviceSn: '',
@@ -58,6 +43,10 @@
excelBtn: false,
dialogClickModal: false,
grid: false,
+
+ height: 'auto',
+ calcHeight: 20,
+
column: [
{
label: '授权单位',
@@ -136,118 +125,118 @@
],
},
data: [],
- };
+ }
},
computed: {
...mapGetters(['permission']),
- permissionList() {
+ permissionList () {
return {
addBtn: this.validData(this.permission.airport_add, true),
viewBtn: this.validData(this.permission.airport_view, true),
delBtn: this.validData(this.permission.airport_delete, true),
editBtn: this.validData(this.permission.airport_edit, true),
- };
+ }
},
- ids() {
- let ids = [];
+ ids () {
+ let ids = []
this.selectionList.forEach(ele => {
- ids.push(ele.id);
- });
- return ids.join(',');
+ ids.push(ele.id)
+ })
+ return ids.join(',')
},
},
methods: {
- init(data) {
- this.deptId = data.dept_id;
- this.deviceSn = data.device_sn;
- this.getDeptTreeInfo();
- this.getLoadPage(this.page);
+ init (data) {
+ this.deptId = data.dept_id
+ this.deviceSn = data.device_sn
+ this.getDeptTreeInfo()
+ this.getLoadPage(this.page)
},
- getDeptTreeInfo() {
+ getDeptTreeInfo () {
getDeptTreeByNotItself(this.deptId, this.deviceSn).then(res => {
- const column = this.findObject(this.option.column, 'deptId');
- this.deptTreeData = res.data.data;
- column.dicData = res.data.data;
- });
+ const column = this.findObject(this.option.column, 'deptId')
+ this.deptTreeData = res.data.data
+ column.dicData = res.data.data
+ })
},
- rowSave(row, done, loading) {
+ rowSave (row, done, loading) {
// 添加毫秒级时间戳
- row['createTime'] = Date.now();
- row['deviceSn'] = this.deviceSn;
+ row['createTime'] = Date.now()
+ row['deviceSn'] = this.deviceSn
add(row).then(
() => {
- this.initFlag = false;
- this.getLoadPage(this.page);
- this.getDeptTreeInfo();
+ this.initFlag = false
+ this.getLoadPage(this.page)
+ this.getDeptTreeInfo()
this.$message({
type: 'success',
message: '操作成功!',
- });
- done();
+ })
+ done()
},
error => {
- window.console.log(error);
- loading();
+ window.console.log(error)
+ loading()
}
- );
+ )
},
- rowUpdate(row, index, done, loading) {
- row['device_sn'] = this.deviceSn;
+ rowUpdate (row, index, done, loading) {
+ row['device_sn'] = this.deviceSn
update(row).then(
() => {
- this.getLoadPage(this.page);
+ this.getLoadPage(this.page)
this.$message({
type: 'success',
message: '操作成功!',
- });
- done();
+ })
+ done()
},
error => {
- window.console.log(error);
- loading();
+ window.console.log(error)
+ loading()
}
- );
+ )
},
- rowDel(row) {
+ rowDel (row) {
this.$confirm('确定将选择数据删除?', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning',
})
.then(() => {
- return remove(row.id);
+ return remove(row.id)
})
.then(() => {
- this.getDeptTreeInfo();
- this.getLoadPage(this.page);
+ this.getDeptTreeInfo()
+ this.getLoadPage(this.page)
this.$message({
type: 'success',
message: '操作成功!',
- });
- });
+ })
+ })
},
- searchReset() {
- this.query = {};
- this.getLoadPage(this.page);
+ searchReset () {
+ this.query = {}
+ this.getLoadPage(this.page)
},
- searchChange(params, done) {
- this.query = params;
- this.page.currentPage = 1;
- this.getLoadPage(this.page, params);
- done();
+ searchChange (params, done) {
+ this.query = params
+ this.page.currentPage = 1
+ this.getLoadPage(this.page, params)
+ done()
},
- selectionChange(list) {
- this.selectionList = list;
+ selectionChange (list) {
+ this.selectionList = list
},
- selectionClear() {
- this.selectionList = [];
- this.$refs.crud.toggleSelection();
+ selectionClear () {
+ this.selectionList = []
+ this.$refs.crud.toggleSelection()
},
- handleDelete() {
+ handleDelete () {
if (this.selectionList.length === 0) {
- this.$message.warning('请选择至少一条数据');
- return;
+ this.$message.warning('请选择至少一条数据')
+ return
}
this.$confirm('确定将选择数据删除?', {
confirmButtonText: '确定',
@@ -255,48 +244,48 @@
type: 'warning',
})
.then(() => {
- return remove(this.ids);
+ return remove(this.ids)
})
.then(() => {
- this.getLoadPage(this.page);
+ this.getLoadPage(this.page)
this.$message({
type: 'success',
message: '操作成功!',
- });
- this.$refs.crud.toggleSelection();
- });
+ })
+ this.$refs.crud.toggleSelection()
+ })
},
- beforeOpen(done, type) {
- done();
+ beforeOpen (done, type) {
+ done()
},
- currentChange(currentPage) {
- this.page.currentPage = currentPage;
- this.getLoadPage(this.page, this.query); // 添加数据刷新
+ currentChange (currentPage) {
+ this.page.currentPage = currentPage
+ this.getLoadPage(this.page, this.query) // 添加数据刷新
},
- sizeChange(pageSize) {
- this.page.pageSize = pageSize;
- this.page.currentPage = 1; // 每页条数改变时,重置到第一页
- this.getLoadPage(this.page, this.query); // 添加数据刷新
+ sizeChange (pageSize) {
+ this.page.pageSize = pageSize
+ this.page.currentPage = 1 // 每页条数改变时,重置到第一页
+ this.getLoadPage(this.page, this.query) // 添加数据刷新
},
- refreshChange() {
- this.getLoadPage(this.page, this.query);
+ refreshChange () {
+ this.getLoadPage(this.page, this.query)
},
- getLoadPage(page, params = {}) {
- params['deviceSn'] = this.deviceSn;
- this.loading = true;
+ getLoadPage (page, params = {}) {
+ params['deviceSn'] = this.deviceSn
+ this.loading = true
getList(page.currentPage, page.pageSize, params).then(res => {
- const data = res.data.data;
- this.page.total = data.total;
- this.data = data.records;
- this.loading = false;
- this.selectionClear();
+ const data = res.data.data
+ this.page.total = data.total
+ this.data = data.records
+ this.loading = false
+ this.selectionClear()
}).catch(err => {
- console.error('加载数据失败:', err);
- this.loading = false;
- });
+ console.error('加载数据失败:', err)
+ this.loading = false
+ })
},
},
-};
+}
</script>
<style>
@@ -304,6 +293,7 @@
background-color: aqua;
border-radius: 4px;
}
+
.firmware_status:hover {
cursor: pointer;
}
diff --git a/src/views/device/components/firmwareManage.vue b/src/views/device/components/firmwareManage.vue
index d5cba3b..95e8534 100644
--- a/src/views/device/components/firmwareManage.vue
+++ b/src/views/device/components/firmwareManage.vue
@@ -113,6 +113,9 @@
excelBtn: false,
dialogClickModal: false,
grid: false,
+
+ height: 'auto',
+ calcHeight: 20,
column: [
{
label: '设备名称',
@@ -429,13 +432,4 @@
/* color: aqua; */
}
</style>
-<style scoped lang="scss">
- :deep(){
- .avue-crud__body{
- .el-form{
- height: 745px;
- overflow: auto;
- }
- }
- }
-</style>
+<style scoped lang="scss"></style>
diff --git a/src/views/device/devicePerMenu.vue b/src/views/device/devicePerMenu.vue
index c550713..ca5ae19 100644
--- a/src/views/device/devicePerMenu.vue
+++ b/src/views/device/devicePerMenu.vue
@@ -1,35 +1,19 @@
<template>
<basic-container>
- <avue-crud
- :option="option"
- :table-loading="loading"
- :data="data"
- v-model:page="page"
- ref="crud"
- @row-del="rowDel"
- v-model="form"
- :permission="permissionList"
- @row-save="rowSave"
- @row-update="rowUpdate"
- :before-open="beforeOpen"
- @search-change="searchChange"
- @search-reset="searchReset"
- @selection-change="selectionChange"
- @current-change="currentChange"
- @size-change="sizeChange"
- @refresh-change="refreshChange"
- @on-load="onLoad"
- >
+ <avue-crud :option="option" :table-loading="loading" :data="data" v-model:page="page" ref="crud" @row-del="rowDel"
+ v-model="form" :permission="permissionList" @row-save="rowSave" @row-update="rowUpdate" :before-open="beforeOpen"
+ @search-change="searchChange" @search-reset="searchReset" @selection-change="selectionChange"
+ @current-change="currentChange" @size-change="sizeChange" @refresh-change="refreshChange" @on-load="onLoad">
</avue-crud>
</basic-container>
</template>
<script>
-import { getList, remove, add, update } from '@/api/device/devicePerMenu';
-import { mapGetters } from 'vuex';
+import { getList, remove, add, update } from '@/api/device/devicePerMenu'
+import { mapGetters } from 'vuex'
export default {
- data() {
+ data () {
return {
form: {},
query: {},
@@ -53,6 +37,10 @@
excelBtn: false,
dialogClickModal: false,
grid: false,
+
+ height: 'auto',
+ calcHeight: 20,
+
column: [
{
label: '名称',
@@ -165,98 +153,98 @@
],
},
data: [],
- };
+ }
},
computed: {
...mapGetters(['permission']),
- permissionList() {
+ permissionList () {
return {
addBtn: this.validData(this.permission.device_per_menu_add, true),
viewBtn: this.validData(this.permission.device_per_menu_view, true),
delBtn: this.validData(this.permission.device_per_menu_delete, true),
editBtn: this.validData(this.permission.device_per_menu_edit, true),
- };
+ }
},
- ids() {
- let ids = [];
+ ids () {
+ let ids = []
this.selectionList.forEach(ele => {
- ids.push(ele.id);
- });
- return ids.join(',');
+ ids.push(ele.id)
+ })
+ return ids.join(',')
},
},
methods: {
- rowSave(row, done, loading) {
+ rowSave (row, done, loading) {
add(row).then(
() => {
- this.initFlag = false;
- this.onLoad(this.page);
+ this.initFlag = false
+ this.onLoad(this.page)
this.$message({
type: 'success',
message: '操作成功!',
- });
- done();
+ })
+ done()
},
error => {
- window.console.log(error);
- loading();
+ window.console.log(error)
+ loading()
}
- );
+ )
},
- rowUpdate(row, index, done, loading) {
+ rowUpdate (row, index, done, loading) {
update(row).then(
() => {
- this.onLoad(this.page);
+ this.onLoad(this.page)
this.$message({
type: 'success',
message: '操作成功!',
- });
- done();
+ })
+ done()
},
error => {
- window.console.log(error);
- loading();
+ window.console.log(error)
+ loading()
}
- );
+ )
},
- rowDel(row) {
+ rowDel (row) {
this.$confirm('确定将选择数据删除?', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning',
})
.then(() => {
- return remove(row.id);
+ return remove(row.id)
})
.then(() => {
- this.onLoad(this.page);
+ this.onLoad(this.page)
this.$message({
type: 'success',
message: '操作成功!',
- });
- });
+ })
+ })
},
- searchReset() {
- this.query = {};
- this.onLoad(this.page);
+ searchReset () {
+ this.query = {}
+ this.onLoad(this.page)
},
- searchChange(params, done) {
- this.query = params;
- this.page.currentPage = 1;
- this.onLoad(this.page, params);
- done();
+ searchChange (params, done) {
+ this.query = params
+ this.page.currentPage = 1
+ this.onLoad(this.page, params)
+ done()
},
- selectionChange(list) {
- this.selectionList = list;
+ selectionChange (list) {
+ this.selectionList = list
},
- selectionClear() {
- this.selectionList = [];
- this.$refs.crud.toggleSelection();
+ selectionClear () {
+ this.selectionList = []
+ this.$refs.crud.toggleSelection()
},
- handleDelete() {
+ handleDelete () {
if (this.selectionList.length === 0) {
- this.$message.warning('请选择至少一条数据');
- return;
+ this.$message.warning('请选择至少一条数据')
+ return
}
this.$confirm('确定将选择数据删除?', {
confirmButtonText: '确定',
@@ -264,41 +252,41 @@
type: 'warning',
})
.then(() => {
- return remove(this.ids);
+ return remove(this.ids)
})
.then(() => {
- this.onLoad(this.page);
+ this.onLoad(this.page)
this.$message({
type: 'success',
message: '操作成功!',
- });
- this.$refs.crud.toggleSelection();
- });
+ })
+ this.$refs.crud.toggleSelection()
+ })
},
- beforeOpen(done, type) {
- done();
+ beforeOpen (done, type) {
+ done()
},
- currentChange(currentPage) {
- this.page.currentPage = currentPage;
+ currentChange (currentPage) {
+ this.page.currentPage = currentPage
},
- sizeChange(pageSize) {
- this.page.pageSize = pageSize;
+ sizeChange (pageSize) {
+ this.page.pageSize = pageSize
},
- refreshChange() {
- this.onLoad(this.page, this.query);
+ refreshChange () {
+ this.onLoad(this.page, this.query)
},
- onLoad(page, params = {}) {
- this.loading = true;
+ onLoad (page, params = {}) {
+ this.loading = true
getList(page.currentPage, page.pageSize, params).then(res => {
- const data = res.data.data;
- this.page.total = data.total;
- this.data = data.records;
- this.loading = false;
- this.selectionClear();
- });
+ const data = res.data.data
+ this.page.total = data.total
+ this.data = data.records
+ this.loading = false
+ this.selectionClear()
+ })
},
},
-};
+}
</script>
<style>
@@ -306,19 +294,10 @@
background-color: aqua;
border-radius: 4px;
}
+
.firmware_status:hover {
cursor: pointer;
/* color: aqua; */
}
</style>
-<style scoped lang="scss">
-
- :deep(){
- .avue-crud__body{
- .el-form{
- height: 745px;
- overflow: auto;
- }
- }
- }
-</style>
+<style scoped lang="scss"></style>
diff --git a/src/views/device/fly.vue b/src/views/device/fly.vue
index 2fd28b2..eb7fdb0 100644
--- a/src/views/device/fly.vue
+++ b/src/views/device/fly.vue
@@ -1,34 +1,13 @@
<template>
- <basic-container>
- <avue-crud
- id="device"
- :option="option"
- :table-loading="loading"
- :data="data"
- :page="page"
- @update:page="handlePageChange"
- ref="crud"
- @row-del="rowDel"
- v-model="form"
- :permission="permissionList"
- @row-update="rowUpdate"
- @row-save="rowSave"
- :before-open="beforeOpen"
- @search-change="searchChange"
- @search-reset="searchReset"
- @selection-change="selectionChange"
- @current-change="currentChange"
- @size-change="sizeChange"
- @refresh-change="refreshChange"
- >
+ <basic-main-content>
+ <avue-crud id="device" :option="option" :table-loading="loading" :data="data" :page="page"
+ @update:page="handlePageChange" ref="crud" @row-del="rowDel" v-model="form" :permission="permissionList"
+ @row-update="rowUpdate" @row-save="rowSave" :before-open="beforeOpen" @search-change="searchChange"
+ @search-reset="searchReset" @selection-change="selectionChange" @current-change="currentChange"
+ @size-change="sizeChange" @refresh-change="refreshChange">
<template #menu-left>
- <el-button
- type="danger"
- icon="el-icon-delete"
- plain
- v-if="permission.workspace_delete"
- @click="handleDelete"
- >删 除
+ <el-button type="danger" icon="el-icon-delete" plain v-if="permission.workspace_delete" @click="handleDelete">删
+ 除
</el-button>
</template>
<template #dept_name="{ row }">
@@ -37,7 +16,7 @@
<template #status="{ row }">
<div v-if="row.status == true" class="onlineStatus">
<div class="onlineStatus-dot"></div>
- <span class="online" >在线</span>
+ <span class="online">在线</span>
</div>
<div v-if="row.status == false" class="onlineStatus">
<div class="onlineStatus-dot1"></div>
@@ -45,13 +24,8 @@
</div>
</template>
<template #menu="scope">
- <el-button
- type="primary"
- text
- icon="el-icon-setting"
- v-if="permission.operate_password_set"
- @click.stop="handleOperatePassword(scope.row, scope.index)"
- >操控密码设置
+ <el-button type="primary" text icon="el-icon-setting" v-if="permission.operate_password_set"
+ @click.stop="handleOperatePassword(scope.row, scope.index)">操控密码设置
</el-button>
<!-- <el-button
type="primary"
@@ -64,28 +38,12 @@
</template>
</avue-crud>
<el-dialog title="操控密码设置" append-to-body v-model="operatePasswordSetBox" width="455px">
- <el-form
- :model="passwordForm"
- ref="passwordForm"
- label-width="80px"
- :rules="rules"
- v-loading="loadingForm"
- >
+ <el-form :model="passwordForm" ref="passwordForm" label-width="80px" :rules="rules" v-loading="loadingForm">
<el-form-item label="密码" prop="password">
- <el-input
- type="password"
- v-model="passwordForm.password"
- placeholder="请输入密码"
- show-password
- ></el-input>
+ <el-input type="password" v-model="passwordForm.password" placeholder="请输入密码" show-password></el-input>
</el-form-item>
<el-form-item label="确认密码" prop="password2">
- <el-input
- type="password"
- v-model="passwordForm.password2"
- placeholder="请输入确认密码"
- show-password
- ></el-input>
+ <el-input type="password" v-model="passwordForm.password2" placeholder="请输入确认密码" show-password></el-input>
</el-form-item>
</el-form>
<template #footer>
@@ -98,7 +56,7 @@
<el-dialog title="操控密码查看" append-to-body v-model="operatePasswordViewBox" width="455px">
<el-input v-model="operate_password" disabled></el-input>
</el-dialog>
- </basic-container>
+ </basic-main-content>
</template>
<script>
@@ -110,27 +68,27 @@
getDetail,
getOperatePassword,
operatePasswordUpdate,
-} from '@/api/device/device';
-import { mapGetters } from 'vuex';
+} from '@/api/device/device'
+import { mapGetters } from 'vuex'
export default {
- data() {
+ data () {
const validatePass = (rule, value, callback) => {
if (value === '') {
- callback(new Error('请输入密码'));
+ callback(new Error('请输入密码'))
} else {
- callback();
+ callback()
}
- };
+ }
const validatePass2 = (rule, value, callback) => {
if (value === '') {
- callback(new Error('请再次输入密码'));
+ callback(new Error('请再次输入密码'))
} else if (value !== this.passwordForm.password) {
- callback(new Error('两次输入密码不一致!'));
+ callback(new Error('两次输入密码不一致!'))
} else {
- callback();
+ callback()
}
- };
+ }
return {
loadingForm: false,
rules: {
@@ -155,8 +113,6 @@
},
selectionList: [],
option: {
- // height: '460',
- // calcHeight: 32,
// dialogWidth: 950,
tip: false,
searchShow: true,
@@ -169,6 +125,10 @@
excelBtn: false,
dialogClickModal: false,
grid: false,
+
+ height: 'auto',
+ calcHeight: 180,
+
column: [
{
label: '设备型号',
@@ -331,144 +291,144 @@
],
},
data: [],
- };
+ }
},
computed: {
...mapGetters(['permission']),
- permissionList() {
+ permissionList () {
return {
addBtn: this.validData(this.permission.fly_add, true),
viewBtn: this.validData(this.permission.fly_view, true),
delBtn: this.validData(this.permission.fly_delete, true),
editBtn: this.validData(this.permission.fly_edit, true),
- };
+ }
},
- ids() {
- let ids = [];
+ ids () {
+ let ids = []
this.selectionList.forEach(ele => {
- ids.push(ele.id);
- });
- return ids.join(',');
+ ids.push(ele.id)
+ })
+ return ids.join(',')
},
},
methods: {
// 设置无人机操作密码
- setOperatePasswordConfirm() {
- var that = this;
+ setOperatePasswordConfirm () {
+ var that = this
this.$refs.passwordForm.validate(valid => {
if (valid) {
- this.loadingForm = true;
+ this.loadingForm = true
const data = {
id: this.passwordForm.id,
operate_password: this.passwordForm.password,
- };
+ }
// 提交
operatePasswordUpdate(data).then(res => {
- this.loadingForm = false;
- this.operatePasswordSetBox = false;
- that.passwordForm = {};
- this.onLoad(this.page);
+ this.loadingForm = false
+ this.operatePasswordSetBox = false
+ that.passwordForm = {}
+ this.onLoad(this.page)
this.$message({
type: 'success',
message: '操作成功!',
- });
- });
+ })
+ })
} else {
- console.log('error submit!!');
- return false;
+ console.log('error submit!!')
+ return false
}
- });
+ })
},
// 操作密码设置
- handleOperatePassword(row) {
- this.operatePasswordSetBox = true;
- this.passwordForm.id = row.id;
+ handleOperatePassword (row) {
+ this.operatePasswordSetBox = true
+ this.passwordForm.id = row.id
},
- viewOperatePassword(row) {
- this.operatePasswordViewBox = true;
+ viewOperatePassword (row) {
+ this.operatePasswordViewBox = true
// 查询密码
getOperatePassword(row.id).then(res => {
- this.operate_password = res.data.data;
- });
+ this.operate_password = res.data.data
+ })
},
- init() {
+ init () {
(this.page = {
pageSize: 10,
currentPage: 1,
total: 0,
}),
- this.onLoad(this.page);
+ this.onLoad(this.page)
},
- rowSave(row, done, loading) {
+ rowSave (row, done, loading) {
add(row).then(
() => {
- this.onLoad(this.page);
+ this.onLoad(this.page)
this.$message({
type: 'success',
message: '操作成功!',
- });
- done();
+ })
+ done()
},
error => {
- window.console.log(error);
- loading();
+ window.console.log(error)
+ loading()
}
- );
+ )
},
- rowUpdate(row, index, done, loading) {
+ rowUpdate (row, index, done, loading) {
update(row).then(
() => {
- this.onLoad(this.page);
+ this.onLoad(this.page)
this.$message({
type: 'success',
message: '操作成功!',
- });
- done();
+ })
+ done()
},
error => {
- window.console.log(error);
- loading();
+ window.console.log(error)
+ loading()
}
- );
+ )
},
- rowDel(row) {
+ rowDel (row) {
this.$confirm('确定将选择数据删除?', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning',
})
.then(() => {
- return remove(row.id);
+ return remove(row.id)
})
.then(() => {
- this.onLoad(this.page);
+ this.onLoad(this.page)
this.$message({
type: 'success',
message: '操作成功!',
- });
- });
+ })
+ })
},
- searchReset() {
- this.query = {};
- this.onLoad(this.page);
+ searchReset () {
+ this.query = {}
+ this.onLoad(this.page)
},
- searchChange(params, done) {
- this.query = params;
- this.page.currentPage = 1;
- this.onLoad(this.page, params);
- done();
+ searchChange (params, done) {
+ this.query = params
+ this.page.currentPage = 1
+ this.onLoad(this.page, params)
+ done()
},
- selectionChange(list) {
- this.selectionList = list;
+ selectionChange (list) {
+ this.selectionList = list
},
- selectionClear() {
- this.selectionList = [];
- this.$refs.crud.toggleSelection();
+ selectionClear () {
+ this.selectionList = []
+ this.$refs.crud.toggleSelection()
},
- handleDelete() {
+ handleDelete () {
if (this.selectionList.length === 0) {
- this.$message.warning('请选择至少一条数据');
- return;
+ this.$message.warning('请选择至少一条数据')
+ return
}
this.$confirm('确定将选择数据删除?', {
confirmButtonText: '确定',
@@ -476,67 +436,67 @@
type: 'warning',
})
.then(() => {
- return remove(this.ids);
+ return remove(this.ids)
})
.then(() => {
- this.onLoad(this.page);
+ this.onLoad(this.page)
this.$message({
type: 'success',
message: '操作成功!',
- });
- this.$refs.crud.toggleSelection();
- });
+ })
+ this.$refs.crud.toggleSelection()
+ })
},
- beforeOpen(done, type) {
+ beforeOpen (done, type) {
if (['edit', 'view'].includes(type)) {
getDetail(this.form.id).then(res => {
- this.form = res.data.data;
- });
+ this.form = res.data.data
+ })
}
- done();
+ done()
},
- handlePageChange(val) {
- this.page = val;
- this.onLoad(this.page);
+ handlePageChange (val) {
+ this.page = val
+ this.onLoad(this.page)
},
- currentChange(currentPage) {
- this.page.currentPage = currentPage;
- this.onLoad(this.page);
+ currentChange (currentPage) {
+ this.page.currentPage = currentPage
+ this.onLoad(this.page)
},
- sizeChange(pageSize) {
- this.page.pageSize = pageSize;
- this.page.currentPage = 1;
- this.onLoad(this.page);
+ sizeChange (pageSize) {
+ this.page.pageSize = pageSize
+ this.page.currentPage = 1
+ this.onLoad(this.page)
},
- refreshChange() {
- this.onLoad(this.page, this.query);
+ refreshChange () {
+ this.onLoad(this.page, this.query)
},
- onLoad(page, params = {}) {
- const { releaseTimeRange } = this.query;
+ onLoad (page, params = {}) {
+ const { releaseTimeRange } = this.query
let values = {
...params,
...this.query,
- };
+ }
if (releaseTimeRange) {
values = {
...values,
releaseTime_datege: releaseTimeRange[0],
releaseTime_datelt: releaseTimeRange[1],
- };
- values.releaseTimeRange = null;
+ }
+ values.releaseTimeRange = null
}
- values['domain'] = 0;
- this.loading = true;
+ values['domain'] = 0
+ this.loading = true
getList(page.currentPage, page.pageSize, values).then(res => {
- const data = res.data.data;
- this.page.total = data.total;
- this.data = data.records;
- this.loading = false;
- this.selectionClear();
- });
+ const data = res.data.data
+ this.page.total = data.total
+ this.data = data.records
+ this.loading = false
+ this.selectionClear()
+ })
},
},
-};
+}
</script>
<style lang="scss" scoped>
@@ -544,25 +504,30 @@
height: 655px !important;
overflow: auto;
}
+
.online {
margin-left: 5px;
}
+
.onlineStatus1 {
display: flex;
flex-direction: column;
align-items: center;
}
+
.onlineStatus {
display: flex;
flex-direction: row;
align-items: center;
}
+
.onlineStatus-dot {
width: 15px;
height: 15px;
background-color: #40cb8b;
border-radius: 50%;
}
+
.onlineStatus-dot1 {
width: 15px;
height: 15px;
diff --git a/src/views/device/index.vue b/src/views/device/index.vue
index 35f066c..d9ef307 100644
--- a/src/views/device/index.vue
+++ b/src/views/device/index.vue
@@ -1,12 +1,12 @@
<!--
- * @Author: shuishen 1109946754@qq.com
- * @Date: 2024-09-09 11:40:40
- * @LastEditors: shuishen 1109946754@qq.com
- * @LastEditTime: 2024-09-09 12:02:50
- * @FilePath: \drone-web-manage\src\views\device\index.vue
- * @Description:
- *
- * Copyright (c) 2024 by shuishen, All Rights Reserved.
+ * @Author : yuan
+ * @Date : 2025-04-27 21:01:20
+ * @LastEditors : yuan
+ * @LastEditTime : 2025-06-25 16:23:45
+ * @FilePath : \src\views\device\index.vue
+ * @Description :
+ * Copyright 2025 OBKoro1, All Rights Reserved.
+ * 2025-04-27 21:01:20
-->
<template>
<basic-container>
@@ -22,47 +22,75 @@
</template>
<script>
-import { mapGetters } from 'vuex';
-import airport from './airport.vue';
-import fly from './fly.vue';
+import { mapGetters } from 'vuex'
+import airport from './airport.vue'
+import fly from './fly.vue'
export default {
components: { airport, fly },
- data() {
+ data () {
return {
activeName: '1',
form: {},
query: {},
loading: true,
data: [],
- };
+ }
},
computed: {
...mapGetters(['permission']),
- permissionList() {
- return {};
+ permissionList () {
+ return {}
},
- ids() {
- let ids = [];
+ ids () {
+ let ids = []
this.selectionList.forEach(ele => {
- ids.push(ele.id);
- });
- return ids.join(',');
+ ids.push(ele.id)
+ })
+ return ids.join(',')
},
},
- created(){
+ created () {
// 默认打开机场页面
},
methods: {
- handleClick(tab, event) {
+ handleClick (tab, event) {
if (tab.index == 1) {
- this.$refs.fly.init();
+ this.$refs.fly.init()
}
if (tab.index == 0) {
- this.$refs.airport.init();
+ this.$refs.airport.init()
}
},
},
-};
+}
</script>
-<style></style>
+<style lang="scss" scoped>
+::v-deep(.el-tabs) {
+ height: 100%;
+ display: flex;
+ flex-direction: column;
+
+ .el-tabs__header {
+ order: 1;
+ }
+
+ .el-tabs__content {
+ order: 2;
+ }
+
+ .el-tabs__content {
+ height: 0;
+ flex: 1;
+ display: flex;
+ flex-direction: column;
+
+ .el-tab-pane {
+ height: 0;
+ flex: 1;
+ display: flex;
+ flex-direction: column;
+ }
+ }
+}
+</style>
diff --git a/src/views/job/components/SearchBox.vue b/src/views/job/components/SearchBox.vue
index 899b99d..89ccc3c 100644
--- a/src/views/job/components/SearchBox.vue
+++ b/src/views/job/components/SearchBox.vue
@@ -59,7 +59,7 @@
</el-form-item>
<el-form-item label="任务算法:" v-if="isExpand" class="taskAlgorithm">
<TaskAlgorithmBusiness
- :setWidth="162"
+ :setWidth="222"
:showAlgorithm="true"
@algorithmChange="algorithmChange"
/>
@@ -451,6 +451,7 @@
.el-form-item {
margin-bottom: 0;
width: 233px;
+ margin-right: 20px;
.el-form-item__label {
color: #363636;
diff --git a/src/views/job/components/TaskIntermediateContent/TaskIntermediateContent.vue b/src/views/job/components/TaskIntermediateContent/TaskIntermediateContent.vue
index 2972cfa..ec6ddd4 100644
--- a/src/views/job/components/TaskIntermediateContent/TaskIntermediateContent.vue
+++ b/src/views/job/components/TaskIntermediateContent/TaskIntermediateContent.vue
@@ -3,16 +3,11 @@
<div class="task-intermediate-content">
<SearchBox @search="searchClick" @addTask="handleAddTask"></SearchBox>
<div class="task-table">
- <el-table
- stripe
- :data="jobListData"
- :row-class-name="tableRowClassName"
- :row-style="{ height: '54px', fontSize: '14px', 'text-align': 'center' }"
- :header-cell-style="{ 'text-align': 'center', height: '36px', fontSize: '14px' }"
- >
+ <el-table border :data="jobListData" class="custom-header">
<el-table-column label="序号" type="index" width="60">
<template #default="{ $index }">
- {{ ($index + 1 + (jobListParams.current - 1) * jobListParams.size).toString().padStart(2, '0') }}
+ {{ ($index + 1 + (jobListParams.current - 1) * jobListParams.size).toString().padStart(2,
+ '0') }}
</template>
</el-table-column>
<el-table-column prop="job_info_num" label="任务编号" show-overflow-tooltip align="center" />
@@ -22,22 +17,20 @@
<el-table-column prop="ai_type_str" label="关联算法" show-overflow-tooltip align="center" />
<el-table-column label="任务状态" align="center">
<template #default="scope">
- <span
- :style="{
- color:
- scope.row.status === 1
- ? '#ffe17e'
- : scope.row.status === 2
- ? '#ffa768'
+ <span :style="{
+ color:
+ scope.row.status === 1
+ ? '#00CDC2'
+ : scope.row.status === 2
+ ? '#FF720F'
: scope.row.status === 3
- ? '#8effac'
- : scope.row.status === 5
- ? '#FF4848'
- : scope.row.status === 7
- ? '#A6A6A6'
- : '',
- }"
- >
+ ? '#00AA2D'
+ : scope.row.status === 5
+ ? '#FF4848'
+ : scope.row.status === 7
+ ? '#A6A6A6'
+ : '',
+ }">
{{ scope.row.status ? getStatusText(scope.row.status) : '' }}
</span>
</template>
@@ -53,10 +46,11 @@
<span>{{ scope.row.event_number ? scope.row.event_number : '/' }}</span>
</template>
</el-table-column>
- <el-table-column prop="cycle_time_value" label="任务时间" />
- <el-table-column prop="creator_name" label="创建人" align="center" />
+ <el-table-column prop="cycle_time_value" label="任务时间" show-overflow-tooltip />
+ <el-table-column prop="creator_name" label="创建人" align="center" show-overflow-tooltip />
<el-table-column label="操作" width="200" align="center">
<template #default="scope">
+<<<<<<< HEAD
<div
v-if="scope.row.status === 2"
class="btnItem"
@@ -73,6 +67,14 @@
type="primary"
@click="cancelTask(scope.row)"
>
+=======
+ <div v-if="scope.row.status === 2" class="btnItem turnBack" link type="primary"
+ @click="turnBack(scope.row)">
+ 返航
+ </div>
+ <div v-if="scope.row.status === 1" class="btnItem cancelTask" link type="primary"
+ @click="cancelTask(scope.row)">
+>>>>>>> 28c246747fe4214c22f3df73ad62b3cd2668dc3c
取消任务
</div>
<div class="btnItem" link type="primary" @click="handleDetail(scope.row)">查看</div>
@@ -105,18 +107,10 @@
:wayLineJodInfoId="rowData.id"
/> -->
<!-- 历史任务详情 -->
- <DeviceJobDetails
- v-if="isShowDeviceJobDetails"
- v-model:show="isShowDeviceJobDetails"
- :wayLineJodInfoId="rowData.id"
- :batchNo="rowData.batch_no"
- />
- <CancelTaskDialog
- ref="cancelTaskDialogRef"
- v-model:isShowCancelTask="isShowCancelTask"
- :row-data="rowData"
- @refresh="getJobList"
- />
+ <DeviceJobDetails v-if="isShowDeviceJobDetails" v-model:show="isShowDeviceJobDetails" :wayLineJodInfoId="rowData.id"
+ :batchNo="rowData.batch_no" />
+ <CancelTaskDialog ref="cancelTaskDialogRef" v-model:isShowCancelTask="isShowCancelTask" :row-data="rowData"
+ @refresh="getJobList" />
</template>
<script setup>
@@ -244,15 +238,23 @@
<style lang="scss" scoped>
.task-intermediate-content {
- margin: 0 18px 16px 10px;
+ height: 0;
+ flex: 1;
+ margin: 0 10px 10px 10px;
background-color: #ffffff;
- padding: 14px 18px;
+ padding: 20px;
+ border-radius: 5px;
+ display: flex;
+ flex-direction: column;
+
// 表格
.task-table {
- height: 580px;
+ height: 0;
+ flex: 1;
margin-top: 18px;
overflow: auto;
}
+
.btnItem {
height: 27px;
line-height: 27px;
@@ -271,24 +273,39 @@
border: 1px solid #ffa500;
color: #ffa500;
}
+
&.cancelTask {
- border: 1px solid #3efe96;
- color: #3efe96;
+ border: 1px solid #00AA2D;
+ color: #00AA2D;
}
}
- :deep(.el-table) {
- --el-table-tr-bg-color: #ffffff;
- --el-table-striped-bg-color: #EFEFEF;
-
- .el-table__body tr.el-table__row--striped td {
- background-color: var(--el-table-striped-bg-color);
- }
- }
+
+ // :deep(.el-table) {
+ // --el-table-tr-bg-color: #ffffff;
+ // --el-table-striped-bg-color: #EFEFEF;
+
+ // .el-table__body tr.el-table__row--striped td {
+ // background-color: var(--el-table-striped-bg-color);
+ // }
+ // }
// 分页
+ :deep(.custom-header th.el-table__cell) {
+ color: rgba(0, 0, 0, 0.85);
+ }
+
+ :deep(.el-table td.el-table__cell) {
+ color: #606266;
+ }
+
:deep(.el-pagination) {
display: flex;
+<<<<<<< HEAD
justify-content: right;
+=======
+ justify-content: flex-end;
+>>>>>>> 28c246747fe4214c22f3df73ad62b3cd2668dc3c
}
+
:deep(.el-pagination button) {
background: center center no-repeat none !important;
color: #8eb8ea !important;
diff --git a/src/views/job/components/TaskTop/TaskEvent.vue b/src/views/job/components/TaskTop/TaskEvent.vue
index aa3895d..dcc40cd 100644
--- a/src/views/job/components/TaskTop/TaskEvent.vue
+++ b/src/views/job/components/TaskTop/TaskEvent.vue
@@ -81,7 +81,7 @@
{
name: '任务',
type: 'bar',
- barWidth: 8,
+ barWidth: 6,
itemStyle: {
color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
{ offset: 0, color: '#FF8902' },
@@ -92,7 +92,7 @@
{
name: '事件',
type: 'bar',
- barWidth: 8,
+ barWidth: 6,
itemStyle: {
color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
{ offset: 0, color: '#4363FF' },
@@ -132,11 +132,13 @@
<style lang="scss" scoped>
.task-event {
-width: 529px;
+ width: 0;
+ flex: 1;
height: 100%;
- margin-left: 9px;
+ margin-left: 10px;
background: #FFFFFF;
border-radius: 8px 8px 8px 8px;
+
.title {
padding: 10px 0 10px 16px;
width: 144px;
@@ -147,11 +149,12 @@
color: #363636;
line-height: 18px;
}
+
.chart {
padding: 6px 0px;
width: 100%;
height: 166px;
-
+
}
}
</style>
diff --git a/src/views/job/components/TaskTop/TaskIndustry.vue b/src/views/job/components/TaskTop/TaskIndustry.vue
index 5509958..75d26c8 100644
--- a/src/views/job/components/TaskTop/TaskIndustry.vue
+++ b/src/views/job/components/TaskTop/TaskIndustry.vue
@@ -38,17 +38,12 @@
{
name: '机巢事件统计',
type: 'pie',
- roseType: 'radius',
- radius: ['20%', '70%'],
- center: ['50%', '45%'],
+ // roseType: 'radius',
+ radius: ['40%', '70%'],
+ // center: ['50%', '45%'],
+ // radius: '70%', // 设置饼图的半径
+ center: ['50%', '50%'], // 调整饼图位置
data: [],
- // [
- // { name: '国土类', value: 0, itemStyle: { color: '#3D7FFF' } },
- // { name: '城管类', value: 0, itemStyle: { color: '#8277E9' } },
- // { name: '消防类', value: 0, itemStyle: { color: '#FFB77E' } },
- // { name: '林业类', value: 0, itemStyle: { color: '#44D7B6' } },
- // { name: '公安类', value: 0, itemStyle: { color: '#62F4FF' } }
- // ],
label: {
show: true,
position: 'outside',
@@ -101,11 +96,12 @@
<style lang="scss" scoped>
.task-industry {
-width: 276px;
+ width: 276px;
height: 100%;
background: #FFFFFF;
border-radius: 8px 8px 8px 8px;
- margin-left: 9px;
+ margin-left: 10px;
+
.title {
font-family: Segoe UI, Segoe UI;
padding: 10px 0 10px 16px;
@@ -116,6 +112,7 @@
color: #363636;
line-height: 18px;
}
+
.chart {
width: 100%;
height: 180px;
diff --git a/src/views/job/components/TaskTop/TaskTime.vue b/src/views/job/components/TaskTop/TaskTime.vue
index 4b26167..310f361 100644
--- a/src/views/job/components/TaskTop/TaskTime.vue
+++ b/src/views/job/components/TaskTop/TaskTime.vue
@@ -142,9 +142,10 @@
.task-time {
width: 529px;
height: 100%;
- margin-left: 9px;
+ margin-left: 10px;
background: #FFFFFF;
border-radius: 8px 8px 8px 8px;
+
.title {
padding: 10px 0 10px 16px;
width: 96px;
@@ -155,6 +156,7 @@
color: #363636;
line-height: 18px;
}
+
.chart {
padding: 6px 0px;
width: 100%;
diff --git a/src/views/job/components/TaskTop/TaskTop.vue b/src/views/job/components/TaskTop/TaskTop.vue
index e3fbe31..68b8a6b 100644
--- a/src/views/job/components/TaskTop/TaskTop.vue
+++ b/src/views/job/components/TaskTop/TaskTop.vue
@@ -1,8 +1,16 @@
+<!--
+ * @Author : yuan
+ * @Date : 2025-06-14 15:19:16
+ * @LastEditors : yuan
+ * @LastEditTime : 2025-06-26 11:46:38
+ * @FilePath : \src\views\job\components\TaskTop\TaskTop.vue
+ * @Description :
+ * Copyright 2025 OBKoro1, All Rights Reserved.
+ * 2025-06-14 15:19:16
+-->
<template>
<div class="task-top">
<!--时间 天气-->
- <common-weather />
- <UserOperate />
<div class="statistical-chart">
<TaskTotal />
<TaskIndustry />
@@ -14,8 +22,6 @@
<script setup>
import { pxToRem } from '@/utils/rem'
-// import CommonWeather from '@/components/CommonWeather.vue'
-// import UserOperate from '@/components/UserOperate.vue'
import TaskTotal from './TaskTotal.vue'
import TaskIndustry from './TaskIndustry.vue'
import TaskTime from './TaskTime.vue'
@@ -25,12 +31,14 @@
<style lang="scss" scoped>
.task-top {
position: relative;
- margin-bottom: 6px;
+ display: flex;
+
.statistical-chart {
margin-left: 10px;
- margin-right: 40px;
+ margin-right: 10px;
display: flex;
- width:100%;
+ width: 0;
+ flex: 1;
height: 216px;
box-sizing: border-box;
margin-bottom: 10px;
diff --git a/src/views/job/components/TaskTop/TaskTotal.vue b/src/views/job/components/TaskTop/TaskTotal.vue
index 20ac749..84de5a7 100644
--- a/src/views/job/components/TaskTop/TaskTotal.vue
+++ b/src/views/job/components/TaskTop/TaskTotal.vue
@@ -40,10 +40,10 @@
const list = ref([
{ name: '计划执行', value: '0', color: '#1C5CFF', img: jhzxpng },
{ name: '已执行', value: '0', color: '#00AA2D', img: yzxpng },
- { name: '执行中', value: '0', color: '#FFA768', img: zxzpng},
+ { name: '执行中', value: '0', color: '#FF720F', img: zxzpng},
{ name: '执行失败', value: '0', color: '#FF4848', img: zxsbpng },
{ name: '待执行', value: '0', color: '#00CDC2', img: dzxpng },
- { name: '取消执行', value: '0', color: '#A6A6A6', img: qxzxpng },
+ { name: '取消执行', value: '0', color: '#373333', img: qxzxpng },
])
// 获取任务统计总数
diff --git a/src/views/job/jobinfo.vue b/src/views/job/jobinfo.vue
index db38193..3eb74cf 100644
--- a/src/views/job/jobinfo.vue
+++ b/src/views/job/jobinfo.vue
@@ -1,68 +1,37 @@
<template>
<basic-container>
- <avue-crud
- :option="option"
- v-model:search="search"
- v-model:page="page"
- v-model="form"
- :table-loading="loading"
- :data="data"
- :permission="permissionList"
- :before-open="beforeOpen"
- ref="crud"
- @row-update="rowUpdate"
- @row-save="rowSave"
- @row-del="rowDel"
- @search-change="searchChange"
- @search-reset="searchReset"
- @selection-change="selectionChange"
- @current-change="currentChange"
- @size-change="sizeChange"
- @refresh-change="refreshChange"
- @on-load="onLoad"
- >
+ <avue-crud :option="option" v-model:search="search" v-model:page="page" v-model="form" :table-loading="loading"
+ :data="data" :permission="permissionList" :before-open="beforeOpen" ref="crud" @row-update="rowUpdate"
+ @row-save="rowSave" @row-del="rowDel" @search-change="searchChange" @search-reset="searchReset"
+ @selection-change="selectionChange" @current-change="currentChange" @size-change="sizeChange"
+ @refresh-change="refreshChange" @on-load="onLoad">
<template #menu-left>
- <el-button
- type="danger"
- icon="el-icon-delete"
- plain
- v-if="permission.jobinfo_delete"
- @click="handleDelete"
- >删 除
+ <el-button type="danger" icon="el-icon-delete" plain v-if="permission.jobinfo_delete" @click="handleDelete">删 除
</el-button>
- <el-button type="info" plain icon="el-icon-sort" @click="handleSync"
- >数 据 同 步
+ <el-button type="info" plain icon="el-icon-sort" @click="handleSync">数 据 同 步
</el-button>
</template>
<template #menu="scope">
- <el-button type="primary" text icon="el-icon-video-play" @click="handleRun(scope.row)"
- >运 行
+ <el-button type="primary" text icon="el-icon-video-play" @click="handleRun(scope.row)">运 行
</el-button>
</template>
<template #enable="{ row }">
- <el-switch
- v-model="row.enable"
- inline-prompt
- @change="slotChange(row)"
- active-text="启用"
- inactive-text="暂停"
- :active-value="1"
- :inactive-value="0"
- />
+ <el-switch v-model="row.enable" inline-prompt @change="slotChange(row)" active-text="启用" inactive-text="暂停"
+ :active-value="1" :inactive-value="0" />
</template>
</avue-crud>
</basic-container>
</template>
<script>
-import { getList, getDetail, add, update, remove, change, run, sync } from '@/api/job/jobinfo';
-import option from '@/option/job/jobinfo';
-import { mapGetters } from 'vuex';
-import 'nprogress/nprogress.css';
-import func from '@/utils/func';
+import { getList, getDetail, add, update, remove, change, run, sync } from '@/api/job/jobinfo'
+import option from '@/option/job/jobinfo'
+import { mapGetters } from 'vuex'
+import 'nprogress/nprogress.css'
+import func from '@/utils/func'
export default {
- data() {
+ data () {
return {
form: {},
query: {},
@@ -76,98 +45,98 @@
selectionList: [],
option: option,
data: [],
- };
+ }
},
computed: {
...mapGetters(['permission']),
- permissionList() {
+ permissionList () {
return {
addBtn: this.validData(this.permission.jobinfo_add, false),
viewBtn: this.validData(this.permission.jobinfo_view, false),
delBtn: this.validData(this.permission.jobinfo_delete, false),
editBtn: this.validData(this.permission.jobinfo_edit, false),
- };
+ }
},
- ids() {
- let ids = [];
+ ids () {
+ let ids = []
this.selectionList.forEach(ele => {
- ids.push(ele.id);
- });
- return ids.join(',');
+ ids.push(ele.id)
+ })
+ return ids.join(',')
},
},
methods: {
- rowSave(row, done, loading) {
+ rowSave (row, done, loading) {
if (func.isArrayAndNotEmpty(row.lifecycle)) {
- const lifecycleStart = row.lifecycle[0];
- const lifecycleEnd = row.lifecycle[1];
+ const lifecycleStart = row.lifecycle[0]
+ const lifecycleEnd = row.lifecycle[1]
if (!func.isUndefined(lifecycleStart) && !func.isUndefined(lifecycleEnd)) {
- row.lifecycle = lifecycleStart + ',' + lifecycleEnd;
+ row.lifecycle = lifecycleStart + ',' + lifecycleEnd
}
} else {
- row.lifecycle = '';
+ row.lifecycle = ''
}
add(row).then(
() => {
- this.onLoad(this.page);
+ this.onLoad(this.page)
this.$message({
type: 'success',
message: '操作成功!',
- });
- done();
+ })
+ done()
},
error => {
- loading();
- window.console.log(error);
+ loading()
+ window.console.log(error)
}
- );
+ )
},
- rowUpdate(row, index, done, loading) {
+ rowUpdate (row, index, done, loading) {
if (func.isArrayAndNotEmpty(row.lifecycle)) {
- const lifecycleStart = row.lifecycle[0];
- const lifecycleEnd = row.lifecycle[1];
+ const lifecycleStart = row.lifecycle[0]
+ const lifecycleEnd = row.lifecycle[1]
if (!func.isUndefined(lifecycleStart) && !func.isUndefined(lifecycleEnd)) {
- row.lifecycle = lifecycleStart + ',' + lifecycleEnd;
+ row.lifecycle = lifecycleStart + ',' + lifecycleEnd
}
- }else{
+ } else {
row.lifecycle = ""
}
update(row).then(
() => {
- this.onLoad(this.page);
+ this.onLoad(this.page)
this.$message({
type: 'success',
message: '操作成功!',
- });
- done();
+ })
+ done()
},
error => {
- loading();
- console.log(error);
+ loading()
+ console.log(error)
}
- );
+ )
},
- rowDel(row) {
+ rowDel (row) {
this.$confirm('确定将选择数据删除?', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning',
})
.then(() => {
- return remove(row.id);
+ return remove(row.id)
})
.then(() => {
- this.onLoad(this.page);
+ this.onLoad(this.page)
this.$message({
type: 'success',
message: '操作成功!',
- });
- });
+ })
+ })
},
- handleDelete() {
+ handleDelete () {
if (this.selectionList.length === 0) {
- this.$message.warning('请选择至少一条数据');
- return;
+ this.$message.warning('请选择至少一条数据')
+ return
}
this.$confirm('确定将选择数据删除?', {
confirmButtonText: '确定',
@@ -175,130 +144,121 @@
type: 'warning',
})
.then(() => {
- return remove(this.ids);
+ return remove(this.ids)
})
.then(() => {
- this.onLoad(this.page);
+ this.onLoad(this.page)
this.$message({
type: 'success',
message: '操作成功!',
- });
- this.$refs.crud.toggleSelection();
- });
+ })
+ this.$refs.crud.toggleSelection()
+ })
},
- handleSync() {
+ handleSync () {
this.$confirm('确定进行数据双向同步?', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning',
})
.then(() => {
- return sync();
+ return sync()
})
.then(() => {
- this.onLoad(this.page);
+ this.onLoad(this.page)
this.$message({
type: 'success',
message: '操作成功!',
- });
- });
+ })
+ })
},
- handleRun(row) {
+ handleRun (row) {
this.$confirm('运行后将创建一个实例执行,是否继续?', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning',
})
.then(() => {
- return run(row);
+ return run(row)
})
.then(() => {
this.$message({
type: 'success',
message: '运行成功!',
- });
- });
+ })
+ })
},
- slotChange(row) {
+ slotChange (row) {
if (!row.id) {
- return;
+ return
}
change(row).then(
() => {
- this.onLoad(this.page);
+ this.onLoad(this.page)
this.$message({
type: 'success',
message: '操作成功!',
- });
+ })
},
error => {
- window.console.log(error);
+ window.console.log(error)
}
- );
+ )
},
- beforeOpen(done, type) {
+ beforeOpen (done, type) {
if (['edit', 'view'].includes(type)) {
getDetail(this.form.id).then(res => {
- this.form = res.data.data;
- });
+ this.form = res.data.data
+ })
}
- done();
+ done()
},
- searchReset() {
- this.query = {};
- this.onLoad(this.page);
+ searchReset () {
+ this.query = {}
+ this.onLoad(this.page)
},
- searchChange(params, done) {
- this.query = params;
- this.page.currentPage = 1;
- this.onLoad(this.page, params);
- done();
+ searchChange (params, done) {
+ this.query = params
+ this.page.currentPage = 1
+ this.onLoad(this.page, params)
+ done()
},
- selectionChange(list) {
- this.selectionList = list;
+ selectionChange (list) {
+ this.selectionList = list
},
- selectionClear() {
- this.selectionList = [];
- this.$refs.crud.toggleSelection();
+ selectionClear () {
+ this.selectionList = []
+ this.$refs.crud.toggleSelection()
},
- currentChange(currentPage) {
- this.page.currentPage = currentPage;
+ currentChange (currentPage) {
+ this.page.currentPage = currentPage
},
- sizeChange(pageSize) {
- this.page.pageSize = pageSize;
+ sizeChange (pageSize) {
+ this.page.pageSize = pageSize
},
- refreshChange() {
- this.onLoad(this.page, this.query);
+ refreshChange () {
+ this.onLoad(this.page, this.query)
},
- onLoad(page) {
- this.loading = true;
+ onLoad (page) {
+ this.loading = true
- const { jobServerId, jobName } = this.query;
+ const { jobServerId, jobName } = this.query
let values = {
jobServerId_like: jobServerId,
jobName_like: jobName,
- };
+ }
getList(page.currentPage, page.pageSize, values).then(res => {
- const data = res.data.data;
- this.page.total = data.total;
- this.data = data.records;
- this.loading = false;
- this.selectionClear();
- });
+ const data = res.data.data
+ this.page.total = data.total
+ this.data = data.records
+ this.loading = false
+ this.selectionClear()
+ })
},
},
-};
+}
</script>
-<style scoped lang="scss">
- :deep(){
- .avue-crud__body{
- .el-form{
- height: 745px;
- overflow: auto;
- }
- }
- }
-</style>
+<style scoped lang="scss"></style>
diff --git a/src/views/job/jobserver.vue b/src/views/job/jobserver.vue
index d0a9975..29567a9 100644
--- a/src/views/job/jobserver.vue
+++ b/src/views/job/jobserver.vue
@@ -1,42 +1,19 @@
<template>
<basic-container>
- <avue-crud
- :option="option"
- v-model:search="search"
- v-model:page="page"
- v-model="form"
- :table-loading="loading"
- :data="data"
- :permission="permissionList"
- :before-open="beforeOpen"
- ref="crud"
- @row-update="rowUpdate"
- @row-save="rowSave"
- @row-del="rowDel"
- @search-change="searchChange"
- @search-reset="searchReset"
- @selection-change="selectionChange"
- @current-change="currentChange"
- @size-change="sizeChange"
- @refresh-change="refreshChange"
- @on-load="onLoad"
- >
+ <avue-crud :option="option" v-model:search="search" v-model:page="page" v-model="form" :table-loading="loading"
+ :data="data" :permission="permissionList" :before-open="beforeOpen" ref="crud" @row-update="rowUpdate"
+ @row-save="rowSave" @row-del="rowDel" @search-change="searchChange" @search-reset="searchReset"
+ @selection-change="selectionChange" @current-change="currentChange" @size-change="sizeChange"
+ @refresh-change="refreshChange" @on-load="onLoad">
<template #menu-left>
- <el-button
- type="danger"
- icon="el-icon-delete"
- plain
- v-if="permission.jobserver_delete"
- @click="handleDelete"
- >删 除
+ <el-button type="danger" icon="el-icon-delete" plain v-if="permission.jobserver_delete" @click="handleDelete">删
+ 除
</el-button>
- <el-button type="info" plain icon="el-icon-sort" @click="handleSync"
- >数 据 同 步
+ <el-button type="info" plain icon="el-icon-sort" @click="handleSync">数 据 同 步
</el-button>
</template>
<template #menu="scope">
- <el-button type="primary" text icon="el-icon-video-play" @click="handleLink(scope.row)"
- >服务跳转
+ <el-button type="primary" text icon="el-icon-video-play" @click="handleLink(scope.row)">服务跳转
</el-button>
</template>
</avue-crud>
@@ -44,14 +21,14 @@
</template>
<script>
-import { getList, getDetail, add, update, remove, sync } from '@/api/job/jobserver';
-import option from '@/option/job/jobserver';
-import { mapGetters } from 'vuex';
-import 'nprogress/nprogress.css';
-import func from '@/utils/func';
+import { getList, getDetail, add, update, remove, sync } from '@/api/job/jobserver'
+import option from '@/option/job/jobserver'
+import { mapGetters } from 'vuex'
+import 'nprogress/nprogress.css'
+import func from '@/utils/func'
export default {
- data() {
+ data () {
return {
form: {},
query: {},
@@ -65,80 +42,80 @@
selectionList: [],
option: option,
data: [],
- };
+ }
},
computed: {
...mapGetters(['permission']),
- permissionList() {
+ permissionList () {
return {
addBtn: this.validData(this.permission.jobserver_add, false),
viewBtn: this.validData(this.permission.jobserver_view, false),
delBtn: this.validData(this.permission.jobserver_delete, false),
editBtn: this.validData(this.permission.jobserver_edit, false),
- };
+ }
},
- ids() {
- let ids = [];
+ ids () {
+ let ids = []
this.selectionList.forEach(ele => {
- ids.push(ele.id);
- });
- return ids.join(',');
+ ids.push(ele.id)
+ })
+ return ids.join(',')
},
},
methods: {
- rowSave(row, done, loading) {
+ rowSave (row, done, loading) {
add(row).then(
() => {
- this.onLoad(this.page);
+ this.onLoad(this.page)
this.$message({
type: 'success',
message: '操作成功!',
- });
- done();
+ })
+ done()
},
error => {
- loading();
- window.console.log(error);
+ loading()
+ window.console.log(error)
}
- );
+ )
},
- rowUpdate(row, index, done, loading) {
+ rowUpdate (row, index, done, loading) {
update(row).then(
() => {
- this.onLoad(this.page);
+ this.onLoad(this.page)
this.$message({
type: 'success',
message: '操作成功!',
- });
- done();
+ })
+ done()
},
error => {
- loading();
- console.log(error);
+ loading()
+ console.log(error)
}
- );
+ )
},
- rowDel(row) {
+ rowDel (row) {
this.$confirm('确定将选择数据删除?', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning',
})
.then(() => {
- return remove(row.id);
+ return remove(row.id)
})
.then(() => {
- this.onLoad(this.page);
+ this.onLoad(this.page)
this.$message({
type: 'success',
message: '操作成功!',
- });
- });
+ })
+ })
},
- handleDelete() {
+ handleDelete () {
if (this.selectionList.length === 0) {
- this.$message.warning('请选择至少一条数据');
- return;
+ this.$message.warning('请选择至少一条数据')
+ return
}
this.$confirm('确定将选择数据删除?', {
confirmButtonText: '确定',
@@ -146,100 +123,91 @@
type: 'warning',
})
.then(() => {
- return remove(this.ids);
+ return remove(this.ids)
})
.then(() => {
- this.onLoad(this.page);
+ this.onLoad(this.page)
this.$message({
type: 'success',
message: '操作成功!',
- });
- this.$refs.crud.toggleSelection();
- });
+ })
+ this.$refs.crud.toggleSelection()
+ })
},
- handleLink(row) {
- window.open(func.formatUrl(row.jobServerUrl));
+ handleLink (row) {
+ window.open(func.formatUrl(row.jobServerUrl))
},
- handleSync() {
+ handleSync () {
this.$confirm('确定进行数据双向同步?', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning',
})
.then(() => {
- return sync();
+ return sync()
})
.then(() => {
- this.onLoad(this.page);
+ this.onLoad(this.page)
this.$message({
type: 'success',
message: '操作成功!',
- });
- });
+ })
+ })
},
- beforeOpen(done, type) {
+ beforeOpen (done, type) {
if (['edit', 'view'].includes(type)) {
getDetail(this.form.id).then(res => {
- this.form = res.data.data;
- });
+ this.form = res.data.data
+ })
}
- done();
+ done()
},
- searchReset() {
- this.query = {};
- this.onLoad(this.page);
+ searchReset () {
+ this.query = {}
+ this.onLoad(this.page)
},
- searchChange(params, done) {
- this.query = params;
- this.page.currentPage = 1;
- this.onLoad(this.page, params);
- done();
+ searchChange (params, done) {
+ this.query = params
+ this.page.currentPage = 1
+ this.onLoad(this.page, params)
+ done()
},
- selectionChange(list) {
- this.selectionList = list;
+ selectionChange (list) {
+ this.selectionList = list
},
- selectionClear() {
- this.selectionList = [];
- this.$refs.crud.toggleSelection();
+ selectionClear () {
+ this.selectionList = []
+ this.$refs.crud.toggleSelection()
},
- currentChange(currentPage) {
- this.page.currentPage = currentPage;
+ currentChange (currentPage) {
+ this.page.currentPage = currentPage
},
- sizeChange(pageSize) {
- this.page.pageSize = pageSize;
+ sizeChange (pageSize) {
+ this.page.pageSize = pageSize
},
- refreshChange() {
- this.onLoad(this.page, this.query);
+ refreshChange () {
+ this.onLoad(this.page, this.query)
},
- onLoad(page) {
- this.loading = true;
+ onLoad (page) {
+ this.loading = true
- const { jobServerName, jobAppName } = this.query;
+ const { jobServerName, jobAppName } = this.query
let values = {
jobServerName_like: jobServerName,
jobAppName_like: jobAppName,
- };
+ }
getList(page.currentPage, page.pageSize, values).then(res => {
- const data = res.data.data;
- this.page.total = data.total;
- this.data = data.records;
- this.loading = false;
- this.selectionClear();
- });
+ const data = res.data.data
+ this.page.total = data.total
+ this.data = data.records
+ this.loading = false
+ this.selectionClear()
+ })
},
},
-};
+}
</script>
-<style scoped lang="scss">
- :deep(){
- .avue-crud__body{
- .el-form{
- height: 745px;
- overflow: auto;
- }
- }
- }
-</style>
+<style scoped lang="scss"></style>
diff --git a/src/views/job/jobstatistics.vue b/src/views/job/jobstatistics.vue
index 13f4fb1..e09e321 100644
--- a/src/views/job/jobstatistics.vue
+++ b/src/views/job/jobstatistics.vue
@@ -1,14 +1,11 @@
<script setup>
-import TaskTop from "@/views/job/components/TaskTop/TaskTop.vue";
-import TaskIntermediateContent from "@/views/job/components/TaskIntermediateContent/TaskIntermediateContent.vue";
+import TaskTop from "@/views/job/components/TaskTop/TaskTop.vue"
+import TaskIntermediateContent from "@/views/job/components/TaskIntermediateContent/TaskIntermediateContent.vue"
</script>
<template>
- <TaskTop/>
+ <TaskTop />
<TaskIntermediateContent />
</template>
-
-<style scoped lang="scss">
-
-</style>
+<style scoped lang="scss"></style>
diff --git a/src/views/license/license.vue b/src/views/license/license.vue
index 7365e8a..16ab9ed 100644
--- a/src/views/license/license.vue
+++ b/src/views/license/license.vue
@@ -1,32 +1,15 @@
<template>
<basic-container>
-
- <avue-crud
- :option="option"
- :table-loading="loading"
- :data="data"
- v-model:page="page"
- ref="crud"
- @row-del="rowDel"
- v-model="form"
- :permission="permissionList"
- @row-update="rowUpdate"
- @row-save="rowSave"
- :before-open="beforeOpen"
- @search-change="searchChange"
- @search-reset="searchReset"
- @selection-change="selectionChange"
- @current-change="currentChange"
- @size-change="sizeChange"
- @refresh-change="refreshChange"
- @on-load="onLoad">
-
+
+ <avue-crud :option="option" :table-loading="loading" :data="data" v-model:page="page" ref="crud"
+ @row-del="rowDel" v-model="form" :permission="permissionList" @row-update="rowUpdate" @row-save="rowSave"
+ :before-open="beforeOpen" @search-change="searchChange" @search-reset="searchReset"
+ @selection-change="selectionChange" @current-change="currentChange" @size-change="sizeChange"
+ @refresh-change="refreshChange" @on-load="onLoad">
+
<!-- 自定义证书地址列 -->
<template #url="scope">
- <el-link
- :href="scope.row.url"
- target="_blank"
- type="primary">
+ <el-link :href="scope.row.url" target="_blank" type="primary">
下载密钥
</el-link>
</template>
@@ -34,7 +17,7 @@
<!-- 自定义过期时间列 -->
<template #expireDay="scope">
<span :style="{ color: isExpired(scope.row.expireDay) ? 'red' : 'inherit' }">
- {{ formatExpireDay(scope.row.expireDay,scope.row.licenseType) }}
+ {{ formatExpireDay(scope.row.expireDay, scope.row.licenseType) }}
</span>
</template>
@@ -52,21 +35,16 @@
</span>
</template>
<template #menu-left>
- <el-button type="primary" icon="el-icon-plus"
- @click="createLicenseShow()">新 增
- </el-button>
+ <el-button type="primary" icon="el-icon-plus" @click="createLicenseShow()">新 增
+ </el-button>
</template>
</avue-crud>
<!-- 新增弹窗 -->
- <el-dialog title="新增 License"
- v-model="addDialogVisible"
- width="70%"
- :close-on-click-modal="false"
- @close="resetForm"
- >
+ <el-dialog title="新增 License" v-model="addDialogVisible" width="70%" :close-on-click-modal="false"
+ @close="resetForm">
<el-form :model="newLicense" ref="licenseForm" label-width="120px">
- <el-form-item label="机构ID" prop="licenseId" >
+ <el-form-item label="机构ID" prop="licenseId">
<el-input v-model="newLicense.licenseId" />
</el-form-item>
<el-form-item label="机构名称" prop="licenseName" required>
@@ -78,7 +56,7 @@
<el-option label="验证过期时间" :value="2" />
</el-select>
</el-form-item>
- <el-form-item v-if="newLicense.licenseType==2" label="过期时间" prop="expireDay">
+ <el-form-item v-if="newLicense.licenseType == 2" label="过期时间" prop="expireDay">
<el-date-picker v-model="newLicense.expireDay" type="date" placeholder="选择日期" />
</el-form-item>
<el-form-item label="设备数量" prop="printClientCount">
@@ -86,13 +64,8 @@
<el-radio :label="-1">不限制</el-radio>
<el-radio :label="1">限制</el-radio>
</el-radio-group>
- <el-input-number
- v-if="deviceLimit === 1"
- v-model="newLicense.printClientCount"
- :min="0"
- placeholder="请输入数量"
- style="margin-top: 10px;"
- />
+ <el-input-number v-if="deviceLimit === 1" v-model="newLicense.printClientCount" :min="0"
+ placeholder="请输入数量" style="margin-top: 10px;" />
</el-form-item>
<el-form-item label="是否校验机器码" prop="checkMachineCode">
<el-switch v-model="newLicense.checkMachineCode" />
@@ -106,21 +79,21 @@
</el-form>
<template #footer>
<div class="dialog-footer">
- <el-button @click="addDialogVisible = false">取消</el-button>
- <el-button type="primary" @click="createLicense">保存</el-button>
+ <el-button @click="addDialogVisible = false">取消</el-button>
+ <el-button type="primary" @click="createLicense">保存</el-button>
</div>
</template>
-
+
</el-dialog>
</basic-container>
</template>
<script>
-import { getList, add } from '@/api/license/license';
-import { mapGetters } from 'vuex';
+import { getList, add } from '@/api/license/license'
+import { mapGetters } from 'vuex'
export default {
- data() {
+ data () {
return {
loading: true,
page: {
@@ -153,10 +126,14 @@
viewBtn: true,
selection: false,
excelBtn: false,
- addBtnText: '新建license',
- addBtn: true,
+ addBtnText: '新建license',
+ addBtn: true,
dialogClickModal: false,
grid: false,
+
+ height: 'auto',
+ calcHeight: 20,
+
column: [
{
label: '机构ID',
@@ -289,89 +266,88 @@
],
},
data: [],
- };
+ }
},
computed: {
...mapGetters(['userInfo', 'permission']),
- permissionList() {
+ permissionList () {
return {
addBtn: this.validData(this.permission.license_add, false),
viewBtn: this.validData(this.permission.license_view, true),
delBtn: this.validData(this.permission.license_delete, false),
editBtn: this.validData(this.permission.license_edit, false),
- };
+ }
},
},
methods: {
- isExpired(expireDay) {
- const now = new Date();
- return new Date(expireDay) < now;
+ isExpired (expireDay) {
+ const now = new Date()
+ return new Date(expireDay) < now
},
- formatExpireDay(expireDay,licenseType) {
- if (licenseType==2&& this.isExpired(expireDay)) {
- return `${expireDay} (已过期)`;
+ formatExpireDay (expireDay, licenseType) {
+ if (licenseType == 2 && this.isExpired(expireDay)) {
+ return `${expireDay} (已过期)`
}
- if(licenseType==1){
- return `永久`;
+ if (licenseType == 1) {
+ return `永久`
}
- return expireDay;
+ return expireDay
},
- rowSave(row, done, loading) {
+ rowSave (row, done, loading) {
add(row).then(
() => {
- this.onLoad(this.page);
+ this.onLoad(this.page)
this.$message({
type: 'success',
message: '操作成功!',
- });
- done();
+ })
+ done()
},
error => {
- console.error(error);
- loading();
+ console.error(error)
+ loading()
}
- );
+ )
},
- createLicenseShow(){
- this.addDialogVisible = true;
+ createLicenseShow () {
+ this.addDialogVisible = true
},
- createLicense() {
+ createLicense () {
// 格式化过期时间
if (this.newLicense.expireDay) {
- this.newLicense.expireDay = this.formatDate(this.newLicense.expireDay);
- console.log(this.newLicense.expireDay);
-
- }
+ this.newLicense.expireDay = this.formatDate(this.newLicense.expireDay)
+ console.log(this.newLicense.expireDay)
+
+ }
// 保存数据
add(this.newLicense).then(() => {
- this.$message.success('新增成功');
- this.addDialogVisible = false;
- this.onLoad(this.page);
+ this.$message.success('新增成功')
+ this.addDialogVisible = false
+ this.onLoad(this.page)
}).catch(error => {
- console.error(error);
- this.$message.error('新增失败');
- });
+ console.error(error)
+ this.$message.error('新增失败')
+ })
},
- formatDate(date) {
- const d = new Date(date);
- const year = d.getFullYear();
- const month = String(d.getMonth() + 1).padStart(2, '0');
- const day = String(d.getDate()).padStart(2, '0');
- return `${year}-${month}-${day}`;
+ formatDate (date) {
+ const d = new Date(date)
+ const year = d.getFullYear()
+ const month = String(d.getMonth() + 1).padStart(2, '0')
+ const day = String(d.getDate()).padStart(2, '0')
+ return `${year}-${month}-${day}`
},
- onLoad(page, params = {}) {
- this.loading = true;
+ onLoad (page, params = {}) {
+ this.loading = true
getList(page.currentPage, page.pageSize, params).then(res => {
- const data = res.data.data;
- this.page.total = data.total;
- this.data = data.records;
- this.loading = false;
- });
+ const data = res.data.data
+ this.page.total = data.total
+ this.data = data.records
+ this.loading = false
+ })
},
},
-};
+}
</script>
-<style lang="scss" scoped>
-</style>
+<style lang="scss" scoped></style>
diff --git a/src/views/monitor/log/api.vue b/src/views/monitor/log/api.vue
index 5e74765..159ec99 100644
--- a/src/views/monitor/log/api.vue
+++ b/src/views/monitor/log/api.vue
@@ -1,31 +1,19 @@
<template>
<basic-container>
- <avue-crud
- :option="option"
- :table-loading="loading"
- :data="data"
- ref="crud"
- v-model="form"
- :permission="permissionList"
- :before-open="beforeOpen"
- v-model:page="page"
- @search-change="searchChange"
- @search-reset="searchReset"
- @current-change="currentChange"
- @size-change="sizeChange"
- @refresh-change="refreshChange"
- @on-load="onLoad"
- >
+ <avue-crud :option="option" :table-loading="loading" :data="data" ref="crud" v-model="form"
+ :permission="permissionList" :before-open="beforeOpen" v-model:page="page" @search-change="searchChange"
+ @search-reset="searchReset" @current-change="currentChange" @size-change="sizeChange"
+ @refresh-change="refreshChange" @on-load="onLoad">
</avue-crud>
</basic-container>
</template>
<script>
-import { getApiList, getApiLogs } from '@/api/logs';
-import { mapGetters } from 'vuex';
+import { getApiList, getApiLogs } from '@/api/logs'
+import { mapGetters } from 'vuex'
export default {
- data() {
+ data () {
return {
form: {},
selectionList: [],
@@ -50,6 +38,10 @@
delBtn: false,
menuWidth: 120,
dialogType: 'drawer',
+
+ height: 'auto',
+ calcHeight: 20,
+
column: [
{
label: '操作名称',
@@ -120,14 +112,14 @@
label: '操作时间',
prop: 'daterange',
type: 'daterange',
- search:true,
+ search: true,
searchRange: true,
- searchSpan:6,
+ searchSpan: 6,
format: 'YYYY-MM-DD',
valueFormat: 'YYYY-MM-DD',
startPlaceholder: '开始时间',
endPlaceholder: '结束时间',
- viewDisplay:false,
+ viewDisplay: false,
hide: true,
rules: [
{
@@ -145,78 +137,69 @@
],
},
data: [],
- };
+ }
},
computed: {
...mapGetters(['permission']),
- permissionList() {
+ permissionList () {
return {
viewBtn: this.validData(this.permission.log_api_view, false),
- };
+ }
},
},
methods: {
- searchReset() {
- this.query = {};
- this.onLoad(this.page);
+ searchReset () {
+ this.query = {}
+ this.onLoad(this.page)
},
- searchChange(params, done) {
- this.query = params;
- this.page.currentPage = 1;
- this.onLoad(this.page, params);
- done();
+ searchChange (params, done) {
+ this.query = params
+ this.page.currentPage = 1
+ this.onLoad(this.page, params)
+ done()
},
- beforeOpen(done, type) {
+ beforeOpen (done, type) {
if (['edit', 'view'].includes(type)) {
getApiLogs(this.form.id).then(res => {
- this.form = res.data.data;
- });
+ this.form = res.data.data
+ })
}
- done();
+ done()
},
- currentChange(currentPage) {
- this.page.currentPage = currentPage;
+ currentChange (currentPage) {
+ this.page.currentPage = currentPage
},
- sizeChange(pageSize) {
- this.page.pageSize = pageSize;
+ sizeChange (pageSize) {
+ this.page.pageSize = pageSize
},
- refreshChange() {
- this.onLoad(this.page, this.query);
+ refreshChange () {
+ this.onLoad(this.page, this.query)
},
- onLoad(page, params = {}) {
- const { daterange } = this.query;
+ onLoad (page, params = {}) {
+ const { daterange } = this.query
let values = {
...params,
...this.query,
- };
+ }
if (daterange) {
values = {
...values,
startTime: daterange[0],
endTime: daterange[1],
- };
- values.daterange = null;
+ }
+ values.daterange = null
}
- this.loading = true;
+ this.loading = true
getApiList(page.currentPage, page.pageSize, values).then(res => {
- const data = res.data.data;
- this.page.total = data.total;
- this.data = data.records;
- this.loading = false;
- });
+ const data = res.data.data
+ this.page.total = data.total
+ this.data = data.records
+ this.loading = false
+ })
},
},
-};
+}
</script>
-<style scoped lang="scss">
- :deep(){
- .avue-crud__body{
- .el-form{
- height: 745px;
- overflow: auto;
- }
- }
- }
-</style>
+<style scoped lang="scss"></style>
diff --git a/src/views/monitor/log/error.vue b/src/views/monitor/log/error.vue
index 6bfa8da..724eafb 100644
--- a/src/views/monitor/log/error.vue
+++ b/src/views/monitor/log/error.vue
@@ -1,31 +1,19 @@
<template>
<basic-container>
- <avue-crud
- :option="option"
- :table-loading="loading"
- :data="data"
- ref="crud"
- :before-open="beforeOpen"
- v-model="form"
- :permission="permissionList"
- v-model:page="page"
- @search-change="searchChange"
- @search-reset="searchReset"
- @current-change="currentChange"
- @size-change="sizeChange"
- @refresh-change="refreshChange"
- @on-load="onLoad"
- >
+ <avue-crud :option="option" :table-loading="loading" :data="data" ref="crud" :before-open="beforeOpen"
+ v-model="form" :permission="permissionList" v-model:page="page" @search-change="searchChange"
+ @search-reset="searchReset" @current-change="currentChange" @size-change="sizeChange"
+ @refresh-change="refreshChange" @on-load="onLoad">
</avue-crud>
</basic-container>
</template>
<script>
-import { getErrorList, getErrorLogs } from '@/api/logs';
-import { mapGetters } from 'vuex';
+import { getErrorList, getErrorLogs } from '@/api/logs'
+import { mapGetters } from 'vuex'
export default {
- data() {
+ data () {
return {
form: {},
selectionList: [],
@@ -37,8 +25,6 @@
total: 0,
},
option: {
- // height: 'auto',
- // calcHeight: 32,
tip: false,
searchShow: true,
searchMenuSpan: 6,
@@ -50,12 +36,16 @@
delBtn: false,
menuWidth: 120,
dialogType: 'drawer',
+
+ height: 'auto',
+ calcHeight: 20,
+
column: [
{
label: '服务名称',
prop: 'serviceId',
search: true,
- searchSpan:4,
+ searchSpan: 4,
width: '120',
},
@@ -82,13 +72,13 @@
label: '请求接口',
prop: 'requestUri',
search: true,
- searchSpan:6,
+ searchSpan: 6,
},
{
label: '操作人',
prop: 'createBy',
search: true,
- searchSpan:4,
+ searchSpan: 4,
width: '120',
},
{
@@ -121,68 +111,59 @@
],
},
data: [],
- };
+ }
},
computed: {
...mapGetters(['permission']),
- permissionList() {
+ permissionList () {
return {
viewBtn: this.validData(this.permission.log_error_view, false),
- };
+ }
},
},
methods: {
- searchReset() {
- this.query = {};
- this.onLoad(this.page);
+ searchReset () {
+ this.query = {}
+ this.onLoad(this.page)
},
- searchChange(params, done) {
- this.query = params;
- this.page.currentPage = 1;
- this.onLoad(this.page, params);
- done();
+ searchChange (params, done) {
+ this.query = params
+ this.page.currentPage = 1
+ this.onLoad(this.page, params)
+ done()
},
- beforeOpen(done, type) {
+ beforeOpen (done, type) {
if (['edit', 'view'].includes(type)) {
getErrorLogs(this.form.id).then(res => {
- this.form = res.data.data;
- });
+ this.form = res.data.data
+ })
}
- done();
+ done()
},
- currentChange(currentPage) {
- this.page.currentPage = currentPage;
+ currentChange (currentPage) {
+ this.page.currentPage = currentPage
},
- sizeChange(pageSize) {
- this.page.pageSize = pageSize;
+ sizeChange (pageSize) {
+ this.page.pageSize = pageSize
},
- refreshChange() {
- this.onLoad(this.page, this.query);
+ refreshChange () {
+ this.onLoad(this.page, this.query)
},
- onLoad(page, params = {}) {
+ onLoad (page, params = {}) {
let values = {
...params,
...this.query,
- };
- this.loading = true;
+ }
+ this.loading = true
getErrorList(page.currentPage, page.pageSize, values).then(res => {
- const data = res.data.data;
- this.page.total = data.total;
- this.data = data.records;
- this.loading = false;
- });
+ const data = res.data.data
+ this.page.total = data.total
+ this.data = data.records
+ this.loading = false
+ })
},
},
-};
+}
</script>
-<style scoped lang="scss">
- :deep(){
- .avue-crud__body{
- .el-form{
- height: 745px;
- overflow: auto;
- }
- }
- }
-</style>
+<style scoped lang="scss"></style>
diff --git a/src/views/odm/task.vue b/src/views/odm/task.vue
index f979c9e..63e57f4 100644
--- a/src/views/odm/task.vue
+++ b/src/views/odm/task.vue
@@ -1,25 +1,9 @@
<template>
<basic-container>
- <avue-crud
- :option="option"
- :table-loading="loading"
- :data="data"
- v-model:page="page"
- ref="crud"
- @row-del="rowDel"
- v-model="form"
- :permission="permissionList"
- @row-update="rowUpdate"
- @row-save="rowSave"
- :before-open="beforeOpen"
- @search-change="searchChange"
- @search-reset="searchReset"
- @selection-change="selectionChange"
- @current-change="currentChange"
- @size-change="sizeChange"
- @refresh-change="refreshChange"
- @on-load="onLoad"
- >
+ <avue-crud :option="option" :table-loading="loading" :data="data" v-model:page="page" ref="crud" @row-del="rowDel"
+ v-model="form" :permission="permissionList" @row-update="rowUpdate" @row-save="rowSave" :before-open="beforeOpen"
+ @search-change="searchChange" @search-reset="searchReset" @selection-change="selectionChange"
+ @current-change="currentChange" @size-change="sizeChange" @refresh-change="refreshChange" @on-load="onLoad">
<template #menu-left>
<!-- <el-button
type="danger"
@@ -37,21 +21,13 @@
{{ formatSeconds(row.processingTime) }}
</template>
<template #menu="scope">
- <el-button
- type="primary"
- text
- icon="el-icon-guide"
+ <el-button type="primary" text icon="el-icon-guide"
v-if="permission.odm_task_handle && scope.row.taskId == null"
- @click.stop="atHandle(scope.row, scope.index)"
- >立即启动
+ @click.stop="atHandle(scope.row, scope.index)">立即启动
</el-button>
- <el-button
- type="primary"
- text
- icon="el-icon-refresh-right"
+ <el-button type="primary" text icon="el-icon-refresh-right"
v-if="(permission.odm_task_handle && scope.row.status == 30) || scope.row.status == 50"
- @click.stop="restartHandle(scope.row, scope.index)"
- >重新启动
+ @click.stop="restartHandle(scope.row, scope.index)">重新启动
</el-button>
</template>
</avue-crud>
@@ -59,12 +35,12 @@
</template>
<script>
-import { getList, remove, update, add, createOdmTask, restartOdmTask } from '@/api/odm/task';
-import { tourStrategies } from 'element-plus';
-import { mapGetters } from 'vuex';
+import { getList, remove, update, add, createOdmTask, restartOdmTask } from '@/api/odm/task'
+import { tourStrategies } from 'element-plus'
+import { mapGetters } from 'vuex'
export default {
- data() {
+ data () {
return {
form: {},
query: {},
@@ -90,14 +66,18 @@
dialogClickModal: false,
grid: false,
menuWidth: 260,
+
+ height: 'auto',
+ calcHeight: 20,
+
column: [
{
label: '任务名称',
prop: 'taskName',
search: true,
- searchSpan:4,
+ searchSpan: 4,
labelWidth: 130,
- searchPlaceholder:"任务名称",
+ searchPlaceholder: "任务名称",
rules: [
{
required: true,
@@ -137,7 +117,7 @@
prop: 'waylineJobId',
addDisplay: false,
editDisplay: false,
- hide:true,
+ hide: true,
labelWidth: 130,
width: 160,
},
@@ -149,7 +129,7 @@
searchSpan: 3,
width: 100,
labelWidth: 130,
- searchPlaceholder:"任务类型",
+ searchPlaceholder: "任务类型",
dicData: [
{
label: '航测',
@@ -193,7 +173,7 @@
search: true,
searchSpan: 3,
labelWidth: 130,
- searchPlaceholder:"任务状态",
+ searchPlaceholder: "任务状态",
width: 90,
dicData: [
{
@@ -237,178 +217,178 @@
{
label: '飞行任务完成时间',
prop: 'completedTime',
- type:"date",
+ type: "date",
addDisplay: false,
editDisplay: false,
- searchPlaceholder:"任务完成时间",
+ searchPlaceholder: "任务完成时间",
labelWidth: 130,
- search:true,
- searchSpan:4,
- searchLabelWidth:130,
+ search: true,
+ searchSpan: 4,
+ searchLabelWidth: 130,
valueFormat: 'YYYY-MM-DD',
width: 160,
},
],
},
data: [],
- };
+ }
},
computed: {
...mapGetters(['permission']),
- permissionList() {
+ permissionList () {
return {
viewBtn: this.validData(this.permission.odm_task_view, true),
delBtn: this.validData(this.permission.odm_task_delete, true),
// editBtn: this.validData(this.permission.workspace_edit, true),
- };
+ }
},
- ids() {
- let ids = [];
+ ids () {
+ let ids = []
this.selectionList.forEach(ele => {
- ids.push(ele.id);
- });
- return ids.join(',');
+ ids.push(ele.id)
+ })
+ return ids.join(',')
},
},
methods: {
// 立即处理
- atHandle(row) {
- createOdmTask(row.waylineJobId,row.gsd).then(
+ atHandle (row) {
+ createOdmTask(row.waylineJobId, row.gsd).then(
() => {
- this.onLoad(this.page);
+ this.onLoad(this.page)
this.$message({
type: 'success',
message: '操作成功!',
- });
- done();
+ })
+ done()
},
error => {
- window.console.log(error);
- loading();
+ window.console.log(error)
+ loading()
}
- );
+ )
},
// 重启启动
- restartHandle(row) {
+ restartHandle (row) {
if (!row.taskName) {
this.$message({
type: 'error',
message: '该航线任务已删除,无法进行重启启动!',
- });
- return;
+ })
+ return
}
restartOdmTask(row.taskId).then(
() => {
- this.onLoad(this.page);
+ this.onLoad(this.page)
this.$message({
type: 'success',
message: '操作成功!',
- });
- done();
+ })
+ done()
},
error => {
- window.console.log(error);
- loading();
+ window.console.log(error)
+ loading()
}
- );
+ )
},
// 时间格式化
- formatSeconds(value) {
+ formatSeconds (value) {
// 如果value不是数字或者小于0,则直接返回'00:00:00'
if (isNaN(value) || value < 0) {
- return '00:00:00';
+ return '00:00:00'
}
// 计算小时、分钟和秒
- let seconds = Math.floor(value / 1000);
- let minutes = Math.floor(seconds / 60);
- let hours = Math.floor(minutes / 60);
+ let seconds = Math.floor(value / 1000)
+ let minutes = Math.floor(seconds / 60)
+ let hours = Math.floor(minutes / 60)
// 格式化为两位数字的字符串
- seconds %= 60;
- minutes %= 60;
+ seconds %= 60
+ minutes %= 60
const formattedTime = `${this.padZero(hours)}:${this.padZero(minutes)}:${this.padZero(
seconds
- )}`;
+ )}`
// 返回格式化后的时间字符串
- return formattedTime;
+ return formattedTime
},
// 函数用于在数字不足两位数时,在前面补零
- padZero(value) {
- return String(value).padStart(2, '0');
+ padZero (value) {
+ return String(value).padStart(2, '0')
},
- rowSave(row, done, loading) {
+ rowSave (row, done, loading) {
add(row).then(
() => {
- this.onLoad(this.page);
+ this.onLoad(this.page)
this.$message({
type: 'success',
message: '操作成功!',
- });
- done();
+ })
+ done()
},
error => {
- window.console.log(error);
- loading();
+ window.console.log(error)
+ loading()
}
- );
+ )
},
- rowUpdate(row, index, done, loading) {
+ rowUpdate (row, index, done, loading) {
update(row).then(
() => {
- this.onLoad(this.page);
+ this.onLoad(this.page)
this.$message({
type: 'success',
message: '操作成功!',
- });
- done();
+ })
+ done()
},
error => {
- window.console.log(error);
- loading();
+ window.console.log(error)
+ loading()
}
- );
+ )
},
- rowDel(row) {
+ rowDel (row) {
this.$confirm('确定将选择数据删除?', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning',
})
.then(() => {
- return remove(row.id);
+ return remove(row.id)
})
.then(() => {
- this.onLoad(this.page);
+ this.onLoad(this.page)
this.$message({
type: 'success',
message: '操作成功!',
- });
- });
+ })
+ })
},
- searchReset() {
- this.query = {};
- this.onLoad(this.page);
+ searchReset () {
+ this.query = {}
+ this.onLoad(this.page)
},
- searchChange(params, done) {
- this.query = params;
- this.page.currentPage = 1;
- this.onLoad(this.page, params);
- done();
+ searchChange (params, done) {
+ this.query = params
+ this.page.currentPage = 1
+ this.onLoad(this.page, params)
+ done()
},
- selectionChange(list) {
- this.selectionList = list;
+ selectionChange (list) {
+ this.selectionList = list
},
- selectionClear() {
- this.selectionList = [];
- this.$refs.crud.toggleSelection();
+ selectionClear () {
+ this.selectionList = []
+ this.$refs.crud.toggleSelection()
},
- handleDelete() {
+ handleDelete () {
if (this.selectionList.length === 0) {
- this.$message.warning('请选择至少一条数据');
- return;
+ this.$message.warning('请选择至少一条数据')
+ return
}
this.$confirm('确定将选择数据删除?', {
confirmButtonText: '确定',
@@ -416,68 +396,59 @@
type: 'warning',
})
.then(() => {
- return remove(this.ids);
+ return remove(this.ids)
})
.then(() => {
- this.onLoad(this.page);
+ this.onLoad(this.page)
this.$message({
type: 'success',
message: '操作成功!',
- });
- this.$refs.crud.toggleSelection();
- });
+ })
+ this.$refs.crud.toggleSelection()
+ })
},
- beforeOpen(done, type) {
+ beforeOpen (done, type) {
// if (['edit', 'view'].includes(type)) {
// getDetail(this.form.id).then(res => {
// this.form = res.data.data;
// });
// }
- done();
+ done()
},
- currentChange(currentPage) {
- this.page.currentPage = currentPage;
+ currentChange (currentPage) {
+ this.page.currentPage = currentPage
},
- sizeChange(pageSize) {
- this.page.pageSize = pageSize;
+ sizeChange (pageSize) {
+ this.page.pageSize = pageSize
},
- refreshChange() {
- this.onLoad(this.page, this.query);
+ refreshChange () {
+ this.onLoad(this.page, this.query)
},
- onLoad(page, params = {}) {
- const { releaseTimeRange } = this.query;
+ onLoad (page, params = {}) {
+ const { releaseTimeRange } = this.query
let values = {
...params,
...this.query,
- };
+ }
if (releaseTimeRange) {
values = {
...values,
releaseTime_datege: releaseTimeRange[0],
releaseTime_datelt: releaseTimeRange[1],
- };
- values.releaseTimeRange = null;
+ }
+ values.releaseTimeRange = null
}
- this.loading = true;
+ this.loading = true
getList(page.currentPage, page.pageSize, values).then(res => {
- const data = res.data.data;
- this.page.total = data.total;
- this.data = data.records;
- this.loading = false;
- this.selectionClear();
- });
+ const data = res.data.data
+ this.page.total = data.total
+ this.data = data.records
+ this.loading = false
+ this.selectionClear()
+ })
},
},
-};
+}
</script>
-<style scoped lang="scss">
- :deep(){
- .avue-crud__body{
- .el-form{
- height: 745px;
- overflow: auto;
- }
- }
- }
-</style>
+<style scoped lang="scss"></style>
diff --git a/src/views/resource/attach.vue b/src/views/resource/attach.vue
index 3b1ed06..29bebe0 100644
--- a/src/views/resource/attach.vue
+++ b/src/views/resource/attach.vue
@@ -1,49 +1,18 @@
<template>
<basic-container>
- <avue-crud
- :option="option"
- :table-loading="loading"
- :data="data"
- v-model:page="page"
- :permission="permissionList"
- :before-open="beforeOpen"
- v-model="form"
- ref="crud"
- @row-del="rowDel"
- @search-change="searchChange"
- @search-reset="searchReset"
- @selection-change="selectionChange"
- @current-change="currentChange"
- @size-change="sizeChange"
- @refresh-change="refreshChange"
- @on-load="onLoad"
- >
+ <avue-crud :option="option" :table-loading="loading" :data="data" v-model:page="page" :permission="permissionList"
+ :before-open="beforeOpen" v-model="form" ref="crud" @row-del="rowDel" @search-change="searchChange"
+ @search-reset="searchReset" @selection-change="selectionChange" @current-change="currentChange"
+ @size-change="sizeChange" @refresh-change="refreshChange" @on-load="onLoad">
<template #menu-left>
- <el-button
- type="primary"
- plain
- v-if="permission.attach_upload"
- icon="el-icon-upload"
- @click="handleUpload"
- >上 传
+ <el-button type="primary" plain v-if="permission.attach_upload" icon="el-icon-upload" @click="handleUpload">上 传
</el-button>
- <el-button
- type="danger"
- icon="el-icon-delete"
- plain
- v-if="permission.attach_delete"
- @click="handleDelete"
- >删 除
+ <el-button type="danger" icon="el-icon-delete" plain v-if="permission.attach_delete" @click="handleDelete">删 除
</el-button>
</template>
<template #menu="scope">
- <el-button
- type="primary"
- text
- icon="el-icon-download"
- v-if="permission.attach_download"
- @click="handleDownload(scope.row)"
- >下载
+ <el-button type="primary" text icon="el-icon-download" v-if="permission.attach_download"
+ @click="handleDownload(scope.row)">下载
</el-button>
</template>
<template #attachSize="{ row }">
@@ -58,12 +27,12 @@
</template>
<script>
-import { getList, getDetail, removeAttachAndData } from '@/api/resource/attach';
-import { mapGetters } from 'vuex';
-import func from '@/utils/func';
+import { getList, getDetail, removeAttachAndData } from '@/api/resource/attach'
+import { mapGetters } from 'vuex'
+import func from '@/utils/func'
export default {
- data() {
+ data () {
return {
form: {},
query: {},
@@ -85,6 +54,9 @@
// grid: true,
selection: true,
dialogClickModal: false,
+
+ height: 'auto',
+ calcHeight: 20,
column: [
{
label: '附件地址',
@@ -112,7 +84,7 @@
label: '附件名称',
prop: 'name',
search: true,
- searchSpan:4,
+ searchSpan: 4,
rules: [
{
required: true,
@@ -125,7 +97,7 @@
label: '附件原名',
prop: 'originalName',
search: true,
- searchSpan:4,
+ searchSpan: 4,
rules: [
{
required: true,
@@ -138,8 +110,8 @@
label: '附件拓展名',
prop: 'extension',
search: true,
- searchSpan:4,
- searchLabelWidth:95,
+ searchSpan: 4,
+ searchLabelWidth: 95,
rules: [
{
required: true,
@@ -168,14 +140,14 @@
label: '创建日期',
prop: 'daterange',
type: 'daterange',
- search:true,
+ search: true,
searchRange: true,
- searchSpan:6,
+ searchSpan: 6,
format: 'YYYY-MM-DD',
valueFormat: 'YYYY-MM-DD',
startPlaceholder: '开始时间',
endPlaceholder: '结束时间',
- viewDisplay:false,
+ viewDisplay: false,
hide: true,
rules: [
{
@@ -207,63 +179,63 @@
},
],
},
- };
+ }
},
computed: {
- func() {
- return func;
+ func () {
+ return func
},
...mapGetters(['permission']),
- permissionList() {
+ permissionList () {
return {
addBtn: false,
editBtn: false,
viewBtn: false,
delBtn: this.validData(this.permission.attach_delete, false),
- };
+ }
},
- ids() {
- let ids = [];
+ ids () {
+ let ids = []
this.selectionList.forEach(ele => {
- ids.push(ele.id);
- });
- return ids.join(',');
+ ids.push(ele.id)
+ })
+ return ids.join(',')
},
},
methods: {
- handleUpload() {
- this.attachBox = true;
+ handleUpload () {
+ this.attachBox = true
},
- uploadAfter(res, done, loading, column) {
- window.console.log(column);
- this.attachBox = false;
- this.refreshChange();
- done();
+ uploadAfter (res, done, loading, column) {
+ window.console.log(column)
+ this.attachBox = false
+ this.refreshChange()
+ done()
},
- handleDownload(row) {
- window.open(`${row.link}`);
+ handleDownload (row) {
+ window.open(`${row.link}`)
},
- rowDel(row) {
+ rowDel (row) {
this.$confirm('确定将选择数据及对应的文件删除?', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning',
})
.then(() => {
- return removeAttachAndData(row.id);
+ return removeAttachAndData(row.id)
})
.then(() => {
- this.onLoad(this.page);
+ this.onLoad(this.page)
this.$message({
type: 'success',
message: '操作成功!',
- });
- });
+ })
+ })
},
- handleDelete() {
+ handleDelete () {
if (this.selectionList.length === 0) {
- this.$message.warning('请选择至少一条数据');
- return;
+ this.$message.warning('请选择至少一条数据')
+ return
}
this.$confirm('确定将选择数据及对应的文件删除?', {
confirmButtonText: '确定',
@@ -271,85 +243,76 @@
type: 'warning',
})
.then(() => {
- return removeAttachAndData(this.ids);
+ return removeAttachAndData(this.ids)
})
.then(() => {
- this.onLoad(this.page);
+ this.onLoad(this.page)
this.$message({
type: 'success',
message: '操作成功!',
- });
- this.$refs.crud.toggleSelection();
- });
+ })
+ this.$refs.crud.toggleSelection()
+ })
},
- beforeOpen(done, type) {
+ beforeOpen (done, type) {
if (['edit', 'view'].includes(type)) {
getDetail(this.form.id).then(res => {
- this.form = res.data.data;
- });
+ this.form = res.data.data
+ })
}
- done();
+ done()
},
- searchReset() {
- this.query = {};
- this.onLoad(this.page);
+ searchReset () {
+ this.query = {}
+ this.onLoad(this.page)
},
- searchChange(params, done) {
- this.query = params;
- this.page.currentPage = 1;
- this.onLoad(this.page, params);
- done();
+ searchChange (params, done) {
+ this.query = params
+ this.page.currentPage = 1
+ this.onLoad(this.page, params)
+ done()
},
- selectionChange(list) {
- this.selectionList = list;
+ selectionChange (list) {
+ this.selectionList = list
},
- selectionClear() {
- this.selectionList = [];
- this.$refs.crud.toggleSelection();
+ selectionClear () {
+ this.selectionList = []
+ this.$refs.crud.toggleSelection()
},
- currentChange(currentPage) {
- this.page.currentPage = currentPage;
+ currentChange (currentPage) {
+ this.page.currentPage = currentPage
},
- sizeChange(pageSize) {
- this.page.pageSize = pageSize;
+ sizeChange (pageSize) {
+ this.page.pageSize = pageSize
},
- refreshChange() {
- this.onLoad(this.page, this.query);
+ refreshChange () {
+ this.onLoad(this.page, this.query)
},
- onLoad(page, params = {}) {
- const { daterange } = this.query;
+ onLoad (page, params = {}) {
+ const { daterange } = this.query
let values = {
...params,
...this.query,
- };
+ }
if (daterange) {
values = {
...values,
startTime: daterange[0],
endTime: daterange[1],
- };
- values.daterange = null;
+ }
+ values.daterange = null
}
- this.loading = true;
+ this.loading = true
getList(page.currentPage, page.pageSize, values).then(res => {
- const data = res.data.data;
- this.page.total = data.total;
- this.data = data.records;
- this.loading = false;
- this.selectionClear();
- });
+ const data = res.data.data
+ this.page.total = data.total
+ this.data = data.records
+ this.loading = false
+ this.selectionClear()
+ })
},
},
-};
+}
</script>
-<style scoped lang="scss">
- :deep(){
- .avue-crud__body{
- .el-form{
- height: 745px;
- overflow: auto;
- }
- }
- }
-</style>
+<style scoped lang="scss"></style>
diff --git a/src/views/resource/media.vue b/src/views/resource/media.vue
index 69faecc..52aade7 100644
--- a/src/views/resource/media.vue
+++ b/src/views/resource/media.vue
@@ -28,19 +28,19 @@
</template>
<script>
-import JSZip from 'jszip';
-import { getMedia, deleteAllFile } from '@/api/resource/media';
-import { getAirportList } from '@/api/device/device';
-import { mapGetters } from 'vuex';
-import func from '@/utils/func';
+import JSZip from 'jszip'
+import { getMedia, deleteAllFile } from '@/api/resource/media'
+import { getAirportList } from '@/api/device/device'
+import { mapGetters } from 'vuex'
+import func from '@/utils/func'
export default {
- data() {
- const endDate = new Date();
- const startDate = new Date();
- startDate.setMonth(startDate.getMonth() - 1);
- const defaultStartDate = `${startDate.getFullYear()}-${String(startDate.getMonth() + 1).padStart(2, '0')}-${String(startDate.getDate()).padStart(2, '0')}`;
- const defaultEndDate = `${endDate.getFullYear()}-${String(endDate.getMonth() + 1).padStart(2, '0')}-${String(endDate.getDate()).padStart(2, '0')}`;
+ data () {
+ const endDate = new Date()
+ const startDate = new Date()
+ startDate.setMonth(startDate.getMonth() - 1)
+ const defaultStartDate = `${startDate.getFullYear()}-${String(startDate.getMonth() + 1).padStart(2, '0')}-${String(startDate.getDate()).padStart(2, '0')}`
+ const defaultEndDate = `${endDate.getFullYear()}-${String(endDate.getMonth() + 1).padStart(2, '0')}-${String(endDate.getDate()).padStart(2, '0')}`
return {
form: {},
@@ -66,6 +66,9 @@
selection: true,
dialogClickModal: false,
delBtn: false,
+
+ height: 'auto',
+ calcHeight: 20,
column: [
{ label: '机场选择', prop: 'airportNickname', type: 'select', search: true, searchSpan: 5, dicData: [], props: { label: 'nickname', value: 'nickname' }, hide: true },
{ label: '创建日期', prop: 'daterange', type: 'daterange', search: true, searchRange: true, searchSpan: 6, format: 'YYYY-MM-DD', valueFormat: 'YYYY-MM-DD', startPlaceholder: '开始时间', endPlaceholder: '结束时间', viewDisplay: false, hide: true, searchValue: [defaultStartDate, defaultEndDate] },
@@ -87,152 +90,152 @@
},
domainUrl: '',
isDownloading: false, // 控制按钮加载状态
- };
+ }
},
computed: {
- func() { return func; },
+ func () { return func },
...mapGetters(['permission']),
- permissionList() {
+ permissionList () {
return {
addBtn: false,
editBtn: false,
viewBtn: this.validData(this.permission.attach_view, false),
delBtn: this.validData(this.permission.attach_delete, false),
- };
+ }
},
- ids() { return this.selectionList.map(ele => ele.id).join(','); },
+ ids () { return this.selectionList.map(ele => ele.id).join(',') },
},
- mounted() {
- this.loadAirportList();
- this.$refs.crud.setSearch({ daterange: this.query.daterange });
- this.onLoad(this.page, this.query);
+ mounted () {
+ this.loadAirportList()
+ this.$refs.crud.setSearch({ daterange: this.query.daterange })
+ this.onLoad(this.page, this.query)
},
methods: {
- loadAirportList() {
+ loadAirportList () {
getAirportList().then(res => {
- const airportData = res.data.data || [];
- const airportColumn = this.option.column.find(col => col.prop === 'airportNickname');
+ const airportData = res.data.data || []
+ const airportColumn = this.option.column.find(col => col.prop === 'airportNickname')
if (airportColumn) {
airportColumn.dicData = airportData.map(item => ({
nickname: item.nickname,
workspace_id: item.workspace_id,
- }));
+ }))
}
}).catch(error => {
- console.error('加载机场列表时出错:', error);
- });
+ console.error('加载机场列表时出错:', error)
+ })
},
- handleUpload() {
- this.taskBox = true;
+ handleUpload () {
+ this.taskBox = true
},
- uploadAfter(res, done) {
- this.taskBox = false;
- this.refreshChange();
- done();
+ uploadAfter (res, done) {
+ this.taskBox = false
+ this.refreshChange()
+ done()
},
- async handleRowDownload(row) {
- const mediaUrl = this.domainUrl + row.object_key;
+ async handleRowDownload (row) {
+ const mediaUrl = this.domainUrl + row.object_key
try {
- const response = await fetch(mediaUrl);
- if (!response.ok) throw new Error('文件下载失败');
- const blob = await response.blob();
- const url = window.URL.createObjectURL(blob);
- const link = document.createElement('a');
- link.href = url;
- link.download = row.file_name || 'download';
- document.body.appendChild(link);
- link.click();
- document.body.removeChild(link);
- window.URL.revokeObjectURL(url);
- this.$message({ type: 'success', message: '文件下载成功: ' + row.file_name });
+ const response = await fetch(mediaUrl)
+ if (!response.ok) throw new Error('文件下载失败')
+ const blob = await response.blob()
+ const url = window.URL.createObjectURL(blob)
+ const link = document.createElement('a')
+ link.href = url
+ link.download = row.file_name || 'download'
+ document.body.appendChild(link)
+ link.click()
+ document.body.removeChild(link)
+ window.URL.revokeObjectURL(url)
+ this.$message({ type: 'success', message: '文件下载成功: ' + row.file_name })
} catch (error) {
- console.error('下载文件时出错:', error);
- this.$message({ type: 'error', message: '下载失败: ' + error.message });
+ console.error('下载文件时出错:', error)
+ this.$message({ type: 'error', message: '下载失败: ' + error.message })
}
},
- handleRowDelete(row) {
+ handleRowDelete (row) {
this.$confirm('确定删除此文件?', { confirmButtonText: '确定', cancelButtonText: '取消', type: 'warning' })
.then(() => deleteAllFile(row.id))
.then(() => {
- this.onLoad(this.page);
- this.$message({ type: 'success', message: '删除成功!' });
+ this.onLoad(this.page)
+ this.$message({ type: 'success', message: '删除成功!' })
})
.catch(error => {
- console.error('删除文件时出错:', error);
- this.$message({ type: 'error', message: '删除失败,请稍后重试!' });
- });
+ console.error('删除文件时出错:', error)
+ this.$message({ type: 'error', message: '删除失败,请稍后重试!' })
+ })
},
- rowDel(row) {
+ rowDel (row) {
this.$confirm('确定将选择数据及对应的文件删除?', { confirmButtonText: '确定', cancelButtonText: '取消', type: 'warning' })
.then(() => deleteAllFile(row.id))
.then(() => {
- this.onLoad(this.page);
- this.$message({ type: 'success', message: '操作成功!' });
- });
+ this.onLoad(this.page)
+ this.$message({ type: 'success', message: '操作成功!' })
+ })
},
- searchReset() {
- const endDate = new Date();
- const startDate = new Date();
- startDate.setMonth(startDate.getMonth() - 1);
- const defaultStartDate = `${startDate.getFullYear()}-${String(startDate.getMonth() + 1).padStart(2, '0')}-${String(startDate.getDate()).padStart(2, '0')}`;
- const defaultEndDate = `${endDate.getFullYear()}-${String(endDate.getMonth() + 1).padStart(2, '0')}-${String(endDate.getDate()).padStart(2, '0')}`;
- this.query = { daterange: [defaultStartDate, defaultEndDate] };
- this.selectedWorkspaceId = null;
- this.$refs.crud.setSearch({ daterange: this.query.daterange });
- this.onLoad(this.page, this.query);
+ searchReset () {
+ const endDate = new Date()
+ const startDate = new Date()
+ startDate.setMonth(startDate.getMonth() - 1)
+ const defaultStartDate = `${startDate.getFullYear()}-${String(startDate.getMonth() + 1).padStart(2, '0')}-${String(startDate.getDate()).padStart(2, '0')}`
+ const defaultEndDate = `${endDate.getFullYear()}-${String(endDate.getMonth() + 1).padStart(2, '0')}-${String(endDate.getDate()).padStart(2, '0')}`
+ this.query = { daterange: [defaultStartDate, defaultEndDate] }
+ this.selectedWorkspaceId = null
+ this.$refs.crud.setSearch({ daterange: this.query.daterange })
+ this.onLoad(this.page, this.query)
},
- searchChange(params, done) {
- this.query = params;
- this.page.currentPage = 1;
- const airportColumn = this.option.column.find(col => col.prop === 'airportNickname');
- const selectedAirport = airportColumn.dicData.find(item => item.nickname === params.airportNickname);
- this.selectedWorkspaceId = selectedAirport ? selectedAirport.workspace_id : null;
- this.onLoad(this.page, params);
- done();
+ searchChange (params, done) {
+ this.query = params
+ this.page.currentPage = 1
+ const airportColumn = this.option.column.find(col => col.prop === 'airportNickname')
+ const selectedAirport = airportColumn.dicData.find(item => item.nickname === params.airportNickname)
+ this.selectedWorkspaceId = selectedAirport ? selectedAirport.workspace_id : null
+ this.onLoad(this.page, params)
+ done()
},
- selectionChange(list) {
- this.selectionList = list;
+ selectionChange (list) {
+ this.selectionList = list
},
- selectionClear() {
- this.selectionList = [];
- this.$refs.crud.toggleSelection();
+ selectionClear () {
+ this.selectionList = []
+ this.$refs.crud.toggleSelection()
},
- currentChange(currentPage) {
- this.page.currentPage = currentPage;
- this.onLoad(this.page, this.query);
+ currentChange (currentPage) {
+ this.page.currentPage = currentPage
+ this.onLoad(this.page, this.query)
},
- sizeChange(pageSize) {
- this.page.pageSize = pageSize;
- this.onLoad(this.page, this.query);
+ sizeChange (pageSize) {
+ this.page.pageSize = pageSize
+ this.onLoad(this.page, this.query)
},
- refreshChange() {
- this.onLoad(this.page, this.query);
+ refreshChange () {
+ this.onLoad(this.page, this.query)
},
- onLoad(page, params = {}) {
- this.loading = true;
- const { daterange } = params;
- let create_time = null;
- let end_time = null;
+ onLoad (page, params = {}) {
+ this.loading = true
+ const { daterange } = params
+ let create_time = null
+ let end_time = null
if (daterange && Array.isArray(daterange) && daterange.length === 2) {
- const startStr = daterange[0];
- const endStr = daterange[1];
- const startDate = new Date(startStr + ' 00:00:00').getTime();
- const endDate = new Date(endStr + ' 23:59:59').getTime();
+ const startStr = daterange[0]
+ const endStr = daterange[1]
+ const startDate = new Date(startStr + ' 00:00:00').getTime()
+ const endDate = new Date(endStr + ' 23:59:59').getTime()
if (!isNaN(startDate) && !isNaN(endDate)) {
- create_time = startDate;
- end_time = endDate;
+ create_time = startDate
+ end_time = endDate
}
}
- let values = { ...params, ...this.query };
- if (daterange) values.daterange = null;
+ let values = { ...params, ...this.query }
+ if (daterange) values.daterange = null
getMedia(page.currentPage, page.pageSize, this.selectedWorkspaceId || null, create_time, end_time)
.then(res => {
- const data = res.data;
+ const data = res.data
if (data && data.data && data.data.list) {
- this.page.total = data.data.pagination.total;
+ this.page.total = data.data.pagination.total
this.data = data.data.list.map(item => ({
job_name: item.job_name,
file_name: item.file_name,
@@ -241,118 +244,109 @@
payload: item.payload,
airportNickname: item.airportNickname,
id: item.id,
- }));
- this.domainUrl = data.data.list.length > 0 ? data.data.list[0].domain_url : 'http://localhost:2888/manage/resource';
+ }))
+ this.domainUrl = data.data.list.length > 0 ? data.data.list[0].domain_url : 'http://localhost:2888/manage/resource'
} else {
- this.data = [];
+ this.data = []
}
- this.loading = false;
- this.selectionClear();
- this.$refs.crud.refreshTable();
+ this.loading = false
+ this.selectionClear()
+ this.$refs.crud.refreshTable()
})
.catch(error => {
- this.loading = false;
- console.error('加载媒体数据时出错:', error);
- });
+ this.loading = false
+ console.error('加载媒体数据时出错:', error)
+ })
},
- formatCreateTime(createTime) {
- if (typeof createTime !== 'number' || isNaN(createTime)) return '';
- const timestamp = createTime < 10000000000 ? createTime * 1000 : createTime;
- const date = new Date(timestamp);
- if (isNaN(date.getTime())) return '';
- const year = date.getFullYear();
- const month = String(date.getMonth() + 1).padStart(2, '0');
- const day = String(date.getDate()).padStart(2, '0');
- const hours = String(date.getHours()).padStart(2, '0');
- const minutes = String(date.getMinutes()).padStart(2, '0');
- const seconds = String(date.getSeconds()).padStart(2, '0');
- return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`;
+ formatCreateTime (createTime) {
+ if (typeof createTime !== 'number' || isNaN(createTime)) return ''
+ const timestamp = createTime < 10000000000 ? createTime * 1000 : createTime
+ const date = new Date(timestamp)
+ if (isNaN(date.getTime())) return ''
+ const year = date.getFullYear()
+ const month = String(date.getMonth() + 1).padStart(2, '0')
+ const day = String(date.getDate()).padStart(2, '0')
+ const hours = String(date.getHours()).padStart(2, '0')
+ const minutes = String(date.getMinutes()).padStart(2, '0')
+ const seconds = String(date.getSeconds()).padStart(2, '0')
+ return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`
},
- handleRowView(row) {
- const mediaUrl = this.domainUrl + row.object_key;
- const mediaType = this.getMediaType(row.object_key);
+ handleRowView (row) {
+ const mediaUrl = this.domainUrl + row.object_key
+ const mediaType = this.getMediaType(row.object_key)
if (mediaType === 'image' || mediaType === 'video') {
- window.open(mediaUrl, '_blank');
+ window.open(mediaUrl, '_blank')
}
},
- getMediaType(objectKey) {
- const extension = objectKey.split('.').pop().toLowerCase();
- if (['jpg', 'jpeg', 'png', 'gif'].includes(extension)) return 'image';
- if (['mp4', 'avi', 'mov'].includes(extension)) return 'video';
- return 'unknown';
+ getMediaType (objectKey) {
+ const extension = objectKey.split('.').pop().toLowerCase()
+ if (['jpg', 'jpeg', 'png', 'gif'].includes(extension)) return 'image'
+ if (['mp4', 'avi', 'mov'].includes(extension)) return 'video'
+ return 'unknown'
},
- showVideo(url) {
- this.taskBox = true;
- this.taskForm = { videoUrl: url };
+ showVideo (url) {
+ this.taskBox = true
+ this.taskForm = { videoUrl: url }
this.taskOption = {
submitBtn: false,
emptyBtn: false,
column: [
{ label: '视频播放', prop: 'videoUrl', type: 'video', span: 24, props: { controls: true, autoplay: false } },
],
- };
+ }
},
- validData(val, def) {
- return typeof val !== 'undefined' ? val : def;
+ validData (val, def) {
+ return typeof val !== 'undefined' ? val : def
},
- async handleZipDownload() {
+ async handleZipDownload () {
if (this.selectionList.length === 0) {
- this.$message({ type: 'warning', message: '请先选择需要下载的文件' });
- return;
+ this.$message({ type: 'warning', message: '请先选择需要下载的文件' })
+ return
}
- this.isDownloading = true;
+ this.isDownloading = true
try {
- const zip = new JSZip();
+ const zip = new JSZip()
const files = this.selectionList.map(item => ({
url: this.domainUrl + item.object_key,
name: item.file_name
- }));
+ }))
const fetchPromises = files.map(async file => {
- const response = await fetch(file.url, { cache: 'force-cache' });
- if (!response.ok) throw new Error(`下载文件 ${file.name} 失败`);
- const blob = await response.blob();
- zip.file(file.name, blob);
- });
+ const response = await fetch(file.url, { cache: 'force-cache' })
+ if (!response.ok) throw new Error(`下载文件 ${file.name} 失败`)
+ const blob = await response.blob()
+ zip.file(file.name, blob)
+ })
- await Promise.all(fetchPromises);
+ await Promise.all(fetchPromises)
const content = await zip.generateAsync({
type: 'blob',
compression: 'DEFLATE',
compressionOptions: { level: 1 }
- });
+ })
- const url = window.URL.createObjectURL(content);
- const link = document.createElement('a');
- link.href = url;
- link.download = `media_files_${new Date().toISOString().slice(0, 10)}_${new Date().getTime()}.zip`;
- document.body.appendChild(link);
- link.click();
- document.body.removeChild(link);
- window.URL.revokeObjectURL(url);
+ const url = window.URL.createObjectURL(content)
+ const link = document.createElement('a')
+ link.href = url
+ link.download = `media_files_${new Date().toISOString().slice(0, 10)}_${new Date().getTime()}.zip`
+ document.body.appendChild(link)
+ link.click()
+ document.body.removeChild(link)
+ window.URL.revokeObjectURL(url)
- this.$message({ type: 'success', message: `成功下载 ${this.selectionList.length} 个文件` });
+ this.$message({ type: 'success', message: `成功下载 ${this.selectionList.length} 个文件` })
} catch (error) {
- console.error('压缩下载失败:', error);
- this.$message({ type: 'error', message: '压缩下载失败: ' + error.message });
+ console.error('压缩下载失败:', error)
+ this.$message({ type: 'error', message: '压缩下载失败: ' + error.message })
} finally {
- this.isDownloading = false;
+ this.isDownloading = false
}
},
},
-};
+}
</script>
-<style scoped lang="scss">
- :deep(){
- .avue-crud__body{
- .el-form{
- height: 745px;
- overflow: auto;
- }
- }
- }
-</style>
+<style scoped lang="scss"></style>
diff --git a/src/views/resource/oss.vue b/src/views/resource/oss.vue
index a775b58..4e86013 100644
--- a/src/views/resource/oss.vue
+++ b/src/views/resource/oss.vue
@@ -1,59 +1,22 @@
<template>
<basic-container>
- <avue-crud
- :option="option"
- :table-loading="loading"
- :data="data"
- v-model:page="page"
- :permission="permissionList"
- v-model="form"
- ref="crud"
- @row-update="rowUpdate"
- @row-save="rowSave"
- @row-del="rowDel"
- :before-open="beforeOpen"
- @search-change="searchChange"
- @search-reset="searchReset"
- @selection-change="selectionChange"
- @current-change="currentChange"
- @size-change="sizeChange"
- @refresh-change="refreshChange"
- @on-load="onLoad"
- >
+ <avue-crud :option="option" :table-loading="loading" :data="data" v-model:page="page" :permission="permissionList"
+ v-model="form" ref="crud" @row-update="rowUpdate" @row-save="rowSave" @row-del="rowDel" :before-open="beforeOpen"
+ @search-change="searchChange" @search-reset="searchReset" @selection-change="selectionChange"
+ @current-change="currentChange" @size-change="sizeChange" @refresh-change="refreshChange" @on-load="onLoad">
<template #menu-left>
- <el-button
- type="danger"
- icon="el-icon-delete"
- plain
- v-if="permission.oss_delete"
- @click="handleDelete"
- >删 除
+ <el-button type="danger" icon="el-icon-delete" plain v-if="permission.oss_delete" @click="handleDelete">删 除
</el-button>
</template>
<template #menu="scope">
- <el-button
- type="primary"
- text
- icon="el-icon-video-play"
- v-if="userInfo.role_name.includes('admin')"
- @click="handleDebug(scope.row)"
- >调试
+ <el-button type="primary" text icon="el-icon-video-play" v-if="userInfo.role_name.includes('admin')"
+ @click="handleDebug(scope.row)">调试
</el-button>
- <el-button
- type="primary"
- text
- icon="el-icon-circle-check"
- v-if="scope.row.status==1 && permission.oss_enable"
- @click.stop="handleEnable(scope.row)"
- >启用
+ <el-button type="primary" text icon="el-icon-circle-check" v-if="scope.row.status == 1 && permission.oss_enable"
+ @click.stop="handleEnable(scope.row)">启用
</el-button>
- <el-button
- type="primary"
- text
- icon="VideoPause"
- v-if="scope.row.status==2 && permission.oss_enable"
- @click.stop="handleDisable(scope.row)"
- >禁用
+ <el-button type="primary" text icon="VideoPause" v-if="scope.row.status == 2 && permission.oss_enable"
+ @click.stop="handleDisable(scope.row)">禁用
</el-button>
</template>
<template #status="{ row }">
@@ -70,12 +33,12 @@
</template>
<script>
-import { getListPage, getDetail, add, update, remove, enable, disable } from '@/api/resource/oss';
-import { mapGetters } from 'vuex';
-import func from '@/utils/func';
+import { getListPage, getDetail, add, update, remove, enable, disable } from '@/api/resource/oss'
+import { mapGetters } from 'vuex'
+import func from '@/utils/func'
export default {
- data() {
+ data () {
return {
form: {},
query: {},
@@ -100,6 +63,9 @@
labelWidth: 100,
dialogWidth: 880,
dialogClickModal: false,
+
+ height: 'auto',
+ calcHeight: 20,
column: [
{
label: '分类',
@@ -108,7 +74,7 @@
span: 24,
width: 120,
searchLabelWidth: 50,
- searchSpan:3,
+ searchSpan: 3,
row: true,
dicUrl: '/blade-system/dict/dictionary?code=oss',
props: {
@@ -132,7 +98,7 @@
prop: 'name',
span: 24,
search: true,
- searchSpan:5,
+ searchSpan: 5,
rules: [
{
required: true,
@@ -148,7 +114,7 @@
width: 120,
searchLabelWidth: 100,
search: true,
- searchSpan:4,
+ searchSpan: 4,
rules: [
{
required: true,
@@ -194,7 +160,7 @@
prop: 'accessKey',
span: 24,
search: true,
- searchSpan:5,
+ searchSpan: 5,
searchLabelWidth: 100,
overHidden: true,
rules: [
@@ -228,7 +194,7 @@
{
label: '过期时间',
prop: 'expire',
- type:"number",
+ type: "number",
span: 24,
hide: true,
rules: [
@@ -299,162 +265,162 @@
},
],
},
- };
+ }
},
watch: {
- 'form.category'() {
- const category = func.toInt(this.form.category);
+ 'form.category' () {
+ const category = func.toInt(this.form.category)
this.$refs.crud.option.column.filter(item => {
if (item.prop === 'appId') {
- item.display = category === 4;
+ item.display = category === 4
}
// if (item.prop === 'region') {
// item.display = category === 4 || category === 5;
// }
- });
+ })
},
- 'debugForm.code'() {
- const column = this.findObject(this.debugOption.column, 'backgroundUrl');
- column.action = `/blade-resource/oss/endpoint/put-file?code=${this.debugForm.code}`;
+ 'debugForm.code' () {
+ const column = this.findObject(this.debugOption.column, 'backgroundUrl')
+ column.action = `/blade-resource/oss/endpoint/put-file?code=${this.debugForm.code}`
},
},
computed: {
...mapGetters(['userInfo', 'permission']),
- permissionList() {
+ permissionList () {
return {
addBtn: this.validData(this.permission.oss_add),
viewBtn: this.validData(this.permission.oss_view),
delBtn: this.validData(this.permission.oss_delete),
editBtn: this.validData(this.permission.oss_edit),
- };
+ }
},
- ids() {
- let ids = [];
+ ids () {
+ let ids = []
this.selectionList.forEach(ele => {
- ids.push(ele.id);
- });
- return ids.join(',');
+ ids.push(ele.id)
+ })
+ return ids.join(',')
},
},
methods: {
- rowSave(row, done, loading) {
+ rowSave (row, done, loading) {
add(row).then(
() => {
- this.onLoad(this.page);
+ this.onLoad(this.page)
this.$message({
type: 'success',
message: '操作成功!',
- });
- done();
+ })
+ done()
},
error => {
- window.console.log(error);
- loading();
+ window.console.log(error)
+ loading()
}
- );
+ )
},
- rowUpdate(row, index, done, loading) {
+ rowUpdate (row, index, done, loading) {
update(row).then(
() => {
- this.onLoad(this.page);
+ this.onLoad(this.page)
this.$message({
type: 'success',
message: '操作成功!',
- });
- done();
+ })
+ done()
},
error => {
- window.console.log(error);
- loading();
+ window.console.log(error)
+ loading()
}
- );
+ )
},
- rowDel(row) {
+ rowDel (row) {
this.$confirm('确定将选择数据删除?', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning',
})
.then(() => {
- return remove(row.id);
+ return remove(row.id)
})
.then(() => {
- this.onLoad(this.page);
+ this.onLoad(this.page)
this.$message({
type: 'success',
message: '操作成功!',
- });
- });
+ })
+ })
},
- searchReset() {
- this.query = {};
- this.onLoad(this.page);
+ searchReset () {
+ this.query = {}
+ this.onLoad(this.page)
},
- searchChange(params, done) {
- this.query = params;
- this.page.currentPage = 1;
- this.onLoad(this.page, params);
- done();
+ searchChange (params, done) {
+ this.query = params
+ this.page.currentPage = 1
+ this.onLoad(this.page, params)
+ done()
},
- selectionChange(list) {
- this.selectionList = list;
+ selectionChange (list) {
+ this.selectionList = list
},
- selectionClear() {
- this.selectionList = [];
- this.$refs.crud.toggleSelection();
+ selectionClear () {
+ this.selectionList = []
+ this.$refs.crud.toggleSelection()
},
- handleEnable(row) {
+ handleEnable (row) {
this.$confirm('是否确定启用这条配置?', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning',
})
.then(() => {
- return enable(row.id);
+ return enable(row.id)
})
.then(() => {
- this.onLoad(this.page);
+ this.onLoad(this.page)
this.$message({
type: 'success',
message: '操作成功!',
- });
- this.$refs.crud.toggleSelection();
- });
+ })
+ this.$refs.crud.toggleSelection()
+ })
},
- handleDisable(row){
+ handleDisable (row) {
this.$confirm('是否确定禁用用这条配置?', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning',
})
.then(() => {
- return disable(row.id);
+ return disable(row.id)
})
.then(() => {
- this.onLoad(this.page);
+ this.onLoad(this.page)
this.$message({
type: 'success',
message: '操作成功!',
- });
- this.$refs.crud.toggleSelection();
- });
+ })
+ this.$refs.crud.toggleSelection()
+ })
},
- handleDebug(row) {
- this.box = true;
- this.debugForm.code = row.ossCode;
- this.debugForm.backgroundUrl = '';
+ handleDebug (row) {
+ this.box = true
+ this.debugForm.code = row.ossCode
+ this.debugForm.backgroundUrl = ''
},
- handleSubmit(form, done) {
+ handleSubmit (form, done) {
this.$message({
type: 'success',
message: `获取到图片地址:[${form.backgroundUrl}]`,
- });
- done();
+ })
+ done()
},
- handleDelete() {
+ handleDelete () {
if (this.selectionList.length === 0) {
- this.$message.warning('请选择至少一条数据');
- return;
+ this.$message.warning('请选择至少一条数据')
+ return
}
this.$confirm('确定将选择数据删除?', {
confirmButtonText: '确定',
@@ -462,54 +428,45 @@
type: 'warning',
})
.then(() => {
- return remove(this.ids);
+ return remove(this.ids)
})
.then(() => {
- this.onLoad(this.page);
+ this.onLoad(this.page)
this.$message({
type: 'success',
message: '操作成功!',
- });
- this.$refs.crud.toggleSelection();
- });
+ })
+ this.$refs.crud.toggleSelection()
+ })
},
- beforeOpen(done, type) {
+ beforeOpen (done, type) {
if (['edit', 'view'].includes(type)) {
getDetail(this.form.id).then(res => {
- this.form = res.data.data;
- });
+ this.form = res.data.data
+ })
}
- done();
+ done()
},
- currentChange(currentPage) {
- this.page.currentPage = currentPage;
+ currentChange (currentPage) {
+ this.page.currentPage = currentPage
},
- sizeChange(pageSize) {
- this.page.pageSize = pageSize;
+ sizeChange (pageSize) {
+ this.page.pageSize = pageSize
},
- refreshChange() {
- this.onLoad(this.page, this.query);
+ refreshChange () {
+ this.onLoad(this.page, this.query)
},
- onLoad(page, params = {}) {
- this.loading = true;
+ onLoad (page, params = {}) {
+ this.loading = true
getListPage(page.currentPage, page.pageSize, Object.assign(params, this.query)).then(res => {
- const data = res.data.data;
- this.page.total = data.total;
- this.data = data.records;
- this.loading = false;
- this.selectionClear();
- });
+ const data = res.data.data
+ this.page.total = data.total
+ this.data = data.records
+ this.loading = false
+ this.selectionClear()
+ })
},
},
-};
+}
</script>
-<style scoped lang="scss">
- :deep(){
- .avue-crud__body{
- .el-form{
- height: 745px;
- overflow: auto;
- }
- }
- }
-</style>
\ No newline at end of file
+<style scoped lang="scss"></style>
\ No newline at end of file
diff --git a/src/views/resource/wayline.vue b/src/views/resource/wayline.vue
index ac0ebf4..57551c1 100644
--- a/src/views/resource/wayline.vue
+++ b/src/views/resource/wayline.vue
@@ -1,40 +1,29 @@
<template>
<basic-container>
- <avue-crud
- :option="option"
- :table-loading="loading"
- :data="data"
- v-model:page="page"
- :permission="permissionList"
- v-model="form"
- ref="crud"
- @search-change="searchChange"
- @search-reset="searchReset"
- @selection-change="selectionChange"
- @current-change="currentChange"
- @size-change="sizeChange"
- @refresh-change="refreshChange"
- @on-load="onLoad">
+ <avue-crud :option="option" :table-loading="loading" :data="data" v-model:page="page" :permission="permissionList"
+ v-model="form" ref="crud" @search-change="searchChange" @search-reset="searchReset"
+ @selection-change="selectionChange" @current-change="currentChange" @size-change="sizeChange"
+ @refresh-change="refreshChange" @on-load="onLoad">
</avue-crud>
</basic-container>
</template>
<script>
-import { getJobsByUser } from '@/api/resource/wayline';
-import { getAirportList } from '@/api/device/device';
-import { mapGetters } from 'vuex';
-import func from '@/utils/func';
+import { getJobsByUser } from '@/api/resource/wayline'
+import { getAirportList } from '@/api/device/device'
+import { mapGetters } from 'vuex'
+import func from '@/utils/func'
export default {
- data() {
+ data () {
// 计算默认的开始和结束日期
- const endDate = new Date(); // 当前日期
- const startDate = new Date(); // 一个月前的日期
- startDate.setMonth(startDate.getMonth() - 1);
+ const endDate = new Date() // 当前日期
+ const startDate = new Date() // 一个月前的日期
+ startDate.setMonth(startDate.getMonth() - 1)
// 格式化为 YYYY-MM-DD 字符串
- const defaultStartDate = `${startDate.getFullYear()}-${String(startDate.getMonth() + 1).padStart(2, '0')}-${String(startDate.getDate()).padStart(2, '0')}`;
- const defaultEndDate = `${endDate.getFullYear()}-${String(endDate.getMonth() + 1).padStart(2, '0')}-${String(endDate.getDate()).padStart(2, '0')}`;
+ const defaultStartDate = `${startDate.getFullYear()}-${String(startDate.getMonth() + 1).padStart(2, '0')}-${String(startDate.getDate()).padStart(2, '0')}`
+ const defaultEndDate = `${endDate.getFullYear()}-${String(endDate.getMonth() + 1).padStart(2, '0')}-${String(endDate.getDate()).padStart(2, '0')}`
return {
form: {},
@@ -59,6 +48,9 @@
selection: true,
dialogClickModal: false,
menu: false, // 禁用默认操作列
+
+ height: 'auto',
+ calcHeight: 20,
column: [
{
label: '机场选择',
@@ -115,131 +107,131 @@
label: '错误原因',
prop: 'reason',
formatter: (row) => {
- return [4, 5].includes(row.status) ? row.reason || '未知' : '';
+ return [4, 5].includes(row.status) ? row.reason || '未知' : ''
},
},
],
},
data: [],
- };
+ }
},
computed: {
...mapGetters(['permission']),
- permissionList() {
+ permissionList () {
return {
addBtn: false,
editBtn: false,
viewBtn: this.validData(this.permission.attach_view, false),
delBtn: this.validData(this.permission.attach_delete, false),
- };
+ }
},
- ids() {
- let ids = [];
+ ids () {
+ let ids = []
this.selectionList.forEach(ele => {
- ids.push(ele.job_id);
- });
- return ids.join(',');
+ ids.push(ele.job_id)
+ })
+ return ids.join(',')
},
},
- mounted() {
- this.loadAirportList();
+ mounted () {
+ this.loadAirportList()
// 初始化时手动触发搜索,以确保默认值生效
- this.$refs.crud.searchChange(this.query);
- this.onLoad(this.page, this.query);
+ this.$refs.crud.searchChange(this.query)
+ this.onLoad(this.page, this.query)
},
methods: {
- loadAirportList() {
+ loadAirportList () {
getAirportList().then(res => {
- const airportData = res.data.data || [];
- const airportColumn = this.option.column.find(col => col.prop === 'dock_name');
+ const airportData = res.data.data || []
+ const airportColumn = this.option.column.find(col => col.prop === 'dock_name')
if (airportColumn) {
airportColumn.dicData = airportData.map(item => ({
nickname: item.nickname,
workspace_id: item.workspace_id,
- }));
+ }))
}
}).catch(error => {
// 处理错误
- });
+ })
},
- searchReset() {
+ searchReset () {
// 重置时恢复默认时间范围
- const endDate = new Date();
- const startDate = new Date();
- startDate.setMonth(startDate.getMonth() - 1);
- const defaultStartDate = `${startDate.getFullYear()}-${String(startDate.getMonth() + 1).padStart(2, '0')}-${String(startDate.getDate()).padStart(2, '0')}`;
- const defaultEndDate = `${endDate.getFullYear()}-${String(endDate.getMonth() + 1).padStart(2, '0')}-${String(endDate.getDate()).padStart(2, '0')}`;
+ const endDate = new Date()
+ const startDate = new Date()
+ startDate.setMonth(startDate.getMonth() - 1)
+ const defaultStartDate = `${startDate.getFullYear()}-${String(startDate.getMonth() + 1).padStart(2, '0')}-${String(startDate.getDate()).padStart(2, '0')}`
+ const defaultEndDate = `${endDate.getFullYear()}-${String(endDate.getMonth() + 1).padStart(2, '0')}-${String(endDate.getDate()).padStart(2, '0')}`
this.query = {
daterange: [defaultStartDate, defaultEndDate]
- };
- this.selectedWorkspaceId = null;
+ }
+ this.selectedWorkspaceId = null
// 更新 searchValue 以确保界面重置后显示默认值
- const daterangeColumn = this.option.column.find(col => col.prop === 'daterange');
- daterangeColumn.searchValue = [defaultStartDate, defaultEndDate];
- this.onLoad(this.page, this.query);
+ const daterangeColumn = this.option.column.find(col => col.prop === 'daterange')
+ daterangeColumn.searchValue = [defaultStartDate, defaultEndDate]
+ this.onLoad(this.page, this.query)
},
- searchChange(params, done) {
- this.query = params;
- this.page.currentPage = 1;
+ searchChange (params, done) {
+ this.query = params
+ this.page.currentPage = 1
- const airportColumn = this.option.column.find(col => col.prop === 'dock_name');
- const selectedAirport = airportColumn.dicData.find(item => item.nickname === params.dock_name);
- this.selectedWorkspaceId = selectedAirport ? selectedAirport.workspace_id : null;
+ const airportColumn = this.option.column.find(col => col.prop === 'dock_name')
+ const selectedAirport = airportColumn.dicData.find(item => item.nickname === params.dock_name)
+ this.selectedWorkspaceId = selectedAirport ? selectedAirport.workspace_id : null
- const { daterange } = params;
- let startTime = null;
- let endTime = null;
+ const { daterange } = params
+ let startTime = null
+ let endTime = null
if (daterange && Array.isArray(daterange) && daterange.length === 2) {
- startTime = this.formatTime(daterange[0]);
- endTime = this.formatTime(daterange[1]);
+ startTime = this.formatTime(daterange[0])
+ endTime = this.formatTime(daterange[1])
}
if (startTime && isNaN(new Date(startTime).getTime())) {
- startTime = null;
+ startTime = null
}
if (endTime && isNaN(new Date(endTime).getTime())) {
- endTime = null;
+ endTime = null
}
- this.onLoad(this.page, params);
- if (done) done();
+ this.onLoad(this.page, params)
+ if (done) done()
},
- selectionChange(list) {
- this.selectionList = list;
+ selectionChange (list) {
+ this.selectionList = list
},
- selectionClear() {
- this.selectionList = [];
- this.$refs.crud.toggleSelection();
+ selectionClear () {
+ this.selectionList = []
+ this.$refs.crud.toggleSelection()
},
- currentChange(currentPage) {
- this.page.currentPage = currentPage;
- this.onLoad(this.page, this.query);
+ currentChange (currentPage) {
+ this.page.currentPage = currentPage
+ this.onLoad(this.page, this.query)
},
- sizeChange(pageSize) {
- this.page.pageSize = pageSize;
- this.onLoad(this.page, this.query);
+ sizeChange (pageSize) {
+ this.page.pageSize = pageSize
+ this.onLoad(this.page, this.query)
},
- refreshChange() {
- this.onLoad(this.page, this.query);
+ refreshChange () {
+ this.onLoad(this.page, this.query)
},
- onLoad(page, params = {}) {
- this.loading = true;
+ onLoad (page, params = {}) {
+ this.loading = true
- const workspaceId = this.selectedWorkspaceId || null;
- const { daterange } = params;
- let startTime = null;
- let endTime = null;
+ const workspaceId = this.selectedWorkspaceId || null
+ const { daterange } = params
+ let startTime = null
+ let endTime = null
if (daterange && Array.isArray(daterange) && daterange.length === 2) {
- startTime = this.formatTime(daterange[0]);
- endTime = this.formatTime(daterange[1]);
+ startTime = this.formatTime(daterange[0])
+ endTime = this.formatTime(daterange[1])
}
if (startTime && isNaN(new Date(startTime).getTime())) {
- startTime = null;
+ startTime = null
}
if (endTime && isNaN(new Date(endTime).getTime())) {
- endTime = null;
+ endTime = null
}
getJobsByUser(
@@ -251,10 +243,10 @@
endTime,
params.job_name || null
).then(res => {
- const responseData = res.data;
+ const responseData = res.data
if (responseData && responseData.data && Array.isArray(responseData.data.list)) {
- this.page.total = responseData.data.pagination.total || responseData.data.list.length;
+ this.page.total = responseData.data.pagination.total || responseData.data.list.length
this.data = responseData.data.list.map(item => ({
job_id: item.job_id,
job_name: item.job_name,
@@ -265,53 +257,44 @@
reason: item.reason,
begin_time: item.begin_time,
completed_time: item.completed_time,
- }));
+ }))
} else {
- this.data = [];
- this.page.total = 0;
+ this.data = []
+ this.page.total = 0
}
- this.loading = false;
- this.selectionClear();
+ this.loading = false
+ this.selectionClear()
}).catch(error => {
- this.loading = false;
- this.data = [];
- this.page.total = 0;
- });
+ this.loading = false
+ this.data = []
+ this.page.total = 0
+ })
},
- formatTime(time) {
- if (!time) return '';
- let date;
+ formatTime (time) {
+ if (!time) return ''
+ let date
if (typeof time === 'number') {
- date = new Date(time < 10000000000 ? time * 1000 : time);
+ date = new Date(time < 10000000000 ? time * 1000 : time)
} else if (typeof time === 'string') {
- date = new Date(time);
+ date = new Date(time)
}
if (isNaN(date.getTime())) {
- return null;
+ return null
}
- const year = date.getFullYear();
- const month = String(date.getMonth() + 1).padStart(2, '0');
- const day = String(date.getDate()).padStart(2, '0');
- const hours = String(date.getHours()).padStart(2, '0');
- const minutes = String(date.getMinutes()).padStart(2, '0');
- const seconds = String(date.getSeconds()).padStart(2, '0');
- return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`;
+ const year = date.getFullYear()
+ const month = String(date.getMonth() + 1).padStart(2, '0')
+ const day = String(date.getDate()).padStart(2, '0')
+ const hours = String(date.getHours()).padStart(2, '0')
+ const minutes = String(date.getMinutes()).padStart(2, '0')
+ const seconds = String(date.getSeconds()).padStart(2, '0')
+ return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`
},
- validData(val, def) {
- return typeof val !== 'undefined' ? val : def;
+ validData (val, def) {
+ return typeof val !== 'undefined' ? val : def
},
},
-};
+}
</script>
-<style scoped lang="scss">
- :deep(){
- .avue-crud__body{
- .el-form{
- height: 745px;
- overflow: auto;
- }
- }
- }
-</style>
+<style scoped lang="scss"></style>
diff --git a/src/views/resource/waylineFile.vue b/src/views/resource/waylineFile.vue
index 412fe53..597623d 100644
--- a/src/views/resource/waylineFile.vue
+++ b/src/views/resource/waylineFile.vue
@@ -1,30 +1,20 @@
<template>
<basic-container>
- <avue-crud
- :option="option"
- :table-loading="loading"
- :data="data"
- :page.sync="page"
- v-model="form"
- ref="crud"
- @search-change="searchChange"
- @search-reset="searchReset"
- @current-change="currentChange"
- @size-change="sizeChange"
- @refresh-change="refreshChange"
- >
+ <avue-crud :option="option" :table-loading="loading" :data="data" :page.sync="page" v-model="form" ref="crud"
+ @search-change="searchChange" @search-reset="searchReset" @current-change="currentChange"
+ @size-change="sizeChange" @refresh-change="refreshChange">
</avue-crud>
</basic-container>
</template>
<script>
-import { getWaylineFileByUser } from '@/api/resource/waylineFile';
-import { getAirportList } from '@/api/device/device';
+import { getWaylineFileByUser } from '@/api/resource/waylineFile'
+import { getAirportList } from '@/api/device/device'
export default {
name: 'WaylineFile',
- data() {
- const { defaultStartDate, defaultEndDate } = this.getDefaultDates();
+ data () {
+ const { defaultStartDate, defaultEndDate } = this.getDefaultDates()
return {
form: {},
query: { name: '', dock_name: '', daterange: [defaultStartDate, defaultEndDate] },
@@ -40,6 +30,9 @@
index: true,
menu: false,
page: true,
+
+ height: 'auto',
+ calcHeight: 20,
column: [
{
label: '机场选择',
@@ -86,53 +79,53 @@
},
],
},
- };
+ }
},
- mounted() {
- this.fetchAirports();
- this.fetchData(this.page, this.query); // 初次加载包含默认时间范围
+ mounted () {
+ this.fetchAirports()
+ this.fetchData(this.page, this.query) // 初次加载包含默认时间范围
},
methods: {
- getDefaultDates() {
- const endDate = new Date();
- const startDate = new Date();
- startDate.setMonth(startDate.getMonth() - 1);
+ getDefaultDates () {
+ const endDate = new Date()
+ const startDate = new Date()
+ startDate.setMonth(startDate.getMonth() - 1)
// 结束时间设定为当天 23:59:59
- endDate.setHours(23, 59, 59, 999);
+ endDate.setHours(23, 59, 59, 999)
return {
defaultStartDate: `${startDate.getFullYear()}-${String(startDate.getMonth() + 1).padStart(2, '0')}-${String(startDate.getDate()).padStart(2, '0')}`,
defaultEndDate: `${endDate.getFullYear()}-${String(endDate.getMonth() + 1).padStart(2, '0')}-${String(endDate.getDate()).padStart(2, '0')}`,
- };
+ }
},
- async fetchAirports() {
+ async fetchAirports () {
try {
- const res = await getAirportList();
- const airportData = res.data.data || [];
- const airportColumn = this.option.column.find((col) => col.prop === 'dock_name');
+ const res = await getAirportList()
+ const airportData = res.data.data || []
+ const airportColumn = this.option.column.find((col) => col.prop === 'dock_name')
if (airportColumn) {
airportColumn.dicData = airportData.map((item) => ({
nickname: item.nickname,
workspace_id: item.workspace_id,
- }));
+ }))
}
} catch (error) {
- console.error('加载机场列表失败:', error);
+ console.error('加载机场列表失败:', error)
}
},
- async fetchData(page, params = {}) {
- this.loading = true;
- const { name, dock_name, daterange } = params;
- const workspaceId = this.selectedWorkspaceId || null;
+ async fetchData (page, params = {}) {
+ this.loading = true
+ const { name, dock_name, daterange } = params
+ const workspaceId = this.selectedWorkspaceId || null
// 时间范围处理
- const startDate = new Date(daterange[0]);
- let endDate = new Date(daterange[1]);
+ const startDate = new Date(daterange[0])
+ let endDate = new Date(daterange[1])
// 结束时间始终设定为当天 23:59:59
- endDate.setHours(23, 59, 59, 999);
+ endDate.setHours(23, 59, 59, 999)
- const startTime = isNaN(startDate.getTime()) ? null : startDate.getTime();
- const endTime = isNaN(endDate.getTime()) ? null : endDate.getTime();
+ const startTime = isNaN(startDate.getTime()) ? null : startDate.getTime()
+ const endTime = isNaN(endDate.getTime()) ? null : endDate.getTime()
const requestParams = {
workspaceId,
@@ -141,9 +134,9 @@
endTime,
page: page.currentPage,
pageSize: page.pageSize,
- };
+ }
- console.log('请求参数:', requestParams);
+ console.log('请求参数:', requestParams)
try {
const res = await getWaylineFileByUser(
@@ -153,8 +146,8 @@
requestParams.endTime,
requestParams.page,
requestParams.pageSize
- );
- const responseData = res.data;
+ )
+ const responseData = res.data
if (responseData?.code === 0 && Array.isArray(responseData.data?.list)) {
this.data = responseData.data.list.map((item) => ({
@@ -163,80 +156,72 @@
wayline_type: item.wayline_type,
user_name: item.user_name,
update_time: item.update_time,
- }));
- this.page.total = responseData.data.pagination?.total || responseData.data.list.length;
- this.page.currentPage = page.currentPage;
- console.log('返回数据条数:', this.data.length);
- console.log('当前页码:', this.page.currentPage);
- console.log('总条数:', this.page.total);
+ }))
+ this.page.total = responseData.data.pagination?.total || responseData.data.list.length
+ this.page.currentPage = page.currentPage
+ console.log('返回数据条数:', this.data.length)
+ console.log('当前页码:', this.page.currentPage)
+ console.log('总条数:', this.page.total)
} else {
- this.data = [];
- this.page.total = 0;
+ this.data = []
+ this.page.total = 0
}
} catch (error) {
- console.error('加载数据失败:', error);
- this.data = [];
- this.page.total = 0;
+ console.error('加载数据失败:', error)
+ this.data = []
+ this.page.total = 0
} finally {
- this.loading = false;
+ this.loading = false
}
},
- searchChange(params, done) {
- this.query = { ...params };
- const airportColumn = this.option.column.find((col) => col.prop === 'dock_name');
- const selectedAirport = airportColumn.dicData.find((item) => item.nickname === params.dock_name);
- this.selectedWorkspaceId = selectedAirport ? selectedAirport.workspace_id : null;
- this.page.currentPage = 1;
- this.fetchData(this.page, this.query);
- done();
+ searchChange (params, done) {
+ this.query = { ...params }
+ const airportColumn = this.option.column.find((col) => col.prop === 'dock_name')
+ const selectedAirport = airportColumn.dicData.find((item) => item.nickname === params.dock_name)
+ this.selectedWorkspaceId = selectedAirport ? selectedAirport.workspace_id : null
+ this.page.currentPage = 1
+ this.fetchData(this.page, this.query)
+ done()
},
- searchReset() {
- const { defaultStartDate, defaultEndDate } = this.getDefaultDates();
- this.query = { name: '', dock_name: '', daterange: [defaultStartDate, defaultEndDate] };
- this.selectedWorkspaceId = null;
- const daterangeColumn = this.option.column.find((col) => col.prop === 'daterange');
- daterangeColumn.searchValue = [defaultStartDate, defaultEndDate];
- this.page.currentPage = 1;
- this.fetchData(this.page, this.query);
+ searchReset () {
+ const { defaultStartDate, defaultEndDate } = this.getDefaultDates()
+ this.query = { name: '', dock_name: '', daterange: [defaultStartDate, defaultEndDate] }
+ this.selectedWorkspaceId = null
+ const daterangeColumn = this.option.column.find((col) => col.prop === 'daterange')
+ daterangeColumn.searchValue = [defaultStartDate, defaultEndDate]
+ this.page.currentPage = 1
+ this.fetchData(this.page, this.query)
},
- currentChange(currentPage) {
- console.log('切换页码至:', currentPage);
- this.page.currentPage = currentPage;
- this.fetchData(this.page, this.query);
+ currentChange (currentPage) {
+ console.log('切换页码至:', currentPage)
+ this.page.currentPage = currentPage
+ this.fetchData(this.page, this.query)
},
- sizeChange(pageSize) {
- console.log('每页条数改为:', pageSize);
- this.page.pageSize = pageSize;
- this.page.currentPage = 1;
- this.fetchData(this.page, this.query);
+ sizeChange (pageSize) {
+ console.log('每页条数改为:', pageSize)
+ this.page.pageSize = pageSize
+ this.page.currentPage = 1
+ this.fetchData(this.page, this.query)
},
- refreshChange() {
- this.fetchData(this.page, this.query);
+ refreshChange () {
+ this.fetchData(this.page, this.query)
},
- formatTime(time) {
- if (!time) return '';
- const date = new Date(time < 10000000000 ? time * 1000 : time);
- if (isNaN(date.getTime())) return '无效时间';
- return date.toLocaleString('zh-CN', { hour12: false }).replace(/\//g, '-');
+ formatTime (time) {
+ if (!time) return ''
+ const date = new Date(time < 10000000000 ? time * 1000 : time)
+ if (isNaN(date.getTime())) return '无效时间'
+ return date.toLocaleString('zh-CN', { hour12: false }).replace(/\//g, '-')
},
- formatWaylineType(type) {
- const typeMap = { '0': '普通航线', '1': '图斑举证航线', '2': '航测航线', '3': '航点航线', '4': '正射举证航线' };
- return typeMap[type] || '未知';
+ formatWaylineType (type) {
+ const typeMap = { '0': '普通航线', '1': '图斑举证航线', '2': '航测航线', '3': '航点航线', '4': '正射举证航线' }
+ return typeMap[type] || '未知'
},
},
-};
+}
</script>
<style scoped lang="scss">
.avue-crud .el-table {
max-height: none !important;
}
- :deep(){
- .avue-crud__body{
- .el-form{
- height: 745px;
- overflow: auto;
- }
- }
- }
</style>
diff --git a/src/views/system/client.vue b/src/views/system/client.vue
index b715202..49a6cf0 100644
--- a/src/views/system/client.vue
+++ b/src/views/system/client.vue
@@ -1,33 +1,12 @@
<template>
<basic-container>
- <avue-crud
- :option="option"
- :table-loading="loading"
- :data="data"
- v-model:page="page"
- @row-del="rowDel"
- v-model="form"
- ref="crud"
- :permission="permissionList"
- @row-update="rowUpdate"
- @row-save="rowSave"
- :before-open="beforeOpen"
- @search-change="searchChange"
- @search-reset="searchReset"
- @selection-change="selectionChange"
- @current-change="currentChange"
- @size-change="sizeChange"
- @refresh-change="refreshChange"
- @on-load="onLoad"
- >
+ <avue-crud :option="option" :table-loading="loading" :data="data" v-model:page="page" @row-del="rowDel"
+ v-model="form" ref="crud" :permission="permissionList" @row-update="rowUpdate" @row-save="rowSave"
+ :before-open="beforeOpen" @search-change="searchChange" @search-reset="searchReset"
+ @selection-change="selectionChange" @current-change="currentChange" @size-change="sizeChange"
+ @refresh-change="refreshChange" @on-load="onLoad">
<template #menu-left>
- <el-button
- type="danger"
- icon="el-icon-delete"
- plain
- v-if="permission.client_delete"
- @click="handleDelete"
- >删 除
+ <el-button type="danger" icon="el-icon-delete" plain v-if="permission.client_delete" @click="handleDelete">删 除
</el-button>
</template>
</avue-crud>
@@ -35,11 +14,11 @@
</template>
<script>
-import { getList, getDetail, add, update, remove } from '@/api/system/client';
-import { mapGetters } from 'vuex';
+import { getList, getDetail, add, update, remove } from '@/api/system/client'
+import { mapGetters } from 'vuex'
export default {
- data() {
+ data () {
return {
form: {},
query: {},
@@ -60,6 +39,10 @@
grid: true,
selection: true,
dialogClickModal: false,
+
+ height: 'auto',
+ calcHeight: 20,
+
column: [
{
label: '应用id',
@@ -240,97 +223,97 @@
],
},
data: [],
- };
+ }
},
computed: {
...mapGetters(['permission']),
- permissionList() {
+ permissionList () {
return {
addBtn: this.validData(this.permission.client_add),
viewBtn: this.validData(this.permission.client_view),
delBtn: this.validData(this.permission.client_delete),
editBtn: this.validData(this.permission.client_edit),
- };
+ }
},
- ids() {
- let ids = [];
+ ids () {
+ let ids = []
this.selectionList.forEach(ele => {
- ids.push(ele.id);
- });
- return ids.join(',');
+ ids.push(ele.id)
+ })
+ return ids.join(',')
},
},
methods: {
- rowSave(row, done, loading) {
+ rowSave (row, done, loading) {
add(row).then(
() => {
- this.onLoad(this.page);
+ this.onLoad(this.page)
this.$message({
type: 'success',
message: '操作成功!',
- });
- done();
+ })
+ done()
},
error => {
- window.console.log(error);
- loading();
+ window.console.log(error)
+ loading()
}
- );
+ )
},
- rowUpdate(row, index, done, loading) {
+ rowUpdate (row, index, done, loading) {
update(row).then(
() => {
- this.onLoad(this.page);
+ this.onLoad(this.page)
this.$message({
type: 'success',
message: '操作成功!',
- });
- done();
+ })
+ done()
},
error => {
- window.console.log(error);
- loading();
+ window.console.log(error)
+ loading()
}
- );
+ )
},
- rowDel(row) {
+ rowDel (row) {
this.$confirm('确定将选择数据删除?', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning',
})
.then(() => {
- return remove(row.id);
+ return remove(row.id)
})
.then(() => {
- this.onLoad(this.page);
+ this.onLoad(this.page)
this.$message({
type: 'success',
message: '操作成功!',
- });
- });
+ })
+ })
},
- searchReset() {
- this.query = {};
- this.onLoad(this.page);
+ searchReset () {
+ this.query = {}
+ this.onLoad(this.page)
},
- searchChange(params, done) {
- this.query = params;
- this.page.currentPage = 1;
- this.onLoad(this.page, params);
- done();
+ searchChange (params, done) {
+ this.query = params
+ this.page.currentPage = 1
+ this.onLoad(this.page, params)
+ done()
},
- selectionChange(list) {
- this.selectionList = list;
+ selectionChange (list) {
+ this.selectionList = list
},
- selectionClear() {
- this.selectionList = [];
- this.$refs.crud.toggleSelection();
+ selectionClear () {
+ this.selectionList = []
+ this.$refs.crud.toggleSelection()
},
- handleDelete() {
+ handleDelete () {
if (this.selectionList.length === 0) {
- this.$message.warning('请选择至少一条数据');
- return;
+ this.$message.warning('请选择至少一条数据')
+ return
}
this.$confirm('确定将选择数据删除?', {
confirmButtonText: '确定',
@@ -338,55 +321,46 @@
type: 'warning',
})
.then(() => {
- return remove(this.ids);
+ return remove(this.ids)
})
.then(() => {
- this.onLoad(this.page);
+ this.onLoad(this.page)
this.$message({
type: 'success',
message: '操作成功!',
- });
- this.$refs.crud.toggleSelection();
- });
+ })
+ this.$refs.crud.toggleSelection()
+ })
},
- beforeOpen(done, type) {
+ beforeOpen (done, type) {
if (['edit', 'view'].includes(type)) {
getDetail(this.form.id).then(res => {
- this.form = res.data.data;
- });
+ this.form = res.data.data
+ })
}
- done();
+ done()
},
- currentChange(currentPage) {
- this.page.currentPage = currentPage;
+ currentChange (currentPage) {
+ this.page.currentPage = currentPage
},
- sizeChange(pageSize) {
- this.page.pageSize = pageSize;
+ sizeChange (pageSize) {
+ this.page.pageSize = pageSize
},
- refreshChange() {
- this.onLoad(this.page, this.query);
+ refreshChange () {
+ this.onLoad(this.page, this.query)
},
- onLoad(page, params = {}) {
- this.loading = true;
+ onLoad (page, params = {}) {
+ this.loading = true
getList(page.currentPage, page.pageSize, Object.assign(params, this.query)).then(res => {
- const data = res.data.data;
- this.page.total = data.total;
- this.data = data.records;
- this.loading = false;
- this.selectionClear();
- });
+ const data = res.data.data
+ this.page.total = data.total
+ this.data = data.records
+ this.loading = false
+ this.selectionClear()
+ })
},
},
-};
+}
</script>
-<style scoped lang="scss">
- :deep(){
- .avue-crud__body{
- .el-form{
- height: 745px;
- overflow: auto;
- }
- }
- }
-</style>
\ No newline at end of file
+<style scoped lang="scss"></style>
\ No newline at end of file
diff --git a/src/views/system/dept.vue b/src/views/system/dept.vue
index 9475470..93d87a8 100644
--- a/src/views/system/dept.vue
+++ b/src/views/system/dept.vue
@@ -1,45 +1,18 @@
<template>
<basic-container>
- <avue-crud
- :option="option"
- :table-loading="loading"
- :data="data"
- ref="crud"
- v-model="form"
- :permission="permissionList"
- :before-open="beforeOpen"
- :before-close="beforeClose"
- @row-del="rowDel"
- @row-update="rowUpdate"
- @row-save="rowSave"
- @search-change="searchChange"
- @search-reset="searchReset"
- @selection-change="selectionChange"
- @current-change="currentChange"
- @size-change="sizeChange"
- @refresh-change="refreshChange"
- @on-load="onLoad"
- @tree-load="treeLoad"
- >
+ <avue-crud :option="option" :table-loading="loading" :data="data" ref="crud" v-model="form"
+ :permission="permissionList" :before-open="beforeOpen" :before-close="beforeClose" @row-del="rowDel"
+ @row-update="rowUpdate" @row-save="rowSave" @search-change="searchChange" @search-reset="searchReset"
+ @selection-change="selectionChange" @current-change="currentChange" @size-change="sizeChange"
+ @refresh-change="refreshChange" @on-load="onLoad" @tree-load="treeLoad">
<template #menu-left>
- <el-button
- type="danger"
- icon="el-icon-delete"
- v-if="permission.dept_delete"
- plain
- @click="handleDelete"
- >
+ <el-button type="danger" icon="el-icon-delete" v-if="permission.dept_delete" plain @click="handleDelete">
删除
</el-button>
</template>
<template #menu="scope">
- <el-button
- type="primary"
- text
- icon="el-icon-plus"
- @click.stop="handleAdd(scope.row, scope.index)"
- v-if="userInfo.role_name.includes('admin')"
- >
+ <el-button type="primary" text icon="el-icon-plus" @click.stop="handleAdd(scope.row, scope.index)"
+ v-if="userInfo.role_name.includes('admin')">
新增子项
</el-button>
</template>
@@ -63,13 +36,13 @@
add,
getDept,
getDeptTree,
-} from '@/api/system/dept';
-import { getLazyTree } from '@/api/base/region';
-import { mapGetters } from 'vuex';
-import website from '@/config/website';
+} from '@/api/system/dept'
+import { getLazyTree } from '@/api/base/region'
+import { mapGetters } from 'vuex'
+import website from '@/config/website'
export default {
- data() {
+ data () {
return {
form: {},
selectionList: [],
@@ -94,6 +67,10 @@
viewBtn: true,
menuWidth: 320,
dialogClickModal: false,
+
+ height: 'auto',
+ calcHeight: 20,
+
column: [
{
label: '机构名称',
@@ -239,23 +216,23 @@
],
change: ({ value }) => {
if (!value) {
- this.form.areaCode = null; // 未选择时置为空
+ this.form.areaCode = null // 未选择时置为空
} else {
// 如果 value 是逗号分隔的字符串,拆分并取最后一个值
if (typeof value === 'string' && value.includes(',')) {
- const codes = value.split(',');
- this.form.areaCode = codes[codes.length - 1];
+ const codes = value.split(',')
+ this.form.areaCode = codes[codes.length - 1]
} else {
- this.form.areaCode = value; // 直接使用单一值
+ this.form.areaCode = value // 直接使用单一值
}
}
- console.log('cascader change value:', value);
- console.log('处理后的区县编码:', this.form.areaCode);
+ console.log('cascader change value:', value)
+ console.log('处理后的区县编码:', this.form.areaCode)
},
lazy: true,
- lazyLoad(node, resolve) {
- let level = node.level;
- let list = [];
+ lazyLoad (node, resolve) {
+ let level = node.level
+ let list = []
let callback = () => {
resolve(
(list || []).map(ele => ({
@@ -263,26 +240,26 @@
value: ele.value, // 保持原始值类型(字符串)
leaf: level >= 2, // 县级为最后一级
}))
- );
- };
+ )
+ }
if (level === 0) {
getLazyTree('000000000000').then(res => {
- list = res.data.data;
- callback();
- });
+ list = res.data.data
+ callback()
+ })
} else if (level === 1) {
getLazyTree(node.value).then(res => {
- list = res.data.data;
- callback();
- });
+ list = res.data.data
+ callback()
+ })
} else if (level === 2) {
getLazyTree(node.value).then(res => {
- list = res.data.data;
- callback();
- });
+ list = res.data.data
+ callback()
+ })
} else {
- callback();
+ callback()
}
},
},
@@ -302,148 +279,148 @@
],
},
data: [],
- };
+ }
},
computed: {
...mapGetters(['userInfo', 'permission']),
- permissionList() {
+ permissionList () {
return {
addBtn: this.validData(this.permission.dept_add, false),
viewBtn: this.validData(this.permission.dept_view, false),
delBtn: this.validData(this.permission.dept_delete, false),
editBtn: this.validData(this.permission.dept_edit, false),
- };
+ }
},
- ids() {
- let ids = [];
+ ids () {
+ let ids = []
this.selectionList.forEach(ele => {
- ids.push(ele.id);
- });
- return ids.join(',');
+ ids.push(ele.id)
+ })
+ return ids.join(',')
},
},
methods: {
- initData() {
+ initData () {
getDeptTree().then(res => {
- const column = this.findObject(this.option.column, 'parentId');
- column.dicData = res.data.data;
- });
+ const column = this.findObject(this.option.column, 'parentId')
+ column.dicData = res.data.data
+ })
},
- handleAdd(row) {
- this.parentId = row.id;
- const column = this.findObject(this.option.column, 'parentId');
- column.value = row.id;
- column.addDisabled = true;
- this.form.areaCode = null; // 初始化为空
- this.$refs.crud.rowAdd();
+ handleAdd (row) {
+ this.parentId = row.id
+ const column = this.findObject(this.option.column, 'parentId')
+ column.value = row.id
+ column.addDisabled = true
+ this.form.areaCode = null // 初始化为空
+ this.$refs.crud.rowAdd()
},
- validateSubmitData(row) {
+ validateSubmitData (row) {
if (!row.areaCode) {
- this.$message.warning('请选择行政区划');
- return false;
+ this.$message.warning('请选择行政区划')
+ return false
}
- return true;
+ return true
},
- rowSave(row, done, loading) {
+ rowSave (row, done, loading) {
if (!this.validateSubmitData(row)) {
- loading();
- return;
+ loading()
+ return
}
- console.log('--- Start rowSave ---');
- console.log('Form data before save:', this.form);
+ console.log('--- Start rowSave ---')
+ console.log('Form data before save:', this.form)
// 处理 areaCode,确保只取最后一个值
- let areaCode = this.form.areaCode;
+ let areaCode = this.form.areaCode
if (Array.isArray(areaCode)) {
- areaCode = areaCode[areaCode.length - 1]; // 数组取最后一个
+ areaCode = areaCode[areaCode.length - 1] // 数组取最后一个
} else if (typeof areaCode === 'string' && areaCode.includes(',')) {
- const codes = areaCode.split(',');
- areaCode = codes[codes.length - 1]; // 字符串拆分取最后一个
+ const codes = areaCode.split(',')
+ areaCode = codes[codes.length - 1] // 字符串拆分取最后一个
}
- row.areaCode = areaCode || null; // 确保非空
+ row.areaCode = areaCode || null // 确保非空
- console.log('Row data before submit:', row);
+ console.log('Row data before submit:', row)
add(row).then(
res => {
- console.log('Save response:', res.data);
- const data = res.data.data;
- row.id = data.id;
- row.deptCategoryName = data.deptCategoryName;
- row.tenantId = data.tenantId;
+ console.log('Save response:', res.data)
+ const data = res.data.data
+ row.id = data.id
+ row.deptCategoryName = data.deptCategoryName
+ row.tenantId = data.tenantId
this.$message({
type: 'success',
message: '操作成功!',
- });
- this.onLoad(this.page);
- done(row);
+ })
+ this.onLoad(this.page)
+ done(row)
},
error => {
- console.log('Save error:', error);
- this.loading = false;
- loading();
+ console.log('Save error:', error)
+ this.loading = false
+ loading()
}
- );
+ )
},
- rowUpdate(row, index, done, loading) {
+ rowUpdate (row, index, done, loading) {
if (!this.validateSubmitData(row)) {
- loading();
- return;
+ loading()
+ return
}
- console.log('--- Start rowUpdate ---');
+ console.log('--- Start rowUpdate ---')
// 提交时只使用县级代码
const submitData = {
...row,
areaCode: row.areaCode.split(',').pop(), // 取最后一个代码(县级)
- };
+ }
- console.log('Row data before submit:', row);
+ console.log('Row data before submit:', row)
update(submitData)
.then(
res => {
- console.log('Update response:', res.data);
+ console.log('Update response:', res.data)
this.$message({
type: 'success',
message: '操作成功!',
- });
- this.onLoad(this.page);
- done(row);
+ })
+ this.onLoad(this.page)
+ done(row)
},
error => {
- console.log('Update error:', error);
- this.loading = false;
- loading();
+ console.log('Update error:', error)
+ this.loading = false
+ loading()
}
)
.catch(error => {
- console.log('Update promise rejected:', error);
- this.loading = false;
- });
+ console.log('Update promise rejected:', error)
+ this.loading = false
+ })
},
- rowDel(row, index, done) {
+ rowDel (row, index, done) {
this.$confirm('确定将选择数据删除?', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning',
})
.then(() => {
- return remove(row.id);
+ return remove(row.id)
})
.then(() => {
this.$message({
type: 'success',
message: '操作成功!',
- });
- this.onLoad(this.page);
- done(row);
- });
+ })
+ this.onLoad(this.page)
+ done(row)
+ })
},
- handleDelete() {
+ handleDelete () {
if (this.selectionList.length === 0) {
- this.$message.warning('请选择至少一条数据');
- return;
+ this.$message.warning('请选择至少一条数据')
+ return
}
this.$confirm('确定将选择数据删除?', {
confirmButtonText: '确定',
@@ -451,153 +428,153 @@
type: 'warning',
})
.then(() => {
- return remove(this.ids);
+ return remove(this.ids)
})
.then(() => {
- this.data = [];
- this.parentId = 0;
- this.$refs.crud.refreshTable();
- this.$refs.crud.toggleSelection();
- this.onLoad(this.page);
+ this.data = []
+ this.parentId = 0
+ this.$refs.crud.refreshTable()
+ this.$refs.crud.toggleSelection()
+ this.onLoad(this.page)
this.$message({
type: 'success',
message: '操作成功!',
- });
- });
+ })
+ })
},
- searchReset() {
- this.query = {};
- this.parentId = 0;
- this.onLoad(this.page);
+ searchReset () {
+ this.query = {}
+ this.parentId = 0
+ this.onLoad(this.page)
},
- searchChange(params, done) {
- this.query = params;
- this.parentId = '';
- this.page.currentPage = 1;
- this.onLoad(this.page, params);
- done();
+ searchChange (params, done) {
+ this.query = params
+ this.parentId = ''
+ this.page.currentPage = 1
+ this.onLoad(this.page, params)
+ done()
},
- selectionChange(list) {
- this.selectionList = list;
+ selectionChange (list) {
+ this.selectionList = list
},
- selectionClear() {
- this.selectionList = [];
- this.$refs.crud.toggleSelection();
+ selectionClear () {
+ this.selectionList = []
+ this.$refs.crud.toggleSelection()
},
// 修改 beforeOpen 方法
- beforeOpen(done, type) {
+ beforeOpen (done, type) {
if (['add', 'edit'].includes(type)) {
- this.initData();
+ this.initData()
}
if (['edit', 'view'].includes(type)) {
getDept(this.form.id).then(res => {
- const data = res.data.data;
- const areaCode = data.areaCode;
- const areaName = data.areaName;
+ const data = res.data.data
+ const areaCode = data.areaCode
+ const areaName = data.areaName
// 生成完整的行政区划代码(考虑不同级别)
- const fullAreaCode = this.getFullAreaCode(areaCode);
+ const fullAreaCode = this.getFullAreaCode(areaCode)
this.form = Object.assign({}, data, {
hasChildren: this.form.hasChildren,
areaCode: fullAreaCode,
areaName: areaName || '',
- });
+ })
// 调试输出
console.log('回显数据:', {
originalAreaCode: areaCode,
fullAreaCode: fullAreaCode,
areaName: areaName,
- });
- });
+ })
+ })
} else if (type === 'add') {
- this.form.areaCode = '';
- this.form.areaName = '';
+ this.form.areaCode = ''
+ this.form.areaName = ''
}
- done();
+ done()
},
- beforeClose(done) {
- this.parentId = '';
- const column = this.findObject(this.option.column, 'parentId');
- column.value = '';
- column.addDisabled = false;
- this.form.areaCode = null;
- done();
+ beforeClose (done) {
+ this.parentId = ''
+ const column = this.findObject(this.option.column, 'parentId')
+ column.value = ''
+ column.addDisabled = false
+ this.form.areaCode = null
+ done()
},
- currentChange(currentPage) {
- this.page.currentPage = currentPage;
- this.onLoad(this.page);
+ currentChange (currentPage) {
+ this.page.currentPage = currentPage
+ this.onLoad(this.page)
},
- sizeChange(pageSize) {
- this.page.pageSize = pageSize;
- this.onLoad(this.page);
+ sizeChange (pageSize) {
+ this.page.pageSize = pageSize
+ this.onLoad(this.page)
},
- refreshChange() {
- this.onLoad(this.page, this.query);
+ refreshChange () {
+ this.onLoad(this.page, this.query)
},
- onLoad(page, params = {}) {
- this.loading = true;
- console.log('onLoad triggered with page:', page, 'params:', params);
- console.log('Current parentId:', this.parentId, 'query:', this.query);
+ onLoad (page, params = {}) {
+ this.loading = true
+ console.log('onLoad triggered with page:', page, 'params:', params)
+ console.log('Current parentId:', this.parentId, 'query:', this.query)
getLazyList(this.parentId, Object.assign(params, this.query))
.then(res => {
- console.log('onLoad response:', res.data);
+ console.log('onLoad response:', res.data)
// 处理 areaCode,确保是单一字符串
const data = (res.data.data || []).map(item => {
- const fullAreaCode = this.getFullAreaCode(item.areaCode);
+ const fullAreaCode = this.getFullAreaCode(item.areaCode)
return {
...item,
// 保存完整的行政区划代码
areaCode: fullAreaCode,
// 使用原始的县级代码作为实际值
originalAreaCode: item.areaCode,
- };
- });
- this.data = data;
- this.loading = false;
- this.selectionClear();
- console.log('Table data after onLoad:', this.data);
+ }
+ })
+ this.data = data
+ this.loading = false
+ this.selectionClear()
+ console.log('Table data after onLoad:', this.data)
})
.catch(error => {
- console.log('onLoad error:', error);
- this.loading = false;
- this.data = this.data; // 保留当前数据
- console.log('Table data after onLoad error:', this.data);
- });
+ console.log('onLoad error:', error)
+ this.loading = false
+ this.data = this.data // 保留当前数据
+ console.log('Table data after onLoad error:', this.data)
+ })
},
- treeLoad(tree, treeNode, resolve) {
+ treeLoad (tree, treeNode, resolve) {
getChildLazyTree({ parentId: tree.id }).then(res => {
- resolve(res.data.data);
- });
+ resolve(res.data.data)
+ })
},
// 修改 getFullAreaCode 方法
- getFullAreaCode(areaCode) {
- if (!areaCode) return '';
+ getFullAreaCode (areaCode) {
+ if (!areaCode) return ''
// 根据编码长度判断层级
- const code = areaCode.toString();
+ const code = areaCode.toString()
// 如果已经是完整的逗号分隔格式,直接返回
- if (code.includes(',')) return code;
+ if (code.includes(',')) return code
// 处理不同级别的编码
if (code.endsWith('0000000000')) {
// 省级编码
- return code;
+ return code
} else if (code.endsWith('00000000') && !code.endsWith('0000000000')) {
// 市级编码
- const provinceCode = code.substring(0, 2) + '0000000000';
- return `${provinceCode},${code}`;
+ const provinceCode = code.substring(0, 2) + '0000000000'
+ return `${provinceCode},${code}`
} else {
// 县级编码
- const provinceCode = code.substring(0, 2) + '0000000000';
- const cityCode = code.substring(0, 4) + '00000000';
- return `${provinceCode},${cityCode},${code}`;
+ const provinceCode = code.substring(0, 2) + '0000000000'
+ const cityCode = code.substring(0, 4) + '00000000'
+ return `${provinceCode},${cityCode},${code}`
}
},
},
-};
+}
</script>
<style></style>
diff --git a/src/views/system/dict.vue b/src/views/system/dict.vue
index b56026a..bcd7282 100644
--- a/src/views/system/dict.vue
+++ b/src/views/system/dict.vue
@@ -449,12 +449,4 @@
};
</script>
<style scoped lang="scss">
- :deep(){
- .avue-crud__body{
- .el-form{
- height: 745px;
- overflow: auto;
- }
- }
- }
</style>
\ No newline at end of file
diff --git a/src/views/system/helpCenter.vue b/src/views/system/helpCenter.vue
new file mode 100644
index 0000000..2fae289
--- /dev/null
+++ b/src/views/system/helpCenter.vue
@@ -0,0 +1,162 @@
+<template>
+ <basic-container>
+ <div class="helpContainer">
+ <el-table
+ class="custom-table"
+ :data="helpData"
+ style="width: 100%"
+ :row-class-name="tableRowClassName"
+ >
+ <el-table-column label="序号" type="index" width="100">
+ <template #default="{ $index }">
+ {{ $index + 1 }}
+ </template>
+ </el-table-column>
+ <el-table-column prop="levelOneType" label="一级类别" />
+ <el-table-column prop="levelTwoType" label="二级类别" />
+ <el-table-column prop="uploadUser" label="上传者" />
+ <el-table-column prop="createTime" label="上传时间" />
+ <el-table-column label="操作" width="150" align="center">
+ <template #default="scope">
+ <span class="look" @click="clickDetail(scope.row)" v-if="permission.helpCenterLook"
+ >查看</span
+ >
+ <el-upload
+ style="display: inline-block"
+ :show-file-list="false"
+ :before-upload="file => onUploadFileBefore(file, scope.row)"
+ :limit="1"
+ accept=".pdf"
+ >
+ <span class="uploads" v-if="permission.helpCenterUpload">上传</span>
+ </el-upload>
+ </template>
+ </el-table-column>
+ </el-table>
+ </div>
+ </basic-container>
+</template>
+
+<script setup>
+import { uploadFileAPI, listDataAPI, updataDataAPI } from '@/api/helpCenter/helpCenter';
+import { ElMessage } from 'element-plus';
+import { computed, onMounted } from 'vue';
+const helpData = ref([]);
+
+import { useStore } from 'vuex';
+const store = useStore();
+const permission = computed(() => store.state.user.permission);
+// 表格隔行变色
+const tableRowClassName = ({ row, rowIndex }) => {
+ if (rowIndex % 2 === 1) {
+ return 'warning-row';
+ } else {
+ return 'success-row';
+ }
+};
+const getlistDataAPI = () => {
+ listDataAPI().then(res => {
+ helpData.value = res.data.data;
+ });
+};
+// 查看
+// const clickDetail = row => {
+// if (!row.filePath) {
+// ElMessage.warning('没有可预览的文件');
+// return;
+// }
+// fetch(row.filePath)
+// .then(response => response.blob())
+// .then(res => {
+// let blob = new Blob([res], { type: 'application/pdf' });
+// // pdfurl即转化后的结果
+// let pdfurl = window.URL.createObjectURL(blob);
+// // 新标签页打开,即可预览并下载
+// window.open(pdfurl);
+// });
+// };
+const clickDetail = val => {
+ const filePath = val.filePath;
+ if (!val.filePath) {
+ ElMessage.warning('没有可预览的文件');
+ return;
+ }
+ window.open(filePath, '_blank');
+};
+// 文件上传
+const onUploadFileBefore = (file, row) => {
+ const fileFormat = file.name?.split('.')[1];
+ if (fileFormat !== 'pdf') return ElMessage.error('请上传pdf格式的文件');
+ const formData = new FormData();
+ formData.append('file', file, file.name);
+
+ uploadFileAPI(formData).then(res => {
+ if (res.data.code === 200) {
+ const params = {
+ id: row.id,
+ filePath: res.data.data.link,
+ };
+ ElMessage.success('上传成功');
+ updataDataAPI(params);
+ } else {
+ ElMessage.error('上传失败');
+ }
+ getlistDataAPI();
+ });
+};
+onMounted(() => {
+ getlistDataAPI();
+});
+</script>
+<style lang="scss">
+.helpContainer {
+ .el-table .success-row {
+ --el-table-tr-bg-color: #fff;
+ }
+ .el-table .warning-row {
+ --el-table-tr-bg-color: #f3f6ff;
+ }
+}
+</style>
+<style scoped lang="scss">
+/* 表头样式 */
+.custom-table :deep(.el-table__header) th {
+ height: 70px;
+ font-family: Source Han Sans CN, Source Han Sans CN;
+ font-weight: bold;
+ font-size: 14px;
+ color: #49556e;
+ background-color: #f3f6ff;
+ text-align: center;
+}
+
+/* 行样式 */
+.custom-table :deep(.el-table__body) tr {
+ height: 70px;
+ font-family: Source Han Sans CN, Source Han Sans CN;
+ font-weight: 400;
+ font-size: 14px;
+ color: #363636;
+ text-align: center;
+}
+.custom-table :deep(.el-table__body) td.el-table__cell {
+ text-align: center;
+}
+.helpContainer {
+ height: 100%;
+ .look {
+ font-family: Source Han Sans CN, Source Han Sans CN;
+ color: #1c5cff;
+ cursor: pointer;
+ margin-right: 15px;
+ font-size: 14px;
+ }
+ .uploads {
+ font-family: Source Han Sans CN, Source Han Sans CN;
+ font-weight: 400;
+ font-size: 14px;
+ color: #19876d;
+ cursor: pointer;
+ }
+}
+</style>
diff --git a/src/views/system/menu.vue b/src/views/system/menu.vue
index a3e3037..a78e8d8 100644
--- a/src/views/system/menu.vue
+++ b/src/views/system/menu.vue
@@ -1,48 +1,21 @@
<template>
<basic-container>
- <avue-crud
- :option="option"
- :table-loading="loading"
- :data="data"
- ref="crud"
- v-model="form"
- :permission="permissionList"
- :before-open="beforeOpen"
- :before-close="beforeClose"
- @row-del="rowDel"
- @row-update="rowUpdate"
- @row-save="rowSave"
- @search-change="searchChange"
- @search-reset="searchReset"
- @selection-change="selectionChange"
- @current-change="currentChange"
- @size-change="sizeChange"
- @refresh-change="refreshChange"
- @on-load="onLoad"
- @tree-load="treeLoad"
- >
+ <avue-crud :option="option" :table-loading="loading" :data="data" ref="crud" v-model="form"
+ :permission="permissionList" :before-open="beforeOpen" :before-close="beforeClose" @row-del="rowDel"
+ @row-update="rowUpdate" @row-save="rowSave" @search-change="searchChange" @search-reset="searchReset"
+ @selection-change="selectionChange" @current-change="currentChange" @size-change="sizeChange"
+ @refresh-change="refreshChange" @on-load="onLoad" @tree-load="treeLoad">
<template #menu-left>
- <el-button
- type="danger"
- icon="el-icon-delete"
- v-if="permission.menu_delete"
- plain
- @click="handleDelete"
- >删 除
+ <el-button type="danger" icon="el-icon-delete" v-if="permission.menu_delete" plain @click="handleDelete">删 除
</el-button>
</template>
<template #menu="scope">
- <el-button
- type="primary"
- text
- icon="el-icon-plus"
- @click.stop="handleAdd(scope.row, scope.index)"
- v-if="userInfo.role_name.includes('admin') && scope.row.category === 1"
- >新增子项
+ <el-button type="primary" text icon="el-icon-plus" @click.stop="handleAdd(scope.row, scope.index)"
+ v-if="userInfo.role_name.includes('admin') && scope.row.category === 1">新增子项
</el-button>
</template>
<template #name="{ row }">
- <i class="namei" :class="row.source" />
+ <i class="namei" :class="row.source" />
<span>{{ row.name }}</span>
</template>
<template #source="{ row }">
@@ -55,14 +28,14 @@
</template>
<script>
-import { getLazyList, remove, update, add, getMenu } from '@/api/system/menu';
-import { mapGetters } from 'vuex';
-import iconList from '@/config/iconList';
-import func from '@/utils/func';
-import { getMenuTree } from '@/api/system/menu';
+import { getLazyList, remove, update, add, getMenu } from '@/api/system/menu'
+import { mapGetters } from 'vuex'
+import iconList from '@/config/iconList'
+import func from '@/utils/func'
+import { getMenuTree } from '@/api/system/menu'
export default {
- data() {
+ data () {
return {
form: {},
query: {},
@@ -88,6 +61,10 @@
viewBtn: true,
menuWidth: 320,
dialogClickModal: false,
+
+ height: 'auto',
+ calcHeight: 20,
+
column: [
{
label: '菜单名称',
@@ -287,110 +264,110 @@
],
},
data: [],
- };
+ }
},
watch: {
- 'form.category'() {
- const category = func.toInt(this.form.category);
+ 'form.category' () {
+ const category = func.toInt(this.form.category)
this.$refs.crud.option.column.filter(item => {
if (item.prop === 'path') {
- item.rules[0].required = category === 1;
+ item.rules[0].required = category === 1
}
if (item.prop === 'isOpen') {
- item.disabled = category === 2;
+ item.disabled = category === 2
}
- });
+ })
},
},
computed: {
...mapGetters(['userInfo', 'permission']),
- permissionList() {
+ permissionList () {
return {
addBtn: this.validData(this.permission.menu_add, false),
viewBtn: this.validData(this.permission.menu_view, false),
delBtn: this.validData(this.permission.menu_delete, false),
editBtn: this.validData(this.permission.menu_edit, false),
- };
+ }
},
- ids() {
- let ids = [];
+ ids () {
+ let ids = []
this.selectionList.forEach(ele => {
- ids.push(ele.id);
- });
- return ids.join(',');
+ ids.push(ele.id)
+ })
+ return ids.join(',')
},
},
methods: {
- initData() {
+ initData () {
getMenuTree().then(res => {
- const column = this.findObject(this.option.column, 'parentId');
- column.dicData = res.data.data;
- });
+ const column = this.findObject(this.option.column, 'parentId')
+ column.dicData = res.data.data
+ })
},
- handleAdd(row) {
- this.parentId = row.id;
- const column = this.findObject(this.option.column, 'parentId');
- column.value = row.id;
- column.addDisabled = true;
- this.$refs.crud.rowAdd();
+ handleAdd (row) {
+ this.parentId = row.id
+ const column = this.findObject(this.option.column, 'parentId')
+ column.value = row.id
+ column.addDisabled = true
+ this.$refs.crud.rowAdd()
},
- rowSave(row, done, loading) {
+ rowSave (row, done, loading) {
add(row).then(
res => {
// 获取新增数据的相关字段
- const data = res.data.data;
- row.id = data.id;
+ const data = res.data.data
+ row.id = data.id
this.$message({
type: 'success',
message: '操作成功!',
- });
+ })
// 数据回调进行刷新
- done(row);
+ done(row)
},
error => {
- window.console.log(error);
- loading();
+ window.console.log(error)
+ loading()
}
- );
+ )
},
- rowUpdate(row, index, done, loading) {
+ rowUpdate (row, index, done, loading) {
update(row).then(
() => {
this.$message({
type: 'success',
message: '操作成功!',
- });
+ })
// 数据回调进行刷新
- done(row);
+ done(row)
},
error => {
- window.console.log(error);
- loading();
+ window.console.log(error)
+ loading()
}
- );
+ )
},
- rowDel(row, index, done) {
+ rowDel (row, index, done) {
this.$confirm('确定将选择数据删除?', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning',
})
.then(() => {
- return remove(row.id);
+ return remove(row.id)
})
.then(() => {
this.$message({
type: 'success',
message: '操作成功!',
- });
+ })
// 数据回调进行刷新
- done(row);
- });
+ done(row)
+ })
},
- handleDelete() {
+ handleDelete () {
if (this.selectionList.length === 0) {
- this.$message.warning('请选择至少一条数据');
- return;
+ this.$message.warning('请选择至少一条数据')
+ return
}
this.$confirm('确定将选择数据删除?', {
confirmButtonText: '确定',
@@ -398,86 +375,86 @@
type: 'warning',
})
.then(() => {
- return remove(this.ids);
+ return remove(this.ids)
})
.then(() => {
// 刷新表格数据并重载
- this.data = [];
- this.parentId = 0;
- this.$refs.crud.refreshTable();
- this.$refs.crud.toggleSelection();
+ this.data = []
+ this.parentId = 0
+ this.$refs.crud.refreshTable()
+ this.$refs.crud.toggleSelection()
// 表格数据重载
- this.onLoad(this.page);
+ this.onLoad(this.page)
this.$message({
type: 'success',
message: '操作成功!',
- });
- });
+ })
+ })
},
- searchReset() {
- this.query = {};
- this.parentId = 0;
- this.onLoad(this.page);
+ searchReset () {
+ this.query = {}
+ this.parentId = 0
+ this.onLoad(this.page)
},
- searchChange(params, done) {
- this.query = params;
- this.parentId = '';
- this.page.currentPage = 1;
- this.onLoad(this.page, params);
- done();
+ searchChange (params, done) {
+ this.query = params
+ this.parentId = ''
+ this.page.currentPage = 1
+ this.onLoad(this.page, params)
+ done()
},
- selectionChange(list) {
- this.selectionList = list;
+ selectionChange (list) {
+ this.selectionList = list
},
- selectionClear() {
- this.selectionList = [];
- this.$refs.crud.toggleSelection();
+ selectionClear () {
+ this.selectionList = []
+ this.$refs.crud.toggleSelection()
},
- beforeOpen(done, type) {
+ beforeOpen (done, type) {
if (['add', 'edit'].includes(type)) {
- this.initData();
+ this.initData()
}
if (['edit', 'view'].includes(type)) {
getMenu(this.form.id).then(res => {
this.form = Object.assign(res.data.data, {
hasChildren: this.form.hasChildren,
- });
- });
+ })
+ })
}
- done();
+ done()
},
- beforeClose(done) {
- this.parentId = '';
- const column = this.findObject(this.option.column, 'parentId');
- column.value = '';
- column.addDisabled = false;
- done();
+ beforeClose (done) {
+ this.parentId = ''
+ const column = this.findObject(this.option.column, 'parentId')
+ column.value = ''
+ column.addDisabled = false
+ done()
},
- currentChange(currentPage) {
- this.page.currentPage = currentPage;
+ currentChange (currentPage) {
+ this.page.currentPage = currentPage
},
- sizeChange(pageSize) {
- this.page.pageSize = pageSize;
+ sizeChange (pageSize) {
+ this.page.pageSize = pageSize
},
- refreshChange() {
- this.onLoad(this.page, this.query);
+ refreshChange () {
+ this.onLoad(this.page, this.query)
},
- onLoad(page, params = {}) {
- this.loading = true;
+ onLoad (page, params = {}) {
+ this.loading = true
getLazyList(this.parentId, Object.assign(params, this.query)).then(res => {
- this.data = res.data.data;
- this.loading = false;
- this.selectionClear();
- });
+ this.data = res.data.data
+ this.loading = false
+ this.selectionClear()
+ })
},
- treeLoad(tree, treeNode, resolve) {
- const parentId = tree.id;
+ treeLoad (tree, treeNode, resolve) {
+ const parentId = tree.id
getLazyList(parentId).then(res => {
- resolve(res.data.data);
- });
+ resolve(res.data.data)
+ })
},
},
-};
+}
</script>
@@ -485,12 +462,4 @@
.namei {
margin-right: 5px;
}
- :deep(){
- .avue-crud__body{
- .el-form{
- height: 745px;
- overflow: auto;
- }
- }
- }
</style>
\ No newline at end of file
diff --git a/src/views/system/sysConfig.vue b/src/views/system/sysConfig.vue
index 193164a..7fdc560 100644
--- a/src/views/system/sysConfig.vue
+++ b/src/views/system/sysConfig.vue
@@ -1,64 +1,31 @@
<template>
<basic-container>
- <avue-crud
- :option="option"
- :table-loading="loading"
- :data="data"
- v-model:page="page"
- ref="crud"
- @row-del="rowDel"
- v-model="form"
- :permission="permissionList"
- @row-update="rowUpdate"
- @row-save="rowSave"
- :before-open="beforeOpen"
- @search-change="searchChange"
- @search-reset="searchReset"
- @selection-change="selectionChange"
- @current-change="currentChange"
- @size-change="sizeChange"
- @refresh-change="refreshChange"
- @on-load="onLoad"
- >
+ <avue-crud :option="option" :table-loading="loading" :data="data" v-model:page="page" ref="crud" @row-del="rowDel"
+ v-model="form" :permission="permissionList" @row-update="rowUpdate" @row-save="rowSave" :before-open="beforeOpen"
+ @search-change="searchChange" @search-reset="searchReset" @selection-change="selectionChange"
+ @current-change="currentChange" @size-change="sizeChange" @refresh-change="refreshChange" @on-load="onLoad">
<template #menu-left>
- <el-button
- type="primary"
- icon="el-icon-plus"
- v-if="permissionList.addBtn"
- @click="$refs.crud.rowAdd()"
- >新增</el-button>
- <el-button
- type="danger"
- plain
- icon="el-icon-delete"
- v-if="permissionList.delBtn"
- @click="handleDelete"
- >删除</el-button>
+ <el-button type="primary" icon="el-icon-plus" v-if="permissionList.addBtn"
+ @click="$refs.crud.rowAdd()">新增</el-button>
+ <el-button type="danger" plain icon="el-icon-delete" v-if="permissionList.delBtn"
+ @click="handleDelete">删除</el-button>
</template>
<template #menu="{ row, index }">
- <el-button
- type="text"
- icon="el-icon-view"
- v-if="permissionList.viewBtn"
- @click.stop="$refs.crud.rowView(row, index)"
- >查看</el-button>
- <el-button
- type="text"
- icon="el-icon-edit"
- v-if="permissionList.editBtn"
- @click.stop="$refs.crud.rowEdit(row, index)"
- >编辑</el-button>
+ <el-button type="text" icon="el-icon-view" v-if="permissionList.viewBtn"
+ @click.stop="$refs.crud.rowView(row, index)">查看</el-button>
+ <el-button type="text" icon="el-icon-edit" v-if="permissionList.editBtn"
+ @click.stop="$refs.crud.rowEdit(row, index)">编辑</el-button>
</template>
</avue-crud>
</basic-container>
</template>
<script>
-import { getList, remove, update, add, getDetail } from '@/api/system/sysConfig';
-import { mapGetters } from 'vuex';
+import { getList, remove, update, add, getDetail } from '@/api/system/sysConfig'
+import { mapGetters } from 'vuex'
export default {
- data() {
+ data () {
return {
form: {},
query: {},
@@ -85,6 +52,10 @@
excelBtn: true,
dialogClickModal: false,
grid: false,
+
+ height: 'auto',
+ calcHeight: 20,
+
column: [
{
label: '系统名称',
@@ -149,97 +120,97 @@
],
},
data: [],
- };
+ }
},
computed: {
...mapGetters(['permission']),
- permissionList() {
+ permissionList () {
return {
addBtn: this.permission.sysConfig_add,
viewBtn: this.permission.sysConfig_view,
delBtn: this.permission.sysConfig_delete,
editBtn: this.permission.sysConfig_edit,
- };
+ }
},
- ids() {
- let ids = [];
+ ids () {
+ let ids = []
this.selectionList.forEach(ele => {
- ids.push(ele.id);
- });
- return ids.join(',');
+ ids.push(ele.id)
+ })
+ return ids.join(',')
},
},
methods: {
- rowSave(row, done, loading) {
+ rowSave (row, done, loading) {
add(row).then(
() => {
- this.onLoad(this.page);
+ this.onLoad(this.page)
this.$message({
type: 'success',
message: '操作成功!',
- });
- done();
+ })
+ done()
},
error => {
- window.console.log(error);
- loading();
+ window.console.log(error)
+ loading()
}
- );
+ )
},
- rowUpdate(row, index, done, loading) {
+ rowUpdate (row, index, done, loading) {
update(row).then(
() => {
- this.onLoad(this.page);
+ this.onLoad(this.page)
this.$message({
type: 'success',
message: '操作成功!',
- });
- done();
+ })
+ done()
},
error => {
- window.console.log(error);
- loading();
+ window.console.log(error)
+ loading()
}
- );
+ )
},
- rowDel(row) {
+ rowDel (row) {
this.$confirm('确定将选择数据删除?', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning',
})
.then(() => {
- return remove(row.id);
+ return remove(row.id)
})
.then(() => {
- this.onLoad(this.page);
+ this.onLoad(this.page)
this.$message({
type: 'success',
message: '操作成功!',
- });
- });
+ })
+ })
},
- searchReset() {
- this.query = {};
- this.onLoad(this.page);
+ searchReset () {
+ this.query = {}
+ this.onLoad(this.page)
},
- searchChange(params, done) {
- this.query = params;
- this.page.currentPage = 1;
- this.onLoad(this.page, params);
- done();
+ searchChange (params, done) {
+ this.query = params
+ this.page.currentPage = 1
+ this.onLoad(this.page, params)
+ done()
},
- selectionChange(list) {
- this.selectionList = list;
+ selectionChange (list) {
+ this.selectionList = list
},
- selectionClear() {
- this.selectionList = [];
- this.$refs.crud.toggleSelection();
+ selectionClear () {
+ this.selectionList = []
+ this.$refs.crud.toggleSelection()
},
- handleDelete() {
+ handleDelete () {
if (this.selectionList.length === 0) {
- this.$message.warning('请选择至少一条数据');
- return;
+ this.$message.warning('请选择至少一条数据')
+ return
}
this.$confirm('确定将选择数据删除?', {
confirmButtonText: '确定',
@@ -247,68 +218,59 @@
type: 'warning',
})
.then(() => {
- return remove(this.ids);
+ return remove(this.ids)
})
.then(() => {
- this.onLoad(this.page);
+ this.onLoad(this.page)
this.$message({
type: 'success',
message: '操作成功!',
- });
- this.$refs.crud.toggleSelection();
- });
+ })
+ this.$refs.crud.toggleSelection()
+ })
},
- beforeOpen(done, type) {
+ beforeOpen (done, type) {
if (['edit', 'view'].includes(type)) {
getDetail(this.form.id).then(res => {
- this.form = res.data.data;
- });
+ this.form = res.data.data
+ })
}
- done();
+ done()
},
- currentChange(currentPage) {
- this.page.currentPage = currentPage;
+ currentChange (currentPage) {
+ this.page.currentPage = currentPage
},
- sizeChange(pageSize) {
- this.page.pageSize = pageSize;
+ sizeChange (pageSize) {
+ this.page.pageSize = pageSize
},
- refreshChange() {
- this.onLoad(this.page, this.query);
+ refreshChange () {
+ this.onLoad(this.page, this.query)
},
- onLoad(page, params = {}) {
- const { releaseTimeRange } = this.query;
+ onLoad (page, params = {}) {
+ const { releaseTimeRange } = this.query
let values = {
...params,
...this.query,
- };
+ }
if (releaseTimeRange) {
values = {
...values,
releaseTime_datege: releaseTimeRange[0],
releaseTime_datelt: releaseTimeRange[1],
- };
- values.releaseTimeRange = null;
+ }
+ values.releaseTimeRange = null
}
- this.loading = true;
+ this.loading = true
getList(page.currentPage, page.pageSize, values).then(res => {
- const data = res.data.data;
- this.page.total = data.total;
- this.data = data.records;
- this.loading = false;
- this.selectionClear();
- });
+ const data = res.data.data
+ this.page.total = data.total
+ this.data = data.records
+ this.loading = false
+ this.selectionClear()
+ })
},
},
-};
+}
</script>
-<style scoped lang="scss">
- :deep(){
- .avue-crud__body{
- .el-form{
- height: 745px;
- overflow: auto;
- }
- }
- }
-</style>
+<style scoped lang="scss"></style>
diff --git a/src/views/system/user.vue b/src/views/system/user.vue
index ffe6b58..09c1674 100644
--- a/src/views/system/user.vue
+++ b/src/views/system/user.vue
@@ -1,16 +1,19 @@
<template>
- <el-row>
- <el-col :span="5">
- <div class="box">
+ <div class="manage-p-all-10 manage-p-t-0 manage-h-0 manage-flex-1 manage-flex">
+ <div
+ class="manage-p-all-20 manage-flex-2 manage-h-100 manage-b-r-5 manage-box-s-b-b manage-overflow-h manage-b-c-w">
+ <div class="box ">
<el-scrollbar>
- <basic-container>
+ <div class="manage-w-100 manage-h-100">
<avue-tree :option="treeOption" :data="treeData" @node-click="nodeClick" />
- </basic-container>
+ </div>
</el-scrollbar>
</div>
- </el-col>
- <el-col :span="19">
- <basic-container>
+ </div>
+
+ <div
+ class="manage-p-all-10 manage-p-t-0 manage-p-b-0 manage-flex-9 manage-h-100 manage-flex manage-box-s-b-b manage-f-d-c">
+ <div class="manage-p-all-20 manage-h-100 manage-box-s-b-b manage-b-c-w manage-b-r-5">
<avue-crud :option="option" v-model:search="search" :table-loading="loading" :data="data" ref="crud"
v-model="form" :permission="permissionList" @row-del="rowDel" @row-update="rowUpdate" @row-save="rowSave"
:before-open="beforeOpen" v-model:page="page" @search-change="searchChange" @search-reset="searchReset"
@@ -26,8 +29,8 @@
<el-button type="primary" plain icon="el-icon-operation"
v-if="userInfo.role_name.includes('admin') && !auditMode" @click="handleAudit">审 核
</el-button>
- <el-button type="success" plain icon="el-icon-check" v-if="userInfo.role_name.includes('admin') && auditMode"
- @click="handleAuditPass">通 过
+ <el-button type="success" plain icon="el-icon-check"
+ v-if="userInfo.role_name.includes('admin') && auditMode" @click="handleAuditPass">通 过
</el-button>
<el-button type="danger" plain icon="el-icon-close" v-if="userInfo.role_name.includes('admin') && auditMode"
@click="handleAuditRefuse">拒 绝
@@ -41,8 +44,8 @@
<el-button type="info" plain v-if="permission.user_reset && !auditMode" icon="el-icon-refresh"
@click="handleReset">密码重置
</el-button>
- <el-button type="info" plain v-if="userInfo.role_name.includes('admin') && !auditMode" icon="el-icon-setting"
- @click="handlePlatform">平台配置
+ <el-button type="info" plain v-if="userInfo.role_name.includes('admin') && !auditMode"
+ icon="el-icon-setting" @click="handlePlatform">平台配置
</el-button>
<el-button type="info" plain v-if="userInfo.role_name.includes('admin') && !auditMode"
icon="el-icon-coordinate" @click="handleLock">账号解封
@@ -66,7 +69,7 @@
<template #userTypeName="{ row }">
<el-tag>{{ row.userTypeName }}</el-tag>
</template>
-
+
</avue-crud>
<el-dialog title="用户角色配置" append-to-body v-model="roleBox" width="345px">
<el-tree :data="roleGrantList" show-checkbox check-strictly default-expand-all node-key="id" ref="treeRole"
@@ -103,9 +106,9 @@
</template>
</avue-crud>
</el-dialog>
- </basic-container>
- </el-col>
- </el-row>
+ </div>
+ </div>
+ </div>
</template>
<script>
@@ -122,37 +125,37 @@
unlock,
auditPass,
auditRefuse,
-} from '@/api/system/user';
-import { exportBlob } from '@/api/common';
-import { getDeptTree, getDeptLazyTree } from '@/api/system/dept';
-import { getRoleTree } from '@/api/system/role';
-import { getPostList } from '@/api/system/post';
-import { mapGetters } from 'vuex';
-import website from '@/config/website';
-import { getToken } from '@/utils/auth';
-import { downloadXls } from '@/utils/util';
-import NProgress from 'nprogress';
-import 'nprogress/nprogress.css';
-import func from '@/utils/func';
+} from '@/api/system/user'
+import { exportBlob } from '@/api/common'
+import { getDeptTree, getDeptLazyTree } from '@/api/system/dept'
+import { getRoleTree } from '@/api/system/role'
+import { getPostList } from '@/api/system/post'
+import { mapGetters } from 'vuex'
+import website from '@/config/website'
+import { getToken } from '@/utils/auth'
+import { downloadXls } from '@/utils/util'
+import NProgress from 'nprogress'
+import 'nprogress/nprogress.css'
+import func from '@/utils/func'
export default {
- data() {
+ data () {
const validatePass = (rule, value, callback) => {
if (value === '') {
- callback(new Error('请输入密码'));
+ callback(new Error('请输入密码'))
} else {
- callback();
+ callback()
}
- };
+ }
const validatePass2 = (rule, value, callback) => {
if (value === '') {
- callback(new Error('请再次输入密码'));
+ callback(new Error('请再次输入密码'))
} else if (value !== this.form.password) {
- callback(new Error('两次输入密码不一致!'));
+ callback(new Error('两次输入密码不一致!'))
} else {
- callback();
+ callback()
}
- };
+ }
return {
form: {
flightStartTime: null, // 飞行事件开始时间
@@ -194,11 +197,11 @@
nodeKey: 'id',
lazy: true,
treeLoad: function (node, resolve) {
- const parentId = node.level === 0 ? 0 : node.data.id;
- console.log(node,666)
+ const parentId = node.level === 0 ? 0 : node.data.id
+ console.log(node, 666)
const param = {
- parentId:parentId,
- level:node.level
+ parentId: parentId,
+ level: node.level
}
getDeptLazyTree(param).then(res => {
resolve(
@@ -206,10 +209,10 @@
return {
...item,
leaf: !item.hasChildren,
- };
+ }
})
- );
- });
+ )
+ })
},
addBtn: false,
menu: false,
@@ -222,8 +225,6 @@
},
},
option: {
- // height: 'auto',
- // calcHeight: 140,
tip: false,
searchShow: true,
searchMenuSpan: 6,
@@ -234,6 +235,9 @@
viewBtn: true,
dialogType: 'drawer',
dialogClickModal: false,
+
+ height: 'auto',
+ calcHeight: 20,
column: [
{
label: '登录账号',
@@ -367,7 +371,7 @@
viewDisplay: false,
rules: [{ required: true, validator: validatePass2, trigger: 'blur' }],
},
-
+
],
},
{
@@ -501,32 +505,32 @@
},
],
},
-
+
],
},
- {
+ {
label: '登录限制',
prop: '',
icon: 'el-icon-s-custom',
column: [
- {
+ {
label: '到期时间',
prop: 'expireTime',
type: 'datetime',
format: 'YYYY-MM-DD HH:mm:ss',
valueFormat: 'YYYY-MM-DD HH:mm:ss',
},
- {
+ {
label: '次数限制',
prop: 'maxLoginNum',
type: 'input',
},
- {
+ {
label: '飞行开始时间',
prop: 'flightStartTime',
- type: 'time',
- format: 'HH:mm',
+ type: 'time',
+ format: 'HH:mm',
valueFormat: 'HH:mm',
rules: [
{
@@ -550,9 +554,9 @@
},
],
},
-
-
-
+
+
+
],
},
],
@@ -683,206 +687,206 @@
},
],
},
- };
+ }
},
watch: {
- 'form.tenantId'() {
+ 'form.tenantId' () {
if (this.form.tenantId !== '' && this.initFlag) {
- this.initData(this.form.tenantId);
+ this.initData(this.form.tenantId)
}
},
- 'excelForm.isCovered'() {
+ 'excelForm.isCovered' () {
if (this.excelForm.isCovered !== '') {
- const column = this.findObject(this.excelOption.column, 'excelFile');
- column.action = `/blade-system/user/import-user?isCovered=${this.excelForm.isCovered}`;
+ const column = this.findObject(this.excelOption.column, 'excelFile')
+ column.action = `/blade-system/user/import-user?isCovered=${this.excelForm.isCovered}`
}
},
},
computed: {
...mapGetters(['userInfo', 'permission']),
- permissionList() {
+ permissionList () {
return {
addBtn: this.validData(this.permission.user_add, false),
viewBtn: this.validData(this.permission.user_view, false),
delBtn: this.validData(this.permission.user_delete, false),
editBtn: this.validData(this.permission.user_edit, false),
- };
+ }
},
- platformPermissionList() {
+ platformPermissionList () {
return {
addBtn: false,
viewBtn: false,
delBtn: false,
editBtn: this.validData(this.permission.user_edit, false),
- };
+ }
},
- ids() {
- let ids = [];
+ ids () {
+ let ids = []
this.selectionList.forEach(ele => {
- ids.push(ele.id);
- });
- return ids.join(',');
+ ids.push(ele.id)
+ })
+ return ids.join(',')
},
},
- mounted() {
+ mounted () {
// 非租户模式默认加载管理组数据
if (!website.tenantMode) {
- this.initData(website.tenantId);
+ this.initData(website.tenantId)
}
- this.initData(this.form.tenantId);
+ this.initData(this.form.tenantId)
},
methods: {
- nodeClick(data) {
- this.treeDeptId = data.id;
- this.page.currentPage = 1;
- this.onLoad(this.page);
+ nodeClick (data) {
+ this.treeDeptId = data.id
+ this.page.currentPage = 1
+ this.onLoad(this.page)
},
- initData(tenantId) {
- tenantId = '000000';
+ initData (tenantId) {
+ tenantId = '000000'
getRoleTree(tenantId).then(res => {
- const column = this.findObject(this.option.group, 'roleId');
- column.dicData = res.data.data;
- });
+ const column = this.findObject(this.option.group, 'roleId')
+ column.dicData = res.data.data
+ })
getDeptTree(tenantId).then(res => {
- const column = this.findObject(this.option.group, 'deptId');
- column.dicData = res.data.data;
- });
+ const column = this.findObject(this.option.group, 'deptId')
+ column.dicData = res.data.data
+ })
// getPostList(tenantId).then(res => {
// const column = this.findObject(this.option.group, 'postId');
// column.dicData = res.data.data;
// });
},
- submitRole() {
- const roleList = this.$refs.treeRole.getCheckedKeys().join(',');
+ submitRole () {
+ const roleList = this.$refs.treeRole.getCheckedKeys().join(',')
grant(this.ids, roleList).then(() => {
- this.roleBox = false;
+ this.roleBox = false
this.$message({
type: 'success',
message: '操作成功!',
- });
- this.onLoad(this.page);
- });
+ })
+ this.onLoad(this.page)
+ })
},
- rowSave(row, done, loading) {
+ rowSave (row, done, loading) {
// 格式化时间数据
-
- if (row.flightStartTime && row.flightEndTime) {
- // 验证 flightEndTime 是否小于 flightStartTime
- const [startHours, startMinutes] = row.flightStartTime.split(':').map(Number);
- const [endHours, endMinutes] = row.flightEndTime.split(':').map(Number);
- const startTotalMinutes = startHours * 60 + startMinutes;
- const endTotalMinutes = endHours * 60 + endMinutes;
+ if (row.flightStartTime && row.flightEndTime) {
+ // 验证 flightEndTime 是否小于 flightStartTime
+ const [startHours, startMinutes] = row.flightStartTime.split(':').map(Number)
+ const [endHours, endMinutes] = row.flightEndTime.split(':').map(Number)
- if (endTotalMinutes < startTotalMinutes) {
- this.$message.error('飞行结束时间不能小于飞行开始时间');
- loading();
- return;
- }
- }
-
- row.deptId = func.join(row.deptId);
- row.roleId = func.join(row.roleId);
- row.postId = func.join(row.postId);
+ const startTotalMinutes = startHours * 60 + startMinutes
+ const endTotalMinutes = endHours * 60 + endMinutes
+
+ if (endTotalMinutes < startTotalMinutes) {
+ this.$message.error('飞行结束时间不能小于飞行开始时间')
+ loading()
+ return
+ }
+ }
+
+ row.deptId = func.join(row.deptId)
+ row.roleId = func.join(row.roleId)
+ row.postId = func.join(row.postId)
row.name = row.realName
add(row).then(
() => {
- this.initFlag = false;
- this.onLoad(this.page);
+ this.initFlag = false
+ this.onLoad(this.page)
this.$message({
type: 'success',
message: '操作成功!',
- });
- done();
+ })
+ done()
},
error => {
- window.console.log(error);
- loading();
+ window.console.log(error)
+ loading()
}
- );
+ )
},
- rowUpdate(row, index, done, loading) {
- // 格式化时间数据
+ rowUpdate (row, index, done, loading) {
+ // 格式化时间数据
// if (row.flightStartTime) {
// row.flightStartTime = this.formatTime(row.flightStartTime);
// }
// if (row.flightEndTime) {
// row.flightEndTime = this.formatTime(row.flightEndTime);
// }
- if (row.flightStartTime && row.flightEndTime) {
- // 验证 flightEndTime 是否小于 flightStartTime
- const [startHours, startMinutes] = row.flightStartTime.split(':').map(Number);
- const [endHours, endMinutes] = row.flightEndTime.split(':').map(Number);
+ if (row.flightStartTime && row.flightEndTime) {
+ // 验证 flightEndTime 是否小于 flightStartTime
+ const [startHours, startMinutes] = row.flightStartTime.split(':').map(Number)
+ const [endHours, endMinutes] = row.flightEndTime.split(':').map(Number)
- const startTotalMinutes = startHours * 60 + startMinutes;
- const endTotalMinutes = endHours * 60 + endMinutes;
+ const startTotalMinutes = startHours * 60 + startMinutes
+ const endTotalMinutes = endHours * 60 + endMinutes
- if (endTotalMinutes < startTotalMinutes) {
- this.$message.error('飞行结束时间不能小于飞行开始时间');
- loading();
- return ;
+ if (endTotalMinutes < startTotalMinutes) {
+ this.$message.error('飞行结束时间不能小于飞行开始时间')
+ loading()
+ return
+ }
}
- }
-
- row.deptId = func.join(row.deptId);
- row.roleId = func.join(row.roleId);
- row.postId = func.join(row.postId);
+
+ row.deptId = func.join(row.deptId)
+ row.roleId = func.join(row.roleId)
+ row.postId = func.join(row.postId)
row.name = row.realName
update(row).then(
() => {
- this.initFlag = false;
- this.onLoad(this.page);
+ this.initFlag = false
+ this.onLoad(this.page)
this.$message({
type: 'success',
message: '操作成功!',
- });
- done();
+ })
+ done()
},
error => {
- window.console.log(error);
- loading();
+ window.console.log(error)
+ loading()
}
- );
+ )
},
- rowDel(row) {
+ rowDel (row) {
this.$confirm('确定将选择数据删除?', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning',
})
.then(() => {
- return remove(row.id);
+ return remove(row.id)
})
.then(() => {
- this.onLoad(this.page);
+ this.onLoad(this.page)
this.$message({
type: 'success',
message: '操作成功!',
- });
- });
+ })
+ })
},
- searchReset() {
- this.query = {};
- this.treeDeptId = '';
- this.onLoad(this.page);
+ searchReset () {
+ this.query = {}
+ this.treeDeptId = ''
+ this.onLoad(this.page)
},
- searchChange(params, done) {
- this.query = params;
- this.page.currentPage = 1;
- this.onLoad(this.page, params);
- done();
+ searchChange (params, done) {
+ this.query = params
+ this.page.currentPage = 1
+ this.onLoad(this.page, params)
+ done()
},
- selectionChange(list) {
- this.selectionList = list;
+ selectionChange (list) {
+ this.selectionList = list
},
- selectionClear() {
- this.selectionList = [];
- this.$refs.crud.toggleSelection();
+ selectionClear () {
+ this.selectionList = []
+ this.$refs.crud.toggleSelection()
},
- handleDelete() {
+ handleDelete () {
if (this.selectionList.length === 0) {
- this.$message.warning('请选择至少一条数据');
- return;
+ this.$message.warning('请选择至少一条数据')
+ return
}
this.$confirm('确定将选择数据删除?', {
confirmButtonText: '确定',
@@ -890,25 +894,25 @@
type: 'warning',
})
.then(() => {
- return remove(this.ids);
+ return remove(this.ids)
})
.then(() => {
- this.onLoad(this.page);
+ this.onLoad(this.page)
this.$message({
type: 'success',
message: '操作成功!',
- });
- this.$refs.crud.toggleSelection();
- });
+ })
+ this.$refs.crud.toggleSelection()
+ })
},
- handleAudit() {
- this.auditMode = true;
- this.onLoad(this.page, this.query);
+ handleAudit () {
+ this.auditMode = true
+ this.onLoad(this.page, this.query)
},
- handleAuditPass() {
+ handleAuditPass () {
if (this.selectionList.length === 0) {
- this.$message.warning('请选择至少一条数据');
- return;
+ this.$message.warning('请选择至少一条数据')
+ return
}
this.$confirm('确定将选择数据通过审核?', {
confirmButtonText: '确定',
@@ -916,21 +920,21 @@
type: 'warning',
})
.then(() => {
- return auditPass(this.ids);
+ return auditPass(this.ids)
})
.then(() => {
- this.onLoad(this.page);
+ this.onLoad(this.page)
this.$message({
type: 'success',
message: '操作成功!',
- });
- this.$refs.crud.toggleSelection();
- });
+ })
+ this.$refs.crud.toggleSelection()
+ })
},
- handleAuditRefuse() {
+ handleAuditRefuse () {
if (this.selectionList.length === 0) {
- this.$message.warning('请选择至少一条数据');
- return;
+ this.$message.warning('请选择至少一条数据')
+ return
}
this.$confirm('确定将选择数据拒绝审核?', {
confirmButtonText: '确定',
@@ -938,25 +942,25 @@
type: 'warning',
})
.then(() => {
- return auditRefuse(this.ids);
+ return auditRefuse(this.ids)
})
.then(() => {
- this.onLoad(this.page);
+ this.onLoad(this.page)
this.$message({
type: 'success',
message: '操作成功!',
- });
- this.$refs.crud.toggleSelection();
- });
+ })
+ this.$refs.crud.toggleSelection()
+ })
},
- handleAuditBack() {
- this.auditMode = false;
- this.onLoad(this.page, this.query);
+ handleAuditBack () {
+ this.auditMode = false
+ this.onLoad(this.page, this.query)
},
- handleReset() {
+ handleReset () {
if (this.selectionList.length === 0) {
- this.$message.warning('请选择至少一条数据');
- return;
+ this.$message.warning('请选择至少一条数据')
+ return
}
this.$confirm('确定将选择账号密码重置为123456?', {
confirmButtonText: '确定',
@@ -964,37 +968,37 @@
type: 'warning',
})
.then(() => {
- return resetPassword(this.ids);
+ return resetPassword(this.ids)
})
.then(() => {
this.$message({
type: 'success',
message: '操作成功!',
- });
- this.$refs.crud.toggleSelection();
- });
+ })
+ this.$refs.crud.toggleSelection()
+ })
},
- handleGrant() {
+ handleGrant () {
if (this.selectionList.length === 0) {
- this.$message.warning('请选择至少一条数据');
- return;
+ this.$message.warning('请选择至少一条数据')
+ return
}
- this.roleTreeObj = [];
+ this.roleTreeObj = []
if (this.selectionList.length === 1) {
- this.roleTreeObj = this.selectionList[0].roleId.split(',');
+ this.roleTreeObj = this.selectionList[0].roleId.split(',')
}
getRoleTree().then(res => {
- this.roleGrantList = res.data.data;
- this.roleBox = true;
- });
+ this.roleGrantList = res.data.data
+ this.roleBox = true
+ })
},
- handlePlatform() {
- this.platformBox = true;
+ handlePlatform () {
+ this.platformBox = true
},
- handleLock() {
+ handleLock () {
if (this.selectionList.length === 0) {
- this.$message.warning('请选择至少一条数据');
- return;
+ this.$message.warning('请选择至少一条数据')
+ return
}
this.$confirm('确定将选择账号解封?', {
confirmButtonText: '确定',
@@ -1002,180 +1006,178 @@
type: 'warning',
})
.then(() => {
- return unlock(this.ids);
+ return unlock(this.ids)
})
.then(() => {
this.$message({
type: 'success',
message: '操作成功!',
- });
- });
+ })
+ })
},
- handleImport() {
- this.excelBox = true;
+ handleImport () {
+ this.excelBox = true
},
- uploadAfter(res, done, loading, column) {
- window.console.log(column);
- this.excelBox = false;
- this.refreshChange();
- done();
+ uploadAfter (res, done, loading, column) {
+ window.console.log(column)
+ this.excelBox = false
+ this.refreshChange()
+ done()
},
- handleExport() {
- const account = func.toStr(this.search.account);
- const realName = func.toStr(this.search.realName);
+ handleExport () {
+ const account = func.toStr(this.search.account)
+ const realName = func.toStr(this.search.realName)
this.$confirm('是否导出用户数据?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning',
}).then(() => {
- NProgress.start();
+ NProgress.start()
exportBlob(
`/blade-system/user/export-user?${this.website.tokenHeader
}=${getToken()}&account=${account}&realName=${realName}`
).then(res => {
- downloadXls(res.data, `用户数据表${this.$dayjs().format('YYYY-MM-DD')}.xlsx`);
- NProgress.done();
- });
- });
+ downloadXls(res.data, `用户数据表${this.$dayjs().format('YYYY-MM-DD')}.xlsx`)
+ NProgress.done()
+ })
+ })
},
- handleTemplate() {
+ handleTemplate () {
exportBlob(
`/blade-system/user/export-template?${this.website.tokenHeader}=${getToken()}`
).then(res => {
- downloadXls(res.data, '用户数据模板.xlsx');
- });
+ downloadXls(res.data, '用户数据模板.xlsx')
+ })
},
- beforeOpen(done, type) {
+ beforeOpen (done, type) {
if (['edit', 'view'].includes(type)) {
getUser(this.form.id).then(res => {
- this.form = res.data.data;
+ this.form = res.data.data
if (this.form.hasOwnProperty('deptId')) {
- this.form.deptId = func.split(this.form.deptId);
+ this.form.deptId = func.split(this.form.deptId)
}
if (this.form.hasOwnProperty('roleId')) {
- this.form.roleId = func.split(this.form.roleId);
+ this.form.roleId = func.split(this.form.roleId)
}
if (this.form.hasOwnProperty('postId')) {
- this.form.postId = func.split(this.form.postId);
+ this.form.postId = func.split(this.form.postId)
}
- });
+ })
}
- this.initFlag = true;
- done();
+ this.initFlag = true
+ done()
},
- currentChange(currentPage) {
- this.page.currentPage = currentPage;
+ currentChange (currentPage) {
+ this.page.currentPage = currentPage
},
- sizeChange(pageSize) {
- this.page.pageSize = pageSize;
+ sizeChange (pageSize) {
+ this.page.pageSize = pageSize
},
- refreshChange() {
- this.onLoad(this.page, this.query);
+ refreshChange () {
+ this.onLoad(this.page, this.query)
},
- onLoad(page, params = {}) {
- this.loading = true;
+ onLoad (page, params = {}) {
+ this.loading = true
getList(
page.currentPage,
page.pageSize,
Object.assign(params, this.query, { status: this.auditMode ? 0 : 1 }),
this.treeDeptId
).then(res => {
- const data = res.data.data;
- this.page.total = data.total;
- this.data = data.records;
- this.loading = false;
- this.selectionClear();
- });
+ const data = res.data.data
+ this.page.total = data.total
+ this.data = data.records
+ this.loading = false
+ this.selectionClear()
+ })
},
- platformRowUpdate(row, index, done, loading) {
+ platformRowUpdate (row, index, done, loading) {
updatePlatform(row.id, row.userType, row.userExt).then(
() => {
- this.platformOnLoad(this.platformPage);
+ this.platformOnLoad(this.platformPage)
this.$message({
type: 'success',
message: '操作成功!',
- });
- done();
+ })
+ done()
},
error => {
- window.console.log(error);
- loading();
+ window.console.log(error)
+ loading()
}
- );
+ )
},
- platformBeforeOpen(done, type) {
+ platformBeforeOpen (done, type) {
if (['edit', 'view'].includes(type)) {
getUserPlatform(this.platformForm.id).then(res => {
- this.platformForm = res.data.data;
- });
+ this.platformForm = res.data.data
+ })
}
- done();
+ done()
},
- platformSearchReset() {
- this.platformQuery = {};
- this.platformOnLoad(this.platformPage);
+ platformSearchReset () {
+ this.platformQuery = {}
+ this.platformOnLoad(this.platformPage)
},
- platformSearchChange(params, done) {
- this.platformQuery = params;
- this.platformPage.currentPage = 1;
- this.platformOnLoad(this.platformPage, params);
- done();
+ platformSearchChange (params, done) {
+ this.platformQuery = params
+ this.platformPage.currentPage = 1
+ this.platformOnLoad(this.platformPage, params)
+ done()
},
- platformSelectionChange(list) {
- this.platformSelectionList = list;
+ platformSelectionChange (list) {
+ this.platformSelectionList = list
},
- platformSelectionClear() {
- this.platformSelectionList = [];
- this.$refs.platformCrud.toggleSelection();
+ platformSelectionClear () {
+ this.platformSelectionList = []
+ this.$refs.platformCrud.toggleSelection()
},
- platformCurrentChange(currentPage) {
- this.platformPage.currentPage = currentPage;
+ platformCurrentChange (currentPage) {
+ this.platformPage.currentPage = currentPage
},
- platformSizeChange(pageSize) {
- this.platformPage.pageSize = pageSize;
+ platformSizeChange (pageSize) {
+ this.platformPage.pageSize = pageSize
},
- platformRefreshChange() {
- this.platformOnLoad(this.platformPage, this.platformQuery);
+ platformRefreshChange () {
+ this.platformOnLoad(this.platformPage, this.platformQuery)
},
- platformOnLoad(page, params = {}) {
- this.platformLoading = true;
+ platformOnLoad (page, params = {}) {
+ this.platformLoading = true
getList(
page.currentPage,
page.pageSize,
Object.assign(params, this.query),
this.treeDeptId
).then(res => {
- const data = res.data.data;
- this.platformPage.total = data.total;
- this.platformData = data.records;
- this.platformLoading = false;
- this.selectionClear();
- });
+ const data = res.data.data
+ this.platformPage.total = data.total
+ this.platformData = data.records
+ this.platformLoading = false
+ this.selectionClear()
+ })
},
- formatTime(time) {
+ formatTime (time) {
// 格式化时间为 HH:mm
- const date = new Date(time);
- const hours = String(date.getHours()).padStart(2, '0');
- const minutes = String(date.getMinutes()).padStart(2, '0');
- return `${hours}:${minutes}`;
+ const date = new Date(time)
+ const hours = String(date.getHours()).padStart(2, '0')
+ const minutes = String(date.getMinutes()).padStart(2, '0')
+ return `${hours}:${minutes}`
},
},
-};
+}
</script>
-<style lang="scss">
+<style lang="scss" scoped>
.box {
- height: 800px;
-}
-
-.el-scrollbar {
height: 100%;
}
-.box .el-scrollbar__wrap {
- overflow: scroll;
+::v-deep(.el-scrollbar) {
+ height: 100%;
+
+ .el-scrollbar__wrap {
+ overflow: auto;
+ }
}
-
-
</style>
diff --git a/src/views/system/userinfo.vue b/src/views/system/userinfo.vue
index 9d39e51..acef2d7 100644
--- a/src/views/system/userinfo.vue
+++ b/src/views/system/userinfo.vue
@@ -111,7 +111,9 @@
<!-- 密钥上传 -->
<div class="upload-file" v-else-if="checked === 2">
<img v-if="isSuccess === 'success'" :src="uploadSuccess" alt="" />
+ <div v-if="isSuccess === 'success'">上传成功</div>
<img v-if="isSuccess === 'error'" :src="uploadError" alt="" />
+ <div v-if="isSuccess === 'error'">上传失败</div>
<el-upload
action="/upload"
accept=".lic"
@@ -419,12 +421,17 @@
.upload-btn {
width: 93px;
height: 38px;
- line-height: 38px;
- background: #1b3e6c;
+ background: #DDEBFF;
border-radius: 8px 8px 8px 8px;
- border: 1px solid #ffffff;
- color: #fff;
+ border: 1px solid #409EFF;
text-align: center;
+ font-family: Source Han Sans CN, Source Han Sans CN;
+ font-weight: bold;
+ font-size: 14px;
+ color: #228CFA;
+ line-height: 38px;
+ text-align: center;
+ margin-top: 10px;
}
.password-time {
margin-top: 50px;
diff --git a/src/views/tickets/orderLog.vue b/src/views/tickets/orderLog.vue
index fab04ab..514e6dd 100644
--- a/src/views/tickets/orderLog.vue
+++ b/src/views/tickets/orderLog.vue
@@ -4,15 +4,15 @@
* @LastEditors: shuishen 1109946754@qq.com
* @LastEditTime: 2025-04-28 11:38:16
* @FilePath: \drone-web-manage\src\views\tickets\orderLog.vue
- * @Description:
- *
- * Copyright (c) 2025 by shuishen, All Rights Reserved.
+ * @Description:
+ *
+ * Copyright (c) 2025 by shuishen, All Rights Reserved.
-->
<template>
<basic-container>
<el-tabs v-model="activeTab" @tab-click="handleTabChange">
<el-tab-pane v-for="tab in filteredTabs" :key="tab.name" :label="`${tab.label} (${tab.count})`" :name="tab.name">
- <div class="tab-content">
+ <basic-main-content>
<!-- 查询条件筛选栏 -->
<div class="filter-bar">
<div class="search-bar-box">
@@ -92,7 +92,7 @@
<!-- 表格部分 -->
<avue-crud :data="tableData" :option="option" v-model:page="page" ref="crud" :table-loading="loading"
@current-change="currentChange" @refresh-change="refreshChange" @on-load="onLoad"
- @search-change="searchChange" @size-change="sizeChange">
+ @search-change="searchChange" @size-change="sizeChange" v-if="activeTab === tab.name">
<template #menu-left>
<el-button v-if="hasAddBtnPermission() && activeTab != 'WAIT_AUDIT'" type="primary" icon="el-icon-plus"
@click="handleAdd">新建工单</el-button>
@@ -111,7 +111,9 @@
" -->
<template v-if="row.status == 1">
<!--待审核状态-->
- <el-button type="text" icon="el-icon-warning" @click="orderLogRecall(row.id)">撤回</el-button>
+ <el-button type="text" icon="el-icon-warning" v-if="hasRecallPaddingBtnPermission()"
+ @click="orderLogRecall(row.id)">撤回</el-button>
+ <el-button type="text" icon="el-icon-view" @click="handleViewDetail(row)">详情</el-button>
</template>
<!--已驳回-->
<template v-if="row.status == 2">
@@ -139,7 +141,7 @@
</el-tooltip>
</template>
</avue-crud>
- </div>
+ </basic-main-content>
</el-tab-pane>
</el-tabs>
@@ -341,7 +343,7 @@
<!-- <el-button type="primary" v-if="form.status == 0 || userInfo.user_id == form.create_user"
@click="submitForm(0)">保存</el-button> -->
- <el-button type="primary" v-if="form.status == 1 && this.permission.orderLogpass"
+ <el-button type="primary" v-if="form.status == 1 && hasPaddingBtnPermission()"
@click="orderLogPass(form.id)">通过</el-button>
<el-button type="danger" v-if="form.status == 1 && hasRejectionBtnPermission()"
@click="orderLogReject(form.id)">驳回</el-button>
@@ -465,7 +467,7 @@
<!-- <el-button type="primary" v-if="form.status == 0 || userInfo.user_id == form.create_user"
@click="submitForm(0)">保存</el-button> -->
- <el-button type="primary" v-if="form.status == 1 && this.permission.orderLogpass"
+ <el-button type="primary" v-if="form.status == 1 && hasPaddingBtnPermission()"
@click="orderLogPass(form.id)">通过</el-button>
<el-button type="danger" v-if="form.status == 1 && hasRejectionBtnPermission()"
@click="orderLogReject(form.id)">驳回</el-button>
@@ -566,20 +568,60 @@
menu: true,
menuWidth: 210,
menuClassName: 'cur-menu',
- column: [
- { label: '工单编号', prop: 'job_info_num', width: 100, ellipsis: true, overHidden: true },
- { label: '工单名称', prop: 'name', width: 100, ellipsis: true, overHidden: true },
- { label: '工单状态', prop: 'status', width: 88 },
- { label: '所属单位', prop: 'dept_name', width: 100, ellipsis: true },
- { label: '发起时间', prop: 'create_time', width: 144, ellipsis: true },
- { label: '已执行次数', prop: 'job_num', width: 96, ellipsis: true },
- { label: '工单内容', prop: 'content', ellipsis: true, overHidden: true },
- { label: '关联航线', prop: 'wayline_name', width: 100, ellipsis: true, overHidden: true },
- { label: '关联算法', prop: 'ai_type_str', width: 100, ellipsis: true, overHidden: true },
- { label: '关联机巢', prop: 'device_names', width: 100, ellipsis: true, overHidden: true },
- { label: '创建人', prop: 'creator_name', width: 96, ellipsis: true, overHidden: true },
- { label: '关联机巢', prop: 'device_names', width: 112, ellipsis: true, overHidden: true },
+ height: 'auto',
+ calcHeight: 196,
+
+ column: [
+ {
+ label: '工单编号', prop: 'job_info_num', width: 100, ellipsis: true, overHidden: true,
+ showOverflowTooltip: true,
+ },
+ {
+ label: '工单名称', prop: 'name', width: 100, ellipsis: true, overHidden: true,
+ showOverflowTooltip: true,
+ },
+ {
+ label: '工单状态', prop: 'status', width: 88,
+ showOverflowTooltip: true,
+ },
+ {
+ label: '所属单位', prop: 'dept_name', width: 100, ellipsis: true,
+ showOverflowTooltip: true,
+ },
+ {
+ label: '发起时间', prop: 'create_time', width: 144, ellipsis: true,
+ showOverflowTooltip: true,
+ },
+ {
+ label: '已执行次数', prop: 'job_num', width: 96, ellipsis: true,
+ showOverflowTooltip: true,
+ },
+ {
+ label: '工单内容', prop: 'content', ellipsis: true, overHidden: true,
+ showOverflowTooltip: true,
+ },
+ {
+ label: '关联航线', prop: 'wayline_name', width: 100, ellipsis: true, overHidden: true,
+ showOverflowTooltip: true,
+ },
+ {
+ label: '关联算法', prop: 'ai_type_str', width: 100, ellipsis: true, overHidden: true,
+ showOverflowTooltip: true,
+ },
+ {
+ label: '关联机巢', prop: 'device_names', width: 100, ellipsis: true, overHidden: true,
+ showOverflowTooltip: true,
+ },
+
+ {
+ label: '创建人', prop: 'creator_name', width: 96, ellipsis: true, overHidden: true,
+ showOverflowTooltip: true,
+ },
+ {
+ label: '关联机巢', prop: 'device_names', width: 112, ellipsis: true, overHidden: true,
+ showOverflowTooltip: true,
+ },
{
label: '工单周期频次',
prop: '',
@@ -587,6 +629,7 @@
formatter: row => this.formatCycleTime(row),
html: true,
ellipsis: true,
+ showOverflowTooltip: true,
// overHidden: true
},
],
@@ -1083,7 +1126,7 @@
//按照航线来
const params = {
- type: currentLine.wayline_type,
+ type: [2, 4, 5].includes(currentLine.wayline_type) ? 2 : 0,
wayline_id: waylineId,
polygon
}
@@ -1114,6 +1157,9 @@
let data = response.data.data
this.$message.success('审核通过')
this.detailVisibleCopy = false
+
+ this.page.currentPage = 1
+ this.onLoad(this.page, this.query)
},
/**
* 驳回
@@ -1125,8 +1171,11 @@
}).then(async ({ value }) => {
let response = await orderLogReject(id, value)
let data = response.data.data
- this.$message.success('驳回成果')
+ this.$message.success('驳回成功')
this.detailVisibleCopy = false
+
+ this.page.currentPage = 1
+ this.onLoad(this.page, this.query)
})
},
},
@@ -1143,42 +1192,32 @@
</script>
<style lang="scss" scoped>
-:deep() {
- .avue-crud__body {
- .el-form {
- height: 625px;
- overflow: auto;
+::v-deep(.el-tabs) {
+ height: 100%;
+ display: flex;
+ flex-direction: column;
+
+ .el-tabs__header {
+ order: 1;
+ }
+
+ .el-tabs__content {
+ order: 2;
+ }
+
+ .el-tabs__content {
+ height: 0;
+ flex: 1;
+ display: flex;
+ flex-direction: column;
+
+ .el-tab-pane {
+ height: 0;
+ flex: 1;
+ display: flex;
+ flex-direction: column;
}
}
-}
-
-:deep(.el-pagination .el-select) {
- width: 128px !important;
-}
-
-.step-timer {
- position: absolute;
- left: 80%;
- top: 50%;
- transform: translateY(-50%);
- width: 100px;
- margin-left: 4px;
- color: #666;
- font-size: 12px;
-}
-
-:deep(.el-textarea__inner) {
- padding: 8px 12px;
-}
-
-:deep(.el-input__inner),
-:deep(.el-select),
-:deep(.el-select .el-input) {
- width: 100%; // 确保所有输入框和选择框宽度一致
-}
-
-.tab-content {
- padding: 10px;
}
.filter-bar {
@@ -1211,6 +1250,31 @@
}
}
+:deep(.el-pagination .el-select) {
+ width: 128px !important;
+}
+
+.step-timer {
+ position: absolute;
+ left: 80%;
+ top: 50%;
+ transform: translateY(-50%);
+ width: 100px;
+ margin-left: 4px;
+ color: #666;
+ font-size: 12px;
+}
+
+:deep(.el-textarea__inner) {
+ padding: 8px 12px;
+}
+
+:deep(.el-input__inner),
+:deep(.el-select),
+:deep(.el-select .el-input) {
+ width: 100%; // 确保所有输入框和选择框宽度一致
+}
+
.action-bar {
margin-bottom: 16px;
}
@@ -1218,25 +1282,6 @@
.el-tabs {
:deep(.el-tabs__content) {
overflow: visible;
- }
-}
-
-.tab-content {
- min-height: 200px;
-}
-
-.detail-form {
- :deep(.el-form-item) {
- margin-bottom: 10px;
- }
-
- :deep(.el-form-item__label) {
- color: #606266;
- font-weight: normal;
- }
-
- :deep(.el-form-item__content) {
- color: #303133;
}
}
@@ -1328,12 +1373,9 @@
&> ::v-deep(.el-button) {
flex: 1;
- max-width: 44px;
+ margin-left: 0;
margin-right: 10px;
- &:nth-child(4n) {
- margin-left: 0;
- }
}
}
}
diff --git a/src/views/tickets/ticket.vue b/src/views/tickets/ticket.vue
index cf827b8..8f0b377 100644
--- a/src/views/tickets/ticket.vue
+++ b/src/views/tickets/ticket.vue
@@ -2,7 +2,7 @@
<basic-container>
<el-tabs v-model="activeTab" @tab-click="handleTabChange">
<el-tab-pane v-for="tab in filteredTabs" :key="tab.name" :label="`${tab.label} (${tab.count})`" :name="tab.name">
- <div class="tab-content">
+ <basic-main-content>
<!-- 查询条件筛选栏 -->
<div class="filter-bar">
<el-input v-model="filters.keyword" placeholder="请输入关键字" class="filter-item" clearable
@@ -33,7 +33,7 @@
<!-- 表格部分 -->
<avue-crud ref="avueCrud" v-model="tableData" :option="option" :data="tableData" v-model:page="page"
@size-change="sizeChange" @current-change="handleCurrentChange" :table-loading="loading"
- @selection-change="handleSelectionChange" :permission="permissionList">
+ @selection-change="handleSelectionChange" :permission="permissionList" v-if="activeTab === tab.name">
<template #menu-left>
<el-button v-if="(activeTab === 'all' || activeTab === 'myTickets') && permissionList.addBtn"
type="primary" icon="el-icon-plus" @click="handleAdd">新建工单</el-button>
@@ -53,8 +53,11 @@
<el-button type="text" icon="el-icon-view" @click="handleViewDetail(row)">详情</el-button>
</template>
- <el-button v-if="row.status === 4 && row.isReview !== 1" type="text" icon="el-icon-check"
- @click="reCheck(row)">复核</el-button>
+ <template v-if="permission.tickets_repeat_review">
+ <el-button v-if="row.status === 4 && row.isReview !== 1" type="text" icon="el-icon-check"
+ @click="reCheck(row)">复核</el-button>
+ </template>
+
</template>
<template #status="{ row }">
<span :style="getStatusTagType(row.status) ? 'color:' + getStatusTagType(row.status) : ''">
@@ -69,12 +72,13 @@
<span>{{ showIsReviewText(row) }}</span>
</template>
</avue-crud>
- </div>
+ </basic-main-content>
</el-tab-pane>
</el-tabs>
<!-- 新建工单对话框 -->
- <el-dialog v-model="dialogVisible" title="新建工单" width="70%" :close-on-click-modal="false" @close="resetForm">
+ <el-dialog v-model="dialogVisible" v-if="dialogVisible" title="新建工单" width="70%" :close-on-click-modal="false"
+ @close="resetForm">
<el-form :model="form" :rules="rules" ref="form" label-width="90px" class="create-ticket-form">
<div class="form-section">
<el-row :gutter="16">
@@ -146,11 +150,15 @@
<el-form-item label="附件图片" prop="photos" required class="upload-wrapper">
<el-upload ref="upload" :action="'#'" :auto-upload="false" list-type="picture-card"
:on-change="handleFileChange" :on-remove="handleUploadRemove" :before-upload="beforeUpload"
- :file-list="form.photos" :limit="1" accept="image/*" class="create-upload">
+ :file-list="popupShowImage(form.photos)" :limit="1" accept="image/*" class="create-upload">
<template v-if="form.photos.length < 1">
- <i class="el-icon-plus">+</i>
+ <!-- <i class="el-icon-plus">+</i> -->
+ <div class="el-icon-plus">
+ <span>+</span>
+ </div>
</template>
</el-upload>
+
<div class="upload-tip">需上传含有地址信息的照片(jpg、jpeg、png),且不超过5M</div>
</el-form-item>
</el-col>
@@ -169,7 +177,8 @@
<!-- 工单详情对话框 -->
<el-dialog v-model="detailVisible" title="工单详情" width="80%" append-to-body>
<div class="detail-container">
- <div class="event-title-center">{{ currentDetail.orderName || '事件名称' }}</div>
+ <div class="detail-top-title"> <div class="event-title-center event-orderNumber">{{ currentDetail.orderNumber || '工单编号' }}</div>
+ <div class="event-title-center">{{ currentDetail.orderName || '事件名称' }}</div></div>
<div v-if="totalTime" class="event-total-time">
总耗时:{{ totalTime }}
</div>
@@ -301,7 +310,10 @@
:before-upload="beforeUpload" :file-list="currentDetail.photos || []" :limit="1" accept="image/*"
class="detail-upload">
<template v-if="!currentDetail.photos || currentDetail.photos.length < 1">
- <i class="el-icon-plus">+</i>
+ <!-- <i class="el-icon-plus">+</i> -->
+ <div class="el-icon-plus">
+ <span>+</span>
+ </div>
</template>
</el-upload>
<div class="el-upload__tip" v-if="hasProcessedAndOverBtnPermission()">
@@ -489,13 +501,14 @@
@close="reCheckDialog = false">
<div class="dialog-footer">
<el-button type="primary" @click="reCheckConfirm(1)">人工复核</el-button>
- <el-button type="primary" @click="reCheckConfirm(2)">AI复核</el-button>
+ <el-button type="primary" @click="reCheckConfirm(2)">无人机复核</el-button>
</div>
</el-dialog>
</basic-container>
</template>
<script>
+import { getSmallImg,getShowImg } from '@/utils/util';
import { ElMessageBox, ElLoading } from 'element-plus'
import { calculateDefaultRange } from '@/utils/util'
import { gcj02ToWgs84, wgs84ToGcj02 } from '@/utils/coordinateTransformation'
@@ -511,7 +524,6 @@
} from '@/api/tickets/ticket'
import { export_json_to_excel } from '@/utils/exportExcel'
import geoJson from '@/assets/geoJson.json'
-
import { mapGetters } from 'vuex'
import { getAdcodeObj } from '@/utils/disposeData'
function regExp (label, name) {
@@ -585,6 +597,10 @@
addBtn: false,
menu: true,
page: true,
+
+ height: 'auto',
+ calcHeight: 196,
+
column: [
// { label: "序号", prop: "id", width: 70 },
{ label: '工单编号', prop: 'orderNumber', width: 120, overHidden: true, tooltip: true },
@@ -718,6 +734,11 @@
mounted () {
const href = this.$route.href
+ if (this.$route?.query?.status !== undefined && this.$route?.query?.status !== null){
+ this.filters.status = this.$route?.query?.status + ''
+ this.$router.replace({})
+ }
+
let curQueryParams = {}
if (href.indexOf('?') != -1 && href.split('?').length > 0) {
@@ -956,6 +977,16 @@
return '/'
}
},
+
+ popupShowImage () {
+ return (list) => {
+
+ return list.map(item => ({
+ ...item,
+ url: getShowImg(item.url)
+ }))
+ }
+ }
},
methods: {
@@ -1338,6 +1369,17 @@
if (response.data.code === 0) {
this.$message.success('草稿保存成功')
this.dialogVisible = false
+ this.form={
+ name: '',
+ type: '',
+ department: '',
+ handler: '',
+ algorithm: [], // 关联算法改为数组
+ location: [], // 将存储为[经度, 纬度, 地址]格式
+ address: '',
+ photos: [],
+ content: '', // 新增字段,用于存储后端返回的 content
+ },
this.fetchTableData()
} else {
throw new Error(response.data.msg || '保存失败')
@@ -1351,14 +1393,10 @@
handleLocationChange (val) {
let locationValue = val.value
- console.log('handleLocationChange', locationValue)
if (locationValue && locationValue.length >= 2) {
// 兼容第三项为地址
- this.form.location = [
- Number(locationValue[0]),
- Number(locationValue[1]),
- locationValue[2] || '',
- ]
+ const [lng, lat] = gcj02ToWgs84(locationValue[0], locationValue[1])
+ this.form.location = [Number(lng), Number(lat), locationValue[2] || '',]
this.form.address = locationValue[2] || ''
} else {
this.form.location = []
@@ -1471,6 +1509,8 @@
handleAdd () {
this.dialogVisible = true
+ this.mapParams.center = null
+ this.form.location = []
},
resetForm () {
@@ -1499,6 +1539,7 @@
},
async handleViewDetail (row) {
+
// 找到当前行在tableData中的索引
this.currentIndex = this.tableData.findIndex(item => item.id === row.id)
// 先设置workType,直接从row读取
@@ -1548,6 +1589,8 @@
})
}
this.currentDetail.status = row.status
+
+
} catch (error) {
if (this.activeTab === 'myTickets') {
const statusArr = this.workType === 1 ? ['3', '4'] : this.fixedStatuses
@@ -1562,6 +1605,7 @@
}
this.currentDetail = detailData
+ console.log('this.currentDetail',this.currentDetail);
this.detailVisible = true
this.$nextTick(() => {
if (this.$refs.MapContainer && this.$refs.MapContainer.initAddEntity) {
@@ -2050,6 +2094,7 @@
address: row.address || '',
content: row.content,
photos: [],
+
}
let curLocation = []
@@ -2451,12 +2496,51 @@
</script>
<style lang="scss" scoped>
-:deep() {
- .avue-crud__body {
- .el-form {
- height: 655px;
- overflow: auto;
+::v-deep(.el-tabs) {
+ height: 100%;
+ display: flex;
+ flex-direction: column;
+
+ .el-tabs__header {
+ order: 1;
+ }
+
+ .el-tabs__content {
+ order: 2;
+ }
+
+ .el-tabs__content {
+ height: 0;
+ flex: 1;
+ display: flex;
+ flex-direction: column;
+
+ .el-tab-pane {
+ height: 0;
+ flex: 1;
+ display: flex;
+ flex-direction: column;
}
+ }
+}
+
+.filter-bar {
+ display: flex;
+ align-items: center;
+ margin-bottom: 15px;
+ flex-wrap: wrap;
+ gap: 8px; // 使用 gap 统一设置间距
+
+ .filter-item {
+ width: 160px; // 减小宽度
+ }
+
+ .date-picker {
+ width: 240px; // 日期选择器宽度适当调整
+ }
+
+ .el-button {
+ margin-left: 0; // 覆盖 element-ui 默认的按钮间距
}
}
@@ -2487,57 +2571,8 @@
margin-bottom: 12px
}
-.tab-content {
- padding: 10px;
-}
-
-.filter-bar {
- display: flex;
- align-items: center;
- margin-bottom: 15px;
- flex-wrap: wrap;
- gap: 8px; // 使用 gap 统一设置间距
-
- .filter-item {
- width: 160px; // 减小宽度
- }
-
- .date-picker {
- width: 240px; // 日期选择器宽度适当调整
- }
-
- .el-button {
- margin-left: 0; // 覆盖 element-ui 默认的按钮间距
- }
-}
-
.action-bar {
margin-bottom: 16px;
-}
-
-.el-tabs {
- :deep(.el-tabs__content) {
- overflow: visible;
- }
-}
-
-.tab-content {
- min-height: 200px;
-}
-
-.detail-form {
- :deep(.el-form-item) {
- margin-bottom: 10px;
- }
-
- :deep(.el-form-item__label) {
- color: #606266;
- font-weight: normal;
- }
-
- :deep(.el-form-item__content) {
- color: #303133;
- }
}
.el-dialog {
@@ -2757,6 +2792,13 @@
.detail-container {
padding: 20px;
+ .detail-top-title {
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ .event-orderNumber{
+ margin-right: 10px;}
+ }
}
.status-flow {
diff --git a/src/views/wel/components/backlog.vue b/src/views/wel/components/backlog.vue
index ad3d306..96b9061 100644
--- a/src/views/wel/components/backlog.vue
+++ b/src/views/wel/components/backlog.vue
@@ -4,33 +4,21 @@
<div class="titleBox">
<div class="title">待办事项</div>
<div class="rightTab">
- <div
- class="titleItem"
- :class="item.name === checked ? 'activeItem' : ''"
- v-for="(item, index) in titleList"
- :key="index"
- @click="titleClick(item, index)"
- >
+ <div class="titleItem" :class="item.name === checked ? 'activeItem' : ''" v-for="(item, index) in titleList"
+ :key="index" @click="titleClick(item, index)">
<div>
{{ item.name }}
- <div class="dots" >{{ item.number >= 100 ? '99+' : item.number }}</div>
- <!-- <div class="dots">99+</div> -->
+ <div class="dots">{{ item.number >= 100 ? '99+' : item.number }}</div>
+ <!-- <div class="dots">99+</div> -->
</div>
</div>
</div>
</div>
<div class="todo-items" v-if="todos.length > 0" v-loading="loading">
- <div
- v-for="(item, index) in todos"
- :key="index"
- class="todo-item"
- :style="getStatusStyle(item.status)"
- @click="jumporder(item)"
- >
- <div
- class="status-indicator"
- ><img :src="getStatus(item.status)" alt=""></div>
+ <div v-for="(item, index) in todos" :key="index" class="todo-item" :style="getStatusStyle(item.status)"
+ @click="jumporder(item)">
+ <div class="status-indicator"><img :src="getStatus(item.status)" alt=""></div>
<div class="content-wrapper">
<div class="main-content">
@@ -60,22 +48,22 @@
</template>
<script setup>
-import st7 from '@/assets/images/workbench/st7.svg';
-import db1 from '@/assets/images/workbench/db1.svg';
-import db2 from '@/assets/images/workbench/db2.svg';
-import db3 from '@/assets/images/workbench/db3.svg';
-import db4 from '@/assets/images/workbench/db4.svg';
-import db5 from '@/assets/images/workbench/db5.svg';
-import { getOrderCountApi, addOrderRecordApi, getOrderOrEventApi } from '@/api/home/index';
-import { onMounted } from 'vue';
-import { useRouter } from 'vue-router';
-import { useStore } from 'vuex';
-const zfTotal = ref(0);
-const sjTotal = ref(0);
-const router = useRouter();
-const store = useStore();
-const permission = computed(() => store.getters.permission);
-const checked = ref('事件工单');
+import st7 from '@/assets/images/workbench/st7.svg'
+import db1 from '@/assets/images/workbench/db1.svg'
+import db2 from '@/assets/images/workbench/db2.svg'
+import db3 from '@/assets/images/workbench/db3.svg'
+import db4 from '@/assets/images/workbench/db4.svg'
+import db5 from '@/assets/images/workbench/db5.svg'
+import { getOrderCountApi, addOrderRecordApi, getOrderOrEventApi } from '@/api/home/index'
+import { onMounted } from 'vue'
+import { useRouter } from 'vue-router'
+import { useStore } from 'vuex'
+const zfTotal = ref(0)
+const sjTotal = ref(0)
+const router = useRouter()
+const store = useStore()
+const permission = computed(() => store.getters.permission)
+const checked = ref('事件工单')
const titleList = ref([
{
label: 'event_order_count',
@@ -87,37 +75,37 @@
name: '智飞工单',
number: 0,
},
-]);
+])
const titleClick = (item, index) => {
- checked.value = item.name;
- getListMatter();
-};
+ checked.value = item.name
+ getListMatter()
+}
-const userInfo = computed(() => store.getters.userInfo);
-const todos = ref([]);
-const loading = ref(false);
+const userInfo = computed(() => store.getters.userInfo)
+const todos = ref([])
+const loading = ref(false)
// * 事件工单中2=待审核,0=待处理,3=处理中
// * 智飞工单中1: 待审核,2=已驳回,3=已通过
const statusMap = {
0: '待处理',
2: '待审核',
3: '处理中',
-};
+}
const statusMapColor = {
0: { color: '#FF7411', backgroundImage: db3, borderLeftColor: '#FF7411' },
2: { color: '#FF472F', backgroundImage: db1, borderLeftColor: '#FF472F' },
3: { color: '#FFC300', backgroundImage: db4, borderLeftColor: '#FFC300' },
-};
+}
const zfstatusMap = {
1: '待审核',
2: '已驳回',
3: '已通过',
-};
+}
const zfstatusMapColor = {
1: { color: '#FF472F', backgroundImage: db2, borderLeftColor: '#FF472F' },
2: { color: '#4200DD', backgroundImage: db5, borderLeftColor: '#4200DD' },
3: { color: '#FF472F', backgroundImage: db2, borderLeftColor: '#FF472F' },
-};
+}
// 根据状态获取图标
// const getStatusBackground = statusIndex => {
// if (checked.value === '智飞工单') {
@@ -130,134 +118,145 @@
// };
const getStatus = statusIndex => {
if (checked.value === '智飞工单') {
- const style = zfstatusMapColor[statusIndex];
- return style ? style.backgroundImage : '';
+ const style = zfstatusMapColor[statusIndex]
+ return style ? style.backgroundImage : ''
} else {
- const style = statusMapColor[statusIndex];
- return style ? style.backgroundImage : '';
+ const style = statusMapColor[statusIndex]
+ return style ? style.backgroundImage : ''
}
-};
+}
const getStatusStyle = statusIndex => {
if (checked.value === '智飞工单') {
const style = zfstatusMapColor[statusIndex] || {
color: '#999',
borderLeftColor: '#999',
- };
+ }
return {
color: style.color,
borderLeft: `3px solid ${style.borderLeftColor}`,
- };
+ }
} else {
const style = statusMapColor[statusIndex] || {
color: '#999',
borderLeftColor: '#999',
- };
+ }
return {
color: style.color,
borderLeft: `3px solid ${style.borderLeftColor}`,
- };
+ }
}
-};
+}
// 获取状态对应的文字颜色
const getStatusColor = statusIndex => {
if (checked.value === '智飞工单') {
- return zfstatusMapColor[statusIndex]?.color || '#999';
+ return zfstatusMapColor[statusIndex]?.color || '#999'
} else {
- return statusMapColor[statusIndex]?.color || '#999';
+ return statusMapColor[statusIndex]?.color || '#999'
}
-};
+}
// 跳转到对应详情页
const jumporder = val => {
if (checked.value === '智飞工单') {
- const id = val.id;
- getaddOrderRecord(id);
+ const id = val.id
+ getaddOrderRecord(id)
router.push({
path: `/tickets/orderLog`,
query: {
id,
},
- });
+ })
} else {
- getaddOrderRecord(val.id);
- const orderNumber = val.event_num;
+ getaddOrderRecord(val.id)
+ const orderNumber = val.event_num
router.push({
path: `/tickets/ticket`,
query: {
orderNumber,
},
- });
+ })
}
-};
+}
// 标记事件工单或智飞工单已读
const getaddOrderRecord = async id => {
- const ticketId = id;
+ const ticketId = id
if (checked.value === '事件工单') {
- loading.value = true;
- const type = 1;
- const res = await addOrderRecordApi(type, ticketId);
+ loading.value = true
+ const type = 1
+ const res = await addOrderRecordApi(type, ticketId)
} else if (checked.value === '智飞工单') {
- loading.value = true;
- const type = 2;
- const res = await addOrderRecordApi(type, ticketId);
+ loading.value = true
+ const type = 2
+ const res = await addOrderRecordApi(type, ticketId)
}
-};
+}
// 获取事件工单和智飞工单的数量
const getOrderCount = async () => {
- const res = await getOrderCountApi(userInfo.value.detail.areaCode);
- const data = res.data.data;
+ const res = await getOrderCountApi(userInfo.value.detail.areaCode)
+ const data = res.data.data
titleList.value.forEach(item => {
if (data[item.label] !== undefined) {
- item.number = data[item.label];
+ item.number = data[item.label]
}
- });
-};
+ })
+}
// 获取事件工单或者智飞工单的信息
const getListMatter = async () => {
if (checked.value === '事件工单') {
- loading.value = true;
- const type = 1;
- const res = await getOrderOrEventApi(type, userInfo.value.detail.areaCode);
- todos.value = res.data.data || [];
- loading.value = false;
+ loading.value = true
+ const type = 1
+ const res = await getOrderOrEventApi(type, userInfo.value.detail.areaCode)
+ todos.value = res.data.data || []
+ loading.value = false
} else if (checked.value === '智飞工单') {
- loading.value = true;
- const type = 2;
- const res = await getOrderOrEventApi(type, userInfo.value.detail.areaCode);
- todos.value = res.data.data || [];
- loading.value = false;
+ loading.value = true
+ const type = 2
+ const res = await getOrderOrEventApi(type, userInfo.value.detail.areaCode)
+ todos.value = res.data.data || []
+ loading.value = false
}
-};
+}
onMounted(() => {
- getListMatter();
- getOrderCount();
-});
+ getListMatter()
+ getOrderCount()
+})
</script>
-
+<style>
+.el-empty__image {
+ width: 100px !important;
+}
+</style>
<style lang="scss" scoped>
.bocklogBox {
width: 100%;
- height: 306px;
+ // height: 306px;
+ height: pxToVh(326);
background: rgba(255, 255, 255, 0.41);
box-shadow: 0px 3px 4px -1px rgba(125, 125, 125, 0.25);
border-radius: 8px 8px 8px 8px;
border: 2px solid #ffffff;
+ box-sizing: border-box;
+
.block {
margin: 11px 21px 13px 22px;
+
.titleBox {
display: flex;
justify-content: space-between;
}
+
.title {
font-family: 'Source Han Sans CN';
font-weight: bold;
font-size: 16px;
color: #363636;
}
+
.rightTab {
display: flex;
text-align: center;
padding-right: 10px;
+
.titleItem {
position: relative;
font-weight: 400;
@@ -266,6 +265,7 @@
margin-left: 18px;
cursor: pointer;
}
+
.activeItem {
border-radius: 0px 0px 0px 0px;
font-family: Source Han Sans CN, Source Han Sans CN;
@@ -274,11 +274,13 @@
color: #1c5cff;
border-bottom: 2px solid #1c5cff;
}
+
.dots {
width: 17px;
- height: 17px;
+ // height: 17px;
+ height: pxToVh(17);
border-radius: 50%;
- background: #366fff;
+ background: #366fff;
color: #fff;
font-size: 9px;
position: absolute;
@@ -287,9 +289,11 @@
padding: 1px;
line-height: 17px;
}
- .dots1 {
+
+ .dots1 {
width: 17px;
- height: 17px;
+ // height: 17px;
+ height: pxToVh(17);
border-radius: 50%;
background: none !important;
color: #366fff !important;
@@ -301,9 +305,11 @@
line-height: 17px;
}
}
+
.todo-items {
margin-top: 10px;
- height: 250px;
+ // height: 250px;
+ height: pxToVh(250);
overflow-y: scroll;
}
@@ -317,7 +323,9 @@
box-shadow: 0px 2px 4px 0px rgba(173, 173, 173, 0.18);
transition: all 0.2s ease;
border-left: 4px solid transparent;
- height: 42px;
+ // height: 42px;
+ height: pxToVh(42);
+
&:hover {
transform: translateY(-2px);
box-shadow: 0 3px 8px rgba(0, 0, 0, 0.05);
@@ -327,9 +335,10 @@
margin-left: 3px;
width: 1.6rem;
height: 1.6rem;
- img{
- width: 100%;
- height: 100%;
+
+ img {
+ width: 100%;
+ height: 100%;
}
}
@@ -359,6 +368,7 @@
font-size: 14px;
color: #343434;
}
+
.unread {
width: 5px;
height: 5px;
@@ -366,6 +376,7 @@
border-radius: 50%;
margin: 0 4px;
}
+
.reads {
width: 5px;
height: 5px;
@@ -379,10 +390,12 @@
display: flex;
align-items: center;
margin-right: 42px;
+
img {
width: 15px;
height: 15px;
}
+
.todo-date {
font-weight: 400;
font-size: 14px;
@@ -392,6 +405,7 @@
}
}
}
+
.custom-text {
font-size: 14px;
color: #7c8091;
diff --git a/src/views/wel/components/calendarBox.vue b/src/views/wel/components/calendarBox.vue
index 20ce47e..aaae5fe 100644
--- a/src/views/wel/components/calendarBox.vue
+++ b/src/views/wel/components/calendarBox.vue
@@ -5,13 +5,8 @@
<div :class="data.isSelected ? 'is-selected' : ''">
<div class="date-number">{{ data.day.slice(8, 10) }}</div>
<div class="events">
- <div
- v-for="(event, index) in getEvents(data.day)"
- :key="index"
- class="event-item"
- :class="event.type"
- @click="jumpcalendar(event, data.day)"
- >
+ <div v-for="(event, index) in getEvents(data.day)" :key="index" class="event-item" :class="event.type"
+ @click="jumpcalendar(event, data.day)">
<img :src="getEventIcon(event.type)" alt="" />
{{ event.name }}<span>{{ event.value }}</span>
</div>
@@ -23,65 +18,65 @@
</template>
<script setup>
-import dayjs from 'dayjs';
-import { jobEventBar, getCalen } from '@/api/home/index';
-import { useRouter } from 'vue-router';
-import ev1 from '@/assets/images/workbench/ev1.svg';
-import ev2 from '@/assets/images/workbench/ev2.svg';
-import { ElMessage } from 'element-plus';
-const router = useRouter();
-const events = ref({});
+import dayjs from 'dayjs'
+import { jobEventBar, getCalen } from '@/api/home/index'
+import { useRouter } from 'vue-router'
+import ev1 from '@/assets/images/workbench/ev1.svg'
+import ev2 from '@/assets/images/workbench/ev2.svg'
+import { ElMessage } from 'element-plus'
+const router = useRouter()
+const events = ref({})
const params = ref({
end_date: undefined,
start_date: undefined,
-});
+})
const eventIcons = ref({
'work-order': ev1,
task: ev2,
-});
+})
const getEventIcon = type => {
- return eventIcons.value[type] || eventIcons.value.default;
-};
-function getCurrentMonthRange() {
+ return eventIcons.value[type] || eventIcons.value.default
+}
+function getCurrentMonthRange () {
return {
start_date: dayjs().startOf('month').format('YYYY-MM-DD HH:mm:ss'),
end_date: dayjs().endOf('month').format('YYYY-MM-DD HH:mm:ss'),
- };
+ }
}
-const leftValue = ref(new Date());
+const leftValue = ref(new Date())
watch(
() => leftValue.value,
(newV, oldV) => {
if (newV && oldV) {
- const newDate = dayjs(newV);
+ const newDate = dayjs(newV)
params.value = {
start_date: newDate.startOf('month').format('YYYY-MM-DD HH:mm:ss'),
end_date: newDate.endOf('month').format('YYYY-MM-DD HH:mm:ss'),
- };
- getJobEventBar();
+ }
+ getJobEventBar()
}
},
{ deep: true, immediate: true }
-);
+)
// 获取日期数字
const getDate = date => {
- return date.getDate();
-};
+ return date.getDate()
+}
// 获取对应日期的事件
const getEvents = dateString => {
- return events.value[dateString] || [];
-};
-const monthRange = getCurrentMonthRange();
-params.value = monthRange;
+ return events.value[dateString] || []
+}
+const monthRange = getCurrentMonthRange()
+params.value = monthRange
const getJobEventBar = () => {
getCalen(params.value).then(res => {
- if (res.data.code !== 0) return;
- events.value = res.data.data;
- });
-};
+ if (res.data.code !== 0) return
+ events.value = res.data.data
+ })
+}
const jumpcalendar = (event, day) => {
if (event.name === '工单') {
router.push({
@@ -89,39 +84,64 @@
query: {
day: day,
},
- });
+ })
} else {
router.push({
path: '/job/jobstatistics',
query: {
day: day,
},
- });
+ })
}
-};
+}
onMounted(() => {
- getJobEventBar();
-});
+ getJobEventBar()
+})
</script>
+
<style lang="scss">
.calenBox {
- height: 630px;
- .el-calendar {
- height: 100%; // 日历填充容器
+ // height: 630px;
+ height: pxToVh(660);
+
+
+
+ // 隐藏按钮组中间按钮
+ .el-button-group>.el-button:not(:first-child):not(:last-child) {
+ display: none;
+ }
+}
+</style>
+
+<style lang="scss" scoped>
+.calenBox {
+ margin-top: 10px;
+ // height: 630px;
+ height: pxToVh(622);
+ border-radius: 10px;
+ overflow: hidden;
+ background-color: #fff;
+
+ ::v-deep(.el-calendar) {
+
+ // height: 80%; // 日历填充容器
// 标题样式
- &__title {
+ .el-calendar__title {
font-weight: bold;
font-size: 14px;
color: #363636;
}
// 日历主体
- &__body {
- height: 98%; // 关键:继承父高度
-
- .el-calendar-table {
- height: 90% !important; // 百分比生效
- }
+ // &__body {
+ // height: 98%; // 关键:继承父高度
+
+ // .el-calendar-table {
+ // height: 90% !important; // 百分比生效
+ // }
+ // }
+ .el-calendar-table .el-calendar-day {
+ height: 78px !important;
}
// 选中日期样式
@@ -129,7 +149,7 @@
background-color: #f0f7ff;
border: 2px solid #409eff;
border-radius: 4px;
-
+
.date-number {
font-weight: bold;
color: #409eff;
@@ -137,30 +157,18 @@
}
}
- // 隐藏按钮组中间按钮
- .el-button-group > .el-button:not(:first-child):not(:last-child) {
- display: none;
- }
-}
-</style>
-<style lang="scss" scoped>
-.calenBox {
- margin-top: 17px;
- height: 630px;
- overflow: hidden;
.event-item {
font-size: 12px;
// padding: 2px;
border-radius: 3px;
white-space: nowrap;
- // overflow: hidden;
- // text-overflow: ellipsis;
&.work-order {
font-weight: 400;
font-size: 12px;
color: #7b7b7b;
+
span {
font-weight: 600;
font-size: 14px;
@@ -173,6 +181,7 @@
font-weight: 400;
font-size: 12px;
color: #7b7b7b;
+
span {
font-weight: 600;
font-size: 14px;
diff --git a/src/views/wel/components/flyratio.vue b/src/views/wel/components/flyratio.vue
index eef3091..3894a64 100644
--- a/src/views/wel/components/flyratio.vue
+++ b/src/views/wel/components/flyratio.vue
@@ -230,7 +230,8 @@
}
.nestCenter {
width: 100%;
- height: 600px;
+ // height: 600px;
+ height: pxToVh(600);
.chart {
width: 100%;
height: 100%;
diff --git a/src/views/wel/components/statistics.vue b/src/views/wel/components/statistics.vue
index 295996a..ab9b6c4 100644
--- a/src/views/wel/components/statistics.vue
+++ b/src/views/wel/components/statistics.vue
@@ -198,28 +198,28 @@
// 样式配置对象
const statusStyles = {
机巢保险: {
- 0: { class: 'expired', color: '#7C8091', background: '#7C8091' },
- 1: { class: 'normal', color: '#1B94FF', background: '#1B94FF' },
+ 0: { class: 'expired', color: '#FFA600', background: '#FFA600' },
+ 1: { class: 'normal', color: 'rgba(27, 148, 255, 1)', background: 'rgba(27, 148, 255, 1)' },
},
无人机流量: {
- 0: { class: 'offline', color: '#11CE3E', background: '#11CE3E' },
- 1: { class: 'flying', color: '#1B94FF', background: '#1B94FF' },
- 2: { class: 'flying', color: '#7C8091', background: '#7C8091' },
+ 0: { class: 'offline', color: 'rgba(0, 180, 69, 1)', background: 'rgba(0, 180, 69, 1)' },
+ 1: { class: 'flying', color: 'rgba(186, 186, 186, 1)', background: 'rgba(186, 186, 186, 1)' },
+ 2: { class: 'flying', color: 'rgba(255, 36, 36, 1)', background: 'rgba(255, 36, 36, 1)' },
},
监控设备: {
- 0: { class: 'offline', color: '#bababa', background: '#bababa' },
- 1: { class: 'flying', color: '#1B94FF', background: '#1B94FF' },
+ 0: { class: 'offline', color: 'rgba(186, 186, 186, 1)', background: 'rgba(186, 186, 186, 1)' },
+ 1: { class: 'flying', color: 'rgba(255, 106, 0, 1)', background: 'rgba(255, 106, 0, 1)' },
},
移动机巢: {
- '-1': { class: 'offline', color: '#bababa', background: '#bababa' },
- 4: { class: 'flying', color: '#1B94FF', background: '#1B94FF' },
+ '-1': { class: 'offline', color: 'rgba(186, 186, 186, 1)', background: 'rgba(186, 186, 186, 1)' },
+ 4: { class: 'flying', color: 'rgba(255, 106, 0, 1)', background: 'rgba(255, 106, 0, 1)' },
},
// 默认样式配置
default: {
- 0: { class: 'warning', color: '#1b94ff', background: '#1b94ff' },
- 4: { class: 'success', color: '#11ce3e', background: '#11ce3e' },
- '-1': { class: 'success', color: '#bababa', background: '#bababa' },
+ 0: { class: 'warning', color: 'rgba(0, 180, 69, 1)', background: 'rgba(0, 180, 69, 1)' },
+ 4: { class: 'success', color: 'rgba(255, 106, 0, 1)', background: 'rgba(255, 106, 0, 1)' },
+ '-1': { class: 'success', color: 'rgba(186, 186, 186, 1)', background: 'rgba(186, 186, 186, 1)' },
},
};
@@ -295,7 +295,8 @@
<style scoped lang="scss">
.statistics {
- min-height: 174px;
+ // height: 174px;
+ height: pxToVh(174);
background: #ffffff;
border-radius: 8px 8px 8px 8px;
margin-bottom: 10px;
@@ -332,15 +333,15 @@
padding: 0 14px 0 21px;
// display: grid;
// grid-template-columns: repeat(4, 1fr);
- height: 80px;
+ height: pxToVh(80);
display: flex;
justify-content: space-around;
:deep(.el-empty ){
width: 60px;
- height: 60px;
+ height: pxToVh(60);
.el-empty__image{
width: 60px !important;
- height: 60px !important;}
+ height: pxToVh(60)!important;}
.custom-text {
font-size: 12px;
color: #7c8091;
diff --git a/src/views/wel/index.vue b/src/views/wel/index.vue
index 6611797..ec47397 100644
--- a/src/views/wel/index.vue
+++ b/src/views/wel/index.vue
@@ -1,214 +1,208 @@
<template>
- <div class="workbench">
- <div class="workleft">
- <!-- 设备统计 -->
- <statistics></statistics>
- <!-- 综合统计分析 -->
- <div class="comprehensiveCon">
- <div class="comprehensive">
- <div class="title">
- <div class="name">
- <span> 综合统计分析</span>
- <img @click="refresh" src="/src/assets/images/workbench/st1.png" alt="" />
- <div class="time-card">
- <div
- class="card-item"
- :class="item === checked ? 'active' : ''"
- v-for="(item, index) in timeListEnum"
- :key="index"
- @click="timeClick(item, index)"
- >
- {{ timeListStr[index] }}
+ <wel-container>
+ <div class="workbench">
+ <div class="workleft">
+ <!-- 设备统计 -->
+ <statistics></statistics>
+ <!-- 综合统计分析 -->
+ <div class="comprehensiveCon">
+ <div class="comprehensive">
+ <div class="title">
+ <div class="name">
+ <span> 综合统计分析</span>
+ <img @click="refresh" src="/src/assets/images/workbench/st1.png" alt="" />
+ <div class="time-card">
+ <div class="card-item" :class="item === checked ? 'active' : ''" v-for="(item, index) in timeListEnum"
+ :key="index" @click="timeClick(item, index)">
+ {{ timeListStr[index] }}
+ </div>
</div>
</div>
+ <div class="arrow" @click="jumpshebei">
+ <img src="/src/assets/images/workbench/st2.png" alt="" />
+ </div>
</div>
- <div class="arrow" @click="jumpshebei">
- <img src="/src/assets/images/workbench/st2.png" alt="" />
- </div>
- </div>
- <div class="center">
- <div class="centerLeft">
- <!-- 工单统计 -->
- <div class="workOrder">
- <div class="card-group">
- <div class="main-card">
- <div class="card-title">
- <img :src="overviewImg1" alt="" />
- <div class="cardtotal">
- <p>工单统计占比</p>
- </div>
- </div>
-
- <div class="status-grid">
- <div class="status-item" v-for="(item, index) in eventTypeList" :key="index">
- <div class="statusCon">
- <div class="status-label">{{ item.name }}</div>
- <div class="status-value">{{ item.value }}<span>个</span></div>
- <div class="ratio">
- 占比
- <span :style="{ color: item.color }"
- >{{ ((item.rate * 100) / 100).toFixed(2) }}%</span
- >
- </div>
+ <div class="center">
+ <div class="centerLeft">
+ <!-- 工单统计 -->
+ <div class="workOrder">
+ <div class="card-group">
+ <div class="main-card">
+ <div class="card-title">
+ <img :src="overviewImg1" alt="" />
+ <div class="cardtotal">
+ <p>工单统计占比</p>
</div>
- <img :src="item.img" alt="" />
+ </div>
+
+ <div class="status-grid">
+ <div class="status-item" v-for="(item, index) in eventTypeList" :key="index">
+ <div class="statusCon">
+ <div class="status-label">{{ item.name }}</div>
+ <div class="status-value">{{ item.value }}<span>个</span></div>
+ <div class="ratio">
+ 占比
+ <span :style="{ color: item.color }">{{ ((item.rate * 100) / 100).toFixed(2) }}%</span>
+ </div>
+ </div>
+ <img :src="item.img" alt="" />
+ </div>
</div>
</div>
</div>
+ <div class="charts">
+ <div class="chart" ref="echartsRef"></div>
+ </div>
</div>
- <div class="charts">
- <div class="chart" ref="echartsRef"></div>
- </div>
- </div>
- <!-- 飞行统计 -->
- <div class="flyOrder">
- <div class="fytitle">
- <img :src="fy1" alt="" />
- <span>飞行统计</span>
- </div>
- <div class="flycenter">
- <div class="centerBox">
- <div class="centerItem" v-for="(itemfly, index) in flyTypeList" :key="index">
- <div class="flyimg"><img :src="itemfly.img" alt="" />{{ itemfly.name }}</div>
- <div class="flydata">
- <span>{{ itemfly.value }}</span
- >{{ unitMap[itemfly.name] }}
+ <!-- 飞行统计 -->
+ <div class="flyOrder">
+ <div class="fytitle">
+ <img :src="fy1" alt="" />
+ <span>飞行统计</span>
+ </div>
+ <div class="flycenter">
+ <div class="centerBox">
+ <div class="centerItem" v-for="(itemfly, index) in flyTypeList" :key="index">
+ <div class="flyimg"><img :src="itemfly.img" alt="" />{{ itemfly.name }}</div>
+ <div class="flydata">
+ <span>{{ itemfly.value }}</span>{{ unitMap[itemfly.name] }}
+ </div>
</div>
</div>
- </div>
- <div class="lineChart">
- <div class="lineBox" ref="chartRef"></div>
+ <div class="lineChart">
+ <div class="lineBox" ref="chartRef"></div>
+ </div>
</div>
</div>
</div>
- </div>
- <div class="centerRight">
- <flyratio :dateSelect="dateSelect"></flyratio>
+ <div class="centerRight">
+ <flyratio :dateSelect="dateSelect"></flyratio>
+ </div>
</div>
</div>
</div>
</div>
- </div>
- <div class="workright">
- <Bocklog></Bocklog>
- <CalenBox></CalenBox>
+ <div class="workright">
+ <Bocklog></Bocklog>
+ <CalenBox></CalenBox>
+ </div>
</div>
- </div>
+ </wel-container>
</template>
<script setup>
-import flyratio from './components/flyratio.vue';
-import Bocklog from './components/backlog.vue';
-import CalenBox from './components/calendarBox.vue';
-import * as echarts from 'echarts';
-import useEchartsResize from '@/hooks/useEchartsResize';
-import { mapGetters } from 'vuex';
-import { getJobEventByStatus, getJobEventTotal, getFly, getFlyTime } from '@/api/home/index';
-import overviewImg1 from '@/assets/images/workbench/tc1.png';
-import overviewImg2 from '@/assets/images/workbench/tc2.svg';
-import overviewImg3 from '@/assets/images/workbench/tc3.svg';
-import overviewImg4 from '@/assets/images/workbench/tc4.svg';
-import overviewImg5 from '@/assets/images/workbench/tc5.svg';
-import fy1 from '@/assets/images/workbench/fy1.png';
-import flyImg1 from '@/assets/images/workbench/fy2.svg';
-import flyImg2 from '@/assets/images/workbench/fy3.svg';
-import flyImg3 from '@/assets/images/workbench/fy4.svg';
-import statistics from './components/statistics.vue';
-import { ElMessage } from 'element-plus';
-let checked = ref('CURRENT_YEAR');
-let timeListStr = ['本周', '本月', '本年'];
-let timeListEnum = ['CURRENT_WEEK', 'CURRENT_MONTH', 'CURRENT_YEAR'];
+import flyratio from './components/flyratio.vue'
+import Bocklog from './components/backlog.vue'
+import CalenBox from './components/calendarBox.vue'
+import * as echarts from 'echarts'
+import useEchartsResize from '@/hooks/useEchartsResize'
+import { mapGetters } from 'vuex'
+import { getJobEventByStatus, getJobEventTotal, getFly, getFlyTime } from '@/api/home/index'
+import overviewImg1 from '@/assets/images/workbench/tc1.png'
+import overviewImg2 from '@/assets/images/workbench/tc2.svg'
+import overviewImg3 from '@/assets/images/workbench/tc3.svg'
+import overviewImg4 from '@/assets/images/workbench/tc4.svg'
+import overviewImg5 from '@/assets/images/workbench/tc5.svg'
+import fy1 from '@/assets/images/workbench/fy1.png'
+import flyImg1 from '@/assets/images/workbench/fy2.svg'
+import flyImg2 from '@/assets/images/workbench/fy3.svg'
+import flyImg3 from '@/assets/images/workbench/fy4.svg'
+import statistics from './components/statistics.vue'
+import { ElMessage } from 'element-plus'
+let checked = ref('CURRENT_YEAR')
+let timeListStr = ['本周', '本月', '本年']
+let timeListEnum = ['CURRENT_WEEK', 'CURRENT_MONTH', 'CURRENT_YEAR']
const params = ref({
date_enum: 'CURRENT_YEAR',
device_sn: '',
end_date: undefined,
start_date: undefined,
-});
-const dateSelect = ref('CURRENT_YEAR');
+})
+const dateSelect = ref('CURRENT_YEAR')
let timeClick = (item, index) => {
- checked.value = item;
- params.value.date_enum = item;
- dateSelect.value = item;
- getTypeData();
- getFlyList();
- getFlyTimeList();
-};
+ checked.value = item
+ params.value.date_enum = item
+ dateSelect.value = item
+ getTypeData()
+ getFlyList()
+ getFlyTimeList()
+}
const refresh = () => {
- params.value.date_enum = 'CURRENT_YEAR';
- checked.value = 'CURRENT_YEAR';
- dateSelect.value = 'CURRENT_YEAR';
- getTypeData();
- getFlyList();
- getFlyTimeList();
-};
+ params.value.date_enum = 'CURRENT_YEAR'
+ checked.value = 'CURRENT_YEAR'
+ dateSelect.value = 'CURRENT_YEAR'
+ getTypeData()
+ getFlyList()
+ getFlyTimeList()
+}
// 跳转
const jumpshebei = () => {
- ElMessage.warning('加急开发中...');
-};
+ ElMessage.warning('加急开发中...')
+}
const eventTypeList = ref([
{ name: '待审核', value: 0, img: overviewImg2, color: '#FF472F', status: '2', rate: 0 },
{ name: '待处理', value: 0, img: overviewImg3, color: '#FF7411', status: '0', rate: 0 },
{ name: '处理中', value: 0, img: overviewImg4, color: '#FFC300', status: '3', rate: 0 },
{ name: '已完成', value: 0, img: overviewImg5, color: '#0291A1', status: '4', rate: 0 },
-]);
+])
const keyMapping = {
飞行时长: 'total_flight_time',
飞行里程: 'total_flight_distance',
任务成果: 'event_num',
-};
+}
const unitMap = {
飞行时长: '时',
飞行里程: '千米',
任务成果: '个',
-};
+}
const flyTypeList = ref([
{ name: '飞行时长', value: 0, img: flyImg1 },
{ name: '飞行里程', value: 0, img: flyImg2 },
{ name: '任务成果', value: 0, img: flyImg3 },
-]);
+])
-const eventTotal = ref(0);
-const data = ref([]);
+const eventTotal = ref(0)
+const data = ref([])
// 工单统计
const getTypeData = () => {
getJobEventByStatus(params.value).then(res => {
- const resList = res?.data?.data || [];
+ const resList = res?.data?.data || []
resList.forEach(item => {
eventTypeList.value.forEach(item1 => {
if (item1.name === item.name) {
- item1.value = item.num;
- item1.rate = item.rate;
+ item1.value = item.num
+ item1.rate = item.rate
}
- });
- });
- initChart(resList);
- });
-};
+ })
+ })
+ initChart(resList)
+ })
+}
// 飞行统计
const getFlyList = () => {
getFly(params.value).then(res => {
flyTypeList.value = flyTypeList.value.map(item => ({
...item,
value: res.data.data[keyMapping[item.name]] || 0,
- }));
- });
-};
+ }))
+ })
+}
const getFlyTimeList = () => {
getFlyTime(params.value).then(res => {
- const resList = res?.data?.data || [];
- lineCharts(resList);
- });
-};
+ const resList = res?.data?.data || []
+ lineCharts(resList)
+ })
+}
// 图表
-const echartsRef = ref(null);
-let { chart } = useEchartsResize(echartsRef);
-const chartRef = ref(null);
-let { chart: lineChart } = useEchartsResize(chartRef);
+const echartsRef = ref(null)
+let { chart } = useEchartsResize(echartsRef)
+const chartRef = ref(null)
+let { chart: lineChart } = useEchartsResize(chartRef)
const initChart = val => {
- const totalNum = val.reduce((sum, item) => sum + item.num, 0);
+ const totalNum = val.reduce((sum, item) => sum + item.num, 0)
const data = {
total: {
title: '总计',
@@ -219,7 +213,7 @@
name: item.name,
rate: item.rate,
})),
- };
+ }
const containerWidth = chart.value.clientWidth
const isSmallScreen = containerWidth < 768 // 移动端判断
const echartsOption = {
@@ -238,7 +232,7 @@
font-size: 1.2rem;" class="tooltip-area">
<p>${params.marker}${params.name}</p>
<h4 style="margin-left: 1rem;">${params.data.rate || params.percent}%</h4>
- </div>`;
+ </div>`
},
},
legend: {
@@ -271,22 +265,22 @@
label: {
formatter: params => {
// 使用 b 样式标记包裹百分比数值
- return `{a|${params.name}}: {b|${params.data.rate}%}`;
+ return `{a|${params.name}}: {b|${params.data.rate}%}`
},
- fontSize: isSmallScreen ? '0.8rem' : '1.2rem',
- position: isSmallScreen ? 'outer' : 'outer',
+ fontSize: isSmallScreen ? '0.8rem' : '1.2rem',
+ position: isSmallScreen ? 'outer' : 'outer',
alignTo: 'labelLine',
overflow: 'truncate',
- overflow: 'none', // 禁用省略号
+ overflow: 'none', // 禁用省略号
bleedMargin: 30, // 防止标签被截断
rich: {
a: {
color: 'rgba(28, 31, 35, 0.80)',
- fontSize: isSmallScreen ? '1rem' : '1.2rem',
+ fontSize: isSmallScreen ? '1rem' : '1.2rem',
},
b: {
- color: '#1C1F23',
- fontSize: isSmallScreen ? '1rem' : '1.3rem',
+ color: '#1C1F23',
+ fontSize: isSmallScreen ? '1rem' : '1.3rem',
fontWeight: 'bold',
},
},
@@ -303,47 +297,47 @@
data: data.data,
},
],
- };
+ }
- chart.value.setOption(echartsOption);
-};
+ chart.value.setOption(echartsOption)
+}
// 折线/柱状图
const lineCharts = bardata => {
- const categories = bardata?.map(item => item.name); // x轴类别
- const flight_distance = [];
- const flight_time = [];
- const event_num = [];
+ const categories = bardata?.map(item => item.name) // x轴类别
+ const flight_distance = []
+ const flight_time = []
+ const event_num = []
// /遍历数据填充各系列
bardata?.forEach(period => {
let hasDuration = false,
hasDistance = false,
- hasResult = false;
+ hasResult = false
period.data?.forEach(item => {
switch (item.name) {
case '飞行时长':
- flight_time.push(parseFloat(item.value) || 0);
- hasDuration = true;
- break;
+ flight_time.push(parseFloat(item.value) || 0)
+ hasDuration = true
+ break
case '飞行里程':
// 转换为万公 (假设原始单位是米)
// flight_distance.push((parseFloat(item.value) / 10 || 0));
- flight_distance.push(parseFloat(item.value) || 0);
- hasDistance = true;
- break;
+ flight_distance.push(parseFloat(item.value) || 0)
+ hasDistance = true
+ break
case '任务成果':
- event_num.push(Number(item.value) || 0);
- hasResult = true;
- break;
+ event_num.push(Number(item.value) || 0)
+ hasResult = true
+ break
}
- });
+ })
// 处理可能缺失的数据项
- if (!hasDuration) flight_time.push(0);
- if (!hasDistance) flight_distance.push(0);
- if (!hasResult) event_num.push(0);
- });
+ if (!hasDuration) flight_time.push(0)
+ if (!hasDistance) flight_distance.push(0)
+ if (!hasResult) event_num.push(0)
+ })
var option = {
tooltip: {
trigger: 'item',
@@ -366,7 +360,7 @@
itemWidth: 15,
itemHeight: 10,
itemGap: 25,
- fontSize:'1.2rem'
+ fontSize: '1.2rem'
},
xAxis: {
type: 'category',
@@ -378,16 +372,16 @@
},
axisLabel: {
interval: 0,
- color: '#383838',
+ color: '#383838',
},
},
yAxis: [
{
type: 'log',
- name: '单位:万套',
+ name: '单位:万',
nameTextStyle: {
color: '#383838',
- fontSize:'1.2rem'
+ fontSize: '1.2rem'
},
min: 1,
logBase: 3,
@@ -442,7 +436,7 @@
{
name: '飞行时长',
type: 'bar',
- barWidth: '12px',
+ barWidth: '8px',
itemStyle: {
color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
{ offset: 0, color: '#29acff' },
@@ -455,7 +449,7 @@
{
name: '飞行里程',
type: 'bar',
- barWidth: '12px',
+ barWidth: '8px',
itemStyle: {
color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
{ offset: 0, color: '#01c871' },
@@ -489,19 +483,19 @@
data: event_num,
},
],
- };
- lineChart.value.setOption(option);
-};
+ }
+ lineChart.value.setOption(option)
+}
onMounted(() => {
getJobEventTotal().then(res => {
- eventTotal.value = res?.data?.data || 0;
- });
+ eventTotal.value = res?.data?.data || 0
+ })
- getTypeData();
- lineCharts();
- getFlyList();
- getFlyTimeList();
-});
+ getTypeData()
+ lineCharts()
+ getFlyList()
+ getFlyTimeList()
+})
</script>
<style>
@@ -511,24 +505,32 @@
</style>
<style scoped lang="scss">
.workbench {
- padding: 0px 20px 0 10px;
+ height: 100%;
+ flex: 1;
+ // padding: 0px 20px 0 10px;
display: flex;
justify-content: space-between;
-height: calc(100% - 5rem);
}
+
.workleft {
width: 68%;
margin-right: 10px;
+ height: 100%;
+
.comprehensiveCon {
- // height: 736px;
- background: #ffffff;
+ background: #ffffff !important;
+ height: pxToVh(776);
border-radius: 8px 8px 8px 8px;
+
.comprehensive {
- padding: 17px 14px 0 21px;
+
+ padding: 14px 14px 0 21px;
+
.title {
display: flex;
justify-content: space-between;
align-items: center;
+
.name {
display: flex;
align-items: center;
@@ -536,19 +538,24 @@
font-size: 16px;
color: #363636;
font-family: 'Source Han Sans CN';
+
span {
margin-right: 4px;
}
+
img {
cursor: pointer;
}
}
+
.arrow {
cursor: pointer;
}
+
.time-card {
text-align: center;
- height: 30px;
+ // height: 30px;
+ height: pxToVh(30);
background: #ffffff;
border-radius: 4px 0px 0px 4px;
border: 1px solid #e5e5e5;
@@ -558,64 +565,78 @@
display: flex;
width: 282px;
margin-left: 15px;
+
.card-item {
width: 94px;
height: 100%;
- line-height: 32px;
+ line-height: 28px;
cursor: pointer;
font-family: 'Source Han Sans CN';
font-weight: 400;
font-size: 14px;
color: #7c8091;
}
+
.card-item:first-child {
border-right: 1px solid #e5e5e5;
}
+
.card-item:nth-child(2) {
border-right: 1px solid #e5e5e5;
}
+
.card-item.active {
color: #1441ff;
border: 1px solid #1c5cff;
}
}
}
+
// 工、单
.center {
display: flex;
+
.centerLeft {
width: 60%;
border-right: 1px solid #dfdfdf;
+
.workOrder {
- margin-top: 31px;
+ margin-top: 11px;
display: flex;
justify-content: space-between;
border-bottom: 1px solid #dfdfdf;
+
.card-group {
width: 40%;
+
.card-title {
display: flex;
- margin-bottom: 17px;
+ margin-bottom: 10px;
align-items: center;
+
img {
width: 36px;
height: 40px;
}
}
+
.cardtotal {
display: flex;
align-items: center;
margin-left: 9px;
+
p {
font-weight: bold;
font-size: 14px;
color: #363636;
}
+
span {
font-weight: 400;
font-size: 14px;
color: #7c8091;
}
+
.total-number {
font-family: 'Source Han Sans CN';
@@ -624,38 +645,44 @@
color: #2a54ff;
}
}
+
.status-grid {
display: grid;
grid-template-columns: repeat(2, 1fr);
row-gap: 14px;
gap: 10px;
- margin-bottom: 27px;
+ padding-bottom: 5px;
+
.status-item {
display: flex;
text-align: center;
justify-content: space-between;
height: 97px;
+ // height: pxToVh(107);
max-width: 158px;
background: #f6f8fe;
border-radius: 8px 8px 8px 8px;
- margin-bottom: 9px;
+
img {
width: 26px;
height: 26px;
padding: 9px 10px 9px 2px;
}
+
.statusCon {
display: flex;
flex-direction: column;
// align-items: center;
padding: 5px 4px 9px 10px;
text-align: left;
+
.status-label {
font-weight: 400;
font-size: 14px;
text-align: left;
color: #383838;
}
+
.ratio {
font-weight: 400;
font-size: 12px;
@@ -663,6 +690,7 @@
white-space: nowrap;
text-align: left;
}
+
.status-value {
font-family: 'Source Han Sans CN';
font-weight: bold;
@@ -683,10 +711,12 @@
}
}
}
+
.charts {
margin-top: 30px;
- width: 348px;
- height: 242px;
+ width: 100%;
+ height: auto;
+
.chart {
width: 100%;
height: 100%;
@@ -696,41 +726,50 @@
// 飞行统计
.flyOrder {
- margin-top: 10px;
+ margin-top: 5px;
+
.fytitle {
display: flex;
align-items: center;
+
img {
width: 39px;
height: 38px;
}
+
span {
font-weight: bold;
font-size: 14px;
color: #363636;
}
}
+
.flycenter {
- margin-top: 22px;
+ margin-top: 13px;
+
.centerBox {
display: flex;
justify-content: space-between;
margin-bottom: 10px;
+
.centerItem {
padding: 7px 7px 0 15px;
// width: 196px;
flex: 1;
- height: 80px;
+ // height: 80px;
+ height: pxToVh(80);
background: #f6f8fe;
box-shadow: 0px 5px 4px 0px #ebf1ff;
border-radius: 8px 8px 8px 8px;
border: 1px solid #ffffff;
margin-right: 16px;
+
img {
width: 15px;
height: 15px;
margin-right: 5px;
}
+
.flyimg {
display: flex;
align-items: center;
@@ -738,11 +777,13 @@
font-size: 14px;
color: #7c8091;
}
+
.flydata {
- margin-top: 15px;
+ margin-top: 10px;
text-align: right;
font-size: 14px;
color: #7c8091;
+
span {
font-weight: bold;
font-size: 24px;
@@ -756,6 +797,7 @@
.lineChart {
height: 209px;
width: 100%;
+
.lineBox {
width: 100%;
height: 100%;
@@ -764,6 +806,7 @@
}
}
}
+
.centerRight {
width: 40%;
}
@@ -773,6 +816,10 @@
}
.workright {
- width: 32%;
+ width: 0;
+ flex: 1;
+ height: 100%;
+ // display: flex;
+ // flex-direction: column;
}
</style>
diff --git a/vite.config.mjs b/vite.config.mjs
index cbcf19c..c93c35f 100644
--- a/vite.config.mjs
+++ b/vite.config.mjs
@@ -1,20 +1,20 @@
-import { defineConfig, loadEnv } from 'vite';
-import { resolve } from 'path';
-import createVitePlugins from './vite/plugins';
+import { defineConfig, loadEnv } from 'vite'
+import { resolve } from 'path'
+import createVitePlugins from './vite/plugins'
import postCssPxToRem from 'postcss-pxtorem'
// https://vitejs.dev/config/
export default ({ mode, command }) => {
- const env = loadEnv(mode, process.cwd());
- const { VITE_APP_ENV, VITE_APP_BASE, VITE_APP_URL } = env;
+ const env = loadEnv(mode, process.cwd())
+ const { VITE_APP_ENV, VITE_APP_BASE, VITE_APP_URL } = env
// 判断是打生产环境包
- const isProd = VITE_APP_ENV === 'production';
+ const isProd = VITE_APP_ENV === 'production'
// 根据是否生产环境,动态设置压缩配置
const buildConfig = {
outDir: 'manage',
target: 'esnext',
minify: isProd ? 'terser' : 'esbuild', // 根据环境选择压缩工具
- };
+ }
// 如果是生产环境,添加Terser的配置
if (isProd) {
@@ -26,7 +26,7 @@
format: {
comments: false, // 删除所有注释
},
- };
+ }
}
return defineConfig({
base: VITE_APP_BASE,
@@ -36,14 +36,14 @@
__INTLIFY_PROD_DEVTOOLS__: false,
},
server: {
- // port: 2888,
+ port: 5174,
// host: '192.168.1.178',
proxy: {
'/api': {
target: VITE_APP_URL,
changeOrigin: true,
rewrite: path => path.replace(/^\/api/, ''),
- },
+ }
},
},
resolve: {
@@ -56,6 +56,12 @@
},
},
css: {
+ preprocessorOptions: {
+ scss: {
+ api: 'modern-compiler',
+ additionalData: `@use "@/styles/variables.scss" as *;`,
+ },
+ },
postcss: {
plugins: [
postCssPxToRem({
@@ -77,5 +83,5 @@
target: 'esnext',
},
},
- });
-};
+ })
+}
--
Gitblit v1.9.3