所需资料
- 教程视频地址
- Bootstrap
- spring模板
- elasticsearch中文社区(想模仿的效果)
- 码云aAuth
- 获取授权用户的资料
- github第三方授权文档
- 码匠社区学习笔记(二)源码
功能主体说明:
- 问题发布
- 列表展示
- 分页(mybatis-plus)
数据库新建表
用户表
CREATE TABLE `user` ( `fd_id` varchar(30) NOT NULL, `fd_name` varchar(200) DEFAULT NULL, `fd_token` varchar(36) DEFAULT NULL, `gmt_create_time` mediumblob, `gmt_alter_time` mediumblob, `fd_account_id` varchar(50) DEFAULT NULL, `avatar_url` varchar(1000) DEFAULT NULL, PRIMARY KEY (`fd_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8
问题表
CREATE TABLE `question` ( `id` varchar(30) NOT NULL, `title` varchar(100) DEFAULT NULL, `description` text, `gmt_create` bigint(20) DEFAULT NULL, `gmt_modified` bigint(20) DEFAULT NULL, `creator` varchar(30) DEFAULT NULL, `comment_count` int(11) DEFAULT '0', `view_count` int(11) DEFAULT '0', `like_count` int(11) DEFAULT '0', `tag` varchar(256) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8
新建User model对象
package com.majiang.community.model;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import lombok.Data;
@Data
public class User {
@TableId(value = "fd_id",type = IdType.ID_WORKER_STR)
private String fdId;
private String fdName;
private String fdAccountId;
private String fdToken;
private String avatarUrl;
private Long gmtCreateTime;
private Long gmtAlterTime;
}
新建Question 对象
package com.majiang.community.model;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import lombok.Data;
@Data
public class Question {
@TableId(value = "id",type = IdType.ID_WORKER_STR)
private String id;
private String title;
private String description;
private Long gmtCreate;
private Long gmtModified;
private String creator;
private Integer commentCount;
private Integer viewCount;
private Integer likeCount;
private String tag;
}
QuestionDTO
package com.majiang.community.dto;
import com.majiang.community.model.User;
import lombok.Data;
@Data
public class QuestionDTO {
private String id;
private String title;
private String description;
private Long gmtCreate;
private Long gmtModified;
private String creator;
private Integer commentCount;
private Integer viewCount;
private Integer likeCount;
private String tag;
private User user;
}
**UserMapper **
package com.majiang.community.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.majiang.community.model.User; public interface UserMapper extends BaseMapper{ }
***QuestionMapper ***
package com.majiang.community.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.majiang.community.model.Question; public interface QuestionMapper extends BaseMapper{ }
问题发布 PublishController
package com.majiang.community.controller;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.majiang.community.mapper.QuestionMapper;
import com.majiang.community.mapper.UserMapper;
import com.majiang.community.model.Question;
import com.majiang.community.model.User;
import com.majiang.community.util.CookieUtil;
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.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import javax.servlet.http.HttpServletRequest;
@Controller
public class PublishController {
@Autowired
private CookieUtil cookieUtil;
@Autowired(required = false)
private QuestionMapper questionMapper;
@Autowired(required = false)
private UserMapper userMapper;
@GetMapping("https://blog.csdn.net/publish")
public String createQuestion(HttpServletRequest request){
String cookieValue = cookieUtil.getCookieValue(request);
if(StrUtil.isEmpty(cookieValue)){
return "index";
}
return "publish";
}
@PostMapping("https://blog.csdn.net/publish")
public String saveQuestion(@RequestParam(name = "title")String title,
@RequestParam(name="description")String description,
@RequestParam(name = "tag")String tag,
HttpServletRequest request,
Model model){
model.addAttribute("title", title);
model.addAttribute("description", description);
model.addAttribute("tag", tag);
if(StrUtil.isEmpty(title)){
model.addAttribute("error", "标题不能为空");
return "publish";
}
if(StrUtil.isEmpty(description)){
model.addAttribute("error", "问题描述不能为空");
return "publish";
}
if(StrUtil.isEmpty(tag)){
model.addAttribute("error", "标签不能为空");
return "publish";
}
String cookieValue = cookieUtil.getCookieValue(request);
QueryWrapper queryWrapper=new QueryWrapper();
queryWrapper.eq("fd_token", cookieValue);
User user = userMapper.selectOne(queryWrapper);
Question question=new Question();
question.setTitle(title);
question.setDescription(description);
question.setTag(tag);
question.setCreator(user.getFdAccountId());
question.setGmtCreate(System.currentTimeMillis());
question.setGmtModified(System.currentTimeMillis());
questionMapper.insert(question);
return "redirect:/";
}
}
问题添加成功回调首页
在首页显示问题列表
package com.majiang.community.controller;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.majiang.community.dto.QuestionDTO;
import com.majiang.community.mapper.UserMapper;
import com.majiang.community.model.User;
import com.majiang.community.service.IQuestionService;
import com.majiang.community.util.CookieUtil;
import com.majiang.community.util.PageUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
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.Date;
import java.util.List;
@Controller
public class IndexController {
@Autowired(required = false)
private UserMapper userMapper;
@Autowired
private CookieUtil cookieUtil;
@Autowired
IQuestionService questionService;
@Value("${gitee.client.id}")
private String client_id;
@Value("${gitee.redirect_uri}")
private String redirect_uri;
@GetMapping("/")
public String index(@RequestParam(name = "current",defaultValue = "0")long current,
@RequestParam(name="size",defaultValue = "3")long size, HttpServletRequest request, Model model){
String cookieValue = cookieUtil.getCookieValue(request);
if(StrUtil.isNotEmpty(cookieValue)){
QueryWrapper queryWrapper=new QueryWrapper();
queryWrapper.eq("fd_token", cookieValue);
User user = userMapper.selectOne(queryWrapper);
request.getSession().setAttribute("user", user);
}else{
request.getSession().setAttribute("user", null);
}
model.addAttribute("client_id", client_id);
model.addAttribute("redirect_uri",redirect_uri);
PageUtils page = questionService.getQuestionPage(current,size);
model.addAttribute("questionPageList",page);
//未进行分页
return "index";
}
}
引入分页插件
package com.majiang.community.config;
import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.transaction.annotation.EnableTransactionManagement;
@Configuration
@EnableTransactionManagement //开启事务
@MapperScan("com.majiang.community.mapper")
public class MyBatisConfig {
//引入分页插件
@Bean
public PaginationInterceptor paginationInterceptor() {
PaginationInterceptor paginationInterceptor = new PaginationInterceptor();
// 设置请求的页面大于最大页后操作, true调回到首页,false 继续请求 默认false
paginationInterceptor.setOverflow(true);
// 设置最大单页限制数量,默认 500 条,-1 不受限制
paginationInterceptor.setLimit(100);
return paginationInterceptor;
}
}
定义接口
package com.majiang.community.service;
import com.majiang.community.dto.QuestionDTO;
import com.majiang.community.util.PageUtils;
import java.util.List;
public interface IQuestionService {
List getQuestionList();
PageUtils getQuestionPage(long current, long size);
}
接口实现类
package com.majiang.community.service.spring; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.majiang.community.dto.QuestionDTO; import com.majiang.community.mapper.QuestionMapper; import com.majiang.community.mapper.UserMapper; import com.majiang.community.model.Question; import com.majiang.community.model.User; import com.majiang.community.service.IQuestionService; import com.majiang.community.util.PageUtils; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.ArrayList; import java.util.List; @Service public class QuestionServiceImp extends ServiceImplimplements IQuestionService { @Autowired(required = false) QuestionMapper questionMapper; @Autowired(required = false) UserMapper userMapper; @Override public List getQuestionList() { List questionDTOList=new ArrayList<>(); List questionList = questionMapper.selectList(null); for(Question question:questionList){ QueryWrapper userQueryWrapper = new QueryWrapper<>(); userQueryWrapper.eq("fd_account_id", question.getCreator()); User user = userMapper.selectOne(userQueryWrapper); QuestionDTO questionDTO = new QuestionDTO(); BeanUtils.copyProperties(question, questionDTO); questionDTO.setUser(user); questionDTOList.add(questionDTO); } return questionDTOList; } @Override public PageUtils getQuestionPage(long current, long size) { Page page=new Page(current,size); //查询出所有的问题列表 IPage iPage = questionMapper.selectPage(page, null); List questionList= iPage.getRecords(); // List questionDTOList=new ArrayList<>(); for (Question question:questionList){ QueryWrapper userQueryWrapper = new QueryWrapper<>(); userQueryWrapper.eq("fd_account_id", question.getCreator()); User user = userMapper.selectOne(userQueryWrapper); QuestionDTO questionDTO = new QuestionDTO(); BeanUtils.copyProperties(question, questionDTO); questionDTO.setUser(user); questionDTOList.add(questionDTO); } iPage.setRecords(questionDTOList); return new PageUtils(iPage); } }
分页工具类
package com.majiang.community.util;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.majiang.community.dto.QuestionDTO;
import com.majiang.community.model.Question;
import lombok.Data;
import org.springframework.beans.BeanUtils;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
@Data
public class PageUtils implements Serializable {
private static final long serialVersionUID = 1L;
private Integer totalCount;
private Integer pageSize;
private Integer totalPage;
private Integer currPage;
private List list;
private List pageNumber;
public PageUtils(List list, int totalCount, int pageSize, int currPage) {
this.list = list;
this.totalCount = totalCount;
this.pageSize = pageSize;
this.currPage = currPage;
this.totalPage = (int) Math.ceil((double) totalCount / pageSize);
for (int i = 1; i <= 3; i++) {
if (currPage - i > 0) {
this.pageNumber.add(0, currPage - i);
}
if (currPage + i <= totalPage) {
this.pageNumber.add(currPage + i);
}
}
}
public PageUtils(IPage page) {
this.list = page.getRecords();
this.totalCount = (int) page.getTotal();
this.pageSize = (int) page.getSize();
this.currPage = (int) page.getCurrent();
this.totalPage = (int) page.getPages();
List pageNumbers=new ArrayList();
pageNumbers.add(currPage);
for (int i = 1; i <= 3; i++) {
if (this.currPage - i > 0) {
pageNumbers.add(0, this.currPage - i);
}
if (this.currPage + i <= this.totalPage) {
pageNumbers.add(this.currPage + i);
}
}
this.pageNumber=pageNumbers;
}
}
定义一个模板 navigation.html
** 在index.html中引入模板 th:replace=“navigation::navigation”**
码匠问题社区
问题发布页面
码匠问题社区
发起
问题发起指南
• 问题标题: 请用精简的语言描述您发布的问题,不超过25字
• 问题补充: 详细补充您的问题内容,并确保问题描述清晰直观, 并提供一些相关的资料
• 选择标签: 选择一个或者多个合适的标签,用逗号隔开,每个标签不超过10个字



