GithubHelp home page GithubHelp logo

erupts / erupt Goto Github PK

View Code? Open in Web Editor NEW
2.5K 57.0 462.0 157.77 MB

🚀 General data management framework, objects are pages

Home Page: https://www.erupt.xyz

License: Apache License 2.0

Java 96.03% HTML 1.38% FreeMarker 0.06% Dockerfile 0.01% Vue 2.39% SCSS 0.14% Shell 0.01%
admin annotation erupt upms angular erupt-framework jpa java springboot spring

erupt's Introduction

中文   |   English

logo

Erupt Framework   🚀   通用配置管理框架

零前端代码,急速开发通用管理系统


Erupt Framework maven-central jdk 8+ license Apache 2.0 Gitee star Gitee fork GitHub stars GitHub forks

Github 仓库   |   码云仓库   |   🦅 官方网站   |   在线体验   |   框架生态   |   📕 使用文档


Erupt Cloud【分布式多维配置中心】   |   Erupt Flow 【工作流】


QQ交流群:836044286 🔥


🚀 简介 | Intro

Erupt 是一个低代码 全栈类 框架,它使用 Java 注解 动态生成页面以及增、删、改、查、权限控制等后台功能。

零前端代码、零 CURD、自动建表,仅需 一个类文件 + 简洁的注解配置,快速开发企业级 Admin 管理后台。

高扩展性,支持CURD自由扩展 @DataProxy 、自定义数据源、逻辑删除、LDAP、OSS。

提供企业级中后台管理系统的全栈解决方案,大幅压缩研发周期,专注核心业务。

完美取代 代码生成器,开发后台管理系统更优解决方案

从 2020 年开始不断优化升级,目前已有上百家中小型公司使用,上千名开发者开发相关应用。上百名开发者参与提交了功能建议,30多名贡献者参与提交代码。

🌈 特性 | Features

  • 自动建表:表结构自动生成,无需手动建表

  • 易于上手:会简单的 Spring Boot 基础知识即可

  • 使用简单:仅需了解 @Erupt@EruptField 两个注解即可上手开发

  • 代码简洁:仅需一个 .java 文件, template、controller、service、dao 都不需要创建

  • 功能强大:动态条件处理,逻辑删除,LDAP,自定义登录逻辑,RedisSession,操作日志等

  • 多数据源:支持:MySQL、Oracle、SQL Server、PostgreSQL、H2,甚至支持 MongoDB

  • 高扩展性:支持自定义数据源实现、自定义登录逻辑、动态权限管理、生命周期函数、自定义 OSS

  • 大量组件:滑动输入、时间选择、一对多、图片上传、代码编辑器、自动完成、树、多对多、地图等23类组件

  • 丰富展示:普通文本、二维码、链接、图片、HTML、代码段、iframe、swf等


  • 低侵入性:几乎所有功能都围绕注解而展开,不影响Spring Boot其他功能或三方库库的使用

  • 前后端分离:后端与前端可分开部署

  • 响应式布局:支持PC端手机端等各种规格的设备中使用

  • 自定义页面:支持自定义页面,自定义弹出层,且支持:原生H5 / Freemarker / Thymeleaf等方式渲染

  • 前端零代码:前端布局自动构建,一行前端代码都不用写

  • 无需二次开发:仅需引用 jar 包即可 !

🏅 代码仓库 | Git Repository

Github 码云
后端源码 https://github.com/erupts/erupt https://gitee.com/erupt/erupt
前端源码 https://github.com/erupts/erupt-web https://gitee.com/erupt/erupt-web
示例代码 https://github.com/erupts/erupt-example https://gitee.com/erupt/erupt-example

🧐 为什么要做 Erupt ?

虽然近些年来 代码生成器 成了后台开发的新宠,但它真的是后台开发的最优解吗?

代码生成器的本质还是生成繁琐的前端与后台代码,一旦修改后期生成的代码很难合并,想想 Mybatis-Generator,基本上就是一次性的东西,虽然减轻了部分工作,可解决方式并非最佳。

开发后台管理系统大部分情况下只想做个普通的增删改查界面,用于数据管理,类似下面这种:

PS: erupt支持定义复杂的页面自定义,详见 erupt-tpl 模块

result result

@Erupt(
       name = "简单的例子",
       power = @Power(importable = true, export = true)
)
@Table(name = "t_simple")   //数据库表名
@Entity
public class Simple extends BaseModel {

    @EruptField(
            views = @View(title = "文本"),
            edit = @Edit(title = "文本", notNull = true, search = @Search)
    )
    private String input;

    @EruptField(
            views = @View(title = "数值", sortable = true),
            edit = @Edit(title = "数值", search = @Search)
    )
    private Float number;

    @EruptField(
            views = @View(title = "布尔"),
            edit = @Edit(title = "布尔", search = @Search)
    )
    private Boolean bool;


    @EruptField(
            views = @View(title = "时间"),
            edit = @Edit(title = "时间", search = @Search(vague = true))
    )
    private Date date;

    @EruptField(
            views = @View(title = "滑动条"),
            edit = @Edit(title = "滑动条", type = EditType.SLIDER, search = @Search,
                    sliderType = @SliderType(max = 90, markPoints = {0, 30, 60, 90}, dots = true))
    )
    private Integer slide;

    @EruptField(
            views = @View(title = "下拉选择"),
            edit = @Edit(
                    search = @Search,
                    title = "下拉选择", type = EditType.CHOICE,
                    choiceType = @ChoiceType(fetchHandler = SqlChoiceFetchHandler.class,
                            fetchHandlerParams = "select id,name from e_upms_menu"
                    )
            )
    )
    private Long choice;

}

功能体验

这个界面虽然用 Vue + Ant Design + SSM 也能做出个大概,但仔细观察会发现它有大量细节功能如:

  • 有按钮可以查询、新增、批量删除、excel 导入导出
  • 可以对数据做筛选、隐藏某列、按某列排序
  • 表格有分页与汇总,可预览单行数据
  • 多种组件、有校验规则

全部实现这些仅前端就需要大量的代码,后端的接口与业务逻辑更不在少数。

但可以看到,用 erupt 只需要 30几行 代码就能完成 !

完全不需要了解 Angular / React / Vue / Jquery

而且不需要了解 JavaScript / HTML / CSS

甚至不需要了解 Spring MVC / Mybatis / SQL

即便没学过 erupt 也能猜到大部分配置的作用,只需要简单配置就能完成所有后台页面开发。

这正是建立 erupt 的初衷,对于大部分常用页面,应该使用最简单的方法来实现,甚至不需要学习各种框架和工具,专注核心业务。

🆚 开发方式横向比对 | VS

传统 Spring Web 开发 代码生成器 Axelor Erupt
领域模型 Java 代码 Java 代码 XML 定义 Annotation 注解定义
DTO Java 代码 代码生成 不需要 不需要
ORM 映射 XML 或 Java 代码 代码生成 代码生成 注解定义
数据访问 接口 + 实现 代码生成 代码生成 内置 + 按需实现
业务逻辑 接口 + 实现 代码生成 + 逻辑调整 内置 + 按需实现 内置 + 按需 @DataProxy 实现
展现层 MVC Java 代码 + 视图模板 代码生成 + 逻辑调整 不需要 不需要
前端 比 Java 代码还多 代码生成 + 逻辑调整 常规应用无需开发 常规应用无需开发

⛰ 演示截图 | Screenshot

移动端展示效果

🔗 下载使用 | Download

下载最新的JAR或通过Maven获取。

<!--用户权限管理-->
<dependency>
  <groupId>xyz.erupt</groupId>
  <artifactId>erupt-upms</artifactId>
  <version>LATEST-VERSION</version>
</dependency>
<!--接口数据安全-->
<dependency>
  <groupId>xyz.erupt</groupId>
  <artifactId>erupt-security</artifactId>
  <version>LATEST-VERSION</version>
</dependency>
<!--后台WEB界面-->
<dependency>
  <groupId>xyz.erupt</groupId>
  <artifactId>erupt-web</artifactId>
  <version>LATEST-VERSION</version>
</dependency>

详细使用步骤

🥏 模块说明 | Module

erupt
├── erupt-annotation -- 核心注解声明
├── erupt-core -- 核心功能实现
├── erupt-data -- 数据实现包
     ├── erupt-jpa -- 关系型数据库erupt实现
     └── erupt-mongodb -- mongodb数据库erupt实现
├── erupt-job -- 定时任务功能,支持动态定时任务,邮件发送,任务日志等功能
├── erupt-upms -- 用户权限管理
├── erupt-security -- 接口数据安全
├── erupt-web -- 编译后的前端页面
├── erupt-tpl -- 支持在 erupt 中自定义页面,自定义图表,自定义弹出层,模板引擎支持:FreeMarker / Thymeleaf / 原生H5 / Velocity 等
├── erupt-tpl-ui -- 在 erupt-tpl 中可使用的 UI 库
    ├── ant-design
    ├── element-ui
    └── amis 
├── erupt-generator -- 代码生成器,通过配置,生成 erupt 代码段
└── erupt-monitor -- 基于erupt实现的服务监控

erupt-pro
├── erupt-dataflow -- 基于erupt实现的数据流(构思中)
├── erupt-workflow -- 基于erupt实现的工作流(构思中)
├── erupt-tenant -- 基于erupt实现的SaaS云多租户(开发中,面向企业用户)
└── erupt-bi -- 通过 sql 加 js 混编实现动态报表,支持:多数据源、自定义函数、图表开发等(面向企业用户)

erupt-site -- Erupt 官方网站 https://github.com/erupts/erupt-site

erupt-web -- Erupt 前端源码 https://github.com/erupts/erupt-web

📟 技术体系 | Technology system

后端: Java 8、 Spring Boot、 ScriptEngine、SpEL、 Annotation、 JDBC、 Reflect、 JPA、 Hibernate、 Quartz、 Gson、 Lombok、 POI ...

前端: JavaScript、 H5、 MVVM、 Router、 Angular CLI、 Angular、 NG-ZORRO、 NG-ALAIN、 G2Plot、 RxJS、 TypeScript、 Less ...

⚙️ 架构图 | Framework

架构图

🌕 在线体验 | Demo

演示地址:https://www.erupt.xyz/demo

账号密码:guest / guest

支持主流 4 款现代浏览器,以及 Internet Explorer 11+,可直接运行在 Electron 等基于 Web 标准的环境上

IE / Edge
Edge / IE
Firefox
Firefox
Chrome
Chrome
Safari
Safari
Opera
Opera
Electron
Electron
Edge 16 / IE 11+ 522 57 11 44 Chromium 57

🔭 开源推荐 | Recommend

zeta-api:通过XML配置快速创建api接口与文档,安全且高效,快速开发必备!
Jpom:简而轻的低侵入式在线构建、自动部署、日常运维、项目监控软件

🧩 加入讨论

QQ交流群:836044286 🔥

微信交流群:由于微信群二维码有效时间仅7日,关注 Erupt 官方公众号(EruptGuide),可获取最新群二维码

⛽️ 捐赠 | Donate

此框架服务器,域名,空间,人工等费用一直由作者本人自掏腰包并持续维护,开源不易,一杯咖啡也是爱 🙏

前往捐赠

⭐️ Erupt 使用 Apache License 2.0 协议,源代码完全开源,无商业限制。 开源不易如果喜欢请给作者 Star 鼓励 👇


Github 仓库   |   码云仓库   |   🦅 官方网站   |   在线体验   |   📕 使用文档


作者 :YuePeng / [email protected]


erupt's People

Contributors

aurthurxlc avatar debugingonprod avatar dependabot[bot] avatar dudiao avatar erupts avatar fawn-deer avatar hlhutu avatar hu-wentao avatar icefairy avatar javamxd avatar lamperwang avatar liuhulu avatar liyujiang-gzu avatar orange-hash avatar shaonianche avatar shareloke avatar snice avatar ssins avatar xiaozehao avatar xujiaji avatar zaster avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

erupt's Issues

源码没有注释

版本情况

JDK版本: openjdk_8_201
erupt版本: 1.10.7 (请确保最新尝试是否还有问题)

问题描述(包括截图)

首先说明一下,作者整个框架的设计思路很厉害,代码写的也比我好多了,有点遗憾的是,核心源码没有注释,这对于想要贡献代码的人来说,是个门槛。

ManyToOne匹配不到数据时,ID会给个0。同时点击查看或编辑按钮,会出NullPointException。

版本情况

JDK版本: openjdk_8_302
erupt版本: 1.8.5 (请确保最新尝试是否还有问题)

问题描述(包括截图)

ManyToOne匹配不到数据时,ID会给个0。同时点击查看或编辑按钮,会出NullPointException。

  1. 复现代码
    @ManyToOne
    @JoinColumn(name="task_id")
    @EruptField(
            views = {@View(title = "拜访照片", column = "img", type = ViewType.IMAGE, show = false ),
                    @View(title = "拜访照片val", column = "img", show = false ),
                    @View(title = "拜访ID", column = "id", show = false )
            }
    )
    private VisitTask visitTask;
  1. 堆栈信息
    java.lang.NullPointerException: null
    at sun.reflect.UnsafeFieldAccessorImpl.ensureObj(UnsafeFieldAccessorImpl.java:57) ~[na:1.8.0_302]
    at sun.reflect.UnsafeObjectFieldAccessorImpl.get(UnsafeObjectFieldAccessorImpl.java:36) ~[na:1.8.0_302]
    at java.lang.reflect.Field.get(Field.java:393) ~[na:1.8.0_302]
    at xyz.erupt.core.util.EruptUtil.generateEruptDataMap(EruptUtil.java:55) ~[erupt-core-1.8.5.jar!/:na]
    at xyz.erupt.core.controller.EruptDataController.getEruptDataById(EruptDataController.java:93) ~[erupt-core-1.8.5.jar!/:na]
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_302]
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_302]
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_302]
    at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_302]
    at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:197) ~[spring-web-5.3.9.jar!/:5.3.9]
    at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:141) ~[spring-web-5.3.9.jar!/:5.3.9]
    at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:106) ~[spring-webmvc-5.3.9.jar!/:5.3.9]
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:895) ~[spring-webmvc-5.3.9.jar!/:5.3.9]
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:808) ~[spring-webmvc-5.3.9.jar!/:5.3.9]
    at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) ~[spring-webmvc-5.3.9.jar!/:5.3.9]
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1064) ~[spring-webmvc-5.3.9.jar!/:5.3.9]
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:963) ~[spring-webmvc-5.3.9.jar!/:5.3.9]
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006) ~[spring-webmvc-5.3.9.jar!/:5.3.9]
    at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:898) ~[spring-webmvc-5.3.9.jar!/:5.3.9]
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:655) ~[tomcat-embed-core-9.0.52.jar!/:na]
    at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883) ~[spring-webmvc-5.3.9.jar!/:5.3.9]
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:764) ~[tomcat-embed-core-9.0.52.jar!/:na]
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:227) ~[tomcat-embed-core-9.0.52.jar!/:na]
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) ~[tomcat-embed-core-9.0.52.jar!/:na]
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) ~[tomcat-embed-websocket-9.0.52.jar!/:na]
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189) ~[tomcat-embed-core-9.0.52.jar!/:na]
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) ~[tomcat-embed-core-9.0.52.jar!/:na]
    at xyz.erupt.security.interceptor.HttpServletRequestFilter.doFilter(HttpServletRequestFilter.java:48) ~[erupt-security-1.8.5.jar!/:na]

  2. 测试涉及到的文件(注意脱密)

C95B90BD9DF63A6596EC3A740BE3CBFB
image

夜间模式导致首页不能正常显示、路由复用失效

版本情况

JDK版本:11.0.9.1
erupt版本:1.6.4

问题描述(包括截图)

  • 开启夜间模式,路由复用被强制关闭

  • 在夜间模式下开启路由复用,夜间模式失效(互相冲突)

  • 夜间模式下首页一片漆黑,无法显示内容,移动端显示正常(若能提供夜间模式下自定义页面 取消反转色选项 更佳)

首页不能正常显示

冲突

移动端首页正常

  1. 复现代码
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta content="width=device-width, initial-scale=1" name="viewport">
</head>
<body>
  <h1>Hello World</h1>
</body>
</html>
  1. 测试涉及到的文件: home.html

使用 @EruptField的search=@Search(vague = true)高级查询,查询数字类型区间无效

版本情况

JDK版本: Oracle JDK1.8.0_162
erupt版本: 1.10.6 (仍有问题)

问题描述(包括截图)

image
前端不提交查询参数

  1. 复现代码
@Erupt(name="采集器任务")
@Entity(name = "user_rules")
@DynamicUpdate	
@DynamicInsert
@Getter
@Setter
public class Test{
  	@EruptField(
	    		views = @View(title = "采集量", sortable = true,type = ViewType.AUTO),
	    		edit = @Edit(title = "采集量", readonly = @Readonly,search=@Search(vague = true),numberType = @NumberType(min=0))
	    		)
    @Column(name = "update_count")
    private Integer updateCount;
}
  1. 堆栈信息
    无异常

bigint类型 查询失败

版本情况

JDK版本: openjdk_8_201
erupt版本: 1.10.6

问题描述(包括截图)

  1. 复现代码
    前端搜索不支持大数(bigint),搜索框填入大数后点击空白处会
    自动转为int型 导致查询失败
    image
    image
    image

实体类文件使用的时Long 型
2. 堆栈信息
3. 无

  1. 测试涉及到的文件(注意脱密)

安全补丁修复

需要尽快升级lib 中的引用,安全风险还是需要解决的。

加了nginx代理,获取不到真实的ip

版本情况

JDK版本: openjdk_8_201
erupt版本: 1.X.X (请确保最新尝试是否还有问题)

问题描述(包括截图)

加了nginx代理,获取不到真实的ip
image

image

  1. 复现代码

  2. 堆栈信息

  3. 测试涉及到的文件(注意脱密)

可参考

public static String getClientIp(@NonNull ServerHttpRequest request) {
		String ip = null;
		HttpHeaders headers = request.getHeaders();
		try {
			ip = headers.getFirst("X-Real-IP");
			if (StringUtils.isEmpty(ip) || "unknown".equalsIgnoreCase(ip)) {
				ip = headers.getFirst("x-forwarded-for");
			}
			if (org.apache.commons.lang.StringUtils.isEmpty(ip) || "unknown".equalsIgnoreCase(ip)) {
				ip = headers.getFirst("Proxy-Client-IP");
			}
			if (StringUtils.isEmpty(ip) || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
				ip = headers.getFirst("WL-Proxy-Client-IP");
			}
			if (org.apache.commons.lang.StringUtils.isEmpty(ip) || "unknown".equalsIgnoreCase(ip)) {
				ip = headers.getFirst("HTTP_CLIENT_IP");
			}
			if (org.apache.commons.lang.StringUtils.isEmpty(ip) || "unknown".equalsIgnoreCase(ip)) {
				ip = headers.getFirst("HTTP_X_FORWARDED_FOR");
			}
			if (org.apache.commons.lang.StringUtils.isEmpty(ip) || "unknown".equalsIgnoreCase(ip)) {
				ip = Objects.requireNonNull(request.getRemoteAddress()).getAddress().getHostAddress();
			}
		} catch (Exception e) {
			log.error("IPUtils ERROR ", e);
		}

		//使用代理,则获取第一个IP地址
		if(!StringUtils.isEmpty(ip) && ip.length() > 15) {
			if(ip.indexOf(",") > 0) {
				ip = ip.substring(0, ip.indexOf(","));
			}
		}

		return ip;
	}

前端header未携带token

版本情况

JDK版本: openjdk_8_201
erupt版本: 1.8.x

问题描述(包括截图)

  • 自定义前端tpl交互时 由于前端请求没有携带token信息导致后台获取不到用户信息。 是否能添加axios拦截统一添加token

java.lang.reflect.InaccessibleObjectException: Unable to make private java.lang.module.Configuration() accessible: module java.base does not "opens java.lang.module"

版本情况

JDK版本: jdk-15.0.2 windows11
erupt版本: 1.10.6 (请确保最新尝试是否还有问题)

问题描述(包括截图)

UI上操作发送电子邮件,发生如下错误

  1. 复现代码

  2. 堆栈信息

WARNING: An illegal reflective access operation has occurred WARNING: Illegal reflective access by com.google.gson.internal.reflect.UnsafeReflectionAccessor (file:/C:/Users/%e9%bb%84%e5%a5%95%e9%b9%8f/.m2/repository/com/google/code/gson/gson/2.8.9/gson-2.8.9.jar) to field java.io.PrintStream.autoFlush WARNING: Please consider reporting this to the maintainers of com.google.gson.internal.reflect.UnsafeReflectionAccessor WARNING: Use --illegal-access=warn to enable warnings of further illegal reflective access operations WARNING: All illegal access operations will be denied in a future release java.lang.reflect.InaccessibleObjectException: Unable to make private java.lang.module.Configuration() accessible: module java.base does not "opens java.lang.module" to unnamed module @45292ec1 at java.base/java.lang.reflect.AccessibleObject.checkCanSetAccessible(AccessibleObject.java:361) at java.base/java.lang.reflect.AccessibleObject.checkCanSetAccessible(AccessibleObject.java:301) at java.base/java.lang.reflect.Constructor.checkCanSetAccessible(Constructor.java:189) at java.base/java.lang.reflect.Constructor.setAccessible(Constructor.java:182) at com.google.gson.internal.reflect.UnsafeReflectionAccessor.makeAccessible(UnsafeReflectionAccessor.java:44) at com.google.gson.internal.ConstructorConstructor.newDefaultConstructor(ConstructorConstructor.java:103) at com.google.gson.internal.ConstructorConstructor.get(ConstructorConstructor.java:85) at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.create(ReflectiveTypeAdapterFactory.java:101) at com.google.gson.Gson.getAdapter(Gson.java:489) at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.createBoundField(ReflectiveTypeAdapterFactory.java:117) at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.getBoundFields(ReflectiveTypeAdapterFactory.java:166) at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.create(ReflectiveTypeAdapterFactory.java:102) at com.google.gson.Gson.getAdapter(Gson.java:489)

  1. 测试涉及到的文件(注意脱密)

优化+建议

版本情况

JDK版本: openjdk_8_201
erupt版本: 1.9.0

问题描述

1、直接通过界面下载按钮下载下来的表格不支持再次导入,会报错。
image
image

如果想通过导出,调整数据,再次导入,却发现表格不支持岂不是很苦恼?
每次都要下载模板,再一一填数据还是比较麻烦的吧。

2、小建议:表格导入的时候能够支持数据依据指定字段覆盖,即更新,未设定则新增。

当然了,有需要的话自己也可以通过dataProxy来对数据进行处理。

java.awt.AWTError: Can't connect to X11 window server using ':0.0' as the value of the DISPLAY variable.

版本情况

Linux系统版本
LSB Version: core-11.1.0ubuntu2-noarch:security-11.1.0ubuntu2-noarch
Distributor ID: Ubuntu
Description: Ubuntu 20.04.5 LTS
Release: 20.04
Codename: focal

JDK版本
openjdk version "17.0.4" 2022-07-19
OpenJDK Runtime Environment GraalVM CE 22.2.0 (build 17.0.4+8-jvmci-22.2-b06)
OpenJDK 64-Bit Server VM GraalVM CE 22.2.0 (build 17.0.4+8-jvmci-22.2-b06, mixed mode, sharing)

erupt版本
:: Spring Boot :: v(2.7.2)
:: Erupt Framework :: v(1.10.13)

问题描述(包括截图)

堆栈信息

2022-09-07 12:26:06.609  INFO 35678 --- [           main] com.bacterial.strain.cms.CmsApplication  : Starting CmsApplication v1.0.0 using Java 17.0.4 on iZ2ze436qim4c2f4o4vsl9Z with PID 35678 (/var/www/strain/cms-1.0.0.jar started by root in /var/www/strain)
2022-09-07 12:26:06.612  INFO 35678 --- [           main] com.bacterial.strain.cms.CmsApplication  : The following 1 profile is active: "dev"
2022-09-07 12:26:09.953  INFO 35678 --- [           main] .s.d.r.c.RepositoryConfigurationDelegate : Multiple Spring Data modules found, entering strict repository configuration mode
2022-09-07 12:26:09.967  INFO 35678 --- [           main] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data JPA repositories in DEFAULT mode.
2022-09-07 12:26:09.995  INFO 35678 --- [           main] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 8 ms. Found 0 JPA repository interfaces.
2022-09-07 12:26:10.074  INFO 35678 --- [           main] .s.d.r.c.RepositoryConfigurationDelegate : Multiple Spring Data modules found, entering strict repository configuration mode
2022-09-07 12:26:10.079  INFO 35678 --- [           main] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data Redis repositories in DEFAULT mode.
2022-09-07 12:26:10.124  INFO 35678 --- [           main] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 1 ms. Found 0 Redis repository interfaces.
2022-09-07 12:26:12.656  INFO 35678 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat initialized with port(s): 8080 (http)
2022-09-07 12:26:12.682  INFO 35678 --- [           main] o.apache.catalina.core.StandardService   : Starting service [Tomcat]
2022-09-07 12:26:12.683  INFO 35678 --- [           main] org.apache.catalina.core.StandardEngine  : Starting Servlet engine: [Apache Tomcat/9.0.65]
2022-09-07 12:26:12.932  INFO 35678 --- [           main] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring embedded WebApplicationContext
2022-09-07 12:26:12.933  INFO 35678 --- [           main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 6095 ms
2022-09-07 12:26:14.392  INFO 35678 --- [           main] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Starting...
2022-09-07 12:26:15.727  INFO 35678 --- [           main] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Start completed.
2022-09-07 12:26:16.136  INFO 35678 --- [           main] o.hibernate.jpa.internal.util.LogHelper  : HHH000204: Processing PersistenceUnitInfo [name: default]
2022-09-07 12:26:16.770  INFO 35678 --- [           main] org.hibernate.Version                    : HHH000412: Hibernate ORM core version 5.6.10.Final
2022-09-07 12:26:17.592  INFO 35678 --- [           main] o.hibernate.annotations.common.Version   : HCANN000001: Hibernate Commons Annotations {5.1.2.Final}
2022-09-07 12:26:18.026  INFO 35678 --- [           main] org.hibernate.dialect.Dialect            : HHH000400: Using dialect: org.hibernate.dialect.MySQL5InnoDBDialect
2022-09-07 12:26:21.746  INFO 35678 --- [           main] o.h.e.t.j.p.i.JtaPlatformInitiator       : HHH000490: Using JtaPlatform implementation: [org.hibernate.engine.transaction.jta.platform.internal.NoJtaPlatform]
2022-09-07 12:26:21.780  INFO 35678 --- [           main] j.LocalContainerEntityManagerFactoryBean : Initialized JPA EntityManagerFactory for persistence unit 'default'
2022-09-07 12:26:23.479  WARN 35678 --- [           main] JpaBaseConfiguration$JpaWebConfiguration : spring.jpa.open-in-view is enabled by default. Therefore, database queries may be performed during view rendering. Explicitly configure spring.jpa.open-in-view to disable this warning
2022-09-07 12:26:24.132  INFO 35678 --- [           main] o.s.b.a.w.s.WelcomePageHandlerMapping    : Adding welcome page: class path resource [public/index.html]
2022-09-07 12:26:25.334  INFO 35678 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port(s): 8080 (http) with context path ''
2022-09-07 12:26:25.385  INFO 35678 --- [           main] com.bacterial.strain.cms.CmsApplication  : Started CmsApplication in 20.89 seconds (JVM running for 25.34)
2022-09-07 12:26:25.674  INFO 35678 --- [           main] xyz.erupt.core.service.EruptCoreService  : <============================================================>
2022-09-07 12:26:25.681  INFO 35678 --- [           main] xyz.erupt.core.service.EruptCoreService  : 🚀 -> erupt-jpa      module initialization completed in 288ms
2022-09-07 12:26:25.686  INFO 35678 --- [           main] xyz.erupt.core.service.EruptCoreService  : 🚀 -> erupt-security module initialization completed in 5ms
2022-09-07 12:26:25.688  INFO 35678 --- [           main] xyz.erupt.core.service.EruptCoreService  : 🚀 -> erupt-upms     module initialization completed in 2ms
2022-09-07 12:26:25.690  INFO 35678 --- [           main] xyz.erupt.core.service.EruptCoreService  : Erupt modules : 3
2022-09-07 12:26:25.690  INFO 35678 --- [           main] xyz.erupt.core.service.EruptCoreService  : Erupt classes : 15
2022-09-07 12:26:25.690  INFO 35678 --- [           main] xyz.erupt.core.service.EruptCoreService  : Erupt Framework initialization completed in 297ms
2022-09-07 12:26:25.691  INFO 35678 --- [           main] xyz.erupt.core.service.EruptCoreService  : <============================================================>
Exception in thread "main" java.lang.reflect.InvocationTargetException
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
        at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.base/java.lang.reflect.Method.invoke(Method.java:568)
        at org.springframework.boot.loader.MainMethodRunner.run(MainMethodRunner.java:49)
        at org.springframework.boot.loader.Launcher.launch(Launcher.java:108)
        at org.springframework.boot.loader.Launcher.launch(Launcher.java:58)
        at org.springframework.boot.loader.JarLauncher.main(JarLauncher.java:65)
Caused by: java.awt.AWTError: Can't connect to X11 window server using ':0.0' as the value of the DISPLAY variable.
        at java.desktop/sun.awt.X11GraphicsEnvironment.initDisplay(Native Method)
        at java.desktop/sun.awt.X11GraphicsEnvironment$1.run(X11GraphicsEnvironment.java:101)
        at java.base/java.security.AccessController.doPrivileged(AccessController.java:318)
        at java.desktop/sun.awt.X11GraphicsEnvironment.<clinit>(X11GraphicsEnvironment.java:60)
        at java.desktop/sun.awt.PlatformGraphicsInfo.createGE(PlatformGraphicsInfo.java:36)
        at java.desktop/java.awt.GraphicsEnvironment$LocalGE.createGE(GraphicsEnvironment.java:93)
        at java.desktop/java.awt.GraphicsEnvironment$LocalGE.<clinit>(GraphicsEnvironment.java:84)
        at java.desktop/java.awt.GraphicsEnvironment.getLocalGraphicsEnvironment(GraphicsEnvironment.java:106)
        at java.desktop/sun.awt.X11.XToolkit.<clinit>(XToolkit.java:224)
        at java.desktop/sun.awt.PlatformGraphicsInfo.createToolkit(PlatformGraphicsInfo.java:40)
        at java.desktop/java.awt.Toolkit.getDefaultToolkit(Toolkit.java:599)
        at java.desktop/java.awt.Desktop.isDesktopSupported(Desktop.java:329)
        at java.desktop/java.awt.Desktop.getDesktop(Desktop.java:303)
        at com.bacterial.strain.cms.CmsApplication.main(CmsApplication.java:23)
        ... 8 more

jdbc-template 与 JPA存在兼容问题

版本情况

JDK版本: openjdk_17_03
erupt版本: 1.10.10

初始化执行时调用了spring boot - jdbc-template
这部分与JPA 对 hibernate的配置定义存在冲突,hibernate 配置了default_schema时,建表语句会自动关联schema,但是
UpmsDataLoadService line:52 开始调用的jdbc 无法正常执行,此处需统一使用jpa执行。

新建用户时报错

版本情况

JDK版本: openjdk_17_03
erupt版本: 1.10.10

问题描述(包括截图)

com.google.gson.JsonIOException: Failed making field 'java.lang.ThreadLocal#threadLocalHashCode' accessible; either change its visibility or write a custom TypeAdapter for its declaring type
at com.google.gson.internal.reflect.ReflectionHelper.makeAccessible(ReflectionHelper.java:22)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.getBoundFields(ReflectiveTypeAdapterFactory.java:158)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.create(ReflectiveTypeAdapterFactory.java:101)
at com.google.gson.Gson.getAdapter(Gson.java:501)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.createBoundField(ReflectiveTypeAdapterFactory.java:116)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.getBoundFields(ReflectiveTypeAdapterFactory.java:165)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.create(ReflectiveTypeAdapterFactory.java:101)
at com.google.gson.Gson.getAdapter(Gson.java:501)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.createBoundField(ReflectiveTypeAdapterFactory.java:116)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.getBoundFields(ReflectiveTypeAdapterFactory.java:165)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.create(ReflectiveTypeAdapterFactory.java:101)
at com.google.gson.Gson.getAdapter(Gson.java:501)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.createBoundField(ReflectiveTypeAdapterFactory.java:116)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.getBoundFields(ReflectiveTypeAdapterFactory.java:165)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.create(ReflectiveTypeAdapterFactory.java:101)
at com.google.gson.Gson.getAdapter(Gson.java:501)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.createBoundField(ReflectiveTypeAdapterFactory.java:116)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.getBoundFields(ReflectiveTypeAdapterFactory.java:165)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.create(ReflectiveTypeAdapterFactory.java:101)
at com.google.gson.Gson.getAdapter(Gson.java:501)
at com.google.gson.internal.bind.CollectionTypeAdapterFactory.create(CollectionTypeAdapterFactory.java:53)
at com.google.gson.Gson.getAdapter(Gson.java:501)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.createBoundField(ReflectiveTypeAdapterFactory.java:116)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.getBoundFields(ReflectiveTypeAdapterFactory.java:165)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.create(ReflectiveTypeAdapterFactory.java:101)
at com.google.gson.Gson.getAdapter(Gson.java:501)
at com.google.gson.Gson.fromJson(Gson.java:990)
at com.google.gson.Gson.fromJson(Gson.java:956)
at com.google.gson.Gson.fromJson(Gson.java:905)
at com.google.gson.Gson.fromJson(Gson.java:876)
at xyz.erupt.core.controller.EruptModifyController.addEruptData(EruptModifyController.java:76)
at xyz.erupt.core.controller.EruptModifyController$$FastClassBySpringCGLIB$$b1819928.invoke()
at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218)
at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:793)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163)
at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:763)
at org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:123)
at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:388)
at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:119)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:763)
at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:708)
at xyz.erupt.core.controller.EruptModifyController$$EnhancerBySpringCGLIB$$2c4a02a1.addEruptData()
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:568)
at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:205)
at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:150)
at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:117)
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:895)
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:808)
at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1067)
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:963)
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006)
at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:909)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:517)
at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:584)
at io.undertow.servlet.handlers.ServletHandler.handleRequest(ServletHandler.java:74)
at io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:129)
at xyz.erupt.security.interceptor.HttpServletRequestFilter.doFilter(HttpServletRequestFilter.java:47)
at io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:61)
at io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)
at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)
at io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:61)
at io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)
at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)
at io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:61)
at io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)
at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)
at io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:61)
at io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)
at io.undertow.servlet.handlers.FilterHandler.handleRequest(FilterHandler.java:84)
at io.undertow.servlet.handlers.security.ServletSecurityRoleHandler.handleRequest(ServletSecurityRoleHandler.java:62)
at io.undertow.servlet.handlers.ServletChain$1.handleRequest(ServletChain.java:68)
at io.undertow.servlet.handlers.ServletDispatchingHandler.handleRequest(ServletDispatchingHandler.java:36)
at io.undertow.servlet.handlers.RedirectDirHandler.handleRequest(RedirectDirHandler.java:68)
at io.undertow.servlet.handlers.security.SSLInformationAssociationHandler.handleRequest(SSLInformationAssociationHandler.java:117)
at io.undertow.servlet.handlers.security.ServletAuthenticationCallHandler.handleRequest(ServletAuthenticationCallHandler.java:57)
at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
at io.undertow.security.handlers.AbstractConfidentialityHandler.handleRequest(AbstractConfidentialityHandler.java:46)
at io.undertow.servlet.handlers.security.ServletConfidentialityConstraintHandler.handleRequest(ServletConfidentialityConstraintHandler.java:64)
at io.undertow.security.handlers.AuthenticationMechanismsHandler.handleRequest(AuthenticationMechanismsHandler.java:60)
at io.undertow.servlet.handlers.security.CachedAuthenticatedSessionHandler.handleRequest(CachedAuthenticatedSessionHandler.java:77)
at io.undertow.security.handlers.AbstractSecurityContextAssociationHandler.handleRequest(AbstractSecurityContextAssociationHandler.java:43)
at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
at io.undertow.servlet.handlers.SendErrorPageHandler.handleRequest(SendErrorPageHandler.java:52)
at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
at io.undertow.servlet.handlers.ServletInitialHandler.handleFirstRequest(ServletInitialHandler.java:275)
at io.undertow.servlet.handlers.ServletInitialHandler.access$100(ServletInitialHandler.java:79)
at io.undertow.servlet.handlers.ServletInitialHandler$2.call(ServletInitialHandler.java:134)
at io.undertow.servlet.handlers.ServletInitialHandler$2.call(ServletInitialHandler.java:131)
at io.undertow.servlet.core.ServletRequestContextThreadSetupAction$1.call(ServletRequestContextThreadSetupAction.java:48)
at io.undertow.servlet.core.ContextClassLoaderSetupAction$1.call(ContextClassLoaderSetupAction.java:43)
at io.undertow.servlet.handlers.ServletInitialHandler.dispatchRequest(ServletInitialHandler.java:255)
at io.undertow.servlet.handlers.ServletInitialHandler.access$000(ServletInitialHandler.java:79)
at io.undertow.servlet.handlers.ServletInitialHandler$1.handleRequest(ServletInitialHandler.java:100)
at io.undertow.server.Connectors.executeRootHandler(Connectors.java:387)
at io.undertow.server.HttpServerExchange$1.run(HttpServerExchange.java:852)
at org.jboss.threads.ContextClassLoaderSavingRunnable.run(ContextClassLoaderSavingRunnable.java:35)
at org.jboss.threads.EnhancedQueueExecutor.safeRun(EnhancedQueueExecutor.java:2019)
at org.jboss.threads.EnhancedQueueExecutor$ThreadBody.doRunTask(EnhancedQueueExecutor.java:1558)
at org.jboss.threads.EnhancedQueueExecutor$ThreadBody.run(EnhancedQueueExecutor.java:1449)
at org.xnio.XnioWorker$WorkerThreadFactory$1$1.run(XnioWorker.java:1282)
at java.base/java.lang.Thread.run(Thread.java:833)
Caused by: java.lang.reflect.InaccessibleObjectException: Unable to make field private final int java.lang.ThreadLocal.threadLocalHashCode accessible: module java.base does not "opens java.lang" to unnamed module @4fcd19b3
at java.base/java.lang.reflect.AccessibleObject.checkCanSetAccessible(AccessibleObject.java:354)
at java.base/java.lang.reflect.AccessibleObject.checkCanSetAccessible(AccessibleObject.java:297)
at java.base/java.lang.reflect.Field.checkCanSetAccessible(Field.java:178)
at java.base/java.lang.reflect.Field.setAccessible(Field.java:172)
at com.google.gson.internal.reflect.ReflectionHelper.makeAccessible(ReflectionHelper.java:19)
... 109 more

image

当创建的菜单的类型值重复存在的问题

版本情况

JDK版本: openjdk_8_201
erupt版本: 1.10.1

问题描述

当创建的菜单的类型值(如:都为type)为重复的时候(我只试了菜单类型为table类型),先创建一个菜单名称为A,再创建另一个菜单名称为B
先点击菜单B可会正常跳转,再点击A则依然保持在B的页面,
然后点击别的类型值不同的菜单,再点击菜单A,则依然是跳转到菜单B
应该是前端使用类型值绑定了吧?
image

image

且在程序中获取当前菜单eruptContextService.getCurrentEruptMenu()时,也只能一直获取菜单B,应该是源码中如下部分导致:使用请求头中的erupt字段存储的类型值获取的时候,类型值相同时,始终为数据库中最后新增的菜单,因为map会覆盖的嘛~

// xyz.erupt.upms.service.EruptUserService#cacheUserInfo
public void cacheUserInfo(EruptUser eruptUser, String token) {
        List<EruptMenu> eruptMenus = this.eruptMenuService.getUserAllMenu(eruptUser);
        Map<String, Object> valueMap = new HashMap();
        Map<String, Object> codeMap = new HashMap();
        Iterator var6 = eruptMenus.iterator();

        while(var6.hasNext()) {
            EruptMenu menu = (EruptMenu)var6.next();
            codeMap.put(menu.getCode(), menu);
            if (null != menu.getValue()) {
                valueMap.put(menu.getValue(), menu);
            }
        }

        this.sessionService.putMap("eruptAuth:menu-value-map:" + token, valueMap, (long)this.eruptUpmsConfig.getExpireTimeByLogin());
        this.sessionService.putMap("eruptAuth:menu-code-map:" + token, codeMap, (long)this.eruptUpmsConfig.getExpireTimeByLogin());
        this.sessionService.put("eruptAuth:menu-view:" + token, this.gson.toJson(this.eruptMenuService.geneMenuListVo(eruptMenus)), (long)this.eruptUpmsConfig.getExpireTimeByLogin());
    }

发现原因

本来是在1.8.3想使用xyz.erupt.annotation.fun.DataProxy#beforeFetch方法获取不同上级菜单(或者根据菜单的自定义参数)获取不同的数据,结果发现获取的菜单(^_^)是相同的,本来以为新版本解决了,看来还是没有的呀

如何配置此场景的列表和编辑界面?

问题描述

提个问题,比如有个标签表,一个商品表,

一个商品可以选择多个标签,

商品列表要显示商品关联的多个标签,这种应该怎么配置呢?

树节点中有html属性的时候Ueditor和CKeditor无法显示内容

版本情况

JDK版本: openjdk 15.0.2
erupt版本: 1.6.7

问题描述(包括截图)

添加菜单类型为树,当树节点中有html属性的时候Ueditor和CKeditor都无法显示内容,textarea正常。

image

  1. 复现代码
@Entity
@Table(name = "demo_tree")
@Erupt(
        name = "树示例",
        orderBy = "TreeView.sort",
        tree = @Tree(id = "id", label = "name", pid = "parent.id"))
public class TreeView extends BaseModel {

    @EruptField(views = @View(title = "名称"), edit = @Edit(title = "名称", notNull = true))
    private String name;

    @EruptField(views = @View(title = "显示顺序"), edit = @Edit(title = "显示顺序"))
    private Integer sort;
    @Lob
    @EruptField(
            views = @View(title = "内容", type = ViewType.HTML, export = false),
            edit =
            @Edit(title = "内容", type = EditType.HTML_EDITOR, htmlEditorType = @HtmlEditorType(HtmlEditorType.Type.CKEDITOR)))
    private String content;
    @ManyToOne
    @EruptField(
            edit =
            @Edit(
                    title = "上级树节点",
                    type = EditType.REFERENCE_TREE,
                    referenceTreeType = @ReferenceTreeType(pid = "parent.id")))
    private TreeView parent;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return "TreeView{" +
                "name='" + name + '\'' +
                ", parent=" + parent +
                '}';
    }

    public Integer getSort() {
        return sort;
    }

    public void setSort(Integer sort) {
        this.sort = sort;
    }

    public String getContent() {
        return content;
    }

    public void setContent(String content) {
        this.content = content;
    }

    public TreeView getParent() {
        return parent;
    }

    public void setParent(TreeView parent) {
        this.parent = parent;
    }
}
  1. 堆栈信息

  2. 测试涉及到的文件(注意脱密)

Date类型需要格式化到毫秒级别

版本情况

JDK版本: openjdk 11.0.12
erupt版本: 1.10.13

问题描述(包括截图)

日期时间只能格式化到秒级,如果需要毫秒级的格式化无效

  1. 复现代码
@EruptField(
            views = @View(title = "时间", type = ViewType.DATE_TIME),
            edit = @Edit(title = "时间"
                    , readonly = @Readonly()
                    , dateType = @DateType(type = DateType.Type.DATE_TIME)
                    , search = @Search(vague = true)
            )
    )
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss.SSS")
    private Date winningTime;

日期格式化需要精确到毫秒级别。
如果是我使用不当,望指正

希望字段新增枚举支持

版本情况

JDK版本: openjdk_15
erupt版本: 1.6.16

单选框选择保存后刷新页面重新选择不会默认选中

  1. 复现代码
    @EruptField(
            views = @View(title = "状态",type = ViewType.TEXT),
            edit = @Edit(title = "状态",type = EditType.CHOICE,
                    choiceType = @ChoiceType(
                            fetchHandler = StateFetchHandler.class
                    )
            )
    )
    @Enumerated(EnumType.STRING)
    private State state;

jdk15新增job报错

版本情况

JDK版本: openjdk_15
erupt版本: 1.6.16

job扩展新增job异常

  1. 复现代码
    image
    image

切换TPL菜单不生效

版本情况

JDK版本: zuul_11.0.14
erupt版本: 1.10.14 (请确保最新尝试是否还有问题)

问题描述(包括截图)

  1. 复现代码
    配置两个菜单,名称和类型值分别为:
  • 测试1 amis.html?code=test1
  • 测试2 amis.html?code=test2

访问菜单时,访问测试1,页面正常,再访问测试2,地址栏有变化,但是页面没有刷新

  1. 堆栈信息

  2. 测试涉及到的文件(注意脱密)

自动新建表单途径

版本情况

JDK版本: openjdk_8_211
erupt版本: 1.10.4 (请确保最新尝试是否还有问题)

问题描述(包括截图)

  1. 要动态新建一个数据表,表名、表头(字段)都是确定的,很想用erupt自动生成数据库的库表,生成对库表进行增删查改操作界面,有没有办法?
  2. 这个问题的另外一个表述就是,在数据库里用代码(SQL)创建一个表,有什么办法把这个表通过erupt映射到可操作界面上

谢谢

tpl页面中如何进行跳转?跳转页面会进行嵌套

版本情况

JDK版本: openjdk_8_201
erupt版本: 1.7.2 (请确保最新尝试是否还有问题)

问题描述(包括截图)

  1. 复现代码
    页面中使用window.location.href无法进行跳转,能否获取上层iframe进行跳转

  2. 堆栈信息

  3. 测试涉及到的文件(注意脱密)

弹出框位置偏上有点丑

版本情况

JDK版本: openjdk_8_201
erupt版本: 1.X.X (请确保最新尝试是否还有问题)

问题描述(包括截图)

image

错误提示对话框存在未执行i18n的情况

版本情况

JDK版本:openjdk version "17.0.3" 2022-04-19 LTS
erupt版本: 1.10.10 (请确保最新尝试是否还有问题)

问题描述(包括截图)

提示信息未延i18n进行正常翻译

image

UEditor 上传图片405

版本情况

JDK版本: openjdk_8_201
erupt版本: 1.11.1 (请确保最新尝试是否还有问题)

问题描述(包括截图)

  1. 复现代码

UEditor 上传图片405

  1. 堆栈信息

  2. 测试涉及到的文件(注意脱密)

优化建议

版本情况

JDK版本: JDK1.8
erupt版本: 1.7.1

问题描述(包括截图)

一对多或多对多中,子表增加横向滚动条
1

表格列控制调整到操作区,减少空间占用,将修改后的结果保存到localStorage,每次打开页面从localStorage加载
2

  1. 堆栈信息

  2. 测试涉及到的文件(注意脱密)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.