Mr丶冷文

文章 分类 评论
125 10 8392

站点介绍

冷文学习者(KEVINLU98.COM),记录一个北漂小码农的日常业余生活
友链申请地址(直接评论即可): 传送门

(四)完成友链管理与代码生成器

MR丶冷文 2022-10-07 2019 21条评论 个人博客项目视频教程 javaspringboot个人博客

首页 / 正文
Freewind主题v1.5版本已发布,下载请移步Freewind 1.5,同时还有主题伴生插件Freewind Markdown,下载请移步 Freewind Markdown,有问题请在留言板,交换友链请直接在友链留言,我创建了一个主题交流群,有兴趣可以加下: 点此加入
报毒我说明一下,是因为我把主题的版权信息做了加密,其中用了eval,杀毒软件认为eval函数是一个危险的操作,这点介意的话请勿下载,我也没有强迫任何人去下载,也没有向大家收取一分钱的主题费用,所以也犯不着因为这些事情来喷我,喜欢就用,不喜欢就不用,就这么简单

发布于2022-10-28

(四)完成友链管理与代码生成器

实体及数据库表介绍

友情链接

  • 类名:Friendly
  • 表名:blog_friendly
名称类型备注
id整数主键
title字符串友情链接的标题
link字符串友情链接的地址
package cn.kevinlu98.pojo;

import lombok.Getter;
import lombok.RequiredArgsConstructor;
import lombok.Setter;
import lombok.ToString;
import org.hibernate.Hibernate;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
import java.util.Objects;

/**
 * Author: Mr丶冷文
 * Date: 2022/10/7 15:45
 * Email: kevinlu98@qq.com
 * Description:
 */
@Getter
@Setter
@ToString
@RequiredArgsConstructor
@Entity
@Table(name = "blog_friendly")
public class Friendly {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;

    private String title;

    private String link;

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || Hibernate.getClass(this) != Hibernate.getClass(o)) return false;
        Friendly friendly = (Friendly) o;
        return id != null && Objects.equals(id, friendly.id);
    }

    @Override
    public int hashCode() {
        return getClass().hashCode();
    }
}

代码生成器

介绍

我们可以看到不管是分类管理还是这节课的友链管理这些,都是对数据库的基本增删查改操作,所以为了避免我们重复造轮子,我就开发了一个简单的代码生成器,其实原理很简单,就是用正则替换掉提前预设的一些字符

  • ##{name-zh}##:中文名
  • ##{name-en}##:英文名
  • ##{name-en-up}##:首字母大写的英文名
  • ##{id}##:主键
  • 遍历属性:

    ##{each}##
    ##{zname}##:属性中文名
    ##{ename}##:属性英文名
    ##{endeach}##

构建Mapper模版

package cn.kevinlu98.mapper;

import cn.kevinlu98.pojo.##{name-en-up}##;
import org.springframework.data.jpa.repository.JpaRepository;

/**
 * Author: Mr丶冷文
 * Date: 2022/10/6 22:04
 * Email: kevinlu98@qq.com
 * Description:
 */
public interface ##{name-en-up}##Mapper extends JpaRepository<##{name-en-up}##, Integer> {
}

构建Service模版

package cn.kevinlu98.service;

import cn.kevinlu98.mapper.##{name-en-up}##Mapper;
import cn.kevinlu98.pojo.##{name-en-up}##;
import org.springframework.stereotype.Service;

import java.util.List;

/**
 * Author: Mr丶冷文
 * Date: 2022/10/6 22:20
 * Email: kevinlu98@qq.com
 * Description:
 */
@Service
public class ##{name-en-up}##Service {

    private final ##{name-en-up}##Mapper mapper;


    public ##{name-en-up}##Service(##{name-en-up}##Mapper mapper) {
        this.mapper = mapper;
    }


    /**
     * 查询所有的##{name-zh}##
     *
     * @return ##{name-zh}##列表
     */
    public List<##{name-en-up}##> list() {
        return mapper.findAll();
    }

    /**
     * 查询##{name-zh}##总数
     *
     * @return ##{name-zh}##总数
     */
    public long count() {
        return mapper.count();
    }

    /**
     * id查询资源详情
     *
     * @param id 主键
     * @return ##{name-zh}##详情
     */
    public ##{name-en-up}## detail(Integer id) {
        return mapper.findById(id).orElse(null);
    }

    /**
     * 保存操作
     *
     * @param ##{name-en}## 要保存的对象
     */
    public void save(##{name-en-up}## ##{name-en}##) {
        mapper.save(##{name-en}##);
    }

    /**
     * 根据id从数据库表中删除数据
     *
     * @param id 主键
     */
    public void delete(Integer id) {
        mapper.deleteById(id);
    }
}

构建Controller模版

package cn.kevinlu98.controller;

import cn.kevinlu98.common.Result;
import cn.kevinlu98.enums.ResultEnum;
import cn.kevinlu98.pojo.##{name-en-up}##;
import cn.kevinlu98.service.##{name-en-up}##Service;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.DeleteMapping;
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.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.sql.SQLIntegrityConstraintViolationException;
import java.util.List;
import java.util.Objects;

/**
 * Author: Mr丶冷文
 * Date: 2022/10/6 22:32
 * Email: kevinlu98@qq.com
 * Description:
 */
@Slf4j
@RestController
@RequestMapping("/admin/##{name-en}##")
public class ##{name-en-up}##Controller {

    private final ##{name-en-up}##Service service;

    public ##{name-en-up}##Controller(##{name-en-up}##Service service) {
        this.service = service;
    }

    @GetMapping("/")
    public Result<List<##{name-en-up}##>> list() {
        return Result.success(service.list());
    }

    @GetMapping("/{id}")
    public Result<##{name-en-up}##> detail(@PathVariable Integer id) {
        ##{name-en-up}## ##{name-en}## = service.detail(id);
        if (Objects.isNull(##{name-en}##)) {
            return Result.error(ResultEnum.RESULT_DATA_NOT_FIND);
        } else {
            return Result.success(##{name-en}##);
        }
    }


    @PostMapping("/")
    public Result<String> save(##{name-en-up}## ##{name-en}##) {
        service.save(##{name-en}##);
        return Result.success();
    }

    @DeleteMapping("/{id}")
    public Result<String> delete(@PathVariable Integer id) {
        service.delete(id);
        return Result.success();
    }
}

构建页面模版

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org" lang="en">
<head th:replace="admin/common::header(~{::title},~{},~{})">
    <title>##{name-zh}##管理</title>
</head>
<body>
<th:block th:include="admin/common::nav('##{name-en}##')"></th:block>

<div class="container lw-main lw-banner">
    <div class="btn-group" role="group" style="margin-bottom: 20px;" aria-label="...">
        <button type="button" id="lw-add-btn" class="btn btn-default"><i class="fa fa-plus"></i> 新增</button>
    </div>
    <table id="data-table"></table>
</div>

<div class="modal fade" id="save-window" tabindex="-1" role="dialog" aria-labelledby="myModalLabel">
    <div class="modal-dialog" role="document">
        <div class="modal-content">
            <form id="data-form">
                <input type="hidden" name="##{id}##">
                <div class="modal-header">
                    <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span
                            aria-hidden="true">&times;</span></button>
                    <h4 class="modal-title" id="window-title">Modal title</h4>
                </div>
                <div class="modal-body">
                    ##{each}##
                    <div class="form-group">
                        <label>##{zname}##</label>
                        <input type="text" name="##{ename}##" required class="form-control" placeholder="请输入##{zname}##...">
                    </div>
                    ##{endeach}##
                </div>
                <div class="modal-footer">
                    <button type="button" class="btn btn-default" data-dismiss="modal">关闭</button>
                    <button type="submit" class="btn btn-primary">保存</button>
                </div>
            </form>
        </div>
    </div>
</div>

<th:block th:include="admin/common::footer"></th:block>
<script>
    $(function () {

        // $('#save-window').modal('show')

        $('#data-table').bootstrapTable({
            url: '/admin/##{name-en}##/',
            responseHandler: function (res) {
                return res.data
            },
            columns: [
                {
                    title: '序号',
                    width: 50,
                    align: 'center',
                    formatter: function (value, row, index) {
                        return index + 1
                    }
                },
                ##{each}##
                {
                    title: '##{zname}##',
                    field: '##{ename}##'
                },
                ##{endeach}##
                {
                    field: '##{id}##',
                    title: '操作',
                    width: 200,
                    formatter: function (value) {
                        return `<button type="button" data-id="${value}" class="btn btn-info btn-sm lw-update-btn"><i class="fa fa-edit"></i> 编辑</button> <button type="button" data-id="${value}" class="btn btn-danger btn-sm lw-del-btn"><i class="fa fa-trash"></i> 删除</button>`
                    }
                },
            ]
        })

        $("#data-form").on('submit', function () {
            let data = $(this).serialize();

            $.ajax({
                url: '/admin/##{name-en}##/',
                method: 'post',
                data: data,
                dataType: 'json',
                success: res => {
                    if (res.code === 200) {
                        layer.msg("保存成功", {icon: 1, time: 500}, function () {
                            $('#save-window').modal('hide')
                            $('#data-table').bootstrapTable('refresh', {silent: true})
                        })
                    } else {
                        layer.msg(res.message, {icon: 2})
                    }
                }
            })


            return false;
        })

        $("#lw-add-btn").on('click', function () {
            $("#window-title").text('新增##{name-zh}##')
            $("#data-form").initForm({##{id}##: "",   ##{each}## ##{ename}##: "", ##{endeach}##})
            $('#save-window').modal('show')
        })

        $("#data-table").on('click', '.lw-update-btn', function () {
            //   获取目标资源id
            let id = $(this).data('id')
            $.ajax({
                url: '/admin/##{name-en}##/' + id,
                method: 'get',
                dataType: 'json',
                success: res => {
                    if (res.code === 200) {
                        $("#window-title").text('编辑##{name-zh}##')
                        $("#data-form").initForm(res.data)
                        $('#save-window').modal('show')
                    } else {
                        layer.msg(res.message, {icon: 2})
                    }
                }
            })
        }).on('click', '.lw-del-btn', function () {
            let id = $(this).data('id')
            let idx = layer.confirm('是否要删除该数据?', {
                btn: ['确认', '取消'] //按钮
            }, function () {
                $.ajax({
                    url: '/admin/##{name-en}##/' + id,
                    method: 'delete',
                    dataType: 'json',
                    success: res => {
                        if (res.code === 200) {
                            layer.msg("删除成功", {icon: 1})
                            $('#data-table').bootstrapTable('refresh', {silent: true})
                        } else {
                            layer.msg(res.message, {icon: 2})
                        }
                    }
                })
                layer.close(idx);
            })
        })

    })
</script>
</body>
</html>

完成友链管理的开发

  • 用代码生成器及刚刚构建的模版生成友链管理及轮播图管理
  • 将生成的代码考到项目中

对不起,作者设置了附件 回复可见

评论(21)

  1. jzl 游客 2022-10-13 09:29 回复

热门文章

最新评论

  • relax

    希望能向博主深刻的学习

  • 1

    看看

  • eeee

    多谢大佬分享

  • asdasd

    强强强

  • asdasd

    感谢作者!

日历

2024年11月

     12
3456789
10111213141516
17181920212223
24252627282930

文章目录

站点公告
Freewind主题v1.5版本已发布,下载请移步Freewind 1.5,同时还有主题伴生插件Freewind Markdown,下载请移步 Freewind Markdown,有问题请在留言板,交换友链请直接在友链留言,我创建了一个主题交流群,有兴趣可以加下: 点此加入
报毒我说明一下,是因为我把主题的版权信息做了加密,其中用了eval,杀毒软件认为eval函数是一个危险的操作,这点介意的话请勿下载,我也没有强迫任何人去下载,也没有向大家收取一分钱的主题费用,所以也犯不着因为这些事情来喷我,喜欢就用,不喜欢就不用,就这么简单
点击小铃铛关闭