package com.usher.springboot.blog.controller;
import com.usher.springboot.blog.entities.Blog;
import com.usher.springboot.blog.entities.Catalog;
import com.usher.springboot.blog.entities.User;
import com.usher.springboot.blog.entities.Vote;
import com.usher.springboot.blog.service.BlogService;
import com.usher.springboot.blog.service.CatalogService;
import com.usher.springboot.blog.service.UserService;
import com.usher.springboot.blog.util.ConstraintViolationExceptionHandler;
import com.usher.springboot.blog.vo.ResponseVO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
import org.springframework.data.domain.Sort.Direction;
import org.springframework.http.ResponseEntity;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.servlet.ModelAndView;
import javax.validation.ConstraintViolationException;
import java.util.List;
/**
* 用户主页空间控制器.
*/
@Controller
@RequestMapping("/u")
public class UserspaceController {
@Autowired
private UserDetailsService userDetailsService;
@Autowired
private UserService userService;
@Autowired
private BlogService blogService;
@Autowired
private CatalogService catalogService;
@GetMapping("/{username}")
public String userSpace(@PathVariable("username") String username, Model model) {
User user = (User)userDetailsService.loadUserByUsername(username);
model.addAttribute("user", user);
return "redirect:/u/" + username + "/blogs";
}
@GetMapping("/{username}/profile")
@PreAuthorize("authentication.name.equals(#username)")
public ModelAndView profile(@PathVariable("username") String username, Model model) {
User user = (User)userDetailsService.loadUserByUsername(username);
model.addAttribute("user", user);
return new ModelAndView("/userspace/profile", "userModel", model);
}
/**
* 保存个人设置
* @param user
* @return
*/
@PostMapping("/{username}/profile")
@PreAuthorize("authentication.name.equals(#username)")
public String saveProfile(@PathVariable("username") String username,User user) {
User originalUser = userService.getUserById(user.getId());
originalUser.setEmail(user.getEmail());
originalUser.setName(user.getName());
// 判断密码是否做了变更
String rawPassword = originalUser.getPassword();
PasswordEncoder encoder = new BCryptPasswordEncoder();
String encodePasswd = encoder.encode(user.getPassword());
boolean isMatch = encoder.matches(rawPassword, encodePasswd);
if (!isMatch) {
originalUser.setEncodePassword(user.getPassword());
}
userService.saveUser(originalUser);
return "redirect:/u/" + username + "/profile";
}
/**
* 获取编辑头像的界面
* @param username
* @param model
* @return
*/
@GetMapping("/{username}/avatar")
@PreAuthorize("authentication.name.equals(#username)")
public ModelAndView avatar(@PathVariable("username") String username, Model model) {
User user = (User)userDetailsService.loadUserByUsername(username);
model.addAttribute("user", user);
return new ModelAndView("/userspace/avatar", "userModel", model);
}
/**
* 保存头像
* @param username
* @return
*/
@PostMapping("/{username}/avatar")
@PreAuthorize("authentication.name.equals(#username)")
public ResponseEntity<ResponseVO> saveAvatar(@PathVariable("username") String username, @RequestBody User user) {
String avatarUrl = user.getAvatar();
User originalUser = userService.getUserById(user.getId());
originalUser.setAvatar(avatarUrl);
userService.saveUser(originalUser);
return ResponseEntity.ok().body(new ResponseVO(true, "处理成功", avatarUrl));
}
@Cacheable(cacheNames = "ublog")
@GetMapping("/{username}/blogs")
public String listBlogsByOrder(@PathVariable("username") String username,
@RequestParam(value="order",required=false,defaultValue="new") String order,
@RequestParam(value="catalog",required=false ) Long catalogId,
@RequestParam(value="keyword",required=false,defaultValue="" ) String keyword,
@RequestParam(value="async",required=false) boolean async,
@RequestParam(value="pageIndex",required=false,defaultValue="0") int pageIndex,
@RequestParam(value="pageSize",required=false,defaultValue="10") int pageSize,
Model model) {
User user = (User)userDetailsService.loadUserByUsername(username);
Page<Blog> page = null;
if (catalogId != null && catalogId > 0) { // 分类查询
Catalog catalog = catalogService.getCatalogById(catalogId);
Pageable pageable = new PageRequest(pageIndex, pageSize);
page = blogService.listBlogsByCatalog(catalog, pageable);
order = "";
} else if (order.equals("hot")) { // 最热查询
Sort sort = new Sort(Direction.DESC,"readSize","commentSize","voteSize");
Pageable pageable = new PageRequest(pageIndex, pageSize, sort);
page = blogService.listBlogsByTitleVoteAndSort(user, keyword, pageable);
} else if (order.equals("new")) { // 最新查询
Pageable pageable = new PageRequest(pageIndex, pageSize);
page = blogService.listBlogsByTitleVote(user, keyword, pageable);
}
List<Blog> list = page.getContent(); // 当前所在页面数据列表
model.addAttribute("user", user);
model.addAttribute("order", order);
model.addAttribute("catalogId", catalogId);
model.addAttribute("keyword", keyword);
model.addAttribute("page", page);
model.addAttribute("blogList", list);
return (async==true?"/userspace/u :: #mainContainerRepleace":"/userspace/u");
}
/**
* 获取博客展示界面
* @param id
* @param model
* @return
*/
@GetMapping("/{username}/blogs/{id}")
public String getBlogById(@PathVariable("username") String username,@PathVariable("id") Long id, Model model) {
User principal = null;
Blog blog = blogService.getBlogById(id);
// 每次读取,简单的可以认为阅读量增加1次
blogService.readingIncrease(id);
// 判断操作用户是否是博客的所有者
boolean isBlogOwner = false;
if (SecurityContextHolder.getContext().getAuthentication() !=null && SecurityContextHolder.getContext().getAuthentication().isAuthenticated()
&& !SecurityContextHolder.getContext().getAuthentication().getPrincipal().toString().equals("anonymousUser")) {
principal = (User)SecurityContextHolder.getContext().getAuthentication().getPrincipal();
if (principal !=null && username.equals(principal.getUsername())) {
isBlogOwner = true;
}
}
// 判断操作用户的点赞情况
List<Vote> votes = blog.getVotes();
Vote currentVote = null; // 当前用户的点赞情况
if (principal !=null) {
for (Vote vote : votes) {
vote.getUser().getUsername().equals(principal.getUsername());
currentVote = vote;
break;
}
}
model.addAttribute("isBlogOwner", isBlogOwner);
model.addAttribute("blogModel",blog);
model.addAttribute("currentVote",currentVote);
return "/userspace/blog";
}
/**
* 删除博客
* @param id
* @return
*/
@DeleteMapping("/{username}/blogs/{id}")
@PreAuthorize("authentication.name.equals(#username)")
public ResponseEntity<ResponseVO> deleteBlog(@PathVariable("username") String username, @PathVariable("id") Long id) {
try {
blogService.removeBlog(id);
} catch (Exception e) {
return ResponseEntity.ok().body(new ResponseVO(false, e.get
没有合适的资源?快使用搜索试试~ 我知道了~
java毕业设计 基于SpringBoot+Mybatis的博客系统的设计与实现+详细文档+全部资料(优秀项目).zip
共394个文件
css:74个
js:54个
class:48个
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
0 下载量 16 浏览量
2024-04-17
10:45:08
上传
评论
收藏 19.57MB ZIP 举报
温馨提示
【资源说明】 java毕业设计 基于SpringBoot+Mybatis的博客系统的设计与实现+详细文档+全部资料(优秀项目).zipjava毕业设计 基于SpringBoot+Mybatis的博客系统的设计与实现+详细文档+全部资料(优秀项目).zip 【备注】 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如软件工程、计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载使用,也可作为毕设项目、课程设计、作业、项目初期立项演示等,当然也适合小白学习进阶。 3、如果基础还行,可以在此代码基础上进行修改,以实现其他功能,也可直接用于毕设、课设、作业等。 欢迎下载,沟通交流,互相学习,共同进步!
资源推荐
资源详情
资源评论
收起资源包目录
java毕业设计 基于SpringBoot+Mybatis的博客系统的设计与实现+详细文档+全部资料(优秀项目).zip (394个子文件)
gradlew.bat 2KB
UserspaceController.class 13KB
EsBlogServiceImpl.class 9KB
Blog.class 7KB
UserController.class 7KB
BlogServiceImpl.class 7KB
SecurityConfig.class 6KB
CatalogController.class 6KB
CommentController.class 5KB
EsBlog.class 5KB
User.class 5KB
BlogController.class 4KB
VoteController.class 4KB
UserServiceImpl.class 4KB
MainController.class 3KB
CatalogServiceImpl.class 2KB
Comment.class 2KB
MyRedisConfig.class 2KB
Catalog.class 2KB
Vote.class 2KB
BlogRepository.class 2KB
ConstraintViolationExceptionHandler.class 2KB
AdminController.class 1KB
EsBlogServiceImpl$2.class 1KB
EsBlogServiceImpl$1.class 1KB
Application.class 1KB
BlogService.class 1KB
EsBlogService.class 1KB
ResponseVO.class 1KB
AuthorityServiceImpl.class 1KB
CommentServiceImpl.class 1KB
Authority.class 1KB
VoteServiceImpl.class 1KB
UserService.class 1KB
CatalogVO.class 1005B
EsBlogRepository.class 976B
TagVO.class 969B
UserRepository.class 917B
MenuVO.class 906B
CatalogRepository.class 812B
ApplicationTests.class 628B
CatalogService.class 607B
SessionConfig.class 565B
AuthorityRepository.class 377B
CommentRepository.class 371B
VoteRepository.class 362B
CommentService.class 279B
VoteService.class 264B
AuthorityService.class 241B
bootstrap.css 187KB
bootstrap.css 187KB
twemoji.css 154KB
twemoji.css 154KB
bootstrap.min.css 147KB
bootstrap.min.css 147KB
thinker-md.vendor.css 50KB
thinker-md.vendor.css 50KB
object.css 46KB
object.css 46KB
font-awesome.css 37KB
font-awesome.css 37KB
Sysmbols.css 36KB
Sysmbols.css 36KB
people.css 34KB
people.css 34KB
font-awesome.min.css 30KB
font-awesome.min.css 30KB
bootstrap-grid.css 25KB
bootstrap-grid.css 25KB
nature.css 20KB
nature.css 20KB
place.css 19KB
place.css 19KB
bootstrap-grid.min.css 18KB
bootstrap-grid.min.css 18KB
component-chosen.css 12KB
component-chosen.css 12KB
component-chosen.min.css 10KB
component-chosen.min.css 10KB
tether-theme-arrows.css 8KB
tether-theme-arrows.css 8KB
tether-theme-arrows-dark.css 8KB
tether-theme-arrows-dark.css 8KB
toastr.css 7KB
toastr.css 7KB
bootstrap-table.css 7KB
bootstrap-table.css 7KB
tether-theme-arrows-dark.min.css 6KB
tether-theme-arrows-dark.min.css 6KB
tether-theme-arrows.min.css 6KB
tether-theme-arrows.min.css 6KB
toastr.min.css 6KB
toastr.min.css 6KB
bootstrap-reboot.css 6KB
bootstrap-reboot.css 6KB
bootstrap-table.min.css 6KB
bootstrap-table.min.css 6KB
bootstrap-reboot.min.css 5KB
bootstrap-reboot.min.css 5KB
component-tageditor.css 3KB
共 394 条
- 1
- 2
- 3
- 4
资源评论
不走小道
- 粉丝: 3221
- 资源: 5113
下载权益
C知道特权
VIP文章
课程特权
开通VIP
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功