PigCloud
注解
Serializable
Java中的一个重要概念,它表现为一个标记接口,主要用于支持对象的序列化和反序列化操作
它没有定义任何方法,仅仅起到一个标记作用,表明实现了该接口的类支持序列化和反序列化的功能1
2
3public class MyObject implements Serializable {
// 类的成员变量和方法
}
@NotBlank 和 @Schema
- @NotBlank 是Spring框架中用于验证的一个注解,用于确保被注解的字符串不是空白的(即不是null、不是空字符串””、不是只包含空格的字符串)
它通常用于验证用户输入或API请求中的参数 - @Schema 是Swagger(现在被称为OpenAPI)的一个注解,用于生成API文档的元数据
在实际开发中,这两个注解通常会一起使用,特别是在定义DTO(数据传输对象)或请求体时1
2
3
4
5
6
7
8public class ClientRequest {
// 验证失败将会返回一条错误信息:"client_id 不能为空"
private String clientId;
// 其他字段和方法...
}
@EqualsAndHashCode
Lombok 库中的一个注解
- 当 callSuper = true 时,生成的 equals 和 hashCode 方法会包含对超类相应方法的调用
这通常在你希望将超类的状态也纳入等值和哈希码计算时很有用 - 当 callSuper = false(默认值)时,生成的 equals 和 hashCode 方法不会调用超类的方法,只考虑当前类的字段
举个例子,Dog 类继承了 Animal 类,并且 Dog 类上的 @EqualsAndHashCode(callSuper = true) 注解确保了 equals 和 hashCode 方法会考虑 Dog 类的 breed 字段以及通过继承自 Animal 类的 name 字段1
2
3
4
5
6
7
8
9
10
11
12
13
14
15import lombok.EqualsAndHashCode;
public class Dog extends Animal {
private String breed; // 狗的品种
// 构造函数、getter 和 setter 方法等...
}
public class Animal {
private String name; // 动物的名字
// 构造函数、getter 和 setter 方法等...
}
@RequestBody
@RequestBody 是 Spring MVC 和 Spring WebFlux 中用于处理 HTTP 请求的一个注解
它主要用于将 HTTP 请求体(Body)中的 JSON、XML 或其他格式的数据绑定到方法的参数上
当 Spring MVC 接收到一个请求时,它会根据 @RequestBody 注解自动将请求体中的数据反序列化为 Java 对象。1
2
3
// @RequestBody将请求体中的数据反序列化为 SysLog 类型的对象,并将其作为 sysLog 参数传递给该方法
R<Boolean> saveLog(; SysLog sysLog)
@PathVariable
用于将URI模板变量绑定到控制器方法的参数上
当你在路由定义中使用花括号({})包围的变量时,这些变量就被称为URI模板变量1
2
3
// @PathVariable("key") 注解接收一个名为 key 的 URI 模板变量,并返回一个 R<String> 类型的对象
R<String> getByKey(; String key)
@RequestParam
从HTTP请求中提取参数并赋值给控制器方法参数1
2
3// 从HTTP请求中提取名为token的参数,并尝试将其转换为String类型,然后赋值给方法中的token参数
R<Map<String, Object>> queryToken(; String token)
@SpringQueryMap
这是一个Spring Cloud OpenFeign特有的注解,用于将复杂对象(如UserDTO,即数据传输对象)的属性作为查询参数(query parameters)附加到HTTP GET请求的URL上
例如如果UserDTO类中有name和age属性,并且方法被Feign客户端调用
那么生成的请求可能看起来像这样:/user/info/query?name=JohnDoe&age=30(假设UserDTO对象的name为JohnDoe,age为30)1
2
3
4
5
6
// 将user对象的属性作为查询参数添加到请求中
R<UserInfo> info(; UserDTO user)
//当调用queryUserInfo方法时,Feign会创建一个GET请求,并将UserDTO对象的属性转换为查询字符串
//例如,如果user对象的name是"John",age是30,那么生成的请求URL将是/user/info/query?name=John&age=30
@HasPermission
用于权限控制中,表明某个方法或类的访问或执行需要特定的权限1
2
3
4
5
6
7// 注解表明调用该方法需要具有"sys_client_add"权限
public R add( { SysOauthClientDetails clientDetails)
// 调用clientDetailsService的saveClient方法,将clientDetails保存到数据库中
// 并返回操作的结果(可能是保存后的客户端详情对象或操作成功的标识)
return R.ok(clientDetailsService.saveClient(clientDetails));
}
@ParameterObject
指示该参数是一个包含查询条件或其他业务逻辑的对象1
2
3
4
5// 定义一个方法getDemoPage,它接收两个参数:一个Page对象用于分页信息,一个DemoEntity对象可能用于查询条件
public R getDemoPage( { Page page, DemoEntity demo)
LambdaQueryWrapper<DemoEntity> wrapper = Wrappers.lambdaQuery();
return R.ok(demoService.page(page, wrapper));
}
Mybatis-Plus
查询条件构建方法
这些方法主要用于构建SQL查询语句中的WHERE条件部分
- .eq(column, value): 等于(equal)条件,表示字段(column)的值等于(=)指定的值(value)
- .ne(column, value): 不等于(not equal)条件,表示字段(column)的值不等于(<>)指定的值(value)
- .gt(column, value): 大于(greater than)条件,表示字段(column)的值大于(>)指定的值(value)
- .ge(column, value): 大于等于(greater than or equal to)条件,表示字段(column)的值大于等于(>=)指定的值(value)
- .lt(column, value): 小于(less than)条件,表示字段(column)的值小于(<)指定的值(value)
- .le(column, value): 小于等于(less than or equal to)条件,表示字段(column)的值小于等于(<=)指定的值(value)
- .between(column, value1, value2): 范围查询条件,表示字段(column)的值在指定的两个值(value1和value2)之间(包括这两个值),相当于SQL中的BETWEEN语句
- .notBetween(column, value1, value2): 非范围查询条件,表示字段(column)的值不在指定的两个值(value1和value2)之间,相当于SQL中的NOT BETWEEN语句
- .like(column, value): 模糊查询条件,表示字段(column)的值包含指定的值(value),相当于SQL中的LIKE语句。通常用于字符串字段的查询
- .notLike(column, value): 非模糊查询条件,表示字段(column)的值不包含指定的值(value),相当于SQL中的NOT LIKE语句
- .likeLeft(column, value): 左模糊查询条件,表示字段(column)的值以指定的值(value)开头,相当于SQL中的LIKE ‘%value’
- .likeRight(column, value): 右模糊查询条件,表示字段(column)的值以指定的值(value)结尾,相当于SQL中的LIKE ‘value%’
- .isNull(column): 空值查询条件,表示字段(column)的值为NULL
- .isNotNull(column): 非空值查询条件,表示字段(column)的值不为NULL
- .in(column, values): IN查询条件,表示字段(column)的值在指定的集合(values)中,相当于SQL中的IN语句
- .notIn(column, values): 非IN查询条件,表示字段(column)的值不在指定的集合(values)中,相当于SQL中的NOT IN语句
- .inSql(column, sqlSegment): 嵌套子查询IN条件,表示字段(column)的值在一个子查询的结果集中
- .notInSql(column, sqlSegment): 嵌套子查询非IN条件,表示字段(column)的值不在一个子查询的结果集中
- .exists(sqlSegment): EXISTS条件,用于检查子查询是否返回结果集
- .notExists(sqlSegment): NOT EXISTS条件,用于检查子查询是否不返回结果集
问题记录
Nacos服务列表为空
- 问题描述:本地项目依次成功启动,Nacos也可以成功启动,但是服务列表始终为空
- 原因分析:经排查发现本地安装过两个Nacos客户端,生成的缓存文件都在C:\Users\HUAWEI\nacos
- 解决方案:删除C盘中的nacos文件夹,重新启动项目,并且以后只用一个nacoa
启动服务不显示端口号
- 问题描述:在Idea中使用Service启动服务不显示端口号
- 原因分析:IDEA和其他许多应用程序一样,会使用缓存和临时文件来提高性能,然而,这些缓存和临时文件有时可能会导致显示问题
- 解决方案:删除C:\Users\HUAWEI\AppData\Local\Temp中的文件(这些都是缓存文件,有些可能正在被占用无法删除,可以跳过)
添加一张学生信息表
创建数据库使用sql文创建一张学生信息存储表1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17CREATE TABLE `sys_students` (
`student_id` INT NOT NULL AUTO_INCREMENT COMMENT '学号,唯一标识学生',
`name` VARCHAR(100) NOT NULL COMMENT '学生姓名',
`gender` ENUM('男', '女') NOT NULL COMMENT '学生性别',
`dob` DATE NOT NULL COMMENT '出生日期',
`enrollment_year` YEAR NOT NULL COMMENT '入学年份',
`major` VARCHAR(100) NOT NULL COMMENT '专业',
`phone` VARCHAR(15) DEFAULT NULL COMMENT '联系电话',
`email` VARCHAR(100) DEFAULT NULL COMMENT '电子邮件',
`address` VARCHAR(255) DEFAULT NULL COMMENT '家庭住址',
`status` ENUM('在读', '已毕业', '休学', '退学') DEFAULT '在读' COMMENT '学生状态',
`create_time` TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '记录创建时间',
`update_time` TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '记录最后更新时间',
PRIMARY KEY (`student_id`),
UNIQUE KEY `email_idx` (`email`) COMMENT '电子邮件唯一索引',
UNIQUE KEY `phone_idx` (`phone`) COMMENT '联系电话唯一索引'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='学生信息表';
- 数据源管理,连接数据库
别名:sys_students
用户名/密码:root
配置类型:主机
端口号:3306
主机:127.0.0.1
库名称:pig - 代码生成
填写相关信息直接生成代码
在数据库执行menu文件夹里的sysStudents_menu的sql文
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21-- 该脚本不要直接执行, 注意维护菜单的父节点ID 默认 父节点-1 ,
-- 菜单SQL
insert into sys_menu ( menu_id,parent_id, path, permission, menu_type, icon, del_flag, create_time, sort_order, update_time, name)
values (1733798239396, '-1', '/StudentsInfo/sysStudents/index', '', '0', 'icon-bangzhushouji', '0', null , '8', null , '学生信息表管理');
-- 菜单对应按钮SQL
insert into sys_menu ( menu_id,parent_id, permission, menu_type, path, icon, del_flag, create_time, sort_order, update_time, name)
values (1733798239397,1733798239396, 'StudentsInfo_sysStudents_view', '1', null, '1', '0', null, '0', null, '学生信息表查看');
insert into sys_menu ( menu_id,parent_id, permission, menu_type, path, icon, del_flag, create_time, sort_order, update_time, name)
values (1733798239398,1733798239396, 'StudentsInfo_sysStudents_add', '1', null, '1', '0', null, '1', null, '学生信息表新增');
insert into sys_menu (menu_id, parent_id, permission, menu_type, path, icon, del_flag, create_time, sort_order, update_time, name)
values (1733798239399,1733798239396, 'StudentsInfo_sysStudents_edit', '1', null, '1', '0', null, '2', null, '学生信息表修改');
insert into sys_menu (menu_id, parent_id, permission, menu_type, path, icon, del_flag, create_time, sort_order, update_time, name)
values (1733798239400,1733798239396, 'StudentsInfo_sysStudents_del', '1', null, '1', '0', null, '3', null, '学生信息表删除');
insert into sys_menu ( menu_id,parent_id, permission, menu_type, path, icon, del_flag, create_time, sort_order, update_time, name)
values (1733798239401,1733798239396, 'StudentsInfo_sysStudents_export', '1', null, '1', '0', null, '3', null, '导入导出');重新运行前端代码
- 在前端界面,权限管理-角色管理-管理员-授权-学生信息表