所需资料
- 教程视频地址
- Bootstrap
- spring模板
- elasticsearch中文社区(想模仿的效果)
- 码云aAuth
- 获取授权用户的资料
- github第三方授权文档
- 码匠社区学习笔记(三)源码
功能主体说明:
- 问题编辑与删除
- 引入markdown插件
- mybatis-plus 的创建时间和修改时间自动生成
项目目录
登录后点击我的问题跳转到自己发布的问题页面
navigation.html
index.html
码匠问题社区
ProfileController
package com.majiang.community.controller;
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.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestParam;
import javax.servlet.http.HttpServletRequest;
@Controller
public class ProfileController {
@Autowired(required = false)
private IQuestionService questionService;
@GetMapping("profile/{action}")
public String profile(@RequestParam(name="current",defaultValue = "0") int current,
@RequestParam(name="size",defaultValue = "4")int size,
@PathVariable(name = "action")String action,
HttpServletRequest request,
Model model){
User user = (User) request.getSession().getAttribute("user");
//cookie已经过期
if(user==null){
return "redirect:/";
}
//获取我的问题列表
if("question".equals(action)){
PageUtils myQuestionPage= questionService.selectMyQuestion(current,size,user);
model.addAttribute("sectionName", "问题列表");
model.addAttribute("section", "question");
model.addAttribute("myQuestionPage", myQuestionPage);
}
//获取我的回复列表
if("reply".equals(action)){
model.addAttribute("action", "回复列表");
}
return "profile";
}
}
具体实现 QuestionServiceImp
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.CookieUtil; import com.majiang.community.util.PageUtils; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import javax.servlet.http.HttpServletRequest; 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(int current, int 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); } @Override public PageUtils selectMyQuestion(int current, int size, User user) { Page page=new Page(current,size); QueryWrapper questionQueryWrapper = new QueryWrapper<>(); questionQueryWrapper.eq("creator", user.getFdAccountId()); IPage iPage = questionMapper.selectPage(page, questionQueryWrapper); return new PageUtils(iPage); } @Override public QuestionDTO getQuestionById(String id) { Question question = questionMapper.selectById(id); 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); return questionDTO; } @Override public void updateQuestion(QuestionDTO questionDTO) { Question question=new Question(); BeanUtils.copyProperties(questionDTO, question); int i = questionMapper.updateById(question); System.out.println("修改了"+i); } @Override public void deleteQuestion(String id) { questionMapper.deleteById(id); } @Override public void addQuestion(QuestionDTO questionDTO, HttpServletRequest request) { String cookieValue = CookieUtil.getCookieValue(request); QueryWrapper queryWrapper=new QueryWrapper(); queryWrapper.eq("fd_token", cookieValue); User user = userMapper.selectOne(queryWrapper); Question question=new Question(); BeanUtils.copyProperties(questionDTO, question); question.setCreator(user.getFdAccountId()); questionMapper.insert(question); } }
profile.html
码匠问题社区
问题详情
实现类代码上面已展示,这里省略。。。。
引入md
md下载
question.html
码匠问题社区
PublishController
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.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.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.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import javax.servlet.http.HttpServletRequest;
@Controller
public class PublishController {
@Autowired(required = false)
private QuestionMapper questionMapper;
@Autowired(required = false)
private UserMapper userMapper;
@Autowired
private IQuestionService questionService;
@GetMapping("https://blog.csdn.net/publish")
public String createQuestion(Model model,
HttpServletRequest request){
String cookieValue = CookieUtil.getCookieValue(request);
if(StrUtil.isEmpty(cookieValue)){
return "index";
}
QuestionDTO questionDTO=new QuestionDTO();
model.addAttribute("questionDTO", questionDTO);
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,
@RequestParam(name = "id",required = false)String id,
HttpServletRequest request,
Model model){
QuestionDTO questionDTO=new QuestionDTO();
questionDTO.setTitle(title);
questionDTO.setDescription(description);
questionDTO.setTag(tag);
if(StrUtil.isNotEmpty(id)){
questionDTO.setId(id);
}
model.addAttribute("questionDTO", questionDTO);
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";
}
if(StrUtil.isNotEmpty(id)){
questionService.updateQuestion(questionDTO);
}else{
questionService.addQuestion(questionDTO,request);
}
return "redirect:/";
}
@GetMapping("publish/{id}")
public String editQuestion(@PathVariable(name = "id")String id,
Model model){
//TODO 鉴定用户是否有权限修改
QuestionDTO questionDTO = questionService.getQuestionById(id);
model.addAttribute("questionDTO",questionDTO);
return "publish";
}
@GetMapping("publish/delete/{id}")
public String deleteQuestion(@PathVariable(name = "id")String id){
//TODO 鉴定用户是否有权限删除
questionService.deleteQuestion(id);
return "redirect:https://blog.csdn.net/profile/question";
}
}
questionService实现类代码上面已展示,这里省略。。。。
publish.html
码匠问题社区
发起
问题发起指南
• 问题标题: 请用精简的语言描述您发布的问题,不超过25字
• 问题补充: 详细补充您的问题内容,并确保问题描述清晰直观, 并提供一些相关的资料
• 选择标签: 选择一个或者多个合适的标签,用逗号隔开,每个标签不超过10个字
mybatis-plus创建时间和修改时间自动生成
package com.majiang.community.model;
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
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 login;
private String fdAccountId;
private String fdToken;
private String avatarUrl;
@TableField(fill = FieldFill.INSERT)//INSERT代表只在插入时填充
private Long gmtCreateTime;
@TableField(fill = FieldFill.INSERT_UPDATE)// INSERT_UPDATE 首次插入、其次更新时填充(或修改)
private Long gmtAlterTime;
}
创建MetaObjectHandler接口实现类即可,不用特意调用
package com.majiang.community.config;
import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.stereotype.Component;
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {
@Override
public void insertFill(MetaObject metaObject) {
//属性名称,不是字段名称
if(metaObject.hasSetter("gmtCreate")){
this.setFieldValByName("gmtCreate", System.currentTimeMillis(), metaObject);
}
if(metaObject.hasSetter("gmtModified")){
this.setFieldValByName("gmtModified", System.currentTimeMillis(), metaObject);
}
if(metaObject.hasSetter("gmtCreateTime")){
this.setFieldValByName("gmtCreateTime", System.currentTimeMillis(), metaObject);
}
if(metaObject.hasSetter("gmtAlterTime")){
this.setFieldValByName("gmtAlterTime", System.currentTimeMillis(), metaObject);
}
}
@Override
public void updateFill(MetaObject metaObject) {
if(metaObject.hasSetter("gmtModified")){
this.setFieldValByName("gmtModified", System.currentTimeMillis(), metaObject);
}
if(metaObject.hasSetter("gmtAlterTime")){
this.setFieldValByName("gmtAlterTime", System.currentTimeMillis(), metaObject);
}
}
}



