用户模块——自定义业务异常
用户信息查询接口
在开发用户系统时,一个最基本的需求就是获取用户的个人信息,比如昵称、头像、改名卡次数等。本部分将介绍如何实现一个用户信息查询接口,并结合项目中的用户背包表,查询用户是否有可用的改名卡。
1. 用户信息查询逻辑
在项目中,用户可以通过 API 调用 查询自己的个人信息,返回的数据通常包括用户的基本信息以及一些额外属性(如改名卡次数)。
在代码层面,我们可以直接调用 userService.getUserInfo(uid)
方法获取用户信息,并使用 ApiResult.success()
包装返回值,让前端可以方便地解析结果:
return ApiResult.success(userService.getUserInfo(RequestHolder.get().getUid()));
这里的 RequestHolder.get().getUid()
负责从 ThreadLocal
变量中获取 uid
,这个 uid
是通过前端传来的 Token 解析 得到的(稍后详细介绍)。
2. 获取用户的改名卡次数
为什么需要查询背包表?
改名卡并不是直接存储在 User
表里的,而是放在个人背包表中(例如 user_item_bag
),所以我们需要去这个表里查询用户是否拥有可用的改名卡。
查询方式如下:
-
通过
uid
和itemid
查询该用户是否拥有改名卡。 -
status
字段用于判断改名卡是否可用。 -
在项目中,我们有一个
YesOrNo
公共枚举,它定义了0
代表无效,1
代表有效。
代码示例:
UserItem renameCard = userItemBagMapper.findItemByUidAndItemId(uid, ITEM_ID_RENAME_CARD);
boolean hasRenameCard = renameCard != null && renameCard.getStatus() == YesOrNo.YES;
最终,我们可以将 hasRenameCard
的值加入 UserInfo
返回给前端。
3. Token 解析与用户身份确定
前端请求接口时,需要在 请求头(header) 中携带 token
,这个 token
是用户登录后分配的身份凭证。例如:
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
后端会解析这个 token
,并从中提取出 uid
,然后保存在 ThreadLocal
变量中,确保在整个请求生命周期内都能获取到该用户信息:
public class RequestHolder {private static final ThreadLocal<UserToken> threadLocal = new ThreadLocal<>();public static void set(UserToken userToken) {threadLocal.set(userToken);}public static UserToken get() {return threadLocal.get();}public static void remove() {threadLocal.remove();}
}
这样,业务代码就可以随时通过 RequestHolder.get().getUid()
获取当前用户的 uid
,不需要每个方法都手动传递 uid
了。
总结
-
用户信息接口通过
userService.getUserInfo(uid)
获取用户数据,并返回给前端。 -
改名卡存储在 用户背包表 中,需要通过
uid + itemid
查询,并用status
字段判断是否可用。 -
前端请求时需要携带
token
,后端解析token
并存入ThreadLocal
,确保在整个请求中都能获取到uid
。
这一部分实现了用户基本信息的查询,下一步,我们将开发用户改名接口,让用户可以修改自己的昵称! 🚀
用户改名接口
用户希望修改自己的昵称,但为了防止滥用,我们需要做一些必要的校验,比如:
-
新名字不能为空,长度不能太长。
-
用户必须拥有有效的改名卡才能改名。
-
处理改名前后端的交互方式。
这一部分,我们来实现一个安全、合规的用户改名接口。
1. 注册改名接口
在 UserController
中,我们用 @PutMapping("/name")
注册接口:
@PutMapping("/name")
public ApiResult<?> modifyName(@Valid @RequestBody ModifyNameRequest request) {Long uid = RequestHolder.get().getUid(); // 获取当前用户IDreturn userService.modifyName(uid, request.getNewName());
}
这里的关键点:
-
@PutMapping("/name")
代表这是一个 PUT 请求,适用于更新操作。 -
@RequestBody ModifyNameRequest request
用于接收前端提交的 JSON 数据,ModifyNameRequest
结构如下:
public class ModifyNameRequest {@NotBlank(message = "新名称不能为空")@Length(max = 20, message = "新名称不能超过20个字符")private String newName;// 省略getter/setter
}
-
@Valid
注解启用了参数校验,如果新名字为空或超过 20 个字符,就会抛出异常(下一节介绍如何捕获异常)。
2. 处理改名逻辑
在 UserService
里实现 modifyName()
方法:
public ApiResult<?> modifyName(Long uid, String newName) {// 1. 检查新名称是否和当前名称相同User user = userMapper.findById(uid);if (user == null) {return ApiResult.fail(CommonErrorEnum.USER_NOT_FOUND);}if (user.getName().equals(newName)) {return ApiResult.fail(CommonErrorEnum.NAME_NO_CHANGE);}// 2. 检查用户是否有可用的改名卡UserItem renameCard = userItemBagMapper.findItemByUidAndItemId(uid, ITEM_ID_RENAME_CARD);if (renameCard == null || renameCard.getStatus() != YesOrNo.YES) {return ApiResult.fail(CommonErrorEnum.NO_RENAME_CARD);}// 3. 扣除改名卡,并更新用户名userItemBagMapper.useItem(renameCard.getId()); // 标记改名卡已使用userMapper.updateUserName(uid, newName);return ApiResult.success("改名成功");
}
这里的关键点:
✔ 检查新名称是否合法(不能和当前名称相同)。
✔ 查询用户的改名卡,确保用户拥有可用的改名卡。
✔ 扣除改名卡,并更新用户昵称。
3. 处理异常情况
Spring 提供了 @ExceptionHandler
让我们可以捕获异常,统一返回友好的错误信息。
在 GlobalExceptionHandler
里,我们添加对参数校验失败的处理:
@ExceptionHandler(MethodArgumentNotValidException.class)
public ApiResult<?> handleValidationException(MethodArgumentNotValidException e) {String message = e.getBindingResult().getAllErrors().get(0).getDefaultMessage();return ApiResult.fail(CommonErrorEnum.INVALID_PARAM.getCode(), message);
}
这样,当用户提交的 newName
为空或超长时,系统会自动返回:
{"code": 400,"message": "新名称不能为空"
}
此外,我们还可以拦截所有 非预期异常,避免直接暴露给前端:
@ExceptionHandler(Throwable.class)
public ApiResult<?> handleUnknownException(Throwable e) {log.error("系统异常", e);return ApiResult.fail(CommonErrorEnum.SYSTEM_ERROR);
}
4. 前后端交互示例
✅ 前端请求示例:
PUT /api/user/name
Content-Type: application/json
Authorization: Bearer <用户的Token>{"newName": "新的昵称"
}
✅ 正常返回:
{"code": 200,"message": "改名成功"
}
❌ 错误示例(改名卡不足):
{"code": 403,"message": "没有可用的改名卡"
}
总结
-
@PutMapping("/name")
注册了改名接口,接收前端的 JSON 请求。 -
参数校验:使用
@Valid
确保新名称不能为空且不超长。 -
业务逻辑:检查 改名卡 是否可用,成功后扣除改名卡并更新用户名。
-
全局异常处理:拦截校验失败 & 其他异常,避免直接抛出错误给前端。
这样,一个完整的用户改名接口就开发完成了! 🎉
下一步,我们来看看全局异常处理,让错误信息更加清晰统一! 🚀
全局异常处理(Global Exception Handler)
在开发接口时,异常处理是非常重要的环节。一个好的异常处理机制,能够让我们的系统更加稳定,并且可以给前端返回清晰、统一的错误信息。
本节内容,我们来实现一个全局异常处理器,让系统能够优雅地应对各种异常。
1. 为什么需要全局异常处理?
在项目中,异常可能来自多个地方,比如:
-
用户输入错误(参数为空、格式错误等)。
-
业务逻辑异常(改名卡不足、用户不存在等)。
-
系统异常(数据库连接失败、空指针异常等)。
如果每个接口都手动 try-catch,不仅代码冗余,还容易遗漏某些异常。全局异常处理可以拦截所有异常,统一处理后再返回给前端。
2. 如何实现全局异常处理?
Spring 提供了 @ControllerAdvice
和 @ExceptionHandler
让我们可以全局捕获异常,并返回统一格式的 JSON 响应。
我们创建一个 GlobalExceptionHandler
处理所有的异常情况。
@RestControllerAdvice
@Slf4j
public class GlobalExceptionHandler {/*** 处理参数校验失败(@Valid 校验)*/@ExceptionHandler(MethodArgumentNotValidException.class)public ApiResult<?> handleValidationException(MethodArgumentNotValidException e) {String message = e.getBindingResult().getAllErrors().get(0).getDefaultMessage();return ApiResult.fail(CommonErrorEnum.INVALID_PARAM.getCode(), message);}/*** 处理业务异常(自定义异常)*/@ExceptionHandler(BusinessException.class)public ApiResult<?> handleBusinessException(BusinessException e) {return ApiResult.fail(e.getErrorCode(), e.getMessage());}/*** 处理所有未知异常(兜底)*/@ExceptionHandler(Throwable.class)public ApiResult<?> handleUnknownException(Throwable e) {log.error("系统异常", e);return ApiResult.fail(CommonErrorEnum.SYSTEM_ERROR);}
}
3. 代码解析
1️⃣ 处理参数校验失败
如果用户输入的数据不符合 @Valid
校验(如改名时名字为空),会抛出 MethodArgumentNotValidException
,我们在这里提取错误信息并返回给前端:
@ExceptionHandler(MethodArgumentNotValidException.class)
public ApiResult<?> handleValidationException(MethodArgumentNotValidException e) {String message = e.getBindingResult().getAllErrors().get(0).getDefaultMessage();return ApiResult.fail(CommonErrorEnum.INVALID_PARAM.getCode(), message);
}
✅ 示例错误返回:
{"code": 400,"message": "新名称不能为空"
}
2️⃣ 处理业务异常
对于我们自己定义的业务异常(如用户没有改名卡),可以创建 BusinessException
并统一处理:
public class BusinessException extends RuntimeException {private final int errorCode;public BusinessException(CommonErrorEnum errorEnum) {super(errorEnum.getMessage());this.errorCode = errorEnum.getCode();}public int getErrorCode() {return errorCode;}
}
然后,在全局异常处理器中捕获:
@ExceptionHandler(BusinessException.class)
public ApiResult<?> handleBusinessException(BusinessException e) {return ApiResult.fail(e.getErrorCode(), e.getMessage());
}
✅ 示例错误返回:
{"code": 403,"message": "没有可用的改名卡"
}
3️⃣ 兜底处理所有未知异常
如果某个异常没有被前面捕获,我们用 Throwable.class
兜底处理,同时记录日志,方便排查问题:
@ExceptionHandler(Throwable.class)
public ApiResult<?> handleUnknownException(Throwable e) {log.error("系统异常", e);return ApiResult.fail(CommonErrorEnum.SYSTEM_ERROR);
}
✅ 示例错误返回:
{"code": 500,"message": "系统错误,请稍后再试"
}
4. 错误码枚举(CommonErrorEnum)
为了让错误信息更规范,我们用一个枚举类来管理所有的错误码:
@Getter
public enum CommonErrorEnum {INVALID_PARAM(400, "请求参数错误"),USER_NOT_FOUND(404, "用户不存在"),NAME_NO_CHANGE(400, "新名称不能与当前名称相同"),NO_RENAME_CARD(403, "没有可用的改名卡"),SYSTEM_ERROR(500, "系统错误,请稍后再试");private final int code;private final String message;CommonErrorEnum(int code, String message) {this.code = code;this.message = message;}
}
这样,所有的错误信息都在这里管理,后续扩展也非常方便! 🎯
5. 前后端交互示例
✅ 前端请求
PUT /api/user/name
Content-Type: application/json{"newName": ""
}
❌ 返回(参数校验失败)
{"code": 400,"message": "新名称不能为空"
}
❌ 返回(没有改名卡)
{"code": 403,"message": "没有可用的改名卡"
}
❌ 返回(系统异常)
{"code": 500,"message": "系统错误,请稍后再试"
}
6. 总结
-
全局异常处理能统一管理错误,避免代码中大量
try-catch
。 -
@ExceptionHandler
用于捕获特定异常,让错误信息友好、一致。 -
错误码枚举(
CommonErrorEnum
)可以集中管理错误信息,方便扩展。 -
日志记录能帮助我们快速排查问题,避免未知错误影响用户体验。
至此,我们的全局异常处理机制完成了! 🎉
现在,无论用户输入错误,还是系统出现异常,前端都能收到清晰、规范的错误信息! 🚀
相关文章:
用户模块——自定义业务异常
用户信息查询接口 在开发用户系统时,一个最基本的需求就是获取用户的个人信息,比如昵称、头像、改名卡次数等。本部分将介绍如何实现一个用户信息查询接口,并结合项目中的用户背包表,查询用户是否有可用的改名卡。 1. 用户信息查…...
基于数据挖掘从经验方和医案探析岭南名医治疗妇科疾病的诊疗和用药规律
标题:基于数据挖掘从经验方和医案探析岭南名医治疗妇科疾病的诊疗和用药规律 内容:1.摘要 背景:岭南地区独特的地理环境、气候条件及人文风俗使该地区妇科疾病具有一定特点,岭南名医在长期临床实践中积累了丰富的治疗经验。目的:基于数据挖掘…...
从零到一开发一款 DeepSeek 聊天机器人
AI聊天机器人 目标设计方案系统架构技术选型功能模块 实现代码环境配置安装依赖 核心代码API 请求函数主循环函数 功能扩展1. 情感分析2. 多语言支持3. 上下文记忆4. 用户身份识别 总结附录 目标 开发一个智能聊天机器人,旨在为用户提供自然、流畅的对话体验。通过…...
开源CDN产品-GoEdge
一、背景 上篇文章分析了一下CDN的基本原理以及使用代码实现了一个乞丐版的智能DNS调度器。从整个例子我们可以清晰了解到CDN原理,也就那么回事。 但是,之前也讲过了,CDN产品融合的技术比较杂、也比较多。所以我就想着,万物皆有开…...
Resume全栈项目(一)(.NET)
文章目录 项目地址一、数据库创建/日志安装1.1 创建实体层1. Entities2. Enums 存放枚举 1.2 创建数据库层1. 安装Persistance层需要的库2. 创建ResumeDbContext3. 添加数据库配置/注册DBContext4. 执行Add-Migration5. 修改字段类型6. Enum支持Json 1.3 安装Serilog1. Api层安…...
如何快速下载并安装 Postman?
从下载、安装、启动 Postman 这三个方面为大家详细讲解下载安装 Postman 每一步操作,帮助初学者快速上手。 Postman 下载及安装教程(2025最新)...
【PICO】开发环境配置准备
Unity编辑器配置 安装Unity编辑器 安装UnityHub 安装Unity2021.3.34f1c1 添加安卓平台模块 Pico软件资源准备 资源准备地址:Pico Developer PICO SDK PICO Unity Integration SDK PICO Unity Integration SDK 为 PICO 基于 Unity 引擎研发的软件开发工具…...
Unity图形学Shader快速回顾
参考知识点来源于: 人间自有韬哥在, 唐老狮,窗外听轩雨 , 呆呆敲代码的小Y little_fat_sheep, AitTech, DeepSeek, 百度, 豆包 目录 一、渲染管线1.应用阶段2.几何阶段3.光栅化阶段 二、矩阵的几何意义1. 平移2. 旋转3. 缩放4.复合运算 三、…...
十六进制(Hexadecimal)简介
十六进制(Hexadecimal)简介 1.1 什么是十六进制? 十六进制是一种使用16个符号表示数值的系统:数字0-9(表示0-9),字母A-F(表示10-15)。 1.2 十六进制表示法 在编程中&a…...
1、pytest基本用法
目录 先给大家分享下学习资源 1. 安装pytest 2. 编写用例规则 3. 执行用例 最近在学习pytest的用法 并且用这套框架替换了原来的unittest, 同是测试框架 确实感觉到pytest更加便捷 这边分享给大家我得学习心得 先给大家分享下学习资源 1 官方文档 pytest 官方…...
2024年3月全国计算机等级考试真题(二级C语言)
😀 第1题 下列叙述中正确的是 A. 矩阵是非线性结构 B. 数组是长度固定的线性表 C. 对线性表只能作插入与删除运算 D. 线性表中各元素的数据类型可以不同 题目解析: A. 矩阵是非线性结构 错误。矩阵通常是二维数组,属…...
GitHub高级筛选小白使用手册
GitHub高级筛选小白使用手册 GitHub 提供了强大的搜索功能,允许用户通过高级筛选器来精确查找仓库、Issues、Pull Requests、代码等。下面是一些常用的高级筛选用法,帮助你更高效地使用 GitHub 搜索功能。 目录 搜索仓库搜索Issues搜索Pull Requests搜…...
如何用腾讯云建站做好一个多语言的建筑工程网站?海外用户访问量提升3倍!分享我的经验
作为新疆地区领先的工程建筑企业,我们深知在数字化浪潮中,一个专业、高效且具备国际视野的官方网站是企业形象与业务拓展的“门面担当”。然而,传统的建站流程复杂、技术门槛高、多语言适配难等问题,曾让我们在数字化转型中举步维…...
SpringBoot-配置文件中敏感信息的加密保姆级教程
前言 公司安全部门检查,要求系统配置文件中的敏感信息如数据库密码等,进行加密处理,否则将受到公司的安全处罚,无奈只要按照公司要求,对springboot项目配置文件的敏感信息进行加密和解密处理。详细教程如下。 快速上…...
数据结构——串
串是一种数据元素为字符的特殊的线性表。 1. 串的定义 零个或多个字符(字母、数字或其他字符)组成的有限序列。记为 S"a1a2...an"S"a1a2...an",长度为 nn,空串长度为0。 2.串的术语 串长度…...
使用python爬取网络资源
整体思路 网络资源爬取通常分为以下几个步骤: 发送 HTTP 请求:使用requests库向目标网站发送请求,获取网页的 HTML 内容。解析 HTML 内容:使用BeautifulSoup库解析 HTML 内容,从中提取所需的数据。处理数据ÿ…...
【MySQL | 七、存储引擎是什么?】
存储引擎是什么?作用于哪里? 1. 存储引擎的定义 存储引擎(Storage Engine)是数据库管理系统中负责 数据的存储、检索和管理 的核心组件。它决定了数据如何存储在磁盘上,以及如何从磁盘中读取数据。存储引擎是数据库与…...
Linux -- 进程间通信(IPC)-- 进程间通信、管道、system V 共享内存、system V 消息队列、责任链模式 、system V 信号量
一、什么是进程间通信 1.进程间通信的目的 数据传输:一个进程需要将它的数据发送给另一个进程。资源共享:多个进程之间共享同样的资源。通知事件:一个进程需要向另一个或一组进程发送消息,通知它(它们)发…...
远程登录服务(ssh)
一、远程登录服务概述 1. 概念 远程登录服务就像是一个神奇的桥梁,它让你能够跨越物理距离,通过网络连接到另一台计算机上进行操作。无论你身在何处,只要有网络连接,你就可以像坐在目标计算机前一样进行各种操作。 2. 功能 分享…...
【从零实现Json-Rpc框架】- 项目设计篇
📢博客主页:https://blog.csdn.net/2301_779549673 📢博客仓库:https://gitee.com/JohnKingW/linux_test/tree/master/lesson 📢欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正! &…...
EtherCAT转CANopen配置CANopen侧的PDO映射
EtherCAT转CANopen配置CANopen侧的PDO映射 在工业自动化领域,EtherCAT和CANopen是两种广泛应用的通信协议。它们各自具有独特的优势,但在某些应用场景下,需要将这两种协议进行转换以实现设备间的高效数据交换。本文将详细介绍如何在使用Ethe…...
Vite管理的Vue3项目中monaco editer的使用以及组件封装
文章目录 背景环境说明安装流程以及组件封装引入依赖封装组件 外部使用实现效果 v-model实现原理 背景 做oj系统的时候,需要使用代码编辑器,决定使用Monaco Editor,但是因为自身能力问题,读不懂官网文档,最终结合ai和网友的帖子成功引入&…...
完整的类在JVM中的生命周期详解
首先给出一个示例代码: 示例的目标是展示一个多功能的类结构,包含继承、接口实现、静态成员、本地方法、线程安全等特性,同时模拟一个简单的“计算器”场景,计算并管理数字。(尽量将所有的 Java 组件和关键字都给出&am…...
大数据学习栈记——HBase操作(shell java)
本文介绍HBase在shell终端的常见操作以及如何利用java api操作HBase,操作系统:Ubuntu24.04 参考: https://blog.51cto.com/u_16099228/8016429 https://blog.csdn.net/m0_37739193/article/details/73618899 https://cloud.tencent.com/d…...
【商城实战(65)】退换货流程全解析:从前端到后端的技术实现
【商城实战】专栏重磅来袭!这是一份专为开发者与电商从业者打造的超详细指南。从项目基础搭建,运用 uniapp、Element Plus、SpringBoot 搭建商城框架,到用户、商品、订单等核心模块开发,再到性能优化、安全加固、多端适配,乃至运营推广策略,102 章内容层层递进。无论是想…...
改进BM25稀疏检索和BGE稠密检索
改进BM25稀疏检索和BGE稠密检索 检索算法层面 混合检索策略优化 自适应加权融合:在BM25和BGE等混合检索时,根据查询文本的特征(如长度、专业术语占比等)动态调整两者的权重。例如,对于包含大量专业术语的查询,增加BGE的权重;对于关键词明确的简单查询,增加BM25的权重。…...
WPS二次开发系列:以自动播放模式打开PPT文档
在前面文章中 android 调用wps打开文档并感知保存事件 介绍了如何使用WPS SDK打开文档,那么我们是否能够实现在打开WPS 文档的时候能够传递一些参数来控制打开文档的行为呢,经过研究WPS SDK相关文档和API,最终实现了 以自动播放方式打开PPT文…...
当AI重构编程范式:Java 24的进化逻辑与技术深水区的战略突围
一、语言进化的底层密码:从“工具适配”到“定义规则” 在2025年3月19日发布的Java 24中,Oracle以"30周年技术宣言"的姿态展示了编程语言进化的新范式。该版本不仅包含模式匹配、结构化并发等21项JEP特性,更通过后量子加密、AI原生…...
air780eq 阿里云
硬件:APM32F030C8 Air 780eq 参考文档: 合宙780E-4G模块通过AT指令连接到阿里云平台,实现信息的收发_air780e上传阿里云属性值at命令-CSDN博客 阿里云 - atair780eq - 合宙文档中心 4G模块接入阿里云-实现数据上传和命令下发_4g模块上传…...
网络安全之vlan实验
在对vlan进行一定的学习之后我们来练习一个小实验来加深理解记忆 首先是对实验进行一个搭建 第一部分:给交换机配置vlan 首先是sw1 [Huawei]vlan batch 2 to 5 [Huawei]int g0/0/1 [Huawei-GigabitEthernet0/0/1]port hybrid tagged vlan 2 [Huawei-GigabitEthe…...
mac命令行快捷键
光标移动 Ctrl A: 将光标移动到行首。Ctrl E: 将光标移动到行尾。Option 左箭头: 向左移动一个单词。Option 右箭头: 向右移动一个单词。 删除和修改 Ctrl K: 删除从光标到行尾的所有内容。Ctrl U: 删除从光标到行首的所有内容。Ctrl W: 删除光标前的一个单词。Ctrl …...
计算机网络 - OSI 七层模型
OSI 七层模型 OSI(Open System Interconnection,开放系统互联)模型由 ISO(国际标准化组织) 制定,目的是为不同计算机网络系统之间的通信提供一个标准化的框架。它将网络通信划分为 七个层次,每…...
TCP/IP 协议族详细知识点清单
📚 TCP/IP 协议族详细知识点清单 一、概述与体系结构 🌐 TCP/IP 协议模型(四层模型) 层次协议功能应用层HTTP、FTP、DNS、SMTP提供应用服务传输层TCP、UDP端到端传输,可靠或不可靠网络层IP、ICMP、ARP、RARP寻址、路…...
Vue3(自定义指令directive详解)
文章目录 前言一、自定义指令的生命周期钩子二、自定义指令的创建与注册使用三、扩展 简化形式总结 前言 在Vue3中,自定义指令是一种强大的工具,允许开发者扩展和增强HTML元素的功能。以下是对Vue3中自定义指令的详细解析: 一、自定义指令…...
Redis--redis客户端
目录 一、引言 二、数据库管理命令 三、redis客户端 四、Java客户端使用Redis 五、相关命令使用 1.get,set 2.exists,del 3.keys 4.expire,ttl 六、总结 一、引言 在之前学了redis相关类型命令之后,本篇文章,…...
【高项】信息系统项目管理师(十)项目风险管理【5分】
项目风险是一种不确定的事件或条件,一旦发生,会对项目目标产生某种正面或负面的影响。项目风险既包括对项目目标的威胁,也包括促进项目目标的机会。已知风险是那些已经经过识别和分析的风险,对于已知风险,对其进行规划,寻找应对方案是可行的;虽然项目经理们可以依据以往…...
jenkins批量复制视图项目到新的视图
1、当前视图为 测试2分支,创建了新的视图为国际化预生产 2、进入系统设置的脚本管理 import hudson.model.* //源view def str_view "测试2分支" //目标view def str_new_view "国际化预生产" //源job名称(模糊匹配) def str_search &qu…...
uv:Rust 驱动的 Python 包管理新时代
在 Python 包管理工具层出不穷的今天,pip、pip-tools、poetry、conda 等各有千秋。而今天要介绍的 uv,则是一款由 Astral 团队推出、采用 Rust 编写的全新工具,目标直指成为 “Python 的 Cargo”。它不仅在性能上表现优异,而且在功…...
GD32 ISP下载程序(串口烧录)
一、下载烧录软件 下载地址兆易创新GigaDevice-资料下载兆易创新GD32 MCUhttps://www.gd32mcu.com/cn/download?kwGD32All-In-OneProgrammer&lancn 二、使用USB转串口连接GD32开发板 这里使用GD32E230C8T6为例: GD32E230C8T6USB 转串口模块说明PA9ÿ…...
Spring MVC 配置详解与入门案例
目录 引言 一、Spring MVC 的发展背景 1. Model I 与 Model II 2. MVC 模式 二、Spring MVC 入门案例 1. 创建 WEB 工程并引入依赖 2. 配置 web.xml 3. 配置 springmvc.xml 4. 创建控制器和视图 5. 部署并测试 三、Spring MVC 原理 1. 核心组件 2. 请求处理流程 …...
【10万QPS压力测试】Redis三主三从高可用集群基准测试
📕我是廖志伟,一名Java开发工程师、《Java项目实战——深入理解大型互联网企业通用技术》(基础篇)、(进阶篇)、(架构篇)清华大学出版社签约作家、Java领域优质创作者、CSDN博客专家、…...
git的进阶使用
一.协作冲突 举个简单的例子,公司里两个人(A,B)同一天上班,都拉取了远程仓库数据。然后A做完了所有的工作,进行了x文件的修改并提交至远程仓库。而B在做自己工作的时候不小心或者需要修改x文件,B认为A没有操作x文件直接push没有问…...
23种设计模式-责任链(Chain of Responsibility)设计模式
责任链设计模式 🚩什么是责任链设计模式?🚩责任链设计模式的特点🚩责任链设计模式的结构🚩责任链设计模式的优缺点🚩责任链设计模式的Java实现🚩代码总结🚩总结 🚩什么是…...
MySQL复习
1基本操作复习 1.1数据库创建 创建数据库create database 数据库名;判断再创建数据库create database if not exists 数据库名;创建数据库指定字符集create database 数据库名 character set 字符集;创建数据库指定排序方式create database 数据库名 collate 排序方式;创建数据…...
【嵌入式学习2】c语言重点整理
目录 ## 重点掌握 1、数组 2、指针 3、结构体 4、函数 回调函数的常见用途 ## 如何区分数组指针,指针数组,函数指针,结构体指针,指针偏移量 ## 重点掌握 1、数组 https://blog.csdn.net/weixin_60546365/article/details…...
java项目之基于ssm的个人博客网站(源码+文档)
项目简介 个人博客网站实现了以下功能: 个人博客网站在Eclipse环境中,使用Java语言进行编码,使用Mysql创建数据表保存本系统产生的数据。系统可以提供信息显示和相应服务,其管理员审核博客文章和相册分享信息,管理文…...
C++学习之路:从头搞懂配置VScode开发环境的逻辑与步骤
目录 编辑器与IDE基于vscode的C开发环境配置1. 下载vscode、浅尝编译。番外篇 2. 安装插件,赋能编程。3. 各种json文件的作用。c_cpp_properties.jsontask.jsonlaunch.json 总结&&彩蛋 编辑器与IDE 上一篇博客已经介绍过了C程序的一个编译流程,从…...
deploy myEclipse j2ee project to server没反应
解决办法 1.如果工作空间的问题,那么需要删除你工作空间的一个文件就可以解决了。 这个文件在Myeclipse工作区(workspace) .metadata\.plugins\org.eclipse.core.runtime\.settings目录...
react项目中当组件渲染的时候如何执行接口
最近遇到一个场景,就是组件渲染的时候去调用接口进行数据回填。这个在vue中很简单,在created生命周期函数中,直接调用接口即可。但是react没有created生命周期,所以在react中我们需要用到useEffect钩子函数。 在 React 函数组件中…...
python虚拟环境安装opus(windows)
python -m venv venv 创建虚拟环境后,并且安装软件包后,运行项目报错,提示如下: Could not find Opus library. Make sure it is installed 原因是缺少opus.dll, (先把项目内所有使用的第三方库都安装完成) 从以下页面下载.dll文件之后,放入venv\Scripts目录下即可 https://…...