懒人方案--半天搞定一个SpringBoot单体项目

Posted Huterox

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了懒人方案--半天搞定一个SpringBoot单体项目相关的知识,希望对你有一定的参考价值。

文章目录

前言

好久木有冒个泡了,来活跃一下,顺便再水一篇博文~。那么最近也是在构建咱们这个whiteHole的分布式版本的时候呢,发现一个问题那就是通过充分考量业务的分析之后,鄙人一共创建了90多张表,6个数据库,还有两个没有创建(附加功能)保守估计加上一套完整的分级管理系统也就是120/30多张表嘛。

那么问题来了,有没有一张方案能够给我偷个懒呢,把这种简单的controller service dao 最好再来点前端页面给我写好呢?

答案是有的,如果熟练掌握了这个工具的使用,那么你像咱们C站或者某音那种博主一样,一个礼拜好几个xx管理项目拿过来圈粉是完全没问题的。只是文档稍微麻烦一点,当然也可以自动生成嘛。总之本文的目的就是教你如何合理的偷懒,一个礼拜N个项目还能赚赚外快是吧。

当然这也仅限于这种xx后台管理系统这也玩意,或者是不上线的玩意,因为这个还是一个毛坯房,有些东西还是要自己改一改的,不够你要是是毛坯房也够用的话,那也可以,毕竟像xx后台管理,或者xx大作业基本上不用考虑别的事情,不用那么麻烦。

工具下载

ok,废话不多说,我们开始,首先我们需要去获取我们的一个生成器,那么这个玩意的话,也是很早以前就有了的,再次突出:都2202年!当然偷懒的前提是已近掌握了。

我们先进入项目地址:https://github.com/renrenio/

这个项目里面的话是有好几个项目的,这里简单介绍一下。

renren-fast-vue

这个玩意是一套后端的管理系统,很多东西也是构建好了的,拿来用,改一下配就好了。那么这个是前后端分离的一个前端项目,是基于vue+elementui 做的。

renren-fast

这个是和咱们fast-vue配套的后端

其他的官网都有介绍。我这里就挑几个来look,look。

那么咱们这里还有使用到的呢就是 renren-generator 也就是咱们的代码生成器。

数据库创建

由于这个代码生成器主要是通过数据库,自动生成咱们的controller service dao 层,当然用mybatisplus其实也可以自动生成dao层,然后是基本的service,但是这里还有controller层,还有一些前端的代码生成(这个代码生的是vue+elementui,可以直接copy到你的前端工程)

这里的话,我们就拿WhiteHoleCloud的项目来做演示了。首先来看到咱们的这个项目吧

这里是集成了它的后台和生成器,这个东西看你自己放在哪,我这边就先这样了。

我们用来演示的是user服务。那么对应的表是这张表:

环境准备

现在我们已经有了数据库,表啥的都建好了。

那么我们下载好源码

这个咋下载我就不说了,之后的话放在一共合适的地方在你的idea里面打开。我这里就放在了WhiteHoleCloud的项目下。


之后展开 :


这里注意下 tablePrefix表的前缀,我这个是user服务,所以前缀都是user_

然后我们运行它的Application

我这里启动9000端口(原来的8000被用了)

然后选择一下你的表,之后生成就好了,然后你会得到一个压缩包。

这里面有一些前端的代码,就在views下面,是vue+element写的

然后这里面还有提供了mapper,当然实际上生成的代码其实是mybatisplus的是注解式的。如果你有需要就导入也可以。

比如我这样就是这样的:

这里注意一点是我用idea把user这个包改了个名字,前面配置的时候写错了。

依赖导入

Maven依赖导入

现在的话我们是成功把代码迁移过来了,但是里面还有很多东西没有,最基本的就是依赖没有。

这里的话由于我是一个分布式的项目,所以的话,我这边有一个组件包 。然后我把依赖都放在这里面了,当然也可以放在root的pom文件下,但是还有一些包没有所以我直接创建组件来用。那么如果你是单体项目的话,那么你直接放在你那个项目的pom文件下,例如:

但是咱们这里不是这样的,不过都是一样的。

基本依赖如下:


    <dependencies>
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.3.1</version>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.4</version>
        </dependency>

        <dependency>
            <groupId>org.apache.httpcomponents</groupId>
            <artifactId>httpcore</artifactId>
            <version>4.4.15</version>
        </dependency>


        <dependency>
            <groupId>commons-lang</groupId>
            <artifactId>commons-lang</artifactId>
            <version>2.6</version>
        </dependency>
        <dependency>
            <groupId>org.apache.tomcat.embed</groupId>
            <artifactId>tomcat-embed-core</artifactId>
            <version>9.0.60</version>
        </dependency>
        <dependency>
            <groupId>jakarta.validation</groupId>
            <artifactId>jakarta.validation-api</artifactId>
            <version>2.0.2</version>
            <scope>compile</scope>
        </dependency>

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.28</version>
        </dependency>

        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.1.13</version>
        </dependency>
    </dependencies>


那么这个依赖我要说一下的就是,我这里还少了这个shiro的依赖,因为我要用的是SpringSecurity。

如果你要用Shiro的话你自己再导入进去就好了,我这里的话就不导入了,而且我还把Shiro相关的代码注释了。

那么如果你们自己的话,那就看情况了。

代码依赖

这个玩意毕竟是代码生成的嘛,还有一些它自己的代码依赖是需要导入的,这个可以去copy一下,你自己也可以去copy一下,但是注意的是要去renren-fast这个项目里面的代码去copy。

那么我这里的话就直接贴出来,你先把Maven依赖导入,然后创建对应的包,把这个代码拷贝进去,那个Maven依赖里面有些就是为这个代码依赖服务的。所以直接copy这里是不错的选择。

我把这些代码都放在了那个公共组件里面,那么如果你是单体的项目,那么你把common这个包创建在你的项目目录下就好了。

那么现在我就依次把对应的代码给出了,自己创建好后,复制就好了。

exception

/**
 * Copyright (c) 2016-2019 人人开源 All rights reserved.
 *
 * https://www.renren.io
 *
 * 版权所有,侵权必究!
 */

package com.huterox.common.exception;

/**
 * 自定义异常
 *
 * @author Mark sunlightcs@gmail.com
 */
public class RRException extends RuntimeException 
	private static final long serialVersionUID = 1L;
	
    private String msg;
    private int code = 500;
    
    public RRException(String msg) 
		super(msg);
		this.msg = msg;
	
	
	public RRException(String msg, Throwable e) 
		super(msg, e);
		this.msg = msg;
	
	
	public RRException(String msg, int code) 
		super(msg);
		this.msg = msg;
		this.code = code;
	
	
	public RRException(String msg, int code, Throwable e) 
		super(msg, e);
		this.msg = msg;
		this.code = code;
	

	public String getMsg() 
		return msg;
	

	public void setMsg(String msg) 
		this.msg = msg;
	

	public int getCode() 
		return code;
	

	public void setCode(int code) 
		this.code = code;
	
	
	


utils

/**
 * Copyright (c) 2016-2019 人人开源 All rights reserved.
 * <p>
 * https://www.renren.io
 * <p>
 * 版权所有,侵权必究!
 */

package com.huterox.common.utils;

import com.huterox.common.validator.group.AliyunGroup;
import com.huterox.common.validator.group.QcloudGroup;
import com.huterox.common.validator.group.QiniuGroup;

import java.util.Optional;
import java.util.stream.Stream;

/**
 * 常量
 *
 * @author Mark sunlightcs@gmail.com
 */
public class Constant 
    /**
     * 超级管理员ID
     */
    public static final int SUPER_ADMIN = 1;
    /**
     * 当前页码
     */
    public static final String PAGE = "page";
    /**
     * 每页显示记录数
     */
    public static final String LIMIT = "limit";
    /**
     * 排序字段
     */
    public static final String ORDER_FIELD = "sidx";
    /**
     * 排序方式
     */
    public static final String ORDER = "order";
    /**
     * 升序
     */
    public static final String ASC = "asc";

    /**
     * 菜单类型
     *
     * @author chenshun
     * @email sunlightcs@gmail.com
     * @date 2016年11月15日 下午1:24:29
     */
    public enum MenuType 
        /**
         * 目录
         */
        CATALOG(0),
        /**
         * 菜单
         */
        MENU(1),
        /**
         * 按钮
         */
        BUTTON(2);

        private int value;

        MenuType(int value) 
            this.value = value;
        

        public int getValue() 
            return value;
        
    

    /**
     * 定时任务状态
     *
     * @author chenshun
     * @email sunlightcs@gmail.com
     * @date 2016年12月3日 上午12:07:22
     */
    public enum ScheduleStatus 
        /**
         * 正常
         */
        NORMAL(0),
        /**
         * 暂停
         */
        PAUSE(1);

        private int value;

        ScheduleStatus(int value) 
            this.value = value;
        

        public int getValue() 
            return value;
        
    

    /**
     * 云服务商
     */
    public enum CloudService 
        /**
         * 七牛云
         */
        QINIU(1, QiniuGroup.class),
        /**
         * 阿里云
         */
        ALIYUN(2, AliyunGroup.class),
        /**
         * 腾讯云
         */
        QCLOUD(3, QcloudGroup.class);

        private int value;

        private Class<?> validatorGroupClass;

        CloudService(int value, Class<?> validatorGroupClass) 
            this.value = value;
            this.validatorGroupClass = validatorGroupClass;
        

        public int getValue() 
            return value;
        

        public Class<?> getValidatorGroupClass() 
            return this.validatorGroupClass;
        

        public static CloudService getByValue(Integer value) 
            Optional<CloudService> first = Stream.of(CloudService.values()).filter(cs -> value.equals(cs.value)).findFirst();
            if (!first.isPresent()) 
                throw new IllegalArgumentException("非法的枚举值:" + value);
            
            return first.get();
        
    



/**
 * Copyright (c) 2016-2019 人人开源 All rights reserved.
 *
 * https://www.renren.io
 *
 * 版权所有,侵权必究!
 */

package com.huterox.common.utils;

import com.baomidou.mybatisplus.core.metadata.IPage;

import java.io.Serializable;
import java.util.List;

/**
 * 分页工具类
 *
 * @author Mark sunlightcs@gmail.com
 */
public class PageUtils implements Serializable 
	private static final long serialVersionUID = 1L;
	/**
	 * 总记录数
	 */
	private int totalCount;
	/**
	 * 每页记录数
	 */
	private int pageSize;
	/**
	 * 总页数
	 */
	private int totalPage;
	/**
	 * 当前页数
	 */
	private int currPage;
	/**
	 * 列表数据
	 */
	private List<?> list;
	
	/**
	 * 分页
	 * @param list        列表数据
	 * @param totalCount  总记录数
	 * @param pageSize    每页记录数
	 * @param currPage    当前页数
	 */
	public PageUtils(List<?> list, int totalCount, int pageSize, int currPage) 
		this.list = list;
		this.totalCount = totalCount;
		this.pageSize = pageSize;
		this.currPage = currPage;
		this.totalPage = (int)Math.ceil((double)totalCount/pageSize);
	

	/**
	 * 分页
	 */
	public PageUtils(IPage<?> page) 
		this.list = page.getRecords();
		this.totalCount = (int)page.getTotal();
		this.pageSize = (int)page.getSize();
		this.currPage = (int)page.getCurrent();
		this.totalPage = (int)page.getPages();
	

	public int getTotalCount() 
		return totalCount;
	

	public void setTotalCount(int totalCount) 
		this.totalCount = totalCount;
	

	public int getPageSize() 
		return pageSize;
	

	public void setPageSize(int pageSize) 
		this.pageSize = pageSize;
	

	public int getTotalPage() 
		return totalPage;
	

	public void setTotalPage(int totalPage) 
		this.totalPage = totalPage;
	

	public int getCurrPage() 
		return currPage;
	

	public void setCurrPage(int currPage) 
		this.currPage = currPage;
	

	public List<?> getList() 
		return list;
	

	public void setList(List<?> list) 
		this.list = list;
	
	


/**
 * Copyright (c) 2016-2019 人人开源 All rights reserved.
 *
 * https://www.renren.io
 *
 * 版权所有,侵权必究!
 */

package com.huterox.common.utils;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.metadata.OrderItem;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;

import com.huterox.common.xss.SQLFilter;
import org.apache.commons.lang.StringUtils;

import java.util.Map;

/**
 * 查询参数
 *
 * @author Mark sunlightcs@gmail.com
 */
public class Query<T> 

    public IPage<T> getPage(Map<String, Object> params) 
        return this.getPage(params, null, false);
    

    public IPage<T> getPage(Map<String, Object> params, String defaultOrderField, boolean isAsc) 
        //分页参数
        long curPage = 1;
        long limit = 10;

        if(params.get(Constant.PAGE) != null)
            curPage = Long.parseLong((String)params.get(Constant.PAGE));
        
        if(params.get(Constant.LIMIT) != null)
            limit = Long.parseLong((String)params.get(Constant.LIMIT));
        

        //分页对象
        Page<T> page = new Page<T>懒人方案-半天搞定一个分布式后台管理系统

懒人方案-半天搞定一个分布式后台管理系统

懒人办公|30秒搞定PDF文档合并

懒人福音|10秒搞定多文件转PDF

Spring Cloud Alibaba 进阶——微服务和单体架构的区别

SpringBoot 一个依赖搞定 session 共享,没有比这更简单的方案了!