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

【OJ项目】深入剖析题目接口控制器:功能、实现与应用

《深入剖析题目接口控制器:功能、实现与应用》

一、引言

在在线编程平台或竞赛系统中,题目管理和提交是核心功能之一。QuestionController 类作为控制器层,承担着处理与题目相关的各种请求的重要职责,包括题目的增删改查、题目提交等操作。本文将详细剖析该类的代码,深入理解其功能和实现细节。

二、类概述

QuestionController 类使用 Spring 的 @RestController 注解,表明它是一个 RESTful 风格的控制器,用于处理 HTTP 请求。它位于 / 根路径下,提供了一系列与题目相关的接口。该类依赖于 QuestionServiceUserFeignClientQuestionSubmitService 等服务,通过这些服务来完成具体的业务逻辑。

@RestController
@RequestMapping("/")
@Slf4j
public class QuestionController {@Resourceprivate QuestionService questionService;@Resourceprivate UserFeignClient userFeignClient;@Resourceprivate QuestionSubmitService questionSubmitService;private final static Gson GSON = new Gson();// ... 具体方法 ...
}

三、增删改查功能实现

3.1 创建题目

@PostMapping("/add")
public BaseResponse<Long> addQuestion(@RequestBody QuestionAddRequest questionAddRequest, HttpServletRequest request) {if (questionAddRequest == null) {throw new BusinessException(ErrorCode.PARAMS_ERROR);}Question question = new Question();BeanUtils.copyProperties(questionAddRequest, question);List<String> tags = questionAddRequest.getTags();if (tags != null) {question.setTags(GSON.toJson(tags));}List<JudgeCase> judgeCase = questionAddRequest.getJudgeCase();if (judgeCase != null) {question.setJudgeCase(GSON.toJson(judgeCase));}JudgeConfig judgeConfig = questionAddRequest.getJudgeConfig();if (judgeConfig != null) {question.setJudgeConfig(GSON.toJson(judgeConfig));}questionService.validQuestion(question, true);User loginUser = userFeignClient.getLoginUser(request);question.setUserId(loginUser.getId());question.setFavourNum(0);question.setThumbNum(0);boolean result = questionService.save(question);ThrowUtils.throwIf(!result, ErrorCode.OPERATION_ERROR);long newQuestionId = question.getId();return ResultUtils.success(newQuestionId);
}
  • 功能:处理创建题目的请求,将用户提交的题目信息保存到数据库中。
  • 实现步骤
    1. 检查请求参数是否为空,若为空则抛出参数错误异常。
    2. QuestionAddRequest 对象的属性复制到 Question 对象中。
    3. 对题目标签、测试用例和判题配置进行 JSON 序列化处理。
    4. 调用 questionServicevalidQuestion 方法对题目信息进行校验。
    5. 获取当前登录用户的信息,并将用户 ID 关联到题目中。
    6. 初始化题目点赞数和收藏数为 0。
    7. 调用 questionServicesave 方法保存题目信息,若保存失败则抛出操作错误异常。
    8. 返回新创建题目的 ID。

3.2 删除题目

@PostMapping("/delete")
public BaseResponse<Boolean> deleteQuestion(@RequestBody DeleteRequest deleteRequest, HttpServletRequest request) {if (deleteRequest == null || deleteRequest.getId() <= 0) {throw new BusinessException(ErrorCode.PARAMS_ERROR);}User user = userFeignClient.getLoginUser(request);long id = deleteRequest.getId();// 判断是否存在Question oldQuestion = questionService.getById(id);ThrowUtils.throwIf(oldQuestion == null, ErrorCode.NOT_FOUND_ERROR);// 仅本人或管理员可删除if (!oldQuestion.getUserId().equals(user.getId()) && !userFeignClient.isAdmin(user)) {throw new BusinessException(ErrorCode.NO_AUTH_ERROR);}boolean b = questionService.removeById(id);return ResultUtils.success(b);
}
  • 功能:处理删除题目的请求,从数据库中删除指定 ID 的题目。
  • 实现步骤
    1. 检查请求参数是否合法,若不合法则抛出参数错误异常。
    2. 获取当前登录用户的信息。
    3. 根据题目 ID 查询题目信息,若题目不存在则抛出未找到错误异常。
    4. 检查当前用户是否有删除权限,只有题目创建者或管理员才能删除题目,若没有权限则抛出无权限错误异常。
    5. 调用 questionServiceremoveById 方法删除题目信息,并返回删除结果。

3.3 更新题目(仅管理员)

@PostMapping("/update")
@AuthCheck(mustRole = UserConstant.ADMIN_ROLE)
public BaseResponse<Boolean> updateQuestion(@RequestBody QuestionUpdateRequest questionUpdateRequest) {if (questionUpdateRequest == null || questionUpdateRequest.getId() <= 0) {throw new BusinessException(ErrorCode.PARAMS_ERROR);}Question question = new Question();BeanUtils.copyProperties(questionUpdateRequest, question);List<String> tags = questionUpdateRequest.getTags();if (tags != null) {question.setTags(GSON.toJson(tags));}List<JudgeCase> judgeCase = questionUpdateRequest.getJudgeCase();if (judgeCase != null) {question.setJudgeCase(GSON.toJson(judgeCase));}JudgeConfig judgeConfig = questionUpdateRequest.getJudgeConfig();if (judgeConfig != null) {question.setJudgeConfig(GSON.toJson(judgeConfig));}// 参数校验questionService.validQuestion(question, false);long id = questionUpdateRequest.getId();// 判断是否存在Question oldQuestion = questionService.getById(id);ThrowUtils.throwIf(oldQuestion == null, ErrorCode.NOT_FOUND_ERROR);boolean result = questionService.updateById(question);return ResultUtils.success(result);
}
  • 功能:处理更新题目的请求,只有管理员才能执行此操作。
  • 实现步骤
    1. 检查请求参数是否合法,若不合法则抛出参数错误异常。
    2. QuestionUpdateRequest 对象的属性复制到 Question 对象中。
    3. 对题目标签、测试用例和判题配置进行 JSON 序列化处理。
    4. 调用 questionServicevalidQuestion 方法对题目信息进行校验。
    5. 根据题目 ID 查询题目信息,若题目不存在则抛出未找到错误异常。
    6. 调用 questionServiceupdateById 方法更新题目信息,并返回更新结果。

3.4 根据 ID 获取题目

@GetMapping("/get")
public BaseResponse<Question> getQuestionById(long id, HttpServletRequest request) {if (id <= 0) {throw new BusinessException(ErrorCode.PARAMS_ERROR);}Question question = questionService.getById(id);if (question == null) {throw new BusinessException(ErrorCode.NOT_FOUND_ERROR);}User loginUser = userFeignClient.getLoginUser(request);// 不是本人或管理员,不能直接获取所有信息if (!question.getUserId().equals(loginUser.getId()) && !userFeignClient.isAdmin(loginUser)) {throw new BusinessException(ErrorCode.NO_AUTH_ERROR);}return ResultUtils.success(question);
}
  • 功能:根据题目 ID 获取题目信息,只有题目创建者或管理员才能获取完整信息。
  • 实现步骤
    1. 检查题目 ID 是否合法,若不合法则抛出参数错误异常。
    2. 根据题目 ID 查询题目信息,若题目不存在则抛出未找到错误异常。
    3. 获取当前登录用户的信息。
    4. 检查当前用户是否有获取完整信息的权限,若没有权限则抛出无权限错误异常。
    5. 返回题目信息。

3.5 根据 ID 获取脱敏后的题目信息

@GetMapping("/get/vo")
public BaseResponse<QuestionVO> getQuestionVOById(long id, HttpServletRequest request) {if (id <= 0) {throw new BusinessException(ErrorCode.PARAMS_ERROR);}Question question = questionService.getById(id);if (question == null) {throw new BusinessException(ErrorCode.NOT_FOUND_ERROR);}return ResultUtils.success(questionService.getQuestionVO(question, request));
}
  • 功能:根据题目 ID 获取脱敏后的题目信息,适用于普通用户查看。
  • 实现步骤
    1. 检查题目 ID 是否合法,若不合法则抛出参数错误异常。
    2. 根据题目 ID 查询题目信息,若题目不存在则抛出未找到错误异常。
    3. 调用 questionServicegetQuestionVO 方法获取脱敏后的题目信息并返回。

3.6 分页获取题目列表(封装类)

@PostMapping("/list/page/vo")
public BaseResponse<Page<QuestionVO>> listQuestionVOByPage(@RequestBody QuestionQueryRequest questionQueryRequest,HttpServletRequest request) {long current = questionQueryRequest.getCurrent();long size = questionQueryRequest.getPageSize();// 限制爬虫ThrowUtils.throwIf(size > 20, ErrorCode.PARAMS_ERROR);Page<Question> questionPage = questionService.page(new Page<>(current, size),questionService.getQueryWrapper(questionQueryRequest));return ResultUtils.success(questionService.getQuestionVOPage(questionPage, request));
}
  • 功能:分页获取题目列表,并返回封装后的题目信息(QuestionVO)。
  • 实现步骤
    1. 从请求参数中获取当前页码和每页数量。
    2. 检查每页数量是否超过限制,若超过则抛出参数错误异常,防止爬虫过度请求。
    3. 调用 questionServicepage 方法进行分页查询。
    4. 调用 questionServicegetQuestionVOPage 方法将查询结果封装为 QuestionVO 并返回。

3.7 分页获取当前用户创建的题目列表

@PostMapping("/my/list/page/vo")
public BaseResponse<Page<QuestionVO>> listMyQuestionVOByPage(@RequestBody QuestionQueryRequest questionQueryRequest,HttpServletRequest request) {if (questionQueryRequest == null) {throw new BusinessException(ErrorCode.PARAMS_ERROR);}User loginUser = userFeignClient.getLoginUser(request);questionQueryRequest.setUserId(loginUser.getId());long current = questionQueryRequest.getCurrent();long size = questionQueryRequest.getPageSize();// 限制爬虫ThrowUtils.throwIf(size > 20, ErrorCode.PARAMS_ERROR);Page<Question> questionPage = questionService.page(new Page<>(current, size),questionService.getQueryWrapper(questionQueryRequest));return ResultUtils.success(questionService.getQuestionVOPage(questionPage, request));
}
  • 功能:分页获取当前用户创建的题目列表,并返回封装后的题目信息(QuestionVO)。
  • 实现步骤
    1. 检查请求参数是否为空,若为空则抛出参数错误异常。
    2. 获取当前登录用户的信息,并将用户 ID 设置到查询请求中。
    3. 从请求参数中获取当前页码和每页数量。
    4. 检查每页数量是否超过限制,若超过则抛出参数错误异常,防止爬虫过度请求。
    5. 调用 questionServicepage 方法进行分页查询。
    6. 调用 questionServicegetQuestionVOPage 方法将查询结果封装为 QuestionVO 并返回。

3.8 分页获取题目列表(仅管理员)

@PostMapping("/list/page")
@AuthCheck(mustRole = UserConstant.ADMIN_ROLE)
public BaseResponse<Page<Question>> listQuestionByPage(@RequestBody QuestionQueryRequest questionQueryRequest,HttpServletRequest request) {long current = questionQueryRequest.getCurrent();long size = questionQueryRequest.getPageSize();Page<Question> questionPage = questionService.page(new Page<>(current, size),questionService.getQueryWrapper(questionQueryRequest));return ResultUtils.success(questionPage);
}
  • 功能:分页获取题目列表,只有管理员才能执行此操作。
  • 实现步骤
    1. 从请求参数中获取当前页码和每页数量。
    2. 调用 questionServicepage 方法进行分页查询。
    3. 返回查询结果。

四、其他功能实现

4.1 编辑题目(用户)

@PostMapping("/edit")
public BaseResponse<Boolean> editQuestion(@RequestBody QuestionEditRequest questionEditRequest, HttpServletRequest request) {if (questionEditRequest == null || questionEditRequest.getId() <= 0) {throw new BusinessException(ErrorCode.PARAMS_ERROR);}Question question = new Question();BeanUtils.copyProperties(questionEditRequest, question);List<String> tags = questionEditRequest.getTags();if (tags != null) {question.setTags(GSON.toJson(tags));}List<JudgeCase> judgeCase = questionEditRequest.getJudgeCase();if (judgeCase != null) {question.setJudgeCase(GSON.toJson(judgeCase));}JudgeConfig judgeConfig = questionEditRequest.getJudgeConfig();if (judgeConfig != null) {question.setJudgeConfig(GSON.toJson(judgeConfig));}// 参数校验questionService.validQuestion(question, false);User loginUser = userFeignClient.getLoginUser(request);long id = questionEditRequest.getId();// 判断是否存在Question oldQuestion = questionService.getById(id);ThrowUtils.throwIf(oldQuestion == null, ErrorCode.NOT_FOUND_ERROR);// 仅本人或管理员可编辑if (!oldQuestion.getUserId().equals(loginUser.getId()) && !userFeignClient.isAdmin(loginUser)) {throw new BusinessException(ErrorCode.NO_AUTH_ERROR);}boolean result = questionService.updateById(question);return ResultUtils.success(result);
}
  • 功能:处理编辑题目的请求,只有题目创建者或管理员才能执行此操作。
  • 实现步骤
    1. 检查请求参数是否合法,若不合法则抛出参数错误异常。
    2. QuestionEditRequest 对象的属性复制到 Question 对象中。
    3. 对题目标签、测试用例和判题配置进行 JSON 序列化处理。
    4. 调用 questionServicevalidQuestion 方法对题目信息进行校验。
    5. 获取当前登录用户的信息。
    6. 根据题目 ID 查询题目信息,若题目不存在则抛出未找到错误异常。
    7. 检查当前用户是否有编辑权限,若没有权限则抛出无权限错误异常。
    8. 调用 questionServiceupdateById 方法更新题目信息,并返回更新结果。

4.2 提交题目

@PostMapping("/question_submit/do")
public BaseResponse<Long> doQuestionSubmit(@RequestBody QuestionSubmitAddRequest questionSubmitAddRequest,HttpServletRequest request) {if (questionSubmitAddRequest == null || questionSubmitAddRequest.getQuestionId() <= 0) {throw new BusinessException(ErrorCode.PARAMS_ERROR);}// 登录才能提交final User loginUser = userFeignClient.getLoginUser(request);long questionSubmitId = questionSubmitService.doQuestionSubmit(questionSubmitAddRequest, loginUser);return ResultUtils.success(questionSubmitId);
}
  • 功能:处理提交题目的请求,用户必须登录才能提交。
  • 实现步骤
    1. 检查请求参数是否合法,若不合法则抛出参数错误异常。
    2. 获取当前登录用户的信息。
    3. 调用 questionSubmitServicedoQuestionSubmit 方法处理题目提交,并返回提交记录的 ID。

4.3 分页获取题目提交列表

@PostMapping("/question_submit/list/page")
public BaseResponse<Page<QuestionSubmitVO>> listQuestionSubmitByPage(@RequestBody QuestionSubmitQueryRequest questionSubmitQueryRequest,HttpServletRequest request) {long current = questionSubmitQueryRequest.getCurrent();long size = questionSubmitQueryRequest.getPageSize();// 从数据库中查询原始的题目提交分页信息Page<QuestionSubmit> questionSubmitPage = questionSubmitService.page(new Page<>(current, size),questionSubmitService.getQueryWrapper(questionSubmitQueryRequest));final User loginUser = userFeignClient.getLoginUser(request);// 返回脱敏信息return ResultUtils.success(questionSubmitService.getQuestionSubmitVOPage(questionSubmitPage, loginUser));
}
  • 功能:分页获取题目提交列表

相关文章:

【OJ项目】深入剖析题目接口控制器:功能、实现与应用

《深入剖析题目接口控制器&#xff1a;功能、实现与应用》 一、引言 在在线编程平台或竞赛系统中&#xff0c;题目管理和提交是核心功能之一。QuestionController 类作为控制器层&#xff0c;承担着处理与题目相关的各种请求的重要职责&#xff0c;包括题目的增删改查、题目提…...

周考考题(学习自用)

1.查询student表中name叫张某的信息 select * from student where name张某; 2.写出char和varchar类型的区别 1&#xff09;char存储固定长度的字符串&#xff0c;varchar存储可变长度的字符串&#xff08;在实际长度的字符串上加上一个字节用于存储字符串长度&#xff09;&a…...

【matlab】大小键盘对应的Kbname

matlab中可以通过Kbname来识别键盘上的键。在写范式的时候&#xff0c;遇到一个问题&#xff0c;我想用大键盘上排成一行的数字按键评分&#xff0c;比如 Kbname(1) 表示键盘上的数字1&#xff0c;但是这种写法只能识别小键盘上的数字&#xff0c;无法达到我的目的&#xff0c;…...

LabVIEW与小众设备集成

在LabVIEW开发中&#xff0c;当面临控制如布鲁克OPUS红外光谱仪这类小众专业设备的需求&#xff0c;而厂家虽然提供了配套软件&#xff0c;但由于系统中还需要控制其他设备且不能使用厂商的软件时&#xff0c;必须依赖特定方法通过LabVIEW实现设备的控制。开发过程中&#xff0…...

Android 系统Service流程

主要用到的源码文件 /frameworks/base/core/java/android/app/ContextImpl.java 和ams通信。 /frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java 初始化Service,.管理服务 ActiveServices对象mServices /frameworks/base/services/core/…...

Gartner预测2025年网络安全正在进入AI动荡时期:软件供应链和基础设施技术堆栈中毒将占针对企业使用的人工智能恶意攻击的 70% 以上

Gartner 预测&#xff0c;网络安全正在进入 AI 动荡时期。安全和风险管理领导者必须根据早期生成式 AI 部署的失败以及 AI 代理清洗来评估即将到来的 AI 进展。 主要发现 随着各大企业开展大量人工智能采用和开发项目&#xff0c;应用安全弱点的暴露程度不断提高&#xff0c;包…...

华为最新OD机试真题-最长子字符串的长度(一)-Python-OD统一考试(E卷)

最新华为OD机试考点合集:华为OD机试2024年真题题库(E卷+D卷+C卷)_华为od机试题库-CSDN博客 每一题都含有详细的解题思路和代码注释,精编c++、JAVA、Python三种语言解法。帮助每一位考生轻松、高效刷题。订阅后永久可看,发现新题及时跟新。 题目描述: 给你一个字符串…...

HAL库框架学习总结

概述&#xff1a;HAL库为各种外设基本都配了三套 API&#xff0c;查询&#xff0c;中断和 DMA。 一、HAL库为外设初始化提供了一套框架&#xff0c;这里以串口为例进行说明&#xff0c;调用函数 HAL_UART_Init初始化串口&#xff0c;此函数就会调用 HAL_UART_MspInit&#xff0…...

基于Spring Integration的ESB与Kettle结合实现实时数据处理技术

一、方案概述 在当今数字化时代,企业面临着海量数据的实时处理与传输挑战。ESB(企业服务总线)作为系统集成的核心组件,承担着不同协议数据的接入与转换任务,而Kettle作为一款功能强大的ETL(Extract, Transform, Load)工具,在数据抽取、转换与加载方面表现出色。将ESB与…...

qt QOpenGLContext详解

1. 概述 QOpenGLContext 是 Qt 提供的一个类&#xff0c;用于管理 OpenGL 上下文。它封装了 OpenGL 上下文的创建、配置和管理功能&#xff0c;使得开发者可以在 Qt 应用程序中以平台无关的方式使用 OpenGL。通过 QOpenGLContext&#xff0c;可以轻松地创建和管理 OpenGL 上下…...

探索顶级汽车软件解决方案:驱动行业变革的关键力量

在本文中&#xff0c;将一同探索当今塑造汽车行业的最具影响力的软件解决方案。从设计到制造&#xff0c;软件正彻底改变车辆的制造与维护方式。让我们深入了解这个充满活力领域中的关键技术。 设计软件&#xff1a;创新车型的孕育摇篮 车辆设计软件对于创造创新型汽车模型至…...

Deepseek R1模型本地化部署+API接口调用详细教程:释放AI生产力

文章目录 前言一、deepseek R1模型与chatGPT o1系列模型对比二、本地部署步骤1.安装ollama2部署DeepSeek R1模型删除已存在模型&#xff0c;以7b模型为例 三、DeepSeek API接口调用Cline配置 前言 随着最近人工智能 DeepSeek 的爆火&#xff0c;越来越多的技术大佬们开始关注如…...

DeepSeek 概述与本地化部署【详细流程】

目录 一、引言 1.1 背景介绍 1.2 本地化部署的优势 二、deepseek概述 2.1 功能特点 2.2 核心优势 三、本地部署流程 3.1 版本选择 3.2 部署过程 3.2.1 下载Ollama 3.2.2 安装Ollama 3.2.3 选择 r1 模型 3.2.4 选择版本 3.2.5 本地运行deepseek模型 3.3.6 查看…...

FFmpeg Video options

FFmpeg视频相关选项 1. -vframes number (output) 设置输出视频帧数 示例&#xff1a; ffmpeg -i input.mp4 -vframes 90 output.mp4 表示输出90帧视频 2. -r[:stream_specifier] fps (input/output,per-stream) 设置帧率(rate) 示例&#xff1a; ffmpeg -i input.mp4…...

从51到STM32:PWM平滑迁移方案

引言 对于习惯使用51单片机的开发者而言&#xff0c;转向STM32时可能会面临开发环境和硬件差异的挑战。本文以PWM&#xff08;脉宽调制&#xff09;功能为例&#xff0c;分享从51到STM32的平滑迁移方案&#xff0c;帮助开发者快速适应STM32的开发模式。 一、PWM实现原理对比 …...

openCV中如何实现滤波

图像滤波用于去除噪声和图像平滑&#xff0c;OpenCV 提供了多种滤波器&#xff1a; 1.1. 均值滤波&#xff1a; import cv2# 读取图像 image cv2.imread("example.jpg")# 均值滤波 blurred_image cv2.blur(image, (5, 5)) # (5, 5) 是滤波核的大小 滤波核大小的…...

BGP配置华为——路由汇总

实验拓扑 实验要求 1.R1,R2,R3间运行BGP&#xff0c;搭建EBGP邻居 2.R3一段的网络实现自动聚合&#xff0c;R1一端的网络实现手动路由聚合 3.启用as-set防环 实验配置 配置相关IP 过程省略&#xff0c;结果如图 R1 R2 R3 配置EBGP [R1]bgp 100 [R1-bgp]router 10.10.1…...

机器学习核心算法解析

机器学习核心算法解析 机器学习是人工智能的核心技术之一&#xff0c;它通过从数据中学习模式并做出预测或决策。本文将深入解析机器学习的核心算法&#xff0c;包括监督学习、无监督学习和强化学习&#xff0c;并通过具体案例和代码示例帮助读者理解这些算法的实际应用。 1. …...

【C++学习篇】C++11

目录 ​编辑 1. 初始化列表{} 1.1 C98中的{} 1.2 C11中的{} 2. C11中的std::initializer_list 3. 右值引用和移动语义 3.1 左值和右值 3.2 左值引用和右值引用 3.3 引用延长生命周期 3.4 左值和右值的参数匹配 3.5 右值引⽤和移动语义的使⽤场景 3.5.1 左值引⽤…...

SQLite 数据库:优点、语法与快速入门指南

文章目录 一、引言二、SQLite 的优点 &#x1f4af;三、SQLite 的基本语法3.1 创建数据库3.2 创建表3.3 插入数据3.4 查询数据3.5 更新数据3.6 删除数据3.7 删除表 四、快速入门指南4.1 安装 SQLite4.2 创建数据库4.3 创建表4.4 插入数据4.5 查询数据4.6 更新数据4.7 删除数据4…...

Java 语言特性(面试系列1)

一、面向对象编程 1. 封装&#xff08;Encapsulation&#xff09; 定义&#xff1a;将数据&#xff08;属性&#xff09;和操作数据的方法绑定在一起&#xff0c;通过访问控制符&#xff08;private、protected、public&#xff09;隐藏内部实现细节。示例&#xff1a; public …...

React Native在HarmonyOS 5.0阅读类应用开发中的实践

一、技术选型背景 随着HarmonyOS 5.0对Web兼容层的增强&#xff0c;React Native作为跨平台框架可通过重新编译ArkTS组件实现85%以上的代码复用率。阅读类应用具有UI复杂度低、数据流清晰的特点。 二、核心实现方案 1. 环境配置 &#xff08;1&#xff09;使用React Native…...

如何在看板中有效管理突发紧急任务

在看板中有效管理突发紧急任务需要&#xff1a;设立专门的紧急任务通道、重新调整任务优先级、保持适度的WIP&#xff08;Work-in-Progress&#xff09;弹性、优化任务处理流程、提高团队应对突发情况的敏捷性。其中&#xff0c;设立专门的紧急任务通道尤为重要&#xff0c;这能…...

将对透视变换后的图像使用Otsu进行阈值化,来分离黑色和白色像素。这句话中的Otsu是什么意思?

Otsu 是一种自动阈值化方法&#xff0c;用于将图像分割为前景和背景。它通过最小化图像的类内方差或等价地最大化类间方差来选择最佳阈值。这种方法特别适用于图像的二值化处理&#xff0c;能够自动确定一个阈值&#xff0c;将图像中的像素分为黑色和白色两类。 Otsu 方法的原…...

vue3+vite项目中使用.env文件环境变量方法

vue3vite项目中使用.env文件环境变量方法 .env文件作用命名规则常用的配置项示例使用方法注意事项在vite.config.js文件中读取环境变量方法 .env文件作用 .env 文件用于定义环境变量&#xff0c;这些变量可以在项目中通过 import.meta.env 进行访问。Vite 会自动加载这些环境变…...

精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南

精益数据分析&#xff08;97/126&#xff09;&#xff1a;邮件营销与用户参与度的关键指标优化指南 在数字化营销时代&#xff0c;邮件列表效度、用户参与度和网站性能等指标往往决定着创业公司的增长成败。今天&#xff0c;我们将深入解析邮件打开率、网站可用性、页面参与时…...

【Java学习笔记】BigInteger 和 BigDecimal 类

BigInteger 和 BigDecimal 类 二者共有的常见方法 方法功能add加subtract减multiply乘divide除 注意点&#xff1a;传参类型必须是类对象 一、BigInteger 1. 作用&#xff1a;适合保存比较大的整型数 2. 使用说明 创建BigInteger对象 传入字符串 3. 代码示例 import j…...

用机器学习破解新能源领域的“弃风”难题

音乐发烧友深有体会&#xff0c;玩音乐的本质就是玩电网。火电声音偏暖&#xff0c;水电偏冷&#xff0c;风电偏空旷。至于太阳能发的电&#xff0c;则略显朦胧和单薄。 不知你是否有感觉&#xff0c;近两年家里的音响声音越来越冷&#xff0c;听起来越来越单薄&#xff1f; —…...

AGain DB和倍数增益的关系

我在设置一款索尼CMOS芯片时&#xff0c;Again增益0db变化为6DB&#xff0c;画面的变化只有2倍DN的增益&#xff0c;比如10变为20。 这与dB和线性增益的关系以及传感器处理流程有关。以下是具体原因分析&#xff1a; 1. dB与线性增益的换算关系 6dB对应的理论线性增益应为&…...

C++:多态机制详解

目录 一. 多态的概念 1.静态多态&#xff08;编译时多态&#xff09; 二.动态多态的定义及实现 1.多态的构成条件 2.虚函数 3.虚函数的重写/覆盖 4.虚函数重写的一些其他问题 1&#xff09;.协变 2&#xff09;.析构函数的重写 5.override 和 final关键字 1&#…...