1.1使用工具mybatis-generator自动生成Mybatis代码
1.2使用Bootstrap前端框架
Bootstrap,来自 Twitter,是目前最受欢迎的前端框架。Bootstrap 是基于 HTML、CSS、JAVASCRIPT 的,它简洁灵活,使得 Web 开发更加快捷。
1.3使用模板语言Thymeleaf进行开发
1.4部署项目到服务器的步骤及方法
1.用maven的package命令打包项目成为jar包
2.用一些FTP软件将本地的jar包上传到服务器上
3.使用Linux命令运行jar包,项目启动
1.5 代码展示
前端代码:
<!DOCTYPE HTML>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<title>论坛社区</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<link rel="stylesheet" href="/css/bootstrap.css"/>
<link rel="stylesheet" href="/css/bootstrap-theme.css"/>
<link rel="stylesheet" href="/css/forum.css"/>
<script src="/js/jquery-3.5.1.min.js"></script>
<script src="/js/bootstrap.min.js" type="application/javascript"></script>
</head>
<script type="application/javascript">
window.onload=function () {
var closable = window.localStorage.getItem("closable");
if(closable=="true"){
window.close();
window.localStorage.removeItem("closable");
}
}
</script>
<body>
<div th:insert="~{navigation::nav}"></div>
<div class="container-fluid main">
<div class="row">
<div class="col-lg-9 col-md-9 col-sm-9 col-xs-9">
<h2><span class="glyphicon glyphicon-list" aria-hidden="true"></span>发现</h2>
<hr>
<div class="media" th:each="question:${pagination.data}">
<div class="media-left">
<a href="#">
<img class="media-object img-rounded"
th:src="${question.user.avatarUrl}">
</a>
</div>
<div class="media-body">
<h4 class="media-heading">
<a th:text="${question.title}" th:href="@{'/question/'+${question.id}}" ></a>
</h4>
<!-- <span th:text="${question.description}"></span>-->
<span class="text-desc">
<span th:text="${question.commentCount}"></span>个回复•
<span th:text="${question.viewCount}"></span>次浏览•发布时间:
<span th:text="${#dates.format(question.gmtCreate,'yyyy-MM-dd HH:mm')}"></span>
</span>
</div>
</div>
<nav aria-label="Page navigation">
<ul class="pagination">
<li th:if="${pagination.showFirstPage}">
<a th:href="@{/(page=1,search=${search})}" aria-label="Previous">
<span aria-hidden="true"><<</span>
</a>
</li>
<li th:if="${pagination.showPrevious}">
<a th:href="@{/(page=${pagination.page}-1,search=${search})}" aria-label="Previous">
<span aria-hidden="true"><</span>
</a>
</li>
<li th:each="page:${pagination.pages}" th:class="${pagination.page==page}?'active':''">
<a th:href="@{/(page=${page},search=${search})}" th:text="${page}">
</a>
</li>
<li th:if="${pagination.showNext}">
<a th:href="@{/(page=${pagination.page}+1,search=${search})}" aria-label="Previous">
<span aria-hidden="true">></span>
</a>
</li>
<li th:if="${pagination.showEndPage}">
<a th:href="@{/(page=${pagination.totalPage},search=${search})}" aria-label="Previous">
<span aria-hidden="true">>></span>
</a>
</li>
</ul>
</nav>
</div>
<div class="col-lg-3 col-md-3 col-sm-3 col-xs-3">
<h3 style="margin-left: 109px">马尔济斯</h3>
<img src="/img/dog.jpg" width="100%">
</div>
</div>
</div>
<div th:insert="~{footer::foot}"></div>
</body>
</html>
controller层代码:
package com.chen.forum.controller;
import com.chen.forum.DTO.PageDTO;
import com.chen.forum.DTO.QuestionDTO;
import com.chen.forum.Service.QuestionService;
import com.chen.forum.mapper.QuestionMapper;
import com.chen.forum.mapper.UserMapper;
import com.chen.forum.model.Question;
import com.chen.forum.model.User;
import com.chen.forum.model.UserExample;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import java.util.List;
@Controller
public class IndexController {
@Autowired
private UserMapper userMapper;
@Autowired
private QuestionService questionService;
@GetMapping("/")
public String index(HttpServletRequest request,
Model model,
@RequestParam(name="page",defaultValue ="1" ) Integer page,
@RequestParam(name="size",defaultValue = "5") Integer size,
@RequestParam(name="search",required = false) String search){
PageDTO questionList= questionService.list(search,page,size);
model.addAttribute("pagination",questionList);
model.addAttribute("search",search);
return "index";
}
}
service层代码:
public PageDTO list(String search,Integer page, Integer size) {
Integer offset=size*(page-1);
String replacesearch=null;
if(search!=null){
replacesearch = search.replace(" ", "|").replace(",", "|");
}
QuestionQueryDTO questionQueryDTO = new QuestionQueryDTO();
questionQueryDTO.setSearch(replacesearch);
questionQueryDTO.setOffset(offset);
questionQueryDTO.setSize(size);
List<Question> list = questionExtMapper.selectBySearch(questionQueryDTO);
ArrayList<QuestionDTO> questionDTOArrayList = new ArrayList<>();
PageDTO pageDTO = new PageDTO();
for(Question question:list){
User user=userMapper.selectByPrimaryKey(question.getCreator());
QuestionDTO questionDTO = new QuestionDTO();
BeanUtils.copyProperties(question,questionDTO);
questionDTO.setUser(user);
questionDTOArrayList.add(questionDTO);
}
pageDTO.setData(questionDTOArrayList);
Integer totalcount=questionExtMapper.countBySearch(questionQueryDTO);
pageDTO.setPageDTO(totalcount,page,size);
return pageDTO;
}
package com.chen.forum.DTO;
import com.chen.forum.model.Question;
import lombok.Data;
import java.util.ArrayList;
import java.util.List;
@Data
public class PageDTO<T>{
private List<T> data;
private boolean showPrevious;
private boolean showFirstPage;
private boolean showNext;
private boolean showEndPage;
private Integer page;
private List<Integer> pages=new ArrayList<>();
private Integer totalPage;
public void setPageDTO(Integer totalcount, Integer page, Integer size) {
this.page=page;
if(totalcount%size==0){
totalPage=totalcount/size;
}
else{
totalPage=totalcount/size+1;
}
pages.add(page);
for(int i=1;i<=3;i++){
if(page-i>0){
pages.add(0,page-i);
}
if(page+i<=totalPage){
pages.add(page+i);
}
}
if(page==1){
showPrevious=false;
}
else {
showPrevious=true;
}
if(page==totalPage){
showNext=false;
}
else{
showNext=true;
}
if(pages.contains(1)){
showFirstPage=false;
}else{
showFirstPage=true;
}
if(pages.contains(totalPage)){
showEndPage=false;
}
else {
showEndPage=true;
}
}
}