当前位置: 首页 > news >正文

vue3+elementPlus之后台管理系统(从0到1)(day3-管理员管理)

管理员管理

搭建管理员页面

在views中创建一个manager文件夹,并创建ManagerIndexView.vue、MangagerListView.vue、UserList.vue

<!-- src/views/manager/ManagerIndexView.vue -->
<template><!--  作为一个占位符,用于渲染与当前 URL 匹配的组件 --><router-view></router-view>
</template><script>
</script>

1、获取到所有管理员数据

<!--src/api/user.js-->
//获取管理员列表
export function adminList(){return ajax({method:'GET',url:'admin/list'})
}

2、渲染管理员列表

<template><div><el-table :data="computedTableData" style="width: 100%"><!-- type="index" 标记为索引序号, label列标题,prop列的数据字段 --><el-table-column type="index" :index="(currentPage-1)*10+1" label="序号" width="80" /><el-table-column prop="adminname" label="管理员名称" width="180" /><el-table-column label="管理员权限"><template #default="scope"><!-- <div>{{ scope.row.role == 1?'管理员':'超级管理员' }}</div> --><el-tag :type="scope.row.role == 1?'':'success'">{{ scope.row.role == 1?'管理员':'超级管理员' }}</el-tag></template></el-table-column><el-table-column prop="adminname" label="操作" width="180" ><template #default><el-button size="small" type="primary">编辑</el-button><el-button size="small" type="success">删除</el-button></template></el-table-column></el-table><!-- 分页显示 --><el-pagination background v-model:current-page="currentPage" layout="prev, pager, next" :total="tableData.length" /></div></template><script>
import { adminList } from '@/api/user';export default{data(){return {tableData:[],//当前页码currentPage: 1,}},methods:{},mounted(){//获取管理员列表adminList().then(res=>{this.tableData=res.data;})},computed:{//计算当前页显示的数据computedTableData(){return this.tableData.slice((this.currentPage-1)*10,(this.currentPage-1)*10+10);}}
}
</script>

分页处理

<el-table :data="computedTableData" style="width: 100%"><el-table-column type="index" :index="(currentPage-1)*10+1" label="序号" width="80" />...
</el-table><!-- 分页显示 --><el-pagination background v-model:current-page="currentPage" layout="prev, pager, next" :total="tableData.length" />computed:{//计算当前页显示的数据computedTableData(){return this.tableData.slice((this.currentPage-1)*10,(this.currentPage-1)*10+10);}}

3、添加管理员的功能

页面布局,添加一个抽屉效果

<div class="header"><el-button type="success" @click="drawer=true">添加管理员</el-button>
</div><!--抽屉效果-->
<el-drawer v-model="drawer" title="添加管理员"><el-form label-with="120px"><el-form-item label="管理员账号"><el-input placeholder="请输入管理员账号" v-model="formData.adminname"/></el-form-item><el-form-item label="管理员密码"><el-input placeholder="请输入管理员密码" v-model="formData.password"/></el-form-item><el-form-item label="管理员角色"><el-select placeholder="请选择管理员角色" v-model="formData.role"><el-option label="管理员" value="管理员"></el-option><el-option label="超级管理员" value="超级管理员"></el-option></el-select></el-form-item><el-form-item><el-tree ref="treeRef":data="menus"show-checkbox></el-tree></el-form-item></el-form><el-button @click="add" type="primary">添加</el-button>
</el-drawer>

在添加按钮回调函数中获取我们用户输入的内容

将用户输入的内容发送给后端服务器

<!--src/api/user.js-->
//添加管理员
export function addAdmin(params){return ajax({method:'POST',url:'admin/add',data:params})
}

添加成功后关闭抽屉然后重新获取数据

 data(){return {//是否打开抽屉效果drawer: false,//路由信息menus: routes[0].children,//管理员数据formData:{adminname:'',password:'',role:'',checkedKeys:''}}},methods:{//获取树型结构中选中的值formatCheckedKeys(){//根据选中的值得到父级路由const list = this.$refs.treeRef.getCheckedNodes(true);//用来存放父级路由的labelconst tempList = [];//最终结果数组const result = [];//list是选中的子路由list.forEach(item=>{//parent:选中子路由的父级路由const parent = this.menus.find(mitem=>{return mitem.children.some(child=>child.label==item.label)})//判断当前父级路由是否已存在if(tempList.includes(parent.label)){result.find(item=>item.label==parent.label).children.push(item)}else{//将对应的内容放到tempList中tempList.push(parent.label)result.push({label:parent.label,path: parent.path,children:[item]})}})//将路由的权限添加到formData中this.formData.checkedKeys = result},add(){//将管理员数据发送给服务器//1、收集数据this.formatCheckedKeys()this.formData.role = this.formData.role =='管理员' ? '1':'2'//2、将数据添加到服务器中addAdmin(this.formData).then(res=>{if(res.code=='200'){ElMessage.success(res.message)//关闭抽屉效果this.drawer=false//重新获取数据adminList().then(res=>{this.tableData=res.data;})}else{ElMessage.error(res.message)}})}},

4、修改管理员信息

添加一个drawerTitle属性判断是添加还是编辑管理员

<el-drawer @close="close" v-model="drawer" ><template #header><h4>{{ drawerTitle=='add'?'添加管理员':'编辑管理员' }}</h4></template>...<el-table-column prop="adminname" label="操作" width="180" ><template #default="scope"><el-button @click="edit(scope.row)" size="small" type="primary">编辑</el-button><el-button @click="deleteClick(scope.row)" size="small" type="success">删除</el-button></template></el-table-column>
</el-drawer>drawerTitle:'add'   //抽屉标题

打开抽屉,将当前数据渲染在抽屉中

请求前获取用户数据

将用户数据发送给后端

<!--src/api/user.js-->
//修改管理员
export function updateAdmin(params){return ajax({method:'POST',url:'admin/update',data:params})
}

重新加载最新数据

edit(row){//打开抽屉this.drawer=true;this.drawerTitle='edit'//获取当前一行数据this.formData.adminname = row.adminname;this.formData.password = row.password;this.formData.role = row.role=='1'?"管理员":'超级管理员';const checkedKeys = [];row.checkedKeys.forEach(parent=>{parent.children.forEach(item=>{checkedKeys.push(item.path)})})this.defaultCheckedKeys=checkedKeys;},close(){this.formData={};this.defaultCheckedKeys=[];if(this.$refs.treeRef){this.$refs.treeRef.setCheckedKeys([]);}},update(){if(this.formData.adminname==''||this.formData.password==''){ElMessage.error("管理员或密码不能为空!")return}this.formData.role = this.formData.role=='管理员'?'1':'2';//获取当前用户的权限this.formatCheckedKeys()//提交修改信息updateAdmin(this.formData).then(res=>{if(res.code=='200'){ElMessage.success(res.message)//关闭抽屉效果this.drawer=false//重新获取数据adminList().then(res=>{this.tableData=res.data;})}else{ElMessage.error(res.message)}})},

5、删除管理员

添加点击时间,传递当前行数据

<el-button @click="deleteClick(scope.row)" size="small" type="success">删除</el-button>

发送删除请求进行删除,然后重新加载最新数据

<!--src/api/user.js-->
//删除管理员
export function deleteAdmin(params){return ajax({method:'POST',url:'admin/delete',data:params})
}

deleteClick(row){ElMessageBox.confirm('确定删除?','Warning',{confirmButtonText: 'OK',cancelButtonText: 'Cancel',type: 'warning',}).then(() => {deleteAdmin({adminid:row.adminid}).then(res=>{if(res.code=='200'){ElMessage.success(res.message)//重新获取数据adminList().then(res=>{this.tableData=res.data;})}else{ElMessage.error(res.message)}})}).catch(() => {ElMessage({type: 'info',message: '删除取消',})})}

ManagerListView完整代码

<template><div><div class="header"><el-button type="success" @click="addClick">添加管理员</el-button></div><el-table :data="computedTableData" style="width: 100%"><!-- type="index" 标记为索引序号, label列标题,prop列的数据字段 --><el-table-column type="index" :index="(currentPage-1)*10+1" label="序号" width="80" /><el-table-column prop="adminname" label="管理员名称" width="180" /><el-table-column label="管理员权限"><template #default="scope"><!-- <div>{{ scope.row.role == 1?'管理员':'超级管理员' }}</div> --><el-tag :type="scope.row.role == 1?'':'success'">{{ scope.row.role == 1?'管理员':'超级管理员' }}</el-tag></template></el-table-column><el-table-column prop="adminname" label="操作" width="180" ><template #default="scope"><el-button @click="edit(scope.row)" size="small" type="primary">编辑</el-button><el-button @click="deleteClick(scope.row)" size="small" type="success">删除</el-button></template></el-table-column></el-table><!-- 分页显示 --><el-pagination background v-model:current-page="currentPage" layout="prev, pager, next" :total="tableData.length" /><el-drawer @close="close" v-model="drawer" ><template #header><h4>{{ drawerTitle=='add'?'添加管理员':'编辑管理员' }}</h4></template><el-form label-with="120px"><el-form-item label="管理员账号"><el-input placeholder="请输入管理员账号" v-model="formData.adminname"/></el-form-item><el-form-item label="管理员密码"><el-input placeholder="请输入管理员密码" v-model="formData.password"/></el-form-item><el-form-item label="管理员角色"><el-select placeholder="请选择管理员角色" v-model="formData.role"><el-option label="管理员" value="管理员"></el-option><el-option label="超级管理员" value="超级管理员"></el-option></el-select></el-form-item><el-form-item><el-tree ref="treeRef":data="menus"show-checkboxnode-key="path":default-checked-keys="defaultCheckedKeys":default-expand-all="true"></el-tree></el-form-item></el-form><el-button v-if="drawerTitle=='add'" @click="add" type="primary">添加</el-button><el-button v-else @click="update" type="primary">修改</el-button></el-drawer></div></template><script>
import { adminList, addAdmin, updateAdmin, deleteAdmin } from '@/api/user';
import { routes } from '@/router';
import { ElMessage } from 'element-plus';export default{data(){return {tableData:[],//当前页码currentPage: 1,//是否打开抽屉效果drawer: false,//路由信息menus: routes[0].children,//管理员数据formData:{adminname:'',password:'',role:'',checkedKeys:''},defaultCheckedKeys:[],drawerTitle:'add'   //抽屉标题}},methods:{addClick(){//打开抽屉this.drawer=true;this.drawerTitle='add'},//获取树型结构中选中的值formatCheckedKeys(){//根据选中的值得到父级路由const list = this.$refs.treeRef.getCheckedNodes(true);//用来存放父级路由的labelconst tempList = [];//最终结果数组const result = [];//list是选中的子路由list.forEach(item=>{//parent:选中子路由的父级路由const parent = this.menus.find(mitem=>{return mitem.children.some(child=>child.label==item.label)})//判断当前父级路由是否已存在if(tempList.includes(parent.label)){result.find(item=>item.label==parent.label).children.push(item)}else{//将对应的内容放到tempList中tempList.push(parent.label)result.push({label:parent.label,path: parent.path,children:[item]})}})//将路由的权限添加到formData中this.formData.checkedKeys = result},add(){//将管理员数据发送给服务器//1、收集数据this.formatCheckedKeys()this.formData.role = this.formData.role =='管理员' ? '1':'2'//2、将数据添加到服务器中addAdmin(this.formData).then(res=>{if(res.code=='200'){ElMessage.success(res.message)//关闭抽屉效果this.drawer=false//重新获取数据adminList().then(res=>{this.tableData=res.data;})}else{ElMessage.error(res.message)}})},edit(row){//打开抽屉this.drawer=true;this.drawerTitle='edit'//获取当前一行数据this.formData.adminname = row.adminname;this.formData.password = row.password;this.formData.role = row.role=='1'?"管理员":'超级管理员';const checkedKeys = [];row.checkedKeys.forEach(parent=>{parent.children.forEach(item=>{checkedKeys.push(item.path)})})this.defaultCheckedKeys=checkedKeys;},close(){this.formData={};this.defaultCheckedKeys=[];if(this.$refs.treeRef){this.$refs.treeRef.setCheckedKeys([]);}},update(){if(this.formData.adminname==''||this.formData.password==''){ElMessage.error("管理员或密码不能为空!")return}this.formData.role = this.formData.role=='管理员'?'1':'2';//获取当前用户的权限this.formatCheckedKeys()//提交修改信息updateAdmin(this.formData).then(res=>{if(res.code=='200'){ElMessage.success(res.message)//关闭抽屉效果this.drawer=false//重新获取数据adminList().then(res=>{this.tableData=res.data;})}else{ElMessage.error(res.message)}})},deleteClick(row){deleteAdmin({adminid:row.adminid}).then(res=>{if(res.code=='200'){ElMessage.success(res.message)//重新获取数据adminList().then(res=>{this.tableData=res.data;})}else{ElMessage.error(res.message)}})}},mounted(){//获取管理员列表adminList().then(res=>{this.tableData=res.data;})},computed:{//计算当前页显示的数据computedTableData(){return this.tableData.slice((this.currentPage-1)*10,(this.currentPage-1)*10+10);}}
}
</script><style lang="scss" scoped>
.header{margin-bottom: 16px;
}
</style>

相关文章:

vue3+elementPlus之后台管理系统(从0到1)(day3-管理员管理)

管理员管理 搭建管理员页面 在views中创建一个manager文件夹&#xff0c;并创建ManagerIndexView.vue、MangagerListView.vue、UserList.vue <!-- src/views/manager/ManagerIndexView.vue --> <template><!-- 作为一个占位符&#xff0c;用于渲染与当前 URL…...

上位机知识篇---ROS2命令行命令静态链接库动态链接库

文章目录 前言第一部分&#xff1a;ROS2命令行命令1. 基础命令&#xff08;1&#xff09;ros2 run&#xff08;2&#xff09;ros2 launch&#xff08;3&#xff09;ros2 node&#xff08;4&#xff09;ros2 topic&#xff08;5&#xff09;ros2 service&#xff08;6&#xff0…...

2025/1/21 学习Vue的第四天

睡觉。 --------------------------------------------------------------------------------------------------------------------------------- 11.Object.defineProperty 1.在我们之前学习JS的时候&#xff0c;普通得定义一个对象与属性。 <!DOCTYPE html> <h…...

云计算、AI与国产化浪潮下DBA职业之路风云变幻,如何谋破局启新途?

引言 在近日举办的一场「云和恩墨大讲堂」直播栏目中&#xff0c;云和恩墨联合创始人李轶楠、副总经理熊军和欧冶云商数据库首席薛晓刚共同探讨了DBA的现状与未来发展。三位专家从云计算、人工智能、国产化替代等多个角度进行了深入的分析和探讨&#xff0c;为从业者提供了宝贵…...

Linux内核编程(二十一)USB驱动开发-键盘驱动

一、驱动类型 USB 驱动开发主要分为两种&#xff1a;主机侧的驱动程序和设备侧的驱动程序。一般我们编写的都是主机侧的USB驱动程序。 主机侧驱动程序用于控制插入到主机中的 USB 设备&#xff0c;而设备侧驱动程序则负责控制 USB 设备如何与主机通信。由于设备侧驱动程序通常与…...

模拟算法习题篇

在算法中&#xff0c;模拟是一种通过计算机程序来模拟现实世界中的过程或系统行为的方法。它的核心思想是根据题目给定的规则和逻辑&#xff0c;按照步骤细致地重现事件的发展流程&#xff0c;从而获得最终结果。 解题时如何使用模拟算法&#xff1a; 理解题目规则&#xff1a;…...

蓝桥杯真题 - 翻转 - 题解

题目链接&#xff1a;https://www.lanqiao.cn/problems/3520/learning/ 个人评价&#xff1a;难度 1 星&#xff08;满星&#xff1a;5&#xff09; 前置知识&#xff1a;无 整体思路 贪心&#xff0c;除了第一位跟最后一位&#xff0c;其它字符&#xff0c;每当 S [ i ] ≠…...

IP属地与视频定位位置不一致:现象解析与影响探讨

在数字化时代&#xff0c;IP属地和视频定位位置已成为我们获取网络信息、判断内容真实性的重要依据。然而&#xff0c;有时我们会发现&#xff0c;某些视频内容中展示的定位位置与其发布者的IP属地并不一致。这种不一致现象引发了广泛的关注和讨论。本文旨在深入剖析IP属地与视…...

管道符、重定向与环境变量

个人博客站—运维鹿: http://www.kervin24.top CSDN博客—做个超努力的小奚&#xff1a; https://blog.csdn.net/qq_52914969?typeblog 一、重定向 将命令和文件结合 标准输入重定向&#xff08;STDIN&#xff0c;文件描述符为0&#xff09;&#xff1a;默认从键盘输入&am…...

可扩展性设计架构模式——开闭原则

1. 概述 在架构设计中&#xff0c;遵循开闭原则&#xff08;Open/Closed Principle, OCP&#xff09;,代码应该“对扩展开放&#xff0c;对修改关闭”是实现可扩展性的关键。这个原则指导我们设计系统时&#xff0c;应使其对新增功能开放&#xff0c;而对现有代码的修改封闭。这…...

算法随笔_17: 回文数

上一篇: 算法随笔_16: 找出第k小的数对距离-CSDN博客 题目描述如下: 给你一个整数 x &#xff0c;如果 x 是一个回文整数&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 回文数是指正序&#xff08;从左向右&#xff09;和倒序&#xff08;从右向左&…...

计算机的错误计算(二百一十九)

摘要 大模型能确定 sin(2.6^10) 的符号吗&#xff1f;实验表明&#xff0c;大模型的计算、推理均有问题。另外&#xff0c;结论也是错的。 前面讨论的内容为自变量是 2.6^100的正弦&#xff0c;本节讨论自变量为 2.6^10的正弦&#xff08;对于某些大模型&#xff0c;2.6^100似…...

React进阶之高阶组件HOC、react hooks、自定义hooks

React高级 高阶组件 HOC属性代理反向继承属性代理和反向继承的区别实例实例一实例二 HooksHooks APIuseState&#xff1a;useEffect&#xff1a;useLayoutEffect&#xff1a;useRef&#xff1a;useContext&#xff1a;useReducer:useMemouseCallback 自定义Hooks 拓展&#xff…...

【Pytest】基础到高级功能的理解使用

文章目录 第一部分&#xff1a;Pytest 简介1.1 什么是 Pytest&#xff1f;1.2 Pytest 的历史1.3 Pytest 的核心概念1.4 Pytest 的特点1.5 为什么选择 Pytest&#xff1f; 第二部分&#xff1a;Pytest 的基本使用2.1 安装 Pytest2.2 编写第一个测试用例2.2.1 创建一个简单的测试…...

RHCE实验详解

目录 实验分析 环境拓扑结构 项目需求 主机环境描述 实验步骤 一、密钥互信和主机名更改 二、DNS 三、NGINX 四、MARIADB 五、NFS 六、NTP 七、论坛服务 结果展示及痛点解答 实验分析 环境拓扑结构 项目需求 1. 172.25.250.101 主机上的 Web 服务要求提供 www.ex…...

备赛蓝桥杯之第十五届职业院校组省赛第二题:分享点滴

提示&#xff1a;本篇文章仅仅是作者自己目前在备赛蓝桥杯中&#xff0c;自己学习与刷题的学习笔记&#xff0c;写的不好&#xff0c;欢迎大家批评与建议 由于个别题目代码量与题目量偏大&#xff0c;请大家自己去蓝桥杯官网【连接高校和企业 - 蓝桥云课】去寻找原题&#xff0…...

MyBatis 注解开发详解

MyBatis 注解开发详解 MyBatis 支持使用注解来进行数据库操作。注解方式将 SQL 语句直接写在 Java 接口中&#xff0c;通过注解来完成 CRUD&#xff08;增删改查&#xff09;操作&#xff0c;省去了使用 XML 配置的繁琐步骤。这种方式适合简单项目或快速原型开发&#xff0c;因…...

Kivy App开发之UX控件VideoPlayer视频播放

kivy使用VideoPlayer控件实现视频播放,可以控制视频的播放,暂停,音量调节等功能。 在使用VideoPlayer视频播放器时,可以参考下表属性来设置其样式和触发事件。 属性说明source视频路径,默认为空state视频状态,值play,pause,stop,默认为stopthumbnail显示视频的缩略图…...

简单排序算法

异或运算及异或运算实现的swap方法 ^(异或): ^运算是计算机中的位运算&#xff0c;运算规则为相同为0&#xff0c;不同为1&#xff08;也被称为无进位相加&#xff09;。位运算处理效率比常规运算符效率更高。 异或运算遵循的法则&#xff1a; 0^N N N^N 0 异或运算…...

C语言初阶牛客网刷题——JZ17 打印从1到最大的n位数【难度:入门】

1.题目描述 牛客网OJ题链接 题目描述&#xff1a; 输入数字 n&#xff0c;按顺序打印出从 1 到最大的 n 位十进制数。比如输入 3&#xff0c;则打印出 1、2、3 一直到最大的 3 位数 999。 用返回一个整数列表来代替打印n 为正整数&#xff0c;0 < n < 5 示例1 输入&…...

模型参数、模型存储精度、参数与显存

模型参数量衡量单位 M&#xff1a;百万&#xff08;Million&#xff09; B&#xff1a;十亿&#xff08;Billion&#xff09; 1 B 1000 M 1B 1000M 1B1000M 参数存储精度 模型参数是固定的&#xff0c;但是一个参数所表示多少字节不一定&#xff0c;需要看这个参数以什么…...

Java - Mysql数据类型对应

Mysql数据类型java数据类型备注整型INT/INTEGERint / java.lang.Integer–BIGINTlong/java.lang.Long–––浮点型FLOATfloat/java.lang.FloatDOUBLEdouble/java.lang.Double–DECIMAL/NUMERICjava.math.BigDecimal字符串型CHARjava.lang.String固定长度字符串VARCHARjava.lang…...

【C++特殊工具与技术】优化内存分配(一):C++中的内存分配

目录 一、C 内存的基本概念​ 1.1 内存的物理与逻辑结构​ 1.2 C 程序的内存区域划分​ 二、栈内存分配​ 2.1 栈内存的特点​ 2.2 栈内存分配示例​ 三、堆内存分配​ 3.1 new和delete操作符​ 4.2 内存泄漏与悬空指针问题​ 4.3 new和delete的重载​ 四、智能指针…...

论文阅读:Matting by Generation

今天介绍一篇关于 matting 抠图的文章&#xff0c;抠图也算是计算机视觉里面非常经典的一个任务了。从早期的经典算法到如今的深度学习算法&#xff0c;已经有很多的工作和这个任务相关。这两年 diffusion 模型很火&#xff0c;大家又开始用 diffusion 模型做各种 CV 任务了&am…...

在鸿蒙HarmonyOS 5中使用DevEco Studio实现指南针功能

指南针功能是许多位置服务应用的基础功能之一。下面我将详细介绍如何在HarmonyOS 5中使用DevEco Studio实现指南针功能。 1. 开发环境准备 确保已安装DevEco Studio 3.1或更高版本确保项目使用的是HarmonyOS 5.0 SDK在项目的module.json5中配置必要的权限 2. 权限配置 在mo…...

【免费数据】2005-2019年我国272个地级市的旅游竞争力多指标数据(33个指标)

旅游业是一个城市的重要产业构成。旅游竞争力是一个城市竞争力的重要构成部分。一个城市的旅游竞争力反映了其在旅游市场竞争中的比较优势。 今日我们分享的是2005-2019年我国272个地级市的旅游竞争力多指标数据&#xff01;该数据集源自2025年4月发表于《地理学报》的论文成果…...

算法250609 高精度

加法 #include<stdio.h> #include<iostream> #include<string.h> #include<math.h> #include<algorithm> using namespace std; char input1[205]; char input2[205]; int main(){while(scanf("%s%s",input1,input2)!EOF){int a[205]…...

Java中HashMap底层原理深度解析:从数据结构到红黑树优化

一、HashMap概述与核心特性 HashMap作为Java集合框架中最常用的数据结构之一&#xff0c;是基于哈希表的Map接口非同步实现。它允许使用null键和null值&#xff08;但只能有一个null键&#xff09;&#xff0c;并且不保证映射顺序的恒久不变。与Hashtable相比&#xff0c;Hash…...

【记录坑点问题】IDEA运行:maven-resources-production:XX: OOM: Java heap space

问题&#xff1a;IDEA出现maven-resources-production:operation-service: java.lang.OutOfMemoryError: Java heap space 解决方案&#xff1a;将编译的堆内存增加一点 位置&#xff1a;设置setting-》构建菜单build-》编译器Complier...

可下载旧版app屏蔽更新的app市场

软件介绍 手机用久了&#xff0c;app越来越臃肿&#xff0c;老手机卡顿成常态。这里给大家推荐个改善老手机使用体验的方法&#xff0c;还能帮我们卸载不需要的app。 手机现状 如今的app不断更新&#xff0c;看似在优化&#xff0c;实则内存占用越来越大&#xff0c;对手机性…...