项目介绍:
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
- 其他:fastjson,poi,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、路由限流 √
微服务架构图
微服务架构图
Jeecg Boot 产品功能蓝图
功能蓝图
项目下载和运行
- 拉取项目代码
git clone https://github.com/zhangdaiscott/jeecg-boot.gitcd jeecg-boot/ant-design-jeecg-vue
- 安装node.js
- 切换到ant-design-jeecg-vue文件夹下
# 安装yarnnpm install -g yarn# 下载依赖yarn install# 启动yarn run serve# 编译项目yarn run build# Lints and fixes filesyarn run lint
系统效果
大屏模板
输入图片说明
输入图片说明
PC端
在线接口文档
报表
流程
手机端
PAD端
源码获取方式:关注小编 转发文章 私信【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。
下面我们来画一个内存图来表示上面的代码,看起来更加有说服力。
内存过程大致如下:
- 运行先编译,然后当前类Demo2_String.class文件加载进入内存的方法区
- 第二步,main方法压入栈内存
- 常量池创建一个“abc”对象,产生一个内存地址
- 然后把“abc”内存地址赋值给main方法里的成员变量st1,这个时候st1根据内存地址,指向了常量池中的“abc”。
- 前面一篇提到,常量池有这个特点,如果发现已经存在,就不在创建重复的对象
- 运行到代码 Stringst2 =”abc”, 由于常量池存在“abc”,所以不会再创建,直接把“abc”内存地址赋值给了st2
- 最后st1和st2都指向了内存中同一个地址,所以两者是完全相同的。
2. 下面这句话在内存中创建了几个对象
String st1 = new String(“abc”);
答案是:在内存中创建两个对象,一个在堆内存,一个在常量池,堆内存对象是常量池对象的一个拷贝副本。
分析:
我们下面直接来一个内存图。
当我们看到了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”,所以完全相等。内存图如下
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的介绍,找到下面图片这句话。
关键点就在红圈这句话,我们知道任何数据和字符串进行加号( )运算,最终得到是一个拼接的新的字符串。上面注释说明了这个拼接的原理是由StringBuilder或者StringBuffer类和里面的append方法实现拼接,然后调用toString()把拼接的对象转换成字符串对象,最后把得到字符串对象的地址赋值给变量。结合这个理解,我们下面画一个内存图来分析。
大致内存过程
- 常量池创建“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中一些注解和原理,以及内存图分析,才能得到正确的结果,我承认是画内存图让我理解了答案为什么是这样。画完内存图之后,得到答案,你确实会发现很有趣,最后才会有原来如此的感叹。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。