知光项目用户资料模块

前言:

该文档只作为本人学习过程的记录,若还需要更详细的项目文档可以点击下方链接进行购买

文档地址

同时该项目已经在git上面开源,可以在购买前去看一下该项目。

项目后端的git地址:知光git后端地址

项目前端的git地址: 知光git前端地址

由于本人还在开发学习当中如果要看本人的代码可以进入以下地址:

本人的gitee地址

1 用户资料模块的实现

1.1 准备用户资料模块数据传输需要的DTO,VO

该模块代码我考虑到跟用户相关,因此我放在用户模块下的包内

package com.xiaoce.zhiguang.user.domain.dto; import jakarta.validation.constraints.PastOrPresent; import jakarta.validation.constraints.Pattern; import jakarta.validation.constraints.Size; import java.time.LocalDate; /** * ProfilePatchRequest * <p> * 用户资料模块的dto * 作用是在 前端(App/网页) 和 后端 之间传递用户想要修改的个人资料数据。 * * @author 小策 * @date 2026/1/20 16:36 */ public record ProfilePatchRequest( @Size(min = 1, max = 64, message = "昵称长度需在 1-64 之间") String nickname, @Size(max = 512, message = "个人描述长度不能超过 512") String bio, @Pattern(regexp = "(?i)MALE|FEMALE|OTHER|UNKNOWN", message = "性别取值为 MALE/FEMALE/OTHER/UNKNOWN") String gender, @PastOrPresent(message = "生日不能晚于今天") LocalDate birthday, @Pattern(regexp = "^[a-zA-Z0-9_]{4,32}$", message = "知光号仅支持字母、数字、下划线,长度 4-32") String zgId, @Size(max = 128, message = "学校名称长度不能超过 128") String school, String tagJson ) { }
package com.xiaoce.zhiguang.user.domain.vo; import com.xiaoce.zhiguang.user.domain.po.Users; import java.time.LocalDate; /** * ProfileResponse * <p> * 用户资料响应对象 (VO) * 作用:后端将数据库中的用户信息脱敏、整理后,返回给前端展示。 * 它是用户在“个人中心”或“他人主页”看到的资料视图。 * * @author 小策 * @date 2026/1/20 16:37 */ public record ProfileResponse( /** * 用户唯一标识 ID */ Long id, /** * 用户昵称 */ String nickname, /** * 头像 URL 地址 (通常是 OSS 访问链接) */ String avatar, /** * 个人简介/签名 */ String bio, /** * 知光号 (用户自定义的唯一标识 ID) */ String zgId, /** * 性别 (如:MALE, FEMALE, OTHER, UNKNOWN) */ String gender, /** * 出生日期 */ LocalDate birthday, /** * 学校/教育背景 */ String school, /** * 绑定手机号 (通常会做掩码处理,如 138****0000) */ String phone, /** * 绑定邮箱 */ String email, /** * 用户标签 (JSON 格式字符串) */ String tagJson ) { /** * 静态工厂方法:将数据库 PO 对象安全地转换为展示用的 VO 对象 * @param user 数据库 Users 实体 * @return 转换后的 ProfileResponse */ public static ProfileResponse fromEntity(Users user) { if (user == null) return null; return new ProfileResponse( user.getId(), user.getNickname(), // 如果头像为空,这里可以处理默认值 user.getAvatar() == null ?"https://xiaoce-zhiguang.oss-cn-shenzhen.aliyuncs.com/default.jpg" : user.getAvatar(), user.getBio(), user.getZgId(), user.getGender(), user.getBirthday(), user.getSchool(), // 在此处进行手机号脱敏处理 maskPhone(user.getPhone()), maskEmail(user.getEmail()), user.getTagsJson() ); } private static String maskPhone(String phone) { if (phone == null || phone.length() < 11) return phone; return phone.replaceAll("(\\d{3})\\d{4}(\\d{4})", "$1****$2"); } private static String maskEmail(String email) { if (email == null || !email.contains("@")) return email; return email.replaceAll("(\\w).*(?=@)", "$1****"); } }

1.2 配置跨域CorsConfig

那这是时候又有问题了,之前在配置模块中已经有了SecurityConfig里面有个corsConfigurationSource这个Bean,为什么这里又要有个CorsConfig呢?能不能直接在这个corsConfigurationSource里面做修改,不写配置类呢?

  • 第一个问题回答:

主要原因是因为使用了PatchMapping请求,这是一个复杂请求会触发 CORS 预检;会先发送 OPTIONS 预检请求。如果后端未正确配置 CORS 或未放行 OPTIONS,请求就会被浏览器拦截,接口就无法请求成功。而之前的corsConfigurationSource并未做放行操作。

  • 第二个问题回答

如果只用SecurityConfig(标准配置):

Spring Security 的过滤器链条是严格按顺序执行的。默认情况下,它的鉴权过滤器 (AuthorizationFilter)往往排在CORS过滤器的前面或者紧挨着。

  1. 请求进来OPTIONS请求到达 Spring Security。
  2. 安检员(Security)拦住
    1. 安检员:“站住!你访问的是 API 接口。”
    2. 安检员:“你的 Token 呢?”
    3. 关键点:浏览器的OPTIONS请求通常是不带 Token的!
  1. 结果:安检员直接打回 ——401 Unauthorized(未授权)。
  2. CORS过滤器:它原本准备好了说“行,允许跨域”,但请求还没走到它这儿,就被前面的安检员给毙了。

而定义的CorsConfig用了Ordered.HIGHEST_PRECEDENCE,这相当于CORS处理提到了安检门之外

请求进来OPTIONS请求到达服务器。

接待员(你的 CorsConfig)

  • 它排在最最前面,甚至在 Spring Security 安检门外面。
  • 接待员:“哦,你是来问路的(OPTIONS)?行,我给你盖个章(Access-Control-Allow-Origin),你进去吧。”
  • 直接放行:它直接返回 200 OK,或者把请求放过去。

安检员(Security)

  • 看到请求已经处理完了(或者看到 OPTIONS 请求已经有了合法的 CORS 头)。
  • Spring Security 内部机制发现如果是已经处理过的CORS预检请求,往往就会直接放过,不再查 Token。
package com.xiaoce.zhiguang.user.config; import org.springframework.boot.web.servlet.FilterRegistrationBean; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.core.Ordered; import org.springframework.web.cors.CorsConfiguration; import org.springframework.web.cors.UrlBasedCorsConfigurationSource; import org.springframework.web.filter.CorsFilter; import java.util.List; /** * CorsConfig * <p> * 全局跨域配置类 * 采用 Filter 方案,在请求进入 Servlet 之前处理 CORS,优先级高于 Spring Security * @author 小策 * @date 2026/1/20 18:05 */ @Configuration public class CorsConfig { @Bean public FilterRegistrationBean<CorsFilter> corsFilterRegistration() { // 1. 创建 CORS 配置对象,用于定义具体的跨域规则 CorsConfiguration config = new CorsConfiguration(); // 允许的来源:使用 AllowedOriginPatterns 支持通配符,允许所有站点跨域请求 // 注意:生产环境下建议设置为具体的域名,如 "https://www.zhiguang.com" config.setAllowedOriginPatterns(List.of("*")); // 允许的 HTTP 方法:必须包含 OPTIONS 用于处理预检请求,PATCH 用于局部更新 config.setAllowedMethods(List.of("GET", "POST", "PUT", "PATCH", "DELETE", "OPTIONS")); // 允许的请求头:允许前端在 Header 中携带 Authorization (存放 JWT) 和 Content-Type 等信息 config.setAllowedHeaders(List.of("*")); // 是否允许携带凭证:若前端需要跨域发送 Cookie,此项必须为 true // 由于本项目目前将 Refresh Token 存在 localStorage,故设为 false 即可 config.setAllowCredentials(false); // 预检请求的缓存时间:在此时间内(1小时),浏览器不再针对相同接口发送 OPTIONS 预检,提升性能 config.setMaxAge(3600L); // 2. 配置配置源:将上述规则应用到具体的 URL 路径上 UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); // 针对 Profile 模块及 Auth 模块等所有 API 接口开启跨域 source.registerCorsConfiguration("/api/v1/**", config); // 3. 核心:创建 Filter 注册对象,并设置最高优先级 FilterRegistrationBean<CorsFilter> bean = new FilterRegistrationBean<>(new CorsFilter(source)); // 设置执行顺序为最高优先级(Ordered.HIGHEST_PRECEDENCE) // 确保跨域处理发生在 Spring Security 权限拦截之前,彻底解决预检请求被拦截的问题 bean.setOrder(Ordered.HIGHEST_PRECEDENCE); return bean; } }

1.3 用户资料模块的接口文档

接口详情

1.1 局部更新个人资料

采用PATCH语义,仅提交需要修改的字段。未提交的字段在数据库中保持不变。

  • URL:/
  • Method:PATCH
  • 权限:需要认证(需在 Header 携带Authorization: Bearer <token>)
  • 请求头:Content-Type: application/json

请求参数 (Body):

  • nickname(String, 选填): 用户昵称,长度 1-64。
  • bio(String, 选填): 个人描述,长度不超过 512。
  • gender(String, 选填): 性别,取值为MALE,FEMALE,OTHER,UNKNOWN(忽略大小写)。
  • birthday(LocalDate, 选填): 生日,格式yyyy-MM-dd,不能晚于今天。
  • zgId(String, 选填): 知光号,仅支持字母、数字、下划线,长度 4-32。
  • school(String, 选填): 学校名称,长度不超过 128。
  • tagJson(String, 选填): 用户标签的 JSON 格式字符串。

响应示例 (200 OK):

JSON

{ "id": 10086, "nickname": "小策", "avatar": "https://oss.../avatar.jpg", "bio": "写代码的", "zgId": "xiaoce_001", "gender": "MALE", "birthday": "2000-01-01", "school": "赤峰学院", "phone": "138****8888", "email": "x****@example.com", "tagJson": "[\"Java\", \"后端\"]" }

1.2 更新用户头像

上传图片文件,后端会将其存入 OSS 并自动同步更新用户表中的头像地址。

  • URL:/avatar
  • Method:POST
  • 权限:需要认证
  • 请求头:Content-Type: multipart/form-data

请求参数 (Form-Data):

  • file(File, 必填): 头像图片文件流(通常限制为 jpg/png 格式)。

响应示例 (200 OK):

JSON

{ "id": 10086, "nickname": "小策", "avatar": "https://oss-cn-shenzhen.../new_avatar_uuid.png", "bio": "写代码的", ... }

1.4 用户资料模块controller层实现

package com.xiaoce.zhiguang.user.controller; import com.xiaoce.zhiguang.Oss.service.Impl.OssStorageServiceImpl; import com.xiaoce.zhiguang.auth.service.impl.JwtServiceImpl; import com.xiaoce.zhiguang.user.domain.dto.ProfilePatchRequest; import com.xiaoce.zhiguang.user.domain.vo.ProfileResponse; import com.xiaoce.zhiguang.user.service.IUserProfileService; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.media.Content; import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.responses.ApiResponse; import io.swagger.v3.oas.annotations.responses.ApiResponses; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.validation.Valid; import lombok.RequiredArgsConstructor; import org.springframework.http.MediaType; import org.springframework.security.core.annotation.AuthenticationPrincipal; import org.springframework.security.oauth2.jwt.Jwt; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; /** * ProfileController * <p> * 用户简介相关业务的controller * * @author 小策 * @date 2026/1/20 16:44 */ @RestController @Tag(name = "用户简介模块") @RequestMapping("/api/v1/profile") @Validated @RequiredArgsConstructor public class ProfileController { private final IUserProfileService profileService; private final JwtServiceImpl jwtService; private final OssStorageServiceImpl ossStorageService; /** * ATCH (局部修改) * 操作目标: 资源的部分字段 * 提交要求: 只需提交想修改的字段 * 幂等性: 通常不幂等(取决于具体实现) * 使用场景: 只需要发一个头像 URL 或文件即可 */ @PatchMapping @Operation( summary = "局部更新个人资料", description = "采用 PATCH 语义,仅提交需要修改的字段(如昵称、简介等)。未提交的字段在数据库中保持不变。" ) @ApiResponses({ @ApiResponse(responseCode = "200", description = "更新成功", content = @Content(schema = @Schema(implementation = ProfileResponse.class))), @ApiResponse(responseCode = "400", description = "参数校验失败或业务逻辑错误"), @ApiResponse(responseCode = "401", description = "未登录或 Token 无效") }) public ProfileResponse patch(@AuthenticationPrincipal Jwt jwt, @Valid @RequestBody ProfilePatchRequest request) { long userId = jwtService.extractUserId(jwt); return profileService.updateProfile(userId, request); } @PostMapping(value = "/avatar", consumes = MediaType.MULTIPART_FORM_DATA_VALUE) @Operation( summary = "更新用户头像", description = "上传图片文件,后端会将其存入 OSS 并同步更新用户表中的头像地址。注意:请求头需设为 multipart/form-data。" ) @ApiResponses({ @ApiResponse(responseCode = "200", description = "更新成功", content = @Content(schema = @Schema(implementation = ProfileResponse.class))), @ApiResponse(responseCode = "400", description = "文件读取失败或格式不正确") }) public ProfileResponse updateAvatar( @AuthenticationPrincipal Jwt jwt, @Parameter(description = "头像文件流", required = true) @RequestPart("file") MultipartFile file ) { long userId = jwtService.extractUserId(jwt); // 1. 调用 OSS 基础模块上传文件并获取 URL String url = ossStorageService.updateAvatar(userId, file); // 2. 调用用户业务模块更新数据库 return profileService.updateAvatar(userId, url); } }

1.5 用户资料模块IUserProfileService接口实现

package com.xiaoce.zhiguang.user.service; import com.baomidou.mybatisplus.extension.service.IService; import com.xiaoce.zhiguang.user.domain.dto.ProfilePatchRequest; import com.xiaoce.zhiguang.user.domain.po.Users; import com.xiaoce.zhiguang.user.domain.vo.ProfileResponse; import jakarta.validation.Valid; /** * IUserProfileService * <p> * 用户简介相关业务接口 * * @author 小策 * @date 2026/1/20 16:46 */ public interface IUserProfileService extends IService<Users> { ProfileResponse updateProfile(long userId, @Valid ProfilePatchRequest request); ProfileResponse updateAvatar(long userId, String url); }

1.6 用户资料模块UserProfileServiceImpl实现

1.6.1 实现逻辑

1.6.1.1 更新用户个人资料实现逻辑

暂时无法在飞书文档外展示此内容

1.6.1.2 更新用户头像实现逻辑

暂时无法在飞书文档外展示此内容

1.6.2 实现代码

package com.xiaoce.zhiguang.user.service.impl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.xiaoce.zhiguang.common.exception.BusinessException; import com.xiaoce.zhiguang.common.exception.ErrorCode; import com.xiaoce.zhiguang.user.domain.dto.ProfilePatchRequest; import com.xiaoce.zhiguang.user.domain.po.Users; import com.xiaoce.zhiguang.user.domain.vo.ProfileResponse; import com.xiaoce.zhiguang.user.mapper.UsersMapper; import com.xiaoce.zhiguang.user.service.IUserProfileService; import com.xiaoce.zhiguang.user.service.IUserService; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.util.StringUtils; import java.time.LocalDateTime; /** * UserProfileServiceImpl * <p> * 用户简介相关业务实现类 * * @author 小策 * @date 2026/1/20 16:47 */ @Service @RequiredArgsConstructor public class UserProfileServiceImpl extends ServiceImpl<UsersMapper, Users> implements IUserProfileService{ private final IUserService userService; /** * 更新用户个人资料 * @param userId 用户ID * @param request 包含需要更新的个人资料字段 * @return ProfileResponse 更新后的用户个人资料响应对象 * @throws BusinessException 当用户不存在或未提供任何更新字段时抛出 */ @Override @Transactional public ProfileResponse updateProfile(long userId, ProfilePatchRequest request) { // 根据用户ID查询用户信息,如果不存在则抛出异常 Users user = lambdaQuery().eq(Users::getId, userId).oneOpt().orElseThrow( () -> new BusinessException(ErrorCode.IDENTIFIER_NOT_FOUND, "用户不存在")); // 至少要提交一个字段,否则属于无效请求 boolean hasAnyField = request.nickname() != null || request.bio() != null || request.gender() != null || request.birthday() != null || request.zgId() != null || request.school() != null || request.tagJson() != null; if (!hasAnyField) { throw new BusinessException(ErrorCode.BAD_REQUEST, "未提交任何更新字段"); } String zgId = user.getZgId(); if (zgId != null && !zgId.isBlank()) { userService.existsByZgIdExceptId(zgId, userId); } // 2. 执行动态 SQL 更新 boolean success = lambdaUpdate() .eq(Users::getId, userId) // 定位用户 // 只有当 request 中的字段不为 null 时,才执行 set 更新 .set(request.nickname() != null, Users::getNickname, request.nickname()) .set(request.bio() != null, Users::getBio, request.bio()) .set(request.gender() != null, Users::getGender, request.gender()) .set(request.birthday() != null, Users::getBirthday, request.birthday()) .set(request.zgId() != null, Users::getZgId, request.zgId()) .set(request.school() != null, Users::getSchool, request.school()) .set(request.tagJson() != null, Users::getTagsJson, request.tagJson()) .set(Users::getUpdatedAt, LocalDateTime.now()) // 记录更新时间 .update(); if (!success) { throw new BusinessException(ErrorCode.INTERNAL_ERROR, "个人资料更新失败"); } Users userUpdate = lambdaQuery().eq(Users::getId, userId).oneOpt().orElseThrow( () -> new BusinessException(ErrorCode.IDENTIFIER_NOT_FOUND, "用户不存在")); return ProfileResponse.fromEntity(userUpdate); } /** * 更新用户头像信息 * 该方法使用事务注解,确保操作的原子性 * * @param userId 用户ID * @param url 新的头像URL地址 * @return ProfileResponse 包含更新后用户信息的响应对象 * @throws BusinessException 当用户不存在、头像链接为空、格式不合法或更新失败时抛出 */ @Override @Transactional public ProfileResponse updateAvatar(long userId, String url) { // 根据用户ID查询用户信息,如果用户不存在则抛出异常 Users user = lambdaQuery().eq(Users::getId, userId).oneOpt().orElseThrow(() -> new BusinessException(ErrorCode.IDENTIFIER_NOT_FOUND, "用户不存在")); // 检查头像链接是否为空 if (!StringUtils.hasText(url)) { throw new BusinessException(ErrorCode.BAD_REQUEST, "头像链接不能为空"); } // 简单的正则:必须以 http(s) 开头,通常以常见图片后缀结束 String regex = "^(https?|ftp)://[^\\s/$.?#].[^\\s]*$"; if (!url.matches(regex)) { throw new BusinessException(ErrorCode.BAD_REQUEST, "头像链接格式不合法"); } boolean success = lambdaUpdate().eq(Users::getId, userId).set(Users::getAvatar, url).update(); if (!success) { throw new BusinessException(ErrorCode.INTERNAL_ERROR, "头像更新失败"); } Users userUpdate = this.getBaseMapper().selectById(user.getId()); return ProfileResponse.fromEntity(userUpdate); } }

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

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

相关文章

MySQL:更新语句执行流程详解

其实更新语句update和查询语句“大同小异”&#xff0c;但关键的几个差异点&#xff0c;恰恰是面试常考、工作中容易踩坑的地方&#xff0c;尤其是redo log、binlog和两阶段提交&#xff0c;看完这篇彻底搞懂&#xff01; 先给大家一个核心结论&#xff1a;MySQL的update语句&a…

STM32心率血氧手环(可报警)

目录硬件设计传感器技术软件算法应用场景开发资源源码文档获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01;硬件设计 STM32心率血氧手环通常基于STM32微控制器&#xff08;如STM32F4或STM32L4系列&#xff09;&#xff0c;搭配光学传感器模块&am…

[langchain 内部数据传递层级]

@dynamic_prompt def dynamic_system_prompt(request: ModelRequest) -> str:user_name = request.runtime.context.user_name system_prompt = f"You are a helpful assistant. Address the user as {user_n…

STM32智能宠物喂食

目录 STM32智能宠物喂食系统概述核心功能硬件组成软件设计应用场景扩展功能 源码文档获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01; STM32智能宠物喂食系统概述 STM32智能宠物喂食系统是一种基于STM32微控制器的自动化解决方案&#xff0c;通…

2026年选择敏捷咨询机构:从“工具应用”到“价值落地”的转型关键

在VUCA时代&#xff0c;企业对敏捷的需求早已超越Scrum会议、看板工具的表层应用&#xff0c;转向全价值链的效率提升与组织能力重塑。2026年&#xff0c;随着数字化转型进入深水区&#xff0c;敏捷咨询机构的核心价值不再是简单传授方法论&#xff0c;而是帮助企业破解“敏捷落…

2026年马年零食大礼盒推荐Top5:从年味到健康的“不踩雷”选型指南

2026年马年零食大礼盒推荐Top5:从年味到健康的“不踩雷”选型指南2026年马年春节临近,不少人已经进入“零食礼盒挑选关键期”——既要满足“贴春联、拜大年”的年味仪式感,又要兼顾老人怕甜、孩子爱脆、年轻人要健康…

论文降AI率必备!5款工具横向测评,到底哪款能帮你将AIGC率降低80%以上

上周答辩前夕&#xff0c;我室友差点崩溃——论文被导师退回来了&#xff0c;原因是"疑似大量使用AI生成内容"。她哭着说&#xff1a;"我明明自己改过好几遍啊&#xff0c;为什么还是被查出来了&#xff1f;" 这场景我太熟悉了。去年我自己也经历过&#…

Java计算机毕设之基于Java+springboot的隧道云视频监控管理信息平台设计与实现(完整前后端代码+说明文档+LW,调试定制等)

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

[Unreal shader]深度缓冲重建世界坐标

UE中通过深度缓冲重建世界空间坐标原理和Unity shader重建原理基本一致&#xff0c;但是UE中重建世界坐标的实现路径与Unity是不一致的 &#xff1a;• Unity中使用 SAMPLE_DEPTH_TEXTUR 采样的是原始深度值&#xff08;RawDepth&#xff09;&#xff0c;是一个范围[0&#xff…

【毕业设计】基于springboot的隧道云视频监控管理信息平台设计与实现(源码+文档+远程调试,全bao定制等)

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

logging库使用教程

logging日志模块 logging是python常用的日志模块,logging涉及三个概念:logger可以理解为记者,决定写什么 handler可以理解为发布渠道,决定发到哪里 formatter可以理解为文章格式,决定排版格式 Level可以理解为重要…

【课程设计/毕业设计】基于springboot的隧道云视频监控管理信息平台设计与实现隧道内事故、火灾、车辆滞留等问题监察【附源码、数据库、万字文档】

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

SpringBoot:封装 starter

01 Starter 核心机制 SpringBoot 核心思想是约定大于配置&#xff0c;而 Starter 正是这一思想的核心落地载体。 简单来说&#xff0c;Starter 把某一类功能的依赖管理、默认配置、自动装配逻辑打包成一个独立 Jar 包。 项目只需引入这个 Jar 包&#xff0c;就能直接使用对应功…

滴滴 wsgsig secdd-challenge

声明 本文章中所有内容仅供学习交流使用&#xff0c;不用于其他任何目的&#xff0c;抓包内容、敏感网址、数据接口等均已做脱敏处理&#xff0c;严禁用于商业用途和非法用途&#xff0c;否则由 此产生的一切后果均与作者无关&#xff01; 部分python代码 url "ota/re…

RabbitMQ 在大数据领域的故障排查与解决方案

RabbitMQ 在大数据领域的故障排查与解决方案 关键词:RabbitMQ、大数据、消息队列、故障排查、性能优化、高可用性、消息丢失 摘要:本文深入探讨RabbitMQ在大数据环境下的常见故障及其解决方案。我们将从RabbitMQ的核心架构出发,分析其在大数据场景下面临的挑战,详细介绍故障…

Linux 内核漏洞提权

一、 内核提权的核心原理Linux 采用权限分级机制&#xff08;root:0&#xff0c;普通用户&#xff1a;1-65535&#xff09;&#xff0c;内核运行在最高权限的内核态&#xff08;Ring 0&#xff09;&#xff0c;用户程序运行在用户态&#xff08;Ring 3&#xff09;。内核提权的…

连接 AI 的隐形纽带:深度解构 MCP 传输层——从 Stdio 到 SSE 的实战抉择与架构差异

文章目录 &#x1f6f0;️ 连接 AI 的隐形纽带&#xff1a;深度解构 MCP 传输层——从 Stdio 到 SSE 的实战抉择与架构差异 &#x1f4e1;&#x1f3d7;️ 第一章&#xff1a;协议与通道的解耦——MCP 通信的底层逻辑1.1 JSON-RPC 2.0&#xff1a;MCP 的通用语言1.2 传输层的两…

计算机毕业设计springboot基于农科所农作物信息管理系统的设计与实现 基于SpringBoot的农业科研院所作物数据智慧管理平台的设计与实现面向农科机构的SpringBoot作物全生命周期

计算机毕业设计springboot基于农科所农作物信息管理系统的设计与实现8h3n8w22 &#xff08;配套有源码 程序 mysql数据库 论文&#xff09; 本套源码可以在文本联xi,先看具体系统功能演示视频领取&#xff0c;可分享源码参考。在“互联网农业”快速渗透的今天&#xff0c;农科所…

测试转网络安全如何弯道超车?

目录&#x1f62d; 测试的痛&#xff0c;谁懂&#xff1f;1. 重复劳动&#xff0c;永无止境2. 被动等待&#xff0c;毫无主动权3. 技术含量低&#xff0c;成长受限❓ 转行网安1. 测试经验&#xff0c;天然就是安全优势2. 技能高度重叠&#xff0c;转型零成本3. 工作模式更自由&…

Java计算机毕设之基于springboot的智慧医疗网上预约系统智慧医疗服务-智慧医疗服务平台(完整前后端代码+说明文档+LW,调试定制等)

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…