# easyadmin
**Repository Path**: ApeCoder/easyadmin
## Basic Information
- **Project Name**: easyadmin
- **Description**: 项目基于 Solon 、 Sqltoy、Vue的半前后端分离(前后端分离,但不需要node前端环境直接加载vue模板)的后台管理系统
- **Primary Language**: Unknown
- **License**: MIT
- **Default Branch**: 1.1
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 8
- **Forks**: 1
- **Created**: 2021-12-18
- **Last Updated**: 2025-06-07
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# EasyBoot
## 介绍
EasyBoot是一个追求易学、易用、易扩展的快速开发框架。
## 相关技术
- 后端基础框架 [SpringBoot](https://spring.io/projects/spring-boot)
- ORM框架 [Sqtoy](https://gitee.com/sagacity/sagacity-sqltoy)
- HTTP客户端 [Forest](https://forest.dtflyx.com/)
- 前端框架 [Vue3](https://cn.vuejs.org/)
- 前端UI组件 [HeyUI](https://v2.heyui.top/)
- 前端加载器 [RequireJs](https://requirejs.org/)
- 前端加载器(待选) [es-module-shims](https://github.com/guybedford/es-module-shims)
## 项目说明
[EasyBoot](https://gitee.com/rankeiot/easyboot)内主要是基础的功能和平台。
[EasyPlugins](https://gitee.com/rankeiot/easyplugins)项目里面主要包含一些扩展插件
[EasyStarter](https://gitee.com/rankeiot/easystarter)简单的示例启动项目
### EasyBoot项目结构
- easy-core 核心模块,不带业务逻辑,包含了一些基础功能扩展,如配置项,菜单配置,权限认证等功能
- easy-platform 基础平台模块,包含了用户管理,权限管理,等平台业务功能,带相关界面
- easy-dev 开发工具模块,包括代码生成和一些小工具
- easy-vue vue模板加载模板,包含了vue的主文件。提供了vue文件,mjs文件,less文件的页面端支持
### 系统功能
- 用户管理:提供用户的相关配置,新增用户后,默认密码为123456
- 角色管理:对权限与菜单进行分配,角色可绑定用户和菜单/按钮权限
- 部门管理:可配置系统组织架构,树形表格展示。部门有一个带级连关系的内部ID。
- 字典管理:可维护常用一些固定的数据,如:状态,性别等
- 配置项管理:管理各种常用可变配置
- 用户日志:记录用户操作日志,可自定义日志
- 慢SQL日志:记录运行慢的日志,方便维护和调优,阈值可设置
- 定时任务:方便定时任务,有任务执行记录
- 报表管理:XMReport集成,在线模板设计器,pdf导出
- 代码生成:高灵活度生成前后端代码,减少大量重复的工作任务
- API接口:可以导出api.json和在线调试
## 快速开始
- 导入项目 [EasyStarter](https://gitee.com/rankeiot/easystarter),直接启动按SpringBoot项目启动即可。
- 或者常规新建maven项目,然后修改pom.xml
```xml
4.0.0
easyboot
com.rankeiot.easy
1.1-SNAPSHOT
yourgroupId
youartifactId
1.0-SNAPSHOT
17
17
UTF-8
rankeiot-public-central
central
https://rankeiot-maven.pkg.coding.net/repository/public/central/
true
true
always
rankeiot-public-central
central
https://rankeiot-maven.pkg.coding.net/repository/public/central/
true
true
com.rankeiot.easy
easy-vue
com.rankeiot.easy
easy-dev
runtime
true
org.springframework.boot
spring-boot-devtools
runtime
true
com.rankeiot.easy
easy-platform
org.projectlombok
lombok
compile
true
mysql
mysql-connector-java
org.springframework.boot
spring-boot-maven-plugin
org.projectlombok
lombok
true
```
启动后打开浏览器进入 http://localhost:8080

目前只支持了mysql,当然sqltoy本身是适配了多数据库的。填写完数据库信息后点确定即可进行数据库的初始化。初始化完成后会在项目目录下生成application-dev.yml文件。
可将application-dev.yml移动到src/main/resources目录下面,这样打包后运行不需要重新配置。也可以将application-dev.yml放置与jar包同一目录(工作目录)
初始化完成后不出意外的化,我们会看到下面的界面

进入系统后我们会看到一个非常干净的首页。可通过新建文件 src/main/resources/static/home.vue 来覆盖首页,其他页面也可以通过这种方式覆盖。

到这里基本的系统已经跑起来了。
## 开发指南
建议使用IDEA进行开发,根据Maven的profile配置,IDEA会在项目打开的时候会显示对于的配置选项。EasyBoot开发依赖数据库设计,当设计好数据库后,我们可以从系统中直接导入表模型进行代码生成。

开发的时候,maven默认选择了dev这个profile。在打包的时候应该选择prod,maven会根据参数替换application.yml中的配置,并去掉开发和接口api模块进行打包
### 代码生成
在开发模式下(profile=dev),进入http://localhost:8080,选择代码生成器进入下面菜单。通过导入数据库中以及设计好的数据库表的方式,我们可以导入模型,生成对应代码。数据库表设计时,请添加必要的表注释及字段注释。

### 后端指南
Easy Boot后端采用SpringBoot和sqltoy进行开发
#### 模块划分
Easy Boot按照业务划分包模块,可在模块中配置模块的业务菜单,固定配置项,字典项等
对于需要独立出来的模块,需要进行下面的定义
```java
//可参考com.rankeiot.platform.PlatformModule
@Configuration
public class DemoModule implements Module {
public void start(ApplicationContext context) {
//注册菜单
//regMenu(TestMenu.class);
}
}
//按spring自动组件的要求,新建文件 /sources/META-INF/spring.factories,加入:
//org.springframework.boot.autoconfigure.EnableAutoConfiguration=模块完整类名,如:com.rankeiot.platform.PlatformModule
```
### 业务菜单和权限
Easy Framework使用注解方式来声明权限
```java
import com.rankeiot.core.anno.Menu;
import com.rankeiot.core.anno.Permission;
//这里声明了菜单以及权限
@Menu(value = "测试", icon = "icon-file", id = TestMenu.ID)
public interface TestMenu {
String ID = "Demo";
@Menu(value = "示例", path = "test/demo.vue", icon = "icon-file")
String DEMO = ID + ".demo";
// demo增删改权限
@Permission(value = "新增", parent = DEMO)
String DEMO_ADD = DEMO + ".add";
@Permission(value = "修改", parent = DEMO)
String DEMO_EDIT = DEMO + ".edit";
@Permission(value = "删除", parent = DEMO)
String DEMO_DELETE = DEMO + ".delete";
}
```
```java
/**
*
* 示例 @Auth 表示需要登录,@Auth(string)表示调用该方法需要的权限,也可指定所需角色(role)
* 当传入多个权限或者角色时,表示有当中任意一个条件满足即可调用该方法
* 以下@Api和ApiOperation注解为Swagger注解,使用Swagger注解的Controller才会出现在API文档中
* 除此外,Controller写法与常规SpringBoot Controller相同
* */
@Api(tags="学生")
@Auth
@RestController
@RequestMapping("demo")
@RequiredArgsConstructor
public class DemoController {
final SqlToyLazyDao dao;
/**
* 新增学生
*/
@ApiOperation("新增学生")
@Auth(StuMenu.STUDENT_ADD)
@PostMapping("add")
public Resp add(@Valid @RequestBody Student student){
dao.save(student);
return Resp.ok();
}
/**
* 删除学生
*/
@ApiOperation("删除学生")
@Auth(StuMenu.STUDENT_DELETE)
@Transactional
@PostMapping("delete")
public Resp delete(List ids){
// dao.loadAll(students);
List students = CollectionUtil.map(ids,Student::new);
dao.deleteAll(students);
return Resp.ok();
}
/**
* 更新学生
*/
@ApiOperation("更新学生")
@Auth(StuMenu.STUDENT_EDIT)
@PostMapping("save")
public Resp save(@Valid @RequestBody Student student){
dao.update(student);
return Resp.ok();
}
/**
* 获取学生
*/
@ApiOperation("获取学生详细")
@Auth(StuMenu.STUDENT)
@GetMapping("detail")
public Resp detail(Integer id){
Student student=dao.load(new Student(id));
return Resp.of(student);
}
/**
* 获取学生列表
*/
@ApiOperation("列出学生")
@Auth(StuMenu.STUDENT)
@PostMapping("list")
public Resp