SpringBoot日记本系统全程直播09:项目一期完结

简介: 大家好,我是兔哥呀。我又来啦,这个SpringBoot日记本系统已经接近尾声了,目前已经完成的模块有日记本的增删改查,类型的增删改查,头像上传,还有个人中心。最后一节呢,我们来做一个收尾工作哈。

按日期查询


首页有一个分区是按照日期查询,就是自动统计你具体月份的日记数量。


1.png


现在还是假数据,我们来看看日记表。


2.png


跟日期有关的,有一个create_date


3.png


我们存入的格式为:2022-04-16 12:17:40


要转换成2022年04月16日


可以通过sql来转换,也可以通过java来转。我们就通过sql来转吧,尝试着写出如下sql


SELECT date_format(str_to_date(create_date,'%Y-%m-%d %H:%i:%s'),'%Y年%m月%d日') from tbl_syn_blog


4.png


目标实现,然后我们做一个分组。

SELECT
  date_format(str_to_date(create_date,'%Y-%m-%d %H:%i:%s'),'%Y年%m月%d日') date,
  count(1) total
FROM
  tbl_syn_blog
GROUP BY
  date


5.png


妥了,铁子们。


底层逻辑搞定,接下来就是实现代码落地。这种sql比较复杂,无法用MP的单表操作API,我们就弄一个xml文件,用最传统的方式来完成。


配置文件:

mybatis-plus:
  mapper-locations: classpath:com/rabbit/diary/dao/*.xml
  type-aliases-package: com.rabbit.diary.bean
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl


xml配置的路径是 classpath:com/rabbit/diary/dao/*.xml


6.png


之前自动生成代码的时候,已经存在xml了。

我们复制一下,得到BlogMapper.xml


7.png


我们接收的数据格式为:


8.png


就两个字段,一个date,一个total。

用List,Map就行了,也可以自己写个Bean,我这边就懒得写了。

弄一个查询接口:

@Mapper
public interface BlogMapper extends BaseMapper<TblSynBlog> {
    ... ...
    List<Map<String,String>> getBlogsStatistics(Long userId);
}


Service类:

@Service
public class BlogServiceImpl implements BlogService {
    ......
    @Override
    public List<Map<String, String>> getBlogsStatistics() {
        return blogMapper.getBlogsStatistics(StpUtil.getLoginIdAsLong());
    }
}


对应的BlogMapper.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.rabbit.diary.dao.BlogMapper">
    <select id="getBlogsStatistics" resultType="java.util.HashMap">
        SELECT
            date_format(str_to_date(create_date,'%Y-%m-%d %H:%i:%s'),'%Y年%m月%d日') date,
            count(1) total
        FROM
            tbl_syn_blog
        where user_id = #{userId}
        GROUP BY date
    </select>
</mapper>


修改PageController,添加这一块数据

@RequestMapping("/")
@SaCheckLogin
public ModelAndView index(@RequestParam(required=false) String blogType, ModelAndView mav){
    mav.setViewName("index");
    mav.addObject("blogType",blogType);
    mav.addObject("statistics",blogService.getBlogsStatistics());
    return mav;
}


Sider.jsp修改,把统计数据改成活的

<div class="layui-col-md12"  style="margin-top: 2px;">
    <div class="layui-card">
      <div class="layui-card-header"><b><i class="layui-icon layui-icon-date" style="color: #000;"></i></b>按日期</div>
      <div class="layui-card-body">
        <ul class="tlist">
        <c:forEach  items="${statistics}" var="item">
          <li> <a href="${basePath}/?date=${item.date}">${item.date}(${item.total})</a></li>
        </c:forEach>
        </ul>
      </div>
    </div>
  </div>


这里之所以能用<c:forEach>,是因为在上面加了JSTL依赖。

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>


效果:


9.png


有人看到这里可能会问,上面的日记分类不是用vue来做了,怎么这边又要用JSTL了?


对此我的回答是:我乐意,你打我呀?


开个玩笑,这里我是为了给大家演示,这两种方式有啥区别?


现在我们离开首页,随便点一个比如写日记。


10.png


你会发现,日记分类有的,但是按日期就没了。


为什么呢?


这是因为日记分类是用vue做的,每次刷新页面就会发送异步请求,获取日记分类的数据再渲染出来。(异步的)


但是日期统计则是写在后台代码中一并返回的。(同步的)


11.png


所以,我们需要再所有用到sider.jsp的后台方法中,都加上这一段代码。到底哪种方式好,是分场景的,这个场景,肯定是异步的好。


接下来,我们看下日期统计的url


${basePath}/?date=${item.date}


嗯哼?回到首页去了,那么我们也要用Controller做一个中转。

    @RequestMapping("/")
    @SaCheckLogin
    public ModelAndView index(@RequestParam(required=false) String blogType,@RequestParam(required=false) String date, ModelAndView mav){
        mav.setViewName("index");
        mav.addObject("blogType",blogType);
        mav.addObject("date",date);
        mav.addObject("statistics",blogService.getBlogsStatistics());
        return mav;
    }


12.png


列表加载的时候,把date传过去。


13.png


后台接口是blog/select


14.png


我们发现接收的请求体用的是blog对象,没法接收date。


这边思路就有很多了,比如啊,你可以给Blog增加一个date属性。


也可以给这个方法增加一个新的参数。


我这边就直接加字段吧。


15.png


这边又有一个新的问题了,因为我们是用get方式来请求的,你送中文过来恐怕会有乱码。


所以,我们不妨改一下sql

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.rabbit.diary.dao.BlogMapper">
    <select id="getBlogsStatistics" resultType="java.util.HashMap">
        SELECT
            date_format(str_to_date(create_date,'%Y-%m-%d %H:%i:%s'),'%Y年%m月%d日') date,
            count(1) total,
            date_format(str_to_date(create_date,'%Y-%m-%d %H:%i:%s'),'%Y-%m-%d')date2
        FROM
            tbl_syn_blog
        where user_id = #{userId}
        GROUP BY date
    </select>
</mapper>


前端也要改

 <li> <a href="${basePath}/?date=${item.date2}">${item.date}(${item.total})</a></li>


送过去的就是yyyy-MM-dd格式啦,避免了中文乱码的问题。

修改后的查询代码:

    public Page<TblSynBlog> selectPage(Page<TblSynBlog> pageBean, TblSynBlog blog) {
        QueryWrapper<TblSynBlog> queryWrapper = new QueryWrapper<>();
        queryWrapper.orderByDesc("update_date");
        //只允许查看自己发布的日记
        queryWrapper.eq("user_id", StpUtil.getLoginId());
        queryWrapper.eq("is_delete", "0");
        if(StrUtil.isNotEmpty(blog.getBlogType())){
            queryWrapper.eq("blog_type",blog.getBlogType());
        }
        //按照具体日期来查
        if(StrUtil.isNotEmpty(blog.getDate())){
            queryWrapper.eq("date_format(str_to_date(create_date,'%Y-%m-%d %H:%i:%s'),'%Y-%m-%d')",blog.getDate());
        }
        return blogMapper.selectPage(pageBean,queryWrapper);
    }


功能实现。


关键字搜索


最后一个功能,是关键字索引。


16.png


思路和日记分类搜索,还有按日期搜索差不了太多。

直接干。


17.png


  <div class="searchbox layui-nav-item" style="width: 260px;height: 60px;">
    <form method="post" action="${basePath}/">
      <input style="display: inline-block;width: 60%" type="text" name="kws" required   placeholder="请输入关键字" autocomplete="off" class="layui-input">
      <button style="margin-top: -2px;" class="layui-btn layui-btn-primary"><i class="layui-icon layui-icon-search"></i>搜索</button>
    </form>
  </div>


走Controller


18.png


19.png


20.png


21.png


搞定。

PS:本章改了pom.xml,因为xml文件需要单独设置编译。

<!-- mapper.xml文件在java目录下 -->
<resource>
  <directory>src/main/java</directory>
  <includes>
    <include>**/*.xml</include>
  </includes>
</resource>


打包


22.png


23.png


打包成功,上线。

在线访问地址:http://diary.java18.cn/


25.jpg


26.jpg


肯定还有很多BUG,该版本进入内测阶段,有BUG欢迎告诉我哈。

项目一期到此结束,本项目视频教程后面我会抽时间录制的。

经过初步测试:百度APP打开会有样式错误,我用的小米手机,自带的浏览器就没事。PC端用谷歌浏览器比较好。

相关文章
|
10天前
|
XML Java 数据库连接
SpringBoot集成Flowable:打造强大的工作流管理系统
在企业级应用开发中,工作流管理是一个核心组件,它能够帮助我们定义、执行和管理业务流程。Flowable是一个开源的工作流和业务流程管理(BPM)平台,它提供了强大的工作流引擎和建模工具。结合SpringBoot,我们可以快速构建一个高效、灵活的工作流管理系统。本文将探讨如何将Flowable集成到SpringBoot应用中,并展示其强大的功能。
39 1
|
18天前
|
JavaScript Java 项目管理
Java毕设学习 基于SpringBoot + Vue 的医院管理系统 持续给大家寻找Java毕设学习项目(附源码)
基于SpringBoot + Vue的医院管理系统,涵盖医院、患者、挂号、药物、检查、病床、排班管理和数据分析等功能。开发工具为IDEA和HBuilder X,环境需配置jdk8、Node.js14、MySQL8。文末提供源码下载链接。
|
28天前
|
存储 安全 Java
打造智能合同管理系统:SpringBoot与电子签章的完美融合
【10月更文挑战第7天】 在数字化转型的浪潮中,电子合同管理系统因其高效、环保和安全的特点,正逐渐成为企业合同管理的新宠。本文将分享如何利用SpringBoot框架实现一个集电子文件签字与合同管理于一体的智能系统,探索技术如何助力合同管理的现代化。
61 4
|
28天前
|
前端开发 Java Apache
SpringBoot实现电子文件签字+合同系统!
【10月更文挑战第15天】 在现代企业运营中,合同管理和电子文件签字成为了日常活动中不可或缺的一部分。随着技术的发展,电子合同系统因其高效性、安全性和环保性,逐渐取代了传统的纸质合同。本文将详细介绍如何使用SpringBoot框架实现一个电子文件签字和合同管理系统。
51 1
|
30天前
|
文字识别 安全 Java
SpringBoot3.x和OCR构建车牌识别系统
本文介绍了一个基于Java SpringBoot3.x框架的车牌识别系统,详细阐述了系统的设计目标、需求分析及其实现过程。利用Tesseract OCR库和OpenCV库,实现了车牌图片的识别与处理,确保系统的高准确性和稳定性。文中还提供了具体的代码示例,展示了如何构建和优化车牌识别服务,以及如何处理特殊和异常车牌。通过实际应用案例,帮助读者理解和应用这一解决方案。
|
14天前
|
JavaScript NoSQL Java
CC-ADMIN后台简介一个基于 Spring Boot 2.1.3 、SpringBootMybatis plus、JWT、Shiro、Redis、Vue quasar 的前后端分离的后台管理系统
CC-ADMIN后台简介一个基于 Spring Boot 2.1.3 、SpringBootMybatis plus、JWT、Shiro、Redis、Vue quasar 的前后端分离的后台管理系统
29 0
|
1月前
|
机器学习/深度学习 移动开发 自然语言处理
基于人工智能技术的智能导诊系统源码,SpringBoot作为后端服务的框架,提供快速开发,自动配置和生产级特性
当身体不适却不知该挂哪个科室时,智能导诊系统应运而生。患者只需选择不适部位和症状,系统即可迅速推荐正确科室,避免排错队浪费时间。该系统基于SpringBoot、Redis、MyBatis Plus等技术架构,支持多渠道接入,具备自然语言理解和多输入方式,确保高效精准的导诊体验。无论是线上医疗平台还是大型医院,智能导诊系统均能有效优化就诊流程。
|
1月前
|
JavaScript 安全 Java
如何使用 Spring Boot 和 Ant Design Pro Vue 实现动态路由和菜单功能,快速搭建前后端分离的应用框架
本文介绍了如何使用 Spring Boot 和 Ant Design Pro Vue 实现动态路由和菜单功能,快速搭建前后端分离的应用框架。首先,确保开发环境已安装必要的工具,然后创建并配置 Spring Boot 项目,包括添加依赖和配置 Spring Security。接着,创建后端 API 和前端项目,配置动态路由和菜单。最后,运行项目并分享实践心得,包括版本兼容性、安全性、性能调优等方面。
144 1
|
18天前
|
JavaScript 安全 Java
如何使用 Spring Boot 和 Ant Design Pro Vue 构建一个具有动态路由和菜单功能的前后端分离应用。
本文介绍了如何使用 Spring Boot 和 Ant Design Pro Vue 构建一个具有动态路由和菜单功能的前后端分离应用。首先,创建并配置 Spring Boot 项目,实现后端 API;然后,使用 Ant Design Pro Vue 创建前端项目,配置动态路由和菜单。通过具体案例,展示了如何快速搭建高效、易维护的项目框架。
95 62
|
16天前
|
JavaScript 安全 Java
如何使用 Spring Boot 和 Ant Design Pro Vue 构建一个前后端分离的应用框架,实现动态路由和菜单功能
本文介绍了如何使用 Spring Boot 和 Ant Design Pro Vue 构建一个前后端分离的应用框架,实现动态路由和菜单功能。首先,确保开发环境已安装必要的工具,然后创建并配置 Spring Boot 项目,包括添加依赖和配置 Spring Security。接着,创建后端 API 和前端项目,配置动态路由和菜单。最后,运行项目并分享实践心得,帮助开发者提高开发效率和应用的可维护性。
34 2