【挑战项目】 --- 微服务编程测评系统(在线OJ系统)(二)
三十二、Swagger介绍&使用
官网:https://swagger.io/
什么是swagger
Swagger是一个接口文档生成工具,它可以帮助开发者自动生成接口文档。当项目的接口发生变更时,Swagger可以实时更新文档,确保文档的准确性和时效性。Swagger还内置了测试功能,开发者可以直接在文档中测试接口,无需编写额外的测试代码。
引入swagger
- 在oj-common下创建oj-common-swagger子module
- 导入依赖(放在这个模块的pom文件就可以了)
-
<dependency><groupId>org.springdoc</groupId><artifactId>springdoc-openapi-starter-webmvc-ui</artifactId><version>2.2.0</version> </dependency>
- 录入配置
-
@Configuration public class SwaggerConfig {@Beanpublic OpenAPI openAPI() {return new OpenAPI().info(new Info().title("在线oj系统").description("在线oj系统接⼝⽂档").version("v1"));} }
具体服务引⼊:
由于system模块要用到这个swagger组件,
因此将刚刚封装的swagger的这个组件也引入到要用的微服务中也就是引入到
system的pom文件中。
<dependency><groupId>com.qyy</groupId><artifactId>oj-common-swagger</artifactId><version>${oj-common-swagger.version}</version></dependency>
swagger基本注解
@Tag
- 介绍:用于给接口分组,用途类似于为接口文档添加标签。
- 用于:方法、类、接口。
- 常用属性:
name
:分组的名称@RestController @RequestMapping("/sysUser") @Tag(name = "管理员接口") public class SysUserController extends BaseController {
@Operation
- 介绍:用于描述接口的操作。
- 用于:方法。
- 常用属性:
summary
:操作的摘要信息。description
:操作的详细描述。 @Operation(summary = "管理员登录", description = "根据账号密码进行管理员登录")//controller层如果介绍的是body 参数 需要使用@RequestBody注解public R<String> login(@RequestBody LoginDTO loginDTO) {return sysUserService.login(loginDTO.getUserAccount(), loginDTO.getPassword());}
@Parameters
- 介绍:用于指定
@Parameter
注解对象数组,描述操作的输入参数。- 用于:方法。
@Parameters(value = {@Parameter(name = "userId", in = ParameterIn.PATH, description = "用户ID")})public R<Void> delete(@PathVariable Long userId) {return null;}
@Parameter
- 介绍:用于描述输入参数。
- 用于:方法。
- 常用属性:
name
:参数的名称。in
:参数的位置,可以是path
、query
、header
、cookie
中的一种。description
:参数的描述。@Parameters(value = {@Parameter(name = "userId", in = ParameterIn.PATH, description = "用户ID")})public R<Void> delete(@PathVariable Long userId) {return null;}
@ApiResponse
- 介绍:用于描述操作的响应结果。
- 用于:方法。
- 常用属性:
- responseCode:响应的状态码。
- description:响应的描述。
@ApiResponse(responseCode = "1000", description = "操作成功")@ApiResponse(responseCode = "2000", description = "服务繁忙请稍后重试")@ApiResponse(responseCode = "3102", description = "用户不存在")@ApiResponse(responseCode = "3103", description = "用户名或密码错误")//controller层如果介绍的是body 参数 需要使用@RequestBody注解public R<String> login(@RequestBody LoginDTO loginDTO) {return sysUserService.login(loginDTO.getUserAccount(), loginDTO.getPassword());}
@Schema
- 介绍:用于描述数据模型的属性。
- 用于:方法、类、接口。
- 常用属性:
- description:响应的描述。
@Getter @Setter public class SysUserSaveDTO {@Schema(description = "用户账号")private String userAccount;@Schema(description = "用户密码")private String password; }
为了让SwaggerConfig生效(外部bean让Spring能扫描到)
在oj-common-swagger模块下的 resources 下创建
META-INF.spring包
再创建org.springframework.boot.autoconfigure.AutoConfiguration.imports⽂件
在里面写上路径
com.qyy.swagger.SwaggerConfig;
生成当前接口文档的地址
服务器运行之后,在浏览器输入地址:例如我的地址就是
http://localhost:1208/swagger-ui/index.html
三十三、 管理员登录-接口测试01
如何用swagger进行测试呢
我们使用login接口进行测试
测试内容如下:
1.登录成功
2.账号和密码错误
controller层
代码如下,传入两个参数
loginDTO.getUserAccount(), loginDTO.getPassword()
用户名和密码
DTO就代表是前端传给服务器的数据
@PostMapping("/login") //安全@Operation(summary = "管理员登录", description = "根据账号密码进行管理员登录")@ApiResponse(responseCode = "1000", description = "操作成功")@ApiResponse(responseCode = "2000", description = "服务繁忙请稍后重试")@ApiResponse(responseCode = "3102", description = "用户不存在")@ApiResponse(responseCode = "3103", description = "用户名或密码错误")//controller层如果介绍的是body 参数 需要使用@RequestBody注解public R<String> login(@RequestBody LoginDTO loginDTO) {return sysUserService.login(loginDTO.getUserAccount(), loginDTO.getPassword());}
Service层
ISysUserService类
这是接口
R<String> login(String userAccount, String password);
SysUserServiceImpl类
这是接口的实现
@Override//维护性、性能、安全public R<String> login(String userAccount, String password) {
// try {
// FileInputStream inputStream = new FileInputStream("a.txt");
// } catch (FileNotFoundException e) {
// throw new RuntimeException(e);
// }
// int a = 100 / 0;//通过账号去数据库中查询,对应的用户信息LambdaQueryWrapper<SysUser> queryWrapper = new LambdaQueryWrapper<>();//select password from tb_sys_user where user_account = #{userAccount}SysUser sysUser = sysUserMapper.selectOne(queryWrapper.select(SysUser::getUserId, SysUser::getPassword, SysUser::getNickName).eq(SysUser::getUserAccount, userAccount));
// R loginResult = new R();if (sysUser == null) {
// loginResult.setCode(ResultCode.FAILED_USER_NOT_EXISTS.getCode());
// loginResult.setMsg(ResultCode.FAILED_USER_NOT_EXISTS.getMsg());
// return loginResult;return R.fail(ResultCode.FAILED_USER_NOT_EXISTS);}if (BCryptUtils.matchesPassword(password, sysUser.getPassword())) {
// loginResult.setCode(ResultCode.SUCCESS.getCode());
// loginResult.setMsg(ResultCode.SUCCESS.getMsg());
// return loginResult;// jwttoken = 生产jwttoken的方法return R.ok(tokenService.createToken(sysUser.getUserId(),secret, UserIdentity.ADMIN.getValue(), sysUser.getNickName(), null));}
// loginResult.setCode(ResultCode.FAILED_LOGIN.getCode());
// loginResult.setMsg(ResultCode.FAILED_LOGIN.getMsg());
// return loginResult;return R.fail(ResultCode.FAILED_LOGIN);}
点击try it out 就可以传入用户名和密码
如图返回结果是用户名和密码错误
这是因为数据库中我们存储的密码并不是加密后的。因此密码对应不上
三十四、Apifox介绍&使用
Apifox = Postman + Swagger + Mock + JMeter
Apifox 简介
Apifox 是一款集 API 文档管理、调试、Mock、自动化测试于一体的开发工具,旨在为开发者、测试人员和前端/后端工程师提供一站式 API 开发解决方案。它结合了类似 Postman 的 API 调试功能、Swagger 的文档生成功能以及 Mock 数据服务,极大地提升了团队协作效率和 API 开发体验。
添加接口
设置环境
设置值
读取变量
发送数据(测试成功)
设置响应数据模型
在响应中引入数据模型
隐藏字段
解除关联
单个解除关联:就可以对响应数据进行修改,但不能修改名称
整体解除关联:那么就都可以修改了
Apifox 的核心功能
1. API 文档管理
- Apifox 支持基于 OpenAPI(原 Swagger)标准的 API 文档定义。
- 提供直观的可视化界面,方便开发者快速编写和维护 API 文档。
- 自动生成 API 请求示例代码(如 cURL、JavaScript、Python 等),便于集成到不同开发环境。
- 支持团队协作,多人可以同时编辑和查看文档。
2. API 调试
- 类似于 Postman 的功能,允许用户直接在 Apifox 中发送 HTTP 请求并查看响应结果。
- 支持多种请求方法(GET、POST、PUT、DELETE 等)和复杂的请求参数设置。
- 内置环境变量管理功能,方便切换不同的开发、测试和生产环境。
- 自动保存历史记录,便于回溯和复用请求。
3. Mock 数据
- 根据 API 文档自动生成 Mock 数据,无需手动配置。
- 支持自定义 Mock 规则,满足复杂的业务需求。
- Mock 服务支持动态生成数据,例如随机字符串、时间戳、枚举值等。
- 无需后端开发完成即可进行前端开发,提升开发效率。
4. 自动化测试
- 提供强大的 API 自动化测试功能,支持断言、参数提取、全局变量等功能。
- 测试用例可按顺序执行,支持批量运行。
- 测试结果以清晰的报告形式展示,便于分析和优化。
- 支持 CI/CD 集成,将自动化测试嵌入到持续集成流程中。
5. 团队协作
- 支持多人在线协作,团队成员可以共享 API 文档、测试用例和环境配置。
- 提供权限管理功能,确保不同角色的用户只能访问其权限范围内的资源。
- 版本控制功能,支持 API 文档的历史版本管理。
6. 插件与扩展
- Apifox 提供丰富的插件生态,用户可以根据需求扩展功能。
- 支持与其他工具(如 Git、Jenkins 等)集成,进一步增强开发和测试能力。
Apifox 的优势
-
一体化工具
Apifox 将 API 文档管理、调试、Mock 和测试功能整合到一个平台中,避免了在多个工具之间切换的麻烦。 -
易用性
提供直观的图形化界面,即使是初学者也能快速上手。 -
高效开发
Mock 数据和自动化测试功能显著缩短了前后端联调的时间,提高了开发效率。 -
团队协作友好
强大的团队协作功能使得跨部门沟通更加顺畅,减少了信息不对称的问题。 -
跨平台支持
Apifox 支持 Windows、macOS 和 Linux,覆盖主流操作系统。
适用场景
-
前后端分离项目
在前后端分离的开发模式下,Apifox 可以帮助前端开发者通过 Mock 数据快速启动开发,而无需等待后端接口完成。 -
API 文档维护
对于需要长期维护的 API 项目,Apifox 提供了一个集中化的平台来管理所有 API 文档。 -
接口测试与自动化
测试人员可以利用 Apifox 的自动化测试功能对 API 进行回归测试,确保接口的稳定性和可靠性。 -
微服务架构
在微服务架构中,Apifox 可以帮助团队统一管理多个服务的 API 接口,并提供高效的调试和测试能力。
Apifox vs 其他工具
总结
Apifox 是一款功能强大且易于使用的 API 工具,特别适合需要高效协作和全流程 API 管理的团队。无论是开发、测试还是文档维护,Apifox 都能够为用户提供极大的便利。如果你正在寻找一款能够替代 Postman 和 Swagger 的工具,Apifox 无疑是一个值得尝试的选择。
三十五、管理员登录-代码优化-加密算法介绍
管理员登录:还要考虑可维护性、性能、安全
这里重点讨论
安全问题
数据库中我们如果存储密码的明文,那么黑客如果拿到数据库,就可以随意登录管理员页面,或者即使是内部人员看到也是不可以的。
简介
加密算法是一种将明文转换为密文的过程,以保护数据的安全性和机密性。
作用
- 安全性:存储明文密码是非常不安全的。如果数据库被非法访问或泄露,攻击者可以直接获取所有用户的密码。
- 减少内部风险:即使企业内有不诚实的员工或管理员,他们也无法轻易获取其他管理员的密码,因为密码是加密存储的。
- 提升用户信任度。密码加密有助于提升用户对网站或应用程序的信任感,使其更愿意使用加密保护的网站。
常见的加密算法:
- 可逆算法:一种可以将加密后的密文还原为原始明文的算法。
- 对称算法:对称加密(也叫私钥加密)指加密和解密使用相同密钥的加密算法。它要求发送方和接收方在安全通信之前,商定一个密钥。对称算法的安全性依赖于密钥,泄漏密钥就意味着任何人都可以对他们发送或接收的消息解密,所以密钥的保密性对通信的安全性至关重要。
- 非对称算法:非对称加密是指需要两个密钥来进行加密和解密,这两个秘钥分别是公钥(public key)和私钥(private key),如果用公钥对数据进行加密,只有用对应的私钥才能解密。
- 不可逆算法:一种无法将加密后的密文还原为原始明文的算法。
- 单向散列(hash)加密:是指把任意长的输入串变化成固定长的输出串,并且由输出串难以得到输入串的加密方法。广泛应用于对敏感数据加密,比如用户密码,请求参数,文件加密等。
BCrypt
Bcrypt是一种哈希加密算法,被广泛应用于存储密码和进行身份验证。并且Bcrypt算法包含一个重要特性即每次生成的哈希值都不同,这是由于Bcrypt算法在计算时会先生成一个随机的盐值与用户密码一起参与计算最终得到一个加密后的字符串。由于生成的盐值是随机的,所以即使每次使用相同的密码得到结果也是不同的。这样可以有效的防止攻击者使用一些手段破解用户密码。
package com.qyy.system.utils;import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;/*** 加密算法工具类*/
public class BCryptUtils {/*** 生成加密后密文** @param password 密码* @return 加密字符串*/public static String encryptPassword(String password) {BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder();return passwordEncoder.encode(password);// 加密}/*** 判断密码是否相同** @param rawPassword 真实密码* @param encodedPassword 加密后密文* @return 结果*/public static boolean matchesPassword(String rawPassword, String encodedPassword) {BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder();return passwordEncoder.matches(rawPassword, encodedPassword);// 密码匹配}public static void main(String[] args) {System.out.println(encryptPassword("123"));System.out.println(matchesPassword("123", "$2a$10$Nm0bAesQKuPt5CWijLVbmOb5FXxRuoFUbHNwupVp.8DqbYQjf8iUW"));}}
}
三十六、管理员登录-代码优化-加密算法使用
在SysUserServiceImpl类中
修改login方法,借助BCryptUtils.matchesPassword()方法,来判断
用户输入密码是否正确
@Override//维护性、性能、安全public R<String> login(String userAccount, String password) {//通过账号去数据库中查询,对应的用户信息LambdaQueryWrapper<SysUser> queryWrapper = new LambdaQueryWrapper<>();//select password from tb_sys_user where user_account = #{userAccount}SysUser sysUser = sysUserMapper.selectOne(queryWrapper.select(SysUser::getUserId, SysUser::getPassword, SysUser::getNickName).eq(SysUser::getUserAccount, userAccount));return R.fail(ResultCode.FAILED_USER_NOT_EXISTS);}if (BCryptUtils.matchesPassword(password, sysUser.getPassword())) {return R.ok();}return R.fail(ResultCode.FAILED_LOGIN);}
测试成功
封装返回结果
封装返回方法
package com.qyy.common.core.domain;import com.qyy.common.core.enums.ResultCode;
import lombok.Getter;
import lombok.Setter;//接口文档
@Getter
@Setter
public class R<T> {private int code; //定义一些固定的code,前后端商量好的 0 1 请求成功 常量 2 3 枚举private String msg; //? 通常是code的辅助说明 一个code 对应一个msgprivate T data; //请求某个接口返回的数据list SysUser 泛型//将封装result的封装方法可以写到R里面
// loginResult.setCode(ResultCode.FAILED_USER_NOT_EXISTS.getCode());
// loginResult.setMsg(ResultCode.FAILED_USER_NOT_EXISTS.getMsg());
// return loginResult;public static <T> R<T> ok() {return assembleResult(null, ResultCode.SUCCESS);}public static <T> R<T> ok(T data) {return assembleResult(data, ResultCode.SUCCESS);}public static <T> R<T> fail() {return assembleResult(null, ResultCode.FAILED);}public static <T> R<T> fail(int code, String msg) {return assembleResult(code, msg, null);}/*** 指定错误码** @param resultCode 指定错误码* @param <T>* @return*/public static <T> R<T> fail(ResultCode resultCode) {return assembleResult(null, resultCode);}private static <T> R<T> assembleResult(T data, ResultCode resultCode) {R<T> r = new R<>();r.setCode(resultCode.getCode());r.setData(data);r.setMsg(resultCode.getMsg());return r;}private static <T> R<T> assembleResult(int code, String msg, T data) {R<T> r = new R<>();r.setCode(code);r.setData(data);r.setMsg(msg);return r;}
}
三十七、全局异常处理
思考一下,前面写的代码还有啥问题:
就是我们没有考虑异常出现的时候
例如:
发现代码中有
int a = 100 / 0;
项目依然可以跑起来,但是实际上我们都知道,代码执行到这里可以是会报错的。
那么如果这个错误不明显,不像int a = 100 / 0;
那么我们要找到这个错误是一件很困难的事情
注意:判断密码错误等不属于异常,这只是逻辑错误的判断
如果都加try catch会让代码变得很丑陋,因此我们要使用全局异常处理
异常:
- 编译时异常
- 运行时异常
在oj-common下,创建oj-common-security子工程
创建GlobalExceptionHandler类
@RestControllerAdvice注解
:当抛出异常时,
@RestControllerAdvice
标注的类将被自动调用,并根据异常类型和处理程序的注解来决定如何处理该异常。这使得开发者可以在整个应用程序范围内统一处理异常。
@ExceptionHandler注解
:
@ExceptionHandler
一般与@RestControllerAdvice
配合使用,使用其来捕获和处理不同类型的异常。注意:
1.我们尽量将抛出的异常都使用自定义异常,这样便于在异常处理处进行异常处理,比如统一返回json格式,或者统一进行日志记录等。
2.对于其他微服务来讲,它也是外部bean,因此要加上这个文件,才能将这个bean交给Spring容器去管理
3.为了让用户不看到我们的后台具体出什么问题了,因此就返回一个服务器异常就行了,而我们程序员就看日志的错误就行了
package com.qyy.common.security.handler;import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.StrUtil;
import com.qyy.common.core.domain.R;
import com.qyy.common.core.enums.ResultCode;
import com.qyy.common.security.exception.ServiceException;
import jakarta.servlet.http.HttpServletRequest;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.support.DefaultMessageSourceResolvable;
import org.springframework.validation.BindException;
import org.springframework.web.HttpRequestMethodNotSupportedException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;import java.util.Collection;
import java.util.Objects;
import java.util.function.Function;
import java.util.stream.Collectors;/*** 全局异常处理器*/
@RestControllerAdvice//全局异常处理器
@Slf4j
//我们尽量将抛出的异常都使用自定义异常,这样便于在异常处理处进行异常处理,比如统一返回json格式,或者统一进行日志记录等。
public class GlobalExceptionHandler {/*** 请求方式不支持*/@ExceptionHandler(HttpRequestMethodNotSupportedException.class)public R<?> handleHttpRequestMethodNotSupported(HttpRequestMethodNotSupportedException e,HttpServletRequest request) {String requestURI = request.getRequestURI();log.error("请求地址'{}',不支持'{}'请求", requestURI, e.getMethod());return R.fail(ResultCode.ERROR);}//拦截业务异常@
相关文章:
【挑战项目】 --- 微服务编程测评系统(在线OJ系统)(二)
三十二、Swagger介绍&使用 官网:https://swagger.io/ 什么是swagger Swagger是一个接口文档生成工具,它可以帮助开发者自动生成接口文档。当项目的接口发生变更时,Swagger可以实时更新文档,确保文档的准确性和时效性。Swagger还内置了测试功能,开发者可以直接在文档中…...
Unity背景随着文字变化而变化
组件结构: 背景(父)需要添加如下两个组件 根据具体情况选择第一个组件水平还是垂直,一般垂直用的比较多 效果展示: 此时在文本框中改变内容背景图都会随着变化,动态的...
Elasticsearch内存管理与JVM优化:原理剖析与最佳实践
#作者:孙德新 文章目录 一、Elasticsearch缓存分类1、Node Query Cache:2、Shard Request Cache:3、Fielddata Cache: 三、内存常见的问题案例一案例二案例三案例四 四、内参分配最佳实践1、jvm heap分配2、将机器上少于一半的内…...
快速开发-基于Gin框架搭建web应用
一、概述 Go 语言的 Gin 框架是一个用 Go (Golang) 编写的 Web 框架,它旨在提供一种快速、简洁且高效的方式来构建 Web 应用程序。Gin 框架以其高性能和易用性而闻名,非常适合构建 API 服务、Web 服务和其他需要高性能的 Web 应用。 二、Gin框架…...
【RAG】RAG系统——langchain 的用法(说人话版与专业版)
说人话版: RAG就是一句话:对数据设置索引,用问题去检索,用llm生成回答 首先,做本地知识库 注意: py 3.10以上 配置环境变量,安装库 load外部数据,存储到本地的一个index里(这是最…...
pycharm无法直接识别wsl
原因是我的2020 无法支持这个版本的wsl 我就换成2024版 添加中可以看到 on wsl 如果你想切到自己创建的虚拟环境 你在下面这个界面选择conda就好 这样就可以切换成你想要的环境了...
数据结构每日一题day17(链表)★★★★★
题目描述:假设有两个按元素值递增次排列的线性表,均以单链表形式存储。请编与算法将这两个单链表归并为一个按元素值依次递减排列的单链表,并要求利用原来两个单链表的结点存放归并后的单链表。 算法思想: 1.初始化: 创建一个新…...
遗传算法(GA)
基本原理 算法介绍 遗传算法(Genetic Algorithm,简称GA)是一种基于自然选择和遗传学原理的搜索和优化技术。它模拟了生物进化过程,通过选择、交叉(重组)和变异等操作,逐步优化问题的解。 遗传…...
EPS三维测图软件
EPS三维测图软件EPS2016...
设计模式-命令模式
写在前面 Hello,我是易元,这篇文章是我学习设计模式时的笔记和心得体会。如果其中有错误,欢迎大家留言指正! 一、什么是命令模式? 命令模式是行为模式中的一种,通过将请求封装成对象,使开发者可…...
深入理解主从数据库架构与主从复制
目录 前言1. 主从数据库概述1.1 什么是主从数据库?1.2 主从数据库的应用场景 2. 主从数据库的工作原理2.1 主从数据库的读写分离2.2 数据同步机制2.3 异步与同步复制模式 3. 主从复制的实现步骤3.1 配置主库3.2 配置从库 4. 主从数据库架构的优缺点4.1 优点4.2 缺点…...
【C】初阶数据结构15 -- 计数排序与稳定性分析
本文主要讲解七大排序算法之外的另一种排序算法 -- 计数排序 目录 1 计数排序 1) 算法思想 2) 代码 3) 时间复杂度与空间复杂度分析 (1) 时间复杂度 (2) 空间复杂度 4) 计…...
@PostConstruct @PreDestroy
PostConstruct 是 Java EE(现 Jakarta EE)中的一个注解,用于标记一个方法在对象初始化完成后立即执行。它在 Spring 框架、Java Web 应用等场景中广泛使用,主要用于资源初始化、依赖注入完成后的配置等操作。 1. 基本作用 执行时…...
2025数维杯数学建模A题完整限量论文:空中芭蕾——蹦床运动的力学行为分析
2025数维杯数学建模A题完整限量论文:空中芭蕾——蹦床运动的力学行为分析 ,先到先得 A题完整论文https://www.jdmm.cc/file/2712067/ 蹦床( Trampoline )是一项运动员利用蹦床的反弹,在空中展示技能 技巧的竞技运动&…...
Kubernetes Gateway API 部署详解:从入门到实战
引言 在 Kubernetes 中管理网络流量一直是一个复杂而关键的任务。传统的 Ingress API 虽然广泛使用,但其功能有限且扩展性不足。Kubernetes Gateway API 作为新一代标准,提供了更强大的路由控制能力,支持多协议、跨命名空间路由和细粒度的流量管理。本文将带你从零开始部署…...
移动设备常用电子屏幕类型对比
概述 LCD 家族 (TN、STN、TFT、IPS、VA)依赖背光,性能差异主要来自液晶排列和驱动方式。OLED 以自发光为核心优势,但成本与寿命限制其普及。E-Paper 专为低功耗静态显示设计,与传统屏幕技术差异显著。 参数LCD&#…...
HarmonyOS开发-组件市场
1. HarmonyOS开发-组件市场 HarmonyOS NEXT开源组件市场是一个独立的插件,需通过DevEco Studio进行安装,可以点击下载,无需解压,直接通过zip进行安装,具体安装和使用方法可参考HarmonyOsNEXT组件市场使用说明。Harmony…...
效果图云渲染:价格、优势与使用技巧
对于做3D设计来说,渲染效果图会占用设计电脑的资源,如果能免去这个环节就好了。用设计电脑渲不仅拖慢电脑速度,遇到紧急情况无法快速渲染出来还可能耽误进度。而云渲染的出现,正是针对这个点——渲的快,价格便宜&#…...
OptiStruct实例:声振耦合超单元应用
如图10-11所示,本例采用一个简化的整车模型,模型分为车身(含声腔)与底盘两部分。首先分别运用CMS与CDS方法对车身(含声腔)模型进行缩聚,生成.h3d格式的CMS超单元和cps超单元,然后进行…...
排序算法-插入排序
插入排序是一种简单直观的排序算法,其核心思想是将未排序部分的元素逐个插入到已排序部分的正确位置,类似于整理扑克牌。 插入排序步骤 初始化:将序列的第一个元素视为已排序部分,其余为未排序部分。 选择元素:从未排…...
Uniapp Android/IOS 获取手机通讯录
介绍 最近忙着开发支付宝小程序和app,下面给大家介绍一下 app 获取通讯录的全部过程吧,也是这也是我app开发中的一项需求吧。 效果图如下 勾选配置文件 使用uniapp开发的童鞋都知道有一个配置文件 manifest.json 简单的说一下,就是安卓/ios/…...
【RAG】index环节中 关于嵌入模型和 ColBERT
1. 什么是嵌入模型?是不是把数据源转换为向量表示的模型? 是的,嵌入模型(Embedding Model)的核心功能就是将各种类型的数据(例如,文本、图像、音频等)转换成低维、稠密的向量表示。…...
一文掌握 LVGL 9 的源码目录结构
文章目录 📂 一文掌握 LVGL 9 的源码目录结构🧭 顶层目录概览📁 1. src/ — LVGL 的核心源码(🔥重点)📁 2. examples/ — API 示例📁 3. demos/ — 综合演示项目📁 4. do…...
ROS1 和 ROS2 在同一个系统中使用
一、环境变量设置 echo "ros noetic(1) or ros2 foxy(2)?" read edition if [ "$edition" -eq "1" ]; thensource /opt/ros/noetic/setup.bash elsesource /opt/ros/foxy/setup.bash fi 二、针对不同的ROS版本创建不同的工作空间work space...
Redis 8.0携新功能,重新开源
01 引言 Redis从7.4版本起,将开源许可证改成 RSALv2(Redis 源代码可用许可证)与 SSPLv1(服务器端公共许可证)的双重授权策略。简单来说,就是不能随意商用。为了抵制Redis,Redis的替代品Valkey、…...
AD原理图复制较多元器件时报错:“InvalidParameter Exception Occurred In Copy”
一、问题描述 AD原理图复制较多元器件时报错:AD原理图复制较多元器件时报错:“InvalidParameter Exception Occurred In Copy”。如下图 二、问题分析 破解BUG。 三、解决方案 1、打开参数配置 2、打开原理图优先项中的通用配置,取消勾选G…...
【wpf】12 在WPF中实现HTTP通信:封装HttpClient的最佳实践
一、背景介绍 在现代桌面应用开发中,网络通信是不可或缺的能力。WPF作为.NET平台下的桌面开发框架,可通过HttpClient轻松实现与后端API的交互。本文将以一个实际的HttpsMessages工具类为例,讲解如何在WPF中安全高效地封装HTTP通信模块。 二、…...
从概念表达到安全验证:智能驾驶功能迎来系统性规范
随着辅助驾驶事故频发,监管机制正在迅速补位。面对能力表达、使用责任、功能部署等方面的新要求,行业开始重估技术边界与验证能力,数字样机正成为企业合规落地的重要抓手。 2025年以来,围绕智能驾驶功能的争议不断升级。多起因辅…...
金贝灯光儿童摄影3大布光方案,解锁专业级童趣写真
随着亲子消费的持续升温,儿童摄影行业对高效、专业、灵活的专业灯光需求日益迫切。为精准解决儿童拍摄中孩子好动难配合、氛围单调、出片效率低下等痛点,深耕影像光源行业三十年,拥有丰富的商业人像摄影灯光解决方案的金贝品牌,近…...
双端口ram与真双端口ram的区别
端口独立性 真双端口RAM:拥有两个完全独立的读写端口(Port A和Port B),每个端口都有自己的地址总线、数据总线、时钟、使能信号和写使能信号。这意味着两个端口可以同时进行读写操作,且互不干扰。 伪双端口RAM&…...
Java设计模式之单例模式:从入门到精通
一、单例模式概述 1.1 什么是单例模式 定义:单例模式(Singleton Pattern)是一种创建型设计模式,它确保一个类只有一个实例,并提供一个全局访问点来访问这个实例。 专业解释:单例模式通过限制类的实例化过程,保证在整个应用程序生命周期中,某个类最多只有一个实例存在,…...
sqli-labs靶场18-22关(http头)
目录 less18(user-agent) less19(referer) less20(cookie) less21(cookie) less22(cookie) less18(user-agent) 这里尝试了多次…...
【图像大模型】Stable Diffusion Web UI:深度解析与实战指南
Stable Diffusion Web UI:深度解析与实战指南 一、项目概述核心功能 二、项目运行方式与执行步骤1. 环境准备2. 安装步骤在Windows上安装在Linux上安装 3. 使用Web UI 三、执行报错及问题解决方法1. Python版本不兼容2. CUDA未正确安装3. 依赖库安装失败4. 内存不足…...
Linux 学习笔记1
Linux 学习笔记1 一、用户和用户组管理用户组操作用户操作 二、文件权限管理权限查看权限修改归属权修改 三、系统快捷操作四、软件管理包管理工具服务管理 五、文件系统操作软链接 六、时间管理七、网络管理基础命令端口与进程进程管理 八、环境变量基础操作 九、其他重要概念…...
单例模式的两种设计
单例模式确保一个类只有一个实例,并提供一个全局访问点。 1. 饿汉模式 (Eager Initialization) 饿汉模式在程序启动时就创建实例,线程安全。 cpp class EagerSingleton { public:// 删除拷贝构造函数和赋值运算符EagerSingleton(const EagerSingleton…...
【HarmonyOS NEXT+AI】问答05:ArkTS和仓颉编程语言怎么选?
在“HarmonyOS NEXTAI大模型打造智能助手APP(仓颉版)”课程里面,有学员提到了这样一个问题: 鸿蒙的主推开发语言不是ArkTS吗,本课程为什么使用的是仓颉编程语言? 这里就这位同学的问题,统一做下回复,以方便…...
20250509 相对论中的\*\*“无空间”并非真实意义上的虚无,而是时空结构尚未形成\*\*的状态。 仔细解释下这个
相对论中的**“无空间”并非真实意义上的虚无,而是时空结构尚未形成**的状态。 仔细解释下这个 相对论中的“无空间”这一概念,严格来说并非绝对的虚无,而是指在物理学上时空结构尚未形成或无法定义的状态。这种状态通常出现在宇宙起源和黑洞…...
T-SQL在SQL Server中判断表、字段、索引、视图、触发器、Synonym等是否存在
SQL Server创建或者删除表、字段、索引、视图、触发器前判断是否存在。 目录 1. SQL Server创建表之前判断表是否存在 2. SQL Server新增字段之前判断是否存在 3. SQL Server删除字段之前判断是否存在 4. SQL Server新增索引之前判断是否存在 5. SQL Server判断视图是否存…...
C——数组和函数实践:扫雷
此篇博客介绍用C语言写一个扫雷小游戏,所需要用到的知识有:函数、数组、选择结构、循环结构语句等。 所使用的编译器为:VS2022。 一、扫雷游戏是什么样的,如何玩扫雷游戏? 如图,是一个标准的扫雷游戏初始阶段。由此…...
Java中的分布式缓存与Memcached集成实战
一、概述 分布式缓存是提升系统性能和扩展性的关键技术之一。Memcached作为一种高性能的分布式内存对象缓存系统,在许多场景下被广泛使用。本文将深入探讨如何在Java项目中集成Memcached,实现高效的分布式缓存。 二、Memcached简介 Memcached是一种高…...
OpenCV播放摄像头视频
OpenCV计算机视觉开发实践:基于Qt C - 商品搜索 - 京东 播放摄像头视频和播放视频文件类似,也是通过类VideoCapture来实现,只不过调用open的时候传入的是摄像头的索引号。如果计算机安装了一个摄像头,则open的第一个参数通常是0&…...
[计算机科学#13]:算法
【核知坊】:释放青春想象,码动全新视野。 我们希望使用精简的信息传达知识的骨架,启发创造者开启创造之路!!! 内容摘要: 算法是解决问题的系统化步骤,不同的问题…...
git相关
1.将 dev 变基到 origin/master git rebase 是一个本地操作,它只会修改你当前所在分支的提交历史,而不会直接影响远程仓库或任何其他分支。 保持提交历史的线性和整洁: 这是 git rebase 最主要的目的。 想象一下 dev 分支是从 master 分支分…...
Web端项目系统访问页面很慢,后台数据返回很快,网络也没问题,是什么导致的呢?
Web端访问缓慢问题诊断指南(测试工程师专项版) ——从浏览器渲染到网络层的全链路排查方案 一、问题定位黄金法则(前端性能四象限) 1. [网络层] 数据返回快 ≠ 资源加载快(检查Content Download时间) 2. [渲染层] DOM复杂度与浏览器重绘(查看FPS指标) 3. [执行层…...
计算机系统结构-第九章-互联网络 第十章
目录 恒等函数:I(没变) 交换函数:某一位取反 如下 角标为0,第0位取反 均匀洗牌函数、混洗函数Shuffle :σ 左移一位 (左移右边补0,右移左边补0) 蝶式互连函数but…...
H5 移动端适配最佳实践落地指南。
文章目录 前言一、为什么需要移动端适配?二、核心适配方案1. 视口(Viewport)设置2. 三种适配方案 (仅供参考)(1)rem 适配方案(2)vw/vh 适配方案(3)…...
从电动化到智能化,法雷奥“猛攻”中国汽车市场
当前,全球汽车产业正在经历前所未有的变革,外资Tier1巨头开始向中国智能电动汽车市场发起新一轮“猛攻”。 在4月23日-5月2日上海国际车展期间,博世、采埃孚、大陆集团、法雷奥等全球百强零部件厂商纷纷发布战略新品与转型计划。在这其中&am…...
智能网联汽车 “中央计算” 博弈:RTOS 与跨域融合的算力分配挑战
一、引言 随着智能驾驶技术的飞速发展,汽车逐渐从传统的交通工具演变为移动的智能终端。智能网联汽车的核心竞争力日益体现在其强大的计算能力和高效的算力管理上。汽车电子电气架构(EEA)正经历从分布式架构向 “中央计算 区域控制” 架构的…...
springboot 加载 tomcat 源码追踪
加载 TomcatServletWebServerFactory 从 SpringApplication.run()方法进入 进入到 refresh () 方法 选择实现类 ServletWebServerApplicationContext 进入到 AbstractApplicationContext onRefresh() 方法创建容器 找到加载bean 得到 webServer 实例 点击 get…...
AI预测3D新模型百十个定位预测+胆码预测+去和尾2025年5月9日第72弹
从今天开始,咱们还是暂时基于旧的模型进行预测,好了,废话不多说,按照老办法,重点8-9码定位,配合三胆下1或下2,杀1-2个和尾,再杀6-8个和值,可以做到100-300注左右。 (1)定…...