栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

SpringBoot开源项目个人博客——(8)友链|相册管理

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

SpringBoot开源项目个人博客——(8)友链|相册管理

一、友链管理

和分类一样,友链除了基本的增删查改,还要防止友链地址重复。

详细分析可看oneStar的博客内容。


这里一次性展示接口的全部代码。

1.DAO持久层

在dao包下创建FriendLinkDao接口。

@Mapper
@Repository
public interface FriendLinkDao {

    //查询友链管理列表
    List listFriendLink();

    //新增友链
    int saveFriendLink(FriendLink friendLink);

    //根据网址查询友链
    FriendLink getFriendLinkByBlogaddress(String blogaddress);//防止重复

    //根据id查询友链
    FriendLink getFriendLink(Long id); //编辑时可传入对应分类

    //编辑修改友链
    int updateFriendLink(FriendLink friendLink);

    //删除友链
    void deleteFriendLink(Long id);
}
2.友链管理mapper

在mapper文件夹下创建FriendLinkDao.xml文件




    

    
    
        select *
        from t_friend where blogaddress = #{blogaddress};
    

    
    
        insert into t_friend (blogaddress, blogname, create_time, pictureaddress)
        values (#{blogaddress},#{blogname},#{createTime},#{pictureaddress});
    

    
    
...
...
...





第 页,共 页,有 篇文章

JS部分新增:

      function page(obj) {
        $("[name='page']").val($(obj).data("page"));
        loaddata();
      }

      function loaddata() {
        $("#types-container").load(
                "/admin/refreshType",{
                  pageNum : $("[name='page']").val()
                });
      }

在controller.admin包下,创建FriendLinkController,代码如下:

和oneStar博客不同的是,在修改友链时,地址的查重判断不判断本身的(只判断除自身外的其他友链是否重复即可)。

@Controller
@RequestMapping("/admin")
public class FriendLinkController {

    @Autowired
    private FriendLinkService FriendLinkService;

    //友链管理界面
    @GetMapping("/friendlinks")
    public String list(Model model, @RequestParam(defaultValue = "1", value = "pageNum") Integer pageNum) {

        String orderBy = "create_time desc";
        PageHelper.startPage(pageNum, 5, orderBy);
        List friendLinks = FriendLinkService.listFriendLink();
        PageInfo pageInfo = new PageInfo<>(friendLinks);

        model.addAttribute("pageInfo", pageInfo);
        return "admin/friendlinks";
    }
    //有点冗余,不想优化, 有人看到可以自行优化
    @PostMapping("/refreshFriend")
    public String refreshFriend(Model model, @RequestParam(defaultValue = "1", value = "pageNum") Integer pageNum){
        String orderBy = "create_time desc";
        PageHelper.startPage(pageNum, 5, orderBy);
        List friendLinks = FriendLinkService.listFriendLink();
        PageInfo pageInfo = new PageInfo<>(friendLinks);

        model.addAttribute("pageInfo", pageInfo);
        return "admin/friendlinks :: friendlink-list";
    }

    //跳转到 新增页面
    @GetMapping("friendlinks/input")
    public String input(Model model) {
        model.addAttribute("friendLink", new FriendLink());
        return "admin/friendlinks-input";
    }

    //提交新增
    @PostMapping("/friendlinks")
    public String post(@Valid FriendLink friendLink, BindingResult result, RedirectAttributes attributes) {

        if(result.hasErrors()){
            //校验出来,发现问题,把message传前端
            System.out.println(result);
            return "admin/friendlinks-input";
        }

        FriendLink friendLink1 = FriendLinkService.getFriendLinkByBlogaddress(friendLink.getBlogaddress());
        if (friendLink1 != null) {
            attributes.addFlashAttribute("message", "不能添加相同地址的友链");
            return "redirect:/admin/friendlinks/input";
        }

        friendLink.setCreateTime(new Date());
        int i = FriendLinkService.saveFriendLink(friendLink);
        if (i == 0) {
            attributes.addFlashAttribute("message", "添加失败");
        } else {
            attributes.addFlashAttribute("message", "添加成功");
        }

        return "redirect:/admin/friendlinks";
    }

    //编辑 友链
    @GetMapping("/friendlinks/{id}/input")
    public String editInput(@PathVariable("id") Long id, Model model) {
        //根据id 传对应的 friendlink
        FriendLink friendLink = FriendLinkService.getFriendLink(id);
        model.addAttribute("friendLink", friendLink);

        return "admin/friendlinks-input";
    }


    //提交修改友链
    @PostMapping("/friendlinks/{id}")
    public String editPost(@Valid FriendLink friendLink, BindingResult result, RedirectAttributes attributes) {
        if(result.hasErrors()){
            //校验出来,发现问题,把message传前端
            System.out.println(result);
            return "admin/friendlinks-input";
        }

        //友链的地址不能和 除自己之外的 重复(特判)
        FriendLink friendLink1 = FriendLinkService.getFriendLinkByBlogaddress(friendLink.getBlogaddress());

        if (friendLink1 != null) {

            if (friendLink1.getId().equals(friendLink.getId())) {
                //同一个就不用特判了
            } else {
                //如果是和不同 友链冲突
                attributes.addFlashAttribute("message", "不能添加重复的友链地址");
                return "redirect:/admin/friendlinks/{id}/input"; //回到新增(有id还是进 编辑)页面
            }

        }

        int i = FriendLinkService.updateFriendLink(friendLink);
        if (i == 0) {
            attributes.addFlashAttribute("message", "编辑失败");
        } else {
            attributes.addFlashAttribute("message", "编辑成功");
        }

        return "redirect:/admin/friendlinks"; //回到展示列表
    }

    //删除 友链
    @GetMapping("/friendlinks/{id}/delete")
    public String delete(@PathVariable("id") Long id, RedirectAttributes attributes) {
        FriendLinkService.deleteFriendLink(id);
        attributes.addFlashAttribute("message", "删除成功");
        return "redirect:/admin/friendlinks";
    }

}

二、相册管理

同理,除了基本的增删查改,但不需要做图片链接的查重,有该需求者自行修改。

1.DAO持久层

在dao包下创建PictureDao接口,代码如下:

@Mapper
@Repository
public interface PictureDao {

    //图片列表
    List listPicture();

    //添加图片
    int savePicture(Picture picture);

    //根据id查询图片
    Picture getPicture(Long id);

    //编辑修改相册
    int updatePicture(Picture picture);

    //删除照片
    void deletePicture(Long id);
}
2.友链管理mapper

在mapper文件夹下创建PictureDao.xml文件





    
    
        select *
        from t_picture where  id = #{id};
    
    
    
    
        update t_picture
        set pictureaddress = #{pictureaddress},picturename=#{picturename},picturedescription=#{picturedescription},picturetime=#{picturetime}
        where id=#{id};
    

    
    
        delete
        from t_picture
        where id=#{id};
    


3.图片管理Service业务层

在service包创建用户业务层接口PictureService 。

public interface PictureService {

    //图片列表
    List listPicture();

    //添加图片
    int savePicture(Picture picture);

    //根据id查询图片
    Picture getPicture(Long id);

    //编辑修改相册
    int updatePicture(Picture picture);

    //删除照片
    void deletePicture(Long id);
}

接口实现类impl

在impl子包,在其中创建用户业务层接口实现类PictureServiceImpl。

@Service
public class PictureServiceImpl implements PictureService {

    @Autowired
    private PictureDao pictureDao;

    @Override
    public List listPicture() {
        return pictureDao.listPicture();
    }

    @Override
    public int savePicture(Picture picture) {
        return pictureDao.savePicture(picture);
    }

    @Override
    public Picture getPicture(Long id) {
        return pictureDao.getPicture(id);
    }

    @Override
    public int updatePicture(Picture picture) {
        return pictureDao.updatePicture(picture);
    }

    @Override
    public void deletePicture(Long id) {
        pictureDao.deletePicture(id);
    }
}
4.图片管理Controller控制器

同理的页面跳转也使用了局部刷新,虽然冗余了点。

定义要更新区域成一个fragment:

分页前端改动:


...
...
...




第 页,共 页,有 篇文章

JS部分新增:

      function page(obj) {
        $("[name='page']").val($(obj).data("page"));
        loaddata();
      }

      function loaddata() {
        $("#picture-container").load(
                "/admin/refreshPicture",{
                  pageNum : $("[name='page']").val()
                });
      }

在controller.admin包下,创建PictureController,代码如下:

@Controller
@RequestMapping("/admin")
public class PictureController {

    @Autowired
    private PictureService pictureService;


    //图片 管理列表(分页)
    @GetMapping("/pictures")
    public String list(Model model,@RequestParam(defaultValue = "1",value = "pageNum") Integer pageNum){
        //已经规定按照数据库id降序
        String orderBy ="id desc";
        PageHelper.startPage(pageNum,2,orderBy);
        List pictures = pictureService.listPicture();
        PageInfo pageInfo = new PageInfo<>(pictures); //封装查询信息
        model.addAttribute("pageInfo", pageInfo);
        return "admin/pictures";
    }

    @PostMapping("/refreshPicture")
    public String refreshPicture(Model model,@RequestParam(defaultValue = "1",value = "pageNum") Integer pageNum){
        //已经规定按照数据库id降序
        String orderBy ="id desc";
        PageHelper.startPage(pageNum,2,orderBy);
        List pictures = pictureService.listPicture();
        PageInfo pageInfo = new PageInfo<>(pictures); //封装查询信息
        model.addAttribute("pageInfo", pageInfo);
        return "admin/pictures :: pictureList";
    }

    //进入新增页面
    @GetMapping("/pictures/input")
    public String input(Model model){
        model.addAttribute("picture", new Picture());
        return "admin/pictures-input";
    }

    //提交新增(先不做后端校验)
    @PostMapping("/pictures")
    public String post(@Valid Picture picture, BindingResult result, RedirectAttributes attributes){

        if(result.hasErrors()){
            return "admin/pictures-input";
        }

        int i = pictureService.savePicture(picture);
        if(i==0){
            attributes.addFlashAttribute("message","新增失败");
        }else {
            attributes.addFlashAttribute("message","新增成功");
        }

        return "redirect:/admin/pictures"; //返回列表
    }

    //进入修改界面
    @GetMapping("/pictures/{id}/input")
    public String editInput(@PathVariable("id")Long id,Model model){
        Picture picture = pictureService.getPicture(id);
        model.addAttribute("picture",picture);
        return "/admin/pictures-input";
    }

    //提交修改
    @PostMapping("/pictures/{id}")
    public String editPost(@Valid Picture picture, BindingResult result,RedirectAttributes attributes){

        if(result.hasErrors()){
            return "admin/pictures-input";
        }

        int i = pictureService.updatePicture(picture);
        if(i==0){
            attributes.addFlashAttribute("message","编辑失败");
        }else{
            attributes.addFlashAttribute("message","编辑成功");
        }
        return "redirect:/admin/pictures";
    }

    @GetMapping("/pictures/{id}/delete")
    public String delete(@PathVariable("id")Long id,RedirectAttributes attributes){
        pictureService.deletePicture(id);
        attributes.addFlashAttribute("message","删除成功");
        return "redirect:/admin/pictures";
    }
}

小结

至此,后台功能的实现已经全部完成

四个管理模块都能实现基本的【增删改查】功能,都是能局部刷新实现分页。

目前只有博客模块用到了搜索,其余模块没有,若想实现其余模块的搜索功能,可以仿照博客模块。改动前端和controller接口即可。


目前图像相关的都使用了项目内部的资源(若有图床也可以更换为远程资源)


效果示例图:


下一阶段将开始进行前台功能的实现。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/936876.html

Java相关栏目本月热门文章

我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号