zdppy + vue3 + antd 实现一个表格编辑行,批量删除功能

编辑单元格和多选的功能

首先是编辑单元格的功能,点击编辑按钮,可以直接在表格中队内容进行编辑,点击保存以后能够同步到数据库。
在这里插入图片描述

其次是多选的功能,点击每行前面的多选框按钮,我们可以选中多行。
在这里插入图片描述
完整后端代码:

import api
import upload
import time
import amcomment
import env
import mcrud
import amuserdetailsave_dir = "uploads"
env.load(".env")
db = mcrud.new_env()app = api.Api(routes=[*amcomment.get_routes(db),*amuserdetail.get_routes(db),upload.download("/download/{filename}", save_dir),],middleware=[api.middleware.cors()]
)if __name__ == "__main__":app.run(port=8889)

完整前端代码:

<script setup>
import {cloneDeep} from 'lodash-es';
import {computed, onMounted, reactive, ref} from 'vue';
import axios from "axios";const columns = [{name: '姓名',dataIndex: 'name',id: 'name',},{name: '性别',dataIndex: 'gender',id: 'gender',},{title: '年龄',dataIndex: 'age',id: 'age',},{title: '电话',dataIndex: 'phone',id: 'phone',},{title: '邮箱',id: 'email',dataIndex: 'email',},{title: '薪资',id: 'salary',dataIndex: 'salary',},{title: '操作',id: 'action',},
];const dataSource = ref([]);const editableData = reactive({});const edit = id => {editableData[id] = cloneDeep(dataSource.value.filter(item => id === item.id)[0]);
};const save = id => {// backend updateaxios({method: "put",url: "http://127.0.0.1:8889/zdppy_amuserdetail/" + id,contentType: "application/json",data: editableData[id],}).then(resp => {console.log("update", resp.data);})// frontend updateObject.assign(dataSource.value.filter(item => id === item.id)[0], editableData[id]);delete editableData[id];
};const cancel = id => {delete editableData[id];
};// handle multi selected
const state = reactive({selectedRowKeys: [],// Check here to configure the default columnloading: false,
});const hasSelected = computed(() => state.selectedRowKeys.length > 0);
const start = () => {state.loading = true;// ajax request after empty completingsetTimeout(() => {state.loading = false;state.selectedRowKeys = [];}, 1000);
};const onSelectChange = selectedRowKeys => {console.log('selectedRowKeys changed: ', selectedRowKeys);state.selectedRowKeys = selectedRowKeys;
};onMounted(() => {axios({method: "get",url: "http://127.0.0.1:8889/zdppy_amuserdetail",}).then((response) => {console.log("response.data", response.data);const responseData = response.data.dataconsole.log("responseData=", responseData)dataSource.value = responseData.results;})
})
</script><template><div style="margin-bottom: 16px"><a-button type="primary" :disabled="!hasSelected" :loading="state.loading" @click="start">Reload</a-button><span style="margin-left: 8px"><template v-if="hasSelected">{{ `Selected ${state.selectedRowKeys.length} items` }}</template></span></div><a-table:columns="columns":data-source="dataSource":row-selection="{ selectedRowKeys: state.selectedRowKeys, onChange: onSelectChange }":row-key="record => record.id"bordered><template #headerCell="{ column }"><template v-if="column.id === 'name'"><span>{{ column.name }}</span></template><template v-else-if="column.id === 'gender'"><span>{{ column.name }}</span></template></template><template #bodyCell="{ column, text, record }"><template v-if="['name', 'age', 'address'].includes(column.dataIndex)"><div><a-inputv-if="editableData[record.id]"v-model:value="editableData[record.id][column.dataIndex]"style="margin: -5px 0"/><template v-else>{{ text }}</template></div></template><template v-else-if="column.id === 'action'"><div class="editable-row-operations"><span v-if="editableData[record.id]"><a-typography-link @click="save(record.id)">保存</a-typography-link><a-popconfirm title="Sure to cancel?" @confirm="cancel(record.id)"><a>取消</a></a-popconfirm></span><span v-else><a @click="edit(record.id)">编辑</a></span></div></template></template></a-table>
</template><style scoped>
.editable-row-operations a {margin-right: 8px;
}
</style>

不过目前有个问题,那就是没有实现批量删除的功能。我们可以在多选以后,点击批量删除按钮,同时删除被选中的数据。

实现前端批量删除的功能

如图:
在这里插入图片描述

选中任意两条数据以后,点击批量删除按钮,这时会弹出确认信息。
点击确认以后会触发一个方法,会在控制台输出需要被删除的数据的ID,是一个数组,用于执行批量删除的操作。

此时的完整前端代码如下:

<script setup>
import {cloneDeep} from 'lodash-es';
import {computed, onMounted, reactive, ref} from 'vue';
import axios from "axios";const columns = [{name: '姓名',dataIndex: 'name',id: 'name',},{name: '性别',dataIndex: 'gender',id: 'gender',},{title: '年龄',dataIndex: 'age',id: 'age',},{title: '电话',dataIndex: 'phone',id: 'phone',},{title: '邮箱',id: 'email',dataIndex: 'email',},{title: '薪资',id: 'salary',dataIndex: 'salary',},{title: '操作',id: 'action',},
];const dataSource = ref([]);const editableData = reactive({});const edit = id => {editableData[id] = cloneDeep(dataSource.value.filter(item => id === item.id)[0]);
};const save = id => {// backend updateaxios({method: "put",url: "http://127.0.0.1:8889/zdppy_amuserdetail/" + id,contentType: "application/json",data: editableData[id],}).then(resp => {console.log("update", resp.data);})// frontend updateObject.assign(dataSource.value.filter(item => id === item.id)[0], editableData[id]);delete editableData[id];
};const cancel = id => {delete editableData[id];
};// handle multi selected
const state = reactive({selectedRowKeys: [],// Check here to configure the default columnloading: false,
});const hasSelected = computed(() => state.selectedRowKeys.length > 0);
const start = () => {state.loading = true;// ajax request after empty completingsetTimeout(() => {state.loading = false;state.selectedRowKeys = [];}, 1000);
};const onSelectChange = selectedRowKeys => {console.log('selectedRowKeys changed: ', selectedRowKeys);state.selectedRowKeys = selectedRowKeys;
};// delete selected data
const onDeleteSelectedClick = () => {console.log("onDeleteSelectedClick", state.selectedRowKeys);
}
onMounted(() => {axios({method: "get",url: "http://127.0.0.1:8889/zdppy_amuserdetail",}).then((response) => {console.log("response.data", response.data);const responseData = response.data.dataconsole.log("responseData=", responseData)dataSource.value = responseData.results;})
})
</script><template><div class="flex space-x-3 py-3"><a-button type="primary" :disabled="!hasSelected" :loading="state.loading" @click="start">Reload</a-button><a-popconfirm title="您确认要删除选中的数据吗?" @confirm="onDeleteSelectedClick"><a-button type="primary" :disabled="!hasSelected" danger>批量删除</a-button></a-popconfirm></div><a-table:columns="columns":data-source="dataSource":row-selection="{ selectedRowKeys: state.selectedRowKeys, onChange: onSelectChange }":row-key="record => record.id"bordered><template #headerCell="{ column }"><template v-if="column.id === 'name'"><span>{{ column.name }}</span></template><template v-else-if="column.id === 'gender'"><span>{{ column.name }}</span></template></template><template #bodyCell="{ column, text, record }"><template v-if="['name', 'age', 'address'].includes(column.dataIndex)"><div><a-inputv-if="editableData[record.id]"v-model:value="editableData[record.id][column.dataIndex]"style="margin: -5px 0"/><template v-else>{{ text }}</template></div></template><template v-else-if="column.id === 'action'"><div class="editable-row-operations"><span v-if="editableData[record.id]"><a-typography-link @click="save(record.id)">保存</a-typography-link><a-popconfirm title="Sure to cancel?" @confirm="cancel(record.id)"><a>取消</a></a-popconfirm></span><span v-else><a @click="edit(record.id)">编辑</a></span></div></template></template></a-table>
</template><style scoped>
.editable-row-operations a {margin-right: 8px;
}
</style>

修改确认提示文本

修改之前:是OK和Cancel
在这里插入图片描述

修改之后:是确认和取消
在这里插入图片描述

核心代码如下:

<a-popconfirmtitle="您确认要删除选中的数据吗?"ok-text="确认"cancel-text="取消"@confirm="onDeleteSelectedClick"><a-button type="primary" :disabled="!hasSelected" danger>批量删除</a-button></a-popconfirm>
```此时前端的完整代码如下:
```html
<script setup>
import {cloneDeep} from 'lodash-es';
import {computed, onMounted, reactive, ref} from 'vue';
import axios from "axios";const columns = [{name: '姓名',dataIndex: 'name',id: 'name',},{name: '性别',dataIndex: 'gender',id: 'gender',},{title: '年龄',dataIndex: 'age',id: 'age',},{title: '电话',dataIndex: 'phone',id: 'phone',},{title: '邮箱',id: 'email',dataIndex: 'email',},{title: '薪资',id: 'salary',dataIndex: 'salary',},{title: '操作',id: 'action',},
];const dataSource = ref([]);const editableData = reactive({});const edit = id => {editableData[id] = cloneDeep(dataSource.value.filter(item => id === item.id)[0]);
};const save = id => {// backend updateaxios({method: "put",url: "http://127.0.0.1:8889/zdppy_amuserdetail/" + id,contentType: "application/json",data: editableData[id],}).then(resp => {console.log("update", resp.data);})// frontend updateObject.assign(dataSource.value.filter(item => id === item.id)[0], editableData[id]);delete editableData[id];
};const cancel = id => {delete editableData[id];
};// handle multi selected
const state = reactive({selectedRowKeys: [],// Check here to configure the default columnloading: false,
});const hasSelected = computed(() => state.selectedRowKeys.length > 0);
const start = () => {state.loading = true;// ajax request after empty completingsetTimeout(() => {state.loading = false;state.selectedRowKeys = [];}, 1000);
};const onSelectChange = selectedRowKeys => {console.log('selectedRowKeys changed: ', selectedRowKeys);state.selectedRowKeys = selectedRowKeys;
};// delete selected data
const onDeleteSelectedClick = () => {console.log("onDeleteSelectedClick", state.selectedRowKeys);
}
onMounted(() => {axios({method: "get",url: "http://127.0.0.1:8889/zdppy_amuserdetail",}).then((response) => {console.log("response.data", response.data);const responseData = response.data.dataconsole.log("responseData=", responseData)dataSource.value = responseData.results;})
})
</script><template><div class="flex space-x-3 py-3"><a-button type="primary" :disabled="!hasSelected" :loading="state.loading" @click="start">Reload</a-button><a-popconfirmtitle="您确认要删除选中的数据吗?"ok-text="确认"cancel-text="取消"@confirm="onDeleteSelectedClick"><a-button type="primary" :disabled="!hasSelected" danger>批量删除</a-button></a-popconfirm></div><a-table:columns="columns":data-source="dataSource":row-selection="{ selectedRowKeys: state.selectedRowKeys, onChange: onSelectChange }":row-key="record => record.id"bordered><template #headerCell="{ column }"><template v-if="column.id === 'name'"><span>{{ column.name }}</span></template><template v-else-if="column.id === 'gender'"><span>{{ column.name }}</span></template></template><template #bodyCell="{ column, text, record }"><template v-if="['name', 'age', 'address'].includes(column.dataIndex)"><div><a-inputv-if="editableData[record.id]"v-model:value="editableData[record.id][column.dataIndex]"style="margin: -5px 0"/><template v-else>{{ text }}</template></div></template><template v-else-if="column.id === 'action'"><div class="editable-row-operations"><span v-if="editableData[record.id]"><a-typography-link @click="save(record.id)">保存</a-typography-link><a-popconfirm title="Sure to cancel?" @confirm="cancel(record.id)"><a>取消</a></a-popconfirm></span><span v-else><a @click="edit(record.id)">编辑</a></span></div></template></template></a-table>
</template><style scoped>
.editable-row-operations a {margin-right: 8px;
}
</style>```## 实现批量删除的功能
后端本身已经有这个接口了,我们只需要在前端调用即可。核心代码如下:
```js// delete selected data
const onDeleteSelectedClick = () => {console.log("onDeleteSelectedClick", state.selectedRowKeys);state.loading = trueaxios({method: "delete",url: "http://127.0.0.1:8889/zdppy_amuserdetail_ids",contentType: "application/json",data: {ids: state.selectedRowKeys,}}).finally(() => {state.loading = false;loadTableData()})
}const loadTableData = () => {axios({method: "get",url: "http://127.0.0.1:8889/zdppy_amuserdetail",}).then((response) => {console.log("response.data", response.data);const responseData = response.data.dataconsole.log("responseData=", responseData)dataSource.value = responseData.results;})
}
onMounted(() => {loadTableData()
})
```此时完整的前端代码如下:
```html
<script setup>
import {cloneDeep} from 'lodash-es';
import {computed, onMounted, reactive, ref} from 'vue';
import axios from "axios";const columns = [{name: '姓名',dataIndex: 'name',id: 'name',},{name: '性别',dataIndex: 'gender',id: 'gender',},{title: '年龄',dataIndex: 'age',id: 'age',},{title: '电话',dataIndex: 'phone',id: 'phone',},{title: '邮箱',id: 'email',dataIndex: 'email',},{title: '薪资',id: 'salary',dataIndex: 'salary',},{title: '操作',id: 'action',},
];const dataSource = ref([]);const editableData = reactive({});const edit = id => {editableData[id] = cloneDeep(dataSource.value.filter(item => id === item.id)[0]);
};const save = id => {// backend updateaxios({method: "put",url: "http://127.0.0.1:8889/zdppy_amuserdetail/" + id,contentType: "application/json",data: editableData[id],}).then(resp => {console.log("update", resp.data);})// frontend updateObject.assign(dataSource.value.filter(item => id === item.id)[0], editableData[id]);delete editableData[id];
};const cancel = id => {delete editableData[id];
};// handle multi selected
const state = reactive({selectedRowKeys: [],// Check here to configure the default columnloading: false,
});const hasSelected = computed(() => state.selectedRowKeys.length > 0);
const start = () => {state.loading = true;// ajax request after empty completingsetTimeout(() => {state.loading = false;state.selectedRowKeys = [];}, 1000);
};const onSelectChange = selectedRowKeys => {console.log('selectedRowKeys changed: ', selectedRowKeys);state.selectedRowKeys = selectedRowKeys;
};// delete selected data
const onDeleteSelectedClick = () => {console.log("onDeleteSelectedClick", state.selectedRowKeys);state.loading = trueaxios({method: "delete",url: "http://127.0.0.1:8889/zdppy_amuserdetail_ids",contentType: "application/json",data: {ids: state.selectedRowKeys,}}).finally(() => {state.loading = false;loadTableData()})
}const loadTableData = () => {axios({method: "get",url: "http://127.0.0.1:8889/zdppy_amuserdetail",}).then((response) => {console.log("response.data", response.data);const responseData = response.data.dataconsole.log("responseData=", responseData)dataSource.value = responseData.results;})
}
onMounted(() => {loadTableData()
})
</script><template><div class="flex space-x-3 py-3"><a-button type="primary" :disabled="!hasSelected" :loading="state.loading" @click="start">Reload</a-button><a-popconfirmtitle="您确认要删除选中的数据吗?"ok-text="确认"cancel-text="取消"@confirm="onDeleteSelectedClick"><a-button type="primary" :disabled="!hasSelected" danger>批量删除</a-button></a-popconfirm></div><a-table:columns="columns":data-source="dataSource":row-selection="{ selectedRowKeys: state.selectedRowKeys, onChange: onSelectChange }":row-key="record => record.id"bordered><template #headerCell="{ column }"><template v-if="column.id === 'name'"><span>{{ column.name }}</span></template><template v-else-if="column.id === 'gender'"><span>{{ column.name }}</span></template></template><template #bodyCell="{ column, text, record }"><template v-if="['name', 'age', 'address'].includes(column.dataIndex)"><div><a-inputv-if="editableData[record.id]"v-model:value="editableData[record.id][column.dataIndex]"style="margin: -5px 0"/><template v-else>{{ text }}</template></div></template><template v-else-if="column.id === 'action'"><div class="editable-row-operations"><span v-if="editableData[record.id]"><a-typography-link @click="save(record.id)">保存</a-typography-link><a-popconfirm title="Sure to cancel?" @confirm="cancel(record.id)"><a>取消</a></a-popconfirm></span><span v-else><a @click="edit(record.id)">编辑</a></span></div></template></template></a-table>
</template><style scoped>
.editable-row-operations a {margin-right: 8px;
}
</style>```

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/869946.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Linux】命令执行的判断依据:;,,||

在某些情况下&#xff0c;很多命令我想要一次输入去执行&#xff0c;而不想要分次执行时&#xff0c;该如何是好&#xff1f; 基本上有两个选择&#xff0c; 一个是通过shell脚本脚本去执行&#xff0c;一种则是通过下面的介绍来一次入多个命令。 1.cmd&#xff1a;cmd&#…

Nuxt框架中内置组件详解及使用指南(五)

title: Nuxt框架中内置组件详解及使用指南&#xff08;五&#xff09; date: 2024/7/10 updated: 2024/7/10 author: cmdragon excerpt: 摘要&#xff1a;本文详细介绍了Nuxt框架中和组件的使用方法与配置&#xff0c;包括安装、基本用法、属性详解、示例代码以及高级功能如…

【LeYOLO】嵌入式和移动端的轻量级YOLO模型

代码地址&#xff1a;https://github.com/LilianHollard/LeYOLO 论文地址&#xff1a;https://arxiv.org/pdf/2406.14239 在深度神经网络中&#xff0c;计算效率对于目标检测至关重要&#xff0c;尤其是在新模型更注重速度而非有效计算&#xff08;FLOP&#xff09;的情况下。这…

ChatGPT-4o大语言模型优化、本地私有化部署、从0-1搭建、智能体构建技术

在过去几年中&#xff0c;人工智能领域的发展迅猛&#xff0c;尤其是大语言模型的应用&#xff0c;为各行各业带来了前所未有的创新与突破。从ChatGPT-3.5的推出到GPT Store的上线&#xff0c;再到最新的多模态交互ChatGPT-4o&#xff0c;OpenAI不断引领科技潮流&#xff0c;推…

Docker安装BRIA-RMBG-1.4模型,背景去除

目录 前言 模型描述 训练数据 定性评估 docker安装 运行 结论 Tip&#xff1a; 问题1&#xff1a; 问题2&#xff1a; 前言 BRIA 背景去除 v1.4 模型 RMBG v1.4 是我们最先进的背景去除模型&#xff0c;旨在有效地将各种类别和图像类型的前景与背景分开。该模型已在…

ch552g中使用SPI进行主从机通信时发现的问题

参考 基本硬件准备 两块独立的ch552g的板子&#xff0c;开始连接时数据传输出现数据错误&#xff0c;本来猜想是通信线连接问题&#xff0c;后来用了较短的连接线依然没有改善。 SPI通信的认知 SPI一般都是全双工实时通信&#xff0c;所以在发送数据时一般有短暂的停留使得…

到底哪款护眼大路灯好?五款适合学生用的护眼落地灯分享

到底哪款护眼大路灯好&#xff1f;影响青少年近视的最大“杀手”竟是学习环境光的影响。而对于这种情形&#xff0c;尤其是对于需要长时间用眼的学生群体和伏案工作者来说&#xff0c;护眼大路灯简直就是必备神器&#xff0c;但有人会问&#xff0c;我手机打开一搜就出现了那么…

防火墙综合实验一

目录 实验要求 防火墙准备 IP地址分配 需求一 需求二 需求三 需求四 需求五 需求六 实验要求 1、DMZ区内的服务器&#xff0c;办公区仅能在办公时间内(9:00-18:00)可以访问&#xff0c;生产区的设备全天可以访问。 2、生产区不允许访问互联网&#xff0c;办公区和游客…

qq动态删了怎么恢复?五分钟找回您的QQ动态

在使用QQ空间时&#xff0c;我们经常会发现自己误删了一些重要的动态。这可能是由于手指滑动不慎或者误操作引起的。无论是珍贵的回忆还是重要的信息&#xff0c;一旦被删除&#xff0c;我们都希望能够找回来。那么&#xff0c;qq动态删了怎么恢复&#xff1f; 在本文中&#…

vue2/3代码格式化问题,看着太难受了

1.原本的代码&#xff1a; 格式化后的代码&#xff1a; 太难受了&#xff01; 2.原本的代码 格式化后的代码 格式化跟有病似的&#xff0c;看着非常难受&#xff01; 有没有什么插件解决&#xff01;&#xff1f;

你知道的和你不知道的DOM操作技巧

你知道的和你不知道的DOM操作技巧 亲爱的前端小伙伴们&#xff0c;今天我们来聊聊那些你可能知道或者不知道的DOM操作技巧。作为一名前端开发者&#xff0c;如果你还在为DOM操作头疼&#xff0c;那么这篇文章绝对能让你茅塞顿开。让我们一起来探索一下DOM的奥秘吧&#xff01;…

2024春秋杯网络安全联赛夏季赛-PWN

文章目录 stdout测试setvbuf(stdout, 0LL, 2, 0LL)绕过或者输出直到缓冲区满使用system("/bin/sh")或者onegadget即使setvbuf(stdout, 0LL, 0, 0LL);也能立即有回显参考[https://starrysky1004.github.io/2024/07/05/2024-shu-qi-xue-xi-ji-lu/#toc-heading-4](https…

搜维尔科技:【研究】Scalefit是一款可在工作场所自动处理3D姿势分析结果的软件

Scalefit是一款可在工作场所自动处理 3D 姿势分析结果的软件。这甚至可以在衡量员工的同时发生。然后&#xff0c;Scalefit 根据国际标准对姿势、压缩力和关节力矩进行分析和可视化。 3D姿势分析 如今&#xff0c;Xsens 技术可让您快速测量工作场所员工的态度。一套带有 17 个…

开源无人机从入门到炸机,共需要几步?

阿木实验室2024年的重磅新品 Prometheus 仿真笔记本已经上架有一段时间了&#xff0c;近日&#xff0c;该产品的研发负责人廖工受邀到直播间与开发者们深度解读了Prometheus仿真笔记本的设计理念。直播过程中&#xff0c;廖工不仅展示了该产品的功能demo&#xff0c;解答技术开…

leetcode:1332. 删除回文子序列(python3解法)

难度&#xff1a;简单 给你一个字符串 s&#xff0c;它仅由字母 a 和 b 组成。每一次删除操作都可以从 s 中删除一个回文 子序列。 返回删除给定字符串中所有字符&#xff08;字符串为空&#xff09;的最小删除次数。 「子序列」定义&#xff1a;如果一个字符串可以通过删除原字…

本地部署,图片细节处理大模型Tile Controlnet

目录 什么是 Tile ControlNet&#xff1f; 工作原理 应用场景 优势与挑战 优势 挑战 本地部署 运行结果 未来展望 结论 Tip&#xff1a; 在近年来的深度学习和计算机视觉领域&#xff0c;生成对抗网络&#xff08;GAN&#xff09;和扩散模型等技术取得了显著的进展。…

技术文件国产化准备

技术文档的本地化涉及调整内容以满足特定目标市场的文化、语言和技术要求。这一过程超越了简单的翻译&#xff0c;确保文件在文化上适合预期受众&#xff0c;在技术上准确无误。适当的准备对于成功的本地化至关重要&#xff0c;以下步骤概述了一种全面的方法。 分析目标受众 …

在Visutal Studio 2022中完成D3D12初始化

在Visutal Studio 2022中完成DirectX设备初始化 1 DirectX121.1 DirectX 简介1.2 DirectX SDK安装2 D3D12初始化2.1 创建Windwos桌面项目2.2 修改符合模式2.3 下载d3dx12.h文件2.4 创建一个异常类D3DException,定义抛出异常实例的宏ThrowIfFailed3 D3D12的初始化步骤3.1 初始化…

pytorch实现水果2分类(蓝莓,苹果)

1.数据集的路径&#xff0c;结构 dataset.py 目的&#xff1a; 输入&#xff1a;没有输入&#xff0c;路径是写死了的。 输出&#xff1a;返回的是一个对象&#xff0c;里面有self.data。self.data是一个列表&#xff0c;里面是&#xff08;图片路径.jpg&#xff0c;标签&…

JMH325【剑侠情缘3】第2版80级橙武网游单机更稳定亲测视频安装教学更新整合收集各类修改教学补丁兴趣可以慢慢探索

资源介绍&#xff1a; 是否需要虚拟机&#xff1a;是 文件大小&#xff1a;压缩包约14G 支持系统&#xff1a;win10、win11 硬件需求&#xff1a;运行内存8G 4核及以上CPU独立显卡 下载方式&#xff1a;百度网盘 任务修复&#xff1a; 1&#xff0c;掌门任务&#xff08…