摘要:AI 高速发展赋能传统业务,图库网站亦有诸多 AI 应用空间。以 AI 扩图功؜能为例,让我们来学习如何在项目⁠中快速接入 AI 绘图大模型。‏用户可以选择一张已上传的图片,‌通过 AI 扩图得到新的图片,希望可以帮到大家。

AI绘图大模型两次扩图效果

本节思维导图:

方案设计

1、AI 绘图大模型选择

控制台 也能看到对应的图像画面扩展模型

2、调用方式

点击对应的API参考,我们发现,API 只支持异步方式调用

这是因为 AI 绘画任务计؜算量大且耗时长,同步调用会导致服务器线程长时间被单个⁠任务占用,限制了并发处理能力,增加了超时和系统崩溃的‏风险。通过异步调用,服务器可以将任务放入队列中,合理‌调度资源,避免阻塞主线程,从而更高效地服务多个用户请‏求,提升整体系统的稳定性和可扩展性。

同步调用如下,好处是客户⁠端可以直接获取到结‏果,调用更方便:

异步调用如下,客户端需要在提交任务后⁠,不断轮询请求,来检查任务‏是否执行完成:

                                          ‏             

由于 AI 接口؜已经选择了异步调用,所以我们作⁠为要调用 AI 接口的客户端,‏要使用轮询的方式来检查任务状态‌是否为 “已完成”,如果完成了‏,才可以获取到生成的图片。

那么是前端轮询还是后端轮询呢?让我们来对比一下

1)前端轮询

前端调用后؜端提交任务后得到任⁠务 ID,然后通过‏定时器轮询请求查询‌任务状态接口,直到‏任务完成或失败。

// 提交任务
async function submitTask() {const response = await fetch('/api/createTask', { method: 'POST' });const { taskId } = await response.json();checkTaskStatus(taskId);
}// 调用
submitTask();// 检查任务状态
async function checkTaskStatus(taskId) {const intervalId = setInterval(async () => {const response = await fetch(`/api/taskStatus?taskId=${taskId}`);const { status, result } = await response.json();if (status === 'success') {console.log('Task completed:', result);clearInterval(intervalId); // 停止轮询} else if (status === 'failed') {console.error('Task failed');clearInterval(intervalId); // 停止轮询}}, 2000); // 每隔 2 秒轮询
}

2)后端轮询

后端通过循؜环或定时任务检测任⁠务状态,接口阻‏塞,直到任务完成或‌失败,直接返回结‏果给前端。

@RestController
public class TaskController {@PostMapping("/createTask")public String createTask() {String taskId = taskService.submitTask();return taskId;}@GetMapping("/waitForTask")public ResponseEntity<String> waitForTask(@RequestParam String taskId) {while (true) {String status = taskService.checkTaskStatus(taskId);if ("success".equals(status)) {return ResponseEntity.ok("Task completed");} else if ("failed".equals(status)) {return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("Task failed");}try {Thread.sleep(2000); // 等待 2 秒后重试} catch (InterruptedException e) {return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("Error occurred");}}}
}

显然,后端轮询容易因为任务阻塞导致资源耗尽,所以通常推荐 前端轮询。除非有明确的需求要求时,才考虑后端轮询,比如任务结果需实时返回且对网络请求数敏感。


在配置文件中填写获取到的 apiKey:

# 阿里云 AI 配置
aliYunAi:apiKey: xxxx

新建数据模型类

api 包下新建 aliyunai 包,存放阿里云 AI 相关代码。

aliyunai.model 包下新建数据模型类,可以让 AI 根据官方文档中的请求响应信息自动生成

AI生成代码小技巧1:

第一步,将请求信息交给AI整理

创建任务获取任务ID
请求方式:POST
URL:https://dashscope.aliyuncs.com/api/v1/services/aigc/image2image/out-paintingcURL示例:bash
curl --location --request POST 'https://dashscope.aliyuncs.com/api/v1/services/aigc/image2image/out-painting' \
--header "Authorization: Bearer $DASHSCOPE_API_KEY" \
--header 'X-DashScope-Async: enable' \
--header 'Content-Type: application/json' \
--data '{"model": "image-out-painting","input": {"image_url": "http://xxx/image.jpg"},"parameters":{"x_scale":2,"y_scale":2,"best_quality":false,"limit_image_size":true}
}'
请求头(Headers):参数	类型	必选	说明
Content-Type	string	是	必须设置为 application/json
Authorization	string	是	身份认证(示例:Bearer d1xxx2a)
X-DashScope-Async	string	是	必须设置为 enable
请求体(Request Body)
顶层参数:字段	类型	必选	说明	示例值
model	string	是	模型名称	image-out-painting
input	object	是	输入图像信息	
parameters	object	是	图像处理参数	
input对象属性:字段	类型	必选	说明	限制条件
image_url	string	是	图像URL或base64数据	格式:JPG/JPEG/PNG/HEIF/WEBP
大小:≤10MB
分辨率:512×512 ~ 4096×4096像素
单边长度:[512, 4096]像素
parameters对象属性:字段	类型	必选	说明	默认值	取值范围/可选值	示例
angle	integer	否	逆时针旋转角度(度)	0	[0, 359]	-
output_ratio	string	否	输出图像宽高比	""	["", "1:1", "3:4", "4:3", "9:16", "16:9"]	-
x_scale	float	否	水平方向扩展比例	1.0	[1.0, 3.0]	输入1000×1000 → 设置2.0 → 输出2000×1000
y_scale	float	否	垂直方向扩展比例	1.0	[1.0, 3.0]	输入1000×1000 → 设置2.0 → 输出1000×2000
top_offset	integer	否	图像上方添加像素	0	top_offset + bottom_offset < 3×原图高度	输入1000×1000 → 设置500 → 输出1000×1500
bottom_offset	integer	否	图像下方添加像素	0	top_offset + bottom_offset < 3×原图高度	输入1000×1000 → 设置500 → 输出1000×1500
left_offset	integer	否	图像左侧添加像素	0	left_offset + right_offset < 3×原图宽度	输入1000×1000 → 设置500 → 输出1500×1000
right_offset	integer	否	图像右侧添加像素	0	left_offset + right_offset < 3×原图宽度	输入1000×1000 → 设置500 → 输出1500×1000
best_quality	boolean	否	开启最佳质量模式	false	true/false	true:耗时增加但细节更丰富
limit_image_size	boolean	否	限制输出图像大小	true	true/false	建议保持true(输出≤5MB)
add_watermark	boolean	否	添加AI水印	true	true/false	在左下角添加"Generated by AI"

第二步,让AI生成对应的请求类代码

@Data
public class CreateOutPaintingTaskRequest implements Serializable {/*** 模型,例如 "image-out-painting"*/private String model = "image-out-painting";/*** 输入图像信息*/private Input input;/*** 图像处理参数*/private Parameters parameters;@Datapublic static class Input {/*** 必选,图像 URL*/@Alias("image_url")private String imageUrl;}@Datapublic static class Parameters implements Serializable {/*** 可选,逆时针旋转角度,默认值 0,取值范围 [0, 359]*/private Integer angle;/*** 可选,输出图像的宽高比,默认空字符串,不设置宽高比* 可选值:["", "1:1", "3:4", "4:3", "9:16", "16:9"]*/@Alias("output_ratio")private String outputRatio;/*** 可选,图像居中,在水平方向上按比例扩展,默认值 1.0,范围 [1.0, 3.0]*/@Alias("x_scale")@JsonProperty("xScale")private Float xScale;/*** 可选,图像居中,在垂直方向上按比例扩展,默认值 1.0,范围 [1.0, 3.0]*/@Alias("y_scale")@JsonProperty("yScale")private Float yScale;/*** 可选,在图像上方添加像素,默认值 0*/@Alias("top_offset")private Integer topOffset;/*** 可选,在图像下方添加像素,默认值 0*/@Alias("bottom_offset")private Integer bottomOffset;/*** 可选,在图像左侧添加像素,默认值 0*/@Alias("left_offset")private Integer leftOffset;/*** 可选,在图像右侧添加像素,默认值 0*/@Alias("right_offset")private Integer rightOffset;/*** 可选,开启图像最佳质量模式,默认值 false* 若为 true,耗时会成倍增加*/@Alias("best_quality")private Boolean bestQuality;/*** 可选,限制模型生成的图像文件大小,默认值 true* - 单边长度 <= 10000:输出图像文件大小限制为 5MB 以下* - 单边长度 > 10000:输出图像文件大小限制为 10MB 以下*/@Alias("limit_image_size")private Boolean limitImageSize;/*** 可选,添加 "Generated by AI" 水印,默认值 true*/@Alias("add_watermark")private Boolean addWatermark = false;}
}

然后重复操作,生成响应类即可


创建扩图任务请求类:

@Data
public class CreateOutPaintingTaskRequest implements Serializable {/*** 模型,例如 "image-out-painting"*/private String model = "image-out-painting";/*** 输入图像信息*/private Input input;/*** 图像处理参数*/private Parameters parameters;@Datapublic static class Input {/*** 必选,图像 URL*/@Alias("image_url")private String imageUrl;}@Datapublic static class Parameters implements Serializable {/*** 可选,逆时针旋转角度,默认值 0,取值范围 [0, 359]*/private Integer angle;/*** 可选,输出图像的宽高比,默认空字符串,不设置宽高比* 可选值:["", "1:1", "3:4", "4:3", "9:16", "16:9"]*/@Alias("output_ratio")private String outputRatio;/*** 可选,图像居中,在水平方向上按比例扩展,默认值 1.0,范围 [1.0, 3.0]*/@Alias("x_scale")@JsonProperty("xScale")private Float xScale;/*** 可选,图像居中,在垂直方向上按比例扩展,默认值 1.0,范围 [1.0, 3.0]*/@Alias("y_scale")@JsonProperty("yScale")private Float yScale;/*** 可选,在图像上方添加像素,默认值 0*/@Alias("top_offset")private Integer topOffset;/*** 可选,在图像下方添加像素,默认值 0*/@Alias("bottom_offset")private Integer bottomOffset;/*** 可选,在图像左侧添加像素,默认值 0*/@Alias("left_offset")private Integer leftOffset;/*** 可选,在图像右侧添加像素,默认值 0*/@Alias("right_offset")private Integer rightOffset;/*** 可选,开启图像最佳质量模式,默认值 false* 若为 true,耗时会成倍增加*/@Alias("best_quality")private Boolean bestQuality;/*** 可选,限制模型生成的图像文件大小,默认值 true* - 单边长度 <= 10000:输出图像文件大小限制为 5MB 以下* - 单边长度 > 10000:输出图像文件大小限制为 10MB 以下*/@Alias("limit_image_size")private Boolean limitImageSize;/*** 可选,添加 "Generated by AI" 水印,默认值 true*/@Alias("add_watermark")private Boolean addWatermark = false;}
}

创建扩图任务响应类:

@Data
@NoArgsConstructor
@AllArgsConstructor
public class CreateOutPaintingTaskResponse {private Output output;/*** 表示任务的输出信息*/@Datapublic static class Output {/*** 任务 ID*/private String taskId;/*** 任务状态* <ul>*     <li>PENDING:排队中</li>*     <li>RUNNING:处理中</li>*     <li>SUSPENDED:挂起</li>*     <li>SUCCEEDED:执行成功</li>*     <li>FAILED:执行失败</li>*     <li>UNKNOWN:任务不存在或状态未知</li>* </ul>*/private String taskStatus;}/*** 接口错误码。* <p>接口成功请求不会返回该参数。</p>*/private String code;/*** 接口错误信息。* <p>接口成功请求不会返回该参数。</p>*/private String message;/*** 请求唯一标识。* <p>可用于请求明细溯源和问题排查。</p>*/private String requestId;}

查询任务响应类:

@Data
@NoArgsConstructor
@AllArgsConstructor
public class GetOutPaintingTaskResponse {/*** 请求唯一标识*/private String requestId;/*** 输出信息*/private Output output;/*** 表示任务的输出信息*/@Datapublic static class Output {/*** 任务 ID*/private String taskId;/*** 任务状态* <ul>*     <li>PENDING:排队中</li>*     <li>RUNNING:处理中</li>*     <li>SUSPENDED:挂起</li>*     <li>SUCCEEDED:执行成功</li>*     <li>FAILED:执行失败</li>*     <li>UNKNOWN:任务不存在或状态未知</li>* </ul>*/private String taskStatus;/*** 提交时间* 格式:YYYY-MM-DD HH:mm:ss.SSS*/private String submitTime;/*** 调度时间* 格式:YYYY-MM-DD HH:mm:ss.SSS*/private String scheduledTime;/*** 结束时间* 格式:YYYY-MM-DD HH:mm:ss.SSS*/private String endTime;/*** 输出图像的 URL*/private String outputImageUrl;/*** 接口错误码* <p>接口成功请求不会返回该参数</p>*/private String code;/*** 接口错误信息* <p>接口成功请求不会返回该参数</p>*/private String message;/*** 任务指标信息*/private TaskMetrics taskMetrics;}/*** 表示任务的统计信息*/@Datapublic static class TaskMetrics {/*** 总任务数*/private Integer total;/*** 成功任务数*/private Integer succeeded;/*** 失败任务数*/private Integer failed;}
}

5)开发 ؜API 调用类,通⁠过 Hutool ‏的 HTTP 请求‌工具类来调用阿里云‏百炼的 API:

AI生成代码小技巧2:

第一步,把发送请求样例传递给AI

第二步,让AI利用Hutool包发送请求生成代码

@Component
public class AliyunAiApi {@Value("${aliyunAi.apiKey}")private String apiKey;//创建任务// 创建任务地址public static final String CREATE_OUT_PAINTING_TASK_URL = "https://dashscope.aliyuncs.com/api/v1/services/aigc/image2image/out-painting";// 查询任务状态public static final String GET_OUT_PAINTING_TASK_URL = "https://dashscope.aliyuncs.com/api/v1/tasks/%s";public CreateOutPaintingTaskResponse createPaintingTask(CreateOutPaintingTaskRequest request) {//1.异常判断ThrowUtils.throwIf(request == null, ErrorCode.PARAMS_ERROR);// 2. 构建JSON请求体String jsonBody = JSONUtil.toJsonStr(request);// 3. 发送HTTP请求try (HttpResponse response = HttpRequest.post(CREATE_OUT_PAINTING_TASK_URL).header("Authorization", "Bearer " + apiKey).header("X-DashScope-Async", "enable").header("Content-Type", "application/json").body(jsonBody).execute()) {// 4. 检查响应状态if (!response.isOk()) {throw new RuntimeException("请求失败,状态码: " + response.getStatus());}// 5. 解析响应体String body = response.body();return JSONUtil.toBean(body, CreateOutPaintingTaskResponse.class);} catch (Exception e) {throw new RuntimeException("创建扩图任务失败", e);}}/*** 查询创建的任务** @param taskId* @return*/public GetOutPaintingTaskResponse getOutPaintingTask(String taskId) {if (StrUtil.isBlank(taskId)) {throw new BusinessException(ErrorCode.OPERATION_ERROR, "任务 id 不能为空");}try (HttpResponse httpResponse = HttpRequest.get(String.format(GET_OUT_PAINTING_TASK_URL, taskId)).header(Header.AUTHORIZATION, "Bearer " + apiKey).execute()) {if (!httpResponse.isOk()) {throw new BusinessException(ErrorCode.OPERATION_ERROR, "获取任务失败");}return JSONUtil.toBean(httpResponse.body(), GetOutPaintingTaskResponse.class);}}
}
2、扩图服务

model.dto.picture 包下新建 AI 扩图请求类,用于接受前端传来的参数并传递给 Service 服务层。字段包括图片 id 和扩图参数:

@Data
public class CreatePictureOutPaintingTaskRequest implements Serializable {/*** 图片 id*/private Long pictureId;/*** 扩图参数*/private CreateOutPaintingTaskRequest.Parameters parameters;private static final long serialVersionUID = 1L;
}

在图片服务中编写创؜建扩图任务方法,从数据库中获取图片⁠信息和 url 地址,构造请求参数‏后调用 api 创建扩图任务。注意‌,如果图片有空间 id,则需要校验‏权限,直接复用以前的权限校验方法。

@Override
public CreateOutPaintingTaskResponse createPictureOutPaintingTask(CreatePictureOutPaintingTaskRequest createPictureOutPaintingTaskRequest, User loginUser) {// 获取图片信息Long pictureId = createPictureOutPaintingTaskRequest.getPictureId();Picture picture = Optional.ofNullable(this.getById(pictureId)).orElseThrow(() -> new BusinessException(ErrorCode.NOT_FOUND_ERROR));// 权限校验checkPictureAuth(loginUser, picture);// 构造请求参数CreateOutPaintingTaskRequest taskRequest = new CreateOutPaintingTaskRequest();CreateOutPaintingTaskRequest.Input input = new CreateOutPaintingTaskRequest.Input();input.setImageUrl(picture.getUrl());taskRequest.setInput(input);BeanUtil.copyProperties(createPictureOutPaintingTaskRequest, taskRequest);// 创建任务return aliYunAiApi.createOutPaintingTask(taskRequest);
}

3、扩图接口

在 Pictu؜reController 添⁠加 AI 扩图接口,包括创建‏任务和查询任务状态接口:  ‌

/*** 创建 AI 扩图任务*/
@PostMapping("/out_painting/create_task")
public BaseResponse<CreateOutPaintingTaskResponse> createPictureOutPaintingTask(@RequestBody CreatePictureOutPaintingTaskRequest createPictureOutPaintingTaskRequest,HttpServletRequest request) {if (createPictureOutPaintingTaskRequest == null || createPictureOutPaintingTaskRequest.getPictureId() == null) {throw new BusinessException(ErrorCode.PARAMS_ERROR);}User loginUser = userService.getLoginUser(request);CreateOutPaintingTaskResponse response = pictureService.createPictureOutPaintingTask(createPictureOutPaintingTaskRequest, loginUser);return ResultUtils.success(response);
}/*** 查询 AI 扩图任务*/
@GetMapping("/out_painting/get_task")
public BaseResponse<GetOutPaintingTaskResponse> getPictureOutPaintingTask(String taskId) {ThrowUtils.throwIf(StrUtil.isBlank(taskId), ErrorCode.PARAMS_ERROR);GetOutPaintingTaskResponse task = aliYunAiApi.getOutPaintingTask(taskId);return ResultUtils.success(task);
}

使用Swagger接口进行测试,成功!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/917212.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/917212.shtml
英文地址,请注明出处:http://en.pswp.cn/news/917212.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Notepad++插件安装

方式一&#xff1a;自动安装&#xff08;有些notepad并不好用&#xff0c;推荐方式二&#xff09;工具栏-》插件-》插件管理如下点击安装后会提示&#xff0c;后端安装&#xff0c;安装成功后自动启动&#xff0c;本人使用的v8.6.4的版本&#xff0c;插件基本都无法自动安装&am…

git pull和git fetch的区别

git pull和git fetch是git版本控制系统中的两个基本命令&#xff0c;它们都用于从远程仓库更新本地仓库的信息&#xff0c;但执行的具体操作不同。git fetch:git fetch下载远程仓库最新的内容到你的本地仓库&#xff0c;但它并不自动合并或修改你当前的工作。它取回了远程仓库的…

Item35:考虑virtual函数以外的其他选择

在C++中,虚函数是实现多态的传统方式,但并非唯一选择。过度依赖虚函数可能导致派生类与基类的强耦合,或难以在运行时灵活切换行为。《Effective C++》Item35指出:应根据场景选择更合适的替代方案,包括NVI模式、函数指针、策略模式等。本文解析这些方案的原理、适用场景及实…

Vue3 状态管理新选择:Pinia 从入门到实战

一、什么是pinia? 在 Vue3 生态中&#xff0c;状态管理一直是开发者关注的核心话题。随着 Vuex 的逐步淡出&#xff0c;Pinia 作为官方推荐的状态管理库&#xff0c;凭借其简洁的 API、强大的功能和对 Vue3 特性的完美适配&#xff0c;成为了新时代的不二之选。今天我们就来深…

Unity相机控制

相机的控制无非移动和旋转&#xff0c;每种操作各3个轴6个方向&#xff0c;一共12种方式。在某些需要快速验证的项目或Demo里常常需要丝滑的控制相机调试效果。相机控制虽然不是什么高深的技术&#xff0c;但是要写的好用还是很磨人的。 锁定Z轴的旋转 一个自由的相机可以绕 …

vue2 使用liveplayer加载视频

vue2 使用liveplayer加载视频 官网: https://www.liveqing.com/docs/manuals/LivePlayer.html支持WebRTC/MP4播放;支持m3u8/HLS播放;支持HTTP-FLV/WS-FLV/RTMP播放;支持直播和点播播放;支持播放器快照截图;支持点播多清晰度播放;支持全屏或比例显示;自动检测IE浏览器兼容播放;支…

JavaScript语法树简介:AST/CST/词法/语法分析/ESTree/生成工具

AST简介 在平时的开发中&#xff0c;经常会遇到对JavaScript代码进行检查或改动的工具&#xff0c;例如ESLint会检查代码中的语法错误&#xff1b;Prettier会修改代码的格式&#xff1b;打包工具会将不同文件中的代码打包在一起等等。这些工具都对JavaScript代码本身进行了解析…

Java函数式编程之【基本数据类型流】

一、基本数据类型与基本数据的包装类 在Java编程语言中&#xff0c;int、long和double等基本数据类型都各有它们的包装类型Integer、Long和Double。 基本数据类型是Java程序语言内置的数据类型&#xff0c;可直接使用。 而包装类型则归属于普通的Java类&#xff0c;是对基本数据…

.NET Core部署服务器

1、以.NET Core5.0为例&#xff0c;在官网下载 下载 .NET 5.0 (Linux、macOS 和 Windows) | .NET 根据自己需求选择x64还是x86&#xff0c;记住关键下载完成还需要下载 Hosting Bundel &#xff0c;否则不成功 2、部署https将ssl证书放在服务器上&#xff0c;双击导入&#…

YOLO---04YOLOv3

YOLOV3 论文地址&#xff1a;&#xff1a;【https://arxiv.org/pdf/1804.02767】 YOLOV3 论文中文翻译地址&#xff1a;&#xff1a;【YOLO3论文中文版_yolo v3论文 中文版-CSDN博客】 YOLOv3 在实时性和精确性在当时都是做的比较好的&#xff0c;并在工业界得到了广泛应用 …

Qt知识点3『自定义属性的样式表失败问题』

问题1&#xff1a;自定义类中的自定义属性&#xff0c;如何通过样式表来赋值除了QT自带的属性&#xff0c;我们自定义的类中如果有自定义的静态属性&#xff0c;也可以支持样式表&#xff0c;如下 &#xff1a; Q_PROPERTY(QColor myBorderColor READ getMyBorderColor WRITE s…

RDQS_c和RDQS_t的作用及区别

&#x1f501; LPDDR5 中的 RDQS_t 和 RDQS_c — 复用机制详解 &#x1f4cc; 基本角色 引脚名 读操作&#xff08;READ&#xff09;作用 写操作&#xff08;WRITE&#xff09;作用&#xff08;当启用Link ECC&#xff09; RDQS_t Read DQS True&#xff1a;与 RDQS_c…

测试分类:详解各类测试方式与方法

前言&#xff1a;为什么要将测试进行分类呢&#xff1f;软件测试是软件生命周期中的⼀个重要环节&#xff0c;具有较高的复杂性&#xff0c;对于软件测试&#xff0c;可以从不同的角度加以分类&#xff0c;使开发者在软件开发过程中的不同层次、不同阶段对测试工作进行更好的执…

新手docker安装踩坑记录

最近在学习docker&#xff0c;安装和使用折腾了好久&#xff0c;在这里记录一下。下载# 依赖安装 sudo apt update sudo apt install -y \ca-certificates \curl \gnupg \lsb-release# 使用清华镜像源&#xff08;Ubuntu 24.04 noble&#xff09; echo \"deb [arch$(dpkg …

TOGAF指南1

1.TOGAF标准简介 TOGAF&#xff08;The Open Group Architecture Framework&#xff09;就像是一个企业架构的“操作手册”。它帮助企业设计、搭建和维护自己的“系统地图”&#xff0c;确保不同部门、技术、业务目标能像齿轮一样协调运转。 它的核心是&#xff1a; 用迭代的方…

[Linux入门] Linux 防火墙技术入门:从 iptables 到 nftables

目录 一、防火墙基础&#xff1a;netfilter 与 iptables 的关系 1️⃣什么是 netfilter&#xff1f; 2️⃣什么是 iptables&#xff1f; 二、iptables 核心&#xff1a;五链四表与规则体系 1️⃣什么是 “链”&#xff08;Chain&#xff09;&#xff1f; 2️⃣ 什么是 “…

函数fdopendir的用法

以下是关于 fdopendir 函数的详细解析&#xff0c;结合其核心功能、参数说明及典型应用场景&#xff1a;&#x1f50d; ‌一、函数功能与原型‌‌核心作用‌将已打开的目录文件描述符&#xff08;fd&#xff09;转换为目录流指针&#xff08;DIR*&#xff09;&#xff0c;用于后…

[源力觉醒 创作者计划]_文心4.5开源测评:国产大模型的技术突破与多维度能力解析

声明&#xff1a;文章为本人真实测评博客&#xff0c;非广告&#xff0c;并没有推广该平台 &#xff0c;为用户体验文章 一起来轻松玩转文心大模型吧&#x1f449; 文心大模型免费下载地址 一、引言&#xff1a;文心4.5开源——开启多模态大模型新时代 2025年6月30日&#x…

微信小程序无法构建npm,可能是如下几个原因

安装位置的问题&#xff0c;【npm安装在cd指定位置】小程序缓存的问题退出小程序&#xff0c;重新构建即可

从 MyBatis 到 MyBatis - Plus:@Options 注解的那些事儿

在 MyBatis 以及 MyBatis - Plus 的开发过程中&#xff0c;注解的使用是提升开发效率和实现特定功能的关键。今天我们就来聊聊 Options 注解&#xff0c;以及在 MyBatis - Plus 中它的使用场景和替代方案。 一、MyBatis 中的 Options 注解 在 MyBatis 框架中&#xff0c;Option…