This commit is contained in:
menxipeng
2025-11-04 22:40:40 +08:00
parent e53658b13f
commit d367d40255
3 changed files with 490 additions and 26 deletions

View File

@@ -67,21 +67,21 @@ spring:
enabled: true enabled: true
# redis 配置 # redis 配置
redis: redis:
host: 116.204.124.80 # host: 116.204.124.80
# 端口默认为6379
port: 16379
# 数据库索引
database: 0
# 密码
password: Lwz19520416443@
# # 地址
# host: 127.0.0.1
# # 端口默认为6379 # # 端口默认为6379
# port: 6379 # port: 16379
# # 数据库索引 # # 数据库索引
# database: 0 # database: 0
# # 密码 # # 密码
# password: # password: Lwz19520416443@
# # 地址
host: 127.0.0.1
# 端口默认为6379
port: 6379
# 数据库索引
database: 0
# 密码
password:
# 连接超时时间 # 连接超时时间
timeout: 10s timeout: 10s
lettuce: lettuce:

View File

@@ -158,18 +158,19 @@
</el-form-item> </el-form-item>
<el-form-item label="APK下载" prop="downloadUrl"> <el-form-item label="APK下载" prop="downloadUrl">
<el-upload <el-upload
ref="uploadRef"
class="upload-demo" class="upload-demo"
action="" action=""
:auto-upload="false" :auto-upload="false"
:show-file-list="false" :show-file-list="true"
:on-change="handleFileChange"
:before-upload="beforeUpload"
:limit="1" :limit="1"
:on-exceed="handleExceed"> :on-change="handleFileChange"
:on-remove="handleFileRemove"
:before-upload="beforeUpload">
<el-button size="small" type="primary">点击上传</el-button> <el-button size="small" type="primary">点击上传</el-button>
<div slot="tip" class="el-upload__tip">文件大小不超过500MB</div> <div slot="tip" class="el-upload__tip">文件大小不超过500MB可重复上传替换文件</div>
</el-upload> </el-upload>
<el-input v-model="form.downloadUrl" placeholder="文件上传后自动填入地址" readonly style="margin-top: 10px;" /> <el-input v-model="form.downloadUrl" placeholder="文件上传后自动填入地址(可选)" readonly style="margin-top: 10px;" />
</el-form-item> </el-form-item>
<el-form-item label="更新日志" prop="updateLog"> <el-form-item label="更新日志" prop="updateLog">
<el-input v-model="form.updateLog" type="textarea" placeholder="请输入内容" /> <el-input v-model="form.updateLog" type="textarea" placeholder="请输入内容" />
@@ -259,9 +260,6 @@ export default {
channel: [ channel: [
{ required: true, message: "渠道标识不能为空", trigger: "change" } { required: true, message: "渠道标识不能为空", trigger: "change" }
], ],
downloadUrl: [
{ required: true, message: "APK下载地址不能为空", trigger: "blur" }
],
createTime: [ createTime: [
{ required: true, message: "创建时间不能为空", trigger: "blur" } { required: true, message: "创建时间不能为空", trigger: "blur" }
], ],
@@ -302,7 +300,12 @@ export default {
updateLog: null, updateLog: null,
size: null, size: null,
createTime: null, createTime: null,
updateTime: null updateTime: null,
file: null
}
// 清空上传组件的文件列表
if (this.$refs.uploadRef) {
this.$refs.uploadRef.clearFiles()
} }
this.resetForm("form") this.resetForm("form")
}, },
@@ -381,7 +384,7 @@ export default {
}) })
}, },
/** 文件选择处理 */ /** 文件选择处理 */
handleFileChange(file) { handleFileChange(file, fileList) {
// 保存文件对象用于提交 // 保存文件对象用于提交
this.form.file = file.raw this.form.file = file.raw
@@ -394,6 +397,13 @@ export default {
// 强制更新视图 // 强制更新视图
this.$forceUpdate() this.$forceUpdate()
}, },
/** 文件移除处理 */
handleFileRemove() {
// 清空文件相关数据
this.form.file = null
this.form.downloadUrl = null
this.form.size = null
},
/** 设置文件大小 */ /** 设置文件大小 */
setFileSize(file) { setFileSize(file) {
const fileSize = file.size const fileSize = file.size
@@ -448,10 +458,6 @@ export default {
return false return false
} }
return true return true
},
/** 文件数量超出限制 */
handleExceed(files, fileList) {
this.$modal.msgWarning('只能上传一个文件,请先删除已上传的文件')
} }
} }
} }

View File

@@ -0,0 +1,458 @@
<template>
<div class="app-container">
<el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
<el-form-item label="版本名称" prop="versionName">
<el-input
v-model="queryParams.versionName"
placeholder="请输入版本名称"
clearable
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item label="是否强制更新" prop="isForce">
<el-select v-model="queryParams.isForce" placeholder="请选择是否强制更新" clearable>
<el-option label="否" value="0"></el-option>
<el-option label="是" value="1"></el-option>
</el-select>
</el-form-item>
<el-form-item label="渠道标识" prop="channel">
<el-select v-model="queryParams.channel" placeholder="请选择渠道标识" clearable>
<el-option
v-for="item in channelOptions"
:key="item"
:label="channelNameMap[item.toLowerCase()] || item.toLowerCase()"
:value="item.toLowerCase()">
</el-option>
</el-select>
</el-form-item>
<el-form-item label="安装包大小" prop="size">
<el-input
v-model="queryParams.size"
placeholder="请输入安装包大小"
clearable
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item>
<el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
<el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
</el-form-item>
</el-form>
<el-row :gutter="10" class="mb8">
<el-col :span="1.5">
<el-button
type="primary"
plain
icon="el-icon-plus"
size="mini"
@click="handleAdd"
v-hasPermi="['system:version:add']"
>新增</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="success"
plain
icon="el-icon-edit"
size="mini"
:disabled="single"
@click="handleUpdate"
v-hasPermi="['system:version:edit']"
>修改</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="danger"
plain
icon="el-icon-delete"
size="mini"
:disabled="multiple"
@click="handleDelete"
v-hasPermi="['system:version:remove']"
>删除</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="warning"
plain
icon="el-icon-download"
size="mini"
@click="handleExport"
v-hasPermi="['system:version:export']"
>导出</el-button>
</el-col>
<right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
</el-row>
<el-table v-loading="loading" :data="versionList" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" align="center" />
<el-table-column label="主键ID" align="center" prop="id" />
<el-table-column label="版本代码" align="center" prop="versionCode" />
<el-table-column label="版本名称" align="center" prop="versionName" />
<el-table-column label="强制更新" align="center" prop="isForce">
<template slot-scope="scope">
{{ scope.row.isForce == '1' ? '是' : '否' }}
</template>
</el-table-column>
<el-table-column label="渠道标识" align="center" prop="channel">
<template slot-scope="scope">
{{ channelNameMap[scope.row.channel] || scope.row.channel }}
</template>
</el-table-column>
<el-table-column label="APK下载" align="center" prop="downloadUrl" />
<el-table-column label="更新日志" align="center" prop="updateLog" />
<el-table-column label="安装包" align="center" prop="size" />
<el-table-column label="操作" align="center" class-name="small-padding fixed-width">
<template slot-scope="scope">
<el-button
size="mini"
type="text"
icon="el-icon-edit"
@click="handleUpdate(scope.row)"
v-hasPermi="['system:version:edit']"
>修改</el-button>
<el-button
size="mini"
type="text"
icon="el-icon-delete"
@click="handleDelete(scope.row)"
v-hasPermi="['system:version:remove']"
>删除</el-button>
</template>
</el-table-column>
</el-table>
<pagination
v-show="total>0"
:total="total"
:page.sync="queryParams.pageNum"
:limit.sync="queryParams.pageSize"
@pagination="getList"
/>
<!-- 添加或修改应用版本更新信息对话框 -->
<el-dialog :title="title" :visible.sync="open" width="500px" append-to-body>
<el-form ref="form" :model="form" :rules="rules" label-width="80px">
<el-form-item label="版本名称" prop="versionName">
<el-input v-model="form.versionName" placeholder="请输入版本名称" />
</el-form-item>
<el-form-item label="版本代码" prop="versionCode">
<el-input-number v-model="form.versionCode" :min="4" placeholder="请输入版本代码" style="width: 100%;" />
</el-form-item>
<el-form-item label="强制更新" prop="isForce">
<el-select v-model="form.isForce" placeholder="请选择是否强制更新">
<el-option label="否" value="0"></el-option>
<el-option label="是" value="1"></el-option>
</el-select>
</el-form-item>
<el-form-item label="渠道标识" prop="channel">
<el-select v-model="form.channel" placeholder="请选择渠道标识">
<el-option
v-for="item in channelOptions"
:key="item"
:label="channelNameMap[item.toLowerCase()] || item.toLowerCase()"
:value="item.toLowerCase()">
</el-option>
</el-select>
</el-form-item>
<el-form-item label="APK下载" prop="downloadUrl">
<el-upload
class="upload-demo"
action=""
:auto-upload="false"
:show-file-list="false"
:on-change="handleFileChange"
:before-upload="beforeUpload"
:limit="1"
:on-exceed="handleExceed">
<el-button size="small" type="primary">点击上传</el-button>
<div slot="tip" class="el-upload__tip">文件大小不超过500MB</div>
</el-upload>
<el-input v-model="form.downloadUrl" placeholder="文件上传后自动填入地址" readonly style="margin-top: 10px;" />
</el-form-item>
<el-form-item label="更新日志" prop="updateLog">
<el-input v-model="form.updateLog" type="textarea" placeholder="请输入内容" />
</el-form-item>
<el-form-item label="安装包" prop="size">
<el-input v-model="form.size" placeholder="请输入安装包大小" />
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button type="primary" @click="submitForm">确 定</el-button>
<el-button @click="cancel">取 消</el-button>
</div>
</el-dialog>
</div>
</template>
<script>
import { listVersion, getVersion, delVersion, addVersion, updateVersion, getChannelList } from "@/api/system/version"
import request from '@/utils/request'
import { getToken } from "@/utils/auth"
export default {
name: "Version",
data() {
return {
// 遮罩层
loading: true,
// 选中数组
ids: [],
// 非单个禁用
single: true,
// 非多个禁用
multiple: true,
// 显示搜索条件
showSearch: true,
// 总条数
total: 0,
// 应用版本更新信息表格数据
versionList: [],
// 渠道选项
channelOptions: [],
// 渠道中文名称映射
channelNameMap: {
'official': '官方',
'xiaomi': '小米',
'huawei': '华为',
'oppo': 'OPPO',
'vivo': 'VIVO',
'meizu': '魅族',
'honor': '荣耀',
'yingyongbao': '应用宝',
'ios': 'iOS'
},
// 弹出层标题
title: "",
// 是否显示弹出层
open: false,
// 查询参数
queryParams: {
pageNum: 1,
pageSize: 10,
versionCode: null,
versionName: null,
isForce: null,
channel: null,
downloadUrl: null,
updateLog: null,
size: null,
},
// 表单参数
form: {},
// 表单校验
rules: {
versionCode: [
{ required: true, message: "版本代码不能为空", trigger: "blur" }
],
versionName: [
{ required: true, message: "版本名称不能为空", trigger: "blur" }
],
versionCode: [
{ required: true, message: "版本代码不能为空", trigger: "blur" },
{ type: 'number', min: 4, message: "版本代码不能小于4", trigger: "blur" }
],
isForce: [
{ required: true, message: "是否强制更新不能为空", trigger: "change" }
],
channel: [
{ required: true, message: "渠道标识不能为空", trigger: "change" }
],
downloadUrl: [
{ required: true, message: "APK下载地址不能为空", trigger: "blur" }
],
createTime: [
{ required: true, message: "创建时间不能为空", trigger: "blur" }
],
updateTime: [
{ required: true, message: "更新时间不能为空", trigger: "blur" }
]
}
}
},
created() {
this.getList()
this.getChannelOptions()
},
methods: {
/** 查询应用版本更新信息列表 */
getList() {
this.loading = true
listVersion(this.queryParams).then(response => {
this.versionList = response.rows
this.total = response.total
this.loading = false
})
},
// 取消按钮
cancel() {
this.open = false
this.reset()
},
// 表单重置
reset() {
this.form = {
id: null,
versionCode: null,
versionName: null,
isForce: null,
channel: null,
downloadUrl: null,
updateLog: null,
size: null,
createTime: null,
updateTime: null
}
this.resetForm("form")
},
/** 搜索按钮操作 */
handleQuery() {
this.queryParams.pageNum = 1
this.getList()
},
/** 重置按钮操作 */
resetQuery() {
this.resetForm("queryForm")
this.handleQuery()
},
// 多选框选中数据
handleSelectionChange(selection) {
this.ids = selection.map(item => item.id)
this.single = selection.length!==1
this.multiple = !selection.length
},
/** 新增按钮操作 */
handleAdd() {
this.reset()
this.open = true
this.title = "添加应用版本更新信息"
},
/** 修改按钮操作 */
handleUpdate(row) {
this.reset()
const id = row.id || this.ids[0]
getVersion(id).then(response => {
this.form = response.data
this.open = true
this.title = "修改应用版本更新信息"
})
},
/** 提交按钮 */
submitForm() {
this.$refs["form"].validate(valid => {
if (valid) {
if (this.form.id != null) {
updateVersion(this.form).then(response => {
this.$modal.msgSuccess("修改成功")
this.open = false
this.getList()
})
} else {
addVersion(this.form).then(response => {
this.$modal.msgSuccess("新增成功")
this.open = false
this.getList()
})
}
}
})
},
/** 删除按钮操作 */
handleDelete(row) {
const ids = row.id || this.ids
this.$modal.confirm('是否确认删除应用版本更新信息编号为"' + ids + '"的数据项?').then(function() {
return delVersion(ids)
}).then(() => {
this.getList()
this.$modal.msgSuccess("删除成功")
}).catch(() => {})
},
/** 导出按钮操作 */
handleExport() {
this.download('system/version/export', {
...this.queryParams
}, `version_${new Date().getTime()}.xlsx`)
},
/** 获取渠道选项 */
getChannelOptions() {
getChannelList().then(response => {
this.channelOptions = response.data || []
})
},
/** 文件选择处理 */
handleFileChange(file) {
// 保存文件对象用于提交
this.form.file = file.raw
// 计算并设置文件大小
this.setFileSize(file.raw)
// 上传文件到服务器
this.uploadFile(file.raw)
// 强制更新视图
this.$forceUpdate()
},
/** 设置文件大小 */
setFileSize(file) {
const fileSize = file.size
let sizeText = ''
if (fileSize < 1024) {
sizeText = fileSize + ' B'
} else if (fileSize < 1024 * 1024) {
sizeText = (fileSize / 1024).toFixed(2) + ' KB'
} else if (fileSize < 1024 * 1024 * 1024) {
sizeText = (fileSize / (1024 * 1024)).toFixed(2) + ' MB'
} else {
sizeText = (fileSize / (1024 * 1024 * 1024)).toFixed(2) + ' GB'
}
this.form.size = sizeText
},
/** 上传文件到服务器 */
uploadFile(file) {
const formData = new FormData()
formData.append('file', file)
formData.append('type', 'version')
// 调用上传接口
request({
url: '/back/upload/config/file',
method: 'post',
data: formData,
headers: {
'Content-Type': 'multipart/form-data',
'Authorization': 'Bearer ' + getToken()
}
}).then(response => {
if (response.code === 200) {
// 上传成功,保存返回的文件地址
this.form.downloadUrl = response.data
this.$modal.msgSuccess('文件上传成功')
} else {
this.$modal.msgError('文件上传失败:' + response.msg)
}
}).catch(error => {
console.error('文件上传失败:', error)
this.$modal.msgError('文件上传失败')
})
},
/** 文件上传前校验 */
beforeUpload(file) {
const isLt500M = file.size / 1024 / 1024 < 500
if (!isLt500M) {
this.$modal.msgError('上传文件大小不能超过 500MB!')
return false
}
return true
},
/** 文件数量超出限制 */
handleExceed(files, fileList) {
this.$modal.msgWarning('只能上传一个文件,请先删除已上传的文件')
}
}
}
</script>