博客项目目录: 请戳这里
准备
依赖包:
- mybatis-plus-boot-starter
- mybatis-plus-generator
- mp6spy
其中mybatis-plus-boot-starter是mybatis-plus的依赖集合,mybatis-plus-generator是代码生成器,mp6spy是sql分析器,pom文件添加如下:
1.设置yml配置信息
#Config
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
#driver-class-name: com.p6spy.engine.spy.P6SpyDriver
url: jdbc:mysql://localhost:3306/myblog?useUnicode=true&useSSL=false&characterEncoding=utf8&serverTimezone=UTC
username: root
password: 429006huzhuo
freemarker:
settings:
classic_compatible: true
datetime_format: yyyy-MM-dd HH:mm
number_format: 0.##
mybatis-plus:
mapper-locations: classpath*:/mapper/**Mapper.xml
其中datasource是数据库连接信息,freemarker是前端模板引擎信息,设置之后可以避免空值异常和数字,日期格式问题,mybatis-plus是mybatis相关信息,表示可以扫描到mapper下后缀为对应值的xml文件
2.构建数据库
建表脚本参考:https://github.com/xqxls/layui
建完之后,有7个表,其中category是文章分类表,comment是评论表,post是文章表,user是用户表,user_action是用户行为表,user_collection是用户收藏表,user_message是用户信息表
3.代码生成器自动生成代码
找到CodeGenerator.java拷贝到com.example包下,修改数据库信息,和yml配置里的一致。
启动代码生成器,按要求输入表名:
然后代码生成器自动帮忙生成了controller,entity,mapper,service以及resourse/mapper下的xml文件
由于生成的controller和entity都继承自一个超类,所以我们需要新建BaseController和BaseEntity
@Data
public class BaseEntity {
private Long id;
private Date created;
private Date modified;
}
public class BaseController {
@Autowired
HttpServletRequest req;
@Autowired
PostService postService;
}
4.新增配置类
1.MyBatisPlusConfig配置
新建一个config包,然后在这个包下新建MyBatisPlusConfig类,通过@MapperScan注解,spring就可以扫描到mapper包下的接口
@Configuration
@MapperScan("com.example.mapper")
public class MyBatisPlusConfig {
}
2.ContextStartup配置
ContextStartup类通过实现ApplicationRunner接口,可以在项目启动的时候,做一些事情
@Component
public class ContextStartup implements ApplicationRunner, ServletContextAware {
@Autowired
CategoryService categoryService;
@Autowired
ServletContext servletContext;
@Override
public void run(ApplicationArguments args) throws Exception {
List<Category> categories = categoryService.list(new QueryWrapper<Category>()
.eq("status", 0)
);
servletContext.setAttribute("categorys",categories);
}
@Override
public void setServletContext(ServletContext servletContext) {
this.servletContext=servletContext;
}
}
run方法通过条件筛选,选出status为0的分类,注入到应用,注入的实现通过ServletContextAware。
5.操纵数据库,将实际数据填充到前端页面,实时点击校正
将header-panel…ftl修改如下:
然后启动项目,将鼠标悬停在“提问”处,结果如下:
说明category表的数据已经注入到应用了
然后,有一个问题,我们点击提问、分享、讨论、建议的时候,首页的绿色应该转移到对应的分类,做到实时响应,查看header-panel.ftl,发现这个设置是写死的
解决方案:
我们可以通过HttpServletRequest将首页的id设为0,提问、分享、讨论、建议的id设置为数据库预先填入的1,2,3,4,然后在header-panel.ftl中加个条件判断,当id为0时,绿色标记在首页,为其他时,在对应的分类上。
IndexController修改为:
@Controller
public class IndexController extends BaseController{
@RequestMapping({"", "/", "index"})
public String index() {
req.setAttribute("currentCategoryId",0);
return "index";
}
}
PostController修改为:
@Controller
public class PostController extends BaseController{
@GetMapping("/category/{id:\\d*}")
public String category(@PathVariable(name = "id") Long id) {
req.setAttribute("currentCategoryId", id);
return "/post/category";
}
@GetMapping("/post/{id:\\d*}")
public String detail(@PathVariable(name = "id") Long id) {
return "/post/detail";
}
}
header-panel.ftl修改为:
<li class="${(0==currentCategoryId)?string('layui-hide-xs layui-this','')}"><a href="/">首页</a></li>
<#list categorys as item>
<li class="${(item.id==currentCategoryId)?string('layui-hide-xs layui-this','')}"><a href="/category/${item.id}">${item.name}</a></li>
</#list>
测试结果:
参考资料:
https://github.com/MarkerHub/eblog