sky项目开发文档
day01
前后端项目导入和启动
前端运行;后端导入项目;git上传;数据库搭建(sky.sql);
前端nginx服务器
nginx文件的config文件覆盖; html文件夹的覆盖;
命令行启动nginx:brew services start nginx
后端项目
缺少.iml文件:终端进入项目文件夹,输入命令mvn idea:module
这里登录不了,可能有这三个原因,第一个数据库密码不匹配,你去dev文件改成你的数据库密码,第二个是nginx服务器可能没开好,你重新启动好;maven配置jre版本成自己的
maven编译显示符号不存在:在设置里面找maven->运行程序>把”将…委托给maven”打开(我这是中文的,英文是runner)
jdk版本更换
day02
新增员工代码完善:
- 同一用户重复添加的异常处理(全局处理器)
- 在JWT校验时 获得登陆用户的id (ThreadLocal对象)
ThreadLocal对象
对于每一个请求,都会为其新建一个独立的线程
分页操作:
1 2 3 4 5 6 7 8 9 10 11 12
| @Override public PageResult pageQuery(EmployeePageQueryDTO employeePageQueryDTO) { PageHelper.startPage(employeePageQueryDTO.getPage(),employeePageQueryDTO.getPageSize());
Page<Employee> page = employeeMapper.pageQuery(employeePageQueryDTO);
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
| private LocalDateTime createTime;
private LocalDateTime updateTime;
"createTime": [ 2024, 11, 4, 18, 33, 37 ],
|
通过消息转换器对日期对象进行序列化
1 2 3 4 5 6 7 8 9 10 11 12 13
|
protected void extendMessageConverters(List<HttpMessageConverter<?>> converters){ MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter(); 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); BaseContext.setCurrentId(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使用步骤
- 导入Maven坐标 spring-context
- 启动类添加注解 @EnableScheduling 开启任务调度
- 自定义定时任务类
WebSocket
WebSocket 是基于TCP的一种新的网络协议;它实现了浏览器和服务器的全双工通信——浏览器和服务器只需要完成一次握手,两者就可以创建持久性的连接,并进行双向数据传输。
和Http的区别
- HTTP是短连接;WebSocket是长连接
- HTTP通信是单向的,基于请求响应模式;WebSocket是全双工
相同
WebSocket使用步骤

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
|
@Bean public ServerEndpointExporter serverEndpointExporter() { return new ServerEndpointExporter(); }
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
|
公共字段填充
https://blog.csdn.net/qq_49838656/article/details/131799350
来单提醒

@RequestBody()
要用封装好的 对象接收,不可以使用单独的数据参数接收
(@RequestBody() OrdersRejectionDTO ordersRejectionDTO)
redis 和nginx 停止命令
更换配置文件前先停止服务!!!
sudo nginx -s quit
ps aux | grep nginx
launchctl list | grep nginx
先关闭在启动
brew services stop nginx