开源项目Springboot_v2真香系列

举报
赵KK日常技术记录 发表于 2023/06/24 12:53:43 2023/06/24
【摘要】 之前找过很多开源项目,用于生成代码,和权限管理,但功能全的需要付费,小功能的项目又不实用,这次的开源项目,功能十分强大,且拿来即用。介绍SpringBoot_v2项目是努力打造springboot框架的极致细腻的脚手架。原生纯净,可在线生成controller、mapperxml、dao、service、html、sql代码,极大减少开发难度,增加开发进度神器脚手架!!不求回报,你使用快乐就...

之前找过很多开源项目,用于生成代码,和权限管理,但功能全的需要付费,小功能的项目又不实用,这次的开源项目,功能十分强大,且拿来即用。

介绍

SpringBoot_v2项目是努力打造springboot框架的极致细腻的脚手架。原生纯净,可在线生成controller、mapperxml、dao、service、html、sql代码,极大减少开发难度,增加开发进度神器脚手架!!不求回报,你使用快乐就是这个项目最大的快乐!后台管理包含代码生成器

UI页面

请在此添加图片描述

除了代码生成器,还有表单构建,系统监控,定时任务

技术应用

技术 名称 官网 备注
springboot springboot框架 ​ ​
Apache Shiro 权限框架 ​ ​
MyBatis Generator 代码生成 ​ ​
PageHelper MyBatis物理分页插件 ​ ​
hikari 数据库连接池 ​ ​
Thymeleaf 模板引擎 ​ ​
Log4J 日志组件 ​ ​
Swagger2 接口测试框架 ​ ​
Maven 项目构建管理 ​ ​
Websocket websocket消息通知 ​ ​
velocity 模板引擎 ​ ​
kaptcha google验证码 ​ ​
devtools 热部署 ​ ​
GSON 谷歌json ​ ​
druid 阿里连接池 ​ ​
quartz 定时框架 ​ ​

部署

1.导入doc文件夹里面的springbootv2.sql到数据库

注意:由于数据库设置问题,个人进行导入会出现乱码,导致前端页面乱码,非编码

2.确认自己的mysql版本 进行修改jar 在pom.xml 73-84行

Select@@version

3.修改application-dev.yml 里面自己数据库版本对应的jdbc链接

4.正常启动run SpringbootStart.java

生成代码

@GetMapping("/one")
  @RequiresPermissions("system:autocode:one")
    public String one(ModelMap model)
    {  
    String str="单表代码生成";
    setTitle(model, new TitleVo("生成", str+"管理", true,"欢迎进入"+str+"页面", true, false));
    //查询表名  引擎
    List<TsysTables> tables=generatorService.queryList(null);
    //查询表对应权限
    List<TsysPermission> permissions= sysPermissionService.list2(null) ;
    model.addAttribute("tables", tables);
    model.addAttribute("permissions", permissions);
        return prefix + "/one";
    }

@PostMapping("/saveOne")
  @ResponseBody
  public AjaxResult saveOne(String allColumnss,String tableName,String conditionQueryField,String pid,int sqlcheck) throws Exception{
    JSONArray array= JSONUtil.parseArray(allColumnss);
    //遗留可用前端修改传入的字段等信息(未完善)
    List<BeanColumn> beanColumns2=JSONUtil.toList(array, BeanColumn.class);
    List<TsysTables> list= generatorService.queryList(tableName);
    if(list.size()>0) {
      TsysTables tables=list.get(0);
      List<BeanColumn> beanColumns= generatorService.queryColumns2(tableName);
      AutoCodeUtil.autoCodeOneModel(sysUtilService,tables, beanColumns,conditionQueryField,pid,sqlcheck);
    }
    return AjaxResult.success();
  }
  
  autoCodeOneModel方法
  public static void autoCodeOneModel(SysUtilService sysUtilService,TsysTables tables,List<BeanColumn> beanColumns,String conditionQueryField,String pid,int sqlcheck){
     //设置velocity资源加载器
        Properties prop = new Properties();
        prop.put("file.resource.loader.class", "org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader" );
        Velocity.init(prop);
    
    GlobalConfig globalConfig= AutoCodeConfig.getGlobalConfig();
    Map<String, Object> map = new HashMap<>();
        //数据库表数据
    map.put("TsysTables",tables);
        //字段集合
        map.put("beanColumns",beanColumns);
        //配置文件
        map.put("globalConfig",globalConfig);
        map.put("datetime",new DateTime());
        map.put("pid",pid);
        map.put("sqlcheck",sqlcheck);
        map.put("conditionQueryField",conditionQueryField);
        map.put("conditionQueryField_a",com.fc.test.util.StringUtils.firstLowerCase(conditionQueryField));
        map.put("SnowflakeIdWorker", SnowflakeIdWorker.class);
        //需要导入的java类
        map.put("JavaClassPackages", getJavaClassPackage(beanColumns));
        VelocityContext context = new VelocityContext(map);
        
      //获取模板列表
        List<String> templates = getTemplates();
        for (String template : templates) {
          try {
            if(template.contains("menu.sql.vm")) {
              if(sqlcheck==1) {//执行sql
                Template tpl = Velocity.getTemplate(template, "UTF-8" );
                  StringWriter sw = new StringWriter(); 
                  tpl.merge(context, sw);
                  System.out.println(sw);
                  executeSQL(sysUtilService, sw.toString());
              }else {//只输出
                Template tpl = Velocity.getTemplate(template, "UTF-8" );
                  StringWriter sw = new StringWriter(); 
                  tpl.merge(context, sw);
                  System.out.println(sw);
              }
              
            }else {
              String filepath=getCoverFileName(template,tables.getTableModel_a() ,tables.getTableModel(),globalConfig.getParentPack() , "model","gen");
                Template tpl = Velocity.getTemplate(template, "UTF-8" );
            File file = new File(filepath);
            if (!file.getParentFile().exists())
                    file.getParentFile().mkdirs();
                if (!file.exists())
                    file.createNewFile();
          try (FileOutputStream outStream = new FileOutputStream(file);
             OutputStreamWriter writer = new OutputStreamWriter(outStream, "UTF-8");
             BufferedWriter sw = new BufferedWriter(writer)) {
            tpl.merge(context, sw);
            sw.flush();
            System.out.println("成功生成Java文件:" + filepath);
          }
            }
            
          } catch (IOException e) {
                try {
          throw new Exception("渲染模板失败,表名:" +tables.getTableName()+"\n"+e.getMessage());
        } catch (Exception e1) {
          e1.printStackTrace();
        }
            }
        }
  }
  其中VelocityContext非常类似hashtable 是上面提到的velocity语法
  
  GlobalConfig用于自动生成配置文件类

登录页面

请在此添加图片描述

表单构建

请在此添加图片描述

左侧功能区域拖动到右侧生成HTML代码

请在此添加图片描述

系统监控

请在此添加图片描述

代码实现

this.jvmSpecInfo=SystemUtil.getJvmSpecInfo();
    //取得Java Virtual Machine Implementation的信息
    this.jvmInfo=SystemUtil.getJvmInfo();
    //取得Java Specification的信息
    this.javaSpecInfo=SystemUtil.getJavaSpecInfo();
    //取得Java Implementation的信息
    this.javaInfo=SystemUtil.getJavaInfo();
    //取得当前运行的JRE的信息
    this.javaRuntimeInfo=SystemUtil.getJavaRuntimeInfo();
    //取得OS的信息
    this.osInfo=SystemUtil.getOsInfo();
    //取得User的信息
    this.userInfo=SystemUtil.getUserInfo();
    //取得Runtime的信息
    this.runtimeInfo=SystemUtil.getRuntimeInfo();
    //取得Host的信息
    this.hostInfo=SystemUtil.getHostInfo();
    //JDK启动时间
    this.startTime=getStartTime();
    //JDK运行时间
    this.runTime=getRunTime();
    //获得JVM最大内存
    this.maxMemory = FileUtil.readableFileSize(SystemUtil.getRuntimeInfo().getMaxMemory());
    //获得JVM已分配内存
    this.totalMemory = FileUtil.readableFileSize(SystemUtil.getRuntimeInfo().getTotalMemory());
    //获得JVM已分配内存中的剩余空间
    this.freeMemory = FileUtil.readableFileSize(SystemUtil.getRuntimeInfo().getFreeMemory());
    //JVM最大可用内存
    this.usableMemory = FileUtil.readableFileSize(SystemUtil.getRuntimeInfo().getUsableMemory());

雪花算法生成分布式ID

/**
* Twitter_Snowflake

* SnowFlake的结构如下(每部分用-分开):

* 0 - 0000000000 0000000000 0000000000 0000000000 0 - 00000 - 00000 - 000000000000

* 1位标识,由于long基本类型在Java中是带符号的,最高位是符号位,正数是0,负数是1,所以id一般是正数,最高位是0

* 41位时间截(毫秒级),注意,41位时间截不是存储当前时间的时间截,而是存储时间截的差值(当前时间截 - 开始时间截)
* 得到的值),这里的的开始时间截,一般是我们的id生成器开始使用的时间,由我们程序来指定的(如下下面程序IdWorker类的startTime属性)。41位的时间截,可以使用69年,年T = (1L << 41) / (1000L * 60 * 60 * 24 * 365) = 69

* 10位的数据机器位,可以部署在1024个节点,包括5位datacenterId和5位workerId

* 12位序列,毫秒内的计数,12位的计数顺序号支持每个节点每毫秒(同一机器,同一时间截)产生4096个ID序号

* 加起来刚好64位,为一个Long型。

* SnowFlake的优点是,整体上按照时间自增排序,并且整个分布式系统内不会产生ID碰撞(由数据中心ID和机器ID作区分),并且效率较高,经测试,SnowFlake每秒能够产生26万ID左右。
*/

还有这个天气预报小插件挺有意思

请在此添加图片描述

项目地址

https://gitee.com/bdj/SpringBoot_v2

请在此添加图片描述

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0)

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。