springboot-vue excel上传导出
数据库
device_manage表
字段,id,workshop,device_number,device_name,device_model,warn_time,expired_time
device_warn表
字段,id,warn_time,expired_time
后端
实体类格式
device_manage
@Data
@TableName("device_manage")/*
设备管理
*/
public class DeviceManageEntity {private static final long serialVersionUID = 1L;/*** 主键*/@TableIdprivate Integer id;/*** 车间名称*/private String workshop;/*** 设备编号*/private String deviceNumber;/*** 设备名称*/private String deviceName;/*** 设备型号*/private String deviceModel;/*** 维保预警时间*/@JsonFormat(shape = JsonFormat.Shape.STRING, pattern="yyyy-MM-dd HH:mm:ss")private Date warnTime;/*** 维保到期时间*/@JsonFormat(shape = JsonFormat.Shape.STRING, pattern="yyyy-MM-dd HH:mm:ss")private Date expiredTime;}
device_warn
@Data
@TableName("device_warn")/*保养预警*/
public class DeviceWarnEntity {private static final long serialVersionUID = 1L;/*** 编号*/@TableIdprivate Integer id;/*** 保养到期时间*/@JsonFormat(shape = JsonFormat.Shape.STRING, pattern="yyyy-MM-dd HH:mm:ss")private Date expiredTime;/*** 预警时间*/@JsonFormat(shape = JsonFormat.Shape.STRING, pattern="yyyy-MM-dd HH:mm:ss")private Date warnTime;}
选择导出的字段warnVo
@Data
@ColumnWidth(20)
public class WarnVo {//传输给前端展示//id@ExcelIgnoreprivate Long id;//车间@ExcelProperty("车间名称")private String workshop;//设备编号@ExcelProperty("设备编号")private String deviceNumber;//设备名称@ExcelProperty("设备名称")private String deviceName;//设备型号@ExcelProperty("设备型号")private String deviceModel;//维保到期时间@ExcelProperty("维保到期时间")@DateTimeFormat("yyyy-MM-dd HH:mm:ss")private Date expiredTime;//预警时间@ExcelProperty("预警时间")@DateTimeFormat("yyyy-MM-dd HH:mm:ss")private Date warnTime;
}
controller层
@RestController
@RequestMapping("/dev/warn")
public class exportController {@Autowiredprivate DeviceWarnService iTainWarnService;
//字典类,前端下拉框选项@Autowiredprivate SysDictService sysDictService;@Autowiredprivate DeviceManageService iDeviceService;//文件上传@PostMapping("/upload")@ResponseBodypublic R upload(MultipartFile file) throws IOException {if (file==null){System.out.println("文件为空");}WarnVoListener warnVoListener = new WarnVoListener(sysDictService, iTainWarnService, iDeviceService);
//初始化tipsList<ImportTips> tips = new ArrayList<>();for (WarnVo data : warnVoListener.getDatas()) {tips = warnVoListener.getTips();}if (tips.size() > 0) {return R.error();}EasyExcel.read(file.getInputStream(), WarnVo.class, warnVoListener).sheet().doRead();return R.ok();}//文件导出/*** 文件下载并且失败的时候返回json(默认失败了会返回一个有部分数据的Excel)* 这种方法是将Excel文件的生成过程放在后端进行。前端发起一个请求到后端,后端处理数据并生成Excel文件,然后将文件返回给前端进行下载。* 这种方法的优点是可以将数据处理的压力放在后端,前端只需要处理请求和下载文件的逻辑。* @since 2.1.1,设置响应头*/private void setExcelResponseProp(HttpServletResponse response,String rawFileName) throws UnsupportedEncodingException {response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");response.setCharacterEncoding("utf-8");String fileName = URLEncoder.encode(rawFileName, "UTF-8").replaceAll("\\+", "%20");response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName + ".xlsx");}@GetMapping("/download")public void download(HttpServletResponse response) throws IOException {// 这里注意 有同学反应使用swagger 会导致各种问题,请直接用浏览器或者用postmantry {response.setContentType("application/vnd.ms-excel");response.setCharacterEncoding("utf-8");// 这里URLEncoder.encode可以防止中文乱码 当然和easyexcel没有关系String fileName = URLEncoder.encode("测试", "UTF-8");response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".xlsx");this.setExcelResponseProp(response,"保养预警");List<WarnVo> warnVos = iTainWarnService.listAllWarn();
//得到字典类所有选项List<SysDictEntity> workShopList = sysDictService.maintenanceList(" workshop");for (WarnVo warnVo : warnVos) {for (SysDictEntity sysDictEntity : workShopList) {if (sysDictEntity.getValue().compareTo(warnVo.getWorkshop())==0){warnVo.setWorkshop(sysDictEntity.getName());}}}List<SysDictEntity> deviceModelList = sysDictService.maintenanceList("deviceModel");for (WarnVo warnVo : warnVos) {for (SysDictEntity sysDictEntity : deviceModelList) {if (sysDictEntity.getValue().compareTo(warnVo.getDeviceModel())==0){warnVo.setDeviceModel(sysDictEntity.getName());}}}// 这里需要设置不关闭流EasyExcel.write(response.getOutputStream(), WarnVo.class)// 导出Excel时在此处注册handler.registerWriteHandler(new CustomSheetWriteHandler(sysDictService)).autoCloseStream(Boolean.FALSE).sheet("保养预警").doWrite(warnVos);} catch (Exception e) {// 重置responseresponse.reset();response.setContentType("application/json");response.setCharacterEncoding("utf-8");Map<String, String> map = new HashMap<>();map.put("status", "failure");map.put("message", "下载文件失败" + e.getMessage());response.getWriter().println(JSON.toJSONString(map));}}}
listener
CustomSheetWriteHandler导出
@Service
public class CustomSheetWriteHandler implements SheetWriteHandler {@Autowiredprivate SysDictService sysDictService;public CustomSheetWriteHandler(SysDictService sysDictService) {this.sysDictService = sysDictService;}@Overridepublic void beforeSheetCreate(WriteWorkbookHolder writeWorkbookHolder, WriteSheetHolder writeSheetHolder) {}/*** 想实现Excel引用其他sheet页数据作为单元格下拉选项值,* 需要重写该方法** @param writeWorkbookHolder* @param writeSheetHolder*/@Overridepublic void afterSheetCreate(WriteWorkbookHolder writeWorkbookHolder, WriteSheetHolder writeSheetHolder) {// 构造样例数据,该数据可根据实际需要,换成业务数据// 实际数据可通过构造方法,get、set方法等由外界传入List<String> selectworkshopList = new ArrayList<>();List<SysDictEntity> workshoplist = sysDictService.maintenanceList("workshop");for (SysDictEntity sysDictEntity : workshoplist) {if (sysDictEntity.getSort()!=null){selectworkshopList.add(sysDictEntity.getName());}}List<String> selectmodelList = new ArrayList<>();List<SysDictEntity> modellist = sysDictService.maintenanceList("deviceModel");for (SysDictEntity sysDictEntity : modellist) {if (sysDictEntity.getSort()!=null){selectmodelList.add(sysDictEntity.getName());}}// 构造下拉选项单元格列的位置,以及下拉选项可选参数值的map集合// key:下拉选项要放到哪个单元格,比如A列的单元格那就是0,C列的单元格,那就是2// value:key对应的那个单元格下拉列表里的数据项,比如这里就是下拉选项1..100Map<Integer, List<String>> selectParamMap = new HashMap<>();selectParamMap.put(0, selectworkshopList);selectParamMap.put(3, selectmodelList);// 获取第一个sheet页Sheet sheet = writeSheetHolder.getCachedSheet();// 获取sheet页的数据校验对象DataValidationHelper helper = sheet.getDataValidationHelper();// 获取工作簿对象,用于创建存放下拉数据的字典sheet数据页Workbook workbook = writeWorkbookHolder.getWorkbook();// 迭代索引,用于存放下拉数据的字典sheet数据页命名int index = 1;for (Map.Entry<Integer, List<String>> entry : selectParamMap.entrySet()) {// 设置存放下拉数据的字典sheet,并把这些sheet隐藏掉,这样用户交互更友好String dictSheetName = "dict_hide_sheet" + index;Sheet dictSheet = workbook.createSheet(dictSheetName);// 隐藏字典sheet页workbook.setSheetHidden(index++, true);// 设置下拉列表覆盖的行数,从第一行开始到最后一行,这里注意,Excel行的// 索引是从0开始的,我这边第0行是标题行,第1行开始时数据化,可根据实// 际业务设置真正的数据开始行,如果要设置到最后一行,那么一定注意,// 最后一行的行索引是1048575,千万别写成1048576,不然会导致下拉列表// 失效,出不来CellRangeAddressList infoList = new CellRangeAddressList(1, 1048575, entry.getKey(), entry.getKey());int rowLen = entry.getValue().size();for (int i = 0; i < rowLen; i++) {// 向字典sheet写数据,从第一行开始写,此处可根据自己业务需要,自定// 义从第几行还是写,写的时候注意一下行索引是从0开始的即可dictSheet.createRow(i).createCell(0).setCellValue(entry.getValue().get(i));}// 设置关联数据公式,这个格式跟Excel设置有效性数据的表达式是一样的String refers = dictSheetName + "!$A$1:$A$" + entry.getValue().size();Name name = workbook.createName();name.setNameName(dictSheetName);// 将关联公式和sheet页做关联name.setRefersToFormula(refers);// 将上面设置好的下拉列表字典sheet页和目标sheet关联起来DataValidationConstraint constraint = helper.createFormulaListConstraint(dictSheetName);DataValidation dataValidation = helper.createValidation(constraint, infoList);sheet.addValidationData(dataValidation);}}
}
WarnVoListener导入
@Slf4j
public class WarnVoListener extends AnalysisEventListener<WarnVo> {private static final Logger LOGGER = LoggerFactory.getLogger(WarnVoListener.class);/*** 每隔5条存储数据库,实际使用中可以3000条,然后清理list ,方便内存回收*/private static final int BATCH_COUNT = 5;// List<WarnVo> list = new ArrayList<>();List<DeviceManageEntity> deviceList = new ArrayList<>();List<DeviceWarnEntity> tainWarnList = new ArrayList<>();/*** 假设这个是一个DAO,当然有业务逻辑这个也可以是一个service。当然如果不用存储这个对象没用。*/private SysDictService sysDictService;private DeviceWarnService iTainWarnService;private DeviceManageService iDeviceService;// public WarnVoListener() {
// // 这里是demo,所以随便new一个。实际使用如果到了spring,请使用下面的有参构造函数
// demoDAO = new DemoDAO();
// }/*** 如果使用了spring,请使用这个构造方法。每次创建Listener的时候需要把spring管理的类传进来**/public WarnVoListener(SysDictService sysDictService,DeviceWarnService iTainWarnService,DeviceManageService iDeviceService) {this.sysDictService = sysDictService;this.iTainWarnService = iTainWarnService;this.iDeviceService = iDeviceService;}/*** 返回提示语*/private List<ImportTips> tips = new ArrayList<>();/*** 自定义用于暂时存储data* 可以通过实例获取该值*/private List<WarnVo> datas = new ArrayList<>();/*** 这个每一条数据解析都会来调用** @param data* one row value. Is is same as {@link AnalysisContext#readRowHolder()}* @param context*/@Overridepublic void invoke(WarnVo data, AnalysisContext context) {
// LOGGER.info("解析到一条数据:{}", JSON.toJSONString(data));// 该行数据是否有错误boolean checkRowError = false;LOGGER.info("数据导入,解析第{}行数据:{}" , context.readRowHolder().getRowIndex() , data);List<DeviceManageEntity> devList = iDeviceService.list();for (DeviceManageEntity devices : devList) {if (devices.getDeviceNumber().equals(data.getDeviceNumber())){saveTips(context.readRowHolder().getRowIndex(),"导入文件中设备编号有重复",tips);checkRowError = true;}}//当该行数据没有错误时,数据存储到集合,供批量处理。if(!checkRowError){//device表DeviceManageEntity device = new DeviceManageEntity();
// device.setDeviceModel(data.getDeviceModel());device.setDeviceName(data.getDeviceName());device.setDeviceNumber(data.getDeviceNumber());device.setWarnTime(data.getWarnTime());device.setExpiredTime(data.getExpiredTime());List<SysDictEntity> list = sysDictService.maintenanceList("workshop");for (SysDictEntity sysDictEntity : list) {if (sysDictEntity.getName().compareTo(data.getWorkshop())!=0){device.setWorkshop(sysDictEntity.getValue());}}List<SysDictEntity> modellist = sysDictService.maintenanceList("deviceModel");for (SysDictEntity sysDictEntity : modellist) {if (sysDictEntity.getName().compareTo(data.getDeviceModel())!=0){device.setDeviceModel(sysDictEntity.getValue());}}this.deviceList.add(device);//tain_warn表/* DeviceWarnEntity tainWarn = new DeviceWarnEntity();tainWarn.setExpiredTime(data.getExpiredTime());tainWarn.setWarnTime(data.getWarnTime());this.tainWarnList.add(tainWarn);*/datas.add(data);}// 达到BATCH_COUNT了,需要去存储一次数据库,防止数据几万条数据在内存,容易OOMif (this.deviceList.size() >= BATCH_COUNT) {saveData();// 存储完成清理 listthis.deviceList.clear();}if (this.tainWarnList.size() >= BATCH_COUNT) {saveData();// 存储完成清理 listthis.tainWarnList.clear();}}/*** 所有数据解析完成了 都会来调用** @param context*/@Overridepublic void doAfterAllAnalysed(AnalysisContext context) {// 这里也要保存数据,确保最后遗留的数据也存储到数据库saveData();LOGGER.info("所有数据解析完成!");}/*** 加上存储数据库*/private void saveData() {LOGGER.info("{}条数据,开始存储数据库!", deviceList.size());LOGGER.info("{}条数据,开始存储数据库!", tainWarnList.size());
// demoDAO.save(list);
// iTainWarnService.saveBatch(list);//存入数据库iDeviceService.saveBatch(deviceList);iTainWarnService.saveBatch(tainWarnList);LOGGER.info("存储数据库成功!");}/*** 保存提示信息到集合* @param rowIndex 行数* @param desc 提示信息* @param tips 存入集合*/private void saveTips(Integer rowIndex, String desc, List<ImportTips> tips) {ImportTips tip = new ImportTips();tip.setRowNum(rowIndex);tip.setTips(desc);tips.add(tip);}/*** 返回数据* @return 返回提示集合**/public List<ImportTips> getTips() {return tips;}/*** 返回数据* @return 返回读取的数据集合**/public List<WarnVo> getDatas() {return datas;}
}
service层
device_manage略
device_warn
public interface DeviceWarnService extends IService<DeviceWarnEntity> {List<WarnVo> listAllWarn();
}
service_impl层
@Service("DeviceWarnService")
public class DeviceWarnServiceImpl extends ServiceImpl<DeviceWarnDao, DeviceWarnEntity> implements DeviceWarnService {@Autowiredprivate DeviceWarnDao deviceWarnDao;@Overridepublic List<WarnVo> listAllWarn() {QueryWrapper<WarnVo> qw = new QueryWrapper<>();return this.deviceWarnDao.selectWarn(qw);}
}
Dao层,使用@Select注解写入sql语句获得所有信息
@Mapper
public interface DeviceWarnDao extends BaseMapper<DeviceWarnEntity> {@Select("select w.id,d.workshop,d.device_number,d.device_name,d.device_model,w.warn_time,w.expired_time,w.device_status from device_warn w left join device_manage d on d.id=w.device_id where w.is_deleted = 0")List<WarnVo> selectWarn(@Param(Constants.WRAPPER) QueryWrapper<WarnVo> wrapper);
}
前端
<template><div class="mod-config"><!-- 导入导出 --><el-form :inline="true"><el-form-item><el-button type="primary" icon="el-icon-share" @click="download()" >一键导出</el-button></el-form-item><el-form-item><el-uploadstyle="width: 400px"action="http://localhost:8080/wedu/dev/warn/upload":headers="tokenInfo":on-preview="handlePreview":on-remove="handleRemove":before-remove="beforeRemove"multiple:limit="3":on-exceed="handleExceed":file-list="fileList"><el-button type="primary">点击上传</el-button></el-upload></el-form-item></el-form><el-table:data="dataList"borderv-loading="dataListLoading"@selection-change="selectionChangeHandle"style="width: 100%;"><el-table-columnprop="workshop"header-align="center"align="center"label="车间名称"></el-table-column><el-table-columnprop="deviceNumber"header-align="center"align="center"label="设备编号"></el-table-column><el-table-columnprop="deviceName"header-align="center"align="center"label="设备名称"></el-table-column><el-table-columnprop="deviceModel"header-align="center"align="center"label="设备型号"></el-table-column><el-table-columnprop="expiredTime"header-align="center"align="center"label="维保到期时间"></el-table-column><el-table-columnprop="warnTime"header-align="center"align="center"label="维保预警时间"></el-table-column></template><script>export default {data () {return {tokenInfo: {token: this.$cookie.get("token"),},dataForm: {deviceNumber: ''},// 车间字典项allchejian: [],// 车间筛选workshops: [],bydicts: [],byMap: {},fileUploadBtnText: "点击上传", //上传文件提示文字fileList: [], // 上传文件列表fileUploadVisible:false}},activated () {this.getDataList();this.loadAllChejian("workshop");this.getBydicts("deviceModel");},methods: {fileUpload(){this.fileUploadVisible = true;this.$nextTick(() => {this.$refs.FileUpload.init();});},// 文件列表移除文件时的钩子handleRemove(file, fileList) {console.log(file, fileList);},// 点击文件列表中已上传的文件时的钩子handlePreview(file) {console.log(file);},// 限制上传文件的个数和定义超出限制时的行为handleExceed(files, fileList) {this.$message.warning(`当前限制选择 3 个文件,本次选择了 ${files.length} 个文件,共选择了 ${files.length + fileList.length} 个文件`);},// 文件列表移除文件时之前的钩子beforeRemove(file, fileList) {return this.$confirm(`确定移除 ${file.name}?`);},onUploadExcelError(response) {if (res.code === 500) this.$message.error(res.message);},//文件导出download() {this.$http({url: this.$http.adornUrl("/dev/warn/download"),method: "get",//设置响应类型(重要responseType: "blob",}).then((response) => {// 创建一个url,接收到的二进制数据const url = window.URL.createObjectURL(new Blob([response.data]));// 创建一个a标签,用于触发文件下载const link = document.createElement("a");// a元素的href属性为创建的urllink.href = url;link.setAttribute("download", "保养预警.xlsx");// 将a添加到文档document.body.appendChild(link);// 触发a的点击事件开始下载link.click();});},getWorkshopName(value) {const workshop = this.allchejian.find((item) => item.value === value);return workshop ? workshop.name : "";},getBydicts(code) {this.$http({url: this.$http.adornUrl("/sys/dict/maintenanceList"),method: "get",params: this.$http.adornParams({code: code,}),}).then(({ data }) => {if (data && data.code === 0) {this.bydicts = data.list;this.bydicts.forEach((dict) => {this.$set(this.byMap, dict.value, dict.name);});} else {this.bydicts = [];}});},//加载车间 所需的数据zybloadAllChejian(code) {this.allchejian = [];this.$http({url: this.$http.adornUrl("/sys/dict/maintenanceList"),method: "post",params: this.$http.adornParams({code: code,}),}).then(({ data }) => {if (data && data.code === 0) {this.allchejian = data.list.map((item) => ({name: item.name,value: item.value,}));this.workshop = data.list.map((item) => ({text: item.name,value: item.value,}));} else {}});},// 车间筛选方法 zybfilterHandler(value, row, column) {const property = column["property"];return row[property] === value;}}</script>
最终效果
点击导出
下载的excel表格中车间名称和设备型号有下拉框,对应前端配置的字典类
点击导入
将这个格式的excel导入
在数据库新增一条数据
相关文章:
springboot-vue excel上传导出
数据库 device_manage表 字段,id,workshop,device_number,device_name,device_model,warn_time,expired_time device_warn表 字段,id,warn_time,expired_time 后端 实体类格式 device_manage Data TableName("device_manage"…...
CTF-PWN: ret2libc
plt表与got表是什么? PLT PLT (Procedure Linkage Table) 表在 ELF 文件中的代码段(.text)中,它看起来是这样的: .plt:0x00400530 <__libc_start_mainplt>:jmp QWORD PTR [rip 0x200602] # 0x601608 <__libc_start_maingot.plt>push 0x0jmp 0x4005100…...
SickOs: 1.1靶场学习小记
学习环境 kali攻击机:Get Kali | Kali Linux vulnhub靶场:https://download.vulnhub.com/sickos/sick0s1.1.7z 靶场描述: 这次夺旗赛清晰地模拟了在安全环境下如何对网络实施黑客策略从而入侵网络的过程。这个虚拟机与我在进攻性安全认证专…...
【ArcGIS Pro实操第10期】统计某个shp文件中不同区域内的站点数
统计某个shp文件中不同区域内的站点数 方法 1:使用“空间连接 (Spatial Join)”工具方法 2:使用“点计数 (Point Count)”工具方法 3:通过“选择 (Select by Location)”统计方法 4:通过“Python 脚本 (ArcPy)”实现参考 在 ArcGI…...
JavaScript中类数组对象及其与数组的关系
JavaScript中类数组对象及其与数组的关系 1. 什么是类数组对象? 类数组对象是指那些具有 length 属性且可以通过非负整数索引访问元素的对象。虽然这些对象看起来像数组,但它们并不具备真正数组的所有特性,例如没有继承 Array.prototype 上…...
基础入门-Web应用架构搭建域名源码站库分离MVC模型解析受限对应路径
知识点: 1、基础入门-Web应用-域名上的技术要点 2、基础入门-Web应用-源码上的技术要点 3、基础入门-Web应用-数据上的技术要点 4、基础入门-Web应用-解析上的技术要点 5、基础入门-Web应用-平台上的技术要点 一、演示案例-域名差异-主站&分站&端口站&…...
C#:时间与时间戳的转换
1、将 DateTime 转换为 Unix 时间戳(秒) public static long DateTimeToUnixTimestamp(DateTime dateTime) {// 定义UTC纪元时间DateTime epochStart new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);// 计算从UTC纪元时间到指定时间的总秒数Tim…...
QT的exec函数
在Qt框架中,exec()方法是QDialog类(及其子类)的一个成员函数,用于以模态(modal)方式显示对话框。当exec()被调用时,它会启动一个局部的事件循环,这个循环会阻塞对对话框之外的其他窗…...
Css—实现3D导航栏
一、背景 最近在其他的网页中看到了一个很有趣的3d效果,这个效果就是使用css3中的3D转换实现的,所以今天的内容就是3D的导航栏效果。那么话不多说,直接开始主要内容的讲解。 二、效果展示 三、思路解析 1、首先我们需要将这个导航使用一个大…...
树莓集团:以人工智能为核心,打造数字化生态运营新典范
在当今数字化浪潮席卷全球的背景下,各行各业都在积极探索数字化转型的路径。作为数字产业的领军者,树莓集团凭借其深厚的技术积累和创新理念,在人工智能、大数据、云计算等前沿技术领域不断突破,成功打造了一个以人工智能为核心的…...
2024年首届数证杯 初赛wp
“数证杯”电子数据取证分析大赛致力于成为全国第一大电子数据取证分析大赛,面向所有网络安全从业人员公开征集参赛选手。参赛选手根据所属行业报名参赛赛道,比赛设置冠军、亚军、季军奖。所涉及行业包括能源、金融、通信、取证、安全等企业以及各类司法…...
2017 NHOI小学(C++)
A. 吃西瓜(2017 NHOI小学 1) 问题描述: 炎热的夏天来的可真快,小花猫和编程兔决定去买一个又大又甜的西瓜。可是小花和编程兔是两只非常奇怪的动物,都是偶数的爱好者,它们希望把西瓜切成两半后,每一部分的…...
【一维DP】【三种解法】力扣983. 最低票价
在一个火车旅行很受欢迎的国度,你提前一年计划了一些火车旅行。在接下来的一年里,你要旅行的日子将以一个名为 days 的数组给出。每一项是一个从 1 到 365 的整数。 火车票有 三种不同的销售方式 : 一张 为期一天 的通行证售价为 costs[0] …...
【头歌实训:递归实现斐波那契数列】
头歌实训:递归实现斐波那契数列 文章目录 任务描述相关知识递归相关知识递归举例何时使用递归定义是递归的数据结构是递归的问题的求解方法是递归的 编程要求测试说明源代码: 任务描述 本关任务:递归求解斐波那契数列。 相关知识 为了完成…...
IntelliJ IDEA配置(mac版本)
用惯了eclipse开发java的小伙伴们,初次接触IntelliJ IDEA可能会和我一样,多少有些不适感,在使用过程中总想着eclipse得对应功能。 接下来,我就总结下我日常开发中遇到的常用配置(不包括快捷键,我认为每个人…...
CSAPP Cache Lab(缓存模拟器)
前言 理解高速缓存对 C 程序性能的影响,通过两部分实验达成:编写高速缓存模拟器;优化矩阵转置函数以减少高速缓存未命中次数。Part A一开始根本不知道要做什么,慢慢看官方文档,以及一些博客,和B站视频&…...
【机器学习】机器学习的基本分类-监督学习-逻辑回归-对数似然损失函数(Log-Likelihood Loss Function)
对数似然损失函数(Log-Likelihood Loss Function) 对数似然损失函数是机器学习和统计学中广泛使用的一种损失函数,特别是在分类问题(例如逻辑回归、神经网络)中应用最为广泛。它基于最大似然估计原理,通过…...
51c自动驾驶~合集35
我自己的原文哦~ https://blog.51cto.com/whaosoft/12206500 #纯视觉方案的智驾在大雾天还能用吗? 碰上大雾天气,纯视觉方案是如何识别车辆和障碍物的呢? 如果真的是纯纯的,特头铁的那种纯视觉方案的话。 可以简单粗暴的理解为…...
网络安全体系与网络安全模型
4.1 网络安全体系概述 4.1.1 网络安全体系概述 一般面言,网络安全体系是网络安全保障系统的最高层概念抽象,是由各种网络安全单元按照一定的规则组成的,共同实现网络安全的目标。网络安全体系包括法律法规政策文件、安全策略、组织管理、技术…...
antd table 自定义表头过滤表格内容
注意:该功能只能过滤可一次性返回全部数据的表格,通过接口分页查询的请自主按照需求改动哈~ 实现步骤: 1.在要过滤的列表表头增加过滤图标,点击图标显示浮窗 2.浮窗内显示整列可选选项,通过勾选单选或者全选、搜索框来…...
Elasticsearch实战:从搜索到数据分析的全面应用指南
Elasticsearch(简称 ES)是一个强大的分布式搜索引擎和分析工具,它能够快速处理海量数据,并提供全文检索、结构化搜索、数据分析等功能。在现代系统中,它不仅是搜索的核心组件,也是数据分析的有力工具。 本文…...
BEPUphysicsint定点数3D物理引擎介绍
原文:BEPUphysicsint定点数3D物理引擎介绍 - 哔哩哔哩 帧同步的游戏中如果用物理引擎,为了保证不同设备上的结果一致,需要采用定点数来计算迭代游戏过程中的物理运算。也就是我们通常说的定点数物理引擎(确定性物理引擎)。本系列教程给大家详细的讲解如…...
宠物领养平台构建:SpringBoot技术路线图
摘 要 如今社会上各行各业,都在用属于自己专用的软件来进行工作,互联网发展到这个时候,人们已经发现离不开了互联网。互联网的发展,离不开一些新的技术,而新技术的产生往往是为了解决现有问题而产生的。针对于宠物领养…...
解决Flink读取kafka主题数据无报错无数据打印的重大发现(问题已解决)
亦菲、彦祖们,今天使用idea开发的时候,运行flink程序(读取kafka主题数据)的时候,发现操作台什么数据都没有只有满屏红色日志输出,关键干嘛?一点报错都没有,一开始我觉得应该执行程序…...
python自动化测开面试题汇总(持续更新)
介绍他们测某云,底层是linux可以挂多个磁盘,有现有的接口,用python实现热插拔,查看它的功能,项目目前用到的是python,linux和虚拟云,结合你之前的项目介绍下三者(3min之内) 列表判断是否有重复元素 求1-9的…...
1-1 Gerrit实用指南
注:学习gerrit需要拥有git相关知识,如果没有学习过git请先回顾git相关知识点 黑马程序员git教程 一小时学会git git参考博客 git 实操博客 1.0 定义 Gerrit 是一个基于 Web 的代码审查系统,它使用 Git 作为底层版本控制系统。Gerrit 的主要功…...
docker如何安装redis
第一步 如果未指定redis,则安装的是最新版的 docker pull redis 创建一个目录 mkdir /usr/local/docker/redis 然后直接可以下载redis,这是方式确实不怎么好,应该找在官网上找对应的redis配置文件 wget http://download.redis.io/redis-stab…...
省级新质生产力数据(蔡湘杰版本)2012-2022年
测算方式:参考《当代经济管理》蔡湘杰(2024)老师研究的做法,本文以劳动者、劳动对象和劳动资料为准则层,从新质生产力“量的积累、质的提升、新的拓展”三维目标出发,构建新质生产力综合评价指标体系&#…...
【游资悟道】-作手新一悟道心法
作手新一经典语录节选: 乔帮主传完整版:做股票5年,炼成18式,成为A股低吸大神!从小白到大神,散户炒股的六个过程,不看不知道自己水平 围着主线做,多研究龙头,研究涨停&am…...
Diffusion中的Unet (DIMP)
针对UNet2DConditionModel模型 查看Unet的源码,得知Unet的down,mid,up blocks的类型分别是: down_block_types: Tuple[str] ("CrossAttnDownBlock2D","CrossAttnDownBlock2D","CrossAttnDownBlock2D","DownBlock2…...
做网站要签合同吗/小程序推广引流
题目说明: 据说著名犹太历史学家 Josephus有过以下的故事:在罗马人占领乔塔帕特后,39个犹太人与Josephus及他的朋友躲到一个洞中,39个犹太人决定宁愿死也不要被敌人抓到,于是决定了一个自杀方式,41个人排成…...
专门做尿不湿的网站/常德网站建设公司
Web开发做得多了,总觉得是体力活,于是搞些代码让自己脱离无聊的Coding吧(是脱离“无聊的”Coding,不是脱离无聊的“Coding”)。初级阶段 为每个QueryString写转换的代码,针对不同的类型,进行转换…...
高端网站开发课程sublime/西地那非片能延时多久
如果之间有防火墙的话,还要注意:要使Oracle客户端能正常连接到设置有防火墙的Oracle服务器,单开放一个1521或自定义的监听端口是不够的。昨天晚上为了测试BOM的多层转单层程序,而需要连接到服务器上的Oracle将数据导入。因为服务器…...
爱网恋的男生/重庆网络seo
先说一下什么是Ucenter,顾名思义它是“用户中心”。UCenter是Com服务器enz旗下各个产品之间信息直接传递的一个桥梁,通过UCenter可以无缝整合Com服务器enz系列产品,实现用户的一站式登录以及社区其他数据的交互。Ucenter 通信基本过程如下:1.从用户xxx在某一应用程序…...
做马来西亚生意的网站/网络营销招聘
第9题 1)有三张表分别为会员表(member)销售表(sale)退货表(regoods) (1)会员表有字段memberid(会员id,主键)credits(积分…...
dw创建网站相册/怎么恶意点击对手竞价
QML (Qt Modeling Language) is a user interface markup language. It is a declarative language for designing user interface–centric applications....