flx:优化客户端下载进度提示

This commit is contained in:
Rain_ 2025-09-03 18:01:55 +08:00
parent d16637bdbb
commit 91ca8b345f
8 changed files with 1133 additions and 450 deletions

View File

@ -1,6 +1,6 @@
{
"name": "zhgdyun",
"version": "0.1.0",
"version": "1.0.0",
"private": true,
"scripts": {
"start": "npm run dev",

View File

@ -98,3 +98,12 @@ export const getDictionaryItemPageApi = (data) => get('/xmgl/dictionaryItem/page
export const getDictionaryItemBackApi = (data) => post('/xmgl/dictionary/back', data)
export const deleteDictionaryItemBackApi = (data) => post('/xmgl/dictionary/deletePhysic', data)
export const batchDeleteDictionaryItemBackApi = (data) => post('/xmgl/dictionary/batch/delete', data)
// 获取最新版本信息
export const addexeVersionApi = (data) => post('xmgl/exeVersion/add', data)
export const deleteexeVersionApi = (data) =>
post('xmgl/exeVersion/delete', data)
export const editexeVersionApi = (data) => post('xmgl/exeVersion/edit', data)
export const getexeVersionListApi = (data) => get('xmgl/exeVersion/list', data)
export const getExeVersion = (data) => post('/xmgl/exeVersion/getExeVersion', data)

View File

@ -225,30 +225,30 @@ if (process.env.NODE_ENV == "development") {
// axios.defaults.baseURL = 'http://192.168.34.221:28888/' //郭圣雄本地
// axios.defaults.baseURL = 'http://192.168.34.221:28889/' //郭圣雄本地
// axios.defaults.baseURL = 'http://192.168.34.221:28890/' //郭圣雄本地
// axios.defaults.baseURL = 'http://192.168.34.221:19112/' //郭圣雄本地
axios.defaults.baseURL = "http://192.168.34.221:9111/"; //郭圣雄本地
// axios.defaults.baseURL = 'http://192.168.34.155:19111/' //彭洁本地
// axios.defaults.baseURL = 'http://jxj.zhgdyun.com:51234/' //郭圣雄远程
// axios.defaults.baseURL = 'http://jxj.zhgdyun.com:61212/' //彭洁远程
// axios.defaults.baseURL ='http://101.43.164.214:45020/' //沈阳和盈
// axios.defaults.baseURL ='http://183.249.224.118:9000/' //嘉兴王江泾公用码头
// axios.defaults.baseURL = 'http://101.43.164.214:11111/' // 百色三标段项目
// axios.defaults.baseURL = 'http://125.88.207.86:8088/'//中建四局线上(最新)地址
// axios.defaults.baseURL = 'http://125.88.207.86:8099/'//中建四局(沙湖)线上(最新)地址
// axios.defaults.baseURL = 'http://jxj.zhgdyun.com:15551/'//测试地址
// axios.defaults.baseURL = 'http://47.93.215.234:9809/'//鞍钢正式地址(弃用)
// axios.defaults.baseURL = 'http://42.180.188.17:9809/' //鞍钢正式地址
// axios.defaults.baseURL = 'http://47.93.215.234:11211/'//鞍钢测试地址(弃用)
// axios.defaults.baseURL = 'http://42.180.188.17:11211/' //鞍钢测试地址
// axios.defaults.baseURL = 'http://8.136.222.164:8808/' //中科安信正式地址
// axios.defaults.baseURL = 'http://1.13.185.209:9820/' //中科佳成正式地址
// axios.defaults.baseURL = 'http://192.168.9.249:9820/' //四川网城正式地址
// axios.defaults.baseURL = 'http://jxj.zhgdyun.com:34568/' //四川网城外网映射地址
// axios.defaults.baseURL = 'http://192.168.110.220:9809/' //同济正式地址
// axios.defaults.baseURL = 'http://192.168.100.4:9809/' //乌丹(合肥启程)新正式地址
// axios.defaults.baseURL = "http://jxj.zhgdyun.com:18000/"; //包头化工
// axios.defaults.baseURL = "http://219.147.96.219:9809/"; //包头化工
// axios.defaults.baseURL = "http://192.168.3.9:39809/";
axios.defaults.baseURL = 'http://jxj.zhgdyun.com:51238/' //郭圣雄本地
// axios.defaults.baseURL = "http://192.168.34.221:9111/"; //郭圣雄本地
// axios.defaults.baseURL = 'http://192.168.34.155:19111/' //彭洁本地
// axios.defaults.baseURL = 'http://jxj.zhgdyun.com:51234/' //郭圣雄远程
// axios.defaults.baseURL = 'http://jxj.zhgdyun.com:61212/' //彭洁远程
// axios.defaults.baseURL ='http://101.43.164.214:45020/' //沈阳和盈
// axios.defaults.baseURL ='http://183.249.224.118:9000/' //嘉兴王江泾公用码头
// axios.defaults.baseURL = 'http://101.43.164.214:11111/' // 百色三标段项目
// axios.defaults.baseURL = 'http://125.88.207.86:8088/'//中建四局线上(最新)地址
// axios.defaults.baseURL = 'http://125.88.207.86:8099/'//中建四局(沙湖)线上(最新)地址
// axios.defaults.baseURL = 'http://jxj.zhgdyun.com:15551/'//测试地址
// axios.defaults.baseURL = 'http://47.93.215.234:9809/'//鞍钢正式地址(弃用)
// axios.defaults.baseURL = 'http://42.180.188.17:9809/' //鞍钢正式地址
// axios.defaults.baseURL = 'http://47.93.215.234:11211/'//鞍钢测试地址(弃用)
// axios.defaults.baseURL = 'http://42.180.188.17:11211/' //鞍钢测试地址
// axios.defaults.baseURL = 'http://8.136.222.164:8808/' //中科安信正式地址
// axios.defaults.baseURL = 'http://1.13.185.209:9820/' //中科佳成正式地址
// axios.defaults.baseURL = 'http://192.168.9.249:9820/' //四川网城正式地址
// axios.defaults.baseURL = 'http://jxj.zhgdyun.com:34568/' //四川网城外网映射地址
// axios.defaults.baseURL = 'http://192.168.110.220:9809/' //同济正式地址
// axios.defaults.baseURL = 'http://192.168.100.4:9809/' //乌丹(合肥启程)新正式地址
// axios.defaults.baseURL = "http://jxj.zhgdyun.com:18000/"; //包头化工
// axios.defaults.baseURL = "http://219.147.96.219:9809/"; //包头化工
axios.defaults.baseURL = "http://101.43.164.214:11000/";
} else if (process.env.NODE_ENV == "debug") {
axios.defaults.baseURL = "https://www.ceshi.com";
} else if (process.env.NODE_ENV == "production") {
@ -258,6 +258,7 @@ if (process.env.NODE_ENV == "development") {
// axios.defaults.baseURL = "http://jxj.zhgdyun.com:18000/"; //包头化工
// axios.defaults.baseURL = "http://219.147.96.219:9809/"; //包头化工(正式)
axios.defaults.baseURL = "http://192.168.3.9:39809/"; //包头化工(内网)
// axios.defaults.baseURL = 'http://jxj.zhgdyun.com:51238/'
// axios.defaults.baseURL ='http://192.168.34.216:6023/'
// axios.defaults.baseURL = window.location.protocol + "//" + host.split(":")[0] + ":6023" + "/"
// axios.defaults.baseURL = 'http://zhgd.loganwy.com/`'

View File

@ -88,6 +88,12 @@ const routes2 = [{
component: () =>
import ("../views/jxjadmin/operateManage.vue"),
},
{
path: "/operateManagePc",
name: "operateManagePc",
component: () =>
import ("../views/jxjadmin/operateManagePc.vue"),
},
//字典管理
{
path: "/dictionaryManaged",

View File

@ -95,6 +95,9 @@ export default new Vuex.Store({
// UNIVERURl: "http://219.147.96.219:20000/#/", // word|excel线上
// PREVIEWURL: "http://219.147.96.221:8012/onlinePreview",
// UPLOADURL: 'http://jxj.zhgdyun.com:51238/upload/image/',
// FILEURL: 'http://jxjzw.zhgdyun.com:9001/wisdomisitebaotou/',
// 内网
UPLOADURL: 'http://192.168.3.9:39809' + "/upload/image", //包头化工
// FILEURL: 'http://jxjzw.zhgdyun.com:9001/wisdomisitebaotouprod', //包头化工

File diff suppressed because it is too large Load Diff

View File

@ -510,6 +510,29 @@
</el-form>
</div>
</el-dialog>
<!-- 添加卡片弹框 -->
<el-dialog
:destroy-on-close="true"
:modal-append-to-body="false"
title="下载智慧工地系统"
:visible.sync="cardDialog2"
class="dialog_w900"
>
<div class="dialog_content">
<div class="percentage_title">
{{ this.percentageTitle }}
</div>
<el-progress
style="width: 100%"
:percentage="percentage"
></el-progress>
<!-- <div class="dialog-footer">
<el-button type="primary" icon="el-icon-circle-check" @click="getProgress" size="medium">{{
$t("message.personnelPosition.determine") }}
</el-button>
</div> -->
</div>
</el-dialog>
</div>
</template>
<script>
@ -524,7 +547,10 @@ import {
newRegisterApi,
jumpLargeUserInfoApi,
} from "@/assets/js/api/loginSign";
import { selectSystemLogoConfigApi } from "@/assets/js/api/jxjadmin";
import {
selectSystemLogoConfigApi,
getExeVersion,
} from "@/assets/js/api/jxjadmin";
import { getProjectConfigPageApi } from "@/assets/js/api/configManage";
import getcode from "@/components/getMsgCode";
import { getOneComputerAuthApi } from "@/assets/js/api/loginSign";
@ -532,12 +558,17 @@ import { selectNoticeRemindSoundApi } from "@/assets/js/api/configManage";
import LoginInfo from "./components/loginInfo.vue";
import axios from "axios";
import CryptoJS, { MD5 } from "crypto-js";
import versionData from "../../../package.json";
export default {
name: "login",
components: { getcode, LoginInfo },
data() {
return {
percentage: 0,
percentageTitle: "正在下载中,请稍后",
cardDialog2: false,
equipmentBgImg: "",
firstLoginDialog: false,
isLoadingBtn: false,
isShowContent: false,
@ -708,7 +739,17 @@ export default {
//
this.$nextTick(() => {
this.$alert("请拔掉网线使用局域网wife访问!!");
// Electron
// this.$alert(versionData);
console.log("Electron应用");
if (
window.__isElectron ||
navigator.userAgent.includes("Electron") ||
(typeof process !== "undefined" && process.versions?.electron)
) {
this.$alert("请拔掉网线使用局域网wifi访问!");
this.viewVersionInfo();
}
});
if (encryption) {
@ -846,6 +887,104 @@ export default {
// }
// },
methods: {
viewVersionInfo() {
console.log("进入页面调用", versionData);
const { version } = versionData;
//
getExeVersion({}).then((res) => {
if (res.result) {
console.log("获取平台版本名称", res.result.versionName);
let jxjAppVersionName = res.result.versionName;
console.log("获取平台版本号", res.result.versionNo);
let jxjAppVersionNo = res.result.versionNo;
if (res.result && jxjAppVersionNo !== version) {
this.$confirm(
"更新内容:" + res.result.versionDescribe,
"版本更新",
{
confirmButtonText: "更新",
cancelButtonText: "取消",
type: "warning",
}
)
.then(() => {
console.log("用户点击确定");
// var url = that.url_config + 'image/' + JSON.parse(res.result.downloadUrl)[0].url//
var url = JSON.parse(res.result.downloadUrl)[0]
.url;
console.log("apk地址", url);
// this.$message.info(
// "......"
// );
// window.open(url, "_blank");
this.cardDialog2 = true;
this.getProgress(url);
// window.open(url);
})
.catch(() => {
console.log("用户点击取消");
});
} else {
// this.$message.info("");
}
}
});
},
getProgress(rowUrl) {
// 0
this.percentage = 0;
//
this.$http({
//
url: rowUrl,
// get post
method: "get",
//base64new Blob()
responseType: "blob",
// get-->params post-->data
params: {},
//xml axios
onDownloadProgress: (progressEvent) => {
//progressEvent.loaded
//progressEvent.total
let progressBar = Math.round(
(progressEvent.loaded / progressEvent.total) * 100
);
//99%
if (progressBar >= 99) {
this.percentage = 99;
this.percentageTitle = "下载完成,文件正在编译。";
} else {
this.percentage = progressBar;
this.percentageTitle = "正在下载,请耐心等待...";
}
},
}).then((res) => {
//res.message
if (res.status != 200) {
this.percentageTitle = "下载失败,请重试。";
return;
}
console.log(res.data);
// return;
//
const url = window.URL.createObjectURL(res.data);
// <a>
const link = document.createElement("a");
link.href = url;
link.download = "智慧工地系统.exe"; //
//
document.body.appendChild(link);
link.click();
document.body.removeChild(link);
// URL
window.URL.revokeObjectURL(url);
this.percentageTitle = "下载完成";
//100%100
this.percentage = 100;
});
},
//
savePassfirstLoginBtn() {
this.$refs["passwordForm"].validate((valid) => {
@ -1446,6 +1585,11 @@ export default {
id: 9297,
path: "/operateManage",
},
{
menuName: "客户端版本管理",
id: 9301,
path: "/operateManagePc",
},
{
menuName: "字典管理",
id: 9298,

View File

@ -0,0 +1,319 @@
<template>
<div class="fullHeight whiteBlock">
<div class="table_wrap whiteBlock">
<el-table class="tables" :data="tableData">
<el-table-column type="index" align="center" label="序号"></el-table-column>
<el-table-column prop="versionName" label="版本名称" align="center" :width="$fontSize(180)"></el-table-column>
<el-table-column prop="versionNo" label="版本号" align="center" :width="$fontSize(180)"></el-table-column>
<el-table-column prop="versionDescribe" label="版本描述" align="center" width="550px"></el-table-column>
<el-table-column prop="diffDay" label="客户端地址" align="center" width="500px">
<template slot-scope="scope">
<!-- <a href="">下载</a> -->
<span @click="downloadFn(scope.row.downloadUrl)" class="hovers primaryText">下载</span>
<span @click="copyFn(scope.row)" class="hovers primaryText" style="margin-left: 20px">复制exe地址</span>
<input id="copy_content" type="text" value="" style="position: absolute; top: 0; left: 0; opacity: 0; z-index: -10" />
<span @click="previewFn(scope.row)" class="hovers primaryText" style="margin-left: 20px">预览二维码</span>
<div id="qrcode" ref="qrCodeDiv" style="position: absolute; top: 0; left: 0; opacity: 0; z-index: -10" />
</template>
</el-table-column>
<el-table-column prop="address" label="操作" align="center" width="410px">
<template slot-scope="scope">
<div @click="configuration(scope.row)" class="operationText">
<img src="@/assets/images/icon-edit.png" class="w_15 h_15" />
<span>更新版本</span>
</div>
</template>
</el-table-column>
</el-table>
</div>
<el-dialog :modal-append-to-body="false" title="更新版本" :visible.sync="authorizedDialog" class="dialog_w667">
<div class="dialog_content">
<el-form :model="ruleForm" :rules="rules" size="medium" ref="ruleForm" :label-width="$px2rem(100)" class="demo-ruleForm">
<el-form-item label="版本名称" prop="versionName">
<el-input v-model="ruleForm.versionName" placeholder="和版本号一致"></el-input>
</el-form-item>
<el-form-item label="版本号" prop="versionNo">
<el-input v-model="ruleForm.versionNo" placeholder="请输入"></el-input>
</el-form-item>
<el-form-item label="版本描述" prop="versionDescribe">
<el-input type="textarea" v-model="ruleForm.versionDescribe" placeholder="请输入"></el-input>
</el-form-item>
<el-form-item label="上传exe" prop="downloadUrl">
<el-upload
class="upload-demo"
name="files"
:action="$store.state.UPLOADURL"
:on-remove="handleRemove"
:on-success="(res, file) => handleSuccess(res, file)"
:limit="1"
:file-list="fileList"
>
<el-button size="small" type="primary">点击上传</el-button>
</el-upload>
</el-form-item>
</el-form>
<div class="dialog-footer">
<el-button class="cancleBtn" @click="authorizedDialog = false" icon="el-icon-circle-close" size="medium"> </el-button>
<el-button type="primary" icon="el-icon-circle-check" @click="submitForm('ruleForm')" size="medium"> </el-button>
</div>
</div>
</el-dialog>
<el-image-viewer
v-if="dialogInfo.showImgViewer"
:on-close="closeImgViewer"
:url-list="[dialogInfo.imgPreview]"
:z-index="3000"
:initial-index="dialogInfo.initialImgPreviewIndex"
/>
</div>
</template>
<script>
import { getexeVersionListApi, editexeVersionApi } from '@/assets/js/api/jxjadmin.js';
import QRCode from 'qrcodejs2';
import { isJSON } from '@/util/nowDate';
import ElImageViewer from 'element-ui/packages/image/src/image-viewer';
export default {
name: 'registerAudit',
components: { ElImageViewer },
data() {
return {
dialogInfo: {
imgPreview: '',
initialImgPreviewIndex: 0,
showImgViewer: false
},
checkAll: false,
isIndeterminate: false,
cityOptions: [],
moduleInfo: { moduleId: '' },
companyArr: [],
count: 0,
searchForm: {
companyName: '',
useState: ''
},
total: 0,
pageNo: 1,
pageSize: 10,
tableData: [],
checkList: [],
authorizedDialog: false,
isEnable: 0,
time: '',
ruleForm: {
describe: '',
downloadUrl: '',
versionName: '',
versionNo: ''
},
projectNum: 1,
fileList: [],
rules: {
versionNo: [{ required: true, message: '请输入版本号', trigger: 'blur' }],
downloadUrl: [{ required: true, message: '请上传exe', trigger: 'change' }]
}
};
},
created() {
this.getListData();
},
methods: {
closeImgViewer() {
this.dialogInfo.showImgViewer = false;
},
previewFn(row) {
console.log('预览:', row);
const url = isJSON(row.downloadUrl) && row.downloadUrl ? JSON.parse(row.downloadUrl)[0].url : '';
if (url) {
this.bindQRCode(this.$store.state.FILEURL + url);
}
},
//
bindQRCode(url) {
document.getElementById('qrcode').innerHTML = '';
// `${httpUrl}/doc/h5Entry/index.html?userId=${userId}&projectSn=${projectSn}`
const qrCode = new QRCode(this.$refs.qrCodeDiv, {
text: `${url}`,
width: this.$fontSize(200),
height: this.$fontSize(200),
colorDark: '#333333', //
colorLight: '#ffffff', //
correctLevel: QRCode.CorrectLevel.L //L/M/H
});
const img = qrCode._el.querySelector('img');
img.onload = () => {
//img.onload()srcnull
console.log('二维码:', qrCode._el.querySelector('img'), qrCode._el.querySelector('img').src);
this.dialogInfo.imgPreview = qrCode._el.querySelector('img').src;
console.log('二维码:', this.dialogInfo.imgPreview);
if (this.dialogInfo.imgPreview) {
console.log('二维码:', this.dialogInfo.imgPreview);
this.dialogInfo.showImgViewer = true;
}
};
},
copyFn(item) {
//
// var clickContent = this.$store.state.FILEURL + JSON.parse(item.downloadUrl)[0].url
var clickContent = JSON.parse(item.downloadUrl)[0].url;
// var clickContent = ElementObj.innerText;
//input
var inputElement = document.getElementById('copy_content');
//input
inputElement.value = clickContent;
//input
inputElement.select();
//
document.execCommand('Copy');
//
alert('已复制');
},
downloadFn(val) {
console.log('点击下载的数据:', val);
if (val == '[]') {
this.$message.error('未查询到附件');
} else {
let arr = [];
arr = JSON.parse(val);
arr.forEach(element => {
const fileName = element.name.substring(0, element.name.lastIndexOf('.'));
let url = this.$http.defaults.baseURL + 'xmgl/upload/getRenameFile?fileUrl=' + element.url + '&fileName=' + fileName;
// console.log(url, fileName);
window.location.href = url;
});
}
// console.log('',item);
// var url = this.$store.state.FILEURL+JSON.parse(item.downloadUrl)[0].url
// window.open(url,'_blank')
},
handleRemove(file, fileList) {
this.fileList = fileList;
},
handleSuccess(res, file) {
if (res.status == 'SUCCESS') {
this.fileList.push({
name: file.name,
url: this.$store.state.FILEURL + file.response.data[0].imageUrl
});
this.ruleForm.downloadUrl = JSON.stringify(this.fileList);
}
},
submitForm(formName) {
this.$refs[formName].validate(valid => {
if (valid) {
// if(this.fileList.length==0){
// this.$message.success('exe')
// return
// }
// this.ruleForm.downloadUrl=JSON.stringify(this.fileList)
editexeVersionApi(this.ruleForm).then(res => {
this.authorizedDialog = false;
this.getListData();
this.$message.success('更新成功!');
});
} else {
console.log('error submit!!');
return false;
}
});
},
//
getListData() {
let data = {};
// let data = this.searchForm;
data.pageNo = this.pageNo;
data.pageSize = this.pageSize;
getexeVersionListApi(data).then(res => {
console.log(res);
this.tableData = res.result.records;
this.total = res.result.total;
});
},
resetForm() {
this.$refs['searchForm'].resetFields();
this.getListData();
},
// --
configuration(item) {
this.authorizedDialog = true;
this.ruleForm = JSON.parse(JSON.stringify(item));
this.fileList = JSON.parse(this.ruleForm.downloadUrl);
// this.$confirm(', ?', '', {
// confirmButtonText: '',
// cancelButtonText: '',
// type: 'warning'
// }).then(() => {
// this.$message({
// type: 'success',
// message: '!'
// });
// }).catch(() => {
// this.$message({
// type: 'info',
// message: ''
// });
// });
},
//
handleSizeChange(val) {
this.pageSize = val;
this.getListData();
},
//
handleCurrentChange(val) {
this.pageNo = val;
this.getListData();
}
}
};
</script>
<style lang="less" scoped>
.dialogTable {
display: flex;
align-items: center;
width: 100%;
border: 1px solid #f5f4f5;
margin: 0 auto;
border-bottom: none;
}
.dialogTable:last-child {
border-bottom: 1px solid #f5f4f5;
}
.dialogTable_l {
width: 120px;
text-align: center;
}
.dialogTable_r {
width: 94%;
padding: 5px 0;
padding-left: 30px;
border-left: 1px solid #f5f4f5;
}
.el-checkbox {
width: 46%;
margin: 10px 0;
}
.zdy-checkbox {
display: flex;
flex-wrap: wrap;
justify-content: space-between;
> label {
width: 30%;
}
}
.CheckboxTitle {
font-size: 14px;
width: 100%;
}
</style>