使用vue3+element plus 的table自制的穿梭框(支持多列数据)
目录
一、效果图
二、介绍
三、代码区
一、效果图
话不多说,先上图
二、介绍
项目需要:通过穿梭框选择人员信息,可以根据部门、岗位进行筛选,需要显示多列(不光显示姓名,还包括人员的一些基础信息);项目前端用的是vue3+element plus(Transfer 组件 | Element Plus),原来打算使用element的组件 Transfer 穿梭框,发现它只实现简单的单列穿梭,无法满足需求。最后打算自己动手用table来实现:分为左右两个区域,左边查询区+待选数据列表table,右边选中的数据列表,中间两个按钮实现数据的转移。(在看的小伙伴有其他更合适的组件/组件库可以评论区分享)
三、代码区
html
<el-dialog :title="title" :lock-scroll="false" v-model="open" :fullscreen="fullScreen" :close-on-click-modal="false":close-on-press-escape="false" align-center><el-form ref="formRef" :model="form" :rules="rules" label-width="100px"><el-row :gutter="10"><el-col :lg="6"><el-form-item label="生产线" prop="lineCode"><el-select clearable v-model="form.lineCode" placeholder="请选择生产线" filterable@change="formLineSelectChange" style="width: 100%;"><el-option v-for="item in options.mes_line_list" :key="item.id" :label="item.lineName":value="item.lineCode"><span class="fl">{{ item.innerLineCode }}</span><span class="fr" style="color: var(--el-text-color-secondary);">{{ item.lineName }}</span></el-option></el-select></el-form-item></el-col><el-col :lg="4"><el-form-item label="标准工时" prop="standardWorkHours"><el-input-number v-model="form.standardWorkHours" :min="0" :max="24" :precision="1" placeholder="请输入标准工时"style="width: 100%;" /></el-form-item></el-col><el-col :lg="4"><el-form-item label="日期" prop="workDate"><el-date-picker v-model="form.workDate" type="date" placeholder="日期" value-format="YYYY-MM-DD":shortcuts="shortcutsWorkDate" style="width: 100%;"></el-date-picker></el-form-item></el-col><el-col :lg="4"><el-form-item label="班次" prop="workShift"><el-select clearable v-model="form.workShift" placeholder="请选择生产班次" style="width: 100%;"><el-option v-for="item in options.mes_classes_type" :key="item.dictValue" :label="item.dictLabel":value="item.dictValue"></el-option></el-select></el-form-item></el-col><el-col :lg="6"><el-form-item label="备注信息" prop="remark"><el-input v-model="form.remark" placeholder="请输入备注信息" style="width: 100%;" type="textarea" :rows="2" /></el-form-item></el-col></el-row><el-divider content-position="center">报工人员明细</el-divider><!-- 查询条件 --><el-form :model="queryParamsUserNav" label-position="right" inline ref="queryRefUserNav"><el-form-item label="部门" prop="deptId"><el-tree-select v-model="queryParamsUserNav.deptId" :data="deptOptions":props="{ value: 'id', label: 'label', children: 'children' }" value-key="id" placeholder="请选择归属部门"check-strictly :render-after-expand="false" @change="changeDept($event)" filterable /></el-form-item><el-form-item label="岗位" prop="postId"><el-select v-model="queryParamsUserNav.postId" placeholder="请选择岗位" filterable clearable@change="changePost"><el-option v-for="item in postOptions" :key="item.postId" :label="item.postName" :value="item.postId"><span class="fl">{{ item.postCode }}</span><span class="fr" style="color: var(--el-text-color-secondary);">{{ item.postName }}</span></el-option></el-select></el-form-item><el-form-item label="用户" prop="userId"><el-select v-model="queryParamsUserNav.userId" placeholder="请选择用户" filterable clearable><el-option v-for="item in userOptions" :key="item.userId" :label="item.nickName" :value="item.userId"><span class="fl">{{ item.nickName }}</span><span class="fr" style="color: var(--el-text-color-secondary);">{{ item.userName }}</span></el-option></el-select></el-form-item><el-form-item><el-button icon="search" type="primary" @click="handleQueryUserNav">{{ $t('btn.search') }}</el-button><el-button icon="refresh" @click="resetQueryUserNav">{{ $t('btn.reset') }}</el-button></el-form-item></el-form><!-- 自制穿梭框 --><el-row><!-- 左边table --><el-col :lg="10" style="height: 100%;"><div class="table-container"><el-table :data="dataListLeft" v-loading="loadingLeft" ref="table" borderheader-cell-class-name="el-table-header-cell" highlight-current-row@selection-change="handleSelectionChangeLeft" :height="tableHeight - 40"><el-table-column type="selection" width="50" align="center" /><el-table-column type="index" width="60" label="序号" align="center" /><el-table-column prop="deptName" label="部门" align="center" /><el-table-column prop="userName" label="工号" align="center" /><el-table-column prop="nickName" label="姓名" align="center" /><el-table-column prop="postNames" label="岗位" align="center" /></el-table><pagination :total="totalLeft" v-model:page="queryParamsUserNav.pageNum"v-model:limit="queryParamsUserNav.pageSize" @pagination="handleQueryUserNav" /></div></el-col><!-- 向左箭头 --><el-col :lg="1" align="right"style="margin: 0.5%; display: flex; align-items: center; justify-content: center;"><el-button type="primary" icon="arrow-left" @click="handleLeftArrow"></el-button></el-col><!-- 向右箭头 --><el-col :lg="1" align="left"style="margin: 0.5%; display: flex; align-items: center; justify-content: center;"><el-button type="primary" icon="arrow-right" @click="handleRightArrow"></el-button></el-col><!-- 右边table --><el-col :lg="11" style="height: 100%;"><div class="table-container"><el-table :data="dataListRight" v-loading="loadingRight" ref="table" borderheader-cell-class-name="el-table-header-cell" highlight-current-row@selection-change="handleSelectionChangeRight" :height="tableHeight - 40"><el-table-column type="selection" width="50" align="center" /><el-table-column type="index" width="60" label="序号" align="center" /><el-table-column prop="deptName" label="部门" align="center" /><el-table-column prop="userName" label="工号" align="center" /><el-table-column prop="nickName" label="姓名" align="center" /><el-table-column prop="actualWorkHours" label="实际工时/h" align="center" width="150"><template #default="scope"><el-input-number v-model="scope.row.actualWorkHours" :min="0" :max="24" :precision="1"placeholder="实际工时/h" style="width: 100%;" controls-position="right" /></template></el-table-column><el-table-column prop="standardWorkHours" label="标准工时/h" align="center" width="150" /><el-table-column prop="postNames" label="岗位" align="center" /></el-table></div></el-col></el-row></el-form><template #footer><el-button text @click="cancel">{{ $t('btn.cancel') }}</el-button><el-button type="primary" @click="submitForm">{{ $t('btn.submit') }}</el-button></template></el-dialog>
js
<script setup name="meshumanreport">
import {listMesHumanReport, getMesHumanReportList,addMesHumanReport, delMesHumanReport,updateMesHumanReport, updateMesHumanReportDetailPartial, getMesHumanReport,
}from '@/api/dataReport/meshumanreport.js'
import { getMesLineList } from '@/api/factoryManage/mesline.js'
import { treeselect } from '@/api/system/dept'
import { listPostOptionSelectLimit } from '@/api/system/post.js'
import { getUserListByPost } from '@/api/system/user.js'
import dayjs from 'dayjs';
import auth from '@/plugins/auth'const { proxy } = getCurrentInstance()
const ids = ref([])
const loading = ref(false)
const loadingLeft = ref(false)
const loadingRight = ref(false)const queryParamsUserNav = reactive({pageNum: 1,pageSize: 20,sortType: 'asc',deptId: undefined,postId: undefined,userId: undefined,
})const total = ref(0)
const totalLeft = ref(0)
const totalRight = ref(0)
const dataList = ref([])
const dataListLeft = ref([])
const dataListRight = ref([])
const dataListLeftChosed = ref([])
const dataListRightChosed = ref([])
const queryRef = ref()
const queryRefUserNav = ref()const deptOptions = ref([])
const postOptions = ref([])
const userOptions = ref([])
const standardDisabled = ref(true)
const tableHeight = ref(570)var dictParams = [{ dictType: "mes_classes_type" },
]proxy.getDicts(dictParams).then((response) => {response.data.forEach((element) => {state.options[element.dictType] = element.list})
})//当前时间
const now = new Date();// 设置:subtract往前推 add往后
const dateRangeWorkDate = ref([dayjs().subtract(1, 'day').format('YYYY-MM-DD'), dayjs().format('YYYY-MM-DD')])const shortcutsWorkDate = [{text: '今天',value: new Date(),},{text: '昨天',value: () => {const date = new Date()date.setTime(date.getTime() - 3600 * 1000 * 24)return date},},{text: '一周前',value: () => {const date = new Date()date.setTime(date.getTime() - 3600 * 1000 * 24 * 7)return date},},
]//日期范围变化时,触发表单校验(因为el-date-picker 选中的值不会自动通知表单验证状态,所以这里要单独处理)
function handleDateChange() {dataList.value = []// console.log(dateRangeWorkDate.value)// queryParams.dateRangeWorkDate = dateRangeWorkDate.value// // 查询报表数据// getList()
}// 动态表头生成
// const dateRangeWorkDate = ref([])
const dynamicHeaders = computed(() => {console.log(dateRangeWorkDate.value)if (!dateRangeWorkDate.value || dateRangeWorkDate.value.length !== 2) return []const dates = []const start = new Date(dateRangeWorkDate.value[0])const end = new Date(dateRangeWorkDate.value[1])while (start <= end) {dates.push({date: start.toISOString().split('T')[0],shifts: ['白班', '夜班']})start.setDate(start.getDate() + 1)}console.log(dates)return dates
})/**************************************************** form操作 ****************************************************/
const formRef = ref()
const formRefEdit = ref()
const formRefUserNav = ref()
const title = ref('')
const titleUserNav = ref('')
// 操作类型 1、add 2、edit 3、view
const opertype = ref(0)
const open = ref(false)
const openUserNav = ref(false)
const openEditCell = ref(false)
const state = reactive({single: true,multiple: true,form: {},formUserNav: {},formEdit: {},rules: {//产线lineCode: [{ required: true, message: '请选择产线', trigger: 'change' },],//标准工时standardWorkHours: [{ required: true, message: '请输入标准工时', trigger: ['change', 'blur'] },],
},],workShift: [{ required: true, message: '请选择班次', trigger: 'change' },],},rulesQueryReport: {//产线// lineCode: [{ required: true, message: '请选择产线', trigger: 'change' },],//日期dateRangeWorkDate: [{ required: true, message: '请选择日期范围', trigger: 'blur' },],},rulesEdit: {lineName: [{ required: true, message: '请输入产线', trigger: 'blur' },],userName: [{ required: true, message: '请输入人员', trigger: 'blur' },],workDate: [{ required: true, message: '请选择日期', trigger: 'change' },],workShift: [{ required: true, message: '请选择班次', trigger: 'change' },],standardWorkHours: [{ required: true, message: '请输入标准工时', trigger: 'change' },],actualWorkHours: [{ required: true, message: '请输入实际工时', trigger: 'change' },],},options: {// 产线列表mes_line_list: [],// 班次 选项列表 格式 eg:{ dictLabel: '标签', dictValue: '0'}mes_classes_type: [],}
})const { form, formUserNav, formEdit, rules, rulesQueryReport, rulesEdit, options, single, multiple } = toRefs(state)// 添加按钮操作
function handleAdd() {reset();open.value = truetitle.value = '添加人力报工'opertype.value = 1form.value.standardWorkHours = 12//日期班次默认值var hour = dayjs().get('hour')if (hour >= 0 && hour < 8) {form.value.workDate = dayjs().subtract(1, 'day').format('YYYY-MM-DD')}else {form.value.workDate = dayjs().format('YYYY-MM-DD')}if (hour >= 8 && hour < 20) {form.value.workShift = '白班'}else {form.value.workShift = '夜班'}//查询用户下拉列表getUserDropDownList()
}// 添加&修改 表单提交
function submitForm() {// 校验表单proxy.$refs["formRef"].validate((valid) => {if (valid) {// 校验明细表if (dataListRight.value.length == 0) {proxy.$modal.msgError('请先选择人员信息')return}dataListRight.value.forEach(item => {item.workShopName = form.value.workShopNameitem.lineCode = form.value.lineCodeitem.lineName = form.value.lineNameitem.workDate = form.value.workDateitem.workShift = form.value.workShiftitem.userCode = item.userNameitem.userName = item.nickName})// 提交表单console.log(dataListRight.value)form.value.mesHumanReportDetailNav = dataListRight.valueaddMesHumanReport(form.value).then((res) => {console.log(res)if (res.code == 200) {proxy.$modal.msgSuccess("操作成功!")open.value = false//刷新列表getList()} else {// proxy.$modal.msgError("操作失败")}}).catch(() => {proxy.$modal.msgError("操作失败")})}})
}// 关闭dialog
function cancel() {open.value = falsereset()
}// 重置表单
function reset() {form.value = {id: null,workShopId: null,workShopCode: null,workShopName: null,lineId: null,lineCode: null,lineName: null,standardWorkHours: null,startTime: null,endTime: null,remark: null,};proxy.resetForm("formRef")resetQueryUserNav()dataListLeft.value = []dataListLeftChosed.value = []dataListRight.value = []dataListRightChosed.value = []
}/*** 生产线下拉变更* @param {*} value*/
function formLineSelectChange(value) {let line = state.options.mes_line_list.find(item => item.lineCode == value)console.log(line)form.value.lineId = line.idform.value.lineCode = line.lineCodeform.value.lineName = line.lineNameform.value.workShopId = line.workShopIdform.value.workShopCode = line.workShopCodeform.value.workShopName = line.workShopName
}/******************************************** 人力报工-明细子表信息 ***********************************************/
const mesHumanReportDetailList = ref([])
const checkedMesHumanReportDetail = ref([])
const fullScreen = ref(true)
const drawer = ref(false)/** 人力报工-明细序号 */
function rowMesHumanReportDetailIndex({ row, rowIndex }) {row.index = rowIndex + 1;
}/** 复选框选中数据 */
function handleMesHumanReportDetailSelectionChange(selection) {checkedMesHumanReportDetail.value = selection.map(item => item.index)
}//查询用户信息
function handleQueryUserNav() {console.log(queryParamsUserNav)loadingLeft.value = truegetUserListByPost(queryParamsUserNav).then((res) => {console.log(res)const { code, data } = resif (code == 200) {dataListLeft.value = data.resulttotalLeft.value = data.totalNumconsole.log(data.result)//dataListLeft去除掉右边dataListRight的人员dataListLeft.value = dataListLeft.value.filter(item => !dataListRight.value.some(item2 => item2.userId == item.userId))}loadingLeft.value = false}).catch(() => {loadingLeft.value = false})
}//查询用户信息条件清空
function resetQueryUserNav() {queryParamsUserNav.deptId = undefinedqueryParamsUserNav.postId = undefinedqueryParamsUserNav.userId = undefinedqueryParamsUserNav.pageNum = 1queryParamsUserNav.pageSize = 20handleQueryUserNav()
}//部门选择改变
function changeDept(e) {console.log(e)if (e) {queryParamsUserNav.deptId = egetUserDropDownList()}
}//岗位选择改变
function changePost() {getUserDropDownList()
}// 获取人员下拉列表
function getUserDropDownList() {queryParamsUserNav.userId = undefinedvar tmpQueryParams = {deptId: queryParamsUserNav.deptId,postId: queryParamsUserNav.postId,pageNum: 1,pageSize: 99999,}getUserListByPost(tmpQueryParams).then((res) => {console.log(res)const { code, data } = resif (code == 200) {userOptions.value = data.result}})}//箭头向左,取消选中数据
function handleLeftArrow() {if (dataListRightChosed.value.length == 0) {proxy.$modal.msgError('请先勾选要取消选中的人员')} else {dataListRight.value = dataListRight.value.filter(item => !dataListRightChosed.value.some(item2 => item2.userId == item.userId))dataListRightChosed.value = []//左边的数据重新查询handleQueryUserNav()}
}//箭头向右,选中数据
function handleRightArrow() {if (form.value.standardWorkHours) {if (dataListLeftChosed.value.length > 0) {//右边的数据加上左边的选中数据,已经存在的不重复添加dataListRight.value = dataListRight.value.concat(dataListLeftChosed.value.filter(item => !dataListRight.value.some(item2 => item2.userId == item.userId)))console.log(form.value.workDate)dataListRight.value.forEach(item => {item.standardWorkHours = form.value.standardWorkHoursitem.actualWorkHours = form.value.standardWorkHours})dataListLeft.value = dataListLeft.value.filter(item => !dataListLeftChosed.value.some(item2 => item2.userId == item.userId))dataListLeftChosed.value = []} else {proxy.$modal.msgError('请先勾选要添加的人员')}} else {proxy.$modal.msgError('请先设置标准工时')}
}//左侧选择改变
function handleSelectionChangeLeft(selection) {// dataListLeftChosed = selection.map(item => item.userId)dataListLeftChosed.value = selection
}//右侧选择改变
function handleSelectionChangeRight(selection) {dataListRightChosed.value = selection
}/** 查询部门下拉树结构 */
function getDeptTreeselect() {treeselect().then((response) => {deptOptions.value = response.data})
}
function getDropDownList() {// 获取生产线列表getMesLineList().then(res => {console.log(res)const { code, data } = resif (code == 200) {state.options.mes_line_list = data}})// 获取岗位列表listPostOptionSelectLimit().then((res) => {console.log(res)if (res.code == 200) {postOptions.value = res.data}})
}handleQuery()
getDropDownList()
getDeptTreeselect()
</script>
相关文章:
使用vue3+element plus 的table自制的穿梭框(支持多列数据)
目录 一、效果图 二、介绍 三、代码区 一、效果图 话不多说,先上图 二、介绍 项目需要:通过穿梭框选择人员信息,可以根据部门、岗位进行筛选,需要显示多列(不光显示姓名,还包括人员的一些基础信息&…...
学习笔记:IC存储总结(ROM,RAM, EEPROM, Flash, SRAM, DRAM, DDL)
一,概述 半导体存储器是一种可以存储大量二值信息的半导体器件。在电子计算机及一些其他的数字系统的工作过程中,需要对大量的数据进行储存。由于数据处理的数据量和运算速度的要求,因此把存储量和存取速度作为衡量存储器的重要指标。 在电子…...
本地部署pangolin获取谱系,从而达到预测新冠的流行趋势
步骤 1:安装Docker 注:此步骤忽略,可通过Docker官网对于文档进行安装,地址如下 Docker: Accelerated Container Application Developmenthttps://www.docker.com/ 步骤 2:拉取Pangolin镜像 docker pull staphb/pangolin:latest 步…...
【Python】文件File处理详细解释,附示例(文件操作、模式、编码、指针、调试、大文件处理、文件管理等)
文件 File 处理方法 1. 前言2. 文件基础操作2.1 文件打开与关闭2.2 with 语句(上下文管理器)3. 文件模式详解3.1 基础模式3.2 扩展模式4. 文件读写操作4.1 读取内容4.2 写入内容5. 文件指针和随机访问5.1 seek(offset.whence)5.2 二进制模式下的指针操作6. 文件编码处理6.1 指定…...
Windows 10/11 系统下 Git 的详细安装步骤和基础设置指南
以下是 Windows 10/11 系统下 Git 的详细安装步骤和基础设置指南: Windows 10/11 系统下 Git 的详细安装步骤和基础设置指南 一、详细安装步骤1. 下载 Git 安装包2. 运行安装程序1. 双击安装包,按以下选项配置:2. 点击 Install 完成安装。 二…...
RabbitMQ的四种交换机
RabbitMQ交换机 什么是RabbitMQ RabbitMQ 是一个开源的消息代理和队列服务器,用于在分布式系统中存储和转发消息。它基于 AMQP(高级消息队列协议)实现,支持多种消息传递模式,广泛应用于异步通信、应用解耦、负载均衡…...
探秘基带算法:从原理到5G时代的通信变革【一】引言
文章目录 一、引言1.1 研究背景与意义1.2 研究目的与方法1.3 研究内容与创新点 本博客为系列博客,主要讲解各基带算法的原理与应用,包括:viterbi解码、Turbo编解码、Polar编解码、CORDIC算法、CRC校验、FFT/DFT、QAMtiaozhi/解调、QPSK调制/解…...
ES中数据刷新策略refresh
在 Elasticsearch 中,插入数据时的 refresh 参数控制文档在写入后何时对搜索可见,其行为直接影响数据可见性和系统性能。以下是 refresh 参数的三个可选值(true、false、wait_for)的详细说明及适用场景: 1. refreshtr…...
【向量数据库Weaviate】 和Elasticsearch的区别
Weaviate 和 Elasticsearch 是两种不同类型的数据库,设计目标和应用场景有显著差异。以下是它们的核心区别和适用场景的详细对比: 1. 设计目标与核心能力 维度WeaviateElasticsearch核心能力向量数据库 图数据库(语义搜索优先)全…...
【Wireshark 02】抓包过滤方法
一、官方教程 Wireshark 官网文档 : Wireshark User’s Guide 二、显示过滤器 2.1、 “数据包列表”窗格的弹出过滤菜单 例如,源ip地址作为过滤选项,右击源ip->prepare as filter-> 选中 点击选中完,显示过滤器&#…...
【零基础到精通Java合集】第十五集:Map集合框架与泛型
课程标题:Map集合框架与泛型(15分钟) 目标:掌握泛型在Map中的键值类型约束,理解类型安全的键值操作,熟练使用泛型Map解决实际问题 0-1分钟:泛型Map的意义引入 以“字典翻译”类比泛型Map:明确键和值的类型(如英文→中文)。说明泛型Map的作用——确保键值对的类型一…...
三参数水质在线分析仪:从源头保障饮用水安全
【TH-ZS03】饮用水安全是人类健康的重要保障,其质量直接关系到人们的生命健康。随着工业化、城市化的快速发展,水体污染问题日益严峻,饮用水安全面临着前所未有的挑战。为了从源头保障饮用水安全,科学、高效的水质监测手段必不可少…...
Java8-Stream流介绍和使用案例
Java 8 引入了 Stream API,它提供了一种高效且声明式的方式来处理集合数据。Stream 的核心思想是将数据的操作分为中间操作(Intermediate Operations)和终端操作(Terminal Operations),并通过流水线&#x…...
FieldFox 手持射频与微波分析仪
FieldFox 手持射频与微波分析仪 简述 Keysight FieldFox 便携式分析仪可以在非常恶劣的工作环境中,轻松完成从日常维护到深入故障诊断的各项工作。 选择最适合您需求且有强大软件支持的 Keysight FieldFox 配置。 主要特性 特点: FieldFox 分析仪可…...
JQuery学习笔记,点击按钮加载更多的图片
利用点击按钮模拟某京,某宝,滚动页面加载图片的效果,代码: <!DOCTYPE html> <html><head><meta charset"utf-8"><title>Ajax请求</title></head><body><button id…...
swift4-汇编分析枚举内存布局
一、枚举的内存原理 1.1 常规case enum TestEnum { case test1, test2, test3 } var t TestEnum.test1 t .test2 t .test3枚举是常规的case的情况-是采取一个字节来存枚举变量通过拿到枚举的内存地址,看地址里面存的枚举值情况窥探枚举内存存储情况 var t Te…...
Vue 3 整合 WangEditor 富文本编辑器:从基础到高级实践
本文将详细介绍如何在 Vue 3 项目中集成 WangEditor 富文本编辑器,实现图文混排、自定义扩展等高阶功能。 一、为什么选择 WangEditor? 作为国内流行的开源富文本编辑器,WangEditor 具有以下优势: 轻量高效:压缩后仅…...
Docker安装嵌入框架Text Embeddings Inference (TEI)
Docker安装Text Embeddings Inference (TEI) 1 简单介绍 文本嵌入推理(TEI,Text Embeddings Inference )是HuggingFace研发的一个用于部署和服务开源文本嵌入和序列分类模型的工具包。TEI兼容OpenAI的嵌入模型的规范。 # 官网地址 https:/…...
【HeadFirst系列之HeadFirst设计模式】第14天之与设计模式相处:真实世界中的设计模式
与设计模式相处:真实世界中的设计模式 设计模式是软件开发中的经典解决方案,它们帮助我们解决常见的设计问题,并提高代码的可维护性和可扩展性。在《Head First设计模式》一书中,作者通过生动的案例和通俗的语言,深入…...
java后端开发day27--常用API(二)正则表达式爬虫
(以下内容全部来自上述课程) 1.正则表达式(regex) 可以校验字符串是否满足一定的规则,并用来校验数据格式的合法性。 1.作用 校验字符串是否满足规则在一段文本中查找满足要求的内容 2.内容定义 ps:一…...
【UCB CS 61B SP24】Lecture 22 23: Tree and Graph Traversals, DFS, BFS 学习笔记
本文讲解了二叉树的四种遍历方式,以及如何通过前/后序遍历与中序遍历重建出二叉树,接着介绍了新的非线性数据结构:图,详细讲解了图的存储方式与遍历方式,最后使用 Java 基于邻接表的存储方式实现了图与 DFS、BFS 两种遍…...
Redis100道高频面试题
一、Redis基础 Redis是什么?主要应用场景有哪些? Redis 是一个开源的、基于内存的数据结构存储系统,支持多种数据结构(如字符串、哈希、列表、集合等),可以用作数据库、缓存和消息中间件。 主要应用场景&…...
Mac OS Homebrew更换国内镜像源(中科大;阿里;清华)
omebrew官方的源一般下载包之类的会很慢,所以通常我们都是用国内的镜像源来代替,这样会提高我们的效率。Homebrew主要有四个部分组成: brew、homebrew-core 、homebrew-bottles、homebrew-cask。 代码语言:javascript 代码运行次数…...
excel vlookup的精确查询、模糊查询、反向查询、多列查询
目录 入门 精确查询 模糊查询 反向查询 (搭配 if 函数) 多列查询 (搭配 match 函数) 入门 精确查询 需求: 查找 学生编号是008 所在的班级 操作: 在I2单元格输入公式如下,VLOOKUP(H2,B1:E12,4,FALSE), 得出结果 看一下vlookup 公式每一个参数应该怎么写? 语法: vlookup…...
linux的文件系统及文件类型
目录 一、Linux支持的文件系统 二、linux的文件类型 2.1、普通文件 2.2、目录文件 2.3、链接文件 2.4、字符设备文件: 2.5、块设备文件 2.6、套接字文件 2.7、管道文件 三、linux的文件属性 3.1、关于权限部分 四、Linux的文件结构 五、用户主目录 5.1、工作目录…...
MySQL 安装配置(完整教程)
文章目录 一、MySQL 简介二、下载 MySQL三、安装 MySQL四、配置环境变量五、配置 MySQL 5.1 初始化 MySQL5.2 启动 MySQL 服务 六、修改 MySQL 密码七、卸载 MySQL八、结语 一、MySQL 简介 MySQL 是一款广泛使用的开源关系型数据库管理系统(RDBMS)&am…...
C# Unity 唐老狮 No.4 模拟面试题
本文章不作任何商业用途 仅作学习与交流 安利唐老狮与其他老师合作的网站,内有大量免费资源和优质付费资源,我入门就是看唐老师的课程 打好坚实的基础非常非常重要: 全部 - 游习堂 - 唐老狮创立的游戏开发在线学习平台 - Powered By EduSoho 如果你发现了文章内特殊的字体格式,…...
给没有登录认证的web应用添加登录认证(openresty lua实现)
这阵子不是deepseek火么?我也折腾了下本地部署,ollama、vllm、llama.cpp都弄了下,webui也用了几个,发现nextjs-ollama-llm-ui小巧方便,挺适合个人使用的。如果放在网上供多人使用的话,得接入登录认证才好&a…...
R语言绘图:韦恩图
韦恩分析 韦恩分析(Venn Analysis)常用于可视化不同数据集之间的交集和并集。维恩图(Venn diagram),也叫文氏图、温氏图、韦恩图、范氏图,用于显示元素集合重叠区域的关系型图表,通过图形与图形…...
STM32——串口通信 UART
一、基础配置 Universal Asynchronous Receiver Transmitter 异步,串行,全双工 TTL电平 :高电平1 低电平0 帧格式: 起始位1bit 数据位8bit 校验位1bit 终止位1bit NVIC Settings一栏使能接受中断。 之前有设置LCD,…...
【大模型基础_毛玉仁】1.3 基于Transformer 的语言模型
【大模型基础_毛玉仁】1.3 基于Transformer 的语言模型 1.3 基于Transformer 的语言模型1.3.1 Transformer1)注意力层(AttentionLayer)2)全连接前馈层(Fully-connected Feedforwad Layer)3)层正…...
靶场(二)---靶场心得小白分享
开始: 看一下本地IP 21有未授权访问的话,就从21先看起 PORT STATE SERVICE VERSION 20/tcp closed ftp-data 21/tcp open ftp vsftpd 2.0.8 or later | ftp-anon: Anonymous FTP login allowed (FTP code 230) |_Cant get dire…...
大学至今的反思与总结
现在是2025年的3月5日,我大三下学期。 自大学伊始,我便以考研作为自己的目标,有时还会做自己考研上岸头部985,211,offer如潮水般涌来的美梦。 但是我却忽略了一点,即便我早早下定了决心去考研,但并没有早…...
【大模型】Llama 3.2 大语言模型初探:模型权重下载
文章目录 一、简介二、权重下载2.1 方法一:Meta 官网申请下载2.2 方法二:使用 hugging face 下载 一、简介 Llama(Large Language Model Meta AI)是 Meta(原 Facebook)开发的一系列开源大型语言模型。它的目…...
unity学习63,第2个小游戏:用fungus做一个简单对话游戏
目录 1 目标用fungus做一个简单的剧情对话游戏 1.1 先创建一个新的3D项目 1.2 fungus是什么 1.2.1 怎么获得 1.2 在AssetStore里搜索fungus (插件类)--千万别买收费的错的! 1.3 fungus的官网 1.3.1 官网给的3个下载链接,unity的果然已经失效了 …...
笔记:代码随想录算法训练营day36:LeetCode1049. 最后一块石头的重量 II、494. 目标和、474.一和零
学习资料:代码随想录 1049.最后一块石头的重量II 力扣题目链接 思路:如何讲该问题转化为背包问题:还是对半分去碰,对半分去碰碰剩下的就是最小的。然后背包容量就是一半儿,物品重量等于物品价值等于stones[i] 和上…...
Elasticsearch:解锁深度匹配,运用Elasticsearch DSL构建闪电般的高效模糊搜索体验
目录 Elasticsearch查询分类 叶子查询 全文检索查询 match查询 multi_match查询 精确查询 term查询 range查询 复杂查询 bool查询简单应用 bool查询实现排序和分页 bool查询实现高亮 场景分析 问题思考 解决方案 search_after方案(推荐) point in time方案 方案…...
Android实现漂亮的波纹动画
Android实现漂亮的波纹动画 本文章讲述如何使用二维画布canvas和camera、矩阵实现二、三维波纹动画效果(波纹大小变化、画笔透明度变化、画笔粗细变化) 一、UI界面 界面主要分为三部分 第一部分:输入框,根据输入x轴、Y轴、Z轴倾…...
qt实践教学(编写一个代码生成工具)持续更新至完成———
前言: 我的想法是搭建一个和STM32cubemux类似的图形化代码生成工具,可以把我平时用到的代码整合一下全部放入这个软件中,做一个我自己专门的代码生成工具,我初步的想法是在下拉选框中拉取需要配置的功能,然后就弹出对…...
【数据结构】什么是栈||栈的经典应用||分治递归||斐波那契问题和归并算法||递归实现||顺序栈和链栈的区分
文章目录 🥧栈的初步理解:🥧易错:如何判断栈满🥧栈满理解🥧栈的基本运算📚栈操作的伪代码逻辑(顺序和链栈)📕顺序栈运算实现:顺序栈的表示&#x…...
vue3(笔记)4.0 vueRouter.导航守卫.ElementPuls知识点
---vueRouter 创建路由: 完整写法(懒加载): 默认写法与vue2一致: 导入 然后 写成component: LoginPage import { createRouter, createWebHistory } from vue-routerconst router createRouter({history: createWebHistory(import.meta.env.BASE_URL), routes: [{path:/lo…...
[数字图像处理]实验三:直方图增强
目录 一、实验目的 二、实验原理 三、实验内容(附代码) 四、实验结果及分析 五、实验小结 一、实验目的 1.了解图像增强的意义和目的 2.掌握各种图像增强的基本原理和方法 3.使用MATLAB实现图像增强 二、实验原理 图像增强方法从增强的作用域…...
图像分类项目1:基于卷积神经网络的动物图像分类
1、选题背景及动机 在现代社会中,图像分类是计算机视觉领域的一个重要任务。动物图像分类具有广泛的应用,例如生态学研究、动物保护、农业监测等。通过对动物图像进行自动分类,可以帮助人们更好地了解动物种类、数量和分布情况,从…...
并发编程(线程池)面试题及原理
1. 执行原理/核心参数 1.1 核心参数 核心参数 corePoolSize 核心线程数目maximumPooISize 最大线程数目 (核心线程+救急线程的最大数目)keepAliveTime 生存时间- 救急线程的生存时间,生存时间内没有新任务,此线程资…...
初次使用 IDE 搭配 Lombok 注解的配置
前言 在 Java 开发的漫漫征程中,我们总会遇到各种提升效率的工具。Lombok 便是其中一款能让代码编写变得更加简洁高效的神奇库。它通过注解的方式,巧妙地在编译阶段为我们生成那些繁琐的样板代码,比如 getter、setter、构造函数等。然而&…...
云原生时代的技术桥梁
在数字化转型的大潮中,企业面临着数据孤岛、应用间集成复杂、高成本与低效率等问题。这些问题不仅阻碍了企业内部信息的流通和资源的共享,也影响了企业对外部市场变化的响应速度。当前,这一转型过程从IT角度来看,已然迈入云原生时…...
2024四川大学计算机考研复试上机真题
2024四川大学计算机考研复试上机真题 2024四川大学计算机考研复试机试真题 历年四川大学计算机考研复试机试真题 在线评测:https://app2098.acapp.acwing.com.cn/ 分数求和 题目描述 有一分数序列: 2/1 3/2 5/3 8/5 13/8 21/13… 求出这个数列的前 …...
【GPU使用】如何在物理机和Docker中指定GPU进行推理和训练
我的机器上有4张H100卡,我现在只想用某一张卡跑程序,该如何设置。 代码里面设置 import os # 记住要写在impot torch前 os.environ[CUDA_VISIBLE_DEVICES] "0, 1"命令行设置 export CUDA_VISIBLE_DEVICES0,2 # Linux 环境 python test.py …...
汽车免拆诊断案例 | 2023款丰田雷凌汽油版车行驶中偶尔出现通信故障
故障现象 一辆2023款丰田雷凌汽油版车,搭载1.5 L发动机,累计行驶里程约为4700 km。车主反映,行驶中偶尔组合仪表上的发动机转速信号丢失,转向变重,且有“闯车”感,同时车辆故障警报蜂鸣器鸣响。 故障诊断…...
千里科技亮相吉利AI智能科技发布会,共启“AI+车”新纪元
今天,在三亚举行的吉利AI智能科技发布会上,千里科技董事长印奇发表了主题为《从“车AI”到“AI车”》的演讲。印奇重点分享了对于“AI车”未来趋势的判断,并重点介绍了在吉利AI科技生态体系下,围绕智驾、智舱等领域的创新合作。基…...