Welcome to Aixin.me ❤️

  1. 提升胜任力,首先是动物本能,指的是生物天生具有的、未经思考的行为反应。
  2. 接着是自我反省,即对自己的行为、思想进行反思和审视。
  3. 情绪控制意味着能够管理和调节自己的情绪。知行合一表示认知和行动的统一。
  4. 专注与无私强调专注于某件事情并且不自私。利他是为他人利益考虑和行动。
  5. 最后,启蒙与觉醒指的是在思想和认知上达到更高的境界,获得新的领悟和成长。

Mysql使用JSON_CONTAINS查询JSON字段值

在 MySQL 里,JSON_CONTAINS 方法是可以用于多维 JSON 数据的,不过使用时要依据具体的场景与需求,采用不同的处理方式。下面为你详细介绍相关内容。 基本语法 JSON_CONTAINS(target, candidate[, path]) target:需要被检查的 JSON 文档。 candidate:要查找的 JSON 值。 path:可选参数,指定在 target 中进行查找的路径。 示例说明 1、单维 JSON 数组 1 2 3 4 5 6 7 8 9 10 11 -- 创建示例表 CREATE TABLE test_table ( id INT AUTO_INCREMENT PRIMARY KEY, json_data JSON ); -- 插入示例数据 INSERT INTO test_table (json_data) VALUES ('["apple", "banana", "cherry"]'); -- 查询包含 "banana" 的记录 SELECT * FROM test_table WHERE JSON_CONTAINS(json_data, '"banana"'); 在这个例子中,json_data 是单维 JSON 数组,JSON_CONTAINS 直接查找其中是否包含 "banana"。 ...

2025-04-25 · 1 min · 173 words

Springboot上传图片

在 Spring Boot 3 中,要实现限制上传图片尺寸、格式以及对图片进行裁剪压缩处理,可以按照以下步骤进行。下面是一个完整的示例代码: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.multipart.MultipartFile; import javax.imageio.ImageIO; import java.awt.*; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.nio.file.StandardCopyOption; @RestController public class ImageUploadController { private static final String UPLOAD_DIR = "uploads"; private static final String[] ALLOWED_TYPES = {"image/jpeg", "image/png", "image/gif"}; private static final int MAX_WIDTH = 1920; private static final int MAX_HEIGHT = 1080; private static final int TARGET_WIDTH = 800; private static final int TARGET_HEIGHT = 600; @PostMapping("/upload") public ResponseEntity<String> uploadImage(@RequestParam("image") MultipartFile file) { if (file.isEmpty()) { return new ResponseEntity<>("请选择要上传的图片", HttpStatus.BAD_REQUEST); } // 检查文件类型 String contentType = file.getContentType(); boolean isAllowed = false; for (String allowedType : ALLOWED_TYPES) { if (allowedType.equals(contentType)) { isAllowed = true; break; } } if (!isAllowed) { return new ResponseEntity<>("不支持的文件类型,仅支持 JPEG、PNG 和 GIF 格式", HttpStatus.BAD_REQUEST); } try { BufferedImage image = ImageIO.read(file.getInputStream()); int width = image.getWidth(); int height = image.getHeight(); // 检查图片尺寸 if (width > MAX_WIDTH || height > MAX_HEIGHT) { return new ResponseEntity<>("图片尺寸过大,最大宽度为 " + MAX_WIDTH + ",最大高度为 " + MAX_HEIGHT, HttpStatus.BAD_REQUEST); } // 裁剪和压缩图片 BufferedImage resizedImage = resizeImage(image, TARGET_WIDTH, TARGET_HEIGHT); // 创建上传目录(如果不存在) File uploadDir = new File(UPLOAD_DIR); if (!uploadDir.exists()) { uploadDir.mkdirs(); } // 获取文件名 String fileName = file.getOriginalFilename(); Path filePath = Paths.get(UPLOAD_DIR, fileName); // 保存处理后的图片 String format = contentType.split("/")[1]; ImageIO.write(resizedImage, format, filePath.toFile()); return new ResponseEntity<>("图片上传并处理成功", HttpStatus.OK); } catch (IOException e) { e.printStackTrace(); return new ResponseEntity<>("图片上传失败", HttpStatus.INTERNAL_SERVER_ERROR); } } private BufferedImage resizeImage(BufferedImage originalImage, int targetWidth, int targetHeight) { BufferedImage resizedImage = new BufferedImage(targetWidth, targetHeight, BufferedImage.TYPE_INT_RGB); Graphics2D graphics2D = resizedImage.createGraphics(); graphics2D.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR); graphics2D.drawImage(originalImage, 0, 0, targetWidth, targetHeight, null); graphics2D.dispose(); return resizedImage; } } 代码说明 文件类型限制: ALLOWED_TYPES 数组定义了允许上传的图片格式,在 uploadImage 方法中,通过 file.getContentType() 获取文件的 MIME 类型,并与 ALLOWED_TYPES 进行比较,若不匹配则返回错误信息。 图片尺寸限制: MAX_WIDTH 和 MAX_HEIGHT 定义了允许上传的最大图片尺寸。在 uploadImage 方法中,使用 ImageIO.read 读取图片文件为 BufferedImage 对象,然后获取其宽度和高度,若超过最大尺寸则返回错误信息。 图片裁剪压缩处理: TARGET_WIDTH 和 TARGET_HEIGHT 定义了处理后图片的目标尺寸。resizeImage 方法用于将原始图片按照目标尺寸进行裁剪和压缩,使用 Graphics2D 进行绘制,最后返回处理后的 BufferedImage 对象。 在 uploadImage 方法中,调用 resizeImage 方法对图片进行处理,然后使用 ImageIO.write 将处理后的图片保存到指定目录。

2025-04-25 · 2 min · 393 words

Springboot使用Redisson分布式锁

在 Spring Boot 项目里,运用 Redisson 实现分布式锁来处理销售扣减库存和入库增加库存,且同时操作一个库存值,可按以下步骤完成: 1、添加依赖 在pom.xml文件里添加 Redisson 和 Spring Boot Data Redis 的依赖: 1 2 3 4 5 6 7 8 9 10 11 12 13 <dependencies> <!-- Redisson --> <dependency> <groupId>org.redisson</groupId> <artifactId>redisson-spring-boot-starter</artifactId> <version>3.16.2</version> </dependency> <!-- Spring Boot Data Redis --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> </dependencies> 2、配置 Redisson 在application.yml文件里配置 Redis: 1 2 3 4 spring: redis: host: localhost port: 6379 3、在service中使用 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 import org.redisson.api.RLock; import org.redisson.api.RedissonClient; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.concurrent.TimeUnit; @Service public class InventoryService { @Autowired private RedissonClient redissonClient; // 库存键名 private static final String INVENTORY_KEY = "product:inventory:1"; /** * 销售扣减库存 * @param quantity 扣减数量 * @return 是否成功 */ public boolean deductInventory(int quantity) { // 获取分布式锁 RLock lock = redissonClient.getLock(INVENTORY_KEY); try { // 尝试加锁,等待10秒,自动释放锁时间为30秒 if (lock.tryLock(10, 30, TimeUnit.SECONDS)) { // 模拟从Redis获取当前库存 Integer currentInventory = getInventoryFromRedis(); if (currentInventory != null && currentInventory >= quantity) { // 扣减库存 int newInventory = currentInventory - quantity; // 更新Redis中的库存 updateInventoryInRedis(newInventory); return true; } } } catch (InterruptedException e) { Thread.currentThread().interrupt(); } finally { // 释放锁 if (lock.isHeldByCurrentThread()) { lock.unlock(); } } return false; } /** * 入库增加库存 * @param quantity 增加数量 */ public void addInventory(int quantity) { // 获取分布式锁 RLock lock = redissonClient.getLock(INVENTORY_KEY); try { // 尝试加锁,等待10秒,自动释放锁时间为30秒 if (lock.tryLock(10, 30, TimeUnit.SECONDS)) { // 模拟从Redis获取当前库存 Integer currentInventory = getInventoryFromRedis(); if (currentInventory != null) { // 增加库存 int newInventory = currentInventory + quantity; // 更新Redis中的库存 updateInventoryInRedis(newInventory); } } } catch (InterruptedException e) { Thread.currentThread().interrupt(); } finally { // 释放锁 if (lock.isHeldByCurrentThread()) { lock.unlock(); } } } /** * 从Redis获取当前库存 * @return 当前库存 */ private Integer getInventoryFromRedis() { // 这里需要根据实际情况实现从Redis获取库存的逻辑 return 100; } /** * 更新Redis中的库存 * @param newInventory 新的库存数量 */ private void updateInventoryInRedis(int newInventory) { // 这里需要根据实际情况实现更新Redis库存的逻辑 } } 代码解释 ...

2025-04-25 · 3 min · 446 words

Spring boot 限流

在 Spring Boot 3 中实现限流可以采用多种方式,下面为你介绍常见的三种: 1、使用 Sentinel 实现限流 Sentinel 是阿里巴巴开源的一款流量控制组件,具备实时监控、限流、熔断等功能。 步骤 添加依赖:在pom.xml里添加 Sentinel 的依赖。 1 2 3 4 5 <dependency> <groupId>com.alibaba.csp</groupId> <artifactId>sentinel-spring-boot-starter</artifactId> <version>1.8.6</version> </dependency> 配置规则:创建一个配置类来设置限流规则。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 import com.alibaba.csp.sentinel.slots.block.RuleConstant; import com.alibaba.csp.sentinel.slots.block.flow.FlowRule; import com.alibaba.csp.sentinel.slots.block.flow.FlowRuleManager; import org.springframework.context.annotation.Configuration; import javax.annotation.PostConstruct; import java.util.ArrayList; import java.util.List; @Configuration public class SentinelConfig { @PostConstruct public void initFlowRules() { List<FlowRule> rules = new ArrayList<>(); FlowRule rule = new FlowRule(); rule.setResource("yourResourceName"); rule.setCount(10); // 每秒最多允许10个请求 rule.setGrade(RuleConstant.FLOW_GRADE_QPS); rule.setLimitApp("default"); rules.add(rule); FlowRuleManager.loadRules(rules); } } 添加注解:在需要限流的方法上添加@SentinelResource注解。 ...

2025-04-25 · 2 min · 369 words

Antdv常见问题

Form 表单 官方文档:https://antdv.com/components/form-cn 问题:通过对象数据遍历表单组件,校验不生效或者校验不通过: 原因: rules必须加载<a-form-item>上,不能加载input、select等组件上,否则校验不生效 组件的v-model:value必须单独关联一个formdata对象中,不能直接使用原始数据对象,否则任何时候都显示校验提示,可以先将原始数据对象深拷贝到formdata对象中,然后再使用formdata对象进行校验,校验通过后再将formdata对象赋值给原始数据对象。 示例: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 // 原始表单数据对象 const formObject = ref({ name: { label: '分类名称', name: 'name', type: 'input', placeholder: '请输入分类名称', default: '默认数据', rules: [{ required: true, message: '请输入分类名称'}], }, status: { label: '状态', name: 'status', type: 'select', placeholder: '请选择状态', default: 1, options: [ { label: '启用', value: 1 }, { label: '禁用', value: 0 }, ], rules: [{ required: true, message: '请选择状态'}], }, }) // 表单数据存储对象 const formData = ref({}) // 原始数据对象深拷贝到表单数据存储对象中 const dataExtract = (data) => { Object.keys(data).forEach(key => { formData.value[key] = data[key].default }) } // 监听原始数据对象变化,将变化后的数据深拷贝到表单数据存储对象中 watch(formObject, (val) => { dataExtract(val) }, { immediate : true}) // 提取后的formData { name: '默认数据', status: 1, } Table 表格 官方文档:https://antdv.com/components/table-cn ...

2025-03-19 · 1 min · 162 words

Mockjs使用教程

一. 安装 1 npm install mockjs 官方文档:https://github.com/nuysoft/Mock/wiki 二. 使用 1. 基本使用 1 2 3 4 5 6 7 8 9 10 11 12 import Mock from "mockjs"; const data = Mock.mock({ // 属性 list 的值是一个数组,其中含有 3 到 3 个元素 'list|1-3': [{ // 属性 id 是一个自增数,起始值为 1,每次增 1 'id|+1': 1, 'name': '@name' }] }) // 输出结果 console.log(JSON.stringify(data, null, 4)) 输出结果: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 { "list": [ { "id": 1, "name": "王小明" }, { "id": 2, "name": "王小明" }, { "id": 3, "name": "王小明" } ] } 2. 语法规范 2.1. 数据模板定义规范 数据模板中的每个属性由 3 部分构成:属性名、生成规则、属性值: ...

2025-03-14 · 5 min · 933 words

Vue项目Axios集成Mock数据

本方案推荐使用axios-mock-adapter组件: 一、 安装 1 2 3 npm install axios --save npm install mockjs npm install axios-mock-adapter --save-dev 注意:axios和axios-mock-adapter版本要一致 axios-mock-adapter:https://www.npmjs.com/package/axios-mock-adapter mock:http://mockjs.com/ 二、应用案例 mock方法放在一个或多个文件中,比如use.js、article.js等 必须要实例化axios,否则会报错,实例化axios后,mock实例化时需要传入axios实例 导出mock方法,在业务中使用 1. 创建Mock方法 获取用户信息示例: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 // src/mock/index.js import axios from 'axios' import Mock from "mockjs"; import MockAdapter from 'axios-mock-adapter' // 创建axios实例 const instance = axios.create();// 这一步很重要 // 创建mock实例 const mock = new MockAdapter(instance) // 模拟GET请求(固定数据) mock.onGet('/user').reply(200, { id: 1, username: 'admin' }) // 模拟GET请求(随机数据) mock.onGet('/user').reply(200, Mock.mock({ id: '@id', username: '@name' })) // 使用axios请求mock并导出结果 export const getUser = () => { return instance.get('/user'); } 获取文章信息示例: ...

2025-03-13 · 3 min · 576 words

Springboot:Lombok

简介 Lombok 是一个 Java 库,它可以自动插入编辑器和构建工具中,简化 Java 代码的编写。 Lombok 提供了一系列注解,用于自动生成 getter、setter、构造函数、toString 方法等,从而减少了代码量,提高了代码的可读性和可维护性。 安装 1 2 3 4 5 <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.28</version> </dependency> 常用注解 注解名 作用 @Data 自动生成 getter、setter、toString、equals、hashCode 方法 @Getter 自动生成 getter 方法 @Setter 自动生成 setter 方法 @ToString 自动生成 toString 方法 @EqualsAndHashCode 自动生成 equals 和 hashCode 方法 @NoArgsConstructor 自动生成无参构造函数 @AllArgsConstructor 自动生成全参构造函数 全部注解 @Data @Data注解是一个非常强大的综合注解,它等价于同时使用@ToString、@EqualsAndHashCode、@Getter、@Setter和@RequiredArgsConstructor。使用@Data可以大大简化代码,减少样板代码的编写。 1 2 3 4 5 6 import lombok.Data; @Data public class Person { private String name; private int age; } @Getter和@Setter 1. 放置位置的灵活性 ...

2025-03-12 · 8 min · 1640 words

Springboot:输出嵌套数据

实体类 1 2 3 4 5 6 7 8 9 10 11 12 @Getter @Setter @AllArgsConstructor @NoArgsConstructor @Entity @TableName("t_article") public class Article { private Long id; private String title; private String content; private Long parentId; } DTO类 1 2 3 4 5 6 7 @Data public class ArticleDTO { private Long id; private String title; private String content; private List<ArticleDTO> children;//这是重点 } Service类 1 2 3 public interface ArticleService { List<ArticleDTO> getArticleList(); } ServiceImpl类 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 @Service public class ArticleServiceImpl implements ArticleService { @Autowired private ArticleMapper articleMapper; @Override public List<ArticleDTO> getArticleList() { // 查询所有文章 List<Article> articles = ArticleRepository.searchQuery(); Map<String, ArticleResDto> articleMap = new HashMap<>(); List<ArticleResDto> rootArticles = new ArrayList<>(); // 遍历所有文章,将其转换为ArticleResDto对象,并存储在articleMap中 // 这一步很重要,否则下一步for循环可能无法找到父节点导致数据丢失 for (Article article : articles) { ArticleResDto articleResDto = new ArticleResDto(); //将文章属性复制到文章DTO对象中对应属性中(两边属性字段必须相同,不相同的可以单独通过set方法赋值) BeanUtils.copyProperties(article, articleResDto); articleMap.put(article.getCode(), articleResDto); } // 遍历所有文章,将其转换为ArticleResDto对象,并存储在rootArticles中 for (Article article : articles) { // 从articleMap中获取对应的ArticleResDto对象 ArticleResDto articleResDto = articleMap.get(article.getCode()); // 如果该文章的parent为0,则将其作为根节点存储在rootArticles中 if (article.getParent().equals("0")) { rootArticles.add(articleResDto); } else { // 如果该文章的parent不为0,则将其作为子节点存储在对应的父节点的children中 ArticleResDto parentarticle = articleMap.get(article.getParent()); if (parentarticle != null) { // 如果父节点的children为null,则创建一个新的List对象 if (parentarticle.getChildren() == null) { parentarticle.setChildren(new ArrayList<>()); } parentarticle.getChildren().add(articleResDto); } } } return rootArticles; } // 返回顶级文章列表 /** * 输出结果: * [ * { * "id": 1, * "title": "文章1", * "content": "文章1的内容", * "children": [ * { * "id": 2, * "title": "文章2", * "content": "文章2的内容", * "children": [] * } * ] * } * ] */ return articleDTOs; } BeanUtils.copyProperties(article, articleDTO);将文章属性复制到文章DTO对象中对应属性中 ...

2025-03-11 · 2 min · 298 words

Spring Data JPA

第一步: maven中添加JPA依赖 1 2 3 4 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> 第二步(可选): 安装IDEA插件 JPA Buddy,可以自动生成Entity实体类和Repository仓库接口 第三步: 创建数据表,比如: 1 2 3 4 5 6 7 8 CREATE TABLE `user` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(255) DEFAULT NULL, `password` varchar(255) DEFAULT NULL, `age` int(11) DEFAULT NULL, `created_time` timestamp NULL DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4; 第四步: 创建数据表对应实体类 项目下边创建entity软件包(文件夹) 方法1(推荐):通过JPA Buddy插件创建,在entity上右键→新建→来自数据库的JPA实体,下边选择对应的数据表和字段,点击确认,就可以自动在entity下边创建对应的实体类了 ...

2025-03-10 · 12 min · 2400 words