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

个人博客系统后端 - 注册登录功能实现指南

一、功能概述

个人博客系统的注册登录功能包括:

  1. 用户注册:新用户可以通过提供用户名、密码、邮箱等信息创建账号
  2. 用户登录:已注册用户可以通过用户名和密码进行身份验证,获取JWT令牌
  3. 身份验证:使用JWT令牌访问需要认证的API

二、技术栈

  • 后端框架:Spring Boot 3.2.5
  • 安全框架:Spring Security
  • 数据库:MySQL 8.0
  • 认证方式:JWT (JSON Web Token)
  • API测试工具:Postman

三、实现步骤

1. 数据库设计

用户表(users)设计:

CREATE TABLE users (id BIGINT AUTO_INCREMENT PRIMARY KEY,username VARCHAR(50) NOT NULL UNIQUE,password VARCHAR(100) NOT NULL,email VARCHAR(100) NOT NULL UNIQUE,nickname VARCHAR(50),role VARCHAR(20) NOT NULL DEFAULT 'USER',status INT NOT NULL DEFAULT 1,created_at DATETIME NOT NULL,updated_at DATETIME NOT NULL
);

2. 实体类设计

User实体类:

@Data
@NoArgsConstructor
@AllArgsConstructor
@Entity
@Table(name = "users")
public class User {@Id@GeneratedValue(strategy = GenerationType.IDENTITY)private Long id;@Column(nullable = false, unique = true, length = 50)private String username;@Column(nullable = false, length = 100)private String password;@Column(nullable = false, unique = true, length = 100)private String email;@Column(length = 50)private String nickname;@Column(nullable = false, length = 20)private String role = "USER"; // 默认角色@Column(nullable = false)private Integer status = 1; // 默认状态(1为激活)@Column(name = "created_at", nullable = false, updatable = false)private LocalDateTime createdAt;@Column(name = "updated_at", nullable = false)private LocalDateTime updatedAt;@PrePersistprotected void onCreate() {createdAt = LocalDateTime.now();updatedAt = LocalDateTime.now();}@PreUpdateprotected void onUpdate() {updatedAt = LocalDateTime.now();}
}

3. DTO设计

注册DTO:

public class RegisterUserDto {@NotBlank(message = "用户名不能为空")@Size(min = 4, max = 50, message = "用户名长度必须在4-50个字符之间")private String username;@NotBlank(message = "密码不能为空")@Size(min = 6, max = 100, message = "密码长度必须在6-100个字符之间")private String password;@NotBlank(message = "邮箱不能为空")@Email(message = "邮箱格式不正确")private String email;private String nickname;// getters and setters
}

登录DTO:

public class LoginUserDto {@NotBlank(message = "用户名不能为空")private String username;@NotBlank(message = "密码不能为空")private String password;// getters and setters
}

4. 数据仓库接口

@Repository
public interface UserRepository extends JpaRepository<User, Long> {Optional<User> findByUsername(String username);Optional<User> findByEmail(String email);boolean existsByUsername(String username);boolean existsByEmail(String email);
}

5. 服务层实现

AuthService接口:

public interface AuthService {User registerUser(RegisterUserDto registerUserDto);Map<String, Object> loginUser(LoginUserDto loginUserDto) throws AuthenticationException;
}

AuthServiceImpl实现类:

@Service
public class AuthServiceImpl implements AuthService {private final UserRepository userRepository;private final PasswordEncoder passwordEncoder;private final AuthenticationManager authenticationManager;private final JwtUtil jwtUtil;@Autowiredpublic AuthServiceImpl(UserRepository userRepository,PasswordEncoder passwordEncoder,AuthenticationManager authenticationManager,JwtUtil jwtUtil) {this.userRepository = userRepository;this.passwordEncoder = passwordEncoder;this.authenticationManager = authenticationManager;this.jwtUtil = jwtUtil;}@Override@Transactionalpublic User registerUser(RegisterUserDto registerUserDto) {// 检查用户名是否已存在if (userRepository.existsByUsername(registerUserDto.getUsername())) {throw new UserAlreadyExistsException("用户名 " + registerUserDto.getUsername() + " 已被注册");}// 检查邮箱是否已存在if (registerUserDto.getEmail() != null && !registerUserDto.getEmail().isEmpty() && userRepository.existsByEmail(registerUserDto.getEmail())) {throw new UserAlreadyExistsException("邮箱 " + registerUserDto.getEmail() + " 已被注册");}// 创建新用户实体User newUser = new User();newUser.setUsername(registerUserDto.getUsername());// 加密密码newUser.setPassword(passwordEncoder.encode(registerUserDto.getPassword()));newUser.setEmail(registerUserDto.getEmail());newUser.setNickname(registerUserDto.getNickname());// 使用默认值(role="USER", status=1)// createdAt 和 updatedAt 由 @PrePersist 自动处理// 保存用户到数据库return userRepository.save(newUser);}@Overridepublic Map<String, Object> loginUser(LoginUserDto loginUserDto) throws AuthenticationException {// 创建认证令牌UsernamePasswordAuthenticationToken authenticationToken =new UsernamePasswordAuthenticationToken(loginUserDto.getUsername(), loginUserDto.getPassword());// 进行认证Authentication authentication = authenticationManager.authenticate(authenticationToken);SecurityContextHolder.getContext().setAuthentication(authentication);// 获取用户详情UserDetails userDetails = (UserDetails) authentication.getPrincipal();// 生成JWT令牌String jwt = jwtUtil.generateToken(userDetails);// 获取用户IDUser user = userRepository.findByUsername(loginUserDto.getUsername()).orElseThrow(() -> new RuntimeException("用户不存在"));// 创建返回结果Map<String, Object> result = new HashMap<>();result.put("token", jwt);result.put("userId", user.getId());result.put("username", user.getUsername());result.put("expiresIn", 604800L); // 默认7天 = 604800秒return result;}
}

6. 控制器实现

@RestController
@RequestMapping("/auth")
public class AuthController {private final AuthService authService;@Autowiredpublic AuthController(AuthService authService) {this.authService = authService;}@PostMapping("/register")public ResponseEntity<?> registerUser(@Valid @RequestBody RegisterUserDto registerUserDto) {User registeredUser = authService.registerUser(registerUserDto);Map<String, Object> response = new HashMap<>();response.put("code", HttpStatus.CREATED.value());response.put("message", "注册成功");return ResponseEntity.status(HttpStatus.CREATED).body(response);}@PostMapping("/login")public ResponseEntity<?> loginUser(@Valid @RequestBody LoginUserDto loginUserDto) {try {Map<String, Object> loginResult = authService.loginUser(loginUserDto);Map<String, Object> response = new HashMap<>();response.put("code", HttpStatus.OK.value());response.put("message", "登录成功");Map<String, Object> data = new HashMap<>();data.put("token", loginResult.get("token"));data.put("userId", loginResult.get("userId"));data.put("username", loginResult.get("username"));data.put("expiresIn", loginResult.get("expiresIn"));response.put("data", data);return ResponseEntity.ok(response);} catch (BadCredentialsException e) {Map<String, Object> response = new HashMap<>();response.put("code", HttpStatus.UNAUTHORIZED.value());response.put("message", "用户名或密码错误");return ResponseEntity.status(HttpStatus.UNAUTHORIZED).body(response);} catch (Exception e) {Map<String, Object> response = new HashMap<>();response.put("code", HttpStatus.INTERNAL_SERVER_ERROR.value());response.put("message", "服务器内部错误: " + e.getMessage());return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(response);}}@ExceptionHandler(MethodArgumentNotValidException.class)@ResponseStatus(HttpStatus.BAD_REQUEST)public Map<String, Object> handleValidationExceptions(MethodArgumentNotValidException ex) {Map<String, String> errors = ex.getBindingResult().getFieldErrors().stream().collect(Collectors.toMap(FieldError::getField, FieldError::getDefaultMessage));Map<String, Object> response = new HashMap<>();response.put("code", HttpStatus.BAD_REQUEST.value());response.put("message", "请求参数错误");response.put("errors", errors);return response;}@ExceptionHandler(UserAlreadyExistsException.class)@ResponseStatus(HttpStatus.BAD_REQUEST)public Map<String, Object> handleUserAlreadyExistsException(UserAlreadyExistsException ex) {Map<String, Object> response = new HashMap<>();response.put("code", HttpStatus.BAD_REQUEST.value());response.put("message", ex.getMessage());return response;}
}

7. 安全配置

@Configuration
@EnableWebSecurity
@EnableMethodSecurity(prePostEnabled = true)
public class SecurityConfig {@Autowiredprivate UserDetailsServiceImpl userDetailsService;@Beanpublic PasswordEncoder passwordEncoder() {return new BCryptPasswordEncoder();}@Beanpublic AuthenticationManager authenticationManager(AuthenticationConfiguration authenticationConfiguration) throws Exception {return authenticationConfiguration.getAuthenticationManager();}@Beanpublic SecurityFilterChain filterChain(HttpSecurity http) throws Exception {http.csrf(AbstractHttpConfigurer::disable).exceptionHandling(exceptions -> exceptions.authenticationEntryPoint(new HttpStatusEntryPoint(HttpStatus.UNAUTHORIZED)).accessDeniedHandler((request, response, accessDeniedException) -> response.setStatus(HttpStatus.FORBIDDEN.value()))).authorizeHttpRequests(authz -> authz.requestMatchers("/auth/**").permitAll().anyRequest().authenticated()).sessionManagement(session -> session.sessionCreationPolicy(SessionCreationPolicy.STATELESS));return http.build();}
}

8. JWT工具类

@Component
public class JwtUtil {@Value("${jwt.secret}")private String secret;@Value("${jwt.expiration}")private Long expiration;public String generateToken(UserDetails userDetails) {Map<String, Object> claims = new HashMap<>();return createToken(claims, userDetails.getUsername());}private String createToken(Map<String, Object> claims, String subject) {Date now = new Date();Date expiryDate = new Date(now.getTime() + expiration);return Jwts.builder().setClaims(claims).setSubject(subject).setIssuedAt(now).setExpiration(expiryDate).signWith(SignatureAlgorithm.HS512, secret).compact();}// 其他JWT验证方法...
}

四、使用Postman测试注册登录功能

1. 测试用户注册

  1. 创建POST请求

    • URL: http://localhost:8080/auth/register
    • 请求头: Content-Type: application/json
    • 请求体:
    {"username": "testuser","password": "Password123","email": "testuser@example.com","nickname": "测试用户"
    }
    
  2. 发送请求并验证响应

    • 成功响应(201 Created):
    {"code": 201,"message": "注册成功"
    }
    
    • 失败响应(400 Bad Request):
    {"code": 400,"message": "用户名 testuser 已被注册"
    }
    

2. 测试用户登录

  1. 创建POST请求

    • URL: http://localhost:8080/auth/login
    • 请求头: Content-Type: application/json
    • 请求体:
    {"username": "testuser","password": "Password123"
    }
    
  2. 发送请求并验证响应

    • 成功响应(200 OK):
    {"code": 200,"message": "登录成功","data": {"token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...","userId": 1,"username": "testuser","expiresIn": 604800}
    }
    
    • 失败响应(401 Unauthorized):
    {"code": 401,"message": "用户名或密码错误"
    }
    

3. 使用JWT令牌访问受保护的API

  1. 创建请求(例如获取用户信息):

    • URL: http://localhost:8080/users/1
    • 请求头: Authorization: Bearer {token}(使用登录时获取的token)
  2. 发送请求并验证响应

五、常见问题及解决方案

1. Java 9+中缺少javax.xml.bind问题

问题描述:在Java 9及以上版本中使用JJWT 0.9.1库时,可能会遇到以下错误:

java.lang.ClassNotFoundException: javax.xml.bind.DatatypeConverter

原因:从Java 9开始,Java EE模块(包括javax.xml.bind包)被移除出了JDK核心。

解决方案:在pom.xml中添加JAXB API依赖:

<!-- 添加JAXB API依赖,解决Java 9+中缺少javax.xml.bind问题 -->
<dependency><groupId>javax.xml.bind</groupId><artifactId>jaxb-api</artifactId><version>2.3.1</version>
</dependency>
<dependency><groupId>com.sun.xml.bind</groupId><artifactId>jaxb-impl</artifactId><version>2.3.1</version>
</dependency>
<dependency><groupId>com.sun.xml.bind</groupId><artifactId>jaxb-core</artifactId><version>2.3.0.1</version>
</dependency>

2. API路径不匹配问题

问题描述:README文档中描述的API路径与实际代码中的路径不匹配。

原因:README中描述的基础路径是http://localhost:8080/api/v1,但控制器中只配置了/auth路径。

解决方案

  1. 方案一:使用正确的URL:http://localhost:8080/auth/registerhttp://localhost:8080/auth/login

  2. 方案二:在application.properties中添加上下文路径配置:

    server.servlet.context-path=/api/v1
    

    这样就可以使用README中描述的URL:http://localhost:8080/api/v1/auth/registerhttp://localhost:8080/api/v1/auth/login

3. 数据库连接问题

问题描述:注册接口返回成功,但数据库中没有保存数据。

可能原因

  1. 数据库名称配置错误
  2. 事务回滚(可能由未捕获的异常引起)
  3. 数据库连接问题

解决方案

  1. 检查application.properties中的数据库配置是否正确:

    spring.datasource.url=jdbc:mysql://localhost:3306/weblog?useSSL=false&serverTimezone=UTC&allowPublicKeyRetrieval=true
    spring.datasource.username=root
    spring.datasource.password=123456
    
  2. 确保数据库存在并且可以连接

  3. 检查日志中是否有事务回滚的错误信息

4. 请求验证失败

问题描述:注册或登录请求返回400错误,但没有明确的错误信息。

可能原因:请求体中缺少必填字段或格式不正确。

解决方案

  1. 确保请求体中包含所有必填字段
  2. 确保字段格式正确(例如,邮箱格式、密码长度等)
  3. 检查控制台日志,查看详细的验证错误信息

六、最佳实践

  1. 密码安全

    • 始终使用BCrypt等安全的密码哈希算法
    • 不要在响应中返回密码,即使是加密后的密码
    • 设置密码复杂度要求(长度、特殊字符等)
  2. JWT安全

    • 使用强密钥(至少256位)
    • 设置合理的过期时间
    • 考虑实现令牌刷新机制
    • 在生产环境中使用HTTPS
  3. 异常处理

    • 为不同类型的异常提供明确的错误消息
    • 不要在生产环境中暴露敏感的技术细节
    • 使用统一的响应格式
  4. 日志记录

    • 记录关键操作(注册、登录、登出)
    • 记录异常和错误
    • 不要记录敏感信息(密码、令牌等)

相关文章:

个人博客系统后端 - 注册登录功能实现指南

一、功能概述 个人博客系统的注册登录功能包括&#xff1a; 用户注册&#xff1a;新用户可以通过提供用户名、密码、邮箱等信息创建账号用户登录&#xff1a;已注册用户可以通过用户名和密码进行身份验证&#xff0c;获取JWT令牌身份验证&#xff1a;使用JWT令牌访问需要认证…...

微信小程序运行机制详解

微信小程序运行机制详解 微信小程序是介于 Web 和原生 App 之间的一种应用形态&#xff0c;具有无需安装、用完即走、体验流畅的特点。本文将从架构层面、运行环境、通信机制等方面深入剖析微信小程序的运行机制。 一、小程序运行架构概览 微信小程序采用双线程模型&#xff…...

GGML源码逐行调试(中)

目录 前言1. 简述2. 加载模型超参数3. 加载词汇表4. 初始化计算上下文5. 初始化计算后端6. 创建模型张量7. 分配缓冲区8. 加载模型权重结语下载链接参考 前言 学习 UP 主 比飞鸟贵重的多_HKL 的 GGML源码逐行调试 视频&#xff0c;记录下个人学习笔记&#xff0c;仅供自己参考&…...

高阶函数/柯里化/纯函数

本篇文章主要是介绍一下标题里面的概念&#xff0c;在面试的时候经常文档&#xff0c;结合阅读到的资料&#xff0c;结合本人的个人见解出品了该文章&#xff0c;如有写的不好的地方或理解有误的&#xff0c;还望阁下多多指教。 1、高阶函数 什么是高阶函数&#xff1f; 接受…...

docker部署scylladb

创建存储数据的目录和配置目录 mkdir -p /root/docker/scylla/data/data /root/docker/scylla/data/commitlog /root/docker/scylla/data/hints /root/docker/scylla/data/view_hints /root/docker/scylla/conf快速启动拷贝配置文件 docker run -d \--name scylla \scylladb/…...

Python创意:AI图像生成

1. 基本概念 AI 图像生成通常基于以下几种方法&#xff1a; 一.生成对抗网络 (GAN) 生成对抗网络&#xff08;GAN&#xff0c;Generative Adversarial Network&#xff09;是一种深度学习框架&#xff0c;主要用于生成新的、类似于训练数据的样本。自2014年由Ian Goodfellow及…...

十九、UDP编程和IO多路复用

1、UDP编程 服务端&#xff1a; #include<stdio.h> #include <arpa/inet.h> #include<stdlib.h> #include<string.h> #include <sys/types.h> /* See NOTES */ #include <sys/socket.h> #include <pthread.h> #include &l…...

【MySQL】复合查询

文章目录 &#x1f449;基本查询回顾&#x1f448;select 子查询 &#x1f449;多表查询&#x1f448;&#x1f449;自连接&#x1f448;&#x1f449;子查询&#x1f448;单行子查询多行子查询多列子查询在from子句中使用子查询合并查询 &#x1f449;总结&#x1f448; &…...

并发编程--条件量与死锁及其解决方案

并发编程–条件量与死锁及其解决方案 文章目录 并发编程--条件量与死锁及其解决方案1.条件量1.1条件量基本概念1.2条件量的使用 2. 死锁 1.条件量 1.1条件量基本概念 在许多场合中&#xff0c;程序的执行通常需要满足一定的条件&#xff0c;条件不成熟的时候&#xff0c;任务…...

【NLP解析】多头注意力+掩码机制+位置编码:Transformer三大核心技术详解

目录 多头注意力&#xff1a;让模型化身“多面手” 技术细节&#xff1a;多头注意力如何计算&#xff1f; 实际应用&#xff1a;多头注意力在Transformer中的威力 为什么说多头是“非线性组合”&#xff1f; 实验对比&#xff1a;多头 vs 单头 进阶思考&#xff1a;如何设计更高…...

#关于数据库中的时间存储

✅ 一、是否根据“机器当前时区”得到本地时间再转 UTC&#xff1f; 结论&#xff1a;是的&#xff0c;但仅对 TIMESTAMP 字段生效。 数据库&#xff08;如 MySQL&#xff09;在插入 TIMESTAMP 类型数据时&#xff1a; 使用当前会话的时区&#xff08;默认跟随系统时区&#…...

C# --- yield关键字 和 Lazy Execution

C# --- yield关键字 和 Lazy Execution 延迟执行&#xff08;Lazy Execution&#xff09;yield关键字lazy execution与yield的关系LINQ 和 lazy exectuion 延迟执行&#xff08;Lazy Execution&#xff09; 延迟执行指操作不会立即计算结果&#xff0c;而是在实际需要数据时才执…...

Qt报错dependent ‘..\..\..\..\..\..\xxxx\QMainWindow‘ 或者 QtCore\QObject not exist

Qt5.15编译项目报错如下: dependent ‘..\..\..\..\..\..\Qt\5.15.2\msvc2019_64\include\QtW...

彻底掌握 XMLHttpRequest(XHR):前端通信的基石

一、XHR 的起源与演进 1.1 技术背景 XHR&#xff08;XMLHttpRequest&#xff09;是现代 Web 应用的异步通信基石&#xff0c;最早由微软在 IE5 中通过 ActiveXObject 引入&#xff0c;后来被 Mozilla 推广并成为 W3C 的标准接口。XHR 的出现推动了 AJAX&#xff08;Asynchrono…...

Bartender 5 for Mac 多功能菜单栏管理

Bartender 5 for Mac 多功能菜单栏管理 一、介绍 Bartender 5&#xff0c;是一款菜单栏管理软件&#xff0c;可以帮助用户隐藏、组织和自定义Mac菜单栏中的图标和通知。使用Bartender 5&#xff0c;用户可以将不常用的图标隐藏起来&#xff0c;使菜单栏保持整洁&#xff0c;并…...

重读《人件》Peopleware -(5)Ⅰ管理人力资源Ⅳ-质量—若时间允许

20世纪的心理学理论认为&#xff0c;人类的性格主要由少数几个基本本能所主导&#xff1a;生存、自尊、繁衍、领地等。这些本能直接嵌入大脑的“固件”中。我们可以在没有强烈情感的情况下理智地考虑这些本能&#xff08;就像你现在正在做的那样&#xff09;&#xff0c;但当我…...

人事招聘专员简历模板

模板信息 简历范文名称&#xff1a;人事招聘专员简历模板&#xff0c;所属行业&#xff1a;人力资源&#xff0c;模板编号&#xff1a;K8TG60 专业的个人简历模板&#xff0c;逻辑清晰&#xff0c;排版简洁美观&#xff0c;让你的个人简历显得更专业&#xff0c;找到好工作。…...

Java中equals与 “==” 的区别

首先我们要掌握基本数据类型和引用类型的概念 基本数据类型&#xff1a; byte&#xff0c;short&#xff0c;int,long,float,double,boolean,char 基本的八大数据类型都各自封装着包装类&#xff0c;提供了更多的方法&#xff0c;并且都是引言类型 引用类型&#xff1a; 引…...

20250412_代码笔记_CVRProblemDef

文章目录 前言一、get_random_problems 函数分析二、augment_xy_data_by_8_fold 函数分析代码 前言 该笔记分析代码的功能是生成随机VRP问题的数据&#xff0c;包含仓库坐标、节点坐标和节点需求。 对该代码进行改进 20250412-代码改进-拟蒙特卡洛 一、get_random_problems 函…...

《算法笔记》3.4小节——入门模拟->日期处理

日期差值 #include <iostream> using namespace std; int month[13][2]{{0,0},{31,31},{28,29},{31,31},{30,30},{31,31},{30,30},{31,31},{31,31},{30,30},{31,31},{30,30},{31,31} }; bool is_leap(int year){return (year%40&&year%100!0||year%4000); }int m…...

JetBrain/IDEA :Request for Open Source Development License

Request for Open Source Development License...

Java学习手册:Java集合框架详解

Java集合框架&#xff08;Java Collections Framework&#xff09;是Java语言中用于存储和操作数据集合的一组接口和类的集合。它提供了丰富的数据结构和算法&#xff0c;帮助开发者高效地管理和操作数据。掌握集合框架的使用是Java开发者的必备技能。 本文将深入探讨Java集合…...

20250412 机器学习ML -(3)数据降维(scikitlearn)

1. 背景 数学小白一枚&#xff0c;看推理过程需要很多时间。好在有大神们源码和DS帮忙&#xff0c;教程里的推理过程才能勉强拼凑一二。 * 留意&#xff1a; 推导过程中X都是向量组表达: shape(feature, sample_n); 和numpy中的默认矩阵正好相反。 2. PCA / KPCA PCAKPCA(Li…...

深入解析系统频率响应:通过MATLAB模拟积分器对信号的稳态响应

稳态响应分析与MATLAB可视化 在控制系统中&#xff0c;线性时不变系统的稳态响应是描述输入与输出之间关系的关键。对于一个频率为 ω i \omega_i ωi​ 的正弦输入 u ( t ) M i sin ⁡ ( ω i t φ i ) u(t) M_i \sin(\omega_i t \varphi_i) u(t)Mi​sin(ωi​tφi​)&…...

[16届蓝桥杯 2025 c++省 B] 画展布置

​​​​​​​​​​​​​​ 解题思路 理解 ( L ) 的本质 当 ( B ) 按平方值从小到大排序后&#xff0c;相邻项的差非负&#xff0c;此时 ( L ) 等于区间内最大平方值与最小平方值的差&#xff08;数学公式推导&#xff09; 滑动窗口找最小差值 遍历所有长度为 ( M ) 的连续…...

从代码学习深度学习 - Bahdanau注意力 PyTorch版

文章目录 1. 前言为什么选择Bahdanau注意力本文目标与预备知识2. Bahdanau注意力机制概述注意力机制简述加性注意力与乘性注意力对比Bahdanau注意力的数学原理与流程图数学原理流程图可视化与直观理解3. 数据准备与预处理数据集简介数据加载与预处理1. 读取数据集2. 预处理文本…...

具身智能零碎知识点(三):深入解析 “1D UNet”:结构、原理与实战

深入解析 “1D UNet”&#xff1a;结构、原理与实战 【深度学习入门】1D UNet详解&#xff1a;结构、原理与实战指南一、1D UNet是什么&#xff1f;二、核心结构与功能1. 整体架构2. 编码器&#xff08;Encoder&#xff09;3. 解码器&#xff08;Decoder&#xff09;4. 跳跃连…...

基于论文的大模型应用:基于SmartETL的arXiv论文数据接入与预处理(二)

上一篇 文章介绍了arXiv采集处理的任务背景、整体需求&#xff0c;并对数据进行了调研。 本文介绍整体方案设计。 4.整体方案设计 4.1.总体流程 基于上述调研了解的情况&#xff0c;针对工作需求设计处理流程如下&#xff1a; 下载kaggle数据集作为流程输入&#xff0c;出…...

Halo 设置 GitHub - OAuth2 认证指南

在当今数字化时代&#xff0c;用户认证的便捷性和安全性愈发重要。对于使用 Halo 搭建个人博客或网站的开发者而言&#xff0c;引入 GitHub - OAuth2 认证能够极大地提升用户登录体验。今天&#xff0c;我们就来详细探讨一下如何在 Halo 中设置 GitHub - OAuth2 认证。 一、为…...

脑影像分析软件推荐 | AIDA介绍

目录 1.软件界面 2.工具包功能简介 3.软件安装注意事项 1.软件界面 2.工具包功能简介 AIDAmri是一种新型的基于图谱的成像数据分析流程&#xff0c;用于处理小鼠大脑的结构和功能数据&#xff0c;包括解剖MRI、基于扩散张量成像&#xff08;DTI&#xff09;的纤维追踪以及基…...

SQL:Relationship(关系)

目录 &#x1f517; 什么是 Relationship&#xff1f; 三种基本关系类型&#xff08;基于实体间的关系&#xff09;&#xff1a; 1. 一对一&#xff08;One-to-One&#xff09; 2. 一对多&#xff08;One-to-Many&#xff09; 3. 多对多&#xff08;Many-to-Many&#xf…...

【今日三题】压缩字符串(模拟) / chika和蜜柑(topK) / 01背包

⭐️个人主页&#xff1a;小羊 ⭐️所属专栏&#xff1a;每日两三题 很荣幸您能阅读我的文章&#xff0c;诚请评论指点&#xff0c;欢迎欢迎 ~ 目录 压缩字符串 (模拟)chika和蜜柑 (topK)01背包 压缩字符串 (模拟) 压缩字符串 class Solution { public:string compressStri…...

PHP多维数组

在 PHP 中&#xff0c;多维数组是数组的数组&#xff0c;允许你存储和处理更复杂的数据结构。多维数组可以有任意数量的维度&#xff0c;但通常我们最常用的是二维数组&#xff08;数组中的数组&#xff09;。 首先来介绍一下一维数组&#xff0c; <?php//一维数组 $strAr…...

智能手机功耗测试

随着智能手机发展,用户体验对手机的续航功耗要求越来越高。需要对手机进行功耗测试及分解优化,将手机的性能与功耗平衡。低功耗技术推动了手机的用户体验。手机功耗测试可以采用powermonitor或者NI仪表在功耗版上进行测试与优化。作为一个多功能的智能终端,手机的功耗组成极…...

0x02.Redis 集群的实现原理是什么?

回答重点 Redis 集群&#xff08;Redis cluster&#xff09;是通过多个 Redis 实例组成的&#xff0c;每个主节点实例负责存储部分的数据&#xff0c;并且可以有一个或多个从节点作为备份。 具体是采用哈希槽&#xff08;Hash Slot&#xff09;机制来分配数据&#xff0c;将整…...

游戏引擎学习第219天

游戏运行时的当前状态 目前的工作基本上就是编程&#xff0c;带着一种预期&#xff0c;那就是一切都会很糟糕&#xff0c;而我们需要一个系统来防止它变得更糟。接下来&#xff0c;我们来看看目前的进展。 简要说明昨天提到的无限调试信息存储系统 昨天我们完成了内存管理的…...

二叉树深度解析:从基础概念到算法实现与应用

一、二叉树的本质定义与核心特性 &#xff08;一&#xff09;递归定义与逻辑结构 二叉树是一种 严格有序的树结构&#xff0c;其递归定义为&#xff1a; 空树&#xff1a;不含任何结点的集合&#xff0c;是二叉树的特殊形态。非空二叉树&#xff1a;由以下三部分组成&#x…...

Model Context Protocol(MCP)模型上下文协议

Model Context Protocol&#xff08;MCP&#xff09;模型上下文协议 前言一、什么是MCP二、MCP的作用三、MCP与Function call对比四、构建一个简单的MCP DEMO环境准备实现MCP Server运行 ServerMCP Client端配置验证 总结 前言 在Agent时代&#xff0c;将Agent确立为大模型未来…...

代码随想录算法训练营第十六天

LeetCode题目: 530. 二叉搜索树的最小绝对差501. 二叉搜索树中的众数236. 二叉树的最近公共祖先3272. 统计好整数的数目(每日一题) 其他: 今日总结 往期打卡 530. 二叉搜索树的最小绝对差 跳转: 530. 二叉搜索树的最小绝对差 学习: 代码随想录公开讲解 问题: 给你一个二叉搜…...

类似东郊到家的上门按摩预约服务系统小程序APP源码全开源

&#x1f525; 为什么上门按摩正在席卷全国&#xff1f; 万亿蓝海市场爆发 2024年中国按摩市场规模突破8000亿&#xff0c;上门服务增速达65% 90后成消费主力&#xff0c;**72%**白领每月至少使用1次上门按摩&#xff08;数据来源&#xff1a;艾媒咨询&#xff09; 传统痛点…...

MySQL 5.7.30 Linux 二进制安装包详解及安装指南

MySQL 5.7.30 Linux 安装包详解 mysql-5.7.30-linux-glibc2.12-x86_64.tar 是 MySQL 服务器 5.7.30 版本的 Linux 二进制发行包。 mysql-5.7.30-linux-glibc2.12-x86_64.tar 安装包下载 链接&#xff1a;https://pan.quark.cn/s/2943cd209ca5 包信息 版本: MySQL 5.7.30 平…...

C语言超详细指针知识(二)

在上一篇有关指针的博客中&#xff0c;我们介绍了指针的基础知识&#xff0c;如&#xff1a;内存与地址&#xff0c;解引用操作符&#xff0c;野指针等&#xff0c;今天我们将更加深入的学习指针的其他知识。 1.指针的使用和传址调用 1.1strlen的模拟实现 库函数strlen的功能是…...

Java集合框架详解:核心类、使用场景与最佳实践

文章目录 一、Java集合框架概览二、核心集合类详解1. List接口&#xff08;有序、可重复&#xff09;**ArrayList****LinkedList****List对比表** 2. Set接口&#xff08;无序、唯一&#xff09;**HashSet****TreeSet****Set对比表** 3. Queue接口&#xff08;队列&#xff09;…...

模板引擎语法-标签

模板引擎语法-标签 文章目录 模板引擎语法-标签[toc]一、用于进行判断的{% if-elif-else-endif %}标签二、关于循环对象的{% for-endfor %}标签三、关于自动转义的{% autoescape-endautoescape %}标签四、关于循环对象的{% cycle %}标签五、关于检查值是否变化的{% ifchange %}…...

刘火良FreeRTOS内核实现与应用学习之7——任务延时列表

在《刘火良FreeRTOS内核实现与应用学习之6——多优先级》的基础上&#xff1a;关键是添加了全局变量&#xff1a;xNextTaskUnblockTime &#xff0c;与延时列表&#xff08;xDelayedTaskList1、xDelayedTaskList2&#xff09;来高效率的实现延时。 以前需要在扫描就绪列表中所…...

基于红外的语音传输及通信系统设计

标题:基于红外的语音传输及通信系统设计 内容:1.摘要 本设计聚焦于基于红外的语音传输及通信系统&#xff0c;以解决传统通信方式在特定场景下的局限性为背景&#xff0c;旨在开发一种高效、稳定且具有一定抗干扰能力的语音传输系统。方法上&#xff0c;采用红外技术作为语音信…...

解锁AI未来,开启创新之旅——《GPTs开发详解》与《ChatGPT 4应用详解》两本书的深度解析

前言 在这个数字化时代&#xff0c;AI技术正在以前所未有的速度改变我们的生活和工作方式。作为一名AI爱好者和从业者&#xff0c;我深知了解并掌握先进技术的重要性。今天&#xff0c;我想向大家推荐两本极具价值的书籍&#xff1a;《GPTs开发详解》和《ChatGPT 4应用详解》。…...

Linux进程通信入门:匿名管道的原理、实现与应用场景

Linux系列 文章目录 Linux系列前言一、进程通信的目的二、进程通信的原理2.1 进程通信是什么2.2 匿名管道通讯的原理 三、进程通讯的使用总结 前言 Linux进程间同通讯&#xff08;IPC&#xff09;是多个进程之间交换数据和协调行为的重要机制&#xff0c;是我们学习Linux操作系…...

[SpringMVC]上手案例

创建工程 新建项目&#xff0c;选择maven工程&#xff0c;原型&#xff08;Archetype&#xff09;选择maven的webapp&#xff0c;注意名称头尾。会使用到tomcat&#xff08;因为是javaWeb&#xff09;。 新建的项目结构目录如下&#xff0c;如果没有java目录&#xff0c;需要自…...

kubernetes 入门篇之架构介绍

经过前段时间的学习和实践&#xff0c;对k8s的架构有了一个大致的理解。 1. k8s 分层架构 架构层级核心组件控制平面层etcd、API Server、Scheduler、Controller Manager工作节点层Kubelet、Kube-proxy、CRI&#xff08;容器运行时接口&#xff09;、CNI&#xff08;网络插件&…...