emmm

ps

第一期就暂时写一下瀑布流图库和发博客说说已经评论和留言板的功能,后台管理也加上一些必要的功能,比如用户、评论、文件管理浏览记录啥的,其他的后续有好的想法再加吧

预览地址

https://mashiro.xiamoqwq.com

other

我写这个博客最开始的目的就是在不用任何框架(当然springboot和那种现成的轮子肯定是不算的)的情况下去完成一次开发,主要还是因为兴趣吧,其次是因为像之前我写的项目要么就是直接拿老项目去改或者用ruoyi,这样必然省事,但是写的东西感觉千篇一律,不会有成长

前端虽然是仿写的这个博客,但是那些css全是一个一个敲的,这边博客首页以及博客详情页的功能和动画以及一些小细节全都实现了,后台管理的话就没有仿照这边博客写了,因为很丑!!!(丑但是好用)全靠我自己想象

总之,虽然博客功能暂时还不多,但是学到的东西还是挺多的

顺便mark一下中间碰到的问题

过滤器获取formdata中的值

        HttpServletRequest request = (HttpServletRequest) req;
        HttpServletResponse response = (HttpServletResponse) resp;
        String contentType = req.getContentType();
        if (contentType != null && contentType.contains("multipart/form-data")) {
            MultipartResolver resolver = new CommonsMultipartResolver(request.getSession().getServletContext());
            MultipartHttpServletRequest multipartRequest = resolver.resolveMultipart(request);
            // 将转化后的 request 放入过滤链中
            request = multipartRequest;
        }

redis中验证token

目前没有用在博客上,本来之前想用redis存用户token来着,后来想了一下,感觉和我自己想的不太一样,用redis存token,前端只传token过来的话就无法判断,需要把用户id和token一起传过来,然后拿用户id取出token判断。。。

思路是这样的,大概是受ruoyi影响了,ruoyi是直接把token当做了用户表的字段,然后用token去查,查不到对应的用户则表示token过期了,我这边也是这样做的,每次用户成功登陆的时候会修改用户表中的token,这样做比较方便,也因为我这边博客差不多就是单机,所以不用考虑啥高并发,多一次和数据库的交互和少一次并不会明显感觉到有啥差异

nginx反向代理,后端获取用户ip地址

添加如下配置项

proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

interval - MySql

进行时间操作可以用到,比如说查询 2021-04-15 日前一天或者后一天的数据

//查询某一天的数据
select * from flow_hour_count where DATE_FORMAT(ct,'%Y-%m-%d') = '2021-04-15';
//查询上一天的数据
select * from flow_hour_count where date_sub(DATE_FORMAT(ct,'%Y-%m-%d'),interval -1 day) = '2021-04-15';
//interval()
date_sub(DATE_FORMAT(ct,'%Y-%m-%d'),interval -1 day) 

附上一个低配版的Redis操作类

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;

@Component
public class RedisUtils {

    @Autowired
    private RedisTemplate<String, String> redisTemplate;

    /**
     * 读取缓存
     *
     * @param key
     * @return
     */
    public String get(final String key) {
        return redisTemplate.opsForValue().get(key);
    }

    /**
     * 写入缓存
     */
    public boolean set(final String key, String value) {
        boolean result = false;
        try {
            redisTemplate.opsForValue().set(key, value);
            result = true;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return result;
    }

    /**
     * 更新缓存
     */
    public boolean getAndSet(final String key, String value) {
        boolean result = false;
        try {
            redisTemplate.opsForValue().getAndSet(key, value);
            result = true;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return result;
    }

    /**
     * 删除缓存
     */
    public boolean delete(final String key) {
        boolean result = false;
        try {
            redisTemplate.delete(key);
            result = true;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return result;
    }
}

Ex - ploooosion!