GitHub 近两万 Star,无需编码,可一键生成前后端代码,开源项目(自动生成前端代码的工具)

项目介绍:

JeecgBoot 是一款基于代码生成器的低代码开发平台!前后端分离架构 SpringBoot2.x,SpringCloud,Ant Design&Vue,Mybatis-plus,Shiro,JWT,支持微服务。强大的代码生成器让前后端代码一键生成,实现低代码开发!

JeecgBoot 引领新的低代码开发模式(OnlineCoding-> 代码生成器-> 手工Merge), 帮助解决Java项目70%的重复工作,让开发更多关注业务。既能快速提高效率,节省研发成本,同时又不失灵活性!

JeecgBoot 提供了一系列低代码模块,实现在线开发真正的零代码:Online表单开发、Online报表、报表配置能力、在线图表设计、大屏设计、移动配置能力、表单设计器、在线设计流程、流程自动化配置、插件能力(可插拔)等等!

JEECG宗旨是: 简单功能由OnlineCoding配置实现,做到零代码开发;复杂功能由代码生成器生成进行手工Merge 实现低代码开发,既保证了智能又兼顾灵活;实现了低代码开发的同时又支持灵活编码,解决了当前低代码产品普遍不灵活的弊端!

JEECG业务流程: 采用工作流来实现、扩展出任务接口,供开发编写业务逻辑,表单提供多种解决方案:表单设计器、online配置表单、编码表单。同时实现了流程与表单的分离设计(松耦合)、并支持任务节点灵活配置,既保证了公司流程的保密性,又减少了开发人员的工作量。

适用项目

Jeecg-Boot低代码开发平台,可以应用在任何J2EE项目的开发中,尤其适合SAAS项目、企业信息管理系统MIS)、内部办公系统(OA)、企业资源计划系统(ERP)、客户关系管理系统(CRM)等,其半智能手工Merge的开发方式,可以显著提高开发效率70%以上,极大降低开发成本。

技术架构:

开发环境

  • 语言:Java 8
  • IDE(JAVA):IDEA / Eclipse安装lombok插件
  • IDE(前端):WebStorm 或者 IDEA
  • 依赖管理:Maven
  • 数据库:MySQL5.7 & Oracle 11g & SQLserver2017
  • 缓存:Redis

后端

  • 基础框架:Spring Boot 2.3.5.RELEASE
  • 微服务框架:Spring Cloud Alibaba 2.2.3.RELEASE
  • 持久层框架:Mybatis-plus 3.4.1
  • 安全框架:Apache Shiro 1.7.0,Jwt 3.11.0
  • 微服务技术栈:Spring Cloud Alibaba、Nacos、Gateway、Sentinel、Skywarking
  • 数据库连接池:阿里巴巴Druid 1.1.22
  • 缓存框架:redis
  • 日志打印:logback
  • 其他:fastjsonpoi,Swagger-ui,quartz, lombok(简化代码)等。

前端

  • Vue 2.6.10,Vuex,Vue Router
  • Axios
  • ant-design-vue
  • webpack,yarn
  • vue-cropper – 头像裁剪组件
  • @antv/g2 – Alipay AntV 数据可视化图表
  • Viser-vue – antv/g2 封装实现
  • eslint,@vue/cli 3.2.1
  • vue-print-nb – 打印

功能模块

├─系统管理│ ├─用户管理│ ├─角色管理│ ├─菜单管理│ ├─权限设置(支持按钮权限、数据权限)│ ├─表单权限(控制字段禁用、隐藏)│ ├─部门管理│ ├─我的部门(二级管理员)│ └─字典管理│ └─分类字典│ └─系统公告│ └─职务管理│ └─通讯录│ └─多租户管理├─消息中心│ ├─消息管理│ ├─模板管理├─代码生成器(低代码)│ ├─代码生成器功能(一键生成前后端代码,生成后无需修改直接用,绝对是后端开发福音)│ ├─代码生成器模板(提供4套模板,分别支持单表和一对多模型,不同风格选择)│ ├─代码生成器模板(生成代码,自带excel导入导出)│ ├─查询过滤器(查询逻辑无需编码,系统根据页面配置自动生成)│ ├─高级查询器(弹窗自动组合查询条件)│ ├─Excel导入导出工具集成(支持单表,一对多 导入导出)│ ├─平台移动自适应支持├─系统监控│ ├─Gateway路由网关│ ├─性能扫描监控│ │ ├─监控 Redis│ │ ├─Tomcat│ │ ├─jvm│ │ ├─服务器信息│ │ ├─请求追踪│ │ ├─磁盘监控│ ├─定时任务│ ├─系统日志│ ├─消息中心(支持短信、邮件、微信推送等等)│ ├─数据日志(记录数据快照,可对比快照,查看数据变更情况)│ ├─系统通知│ ├─SQL监控│ ├─swagger-ui(在线接口文档)│─报表示例│ ├─曲线图│ └─饼状图│ └─柱状图│ └─折线图│ └─面积图│ └─雷达图│ └─仪表图│ └─进度条│ └─排名列表│ └─等等│─大屏模板│ ├─作战指挥中心大屏│ └─物流服务中心大屏│─常用示例│ ├─自定义组件│ ├─对象存储(对接阿里云)│ ├─JVXETable示例(各种复杂ERP布局示例)│ ├─单表模型例子│ └─一对多模型例子│ └─打印例子│ └─一对多TAB例子│ └─内嵌table例子│ └─常用选择组件│ └─异步树table│ └─接口模拟测试│ └─表格合计示例│ └─异步树列表示例│ └─一对多JEditable│ └─JEditable组件示例│ └─图片拖拽排序│ └─图片翻页│ └─图片预览│ └─PDF预览│ └─分屏功能│─封装通用组件 │ ├─行编辑表格JEditableTable│ └─省略显示组件│ └─时间控件│ └─高级查询│ └─用户选择组件│ └─报表组件封装│ └─字典组件│ └─下拉多选组件│ └─选人组件│ └─选部门组件│ └─通过部门选人组件│ └─封装曲线、柱状图、饼状图、折线图等等报表的组件(经过封装,使用简单)│ └─在线code编辑器│ └─上传文件组件│ └─验证码组件│ └─树列表组件│ └─表单禁用组件│ └─等等│─更多页面模板│ ├─各种高级表单│ ├─各种列表效果│ └─结果页面│ └─异常页面│ └─个人页面├─高级功能│ ├─系统编码规则│ ├─提供单点登录CAS集成方案│ ├─提供APP发布方案│ ├─集成Websocket消息通知机制├─Online在线开发(低代码)│ ├─Online在线表单 - 功能已开放│ ├─Online代码生成器 - 功能已开放│ ├─Online在线报表 - 功能已开放│ ├─Online在线图表(暂不开源)│ ├─Online图表模板配置(暂不开源)│ ├─Online布局设计(暂不开源)│ ├─多数据源管理 - 功能已开放├─积木报表设计器(低代码)│ ├─打印设计器│ ├─数据报表设计│ ├─图形报表设计(支持echart)│ ├─大屏设计器(暂不开源)│─流程模块功能 (暂不开源)│ ├─流程设计器│ ├─在线表单设计│ └─我的任务│ └─历史流程│ └─历史流程│ └─流程实例管理│ └─流程监听管理│ └─流程表达式│ └─我发起的流程│ └─我的抄送│ └─流程委派、抄送、跳转│ └─。。。└─其他模块 └─更多功能开发中。。

微服务整体解决方案(2.4 版本)

1、服务注册和发现 Nacos √

2、统一配置中心 Nacos √

3、路由网关 gateway(三种加载方式) √

4、分布式 http feign √

5、熔断和降级 Sentinel √

6、分布式文件 Minio、阿里OSS √

7、统一权限控制 JWT Shiro √

8、服务监控 SpringBootAdmin√

9、链路跟踪 Skywarking

10、消息中间件 RabbitMQ

11、分布式任务 xxl-job √

12、分布式事务 Seata

13、分布式日志 elk kafa

14、支持 docker-compose、k8s、jenkins

15、CAS 单点登录 √

16、路由限流 √

微服务架构图

GitHub 近两万 Star,无需编码,可一键生成前后端代码,开源项目(自动生成前端代码的工具)

微服务架构图

Jeecg Boot 产品功能蓝图

GitHub 近两万 Star,无需编码,可一键生成前后端代码,开源项目(自动生成前端代码的工具)

功能蓝图

项目下载和运行

  • 拉取项目代码

git clone https://github.com/zhangdaiscott/jeecg-boot.gitcd jeecg-boot/ant-design-jeecg-vue

  1. 安装node.js
  2. 切换到ant-design-jeecg-vue文件夹下

# 安装yarnnpm install -g yarn# 下载依赖yarn install# 启动yarn run serve# 编译项目yarn run build# Lints and fixes filesyarn run lint

系统效果

大屏模板

GitHub 近两万 Star,无需编码,可一键生成前后端代码,开源项目(自动生成前端代码的工具)

输入图片说明

GitHub 近两万 Star,无需编码,可一键生成前后端代码,开源项目(自动生成前端代码的工具)

输入图片说明

PC端

GitHub 近两万 Star,无需编码,可一键生成前后端代码,开源项目(自动生成前端代码的工具)GitHub 近两万 Star,无需编码,可一键生成前后端代码,开源项目(自动生成前端代码的工具)GitHub 近两万 Star,无需编码,可一键生成前后端代码,开源项目(自动生成前端代码的工具)GitHub 近两万 Star,无需编码,可一键生成前后端代码,开源项目(自动生成前端代码的工具)

在线接口文档

GitHub 近两万 Star,无需编码,可一键生成前后端代码,开源项目(自动生成前端代码的工具)GitHub 近两万 Star,无需编码,可一键生成前后端代码,开源项目(自动生成前端代码的工具)

报表

GitHub 近两万 Star,无需编码,可一键生成前后端代码,开源项目(自动生成前端代码的工具)GitHub 近两万 Star,无需编码,可一键生成前后端代码,开源项目(自动生成前端代码的工具)GitHub 近两万 Star,无需编码,可一键生成前后端代码,开源项目(自动生成前端代码的工具)GitHub 近两万 Star,无需编码,可一键生成前后端代码,开源项目(自动生成前端代码的工具)GitHub 近两万 Star,无需编码,可一键生成前后端代码,开源项目(自动生成前端代码的工具)

流程

GitHub 近两万 Star,无需编码,可一键生成前后端代码,开源项目(自动生成前端代码的工具)GitHub 近两万 Star,无需编码,可一键生成前后端代码,开源项目(自动生成前端代码的工具)GitHub 近两万 Star,无需编码,可一键生成前后端代码,开源项目(自动生成前端代码的工具)GitHub 近两万 Star,无需编码,可一键生成前后端代码,开源项目(自动生成前端代码的工具)

手机端

GitHub 近两万 Star,无需编码,可一键生成前后端代码,开源项目(自动生成前端代码的工具)GitHub 近两万 Star,无需编码,可一键生成前后端代码,开源项目(自动生成前端代码的工具)

PAD端

GitHub 近两万 Star,无需编码,可一键生成前后端代码,开源项目(自动生成前端代码的工具)GitHub 近两万 Star,无需编码,可一键生成前后端代码,开源项目(自动生成前端代码的工具)GitHub 近两万 Star,无需编码,可一键生成前后端代码,开源项目(自动生成前端代码的工具)

源码获取方式:关注小编 转发文章 私信【666】免费获取
重要的事情说三遍,转发 转发 转发,一定要记得点赞转发哦!!!

Java String类的5道面试题,这五道题,我自己在面试过程中亲身经历过几道题目,学完了这篇,我才焕然大悟,才知道为什么是这个答案,本篇就带你了解这些题的答案为什么是这样。

1.判定定义为String类型的st1和st2是否相等,为什么

package string;public class Demo2_String { public static void main(String[] args) { String st1 = "abc"; String st2 = "abc"; System.out.println(st1 == st2); System.out.println(st1.equals(st2)); }}

输出结果:

第一行:true
第二行:true

分析:

先看第一个打印语句,在Java中==这个符号是比较运算符,它可以基本数据类型和引用数据类型是否相等,如果是基本数据类型,==比较的是值是否相等,如果是引用数据类型,==比较的是两个对象的内存地址是否相等。字符串不属于8中基本数据类型,字符串对象属于引用数据类型,在上面把“abc”同时赋值给了st1和st2两个字符串对象,指向的都是同一个地址,所以第一个打印语句中的==比较输出结果是 true

然后我们看第二个打印语句中的equals的比较,我们知道,equals是Object这个父类的方法,在String类中重写了这个equals方法,在JDK API 1.6文档中找到String类下的equals方法,点击进去可以看大这么一句话将此字符串与指定的对象比较。当且仅当该参数不为null,并且是与此对象表示相同字符序列的 String 对象时,结果才为 true。

注意这个相同字符序列,在后面介绍的比较两个数组,列表,字典是否相等,都是这个逻辑去写代码实现。由于st1和st2的值都是“abc”,两者指向同一个对象,当前字符序列相同,所以第二行打印结果也为true。

下面我们来画一个内存图来表示上面的代码,看起来更加有说服力。

GitHub 近两万 Star,无需编码,可一键生成前后端代码,开源项目(自动生成前端代码的工具)

内存过程大致如下:

  • 运行先编译,然后当前类Demo2_String.class文件加载进入内存的方法区
  • 第二步,main方法压入栈内存
  • 常量池创建一个“abc”对象,产生一个内存地址
  • 然后把“abc”内存地址赋值给main方法里的成员变量st1,这个时候st1根据内存地址,指向了常量池中的“abc”。
  • 前面一篇提到,常量池有这个特点,如果发现已经存在,就不在创建重复的对象
  • 运行到代码 Stringst2 =”abc”, 由于常量池存在“abc”,所以不会再创建,直接把“abc”内存地址赋值给了st2
  • 最后st1和st2都指向了内存中同一个地址,所以两者是完全相同的。

2. 下面这句话在内存中创建了几个对象

String st1 = new String(“abc”);

答案是:在内存中创建两个对象,一个在堆内存,一个在常量池,堆内存对象是常量池对象的一个拷贝副本。

分析:

我们下面直接来一个内存图。

GitHub 近两万 Star,无需编码,可一键生成前后端代码,开源项目(自动生成前端代码的工具)

当我们看到了new这个关键字,就要想到,new出来的对象都是存储在堆内存。然后我们来解释堆中对象为什么是常量池的对象的拷贝副本。“abc”属于字符串,字符串属于常量,所以应该在常量池中创建,所以第一个创建的对象就是在常量池里的“abc”。

第二个对象在堆内存为啥是一个拷贝的副本呢,这个就需要在JDK API 1.6找到String(String original)这个构造方法的注释:初始化一个新创建的 String 对象,使其表示一个与参数相同的字符序列;换句话说,新创建的字符串是该参数字符串的副本。所以,答案就出来了,两个对象。

3.判定以下定义为String类型的st1和st2是否相等

package string;public class Demo2_String { public static void main(String[] args) { String st1 = new String("abc"); String st2 = "abc"; System.out.println(st1 == st2); System.out.println(st1.equals(st2)); }}

答案:false 和 true

由于有前面两道提内存分析的经验和理论,所以,我能快速得出上面的答案。==比较的st1和st2对象的内存地址,由于st1指向的是堆内存的地址,st2看到“abc”已经在常量池存在,就不会再新建,所以st2指向了常量池的内存地址,所以==判断结果输出false,两者不相等。第二个equals比较,比较是两个字符串序列是否相等,由于就一个“abc”,所以完全相等。内存图如下

GitHub 近两万 Star,无需编码,可一键生成前后端代码,开源项目(自动生成前端代码的工具)

4. 判定以下定义为String类型的st1和st2是否相等

package string;public class Demo2_String { public static void main(String[] args) { String st1 = "a" "b" "c"; String st2 = "abc"; System.out.println(st1 == st2); System.out.println(st1.equals(st2)); }}

答案是:true 和 true

分析:

“a”,”b”,”c”三个本来就是字符串常量,进行 符号拼接之后变成了“abc”,“abc”本身就是字符串常量(Java中有常量优化机制),所以常量池立马会创建一个“abc”的字符串常量对象,在进行st2=”abc”,这个时候,常量池存在“abc”,所以不再创建。所以,不管比较内存地址还是比较字符串序列,都相等。更多面试题,欢迎关注公众号 Java面试题精选

5.判断以下st2和st3是否相等

package string;public class Demo2_String { public static void main(String[] args) { String st1 = "ab"; String st2 = "abc"; String st3 = st1 "c"; System.out.println(st2 == st3); System.out.println(st2.equals(st3)); }}

答案:false 和 true

分析:

上面的答案第一个是false,第二个是true,第二个是true我们很好理解,因为比较一个是“abc”,另外一个是拼接得到的“abc”,所以equals比较,这个是输出true,我们很好理解。那么第一个判断为什么是false,我们很疑惑。同样,下面我们用API的注释说明和内存图来解释这个为什么不相等。

首先,打开JDK API 1.6中String的介绍,找到下面图片这句话。

GitHub 近两万 Star,无需编码,可一键生成前后端代码,开源项目(自动生成前端代码的工具)

关键点就在红圈这句话,我们知道任何数据和字符串进行加号( )运算,最终得到是一个拼接的新的字符串。上面注释说明了这个拼接的原理是由StringBuilder或者StringBuffer类和里面的append方法实现拼接,然后调用toString()把拼接的对象转换成字符串对象,最后把得到字符串对象的地址赋值给变量。结合这个理解,我们下面画一个内存图来分析。

GitHub 近两万 Star,无需编码,可一键生成前后端代码,开源项目(自动生成前端代码的工具)

大致内存过程

  • 常量池创建“ab”对象,并赋值给st1,所以st1指向了“ab”
  • 常量池创建“abc”对象,并赋值给st2,所以st2指向了“abc”
  • 由于这里走的 的拼接方法,所以第三步是使用StringBuffer类的append方法,得到了“abc”,这个时候内存0x0011表示的是一个StringBuffer对象,注意不是String对象。
  • 调用了Object的toString方法把StringBuffer对象装换成了String对象。
  • 把String对象(0x0022)赋值给st3

所以,st3和st2进行==判断结果是不相等,因为两个对象内存地址不同。

总结:

这篇的面试题,完全就是要求掌握JDK API中一些注解和原理,以及内存图分析,才能得到正确的结果,我承认是画内存图让我理解了答案为什么是这样。画完内存图之后,得到答案,你确实会发现很有趣,最后才会有原来如此的感叹。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

(0)
上一篇 2024年5月16日 上午11:53
下一篇 2024年5月16日 下午12:05

相关推荐