创建Spring Boot项目
Maven依赖
Spring Boot版本为 2.7.10,erupt版本为 1.12.14
erupt版本要与Spring Boot版本适配,3.x.x版本Spring Boot暂不适用说是
<properties><erupt.version>1.12.14</erupt.version></properties>
<dependencies><!--tomcat--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-tomcat</artifactId><scope>provided</scope></dependency><!--test测试--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><!--MySql--><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.16</version><scope>runtime</scope></dependency><!--核心管理模块--><dependency><groupId>xyz.erupt</groupId><artifactId>erupt-admin</artifactId><version>${erupt.version}</version></dependency><!--后台WEB界面--><dependency><groupId>xyz.erupt</groupId><artifactId>erupt-web</artifactId><version>${erupt.version}</version></dependency><!-- ****** 以下模块不需要可以去掉 ****** --><!--erupt-cloud 云节点分布式控制模块--><dependency><groupId>xyz.erupt</groupId><artifactId>erupt-cloud-server</artifactId><version>${erupt.version}</version></dependency><!--任务管理模块--><dependency><groupId>xyz.erupt</groupId><artifactId>erupt-job</artifactId><version>${erupt.version}</version></dependency><!--代码生成器模块--><dependency><groupId>xyz.erupt</groupId><artifactId>erupt-generator</artifactId><version>${erupt.version}</version></dependency><!--服务监控模块--><dependency><groupId>xyz.erupt</groupId><artifactId>erupt-monitor</artifactId><version>${erupt.version}</version></dependency><!--在线接口开发--><dependency><groupId>xyz.erupt</groupId><artifactId>erupt-magic-api</artifactId><version>${erupt.version}</version></dependency><!--自定义页面模块--><dependency><groupId>xyz.erupt</groupId><artifactId>erupt-tpl</artifactId><version>${erupt.version}</version></dependency><!--element-ui--><dependency><groupId>xyz.erupt</groupId><artifactId>erupt-tpl-ui.element-ui</artifactId><version>${erupt.version}</version></dependency><!--velocity--><dependency><groupId>org.apache.velocity</groupId><artifactId>velocity-engine-core</artifactId><version>2.3</version></dependency></dependencies>
xxxApplication启动类添加注解
import org.springframework.boot.autoconfigure.domain.EntityScan;
import xyz.erupt.core.annotation.EruptScan;@EruptScan
@EntityScan
main方法中加入下列代码,启动后自动打开指定页面
try {System.setProperty("java.awt.headless", "false");Desktop.getDesktop().browse(new URI("http://localhost:8088"));} catch (Exception ignore) {}
yml参数配置
server:port: 8081# 启用 gzip 压缩compression:mime-types: application/javascript,text/css,application/json,application/xml,text/html,text/xml,text/plainenabled: trueerror:includeException: trueincludeStacktrace: ALWAYSincludeMessage: ALWAYSspring:#当 erupt.redisSession 为 true 时必须配置此项!redis:database: 0timeout: 10000host: 127.0.0.1datasource:url: jdbc:mysql://127.0.0.1:3306/erupt?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghaiusername: rootpassword: ****jpa:show-sql: falsegenerate-ddl: truedatabase-platform: org.hibernate.dialect.MySQL5InnoDBDialectdatabase: mysqlproperties:hibernate:format_sql: falsemail:username: xxxx@qq.compassword: xxxxxxxhost: smtp.qq.comproperties:mail.smtp.ssl.auth: truemail.smtp.ssl.enable: truemail.smtp.ssl.required: trueservlet:multipart:max-file-size: 100MBmax-request-size: 100MBprofiles:active: dev#避免依赖循环引用
# main:
# allow-circular-references: trueerupt-app:# 登录失败几次,需要验证码verifyCodeCount: 2# 是否开启水印,1.12.0 及以上版本支持water-mark: true# 登录失败几次出现验证码,值为0时表示一直需要登录验证码verify-code-count: 2# 登录密码是否加密传输,特殊场景如:LDAP登录可关闭该功能获取密码明文pwd-transfer-encrypt: true# 是否开启密码重置功能,关闭后前端会屏蔽所有重置密码的入口适用于 ldap 等场景,1.12.7 及以上版本支持reset-pwd: true# 多语言配置locales: ["zh-CN", // 简体中文"zh-TW", // 繁体中文"en-US", // English"fr-FR", // En français"ja-JP", // 日本語"ko-KR", // 한국어"ru-RU", // русск"es-ES" // español]# 自定义登录页路径,1.10.6 及以上版本支持,支持http网络路径
# login-page-path: /customer-login.html
erupt:# 是否开启csrf防御csrf-inspect: true# 开启redis方式存储session,默认false,开启后需在配置文件中添加redis配置(同 Spring Boot)redis-session: false# redis session是否自动续期,1.10.8及以上版本支持redis-session-refresh: false# 附件上传存储路径, 默认路径为:/opt/erupt-attachmentupload-path: D:/erupt/annex# 是否保留上传文件原始名称keep-upload-file-name: false# 项目初始化方式,NONE 不执行初始化代码、EVERY 每次启动都进行初始化、FILE 通过标识文件判断是否需要初始化init-method-enum: file# 默认语言,1.12.3 及以上版本支持default-locales: zh-CN# 是否开启任务调度(导入erupt-job时有效)job.enable: true# 是否开启日志采集,开启后可在系统日志中查看实时日志 1.12.14 及以上版本支持log-track: true# 日志采集最大暂存行数 1.12.14 及以上版本支持log-track-cache-size: 1000# 是否记录操作日志,默认true,该功能开启后可在【系统管理 → 操作日志】中查看操作日志security:record-operate-log: trueupms:# 登录 session 时长(redisSession为true时有效)# redisSession 为 false 时控制有效期的方法:server.servlet.session.timeoutexpire-time-by-login: 60# 严格的角色菜单策略,如果非管理员用户拥有“角色管理权限”则仅能编辑已有权限的角色菜单strict-role-menu-legal: falsemagic-api:web: /magic/web# 接口配置文件存放路径resource.location: D:/erupt/magic-scriptshow-url: false
数据库配置
根据所用数据库类型选择MySQL、SQLServer等进行配置
建立一个数据库(erupt),其他名也行,暂时不用建表,项目启动会自动建立多个基础表
首页配置(home.html)
手动创建,位置:/resources/public/home.html
<!DOCTYPE html>
<html lang="en">
<head><title>home</title><meta charset="UTF-8"><meta content="width=device-width, initial-scale=1" name="viewport">
</head>
<style>body {/* 设置背景图片 */background-image: url('login-img-BlackSilk.jpg');/* 背景图片覆盖整个元素 */background-size: cover;/* 背景图片不重复 */background-repeat: no-repeat;/* 背景图片居中显示 */background-position: center;/* 可选:设置背景图片固定,滚动页面时不移动 */background-attachment: fixed;/* 可选:设置边距,根据需要调整 */margin: 0;padding: 0;/* 确保整个页面都有背景图片 */height: 100vh; /* 视口高度 */width: 100vw; /* 视口宽度,但通常不需要设置,因为body默认就是100%宽度 */}
</style>
<body>
</body>
</html>
前端配置(app.js)
手动创建,位置:/resources/public/app.js
window.eruptSiteConfig = {//erupt接口地址,在前后端分离时指定domain: "",//附件地址,一般情况下不需要指定,如果自定义对象存储空间,则需在此指定附件资源访问地址fileDomain: "",//登录页中间标题title: "風華絕代",//登录页中间标题描述desc: "風華絕代-Leslie",//是否展示版权信息copyright: true,//自定义版权内容,1.12.8及以上版本支持,值可以是方法也可以是字符串copyrightTxt: function() {return "風華絕代-Cheung Kowk Wing"},//高德地图 api key,使用地图组件须指定此属性,amapKey获取地址:https://lbs.amap.com (服务平台为:Web端(JS API))amapKey: "xxxx",//高德地图 SecurityJsCodeamapSecurityJsCode: "xxxxx",//登录页logo路径logoPath: "log-Leslie.jpg",//登录后左上角logo旁边的文字logoText: "風華絕代",//注册页地址,会在登录页面增加一个链接 (仅是一个链接,需要自定义实际样式)registerPage: "",//自定义导航栏按钮,配置后将会出现在页面右上角r_tools: [{text: "自定义功能按钮",icon: "fa-eercast",mobileHidden: true,click: function (event) {alert("Function button");}}],//登录成功事件 1.12.3 及以上版本移动至window.eruptEvent中声明login: function(user){},//注销事件 1.12.3 及以上版本移动至window.eruptEvent中声明logout: function(user){}
};//路由回调函数
window.eruptRouterEvent = {//key表示要监听的路由切换地址,为url hash地址最后一段//例如:http://www.erupt.xyz:9999/#/build/table/demo中demo为回调keydemo: {//路由载入事件load: function (e) {},//路由退出事件unload: function (e) {}},//$ 为全路径通配符,在任何路由切换时都会执行load与unload事件$: {load: function (e) {},unload: function (e) {}}
};//erupt生命周期函数
window.eruptEvent = {//页面加载完成后回调startup: function () {},//登录成功login: function(user){},//注销事件logout: function(user){}
}
前端样式(app.css)
手动创建,位置:/resources/public/app.css
/* 例:修改登录页样式 */
layout-passport > .container {background-position: center !important;background-repeat: repeat !important;background-size: cover !important;background-color: #fff !important;background-image: url(login-img-BlackSilk.jpg) !important;/*background-image: url(https://www.erupt.xyz/demo/login-bg.svg) !important;*/
}
启动项目
访问地址:localhost:8081
默认账号:erupt
默认密码:erupt
登录
默认有以下菜单栏
新建菜单
新建下级菜单(表格视图)
新建实体类
实体类对应的表,数据库中如果没有,项目启动时会自动创建
实体类字段名为驼峰命名的字段在表中会转为“_”类型的字段名,例如:
recommendedLevel ==> recommended_level
import xyz.erupt.annotation.Erupt;
import xyz.erupt.annotation.EruptField;
import xyz.erupt.annotation.sub_field.Edit;
import xyz.erupt.annotation.sub_field.EditType;
import xyz.erupt.annotation.sub_field.View;
import xyz.erupt.annotation.sub_field.ViewType;
import xyz.erupt.annotation.sub_field.sub_edit.AttachmentType;
import xyz.erupt.annotation.sub_field.sub_edit.ChoiceType;
import xyz.erupt.annotation.sub_field.sub_edit.VL;
import xyz.erupt.upms.model.base.HyperModel;import javax.persistence.Entity;
import javax.persistence.Table;/*** @Package_Name * @Author * @TIME* @Version*/
@Erupt(name = "風華"
)
@Table(name = "leslie")
@Entity
public class Leslie extends HyperModel {@EruptField(views = {@View(title = "名称")},edit = @Edit(title = "名称", notNull = true))private String name;@EruptField(views = {@View(title = "年龄")},edit = @Edit(title = "年龄", notNull = true))private Integer age;@EruptField(views = {@View(title = "相片", type = ViewType.IMAGE)},edit = @Edit(title = "相片", notNull = true, type = EditType.ATTACHMENT,attachmentType = @AttachmentType(type = AttachmentType.Type.IMAGE)))private String image;@EruptField(views = @View(title = "实力"),edit = @Edit(title = "实力", notNull = true, type = EditType.CHOICE,choiceType = @ChoiceType(vl = {@VL(value = "0", label = "不是man"),@VL(value = "10", label = "失败的man"),@VL(value = "20", label = "成功的man"),@VL(value = "30", label = "嚣张的man")})))private Integer recommendedLevel;
}
注解
@Erupt 类注解
使用方法:添加在类上
排序OrderBy
布局定义 @Layout
权限控制 @Power
控制erupt类能力,包括:新增、修改、删除、导入、导出等
数据过滤 @Filter
树形展示 @Tree
暂时没弄明白
左树右表 @LinkTree
@Erupt(name = "Erupt",linkTree = @LinkTree(field = "tree") //field 的值为类中支持树组件字段
)
public class EruptTest extends BaseModel {@ManyToOne@JoinColumn(name = "parent")//如果 linkTree 配置中 dependNode 值为 true 可以不声明 @EruptField 新增时会自动填充当前选择的树节点@EruptField(views = @View(title = "树节点选择", column = "name"),//title-显示名称,column-实际值,实体类的字段edit = @Edit(title = "树节点选择", type = EditType.REFERENCE_TREE,referenceTreeType = @ReferenceTreeType(pid = "parent.id", expandLevel = 1)))private Tree tree;//另一个实体类,字段名与linkTree注解里的对应}
效果示例
代码:
页面效果
数据钻取 @Drill (无需外键,低耦合一对多)
暂时没整明白
@EruptField 字段注解
@View
@View → type参照
@Edit
@Edit → type参照
逻辑删除
添加注解@Filter、@SQLDelete
import org.hibernate.annotations.SQLDelete;
import xyz.erupt.annotation.sub_erupt.Filter;
@Filter:对数据进行过滤,只显示未删除的
@SQLDelete:覆盖删除语句,改为修改 deleted 字段实现逻辑删除
添加实体类字段
private Date deleteTime;private Boolean deleted = false;
注意事项:
1、项目启动生成的表,没有这两个字段
2、这时候配置逻辑删除后,项目启动后表中自动生成对应字段,但是查询时后报错,需要将表中数据的 deleted 字段值设为 0(0-false,1-true)
3、@Filter注解中过滤字段需为 表名.字段
Leslie Lee 随笔