sky项目开发文档

sky项目开发文档

day01

前后端项目导入和启动

前端运行;后端导入项目;git上传;数据库搭建(sky.sql);

前端nginx服务器

nginx文件的config文件覆盖; html文件夹的覆盖;
命令行启动nginx:brew services start nginx

后端项目

  1. 缺少.iml文件:终端进入项目文件夹,输入命令mvn idea:module

  2. 这里登录不了,可能有这三个原因,第一个数据库密码不匹配,你去dev文件改成你的数据库密码,第二个是nginx服务器可能没开好,你重新启动好;maven配置jre版本成自己的

  3. maven编译显示符号不存在:在设置里面找maven->运行程序>把”将…委托给maven”打开(我这是中文的,英文是runner)

  4. jdk版本更换

day02

新增员工代码完善:

  1. 同一用户重复添加的异常处理(全局处理器)
  2. 在JWT校验时 获得登陆用户的id (ThreadLocal对象)

ThreadLocal对象
对于每一个请求,都会为其新建一个独立的线程

分页操作:

1
2
3
4
5
6
7
8
9
10
11
12
@Override
public PageResult pageQuery(EmployeePageQueryDTO employeePageQueryDTO) {
//PageHelper、Page 这两个对象都是插件提供的
PageHelper.startPage(employeePageQueryDTO.getPage(),employeePageQueryDTO.getPageSize()); //设置分页参数

Page<Employee> page = employeeMapper.pageQuery(employeePageQueryDTO); //通过SQL查询得到一个Page对象,里面包含数据总数和数据列表

long total = page.getTotal(); //数据总数
List<Employee> records = page.getResult(); //数据列表

return new PageResult(total,records); //将得到的数据放到 一个用于返回前端数据的实体类中
}

日期注解

不加注解时,日期返回的是一个数组

1
2
3
4
5
6
7
8
9
10
11
12
13
14
//@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime createTime;

//@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime updateTime;

"createTime": [
2024,
11,
4,
18,
33,
37
],

通过消息转换器对日期对象进行序列化

1
2
3
4
5
6
7
8
9
10
11
12
13
/**
* 扩展spring MVC 框架的消息转换器(默认的消息转换器容器converters已经有8个消息转换器了)
* @param converters
*/
protected void extendMessageConverters(List<HttpMessageConverter<?>> converters){
//创建一个消息转换器对象
MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();
//需要为消息转换器设置一个对象转换器,对象转换器可以将java对象序列化为json数据
converter.setObjectMapper(new JacksonObjectMapper() );

//将自己的消息转换器加入到容器中,并设置优先级(否则使用不到)
converters.add(0,converter);
}

day3

得到自增的ID值

加上 useGeneratedKeys="true" keyProperty="id" 即可在数据库操作返回的实体类对象中 通过getId() 得到自增的ID值

1
2
3
<insert id="saveDish" parameterType="Dish" useGeneratedKeys="true" keyProperty="id">
insert into dish (<include refid="key"/>) values(<include refid="value"/>)
</insert>

得到用户的userId

在JWT校验的拦截器中,得到userId

1
2
3
4
5
6
7
8
9
    log.info("jwt校验:{}", token);
Claims claims = JwtUtil.parseJWT(jwtProperties.getUserSecretKey(), token);
Long userId = Long.valueOf(claims.get(JwtClaimsConstant.USER_ID).toString());
log.info("当前员工id:", userId);
//TODO 向当前线程对象ThreadLocal中存储id
BaseContext.setCurrentId(userId);

// ======== 取出存储的userId=========
BaseContext.getCurrentId

常见错误

Mapper.xml 中的SQL语句出错

1.

1
2
3
4
5
6
7
<if test="dish_flavor != null">
and dish_flavor = dishFlavor
</if>

<if test="dishFlavor != null">
and dish_flavor = dishFlavor
</if>
1
2
org.apache.ibatis.reflection.ReflectionException: There is no getter for property named 'dish_flavor' in 'class com.sky.entity.ShoppingCart'

2.

1
2
3
4
5
6
7
8
<if test="dishFlavor != null">
and dish_flavor = dishFlavor
</if>


<if test="dishFlavor != null">
and dish_flavor = #{dishFlavor}
</if>
1
java.sql.SQLSyntaxErrorException: Unknown column 'dishFlavor' in 'where clause'

day10

Spring Task (定时任务框架)

Spring框架提供的任务调度框架,可以按照约定的时间自动执行某个代码逻辑

应用场景:还款提醒;处理未支付订单;定时通知

cron 表达式
cron表达式其实就是一个字符串,通过cron表达式就可以定义任务触发的时间
构成规则:分成6或者7个域;每个域代表一个含义
每个域含义为:秒、分钟、小时、日、月、周、年(可选)

Spring Task使用步骤

  1. 导入Maven坐标 spring-context
  2. 启动类添加注解 @EnableScheduling 开启任务调度
  3. 自定义定时任务类

WebSocket

WebSocket 是基于TCP的一种新的网络协议;它实现了浏览器和服务器的全双工通信——浏览器和服务器只需要完成一次握手,两者就可以创建持久性的连接,并进行双向数据传输。

和Http的区别

  • HTTP是短连接;WebSocket是长连接
  • HTTP通信是单向的,基于请求响应模式;WebSocket是全双工

相同

  • 都是基于TCP

WebSocket使用步骤

alt text

WebSocket重大错误和解决方法
使用spring-websocket 配置时的Bean引入报错

Error creating bean with name 'serverEndpointExporter'

当进行 SpringBoot 单元测试时,并没有启动服务器,所以当加载到这个bean时会报错:
解决方案:在@SpringBootTest注解中添加webEnvironment配置,给wevsocket提供测试环境。

1
2
3
4
5
6
7
8
9
10
11
12
/**
* 注入ServerEndpointExporter,
* 这个bean会自动注册使用了@ServerEndpoint注解声明的Websocket endpoint
*/
@Bean
public ServerEndpointExporter serverEndpointExporter() {
return new ServerEndpointExporter();
}

// ========springboot-test
// 在@SpringBootTest注解中添加webEnvironment配置,给wevsocket提供测试环境。
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)

公共字段填充

https://blog.csdn.net/qq_49838656/article/details/131799350

来单提醒

alt text

@RequestBody()

要用封装好的 对象接收,不可以使用单独的数据参数接收
(@RequestBody() OrdersRejectionDTO ordersRejectionDTO)

redis 和nginx 停止命令

更换配置文件前先停止服务!!!
sudo nginx -s quit

ps aux | grep nginx

launchctl list | grep nginx

先关闭在启动
brew services stop nginx


sky项目开发文档
https://cs-lb.github.io/2024/11/04/Java/sky项目开发文档/
作者
Liu Bo
发布于
2024年11月4日
许可协议