从零开发电商网站

1.3 新增后台菜单表(有源码)

2020-02-17  本文已影响0人  小肥爬爬

接下来要做以下两件事情:

  1. 新增菜单表
  2. 用上一节的通用方法测试插入数据

菜单表的设计

package org.diego.mall.pojo;

import java.util.Comparator;

/**
 * 后台菜单类, 二级树形节点. 
 * @author cys
 *
 */
public class BackMenu implements Comparator<BackMenu>{
    
    // 分类层级, 如1,2级
    public static final int MENU_PARENT = 1;
    public static final int MENU_CHILD = 2;
    
    protected Long id;
    protected String name;
    protected Long parentId;                // 上级分类id
    protected Integer level;                // 几级分类
    protected Integer order;                // 同一个上级时候的排序
    protected String link;                  // 链接
    
    public Long getId() {
        return id;
    }
    public void setId(Long id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public Long getParentId() {
        return parentId;
    }
    public void setParentId(Long parentId) {
        this.parentId = parentId;
    }
    public Integer getLevel() {
        return level;
    }
    public void setLevel(Integer level) {
        this.level = level;
    }
    public Integer getOrder() {
        return order;
    }
    public void setOrder(Integer order) {
        this.order = order;
    }
    public String getLink() {
        return link;
    }
    public void setLink(String link) {
        this.link = link;
    }

    @Override
    public int compare(BackMenu o1, BackMenu o2) {
        return o1.getOrder() - o2.getOrder();
    }
}

任何树形结构的数据, 根据parentId, level(树节点中的层级) 和 order(排序), 就可以唯一地确定树节点的位置.

菜单表的服务类

分别是 IBackMenuService 和 BackMenuServiceImpl, 分别如下:

IBackMenuService

package org.diego.mall.service;

import org.diego.mall.pojo.BackMenu;

public interface IBackMenuService extends ISingleTableService<BackMenu>{

}

BackMenuServiceImpl

package org.diego.mall.service.impl;

import org.diego.mall.pojo.BackMenu;
import org.diego.mall.service.IBackMenuService;
import org.springframework.stereotype.Component;

@Component
public class BackMenuService extends AbstractSingleTableService<BackMenu> 
implements IBackMenuService{

}

测试插入数据

我一般会在工程专门开一个dev目录,用来放一些测试代码, 如下:


image.png

图里的 DevStart.java 的代码如下:

package org.diego.dev;

import org.mybatis.spring.annotation.MapperScan;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;


/**
 * 用于启动开发功能. 
 * @author cys
 *
 */
@SpringBootApplication
@EnableWebMvc
@ComponentScan("org.diego")
@MapperScan("org.diego.mall.dao") 
public class DevStart implements CommandLineRunner {
        
    static final Logger logger = LoggerFactory.getLogger(DevStart.class);
    
    @Autowired
    InitAdmin initAdmin;
        
    @Override
    public void run(String... args) throws Exception {

        initAdmin.doAll();
    }

    public static void main(String[] args) {
        
        SpringApplication.run(DevStart.class, args);
        logger.info("==== 启动开发功能");
        
        
    }
}

InitAdmin的代码如下:

package org.diego.dev;

import org.diego.mall.pojo.BackMenu;
import org.diego.mall.service.IBackMenuService;
import org.diego.mall.utils.DSqlUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

@Component
public class InitAdmin {
        
    static final Logger logger = LoggerFactory.getLogger(InitAdmin.class);
    
    @Autowired
    private IBackMenuService backMenuService;
    
    // 增加系统管理父菜单
    public void doAll() throws Exception {
        Long sytemParentId = this.checkAddSystemParent();
        
        // 创建角色管理子菜单
        Long id1 = this.checkAddSystemChild(sytemParentId, 1, "用户管理", "/system/BackUserIndex");
        Long id2 = this.checkAddSystemChild(sytemParentId, 2, "角色管理", "/system/RoleIndex");
        Long id3 = this.checkAddSystemChild(sytemParentId, 3, "菜单管理", "/system/BackMenuIndex");
    }
    
    // 增加系统管理父菜单
    public Long checkAddSystemParent() throws Exception {
        BackMenu menu = backMenuService.getFirst("name", "系统管理");
        if(menu != null) {
            logger.info("=== 系统管理父菜单已存在");
            return menu.getId();
        }
        menu = new BackMenu();
        menu.setLevel(BackMenu.MENU_PARENT);
        menu.setName("系统管理");
        menu.setOrder(1);
        
        Long id = backMenuService.insertOne(null, menu, null);
        logger.info("=== 已增加系统管理父菜单");
        return id;
    }

    
    // 增加系统管理下的子菜单
    private Long checkAddSystemChild(Long parentId, int order, String name, String link) throws Exception {
        
        String sql = DSqlUtils.andEqNumber("parentId", parentId, true);
        sql += DSqlUtils.andEqString("name", name, true);
        
        BackMenu menu = backMenuService.getFirstBySql(sql);
        if(menu != null) {
            logger.info("=== 子菜单: " + name + "已经存在");
            return menu.getId();
        }
        menu = new BackMenu();
        menu.setLevel(BackMenu.MENU_CHILD);
        menu.setName(name);
        menu.setOrder(order);
        menu.setParentId(parentId);
        menu.setLink(link);
        
        Long id = backMenuService.insertOne(null, menu, null);      
        logger.info("=== 已增加子菜单: " + name);
        return id;
    }
    
}

配置mysql数据库信息

根据 application.properties 配置数据库信息, 如下:

spring.datasource.url= jdbc:mysql://localhost:3306/diegomall?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai
spring.datasource.username=test
spring.datasource.password=test
spring.datasource.driverClassName: com.mysql.cj.jdbc.Driver

现在运行DevStart, 可以看到数据库有4条数据顺利插入了.


image.png

源码下载

源码在这: https://github.com/xiaofeipapa/dmall/tree/master/diegomall-1

上一篇 下一篇

猜你喜欢

热点阅读