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

Vue3 + ElementPlus动态合并数据相同的单元格(超级详细版)

最近的新项目有个需求需要合并单元列表。ElementPlus 的 Table 提供了合并行或列的方法,可以参考一下https://element-plus.org/zh-CN/component/table.html

但项目中,后台数据返回格式和指定合并是动态且没有规律的,Element 的示例过于简单,因此记录下来,大家可以参考一下!

 效果图

 后台返回的数据结构

代码详解

实操中,需要合并的代码通常就是 list_cnt 数据需要进行合并,因为后台返回的格式都是Data 数据中包裹着 list_cnt 数据,这种格式看起来也是比较清晰。由 Element 文档可知:el-table 组件主要靠 :span-method 方法实现合并。

 完整代码

<template><div class="app-container"><div class="search-bar"><el-form :inline="true" :model="formData" class="common-form-inline"><el-form-item label="名称搜索"><el-input v-model="formData.name" clearable @clear="queryAndroidList(true)" placeholder="请输入" /></el-form-item><el-form-item><el-button type="primary" @click="queryAndroidList(true)">搜索</el-button></el-form-item></el-form></div><el-table :data="list" :stripe="true" fit highlight-current-row :show-overflow-tooltip="true"style="width: 100%; margin-top: 20px" v-loading="loading" @selection-change="handleSelectionChange":span-method="objectSpanMethod" border><el-table-column type="selection" align="center" width="55" /><el-table-column align="center" label="实例" prop="idx" width="220px"><template #default="scope"><el-button size="small" round>实例: {{ scope.row.idx }}</el-button><el-button type="primary" size="small" @click="handleEdit(scope.row)">编辑</el-button><el-button type="primary" size="small" @click="handleCreate(scope.row)">创建</el-button><div class="time-line"><span>到期时间: {{ scope.row.update_time || '未授权' }}</span></div></template></el-table-column><el-table-column align="center" label="ip" prop="ip" width="180px"></el-table-column><el-table-column align="center" label="ADB/API端口" prop="levelName" width="180px"><template #default="scope"><span v-if="scope.row.adb_port || scope.row.sdk_port">{{ scope.row.adb_port || '-' }} - {{ scope.row.sdk_port|| '-' }}</span><span v-else> - </span></template></el-table-column><el-table-column align="center" label="名称" prop="name" width="120px"><template #default="scope"><span v-if="scope.row.name">{{ scope.row.name }}</span><span v-else>-</span></template></el-table-column><el-table-column align="center" label="状态" prop="status" width="150px"><template #default="scope"><el-button plain :style="{backgroundColor: scope.row.status === 20 ? '#fef0f0' : scope.row.status === 10 ? '#f0f9eb' : '',borderColor: scope.row.status === 20 ? '#fde2e2' : scope.row.status === 10 ? '#e1f3d8' : '',color: scope.row.status === 20 ? '#f56c6c' : scope.row.status === 10 ? '#67c23a' : ''}" v-if="scope.row.status">{{ scope.row.status === 10 ? '运行中' : scope.row.status === 20 ? '关机' : '空闲' }}</el-button></template></el-table-column><el-table-column align="center" label="系统版本" prop="serial_no" width="150px"><template #default="scope"><span>版本1.0</span></template></el-table-column><el-table-column :show-overflow-tooltip="false" align="center" label="操作"><template #default="scope"><div class="cell"><el-button :type="scope.row.status === 20 ? 'success' : 'danger'" size="small"@click="handlePowerAction(scope.row)">{{ scope.row.status === 20 ? '开机' : '关机' }}</el-button><div class="el-dropdown flex flex-wrap items-center"><el-dropdown><el-button type="info">更多操作<el-icon class="el-icon--right"><arrow-down /></el-icon></el-button><template #dropdown><el-dropdown-menu><el-dropdown-item @click="handleoperate('restart', scope.row)">重启云机</el-dropdown-item><el-dropdown-item @click="handleoperate('edit', scope.row)">修改名称</el-dropdown-item><el-dropdown-item @click="handleoperate('remark', scope.row)">设置备注</el-dropdown-item><el-dropdown-item @click="handleoperate('random', scope.row)">随机设备信息</el-dropdown-item><el-dropdown-item @click="handleoperate('mirror', scope.row)">切换镜像</el-dropdown-item><el-dropdown-item @click="handleoperate('reset', scope.row)">重置云机</el-dropdown-item><el-dropdown-item @click="handleoperate('copy', scope.row)">复制云机</el-dropdown-item><el-dropdown-item @click="handleoperate('delete', scope.row)">删除云机</el-dropdown-item><el-dropdown-item @click="handleoperate('terminal', scope.row)">终端窗口</el-dropdown-item></el-dropdown-menu></template></el-dropdown></div><div class="flex flex-wrap items-center"><el-dropdown><el-button type="primary">选择网络<el-icon class="el-icon--right"><arrow-down /></el-icon></el-button><template #dropdown><el-dropdown-menu><el-dropdown-item @click="handleSelectVPC">(旧)选择VPC网络</el-dropdown-item><el-dropdown-item>(新)选择VPC网络</el-dropdown-item></el-dropdown-menu></template></el-dropdown></div></div></template></el-table-column></el-table><!-- 创建 --><el-dialog v-model="createdVisible" title="创建安卓" width="500"><el-form :model="formCreate"><el-form-item label="云机数量" :label-width="formLabelWidth"><el-input-number v-model="formCreate.num" autocomplete="off" :min="1" :max="12" /></el-form-item><el-form-item label="镜像类型" :label-width="formLabelWidth"><el-radio-group v-model="formCreate.img_type"><el-radio label="10">基础镜像</el-radio><el-radio label="20">GMS镜像</el-radio></el-radio-group><el-button type="primary" size="small" style="margin-left: 10px" @click="handleSwitchImage"><el-icon><Refresh /></el-icon>&nbsp; 切换</el-button></el-form-item><el-form-item label="DNS设置" :label-width="formLabelWidth"><el-select v-model="formCreate.dns" @change="selectDns" placeholder="请选择DNS" class="w130" filterable><el-option v-for="item in setDns" :key="item.id" :label="item.name" :value="item.id" /></el-select></el-form-item><el-form-item label="屏幕刷新率" :label-width="formLabelWidth"><el-select v-model="formCreate.fps" placeholder="请选择刷新率"><el-option label="60 FPS" value="60" /><el-option label="90 FPS" value="90" /><el-option label="120 FPS" value="120" /></el-select></el-form-item><!-- <el-form-item label="VPC网络" :label-width="formLabelWidth"><el-select v-model="formCreate.vpc" placeholder="请选择VPC"><el-option label="VPC网络 1" value="vpc1" /><el-option label="VPC网络 2" value="vpc2" /><el-option label="VPC网络 3" value="vpc3" /></el-select></el-form-item> --></el-form><template #footer><div class="dialog-footer"><el-button @click="createdVisible = false">取消</el-button><el-button type="primary" @click="createdDialog(row)">确定</el-button></div></template></el-dialog><!-- 修改 --><el-dialog v-model="dialogFormVisible" title="修改云机名称" width="500"><el-form :model="formEdit"><el-form-item label="名称" :label-width="formLabelWidth"><el-input v-model="formEdit.new_name" autocomplete="off" /></el-form-item></el-form><template #footer><div class="dialog-footer"><el-button @click="dialogFormVisible = false">取消</el-button><el-button type="primary" @click="editDialog(row)">确定</el-button></div></template></el-dialog><!-- 设置备注 --><el-dialog v-model="remarkVisible" title="设置云机备注" width="500"><el-form :model="formRemark"><el-form-item label="云机备注" :label-width="formLabelWidth"><el-input v-model="formRemark.name" autocomplete="off" /></el-form-item></el-form><template #footer><div class="dialog-footer"><el-button @click="remarkVisible = false">取消</el-button><el-button type="primary" @click="remarkVisible = false">确定</el-button></div></template></el-dialog><!-- 切换云机镜像 --><el-dialog v-model="mirrorVisible" title="切换云机镜像" width="500"><el-form :model="formMirror"><el-form-item label="云机镜像" :label-width="formLabelWidth"><el-select v-model="formMirror.mirror" multiple placeholder="请选择" style="width: 240px"><el-option v-for="item in mirrorList" :key="item.value" :label="item.label" :value="item.value" /></el-select></el-form-item><p>说明:如何切换的镜像不存在,系统会先拉取镜像,这个过程比较耗时请耐心等待。</p></el-form><template #footer><div class="dialog-footer"><el-button @click="mirrorVisible = false">取消</el-button><el-button type="primary" @click="mirrorVisible = false">确定</el-button></div></template></el-dialog><!-- 随机设备信息 --><el-dialog v-model="randomVisible" title="随机设备信息" width="500"> </el-dialog><!-- 复制云机 --><el-dialog v-model="copyVisible" title="复制云机" width="500"><el-form :model="formCopy"><span>云机复制数量</span><el-input-number v-model="formCopy.num" :min="1" :max="10" /></el-form><span>说明:复制请先关闭云机。相同实例号的云机,同时只能有一台为开机状态。复制云机比较耗时请耐心等待</span><template #footer><div class="dialog-footer"><el-button @click="copyVisible = false">取消</el-button><el-button type="primary" @click="handleCopy(row)">确定</el-button></div></template></el-dialog><!-- 重置云机 --><el-dialog v-model="resetVisible" title="提示" width="500"><el-icon><WarningFilled /></el-icon> <span>确定要重置此云机?</span><template #footer><div class="dialog-footer"><el-button @click="resetVisible = false">取消</el-button><el-button type="primary" @click="handleReset(row)">确定</el-button></div></template></el-dialog><!-- 删除云机 --><el-dialog v-model="deleteVisible" title="提示" width="500"><el-icon><WarningFilled /></el-icon> <span>确定要删除此云机?</span><template #footer><div class="dialog-footer"><el-button @click="deleteVisible = false">取消</el-button><el-button type="primary" @click="handleDele(row)">确定</el-button></div></template></el-dialog><!-- 终端窗口 --><el-dialog v-model="terminalVisible" title="终端窗口" width="500"><iframe src="http://192.168.1.100:8080" frameborder="0" width="100%" height="500px"></iframe><template #footer> </template></el-dialog><!-- 选择网络 --><el-dialog v-model="networkVisible" title="选择网络" width="500"><el-form :model="formNetwork"><el-form-item label="VPC网络" :label-width="formLabelWidth"><el-select v-model="formNetwork.network" placeholder="请选择"><el-option label="VPC网络1" value="1" /><el-option label="VPC网络2" value="2" /><el-option label="VPC网络3" value="3" /></el-select></el-form-item></el-form></el-dialog></div>
</template>
<script setup>
import { ref, reactive, nextTick } from 'vue'
import andriodList from '@/network/andriodList'
import { ElMessage } from 'element-plus'// 搜索条件
const formData = reactive({name: '',
})
const loading = ref(false); // 列表的加载中
const list = ref([{}]) // 列表的数据const queryAndroidList = async (flag) => {// 根据搜索条件设置查询参数if (flag) {formData.name = formData.name.trim()}loading.value = truetry {const res = await andriodList.getAllAndroidList({name: formData.name})if (res.code === 200) {let allDataList = [];res.data && res.data.length > 0 && res.data.forEach((item, index) => {item.list_cnt && item.list_cnt.length > 0 && item.list_cnt.forEach((item2, index2) => {allDataList.push({...item,// ...item2, 看具体需求  处理列表所需字段, 将list_cnt里的数据平铺开idx: item2.idx,name: item2.name,status: item2.status,data_dir: item2.data_dir,update_time: item2.update_time,sdk_port1: item2.sdk_port,adb_port1: item2.adb_port,cnt_id1: item2.cnt_id,})})})list.value = allDataList;} else {list.value = []}} catch (error) {list.value = []} finally {loading.value = false}
}
// 初始化获取列表
queryAndroidList()const selectIds = ref([]);
// 行复选框选中项变化
function handleSelectVPC(selection) {selectIds.value = selection.map(item => item.id);
}function handleQuery() {loading.value = true;
}
// 多选框选中数据
function handleSelectionChange(selection) {selectIds.value = selection.map(item => item.id);
}/*** 合并行或列* @param row 行号* @param col 列号* @param rowspan 行合并数* @param colspan 列合并数*  @param rowIndex 当前行号* @param columnIndex 当前列号* */
const objectSpanMethod = ({row,column,rowIndex,columnIndex,
}) => {if (column.property === 'idx') {if (rowIndex > 0 && list.value[rowIndex].idx === list.value[rowIndex - 1].idx) {return {rowspan: 0,colspan: 0,}}return {rowspan: getRowspan('idx', rowIndex),colspan: 1,}}
}// 获取行合并数
const getRowspan = (key, rowIndex) => {let rowspan = 1; //默认合并1行let curVal = list.value[rowIndex][key]; //存储了当前值for (let i = rowIndex + 1; i < list.value.length; i++) {if (list.value[i][key] === curVal) {rowspan++;} else {break;}}return rowspan;
}// 选择DNS
const setDns = ref([{id: '1',name: 'DNS1'
},
{id: '2',name: 'DNS2'}])
const selectDns = async () => { }//创建弹窗
const formCreate = reactive({idx: '',num: 1,img_type: "10",dns: '',fps: '',
})const createdVisible = ref(false)
// 创建实例
function handleCreate(row) {createdVisible.value = true;formCreate.idx = row.idx; // 保存idx到formCreate中
}const handleCreateAndroid = async () => {try {const res = await andriodList.createAPI({idx: formCreate.idx, // 使用保存的idxnum: formCreate.num,img_type: formCreate.img_type,dns: formCreate.dns,fps: formCreate.fps,})if (res.code === 200) {ElMessage.success(res.msg)createdVisible.value = false// 刷新列表queryAndroidList()} else {ElMessage.error(res.msg)}} catch (error) {ElMessage.error(res.msg)}
}//确定创建弹窗
function createdDialog() {handleCreateAndroid()
}// 编辑实例
function handleEdit(row) {console.log('编辑实例:', row);
}//切换镜像
const handleSwitchImage = () => {console.log('切换镜像');
}//开机--关机 --status 容器状态 10 运行中 20 关机
let runId = null
async function handlePowerAction(row) {runId = row.cnt_id1const status = row.statustry {let resif (status === 10) {res = await andriodList.stopAPI({cnt_id: runId})} else {res = await andriodList.runAPI({cnt_id: runId})}if (res.code === 200) {ElMessage.success(res.msg)queryAndroidList()} else {ElMessage.error(res.msg)}} catch (error) {ElMessage.error(res.msg)}
}//重启云机
const restarCnt = async () => {try {const res = await andriodList.restart({cnt_id: publicId})if (res.code === 200) {ElMessage.success(res.msg)// 重启成功后重新获取列表queryAndroidList()} else {ElMessage.error(res.msg)}} catch (error) {ElMessage.error(res.msg)}
}const formEdit = reactive({cnt_id: '',new_name: '',
})
const dialogFormVisible = ref(false)
const formLabelWidth = '140px'const handleEditName = async () => {try {const res = await andriodList.renameAPI({cnt_id: formEdit.cnt_id,new_name: formEdit.new_name})if (res.code === 200) {ElMessage.success(res.msg)dialogFormVisible.value = falsequeryAndroidList()} else {ElMessage.error(res.msg)}} catch (error) {ElMessage.error(res.msg)}
}
//修改弹窗
function editDialog() {handleEditName()
}//设置备注
const formRemark = reactive({name: '',
})
const remarkVisible = ref(false)//切换
const formMirror = reactive({mirror: '',
})
const mirrorList = [{value: '1',label: '镜像1'
}]
const mirrorVisible = ref(false)//随机
const randomVisible = ref(false)//复制
const formCopy = reactive({num: 1,src_cnt_id: "",target_cnt_idx: "",target_cnt_name: "",
})
const copyVisible = ref(false)
//复制弹窗
function handleCopy() {handleCopyAPI()
}const handleCopyAPI = async () => {try {const res = await andriodList.copyAPI({num: formCopy.num,src_cnt_id: formCopy.src_cnt_id,target_cnt_idx: formCopy.target_cnt_idx,target_cnt_name: formCopy.target_cnt_name,})if (res.code === 200) {ElMessage.success(res.msg)copyVisible.value = falsequeryAndroidList()} else {ElMessage.error(res.msg)}} catch (error) {ElMessage.error(res.msg)}
}//重置  
const resetVisible = ref(false)
const handleResetId = async () => {try {const res = await andriodList.resetAPI({cnt_id: publicId})if (res.code === 200) {ElMessage.success(res.msg)deleteVisible.value = falsequeryAndroidList()} else {ElMessage.error(res.msg)}} catch (error) {ElMessage.error(res.msg)}
}//重置弹窗
function handleReset() {handleResetId()
}//删除
const deleteVisible = ref(false)
const handleDeleId = async () => {try {const res = await andriodList.deleteCntAPI({cnt_id: publicId})if (res.code === 200) {ElMessage.success(res.msg)deleteVisible.value = falsequeryAndroidList()} else {ElMessage.error(res.msg)}} catch (error) {ElMessage.error(res.msg)}
}//删除
function handleDele() {handleDeleId()
}//终端
const terminalVisible = ref(false)//选择网络
const formNetwork = reactive({network: '',
})
const networkVisible = ref(false) //选择网络弹窗  //操作
let publicId = null // 公共id
function handleoperate(type, row) {publicId = row.cnt_id1 // 获取第一个云机的cnt_idswitch (type) {case 'restart':restarCnt(row)break;case 'edit':dialogFormVisible.value = true;formEdit.cnt_id = publicId;formEdit.new_name = row.name;break;case 'remark':remarkVisible.value = true;break;case 'random':randomVisible.value = true;break;case 'mirror':mirrorVisible.value = true;break;case 'copy':copyVisible.value = true;formCopy.src_cnt_id = publicId;formCopy.target_cnt_name = row.name;formCopy.target_cnt_idx = row.idx;break;case 'terminal':terminalVisible.value = true;break;case 'reset':// 处理重置操作resetVisible.value = true;break;case 'delete':// 处理删除操作deleteVisible.value = true;break;default:break;}
}</script><style lang="scss" scoped>
.app-container {.search-bar {.el-icon {color: #fff;}}.cell {display: flex;justify-content: center;align-items: center;}.el-dropdown {margin-left: 10px;}.examples {display: flex;justify-content: center;}.time-line {margin-top: 10px;color: rgb(235, 0, 0);font-size: 14px;}
}
</style>

代码中会有一些注释,根据个人需求可以进行参考,此需求也涉及到按钮操作的,如果没有次需求可以忽略不看。

以上就是列表的合并单元格,如果对你有帮助,麻烦点个赞呗~ 

相关文章:

Vue3 + ElementPlus动态合并数据相同的单元格(超级详细版)

最近的新项目有个需求需要合并单元列表。ElementPlus 的 Table 提供了合并行或列的方法&#xff0c;可以参考一下https://element-plus.org/zh-CN/component/table.html 但项目中&#xff0c;后台数据返回格式和指定合并是动态且没有规律的&#xff0c;Element 的示例过于简单&…...

【JavaWeb后端学习笔记】MySQL的数据控制语言(Data Control Language,DCL)

MySQL DCL 1、管理用户2、控制权限 DCL英文全称是Data Control Language&#xff08;数据控制语言&#xff09;&#xff0c;用来管理数据库用户、控制数据库访问权限。 1、管理用户 管理用户的操作都需要在MySQL自带的 mysql 数据库中进行。 -- 查询用户 -- 需要先切换到MyS…...

libvirt学习

文章目录 libvirt 简介节点、Hypervisor和域libvirt 安装和配置libvirt的XML配置文件libvirt APIMain libvirt APIsError handlingSpecial specific APIs 建立到Hypervisor的连接libvirt API使用编译libvirt工具virshvirt-clonevirt-dfvirt-imagevirt-installvirt-topvirt-what…...

STM32-笔记19-串口打印功能

复制项目文件夹03-流水灯&#xff0c;重命名为19-串口打印功能 打开项目 在主函数中&#xff0c;添加头文件、和串口初始化函数&#xff08;设置波特率&#xff09;和输出函数&#xff0c;如图所示&#xff1a; 软件部分就设置好了 下面是硬件部分 接线&#xff1a;使用USB…...

概率论与数理统计

概率论占比更多&#xff0c;三分之二左右 数理统计会少一些 事件之间的概率 ab互斥&#xff0c;不是ab独立 古典概型吃高中基础&#xff0c;考的不会很多 条件概率公式&#xff0c;要记 公式不要全记&#xff0c;很多有名称的公式是通过基础公式转换而来的 目的在于解决一…...

统信系统设置代理的问题

统信系统设置代理的问题 问题表现方式一方式二 问题表现 统信系统下有系统代理和应用代理两个代理。设置系统代理时&#xff0c;git不能经过代理拉取代码。但是设置应用代理时&#xff0c;可以用git通过代理拉代码。 这是系统代理&#xff0c;在这里设置 ip 端口&#xff0c;…...

TCP 为什么采用三次握手和四次挥手以及 TCP 和 UDP 的区别

1. TCP 为什么采用三次握手和四次挥手 采用三次握手的原因&#xff1a; 确认双方的收发能力。第一次握手&#xff0c;客户端发送 SYN 报文&#xff0c;告诉服务器自身具备发送数据的能力&#xff0c;第二次握手&#xff0c;服务器回应 SYN ACK 报文&#xff0c;表名自己既能…...

springboot配置并使用RestTemplate

目录 一、RestTemplate配置 1、将RestTemplate初始化为Bean 2、使用HttpClient作为RestTemplate客户端 &#xff08;1&#xff09;引入HttpClient依赖 &#xff08;2&#xff09;修改RestTemplate配置类 3、设置拦截器 &#xff08;1&#xff09;新增拦截器类 &#xf…...

人工智能-Python网络编程-TCP

1 TCP-概念版 服务端 import socket ​ # 1 创建服务端套接字对象 # socket.AF_INET IPV4 # socket.SOCK_STREAM TCP # socket.SOCK_DGRAM UDP tcp_server_socket socket.socket(socket.AF_INET, socket.SOCK_STREAM) ​ # 2 绑定端口号 tcp_server_socket.bind((192.…...

【Java回顾】Day3 继承|Override/Ovverload|多态|抽象类|封装|接口|枚举

学习资料 菜鸟教程 https://www.runoob.com/java/java-interfaces.html 继承|Override/Ovverload|多态|抽象类|封装|接口|枚举 继承 创建分等级层次的类&#xff0c;子类继承父类的特征、行为、方法 class 父类{ } class 子类 extends 父类{ super(); }一些性质 Java 不支持…...

SpringMVC(四)响应

目录 数据处理及跳转 1. 结果跳转方式 ①.ModelAndView ②.ServletAPI 1、通过HttpServletResponse进行输出 2、通过HttpServletResponse实现请求转发 3、通过HttpServletResponse实现重定向 ③.SpringMVC 1.直接输出 2.请求转发 3.重定向 2.ResponseBody响应json数…...

vim 的基础使用

目录 一&#xff1a;vim 介绍二&#xff1a;vim 特点三&#xff1a;vim 配置四&#xff1a;vim 使用1、vim 语法格式2、vim 普通模式&#xff08;1&#xff09;保存退出&#xff08;2&#xff09;光标跳转&#xff08;3&#xff09;文本删除&#xff08;4&#xff09;文本查找&…...

关于flinkCDC监控mysql binlog时,datetime类型自动转换成时间戳类型问题

flinkCDC监控mysql binlog时&#xff0c;datetime类型自动转换成时间戳类型 问题解决1.自定义转换器类2.代码引用 结果 问题 flink版本&#xff1a;1.18.1&#xff0c;mysql版本&#xff1a;8.0.40 使用FlinkCDC的MySqlSource 连接mysql&#xff0c;对于datetime 类型字段&…...

基于Springboot校园失物招领系统【附源码】

基于Springboot校园失物招领系统 效果如下&#xff1a; 系统登陆页面 物品页面 系统首页面 失物招领管理页面 失物认领页面 宣传视频页面 物品挂失留言管理页面 宣传视频类型管理页面 研究背景 在校园环境中&#xff0c;失物招领是一个常见的问题。传统的失物招领方式主要依…...

单片机端口操作和独立引脚操作

单片机端口操作和独立引脚操作 在单片机编程中&#xff0c;控制I/O端口是最基础的操作之一。通过控制端口&#xff0c;我们可以实现对外设&#xff08;如LED、按键、继电器等&#xff09;的控制。在51单片机中&#xff0c;有两种常见的端口操作方式&#xff1a;整体控制&#…...

【Vim Masterclass 笔记03】S03L10 + S03L11:Vim 中的文本删除操作以及 Vim 思维习惯的培养(含 DIY 拓展知识点)

文章目录 Section 3&#xff1a;Vim Essentials&#xff08;Vim 核心知识&#xff09;S03L10 Vim 核心浏览命令同步练习点评课S03L11 Deleting Text and "Thinking in Vim" 文本的删除及 Vim 思维习惯的培养1 删除单个字符2 删除一个单词2.1 推广1&#xff1a;D HJK…...

ARM200~500部署

前提&#xff1a;数据库已经安装好&#xff0c;并且正常运行 1.修改hostname,将里面的AR-A 改为hzx vi /etc/hostname 2.重启网络服务 sudo systemctl restart NetworkManager 3.修改community-admin.service 文件&#xff0c;更改小区名称和IP&#xff0c;并将文件上传到/…...

word中插入zotero引用

1、参考文献末尾没有文献&#xff1f; 在文献条目要显示的地方点击“refresh” 2、参考文献条目没有悬挂缩进&#xff1f; 把“书目”添加到样式库中&#xff0c;修改样式为悬挂缩进1.5字符 3、交叉引用&#xff1f; 宏 新建一个宏 粘贴下面代码 Public Sub ZoteroLinkCita…...

需求上线,为什么要刷缓存?

在需求上线的过程中&#xff0c;刷缓存主要有以下几个重要原因&#xff1a; 一、保证数据的准确性 旧数据残留问题 缓存是为了加快数据访问速度而存储的数据副本。在需求更新后&#xff0c;之前缓存中的数据可能已经不符合新的业务逻辑。例如&#xff0c;一个电商网站修改了商…...

TVS二极管选型【EMC】

TVS器件并联在电路中&#xff0c;当电路正常工作时&#xff0c;他处于截止状态&#xff08;高阻态&#xff09;&#xff0c;不影响线路正常工作&#xff0c;当线路处于异常过压并达到其击穿电压时&#xff0c;他迅速由高阻态变为低阻态&#xff0c;给瞬间电流提供一个低阻抗导通…...

Chapter03-Authentication vulnerabilities

文章目录 1. 身份验证简介1.1 What is authentication1.2 difference between authentication and authorization1.3 身份验证机制失效的原因1.4 身份验证机制失效的影响 2. 基于登录功能的漏洞2.1 密码爆破2.2 用户名枚举2.3 有缺陷的暴力破解防护2.3.1 如果用户登录尝试失败次…...

iOS 26 携众系统重磅更新,但“苹果智能”仍与国行无缘

美国西海岸的夏天&#xff0c;再次被苹果点燃。一年一度的全球开发者大会 WWDC25 如期而至&#xff0c;这不仅是开发者的盛宴&#xff0c;更是全球数亿苹果用户翘首以盼的科技春晚。今年&#xff0c;苹果依旧为我们带来了全家桶式的系统更新&#xff0c;包括 iOS 26、iPadOS 26…...

前端倒计时误差!

提示:记录工作中遇到的需求及解决办法 文章目录 前言一、误差从何而来?二、五大解决方案1. 动态校准法(基础版)2. Web Worker 计时3. 服务器时间同步4. Performance API 高精度计时5. 页面可见性API优化三、生产环境最佳实践四、终极解决方案架构前言 前几天听说公司某个项…...

(二)TensorRT-LLM | 模型导出(v0.20.0rc3)

0. 概述 上一节 对安装和使用有个基本介绍。根据这个 issue 的描述&#xff0c;后续 TensorRT-LLM 团队可能更专注于更新和维护 pytorch backend。但 tensorrt backend 作为先前一直开发的工作&#xff0c;其中包含了大量可以学习的地方。本文主要看看它导出模型的部分&#x…...

大数据零基础学习day1之环境准备和大数据初步理解

学习大数据会使用到多台Linux服务器。 一、环境准备 1、VMware 基于VMware构建Linux虚拟机 是大数据从业者或者IT从业者的必备技能之一也是成本低廉的方案 所以VMware虚拟机方案是必须要学习的。 &#xff08;1&#xff09;设置网关 打开VMware虚拟机&#xff0c;点击编辑…...

微服务商城-商品微服务

数据表 CREATE TABLE product (id bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 商品id,cateid smallint(6) UNSIGNED NOT NULL DEFAULT 0 COMMENT 类别Id,name varchar(100) NOT NULL DEFAULT COMMENT 商品名称,subtitle varchar(200) NOT NULL DEFAULT COMMENT 商…...

ElasticSearch搜索引擎之倒排索引及其底层算法

文章目录 一、搜索引擎1、什么是搜索引擎?2、搜索引擎的分类3、常用的搜索引擎4、搜索引擎的特点二、倒排索引1、简介2、为什么倒排索引不用B+树1.创建时间长,文件大。2.其次,树深,IO次数可怕。3.索引可能会失效。4.精准度差。三. 倒排索引四、算法1、Term Index的算法2、 …...

GitHub 趋势日报 (2025年06月08日)

&#x1f4ca; 由 TrendForge 系统生成 | &#x1f310; https://trendforge.devlive.org/ &#x1f310; 本日报中的项目描述已自动翻译为中文 &#x1f4c8; 今日获星趋势图 今日获星趋势图 884 cognee 566 dify 414 HumanSystemOptimization 414 omni-tools 321 note-gen …...

MySQL中【正则表达式】用法

MySQL 中正则表达式通过 REGEXP 或 RLIKE 操作符实现&#xff08;两者等价&#xff09;&#xff0c;用于在 WHERE 子句中进行复杂的字符串模式匹配。以下是核心用法和示例&#xff1a; 一、基础语法 SELECT column_name FROM table_name WHERE column_name REGEXP pattern; …...

人工智能(大型语言模型 LLMs)对不同学科的影响以及由此产生的新学习方式

今天是关于AI如何在教学中增强学生的学习体验&#xff0c;我把重要信息标红了。人文学科的价值被低估了 ⬇️ 转型与必要性 人工智能正在深刻地改变教育&#xff0c;这并非炒作&#xff0c;而是已经发生的巨大变革。教育机构和教育者不能忽视它&#xff0c;试图简单地禁止学生使…...