修复bug

This commit is contained in:
menxipeng
2025-09-21 17:49:23 +08:00
parent 142c00bc9e
commit 0b75730d37
23 changed files with 1320 additions and 18 deletions

View File

@@ -0,0 +1,52 @@
import request from '@/utils/request'
// 查询应用版本更新信息列表
export function listVersion(query) {
return request({
url: '/back/version/list',
method: 'get',
params: query
})
}
// 查询应用版本更新信息详细
export function getVersion(id) {
return request({
url: '/back/version/' + id,
method: 'get'
})
}
// 新增应用版本更新信息
export function addVersion(data) {
return request({
url: '/back/version',
method: 'post',
data: data
})
}
// 修改应用版本更新信息
export function updateVersion(data) {
return request({
url: '/back/version',
method: 'put',
data: data
})
}
// 删除应用版本更新信息
export function delVersion(id) {
return request({
url: '/back/version/' + id,
method: 'delete'
})
}
// 获取渠道列表
export function getChannelList() {
return request({
url: '/back/version/getChannel',
method: 'get'
})
}

View File

@@ -20,8 +20,8 @@ export function getUser(id) {
// 修改用户状态
export function updateUserStatus(id, status) {
return request({
url: '/back/user/status',
method: 'post',
url: '/back/user/',
method: 'put',
data: {
id: id,
status: status
@@ -35,7 +35,7 @@ export function delUser(id) {
url: '/back/user/' + id,
method: 'delete'
})
}
}
// 获取用户标签
export function getUserTags(userId) {

View File

@@ -14,13 +14,15 @@
<el-option label="系统通知" value="system" />
</el-select>
</el-form-item>
<el-form-item label="计划发送时间" prop="sendTime">
<el-form-item label="计划发送时间" label-width="100px" prop="sendTime">
<el-date-picker clearable
v-model="queryParams.sendTime"
type="datetime"
type="datetimerange"
range-separator=""
start-placeholder="开始时间"
end-placeholder="结束时间"
format="yyyy-MM-dd HH:mm:ss"
value-format="yyyy-MM-dd HH:mm:ss"
placeholder="请选择计划发送时间">
value-format="yyyy-MM-dd HH:mm:ss">
</el-date-picker>
</el-form-item>
<el-form-item>
@@ -306,7 +308,9 @@ export default {
content: null,
notificationType: null,
creator: null,
sendTime: null
sendTime: null,
findStart: null,
findEnd: null
},
// 表单参数
form: {},
@@ -334,7 +338,11 @@ export default {
/** 查询【请填写功能名称】列表 */
getList() {
this.loading = true
listNotifications(this.queryParams).then(response => {
// 创建查询参数副本排除sendTime参数
const params = { ...this.queryParams }
delete params.sendTime
listNotifications(params).then(response => {
this.notificationsList = response.rows
this.total = parseInt(response.total) || 0
this.loading = false
@@ -359,6 +367,15 @@ export default {
},
/** 搜索按钮操作 */
handleQuery() {
// 处理时间段参数
if (this.queryParams.sendTime && this.queryParams.sendTime.length === 2) {
this.queryParams.findStart = this.queryParams.sendTime[0]
this.queryParams.findEnd = this.queryParams.sendTime[1]
} else {
this.queryParams.findStart = null
this.queryParams.findEnd = null
}
this.queryParams.pageNum = 1
this.getList()
},
@@ -412,7 +429,23 @@ export default {
/** 删除按钮操作 */
handleDelete(row) {
const ids = row.id || this.ids
this.$modal.confirm('是否确认删除通知编号为"' + ids + '"的数据项?').then(function() {
let confirmMessage = ''
if (row && row.title) {
// 单个删除,显示通知标题
confirmMessage = `是否确认删除通知"${row.title}"`
} else {
// 批量删除,显示选中的通知标题
const selectedNotifications = this.notificationsList.filter(item => this.ids.includes(item.id))
if (selectedNotifications.length === 1) {
confirmMessage = `是否确认删除通知"${selectedNotifications[0].title}"`
} else {
const titles = selectedNotifications.map(item => item.title).join('、')
confirmMessage = `是否确认删除以下通知:${titles}`
}
}
this.$modal.confirm(confirmMessage).then(function() {
return delNotifications(ids)
}).then(() => {
this.getList()
@@ -445,11 +478,11 @@ export default {
getBindUsers(id).then(response => {
if (response.data && response.data.length > 0) {
console.log("已绑定用户列表:", response.data);
// 将用户ID转换为字符串类型确保类型一致
const bindUserIds = response.data.map(user => String(user.userId));
this.userIds = bindUserIds;
console.log("转换后的用户ID列表:", bindUserIds);
// 延迟执行,确保表格已经完全渲染
@@ -457,13 +490,13 @@ export default {
// 先清除所有选中状态
if (this.$refs.userTable) {
this.$refs.userTable.clearSelection();
// 为已绑定的用户设置选中状态
this.userList.forEach(row => {
// 确保类型一致,都转换为字符串进行比较
const rowUserId = String(row.userId);
console.log("比较用户ID:", rowUserId, "是否在列表中:", bindUserIds.includes(rowUserId));
if (bindUserIds.includes(rowUserId)) {
console.log("选中用户:", row);
this.$refs.userTable.toggleRowSelection(row, true);

View File

@@ -166,7 +166,7 @@ export default {
const statusText = row.status === '1' ? "加入黑名单" : "取消加入黑名单";
const newStatus = row.status === '1' ? '2' : '1';
this.$modal.confirm('确认要' + statusText + '用户"' + row.nickname + '"吗?').then(function() {
this.$modal.confirm('确认要' + statusText + '用户"' + row.phone + '"吗?').then(function() {
return updateUserStatus(row.id, newStatus);
}).then(() => {
this.getList();

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>