增加版本管理

This commit is contained in:
aixianling
2022-03-02 17:25:35 +08:00
parent b9d07f88c8
commit 4d30281c5b

View File

@@ -0,0 +1,465 @@
<template>
<section class="AppNativeAppVersion">
<ai-list>
<ai-title slot="title" title="App版本管理" isShowBottomBorder/>
<template #content>
<ai-search-bar>
<template #left>
<el-select size="small" v-model="search.type" clearable @change="page.current=1,searchList()"
placeholder="请选择系统">
<el-option
v-for="item in system"
:key="item.value"
:label="item.label"
:value="item.value">
</el-option>
</el-select>
</template>
<template #right>
<el-input size="small" v-model.trim="search.versionName" placeholder="版本号/版本名称" clearable
@keyup.enter.native="page.current=1,searchList()" prefix-icon="iconfont iconSearch"/>
</template>
</ai-search-bar>
<ai-search-bar>
<template #left>
<el-button
size="small"
type="primary"
icon="iconfont iconAdd"
@click="toAdd()">添加
</el-button>
</template>
</ai-search-bar>
<el-table
:data="list"
v-loading="loading"
header-cell-class-name="table-header"
tooltip-effect="light"
row-class-name="table-row"
cell-class-name="table-cell"
@selection-change="v=>this.selectAccounts=v"
max-height="calc(100% - 200px)">
<el-table-column
v-for="(item,i) in recordCols"
:key="i" :prop="item.prop"
show-overflow-tooltip
:label="item.label"
:align="item.align"
:width="item.width">
<div class="nowarp-text" slot-scope="{row}">
{{ row[item.prop] || "-" }}
</div>
</el-table-column>
<el-table-column align="center" label="系统" :width="120">
<template slot-scope="{row}">
<span v-if="row.type === '0'">安卓</span>
<span v-else-if="row.type === '2'">评党课_安卓</span>
<span v-else-if="row.type === '3'">河包镇_安卓</span>
<span v-else>苹果</span>
</template>
</el-table-column>
<el-table-column align="center" label="是否强制更新" :width="120">
<template slot-scope="{row}">
<span v-if="row.type === '0'">{{ row.isForceUpdate === '0' ? '否' : '是' }}</span>
<span v-else>-</span>
</template>
</el-table-column>
<el-table-column align="center" label="下载二维码">
<div slot-scope="{row}">
<img @click="showQRcode(row.qrCodeUrl)" title="预览" style="margin: 10px 0;width: 80px;cursor: pointer;"
:src="row.qrCodeUrl">
</div>
</el-table-column>
<el-table-column align="center" prop="createTime" label="上传时间">
</el-table-column>
<el-table-column align="center" label="操作">
<template slot-scope="{row}">
<el-button
v-if="row.type === '0'"
class="account-list-operation icon-color89B"
type="text"
icon="iconfont iconDownload"
title="下载"
@click="download(row)"
></el-button>
<el-button
v-if="$permissions('admin_sysuser_del')"
class="account-list-operation icon-color89B"
type="text"
icon="iconfont iconDelete"
title="删除"
@click="remove(row.id)">
</el-button>
</template>
</el-table-column>
<div slot="empty" class="no-data"></div>
</el-table>
<div class="pagination">
<el-pagination
@size-change="handleSizeChange"
@current-change="handleCurrentChange"
:current-page="page.current"
background :page-size="page.pageSize"
:page-sizes="[10, 20, 50, 100,200]"
layout="total,prev, pager, next,sizes, jumper"
:total="total">
</el-pagination>
</div>
</template>
</ai-list>
<el-dialog
title="新增版本"
:close-on-click-modal="false"
class="editStyle"
:visible.sync="dialog.add.visible"
width="600px"
@close="closeAdd">
<el-form ref="addVersionForm" :model="dialog.add" :rules="rules.add" size="small" label-width="120px">
<el-form-item required label="系统" prop="type">
<el-select style="width: 240px" v-model="dialog.add.type" placeholder="请选择" @change="onSystemChange">
<el-option
v-for="item in system"
v-show="item.label !== '全部'"
:key="item.value"
:label="item.label"
:value="item.value">
</el-option>
</el-select>
</el-form-item>
<el-form-item required label="版本号" prop="versionCode">
<el-input style="width: 240px" v-model.trim="dialog.add.versionCode" placeholder="请输入..."
clearable></el-input>
</el-form-item>
<el-form-item required label="版本名称" prop="versionName">
<el-input style="width: 240px" v-model.trim="dialog.add.versionName" placeholder="请输入..."
clearable></el-input>
</el-form-item>
<el-form-item required label="更新日志" prop="updateLog">
<el-input style="width: 240px" type="textarea" :rows="3" v-model="dialog.add.updateLog" placeholder="请输入..."
clearable></el-input>
</el-form-item>
<el-form-item :required="dialog.add.type === '0'" v-if="dialog.add.type === '0'" label="是否强制更新"
prop="isForceUpdate">
<el-switch
v-model="dialog.add.isForceUpdate" active-value="1" inactive-value="0">
</el-switch>
</el-form-item>
<el-form-item :required="dialog.add.type === '1'" v-if="dialog.add.type === '1'" label="appstore 地址"
prop="downloadUrl">
<el-input style="width: 240px" v-model.trim="dialog.add.downloadUrl" placeholder="请输入..." clearable>
</el-input>
</el-form-item>
<el-form-item :required="dialog.add.type === '0'" v-if="dialog.add.type === '0'" label="上传APK"
prop="downloadUrl">
<el-upload
class="upload-demo"
width="240px"
action
:multiple="false"
accept=".apk"
:limit="1"
:file-list="fileList"
:on-success="onSuccess"
:on-error="onError"
:on-remove="handleRemove"
:on-change="handleChange"
:http-request="uploadFile">
<el-button size="small" icon="el-icon-upload" type="primary">点击上传</el-button>
<div class="el-upload__tip" slot="tip">只能上传APK文件</div>
</el-upload>
<!--<el-upload
class="upload-demo"
width="240px"
:multiple="false"
accept="file"
:limit="1"
:file-list="fileList"
:headers="headers"
:on-success="onSuccess"
:on-error="onError"
:before-upload="onBeforeUpload"
action="/lan/admin/file/add-apk">
<el-button size="small" icon="el-icon-upload" type="primary">点击上传</el-button>
<div class="el-upload__tip" slot="tip">只能上传APK文件</div>
</el-upload>-->
</el-form-item>
</el-form>
<div slot="footer" style="text-align: center">
<el-button style="width:92px" size="small" @click="dialog.add.visible=false">取消</el-button>
<el-button style="width:92px" size="small" type="primary" @click="addVersion">确认</el-button>
</div>
</el-dialog>
<el-dialog
title="下载二维码"
:visible.sync="isShowQRcode"
width="30%"
center
:before-close="handleClose">
<div style="text-align: center;">
<img :src="qrcode">
</div>
</el-dialog>
</section>
</template>
<script>
export default {
name: "AppNativeAppVersion",
label: "App版本管理",
props: {
instance: Function,
dict: Object,
permissions: Function
},
data() {
return {
list: [],
loading: true,
headers: {},
isShowQRcode: false,
qrcode: '',
search: {
versionCode: '',
type: ''
},
system: [
{
value: '0',
label: '安卓'
},
{
value: '1',
label: '苹果'
},
{
value: '2',
label: '评党课_安卓'
},
{
value: '3',
label: '河镇镇_安卓'
}
],
recordCols: [
{label: '版本号', prop: 'versionCode', align: 'center', width: 100},
{label: '版本名称', prop: 'versionName', align: 'center', width: 100},
{label: '更新日志', prop: 'updateLog', align: 'center'}
],
page: {
current: 1,
size: 10
},
total: 0,
rules: {
add: {
versionCode: [{required: true, message: '请填写版本号'}],
versionName: [{required: true, message: '请填写版本名称'}],
updateLog: [{required: true, message: '请填写更新日志'}],
isForceUpdate: [{required: true, message: '请选择是否强制更新'}],
downloadUrl: [{required: true, message: '请上传apk文件'}]
}
},
unitObj: {},
dialog: {
add: {
versionCode: '',
versionName: '',
updateLog: '',
isForceUpdate: '0',
downloadUrl: '',
qrCodeUrl: '',
visible: false,
type: '0'
}
},
fileList: []
}
},
mounted() {
this.headers = {
Authorization: JSON.parse(localStorage.getItem('vuex')).user.token
}
this.getVersionList()
},
methods: {
// 上传APK
uploadFile: function (file) {
let formData = new FormData();
formData.append("file", file.file);
this.instance.post(`/admin/file/add-apk`, formData).then(res => {
if (res.code == 0) {
this.dialog.add.downloadUrl = res.data.split(';').shift()
// let apkUrl = res.data.split(';');
// this.fileList = [];
// this.fileList.push({id: apkUrl[1], url: apkUrl[0]});
}
});
},
handleRemove(file, fileList) {
this.fileList = fileList;
},
handleChange(file, fileList) {
this.fileList = fileList;
},
// 查询
searchList() {
this.page.current = 1
this.$nextTick(() => {
this.getVersionList()
})
},
// 重置查询条件
resetConditon() {
this.search.versionCode = ''
this.search.type = ''
this.page.current = 1
this.getVersionList()
},
// 获取历史版本列表
getVersionList() {
this.loading = true
this.instance.post('/admin/sysversion/list', null, {
params: {
...this.page,
...this.search
}
}).then(({data}) => {
this.list = data.records
this.total = data.total
this.$nextTick(() => {
this.loading = false
})
})
},
// 关闭图片预览回调
handleClose() {
this.isShowQRcode = false
this.qrcode = ''
},
// 图片预览
showQRcode(src) {
this.qrcode = src
this.$nextTick(() => {
this.isShowQRcode = true
})
},
// 分页change
handleCurrentChange(val) {
this.page.current = val;
this.getVersionList();
},
// 分页页数change
handleSizeChange(val) {
this.page.size = val;
this.getVersionList();
},
// 下载apk
download(row) {
var a = document.createElement('a')
a.setAttribute('download', '')
a.href = row.downloadUrl.split(';')[0]
a.click()
},
// 删除版本
remove(id) {
this.$confirm('确认删除该版本吗?').then(() => {
this.instance.post('/admin/sysversion/delete', null, {
params: {
ids: id
}
}).then(res => {
if (res.code === 0) {
this.getVersionList()
this.$message.success('删除成功')
}
})
}).catch(() => {
})
},
// apk文件校验
onBeforeUpload(file) {
const type = file.name && file.name.split('.')[1]
if (type === 'apk') {
return true
}
this.$message('请上传apk文件')
return false
},
// 文件上传成功回调
onSuccess(res) {
if (res.code === 0) {
this.dialog.add.downloadUrl = res.data
} else {
this.$message.error(res.msg)
}
},
// 文件上传失败回调
onError() {
this.$message.error('上传失败')
},
// 新增版本表单充值
closeAdd() {
this.dialog.add.versionCode = ''
this.dialog.add.versionName = ''
this.dialog.add.updateLog = ''
this.dialog.add.isForceUpdate = '0'
this.dialog.add.downloadUrl = ''
this.dialog.add.qrCodeUrl = ''
this.dialog.add.visible = false
this.dialog.add.type = '0'
this.fileList = []
},
// 添加版本
toAdd() {
this.dialog.add.visible = true;
this.$nextTick(() => {
this.$refs.addVersionForm.resetFields()
})
},
// 添加版本
addVersion() {
this.page.pageNum = 1;
this.$refs.addVersionForm.validate(v => {
if (v) {
this.instance.post('/admin/sysversion/addOrUpdate', this.dialog.add).then(() => {
this.dialog.add.visible = false
this.getVersionList()
this.$message.success('添加成功!')
})
}
})
},
// 重置表单校验
onSystemChange() {
this.$refs.addVersionForm.clearValidate()
}
}
}
</script>
<style lang="scss" scoped>
.AppNativeAppVersion {
height: 100%;
}
</style>