项目概述
一.粮食扦样自动分析系统
1.摄像头推流
1.1rtmp服务器搭建
使用nginx
更改配置文件nginx-win-rtmp.conf 并设置推流地址
1.2JAVACV库使用
CameraApplication类:
摄像头应用的基础类,这里面定义了拉流和推流的基本流程,子类只需实现具体的业务方法即可,定义了帧抓取器,输出帧率,摄像头视频的宽、高
获取视频流,在该类里面定义的有帧抓取器,持续拉流和推送
action():调用init():初始化帧抓取器,初始化输出;调用grabAndOutput():持续拉流和推送
RecordCamera类:
重写initOutput():设置编码格式、封装格式、一秒内的帧数、关键帧间隔,附上推流地址,使用了FrameRecorder推流器
重写output():主要是为了附上时间戳并且推流,调用record方法将图像帧保存为视频
2.用户登录
因为集成的是mybatis框架,所以在mapper层还需增加xml文件用于编写sql语句
前后端分离项目,需解决跨域问题,因为是ssm框架,要在mvc-config中配置全局跨域
登录状态采用拦截器(springmvc独有的),在拦截器中解析token,判断是否登录
3.扦样信息获取
就是一个分页查询,参数为页数,大小是写死的
二.孙哥外卖
1.邮箱验证码登录
1.1开启邮箱服务:
在yml中配置stmp邮箱服务,包括端口、邮箱,协议等等。
1.2发送邮件的工具类:
要调用JavaMailSender等封装好的类发送邮件;在controller层调用工具类,发送邮件需要使用redis缓存验证码
1.3使用线程池异步发送验证码:
详见CSDN
1.4登陆状态判断:
该项目不是前后端分离项目,在登陆时将登陆状态放入session里,使用过滤器对登陆状态进行判断
2.菜品相关功能
注意1:方法在接受前端传过来的json类型的参数时要使用注解@RequestBody接收
注意2:要清除redis中的缓存
2.1新增菜品
转到Service层操作,收到的参数是Dto,涉及多个表,需要开启事务操作@Transactional; mybatisplus中service层自带save方法可直接新增;在该service中调用口味中的方法将传来的口味参数添加到数据库。
2.2菜品分页查询
mybatis中自带page容器用于封装分页查询结果;
使用条件构造器LambdaQueryWrapper封装查询条件,查询出菜品dish
查询结束后根据菜品id查询分类名称等封装Dto,在这里需要使用对象拷贝
2.3修改菜品
前端点击修改菜品按钮后要做两个事情:要先查询修改菜品的内容,并且在前端界面上显示,然后才是调用修改菜品的方法。
同样需要开启事务操作
3.文件(图片)上传下载
业务层操作像增加分类、增加表单、提交表单、购物车等增删改查类操作不再赘述
文件上传
文件上传操作放在通用控制层,返回值为文件上传的路径,传递的参数为springboot包下的MultipartFile
在添加文件名防止重名后用MultipartFile的transferTo方法将文件内容传入需要上传的地址
三.HAUT校园论坛
**注:**前端和后端交互时传递的参数要转换为json格式,传递对象时使用@RequestBody注解
**注:**controller层通常也是用@responseBody注解,将 该方法的返回结果直接写入HTTP response body中,一般在异步获取数据时使用。
1.用户登录模块
为了安全起见用户登录采用了springsecurity,所以需要重写springsecurity中的一些过滤器
1.1自定义登录逻辑
重写usernamepasswordfilter过滤器会导致全局异常处理的拦截器无法拦截到抛出的异常;解决办法是新添加一个controller在控制层,登录逻辑直接复制UsernamePasswordAuthenticationFilter即可。
该登录用的是账号密码的登录,但是加了个验证码登录,验证码要放在
1.2登录状态自定义
security判断登录的本质就是看SecurityContextHolder.getContext().getAuthenticaition()里是不是null
由于是前后端分离,账号登录状态的判断需要使用token,我们封装一个类来维护token的操作,token里存的应是loginAdmin的UUID,然后再使用UUID作为key、将账户信息存入redis里。
登陆成功后除了要返回token外,还要缓存用户的信息到redis里,判断登录状态时需要额外写一个过滤器,这个过滤器要执行在默认判断登录的过滤器前面判断逻辑为:
1.根据前端返回的Token解析出用户id
2.根据用户id查询redis里是否有对应的用户信息
3.若有则为登录,要往SecurityContextHolder中塞值
这么做的目的:
与之前的登录状态判断相比,这次增加了将用户信息存入redis的步骤,这样可以自由定义登陆状态过期时间,即使前端浏览器一直存有token 一段时间后登陆状态也会失效
**将用户信息存入redis,**可以随时获取登录用户的信息,这样也方便前端展示用户信息;这些功能都封装在AdminTokenService类里
1.3获取当前登录账号
这点要着重说明,要实现授权功能就要有这个方法,要在SecurityContextHolder内的Authentication中获得username,从而找到当前登录的账号
2.博客功能管理
新增、删除功能不再赘述,删除功能需要判断该博客属不属于目前已登陆的用户
2.1博客分页查询
1.通过queryWrapper封装查询条件:搜索查询条件(标题、正文)分类查询条件、是否删除等。
2.对象拷贝,将分页查询的博客内容、该账号是否点赞该博客,该博客点赞数等封装成vo返回
2.2查询自己的博客
1.通过getLoginUser方法获取到当前登录的账户
2.查询后将分页查询的博客内容、该账号是否点赞该博客,该博客点赞数等封装成vo返回
2.3博客上传图片的问题
在前端集成了富文本编辑器,有两种方式可以选择:1.有专门的图片存储服务器(如阿里云oss对象存储),正文只存放图片路径。2.将图片转为base64编码格式直接显示
3.收藏、点赞功能
收藏和点赞功能的实现方法类似,一个用户对一个博客只能收藏或点赞一次。
收藏、点赞方法需要判断之前是否已经收藏或点赞,若没有收藏则收藏,若点过了则取消收藏,默认收藏用户为当前登录用户
并且收藏功能多一个查询当前账号已收藏博客的方法
4.评论功能
只实现了对博客的评论,没有实现对评论的评论。