From 0d3c2e872b055bcb22bc5973cc2aa91eca70c4ad Mon Sep 17 00:00:00 2001
From: 张含笑 <zhx18749296735@163.com>
Date: Tue, 15 Jul 2025 10:46:29 +0800
Subject: [PATCH] Merge branch 'refs/heads/test' into feature/v3.0.0/个人工作台
---
src/page/login/index.vue | 9 +
src/views/job/components/TaskIntermediateContent/TaskIntermediateContent.vue | 37 ++++-
src/views/system/userinfo.vue | 68 -----------
src/views/tickets/ticket.vue | 29 ++++
.env.jiangwu | 42 +++++++
src/buildConfig/config.js | 14 ++
src/buildConfig/buildConfig/config.jiangwu.js | 12 ++
src/views/job/components/TaskAlgorithmBusiness.vue | 2
src/views/job/components/JobRelatedEvents.vue | 2
package.json | 3
src/views/algorithmRepository/algorithmRepository.vue | 5
src/buildConfig/buildConfig/config.default.js | 5
src/views/license/upload.vue | 113 ++++++++++++++----
13 files changed, 226 insertions(+), 115 deletions(-)
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/package.json b/package.json
index d943714..056da91 100644
--- a/package.json
+++ b/package.json
@@ -7,6 +7,7 @@
"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": {
@@ -51,4 +52,4 @@
"vite-plugin-compression": "^0.5.1",
"vite-plugin-vue-setup-extend": "^0.4.0"
}
-}
\ No newline at end of file
+}
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/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/views/algorithmRepository/algorithmRepository.vue b/src/views/algorithmRepository/algorithmRepository.vue
index bfe602c..ad3ee3a 100644
--- a/src/views/algorithmRepository/algorithmRepository.vue
+++ b/src/views/algorithmRepository/algorithmRepository.vue
@@ -73,7 +73,7 @@
ref="imageRef"
:src="getSmallImg(item.url)"
show-progress
- :preview-src-list="[getSmallImg(item.url)]"
+ :preview-src-list="[getShowImg(item.url)]"
fit="cover"
/>
@@ -110,7 +110,7 @@
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;
@@ -259,6 +259,7 @@
&: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;
diff --git a/src/views/job/components/JobRelatedEvents.vue b/src/views/job/components/JobRelatedEvents.vue
index dc56dd8..6826bef 100644
--- a/src/views/job/components/JobRelatedEvents.vue
+++ b/src/views/job/components/JobRelatedEvents.vue
@@ -28,7 +28,7 @@
</div>
<div class="item">
<div class="itemchild">关联算法:</div>
- <TaskAlgorithmBusiness :setWidth="186 +'px'" :showAlgorithm="true" @algorithmChange="algorithmChange" />
+ <TaskAlgorithmBusiness :setWidth="186" :showAlgorithm="true" @algorithmChange="algorithmChange" />
</div>
</div>
<div class="search-btn">
diff --git a/src/views/job/components/TaskAlgorithmBusiness.vue b/src/views/job/components/TaskAlgorithmBusiness.vue
index 427e708..4eaba7a 100644
--- a/src/views/job/components/TaskAlgorithmBusiness.vue
+++ b/src/views/job/components/TaskAlgorithmBusiness.vue
@@ -31,7 +31,7 @@
<script setup>
import { getMultipleDictionary } from '@/api/job/task'
-import { pxToRem } from '@/utils/rem'
+import { pxToRem } from '@/utils/rem';
// 接收父组件传参
const props = defineProps({
diff --git a/src/views/job/components/TaskIntermediateContent/TaskIntermediateContent.vue b/src/views/job/components/TaskIntermediateContent/TaskIntermediateContent.vue
index 82de1e3..dce80ad 100644
--- a/src/views/job/components/TaskIntermediateContent/TaskIntermediateContent.vue
+++ b/src/views/job/components/TaskIntermediateContent/TaskIntermediateContent.vue
@@ -50,12 +50,22 @@
<el-table-column prop="creator_name" label="创建人" align="center" show-overflow-tooltip />
<el-table-column label="操作" width="200" align="center">
<template #default="scope">
- <div v-if="scope.row.status === 2" class="btnItem turnBack" link type="primary"
- @click="turnBack(scope.row)">
+ <div
+ v-if="scope.row.status === 2"
+ class="btnItem"
+ 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)">
+ <div
+ v-if="scope.row.status === 1"
+ class="btnItem"
+ link
+ type="primary"
+ @click="cancelTask(scope.row)"
+ >
取消任务
</div>
<div class="btnItem" link type="primary" @click="handleDetail(scope.row)">查看</div>
@@ -64,10 +74,19 @@
</el-table>
</div>
<div class="pagination">
- <el-pagination class="ztzf-pagination" popper-class="custom-pagination-dropdown"
- v-model:current-page="jobListParams.current" v-model:page-size="jobListParams.size"
- :page-sizes="[10, 20, 30, 40]" layout="prev, pager, next, sizes, jumper" :total="total"
- @size-change="handleSizeChange" @current-change="handleCurrentChange" />
+ <el-pagination
+ class="ztzf-pagination"
+ popper-class="custom-pagination-dropdown"
+ background
+ :page-sizes="[10, 20, 30, 40]"
+ :size="size"
+ v-model:current-page="jobListParams.current"
+ v-model:page-size="jobListParams.size"
+ layout="total, sizes, prev, pager, next, jumper"
+ :total="total"
+ @size-change="handleSizeChange"
+ @current-change="handleCurrentChange"
+ />
</div>
</div>
<!-- 添加任务 -->
@@ -271,7 +290,7 @@
:deep(.el-pagination) {
display: flex;
- justify-content: flex-end;
+ justify-content: right;
}
:deep(.el-pagination button) {
diff --git a/src/views/license/upload.vue b/src/views/license/upload.vue
index c9378c6..3743ac2 100644
--- a/src/views/license/upload.vue
+++ b/src/views/license/upload.vue
@@ -1,6 +1,6 @@
<!-- filepath: /d:/work/drone-web-manage/src/views/license/upload.vue -->
<template>
- <basic-container>
+ <!-- <basic-container>
<el-upload
class="upload-demo"
drag
@@ -12,46 +12,101 @@
<div class="el-upload__text">将文件拖到此处,或<em>点击上传</em></div>
<div class="el-upload__tip">仅支持扩展名:lic</div>
</el-upload>
- </basic-container>
+ </basic-container> -->
+ <!-- 密钥上传 -->
+ <div class="upload-file">
+ <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"
+ :show-file-list="false"
+ :before-upload="handleUpload"
+ >
+ <div class="upload-btn">密钥上传</div>
+ </el-upload>
+ <div class="password-time">密钥有效期:{{ passwordTime || '永久有效' }}</div>
+ </div>
</template>
<script>
import { uploadLicense } from '@/api/license/uploadLicense';
+import { findLicenseDate } from '@/api/system/dict';
+import uploadSuccess from '@/assets/images/uoload-success.png';
+import uploadError from '@/assets/images/upload-error.png';
export default {
+ data() {
+ return {
+ isSuccess: '', // 上传状态
+ passwordTime: '', // 密钥有效期
+ uploadSuccess, // 上传成功图片
+ uploadError, // 上传失败图片
+ };
+ },
+ mounted() {
+ this.getFindLicenseDate();
+ },
methods: {
- async customUpload({ file }) {
- try {
- const response = await uploadLicense(file);
- if (response.data.success) {
- this.$message.success('文件上传成功');
- } else {
- this.$message.error(response.data.message || '文件上传失败');
- }
- } catch (error) {
- console.error('上传失败:', error);
- this.$message.error('文件上传失败');
- }
+ handleUpload(file) {
+ uploadLicense(file)
+ .then(res => {
+ console.log(res.data.code,'444')
+ if (res.data.code !== 200) return this.$message.error('上传失败');
+ this.$message.success('上传成功');
+ this.isSuccess = 'success';
+ this.getFindLicenseDate();
+ })
+ .catch(err => {
+ this.isSuccess = 'error';
+ this.$message.error('上传失败');
+ });
+ },
+ getFindLicenseDate() {
+ findLicenseDate()
+ .then(res => {
+ if (res.data.code !== 0) return this.$message.error('上传失败');
+ this.passwordTime = res.data.data;
+ })
+ .catch(err => {
+ this.$message.error('获取失败失败');
+ });
},
},
};
</script>
-<style scoped>
-.upload-demo {
- width: 100%;
- border: 2px dashed #d9d9d9;
- border-radius: 6px;
- background-color: #fafafa;
+<style scoped lang="scss">
+.upload-file {
+ text-align: center;
+ margin-top: 60px;
+ .upload-btn {
+ width: 93px;
+ height: 38px;
+ background: #DDEBFF;
+ border-radius: 8px 8px 8px 8px;
+ border: 1px solid #409EFF;
text-align: center;
- padding: 40px 20px;
-}
-.el-upload__text {
- font-size: 16px;
- color: #606266;
-}
-.el-upload__tip {
- font-size: 12px;
- color: #909399;
+ 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;
+ width: 100%;
+ height: 16px;
+ font-family: Source Han Sans CN, Source Han Sans CN;
+ font-weight: 400;
+ font-size: 14px;
+ color: #2d9dff;
+ line-height: 16px;
+ // text-align: left;
+ }
}
</style>
\ No newline at end of file
diff --git a/src/views/system/userinfo.vue b/src/views/system/userinfo.vue
index acef2d7..23f8d87 100644
--- a/src/views/system/userinfo.vue
+++ b/src/views/system/userinfo.vue
@@ -108,22 +108,6 @@
<el-button @click="reset">重置</el-button>
</div>
</div>
- <!-- 密钥上传 -->
- <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"
- :show-file-list="false"
- :before-upload="handleUpload"
- >
- <div class="upload-btn">密钥上传</div>
- </el-upload>
- <div class="password-time">密钥有效期:{{ passwordTime || '永久有效' }}</div>
- </div>
</div>
</template>
@@ -136,7 +120,6 @@
import request from '@/axios';
import { getUserInfo, updateInfo, updatePassword } from '@/api/system/user';
import { findLicenseDate } from '@/api/system/dict';
-import { uploadLicense } from '@/api/license/uploadLicense';
import uploadSuccess from '@/assets/images/uoload-success.png';
import uploadError from '@/assets/images/upload-error.png';
import cancel1 from '@/assets/images/task/cancel1.png';
@@ -146,7 +129,7 @@
const token = getToken();
const userinforShow = defineModel('show');
const userInfoAs = computed(() => store.state.user.userInfo);
-const titleList = ref(['个人信息', '修改密码', '密钥上传']);
+const titleList = ref(['个人信息', '修改密码']);
const checked = ref(0);
const uploadUrl = computed(
() => `${import.meta.env.VITE_APP_API_URL}/blade-resource/oss/endpoint/put-file`
@@ -221,9 +204,6 @@
const titleClick = (item, index) => {
checked.value = index;
- if (index === 2) {
- getFindLicenseDate();
- }
};
const getUserInfoData = () => {
getUserInfo().then(res => {
@@ -285,21 +265,6 @@
};
const isSuccess = ref('');
const passwordTime = ref('');
-const handleUpload = file => {
- const formData = new FormData();
- formData.append('file', file);
- uploadLicense(formData)
- .then(res => {
- if (res.data.code !== 200) return ElMessage.error('上传失败');
- ElMessage.success('上传成功');
- isSuccess.value = 'success';
- getFindLicenseDate();
- })
- .catch(err => {
- isSuccess.value = 'error';
- ElMessage.error('上传失败');
- });
-};
const getFindLicenseDate = () => {
findLicenseDate()
.then(res => {
@@ -415,34 +380,5 @@
.passwordBox {
margin-top: 40px;
}
-.upload-file {
- text-align: center;
- margin-top: 60px;
- .upload-btn {
- width: 93px;
- height: 38px;
- background: #DDEBFF;
- border-radius: 8px 8px 8px 8px;
- 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;
- width: 100%;
- height: 16px;
- font-family: Source Han Sans CN, Source Han Sans CN;
- font-weight: 400;
- font-size: 14px;
- color: #2d9dff;
- line-height: 16px;
- // text-align: left;
- }
-}
+
</style>
diff --git a/src/views/tickets/ticket.vue b/src/views/tickets/ticket.vue
index 34a7844..8f0b377 100644
--- a/src/views/tickets/ticket.vue
+++ b/src/views/tickets/ticket.vue
@@ -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) : ''">
@@ -147,7 +150,7 @@
<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> -->
<div class="el-icon-plus">
@@ -155,6 +158,7 @@
</div>
</template>
</el-upload>
+
<div class="upload-tip">需上传含有地址信息的照片(jpg、jpeg、png),且不超过5M</div>
</el-form-item>
</el-col>
@@ -504,6 +508,7 @@
</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'
@@ -519,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) {
@@ -730,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) {
@@ -968,6 +977,16 @@
return '/'
}
},
+
+ popupShowImage () {
+ return (list) => {
+
+ return list.map(item => ({
+ ...item,
+ url: getShowImg(item.url)
+ }))
+ }
+ }
},
methods: {
@@ -1520,6 +1539,7 @@
},
async handleViewDetail (row) {
+
// 找到当前行在tableData中的索引
this.currentIndex = this.tableData.findIndex(item => item.id === row.id)
// 先设置workType,直接从row读取
@@ -2074,6 +2094,7 @@
address: row.address || '',
content: row.content,
photos: [],
+
}
let curLocation = []
--
Gitblit v1.9.3