签入版本
This commit is contained in:
@@ -1,222 +1,81 @@
|
||||
# 1.2 为什么选择我们
|
||||
# 1.2 核心特性
|
||||
|
||||
## 声明式 CRUD,开发效率倍增
|
||||
:::tip 概述
|
||||
本页展开介绍 EasyGoAdmin 的核心设计与能力清单。每项特性在后续章节都有对应的深入讲解,此处只需建立整体印象。
|
||||
:::
|
||||
|
||||
项目最大的特点是声明式 CRUD 架构。只需在数据库中建好表,通过代码生成器即可一键生成完整的前后端 CRUD 模块:
|
||||
## 反射元数据驱动
|
||||
|
||||
```bash
|
||||
# 通过 Web 界面操作,选择表 → 配置 → 生成
|
||||
# 或通过命令行
|
||||
php think generate:code think_example
|
||||
路由与元数据一处声明——**`RouteSpec` 表即路由定义**。在 `registerControllers` 内按控制器集中声明:
|
||||
|
||||
```go
|
||||
// internal/router/router.go
|
||||
Bind(rg, new(handler.CDept), map[string]RouteSpec{
|
||||
"Page": {Method: "GET", Path: "/api/dept/page", Summary: "部门分页", Permission: "sys:dept:page", Log: "部门管理-查询分页记录", LogType: "query"},
|
||||
})
|
||||
```
|
||||
|
||||
生成器会自动完成:
|
||||
`router.Bind` 反射扫描控制器方法(签名固定为 `func (c *CXxx) Method(ctx context.Context, req *dto.XxxReq) (*dto.XxxRes, error)`),按方法名查表注册 Gin 路由并写入路由元数据表。authz 权限校验、operation_log 日志记录、公开接口白名单三处与注册同源,杜绝漏配与漂移。
|
||||
|
||||
- **后端代码**:Model、Validate、Logic、Controller 全套文件
|
||||
- **前端页面**:列表页、编辑弹窗、详情弹窗
|
||||
- **API 接口**:前端 TypeScript API 模块
|
||||
- **菜单权限**:自动插入菜单记录和权限节点
|
||||
- **路由注册**:自动将新模块接入主路由
|
||||
→ 详见 [4.4 反射元数据驱动机制](/zh/architecture/bind-mechanism.html)
|
||||
|
||||
一个标准 CRUD 模块从手写到调试通常需要 1-2 天,使用生成器只需几分钟。
|
||||
## 声明式 CRUD 基座
|
||||
|
||||
## 完整的 RBAC 权限体系
|
||||
标准五方法(Page/List/Detail/Add/Update/Delete/BatchDelete)通过声明 `ModuleSpec[Item, LItem, DRes]` 委托基座:
|
||||
|
||||
系统内置了企业级的基于角色的访问控制:
|
||||
- 查询能力(LikeFields/EqFields/KeywordFields/Filter/DataScope)按固定顺序生效
|
||||
- 生命周期钩子(Before/After Add/Update/Delete、AfterPageList 等)承接业务差异
|
||||
- 输出映射(SerializeMaps 字典翻译、FileFields 补域名、IsTree 树形)声明即生效
|
||||
- 写不进钩子的复杂逻辑(导入导出、登录、分配菜单)手写方法,合法逃生舱
|
||||
|
||||
- **用户管理**:用户增删改查、重置密码、角色分配
|
||||
- **角色管理**:角色增删改查、菜单权限分配
|
||||
- **菜单管理**:菜单树形结构、权限节点定义
|
||||
- **部门管理**:组织架构树形管理
|
||||
- **权限粒度**:精确到每个操作(`sys:user:add`、`sys:user:delete` 等)
|
||||
- **超级管理员**:用户 ID=1 自动拥有所有权限,无需额外配置
|
||||
|
||||
前端通过 `v-perm` 指令自动控制按钮的显示和隐藏,与后端权限保持一致。
|
||||
|
||||
## 声明式 ThinkPHP 架构
|
||||
|
||||
项目遵循 ThinkPHP 最佳实践,代码结构清晰。以 `app/logic/ExampleLogic.php` 为例:
|
||||
|
||||
```php
|
||||
// 逻辑层只需声明属性配置,无需编写 CRUD 代码
|
||||
class ExampleLogic extends BaseLogic
|
||||
{
|
||||
/**
|
||||
* 关联的模型类
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected string $modelClass = Example::class;
|
||||
|
||||
/**
|
||||
* LIKE 模糊匹配字段
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
protected array $pageLikeFields = ['name'];
|
||||
|
||||
/**
|
||||
* 精确匹配字段
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
protected array $pageEqFields = ['status'];
|
||||
|
||||
/**
|
||||
* 默认排序规则
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
protected array $pageOrderBy = ['field' => 'sort', 'type' => 'asc'];
|
||||
|
||||
/**
|
||||
* 唯一性校验字段
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
protected array $uniqueFields = ['name'];
|
||||
|
||||
/**
|
||||
* 枚举显示名映射
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
protected array $serializeMaps = ['status' => 'example_status'];
|
||||
|
||||
/**
|
||||
* 删除前处理:业务约束校验
|
||||
*
|
||||
* @param int $id 记录 ID
|
||||
* @return void
|
||||
*/
|
||||
protected function beforeDelete(int $id): void
|
||||
{
|
||||
// 删除前校验
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
控制器只需调用通用方法:
|
||||
|
||||
```php
|
||||
class ExampleController extends BaseController
|
||||
{
|
||||
protected ExampleLogic $logic;
|
||||
|
||||
protected function initialize(): void
|
||||
{
|
||||
$this->logic = new ExampleLogic();
|
||||
}
|
||||
|
||||
#[Log('案例演示-查询分页', Log::TYPE_QUERY)]
|
||||
#[Permission('sys:example:page', '案例分页')]
|
||||
public function page(): Json
|
||||
{
|
||||
return parent::_index($this->logic); // 一行搞定分页查询
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
所有模块遵循相同的分层模式,新成员上手快,代码可维护性强。
|
||||
|
||||
## 丰富的内置模块
|
||||
|
||||
系统预置了 20+ 个常用业务模块,开箱即用:
|
||||
|
||||
- **系统管理**:用户、角色、菜单、部门、职级、岗位、租户
|
||||
- **系统配置**:字典管理、系统配置、参数管理
|
||||
- **内容管理**:文章管理、分类管理、公告管理、友情链接
|
||||
- **系统监控**:登录日志、操作日志、定时任务
|
||||
- **开发工具**:代码生成器、文件上传、示例模块
|
||||
|
||||
这些模块不仅可以直接使用,也是学习本框架开发模式的最佳参考。
|
||||
|
||||
## Vue3 + ElementPlus 前端
|
||||
|
||||
前端采用主流技术栈,开发体验优秀:
|
||||
|
||||
- **Vue3 Composition API**:更灵活的组件逻辑组织
|
||||
- **TypeScript**:类型安全,减少运行时错误
|
||||
- **ElementPlus**:成熟的企业级 UI 组件库
|
||||
- **Pinia**:轻量级状态管理
|
||||
- **Vite**:极速的开发服务器和构建工具
|
||||
- **动态路由**:菜单和路由由后端驱动,前端无需硬编码
|
||||
|
||||
前端开发常用命令:
|
||||
|
||||
```bash
|
||||
cd ui
|
||||
pnpm install # 安装依赖
|
||||
pnpm dev # 启动开发服务器 (http://localhost:8001)
|
||||
pnpm build # 生产环境构建
|
||||
```
|
||||
|
||||
## 开箱即用的开发体验
|
||||
|
||||
从获取源码到运行项目,只需几步:
|
||||
|
||||
```bash
|
||||
# 1. 从官方网站下载源码包并解压
|
||||
cd RXThinkCMF_ThinkPhp8_EleVue
|
||||
|
||||
# 2. 安装依赖
|
||||
composer install
|
||||
|
||||
# 3. 配置 .env(数据库、JWT 密钥)
|
||||
|
||||
# 4. 导入数据库
|
||||
mysql -u root -proot rxthinkcmf.thinkphp8.elevue < document/mysql/rxthinkcmf.thinkphp8.elevue.sql
|
||||
|
||||
# 5. 启动后端
|
||||
php think run
|
||||
|
||||
# 6. 启动前端
|
||||
cd ui && pnpm install && pnpm dev
|
||||
```
|
||||
|
||||
访问 `http://localhost:8001` 即可使用。默认超级管理员账号 `admin / 123456` 可直接登录。
|
||||
→ 详见 [附录 G ModuleSpec 声明速查](/zh/appendix/module-spec.html)
|
||||
|
||||
## 多数据库支持
|
||||
|
||||
通过环境变量一键切换五种数据库:
|
||||
支持 MySQL、PostgreSQL、SQL Server、SQLite、Oracle 五种方言,`config.yaml` 一处切换。配套 `cmd/migrator` 跨库整库迁移工具(源库内省 → 目标方言 DDL → 分批搬运 → 序列修复)。
|
||||
|
||||
```ini
|
||||
; .env
|
||||
[DATABASE]
|
||||
TYPE = mysql ; MySQL(默认)
|
||||
TYPE = pgsql ; PostgreSQL
|
||||
TYPE = sqlsrv ; SQL Server
|
||||
TYPE = oracle ; Oracle
|
||||
TYPE = sqlite ; SQLite
|
||||
```
|
||||
## 代码生成器
|
||||
|
||||
业务代码零修改,ORM 自动处理 SQL 差异。
|
||||
内省表结构 → 按模板渲染后端四件套与前端页面 → 幂等创建菜单行 → 自动向 `router.go` 追加 Bind 路由声明块。CLI(`make gen`)与 Web 界面双入口,覆盖策略由配置控制。
|
||||
|
||||
→ 详见 [第 10 章 代码生成器](/zh/generator/overview.html)
|
||||
|
||||
## 多租户与数据权限
|
||||
|
||||
内置企业级多租户隔离体系:
|
||||
- `tenant` 中间件解析租户上下文,`Ctx(ctx)` 入口对白名单表自动注入租户隔离 Scope
|
||||
- 全局 Create 钩子自动补齐 `tenant_id` 审计字段
|
||||
- 数据权限经声明 `DataScope: ApplyDataScope("dept_id")` 按部门维度收敛可见范围
|
||||
|
||||
- **租户隔离**:通过 `BaseTenantLogic` 基类自动处理 `tenant_id` 过滤与填充
|
||||
- **数据权限**:支持全部数据 / 本部门数据 / 仅本人数据三种范围
|
||||
- **超级管理员**:`tenant_id=0` 的用户不受租户隔离限制,创建数据时自动代入默认租户
|
||||
## RBAC 权限体系
|
||||
|
||||
## 持续更新
|
||||
用户-角色-菜单三级模型,关联表 user_role / role_menu。权限码形如 `sys:dept:page`,在 RouteSpec 声明后由 authz 中间件统一校验,前端配合 `v-permission` 指令控制按钮可见性。
|
||||
|
||||
项目持续迭代,紧跟技术发展:
|
||||
## 日志与审计
|
||||
|
||||
- ThinkPHP 版本持续升级至 6.1.x
|
||||
- PHP 版本要求 8.2+
|
||||
- 前端从 Vue 2 升级到 Vue3 + ElementPlus
|
||||
- 代码生成器功能不断增强
|
||||
- 安全机制持续完善
|
||||
- 操作日志:RouteSpec 携带 `Log`/`LogType`,operation_log 中间件自动记录请求与响应摘要
|
||||
- 登录日志:登录动作独立留痕
|
||||
- 全链路 trace:trace 中间件为每个请求分配追踪标识,日志输出可关联
|
||||
|
||||
## 适用场景
|
||||
## 定时任务调度
|
||||
|
||||
项目适合以下场景:
|
||||
内置基于 cron 表达式的轻量调度器,任务包经 blank import 触发 init 自注册,调度器由 `service.DaemonInit` 启动。配套任务管理界面与执行日志。
|
||||
|
||||
- 企业内部管理系统(ERP、CRM、OA 等)
|
||||
- 内容管理系统(CMS)
|
||||
- 数据管理后台
|
||||
- SaaS 多租户平台
|
||||
- 快速原型开发
|
||||
- 学习 ThinkPHP + Vue 全栈开发
|
||||
## 文件处理体系
|
||||
|
||||
- 上传先进 `temp/`,保存时经 saveTransform 转正到模块 `FileSaveDir`
|
||||
- 富文本正文统一存 `[IMG_URL]/{相对路径}` 占位符,读侧唯一还原出口是 `ExpandContentFields`
|
||||
- Excel 导入导出基于 excelize 封装,前端配套导入导出组件
|
||||
|
||||
## 监控中心
|
||||
|
||||
服务监控(CPU/内存/磁盘/goroutine,分平台实现)、缓存监控(Redis 信息与键空间)、在线用户(JWT 会话管理),前端图表化呈现。
|
||||
|
||||
## 工程质量
|
||||
|
||||
| 能力 | 说明 |
|
||||
|---|---|
|
||||
| fail-fast 启动 | `config.Validate` 校验 JWT 密钥与 DSN,不合法直接拒绝启动 |
|
||||
| 优雅关闭 | 停 HTTP → 停定时任务 → 关 DB → 关 Redis |
|
||||
| 软删除铁律 | 一切删除走 `del_flag=1`,物理删除被全局钩子拦截 |
|
||||
| 质量门禁 | `make check` = fmt-check + vet + test-short + check-config |
|
||||
| WireCheck | 中间件依赖的服务能力未注册时启动告警降级 |
|
||||
|
||||
Reference in New Issue
Block a user