【业务功能篇55】Springboot+easyPOI 导入导出
Apache POI是Apache软件基金会的开源项目,POI提供API给Java程序对Microsoft Office格式档案读和写的功能。
Apache POI 代码实现复杂,学习成本较高。
Easypoi 功能如同名字easy,主打的功能就是容易,让一个没见接触过poi的人员 就可以方便的写出Excel导出,Excel模板导出,Excel导入,Word模板导出,通过简单的注解和模板 语言(熟悉的表达式语法),完成以前复杂的写法
EasyPOI官网:EasyPoi教程_V1.0
环境搭建
1)搭建springboot项目
2)导入依赖
<!-- 引入easyPOI --><dependency><groupId>cn.afterturn</groupId><artifactId>easypoi-spring-boot-starter</artifactId><version>4.2.0</version></dependency>
EasyPOI相关注解
easypoi 起因就是Excel的导入导出,最初的模板是实体和Excel的对应,model--row,filed--col 这样利用注解我们可以和容易做到excel到导入导出 经过一段时间发展,现在注解有5个类分别是
- @Excel 作用到filed上面,是对Excel一列的一个描述
- @ExcelCollection 表示一个集合,主要针对一对多的导出,比如一个老师对应多个科目,科目就可以用集合表示
- @ExcelEntity 表示一个继续深入导出的实体,但他没有太多的实际意义,只是告诉系统这个对象里面同样有导出的字段
- @ExcelIgnore 和名字一样表示这个字段被忽略跳过这个导导出
- @ExcelTarget 这个是作用于最外层的对象,描述这个对象的id,以便支持一个对象可以针对不同导出做出不同处理
@ExcelTarget
1.说明
- 用在实体类上标识是一个可以通过EasyPOI导入导出的实体类
- 相关属性:
value: [String][定义id唯一标识,不能重复] `常用`
height: [Double][定义单元格高度]
fontSize:[short ][定义单元格字体大小]
2.使用
@ExcelTarget("users")
public class User implements Serializable {//..... 省略属性 相关GET,SET方法
}
@Excel
# 1.说明
- 用在filed(属性)上面,是对Excel一列的一个描述
- 常用属性:
name : [String][生成Excel表格中列名]
needMerge: [boolean][是否需要纵向合并单元格(用于含有list中,单个的单元格,合并list创建的多个row)]
orderNum : [String][指定生成Excel中列的顺序,按照数字自然顺序排序]
savePath : [String][指定导入Excel中图片的保存路径]
type : [String][导出类型 1 是文本 2 是图片,3 是函数,10 是数字 默认是文本]
width : [Double][指定导出Excel时列的宽度]
isImportField: [boolean][是否是导入字段,如果没有说明是错误的Excel]
exportFormat: [String][导出Excel的时间格式]
importFormat: [String][导入Excel的时间格式]
format : [String][相当于同时设置了exportFormat和importFormat]
imageType: [int ][导出类型 1 从file读取 2 是从数据库中读取 默认是文件 同样导入也是一样的]
suffix : [String][文字后缀,如% 90 变成90%]
2.使用
public class User implements Serializable {@Excel(name="编号",orderNum="1",replace = {"xxx_1","nnn_2"})private String id;@Excel(name="姓名",orderNum="2")private String name;@Excel(name="年龄",orderNum="4",suffix = " $")private Integer age;@Excel(name="生日",orderNum = "3",width = 20.0,exportFormat = "yyyy年MM月dd日")private Date bir;//...省略GET、SET方法
}
@ExcelEntity
1.说明
- 标记是不是导出excel 标记为实体类,一遍是一个内部属性类,标记是否继续穿透
- 常用属性:
name: [String][定义唯一标识]
2.使用
@ExcelTarget("users")
public class User implements Serializable {
//... 省略GET SET和其他属性@ExcelEntity(name="身份信息")private Card card;
}@ExcelTarget("card")
public class Card implements Serializable {@Excel(name="身份证号",orderNum = "6")private String id;@Excel(name="家庭住址",orderNum = "7")private String address;
}
@ExcelCollection
1.说明
- 一对多的集合注解,用以标记集合是否被数据以及集合的整体排序
- 常用属性:
name: [String][定义集合列名]
orderNum:[int][用来指定导出excel集合内列的顺序]
type: [Class\<?>][用来指定导出是创建对象类型]
2.使用
@ExcelTarget("users")
public class User implements Serializable { //....省略GET SET其他属性
@ExcelCollection(name="订单",orderNum = "5")private List<Order> orders;
}@ExcelTarget("orders")
public class Order implements Serializable {
//....省略GET SET方法@Excel(name = "订单编号")private String id;@Excel(name = "订单名称")private String name;
}
@ExcelIgnore
.说明
- 用在属性上,导出Excel时忽略这个属性
导出Excel
导出基本数据
注意:导出Excel的对象必须实现对象序列化接口
1)定义对象
@Data
@ExcelTarget("users")
public class User implements Serializable {@ExcelIgnore@Excel(name="编号",orderNum="1")private String id;@Excel(name="姓名",orderNum="2")private String name;@Excel(name="年龄",orderNum="3",suffix = " &")private Integer age;@Excel(name="生日",orderNum="4",width = 35.0,format = "yyyy-MM-dd HH:mm:ss")private Date birthday;@Excel(name ="状态" ,orderNum="5",replace = {"激活_1","未激活_0"})private String status;
}
2)定义测试数据
public List<User> getUsers(){List<User> users = new ArrayList<>();for (int i = 0; i < 10; i++) {User user = new User();user.setId(String.valueOf(i));user.setName("向阳");user.setAge(16+i);user.setBirthday(new Date());user.setStatus(String.valueOf(i%2));users.add(user);}return users;}
3)导出Excel
@Testpublic void testExport() throws Exception {//1.配置对象 2.导出类型 3.导出数据集合Workbook workbook = ExcelExportUtil.exportExcel(new ExportParams("用户列表", "测试"), User.class, getUsers());FileOutputStream outputStream = new FileOutputStream("C:\\Users\\86187\\Desktop\\user.xls");workbook.write(outputStream);outputStream.close();workbook.close();}
4)查看Excel
导出List集合
1)说明
- 往往有时候导出的对象中含有数组或者集合,需要导出这样的数据可以直接使用@Excel进行导出
2)使用
@Data
@ExcelTarget("users")
public class User implements Serializable {@Excel(name = "爱好",width=20.0,orderNum = "6")private List<String> hobby;
}
3) 改换格式
// @Excel(name = "爱好",width=20.0,orderNum = "6")@ExcelIgnoreprivate List<String> hobby;@Excel(name = "爱好",width=20.0,orderNum = "6")private String hobbystr;//自定义格式public String getHobbystr() {StringBuilder sb = new StringBuilder();this.hobby.forEach(s -> sb.append(s).append("、") );return sb.toString();}
导出对象中含有的对象
- 导出对象中含有对象的Excel
@Data
@ExcelTarget("users")
public class User implements Serializable {//定义对象@ExcelEntity(name="card")private Card card;
}@ExcelTarget("card")
public class Card implements Serializable {@Excel(name="身份证号",orderNum = "6")private String id;@Excel(name="家庭住址",orderNum = "7")private String address;
}
- 为导出对象赋值
public List<User> getUsers(){List<User> users = new ArrayList<>();for (int i = 0; i < 10; i++) {User user = new User();user.setId(String.valueOf(i));user.setName("向阳");user.setAge(16+i);user.setBirthday(new Date());user.setStatus(String.valueOf(i%2));user.setHobby(Arrays.asList("抽烟","喝酒","烫头"));user.setCard(new Card("11000103422323212342","北京市朝阳区"));users.add(user);}return users;
}
- 导出Excel
//1.配置对象 2.导出类型 3.导出数据集合
Workbook workbook = ExcelExportUtil.exportExcel(new ExportParams("用户列表", "测试"), User.class, getUsers());
FileOutputStream outputStream = new FileOutputStream("C:\\Users\\86187\\Desktop\\user.xls");
workbook.write(outputStream);
outputStream.close();
workbook.close();
导出图片
- 往往随着业务不断变化,可能需要在导出excel时将图片信息也一并导出,如商品图标,用户头像信息等数据,这个时候easypoi该如何处理呢?
@ExcelTarget("users")
public class User implements Serializable {@Excel(name = "头像信息",type = 2,orderNum = "0",width = 12,height = 12)private String photo;//定义头像 直接写指定图片路径
}
准备图片放入指定路径中,并在测试数据中进行赋值
public List<User> getUsers(){List<User> users = new ArrayList<>();for (int i = 0; i < 10; i++) {User user = new User();user.setId(String.valueOf(i));user.setName("向阳");user.setAge(16+i);user.setBirthday(new Date());user.setStatus(String.valueOf(i%2));user.setHobby(Arrays.asList("抽烟","喝酒","烫头"));user.setCard(new Card("11000103422323212342","北京市朝阳区"));user.setPhoto("C:\\Users\\86187\\Desktop\\桌面.png");users.add(user);}return users;
}
导出Excel查看结果
导入Excel
导入基本数据
1) 准备导入的目标Excel
2) 定义导出数据基本对象
@Data
@ExcelTarget("emps")
public class Emp implements Serializable {@Excel(name="编号")private String id;@Excel(name="姓名")private String name;@Excel(name="年龄")private Integer age;@Excel(name="生日",format = "yyyy-MM-dd HH:mm:ss")private Date bir;@Excel(name="状态",replace = {"激活_1","未激活_0"})private String status;@Excel(name="头像",type = 2,savePath = "I:\\resources\\static")private String photo;
}
3) 导入excel中数据
@Testpublic void testImportExcel()throws Exception{ImportParams params = new ImportParams();params.setTitleRows(1); //标题列占几行params.setHeadRows(1); //列名占几行params.setNeedSave(true);params.setSaveUrl("I:\\msb_hejiayun\\easypoi_boot\\src\\main\\resources\\static");List<Emp> list = ExcelImportUtil.importExcel(new FileInputStream("C:\\Users\\86187\\Desktop\\emp.xls"), Emp.class, params);list.forEach(System.out::println);}
多Sheet页导入导出
- 读取指定的sheet
比如要读取上传得第二个sheet 那么需要把startSheetIndex = 1 就可以了- 读取几个sheet
比如读取前2个sheet,那么 sheetNum=2 就可以了- 读取第二个到第五个sheet
设置 startSheetIndex = 1 然后sheetNum = 4- 读取全部的sheet
sheetNum 设置大点就可以了- 判断一个Excel是不是合法的Excel
importFields 设置下值,就是表示表头必须至少包含的字段,如果缺一个就是不合法的excel,不导入
准备表格,创建对应实体
@Data
@ExcelTarget("loginUser")
public class LoginUser implements Serializable {@Excel(name = "用户ID",orderNum = "1")private String id;@Excel(name = "昵称",orderNum = "2")private String nickname;@Excel(name = "密码",orderNum = "3")private String password;@Excel(name="注册时间",orderNum="4",format = "yyyy-MM-dd HH:mm:ss")private Date createTime;@Excel(name ="状态" ,orderNum="5",replace = {"VIP_1","普通用户_0"})private String status;}
@Data
@ExcelTarget("loginUrl")
public class LoginUrl implements Serializable {@Excel(name = "用户ID",orderNum = "1")private String userId;@Excel(name = "请求类型",orderNum = "2")private String type;@Excel(name = "访问地址",orderNum = "3")private String url;
}
多sheet导入方法
/*** 功能描述:根据接收的Excel文件来导入多个sheet,根据索引可返回一个集合* @param filePath 导入文件路径* @param sheetIndex 导入sheet索引* @param titleRows 表标题的行数* @param headerRows 表头行数* @param pojoClass Excel实体类* @return*/public static <T> List<T> importMultiSheet(String filePath,int sheetIndex,Integer titleRows, Integer headerRows, Class<T> pojoClass) {// 根据file得到Workbook,主要是要根据这个对象获取,传过来的excel有几个sheet页ImportParams params = new ImportParams();// 第几个sheet页params.setStartSheetIndex(sheetIndex);params.setTitleRows(titleRows);params.setHeadRows(headerRows);//是否保存本次上传的excelparams.setNeedSave(false);//表示表头必须包含的字段,不包含 就报错.params.setImportFields(new String[]{"用户ID"});List<T> list = null;try {list = ExcelImportUtil.importExcel(new FileInputStream(filePath), pojoClass, params);} catch (Exception e) {e.printStackTrace();}return list;}
//测试多sheet导入@Testpublic void testImportMultiSheet() throws Exception {String excelPath = "C:\\Users\\86187\\Desktop\\login.xls";List<LoginUser> loginUserList = this.importMultiSheet(excelPath, 0, 1, 1, LoginUser.class);loginUserList.forEach(System.out::println);List<LoginUrl> loginUrlList = this.importMultiSheet(excelPath, 1, 1, 1, LoginUrl.class);loginUrlList.forEach(System.out::println);}
多sheet导出方法
public void exportMultiSheet(Object... objects) throws Exception {//创建参数对象,用于设定Excel的sheet页内容等信息ExportParams loginUserExportParams = new ExportParams();//设置sheet的名称loginUserExportParams.setSheetName("登录用户");loginUserExportParams.setTitle("登录用户列表");//使用map创建sheet1HashMap<String, Object> sheet1Map = new HashMap<>();//设置titlesheet1Map.put("title",loginUserExportParams);//设置导出的实体类型sheet1Map.put("entity",LoginUser.class);//sheet中要填充的数据sheet1Map.put("data",objects[0]);///==================================//创建参数对象,用于设定Excel的sheet页内容等信息ExportParams loginUrlExportParams = new ExportParams();//设置sheet的名称loginUrlExportParams.setSheetName("URL路径");loginUrlExportParams.setTitle("URL路径");//使用map创建sheet2HashMap<String, Object> sheet2Map = new HashMap<>();//设置titlesheet2Map.put("title",loginUrlExportParams);//设置导出的实体类型sheet2Map.put("entity",LoginUrl.class);//sheet中要填充的数据sheet2Map.put("data",objects[1]);//将sheet1和sheet2 进行包装List<Map<String,Object>> sheetList = new ArrayList<>();sheetList.add(sheet1Map);sheetList.add(sheet2Map);//执行方法Workbook workbook = ExcelExportUtil.exportExcel(sheetList, ExcelType.HSSF);FileOutputStream outputStream =new FileOutputStream("C:\\Users\\86187\\Desktop\\exportLogin.xls");workbook.write(outputStream);outputStream.close();workbook.close();}
//测试多sheet导出@Testpublic void testExportMultiSheet() throws Exception {List<LoginUser> sheet1 = new ArrayList<>();sheet1.add(new LoginUser("1001", "向阳", "123456", new Date(), "0"));sheet1.add(new LoginUser("1002", "文渊", "123456", new Date(), "1"));sheet1.add(new LoginUser("1003", "小李", "123456", new Date(), "0"));List<LoginUrl> sheet2 = new ArrayList<>();sheet2.add(new LoginUrl("1001", "get", "http://127.0.0.1:8080"));sheet2.add(new LoginUrl("1001", "post", "http://127.0.0.1:8080/logingout"));exportMultiSheet(sheet1,sheet2);}
集成web实现导入导出
前端代码
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head><meta charset="UTF-8"><title>导入excel的主页面</title><link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@3.3.7/dist/css/bootstrap.min.css" integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous">
</head>
<body>
<div class="container-fluid"><div class="row"><div class="col-md-12"><h1>选择Excel文件导入到数据中</h1><form th:action="@{/course/importExcel}" method="post" enctype="multipart/form-data" class="form-inline"><div class="form-group"><input class="form-control" type="file" name="excelFile"><input type="submit" class="btn btn-danger" value="导入数据"></div></form></div><div class="col-md-12"><h1>显示导入数据列表</h1><table class="table table-bordered" ><tr><th>ID编号</th><th>订单编号</th><th>课程名称</th><th>课程简介</th><th>课程价格</th></tr><tr th:each="course : ${courses}"><td th:text="${course.cid}"></td><td th:text="${course.orderno}"></td><td th:text="${course.cname}"></td><td th:text="${course.brief}"></td><td th:text="${course.price}"></td></tr></table><hr><a th:href="@{/course/exportExcel}" class="btn btn-info" >导出excel</a></div></div>
</div>
</body>
</html>
Controller层
@Controller
@RequestMapping("/course")
public class CourseController {@Autowiredprivate CourseService courseService;@RequestMapping("/findAll")public String findAll(Model model){List<Course> courses = courseService.findAll();System.out.println(courses);model.addAttribute("courses",courses);return "index";}//导入Excel@RequestMapping("/importExcel")public String importExcel(MultipartFile excelFile) throws Exception {ImportParams params = new ImportParams();params.setTitleRows(1); //设置1级标题行为一行params.setHeadRows(1); //设置header标题行为一行List<Course> courseList = ExcelImportUtil.importExcel(excelFile.getInputStream(), Course.class, params);courseService.save(courseList);return "redirect:/course/findAll";}//导出Excel@RequestMapping("/exportExcel")public void exportExcel(HttpServletResponse response)throws Exception{//查询数据库的所有数据List<Course> courseList = courseService.findAll();//生成ExcelWorkbook workbook = ExcelExportUtil.exportExcel(new ExportParams("课程信息列表", "课程信息"),Course.class, courseList);response.setHeader("content-disposition","attachment;fileName="+ URLEncoder.encode("课程信息列表.xls","UTF-8"));ServletOutputStream outputStream = response.getOutputStream();workbook.write(outputStream);outputStream.close();workbook.close();}}
Service层
public interface CourseService {//查询所有List<Course> findAll();//插入记录void save(List<Course> courses);
}@Service
public class CourseServiceImpl implements CourseService {@Autowiredprivate CourseDao courseDao;@Overridepublic List<Course> findAll() {return courseDao.findAll();}@Overridepublic void save(List<Course> courses) {courses.forEach(course -> {course.setCid(null); //自动生成ID 不使用Excel中的编号courseDao.save(course);});}
}
dao层
@Mapper
public interface CourseDao {//查询所有List<Course> findAll();//插入记录void save(Course course);
}
XML
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.mashibing.mapper.CourseDao"><!--查询所有--><select id="findAll" resultType="Course">SELECT cid,orderno,cname,brief,price FROM course;</select><!-- 插入记录 --><insert id="save" parameterType="Course" >INSERT INTO course VALUES (#{cid},#{orderno},#{cname},#{brief},#{price})</insert>
</mapper>
相关文章:

【业务功能篇55】Springboot+easyPOI 导入导出
Apache POI是Apache软件基金会的开源项目,POI提供API给Java程序对Microsoft Office格式档案读和写的功能。 Apache POI 代码实现复杂,学习成本较高。 Easypoi 功能如同名字easy,主打的功能就是容易,让一个没见接触过poi的人员 就可以方便的写出Excel导出…...

对顶堆算法
对顶堆可以动态维护一个序列上的第k大的数,由一个大根堆和一个小根堆组成, 小根堆维护前k大的数(包含第k个)大根堆维护比第k个数小的数 [CSP-J2020] 直播获奖 题目描述 NOI2130 即将举行。为了增加观赏性,CCF 决定逐一评出每个选手的成绩&a…...

node.js的优点
提示:node.js的优点 文章目录 一、什么是node.js二、node.js的特性 一、什么是node.js 提示:什么是node.js? Node.js发布于2009年5月,由Ryan Dahl开发,是一个基于ChromeV8引擎的JavaScript运行环境,使用了一个事件驱…...
golang编译跨平台
golang可以在windows上编译出linux、MacOS等系统上的程序。 go编译器windows下可变翼linux程序,例如,GOARCHamd64 和 GOOSlinux 可以用于编译 64 位的 Linux 平台上的可执行文件。: set GOARCHamd64 set GOOSlinux go build main.go通过设置…...

关于Spring的bean的相关注解以及其简单使用方法
一、前置工作 第一步:创建一个maven项目 第二步:在resource中创建一个名字叫做spring-config.xml的文件,并把以下代码复制粘贴 <?xml version"1.0" encoding"UTF-8"?> <beans xmlns"http://www.sprin…...

【计算机视觉】BLIP:源代码示例demo(含源代码)
文章目录 一、Image Captioning二、VQA三、Feature Extraction四、Image-Text Matching 一、Image Captioning 首先配置代码: import sys if google.colab in sys.modules:print(Running in Colab.)!pip3 install transformers4.15.0 timm0.4.12 fairscale0.4.4!g…...

TWILIGHT靶场详解
TWILIGHT靶场详解 下载地址:https://download.vulnhub.com/sunset/twilight.7z 这是一个比较简单的靶场,拿到IP后我们扫描发现开启了超级多的端口 其实这些端口一点用都没有,在我的方法中 但是也有不同的方法可以拿权限,就需要…...
【案例】--GPT衍生应用案例
目录 一、前言二、GPT实现智能问答架构2.1、基本的GPT实现智能问答架构2.2、可应用的GPT实现智能问答架构1、语义转换2、相似度关键字矩阵3、ES中搜索相似度关键字矩阵三、后续一、前言 GPT,全称Generative Pre-trained Transformer ,中文名可译作生成式预训练Transformer。…...

Sip网络音频对讲广播模块, sip网络寻呼话筒音频模块
Sip网络音频对讲广播模块, sip网络寻呼话筒音频模块 一、模块介绍 SV-2101VP和 SV-2103VP网络音频对讲广播模块 是一款通用的独立SIP音频功能模块,可以轻松地嵌入到OEM产品中。该模块对来自网络的SIP协议及RTP音频流进行编解码。 该模块支持多种网络协议…...
leetcode1219. 黄金矿工(java)
黄金矿工 leetcode1219. 黄金矿工题目描述回溯算法代码 回溯算法 leetcode1219. 黄金矿工 难度: 中等 eetcode 1219 黄金矿工 题目描述 你要开发一座金矿,地质勘测学家已经探明了这座金矿中的资源分布,并用大小为 m * n 的网格 grid 进行了标注。每个单元…...
Svelte框架入门
关键词 前端框架、编译器、响应式、模板 介绍 Svelte /svelt/ adj. 苗条的;线条清晰的;和蔼的 Svelte是一个前端组件框架,就像它的英文名字一样,Svelte的目标是打造一个更高性能的响应性前端框架。 Svelte类似于React和Vue框架&am…...

在linux中进行arm交叉编译体验tiny6410裸机程序开发流程
在某鱼上找了一个友善之臂的Tiny6410开发板用来体验一下嵌入式开发。这次先体验一下裸机程序的开发流程,由于这个开发板比较老旧了,官方文档有很多过期的内容,所以记录一下整个过程。 1. 交叉编译器安装 按照光盘A中的文档《04- Tiny6410 L…...

SpringBoot实战(二十三)集成 SkyWalking
目录 一、简介二、拉取镜像并部署1.拉取镜像2.运行skywalking-oap容器3.运行skywalking-ui容器4.访问页面 三、下载解压 agent1.下载2.解压 四、创建 skywalking-demo 项目1.Maven依赖2.application.yml3.DemoController.java 五、构建启动脚本1.startup.bat2.执行启动脚本3.发…...

深度学习实践——卷积神经网络实践:裂缝识别
深度学习实践——卷积神经网络实践:裂缝识别 系列实验 深度学习实践——卷积神经网络实践:裂缝识别 深度学习实践——循环神经网络实践 深度学习实践——模型部署优化实践 深度学习实践——模型推理优化练习 深度学习实践——卷积神经网络实践ÿ…...

linux | vscode | makefile | c++编译和调试
简单介绍环境: vscode 、centos、 gcc、g、makefile 简单来说就是,写好项目然后再自己写makefile脚本实现编译。所以看这篇博客的用户需要了解gcc编译的一些常用命令以及makefile语法。在网上看了很多教程,以及官网也看了很多次,最…...

Spring | Bean 作用域和生命周期
一、通过一个案例来看 Bean 作用域的问题 Spring 是用来读取和存储 Bean,因此在 Spring 中 Bean 是最核心的操作资源,所以接下来我们深入学习⼀下 Bean 对象 假设现在有⼀个公共的 Bean,提供给 A 用户和 B 用户使用,然而在使用的…...
培训(c++题解)
题目描述 某培训机构的学员有如下信息: 姓名(字符串)年龄(周岁,整数)去年 NOIP 成绩(整数,且保证是 5 的倍数) 经过为期一年的培训,所有同学的成绩都有所提…...

ansible-playbook编写 lnmp 剧本
ansible-playbook编写 lnmp 剧本 vim /opt/lnmp/lnmp.yaml执行剧本 ansible-playbook lnmp.yaml...

需求太多处理不过来?MoSCoW模型帮你
一、MoSCoW模型是什么 MoSCoW模型 是在项目管理、软件开发中使用的一种排序优先级的方法,以便开发人员、产品经理、客户对每个需求交付的重要性达成共识。 MoSCoW是一个首字母缩略词,代表: M(Must have):…...

Vue 3:玩一下web前端技术(六)
前言 本章内容为VUE请求后端技术与相关技术讨论。 上一篇文章地址: Vue 3:玩一下web前端技术(五)_Lion King的博客-CSDN博客 下一篇文章地址: Vue 3:玩一下web前端技术(七)_Lio…...

Opencv中的addweighted函数
一.addweighted函数作用 addweighted()是OpenCV库中用于图像处理的函数,主要功能是将两个输入图像(尺寸和类型相同)按照指定的权重进行加权叠加(图像融合),并添加一个标量值&#x…...
测试markdown--肇兴
day1: 1、去程:7:04 --11:32高铁 高铁右转上售票大厅2楼,穿过候车厅下一楼,上大巴车 ¥10/人 **2、到达:**12点多到达寨子,买门票,美团/抖音:¥78人 3、中饭&a…...

多模态大语言模型arxiv论文略读(108)
CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文标题:CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文作者:Sayna Ebrahimi, Sercan O. Arik, Tejas Nama, Tomas Pfister ➡️ 研究机构: Google Cloud AI Re…...

【分享】推荐一些办公小工具
1、PDF 在线转换 https://smallpdf.com/cn/pdf-tools 推荐理由:大部分的转换软件需要收费,要么功能不齐全,而开会员又用不了几次浪费钱,借用别人的又不安全。 这个网站它不需要登录或下载安装。而且提供的免费功能就能满足日常…...

[大语言模型]在个人电脑上部署ollama 并进行管理,最后配置AI程序开发助手.
ollama官网: 下载 https://ollama.com/ 安装 查看可以使用的模型 https://ollama.com/search 例如 https://ollama.com/library/deepseek-r1/tags # deepseek-r1:7bollama pull deepseek-r1:7b改token数量为409622 16384 ollama命令说明 ollama serve #:…...

【UE5 C++】通过文件对话框获取选择文件的路径
目录 效果 步骤 源码 效果 步骤 1. 在“xxx.Build.cs”中添加需要使用的模块 ,这里主要使用“DesktopPlatform”模块 2. 添加后闭UE编辑器,右键点击 .uproject 文件,选择 "Generate Visual Studio project files",重…...
Qt Quick Controls模块功能及架构
Qt Quick Controls是Qt Quick的一个附加模块,提供了一套用于构建完整用户界面的UI控件。在Qt 6.0中,这个模块经历了重大重构和改进。 一、主要功能和特点 1. 架构重构 完全重写了底层架构,与Qt Quick更紧密集成 移除了对Qt Widgets的依赖&…...

欢乐熊大话蓝牙知识17:多连接 BLE 怎么设计服务不会乱?分层思维来救场!
多连接 BLE 怎么设计服务不会乱?分层思维来救场! 作者按: 你是不是也遇到过 BLE 多连接时,调试现场像网吧“掉线风暴”? 温度传感器连上了,心率带丢了;一边 OTA 更新,一边通知卡壳。…...
用js实现常见排序算法
以下是几种常见排序算法的 JS实现,包括选择排序、冒泡排序、插入排序、快速排序和归并排序,以及每种算法的特点和复杂度分析 1. 选择排序(Selection Sort) 核心思想:每次从未排序部分选择最小元素,与未排…...
STL 2迭代器
文章目录 1.迭代器2.输入迭代器3.输出迭代器1.插入迭代器 4.前向迭代器5.双向迭代器6.随机访问迭代器7.不同容器返回的迭代器类型1.输入 / 输出迭代器2.前向迭代器3.双向迭代器4.随机访问迭代器5.特殊迭代器适配器6.为什么 unordered_set 只提供前向迭代器? 1.迭代器…...