博客搭建笔记

本篇文章用于记录自己搭建博客问题中遇到的一些问题

博客地址:咕噜橙

码云:源码

软件架构
  1. springboot + maven + mybatis +redis +druid
开发工具
  1. IDEA
  2. mysql5.7
云存储
  1. 阿里云ESC + OSS储存

笔记开始


1. 第一版的图片无法显示问题:

描述:在html网页中有部分图片无法加载,而每一张图片的引用方式都是相同的,但是无法访问的图片的请求格式为json,能够正确访问的图片请求格式JEPG.

解决:jar包的处理问题,因为在本地运行是可以显示成功的,在服务器部署之后才出现这样的问题,重新打jar包时将target目录下的文件删除,在打新的jar包时不删除该目录下的文件其class等一些文件可能会保持不变,因而导致修改之后并没有变化

ps:将图片上传至阿里云OSS在网页中直接引用图片链接加载可以更迅速。

2. 访问数据库

描述:刚部署的时候发现无法访问leavemessage这张表,报错显示的是不存在这张表

解决:我建立数据表时表名输入的是leaveMessage,而建成之后并没有区分大小写,表名是leavemessage.在mapper中我一开始写的语句是from leaveMessage在IDEA本地测试时可以正常访问数据库,而部署之后严格区分。

3. 前端错误调试

描述:打开留言板时遇到了一个以前没有遇到过的奇怪现象,一直其他图层都可以显示出来唯独从js里添加的留言内容加载不出来,调试时提示Failed to decode downloaded font:***,下载字体失败?!可是我没有设置字体啊!这让我怎么调?

解决:这个我是真的不知道怎么解决,就只有一个个排查,把jquery注释掉,问题依然存在,说明不是链接失效的问题。把css注释掉,还是存在。最后排到<footer>时我发现只要把他注释掉就可以了,再细查时发现是因为我footer里面的信息有空格的问题?!!!

ps:愿天堂的前端没有bug,或者找个女朋友写前端?

4.后端security获得已登陆用户名的方法
//第一种无需任何参数
Authentication auth = SecurityContextHoler.getContext().getAuthentication();
String username = auth.getName();
//第二种注解方式,在方法参数中加入
@AuthenticationPrincipal Principal principal
principal.getName()
5.响应状态status为canceled

描述:前端手机验证码ajax请求,之后出现提交表单出现请求验证码的ajax,status为canceled。
解决:这是因为我在提交表单时需要用到手机验证码返回的一个值,所以应该用同步的请求方式,而ajax默认的为异步,应该设置为同步async:false

6.引入jar包后,最后maven工程打包失败

描述:加入了非maven依赖的jar包,之后项目打包无法成功
解决:在查询之后找到了这个帖子 使用IDEA将本地的Jar包添加到个人的maven仓库中 之后就可以成功打包了哦

7.分页

描述:在前端刷新页面时,分页会不断变化,有时出现只显示一条内容,有时又显示所有内容,并且从10多页当作默认页。
解决:打印前端拿到的数据后发现是后端的问题,于是在后台打印分页json,出现下面问题

PageInfo{pageNum=1, pageSize=12, size=12, startRow=0, endRow=11, total=12, pages=1,
PageInfo{pageNum=1, pageSize=10, size=10, startRow=1, endRow=10, total=12, pages=2, 

          这pageSize老是变来变去的,那我前面的PageHelper.startPage(pageNum,row);一点用也没有,岂不是很没有面子?
          于是将老大哥PageHelper.startPage(pageNum,row);放到第一行试试,一开始我是拒绝的,不能说你让放我就放,我得试试他有没有效果,唉,你别说,这东西还挺好用的。真的pageSize就不变了耶。
          PageHelper.startPage(pageNum,row);必须放在第一行吗?
          再查阅一番之后得出:**PageHelper.startPage(pageNum,row);**必须放在查询语句之前,并且只对该语句以后的第一个查询语句得到的数据进行分页,如果有两条查询语句,只对第一条查询语句生效

8.阿里云OSS储存

      为我的网页增添音乐播放器之后,我的oss突然欠费,虽然只欠了0.25元,但是很莫名奇妙啊,查询订单之后,发现是我上传MP3格式之后晚上扣费。还是我读的书少啊!!!查阅了阿里云的OSS和腾讯的COS,现在的云储存对象都是使用的按量付费和包年包月两种,这些是针对外网流出,也就是我们常用的其他人访问OSS上的数据是计量收费的。不过对于普通的图片处理阿里云提供了10T的免费额度,超出之后额外计费。但是MP3格式的是属于视频格式就要扣我钱,还是吃了没有文化的亏T_T
      具体收费请戳:阿里云OSS计费文档

9.java8中的lambda表达式

      整合redis时使用到的工具类中涉及到了redis中没有值时需要查询数据库,这就需要调用Mapper类的方法

public static <T> T fromRedis(RedisOperations redisOperations, String redisKey, Class<T> clazz, Supplier<T> dbFunc, Object... object) {
        T result = redisOperations.getVal(redisKey, clazz);
        if(result == null) {
            result = dbFunc.get();
            if(result == null) {
                logger.error("fetch " + clazz + " error, redisKey: " + redisKey);
                return null;
            }
            valSerialize(redisOperations,redisKey,result,object);
        }
        return result;
    }

Supplier< T > dbFunc就是redis没有数据时调用的mapper方法
那么怎么传入方法呢?

articles = CacheFetchUtils.fromRedisList(redisOperations,"AllArticlePartInfo",Article.class,()->articleMapper.getAllArticlePartInfo());

这是查找所有的文章,我要按照分类来查找呀,直接调用形参会出现Variable used in lambda expression should be final or effectively final这样的报错
这是因为传入方法相当于使用了一个匿名内部类,而在java中匿名内部类的参数必须是final的,原因在于保证内部和外部类的数据一致性,因为编译的时候内部类和方法在同一级别上,所以方法中的变量或参数只有为final,内部类才可以引用。java8中则是不用定义为final,只要是同一级的系统会自动添加。java将这个功能称为:Effectively final功能。
错误代码

public JSONObject getArticlePartInfoByCategory(String categoriesName, int rows, int pageNum) {
        PageHelper.startPage(pageNum,rows);
        List<Article> articles;
        if ("".equals(categoriesName)){
            articles = CacheFetchUtils.fromRedisList(redisOperations,"AllArticlePartInfo",Article.class,()->articleMapper.getAllArticlePartInfo());
            categoriesName = "全部分类";
        }else {
            articles = CacheFetchUtils.fromRedisList(redisOperations,categoriesName + "Article",Article.class,()->articleMapper.getArticlePartInfoByCategory(categoriesName));
        }

变量categoriesName是一个形参,系统无法自动生成fianl,因此需要一个实参承载
正确代码

String finalCategoriesName = categoriesName;
articles = CacheFetchUtils.fromRedisList(redisOperations,categoriesName + "Article",Article.class,()->articleMapper.getArticlePartInfoByCategory(finalCategoriesName));
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值