Merge branch 'refs/heads/test' into feature/v3.0.0/个人工作台
9 files modified
4 files added
| New file |
| | |
| | | |
| | | 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 |
| | |
| | | "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": { |
| | |
| | | "vite-plugin-compression": "^0.5.1", |
| | | "vite-plugin-vue-setup-extend": "^0.4.0" |
| | | } |
| | | } |
| | | } |
| New file |
| | |
| | | export default function getBaseConfig () { |
| | | return { |
| | | loginTitle: '中图智飞低空智能感知网平台', //登陆页面标题 |
| | | } |
| | | } |
| New file |
| | |
| | | export default function getBaseConfig () { |
| | | return { |
| | | userLoginTitle (key) { |
| | | return '大吉山钨业无人机安防监测平台' |
| | | }, |
| | | |
| | | loginTitle: '大吉山钨业无人机安防监测平台', |
| | | |
| | | |
| | | |
| | | } |
| | | } |
| New file |
| | |
| | | |
| | | // 直接导入所有配置文件 |
| | | 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 |
| | |
| | | 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: { |
| | |
| | | data() { |
| | | return { |
| | | login:{ |
| | | info: '中图智绘低空无人机监测网平台' |
| | | info: loginTitle |
| | | }, |
| | | website: website, |
| | | time: '', |
| | |
| | | created() { |
| | | this.handleLogin(); |
| | | this.getTime(); |
| | | if(!loginTitle) { |
| | | this.getSysConfigInfo(); |
| | | } |
| | | |
| | | }, |
| | | mounted() {}, |
| | | computed: { |
| | |
| | | let sysConfigId = this.$route.query?.id || 1; |
| | | getDetail(sysConfigId).then(res=>{ |
| | | this.login.info = res.data.data.name |
| | | |
| | | }) |
| | | }, |
| | | getTime() { |
| | |
| | | ref="imageRef" |
| | | :src="getSmallImg(item.url)" |
| | | show-progress |
| | | :preview-src-list="[getSmallImg(item.url)]" |
| | | :preview-src-list="[getShowImg(item.url)]" |
| | | fit="cover" |
| | | /> |
| | | |
| | |
| | | |
| | | 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; |
| | |
| | | &: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; |
| | |
| | | </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"> |
| | |
| | | |
| | | <script setup> |
| | | import { getMultipleDictionary } from '@/api/job/task' |
| | | import { pxToRem } from '@/utils/rem' |
| | | import { pxToRem } from '@/utils/rem'; |
| | | |
| | | // 接收父组件传参 |
| | | const props = defineProps({ |
| | |
| | | <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> |
| | |
| | | </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> |
| | | <!-- 添加任务 --> |
| | |
| | | |
| | | :deep(.el-pagination) { |
| | | display: flex; |
| | | justify-content: flex-end; |
| | | justify-content: right; |
| | | } |
| | | |
| | | :deep(.el-pagination button) { |
| | |
| | | <!-- filepath: /d:/work/drone-web-manage/src/views/license/upload.vue --> |
| | | <template> |
| | | <basic-container> |
| | | <!-- <basic-container> |
| | | <el-upload |
| | | class="upload-demo" |
| | | drag |
| | |
| | | <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> |
| | |
| | | <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> |
| | | |
| | |
| | | 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'; |
| | |
| | | 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` |
| | |
| | | |
| | | const titleClick = (item, index) => { |
| | | checked.value = index; |
| | | if (index === 2) { |
| | | getFindLicenseDate(); |
| | | } |
| | | }; |
| | | const getUserInfoData = () => { |
| | | getUserInfo().then(res => { |
| | |
| | | }; |
| | | 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 => { |
| | |
| | | .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> |
| | |
| | | <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) : ''"> |
| | |
| | | <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"> |
| | |
| | | </div> |
| | | </template> |
| | | </el-upload> |
| | | |
| | | <div class="upload-tip">需上传含有地址信息的照片(jpg、jpeg、png),且不超过5M</div> |
| | | </el-form-item> |
| | | </el-col> |
| | |
| | | </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' |
| | |
| | | } 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) { |
| | |
| | | |
| | | 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) { |
| | |
| | | return '/' |
| | | } |
| | | }, |
| | | |
| | | popupShowImage () { |
| | | return (list) => { |
| | | |
| | | return list.map(item => ({ |
| | | ...item, |
| | | url: getShowImg(item.url) |
| | | })) |
| | | } |
| | | } |
| | | }, |
| | | |
| | | methods: { |
| | |
| | | }, |
| | | |
| | | async handleViewDetail (row) { |
| | | |
| | | // 找到当前行在tableData中的索引 |
| | | this.currentIndex = this.tableData.findIndex(item => item.id === row.id) |
| | | // 先设置workType,直接从row读取 |
| | |
| | | address: row.address || '', |
| | | content: row.content, |
| | | photos: [], |
| | | |
| | | } |
| | | |
| | | let curLocation = [] |