# gin-vue-web
**Repository Path**: zzhuang94/gin-vue-web
## Basic Information
- **Project Name**: gin-vue-web
- **Description**: 一个基于 Go 和 Vue 的企业级全栈 Web 开发框架,专为快速构建现代化管理平台而生。采用前后端分离架构,通过约定优于配置的设计理念,将传统 CRUD 开发效率提升 10 倍以上
- **Primary Language**: Unknown
- **License**: Not specified
- **Default Branch**: main
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 1
- **Forks**: 1
- **Created**: 2025-11-20
- **Last Updated**: 2025-12-09
## Categories & Tags
**Categories**: Uncategorized
**Tags**: Gin, Vue, vite, MySQL, MVC
## README
# gin-vue-web
[English](README_EN.md) | [中文](README.md)
一个基于 **Gin + Vue 3 + Ant Design Vue + Vite** 的 `极简 MVC Web框架`,专注于快速构建管理平台。
> 🚀 **零基础也能起飞!** 只需掌握一点点 Go 语法(会写 `struct` 就够了)、一点点前端基础(知道 `html` `css` `js` 就够用),再加上对 `MySQL` 的基本理解,就能开始全栈开发之旅!
>
> 🎓 **甚至不需要 Vue 基础?** 这个项目就是你的最佳练手场!边做边学,在实战中掌握 Vue 3,框架已帮你封装好复杂逻辑,你只需关注业务本身!
>
> ⚙️ **配置?不存在的!** 繁杂的前端编译、打包、统统帮你搞定!系统已内置 Ant Design Vue、ECharts、Font Awesome 图标等常用组件,开箱即用!你只需集中精力到核心开发,告别那些烦人的配置文件!
>
> 💪 **三步搞定 CRUD!** 开发?三步搞定!部署?一条命令启动!从零到上线,比写 Hello World 还快!
>
> ⚡ **5 分钟搭建,10 分钟跑通,30 分钟完成第一个模块!** 这不是画饼,这是真实的上手体验!🎯
>
> 🌟 **拥抱开源,技术栈全明星阵容!** 后端 Gin(Go 界最火的 Web 框架)、前端 Vue 3(渐进式框架的标杆)、构建工具 Vite(快如闪电的构建体验)——全部采用最流行、最成熟的开源技术!这意味着你可以随心所欲地添加任何你需要的功能:想接入 ChatGPT?没问题!想集成支付系统(微信/支付宝)?轻松搞定!想加个实时聊天?WebSocket 走起!想做个数据大屏?ECharts 已内置!想接入第三方登录?OAuth 2.0 安排上!开源生态就是你的武器库,想怎么玩就怎么玩!🚀
---
## 先睹为快
> 😎 先看效果、再看原理——直接感受 gin-vue-web 带来的“所见即所得”!
### 功能演示视频
### 功能截图展示
列表页 · 搜索/排序/分页
|
新增弹窗
|
编辑弹窗
|
关联管理弹窗
|
改动日志
|
导航树
|
路由列表
|
角色管理
|
角色授权
|
个人中心
|
公共组件库
|
Echarts用例
|
图标库
|
---
## 📋 目录
- [一、项目介绍](#一项目介绍)
- [1.1 极简 MVC 架构](#11-极简-mvc-架构)
- [1.2 智能路由自动注册](#12-智能路由自动注册)
- [1.3 通用 CRUD 框架](#13-通用-crud-框架)
- [1.4 规则驱动开发(Rule-Driven Development)](#14-规则驱动开发rule-driven-development)
- [1.5 内置企业级基础功能](#15-内置企业级基础功能)
- [二、快速开始](#二快速开始)
- [2.1 环境准备](#21-环境准备)
- [2.2 开发模式](#22-开发模式)
- [2.3 生产环境部署指南](#23-生产环境部署指南)
- [三、如何阅读代码](#三如何阅读代码)
- [3.1 项目结构概览](#31-项目结构概览)
- [3.2 后端代码结构](#32-后端代码结构)
- [3.3 前端代码结构](#33-前端代码结构)
- [3.4 代码阅读建议](#34-代码阅读建议)
- [四、核心设计思想](#四核心设计思想)
- [4.1 X 结构体 - 框架的核心](#41-x-结构体---框架的核心)
- [4.2 XB 结构体 - 批量操作的扩展](#42-xb-结构体---批量操作的扩展)
- [4.3 Rule 规则配置 - 配置驱动的力量](#43-rule-规则配置---配置驱动的力量)
- [4.4 路由自动注册 - 零配置的魔法](#44-路由自动注册---零配置的魔法)
- [4.5 数据流转过程 - 理解整个系统](#45-数据流转过程---理解整个系统)
- [五、调试方法](#五调试方法)
- [5.1 从浏览器请求定位后端代码](#51-从浏览器请求定位后端代码)
- [5.2 从页面元素定位 Vue 组件](#52-从页面元素定位-vue-组件)
- [5.3 常见调试场景](#53-常见调试场景)
- [六、开发教程](#六开发教程)
- [6.1 增加一个普通页面](#61-增加一个普通页面)
- [6.2 增加一套 CRUD 功能](#62-增加一套-crud-功能)
- [6.3 自定义功能扩展](#63-自定义功能扩展)
- [七、常见问题](#七常见问题)
- [八、许可证](#八许可证)
---
## 一、项目介绍
gin-vue-web 是一个**企业级全栈 Web 开发框架**,专为快速构建现代化管理平台而生。采用前后端分离架构,基于 Go 和 Vue 3 生态,通过**约定优于配置**的设计理念,将传统 CRUD 开发效率提升 10 倍以上。
### 1.1 极简 MVC 架构
框架采用经典的 **MVC(Model-View-Controller)架构模式**,通过智能约定和自动装配,将传统开发中的样板代码减少 80% 以上。开发者只需关注业务逻辑,框架自动处理路由、数据绑定、表单验证等繁琐工作。
**核心优势:**
- **零配置启动**:无需编写配置文件,开箱即用
- **约定优于配置**:遵循最佳实践,减少决策成本
- **高度可扩展**:支持自定义中间件、拦截器、扩展点
- **性能卓越**:基于 Gin 高性能框架,轻松应对高并发场景
### 1.2 智能路由自动注册
框架通过 **Go 反射机制**自动扫描 Controller 中的 `Action*` 方法,实现路由的零配置自动注册。告别手动维护路由表的时代,只需定义方法,路由自动生成并注册。
**技术亮点:**
- **反射扫描**:自动识别 `ActionIndex`、`ActionEdit`、`ActionSave` 等方法
- **RESTful 风格**:自动生成符合 RESTful 规范的路由
- **类型安全**:编译期检查,避免运行时错误
- **自动文档**:支持自动生成 API 文档
### 1.3 通用 CRUD 框架
框架围绕**三个核心文件**构建了一套完整的通用 CRUD 解决方案,实现了从数据模型到前端页面的全自动生成。
**核心文件架构:**
| 文件 | 职责 | 技术栈 |
|------|------|--------|
| `backend/g/x.go` | CRUD 核心逻辑引擎 | Go + XORM |
| `frontend/src/templates/index.vue` | 通用列表页模板 | Vue 3 + Ant Design Vue |
| `backend/g/rule.go` | 字段规则配置引擎 | JSON 配置驱动 |
**功能矩阵:**
| 功能模块 | 支持特性 | 说明 |
|---------|---------|------|
| **列表页** | 搜索、排序、分页、筛选 | 支持多字段组合查询 |
| **数据操作** | 新增、编辑、删除 | 单条和批量操作 |
| **数据验证** | 前端 + 后端双重验证 | 类型检查、必填验证、格式验证 |
| **权限控制** | 基于角色的访问控制 | 细粒度权限管理 |
### 1.4 规则驱动开发(Rule-Driven Development)
通过 `rule.json` 配置文件,采用**声明式编程**方式定义字段规则,实现真正的配置驱动开发。一次配置,全栈生效。
**规则配置能力:**
- **显示规则**:字段标签、显示顺序、是否可见、格式化方式
- **验证规则**:必填验证、类型验证、长度限制、正则表达式
- **搜索规则**:精确匹配、模糊搜索、范围查询、IN 查询、关联查询
- **交互规则**:下拉选项、级联选择、日期范围、文件上传
**优势:**
- **零代码配置**:无需编写验证逻辑
- **前后端同步**:一次配置,前后端自动同步
- **业务聚焦**:专注业务逻辑,而非技术细节
- **快速迭代**:修改配置即可调整功能
### 1.5 内置企业级基础功能
框架内置了**开箱即用**的企业级基础功能模块,覆盖了 90% 的管理系统通用需求,让你从第一天就开始构建业务功能。
**功能清单:**
| 功能模块 | 技术实现 | 特性说明 |
|---------|---------|---------|
| **用户认证** | Session | 支持登录、注册、账号切换 |
| **权限管理** | RBAC + 路由守卫 | 基于角色和路由的细粒度权限控制 |
| **菜单管理** | 动态菜单树 | 支持多级菜单、图标、权限绑定 |
| **会话管理** | Redis 分布式会话 | 支持集群部署、会话共享 |
| **操作日志** | 自动记录 + 回滚 | 自动记录数据变更,支持查看详情和回滚操作 |
| **组件库** | Ant Design Vue | 60+ 高质量组件,开箱即用 |
| **图表库** | ECharts | 20+ 图表类型,支持数据可视化 |
| **图标库** | Font Awesome | 1000+ 图标,满足各种场景需求 |
**操作日志功能详解:**
框架内置了强大的**操作日志(op-log)**功能,能够自动记录所有数据变更操作,并提供完整的审计和回滚能力。
**核心特性:**
- **自动记录**:根据 `op.json` 配置,自动记录 core 数据库中所有配置表的数据变更
- **事件聚合**:同一请求中的多条数据变更自动聚合为一个操作事件
- **详细记录**:记录操作类型(新增/更新/删除)、数据表、数据ID、变更前后数据
- **差异对比**:智能计算并展示字段级别的变更差异,支持字段翻译和格式化显示
- **一键回滚**:支持将数据回滚到变更前的状态,自动处理依赖关系检查
- **审计追踪**:记录操作用户、操作路径、操作时间等完整审计信息
**工作原理:**
1. 在 `op.json` 中配置需要记录的表(仅限 core 数据库)
2. 框架在数据保存/删除时自动检测并记录变更
3. 同一请求中的多条变更通过 UUID 关联,聚合为一个操作事件
4. 操作事件存储在 `base` 数据库的 `op_event` 表
5. 具体变更详情存储在 `base` 数据库的 `op_log` 表
**依赖关系检查机制:**
框架在回滚操作前会自动检查数据依赖关系,确保数据一致性。这是操作日志功能的核心设计,防止因回滚导致的数据不一致问题。
**为什么需要依赖检查?**
数据库的改动必须遵循主键-外键依赖关系,否则会导致数据不一致。例如:如果 `b.a_id = a.id`(表 b 的外键引用表 a 的主键),那么在删除数据 a 之前,必须先删除数据 b,否则数据 b 将无法映射到有效的主键,造成数据不一致。
**三种依赖关系类型:**
1. **同一条数据的连续改动依赖**
- **场景**:同一条数据经历了多次连续改动,如 `a -> b -> c`
- **规则**:如果回滚 `a -> b`,则必须同时回滚 `b -> c`,因为操作 2 依赖于操作 1 的结果
- **示例**:用户先修改了订单状态为"已支付",后又修改为"已发货"。回滚"已支付"状态时,必须同时回滚"已发货"状态
2. **主键依赖(新增数据被引用)**
- **场景**:操作 1 新增了数据 a,操作 2 改动(或新增)数据 b,改动后 `b.a_id = a.id`
- **规则**:如果回滚操作 1(删除新增的 a),则必须同时回滚操作 2,因为操作 2 依赖于操作 1 创建的主键
- **示例**:先创建了分类 A(id=100),后创建了文章 B 并设置 `category_id=100`。回滚创建分类 A 时,必须同时回滚创建文章 B
3. **外键依赖(删除被引用的数据)**
- **场景**:操作 1 改动(或删除)数据 b,改动前 `b.a_id = a.id`;操作 2 删除了数据 a
- **规则**:如果回滚操作 1,则必须同时回滚操作 2,否则 `b.a_id` 将无法映射到有效的主键
- **示例**:先修改了订单的客户ID为 200,后删除了客户 200。回滚修改订单时,必须同时回滚删除客户,否则订单的客户ID将指向不存在的记录
**配置方式:**
在 `op.json` 中通过 `primary` 字段配置主键-外键关系:
```json
{
"table_a": {
"name": "表A",
"db": "core",
"show": ["field1", "field2"],
"primary": {
"id": {
"table_b": "a_id",
"table_c": "a_id"
}
}
}
}
```
配置说明:
- `primary`:定义主键被哪些表的外键引用
- `"id"`:主键字段名
- `"table_b": "a_id"`:表 table_b 的外键字段 `a_id` 引用了表 table_a 的主键 `id`
**检查流程:**
1. 用户选择要回滚的操作事件
2. 框架调用 `CheckRely()` 递归检查所有依赖关系
3. 如果发现依赖,自动收集所有需要一起回滚的操作事件
4. 前端展示完整的回滚列表,用户确认后统一回滚
5. 所有回滚操作在同一事务中执行,保证原子性
**设计优势:**
- **自动化**:无需手动分析依赖关系,框架自动检测
- **安全性**:防止因回滚导致的数据不一致问题
- **完整性**:递归检查,确保所有相关操作都被正确处理
- **透明性**:清晰展示需要回滚的所有操作,用户可确认后再执行
**使用场景:**
- 数据审计:追踪谁在什么时候修改了什么数据
- 错误恢复:快速回滚误操作,恢复数据到之前的状态
- 合规要求:满足企业级数据变更审计和合规要求
- 问题排查:通过操作历史快速定位问题原因
**扩展能力:**
- **插件机制**:支持自定义插件扩展
- **主题定制**:支持主题切换和自定义样式
- **国际化**:内置 i18n 支持,轻松实现多语言
- **响应式设计**:完美适配 PC、平板、移动端
---
## 二、快速开始
### 2.1 环境准备
#### 2.1.1 开发环境准备
**Go 安装:**
- 下载地址:https://golang.org/dl/ 或 https://golang.google.cn/dl/
- 推荐版本:Go 1.25.0 及以上
- 安装后验证:`go version`
**Node.js 安装:**
- 下载地址:https://nodejs.org/
- 推荐版本:Node.js v24.9.0 及以上(包含 npm)
- 安装后验证:`node -v` 和 `npm -v`
#### 2.1.2 数据库准备
**MySQL 安装:**
- 下载地址:https://dev.mysql.com/downloads/mysql/
- 或使用 Docker:`docker run -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=yourpassword mysql:8.0`
- 创建两个数据库实例 `base` 和 `core` 分别用于存储基础数据和业务数据
- 执行初始化 SQL(见 `docs/sql/init_base.sql` 和 `docs/sql/init_core.sql`)
#### 2.1.3 Redis 准备
**Redis 安装:**
- Windows:下载 https://github.com/microsoftarchive/redis/releases 或使用 WSL
- Linux/Mac:`sudo apt-get install redis-server` 或 `brew install redis`
- 或使用 Docker:`docker run -d -p 6379:6379 redis:latest`
- 启动后验证:`redis-cli ping`(应返回 `PONG`)
#### 2.1.4 配置文件
编辑 `backend/cfg.json` 注意调整数据库和redis链接为你的真实地址
### 2.2 开发模式
#### 2.2.1 后端启动
```bash
cd backend
go mod tidy
go build
./backend
```
后端默认运行在 `http://localhost:3000`
#### 2.2.2 前端启动
```bash
cd frontend
npm install
npm run dev -- --host 0.0.0.0
```
前端默认运行在 `http://localhost:5173` 和 `http://{真实服务器IP}:5173`
#### 2.2.3 登录系统
建议使用 `http://{真实服务器IP}:5173` 登录,管理员账号密码 admin/Admin321!
### 2.3 生产环境部署指南
详细的部署说明,包括生产环境配置、Nginx 配置、Docker 部署等,请查看 [部署文档](docs/DEPLOYMENT.md)。
---
## 三、如何阅读代码
### 3.1 项目结构概览
gin-vue-web 采用经典的前后端分离架构。理解这个架构是阅读代码的第一步。
**前后端分离意味着什么?**
简单来说,前端(Vue 3)和后端(Go)是完全独立的两个应用。它们通过 HTTP API 进行通信,前端负责展示和交互,后端负责数据处理和业务逻辑。这种架构的好处是前后端可以独立开发、部署和维护。
**项目目录结构**
```
gin-vue-web/
├── backend/ # 后端代码(Go)
│ ├── g/ # 核心框架代码
│ │ ├── x.go # CRUD 核心逻辑(X 结构体)
│ │ ├── xb.go # 批量操作扩展(XB 结构体)
│ │ ├── rule.go # 规则配置处理
│ │ ├── action.go # 路由自动注册
│ │ ├── web.go # Web 基础功能
│ │ └── model.go # 基础模型
│ ├── modules/ # 业务模块
│ │ ├── base/ # 基础模块(用户、角色等)
│ │ │ ├── controllers/ # 控制器
│ │ │ └── models/ # 数据模型
│ │ └── res/ # 资源模块(示例)
│ │ ├── controllers/
│ │ └── models/
│ ├── libs/ # 工具库
│ ├── main.go # 入口文件
│ └── rule.json # 字段规则配置
│
├── frontend/ # 前端代码(Vue 3)
│ ├── src/
│ │ ├── components/ # 通用组件
│ │ │ ├── searcher.vue # 搜索器
│ │ │ ├── table.vue # 数据表格
│ │ │ ├── pager.vue # 分页器
│ │ │ ├── edit.vue # 编辑表单
│ │ │ └── ...
│ │ ├── modules/ # 业务页面
│ │ ├── templates/ # 页面模板
│ │ │ ├── index.vue # 通用列表页模板
│ │ │ ├── layout.vue # 布局模板
│ │ │ └── ...
│ │ ├── libs/ # 工具库
│ │ │ └── lib.ts # 核心工具函数
│ │ └── app.vue # 根组件
│ └── package.json
│
└── docs/ # 文档
```
### 3.2 后端代码结构
#### 3.2.1 核心框架代码(`backend/g/`)
这个目录包含了框架的所有核心功能。让我们逐个了解每个文件的作用:
**`x.go` - CRUD 核心逻辑**
这是整个框架最重要的文件。`X` 结构体封装了完整的 CRUD(增删改查)功能。当你创建一个 Controller 并继承 `X` 结构体时,你就自动获得了列表查询、数据获取、新增、编辑、删除等所有功能。
`X` 结构体包含了很多字段,每个字段都有特定的作用:
- `DB`:数据库连接,用于执行 SQL 查询
- `Model`:数据模型,定义了要操作的数据表结构
- `Rules`:字段规则,从 `rule.json` 加载,控制字段的显示、验证、搜索等行为
- `Tool`:工具栏按钮配置,比如"新增"按钮
- `Option`:行操作按钮配置,比如每行的"编辑"、"删除"按钮
- `AndWheres`:固定查询条件,比如只显示已发布的数据
- `WrapData`:数据处理函数,可以在返回数据前进行自定义处理
- `Dump`:开启后在列表页展示"导出"按钮,可将当前搜索结果导出为 Excel,便于离线分析
**`xb.go` - 批量操作扩展**
`XB` 是 `X` 的扩展版本,专门用于支持批量操作。如果你需要批量编辑或批量删除功能,使用 `XB` 而不是 `X`。它会在工具栏自动添加"批量修改"和"批量删除"按钮。
**`rule.go` - 规则配置处理**
这个文件负责加载和解析 `rule.json` 配置文件。`rule.json` 定义了每个表的字段规则,比如字段是否必填、是否可搜索、下拉选项是什么等等。框架会根据这些规则自动生成搜索表单、数据表格和编辑表单。
**`action.go` - 路由自动注册**
这是框架的"魔法"所在。通过 Go 的反射机制,框架会自动扫描所有 Controller 中以 `Action` 开头的方法,然后自动注册为路由。这意味着你不需要手动编写路由表,只需要定义方法,路由就会自动生成。
**`web.go` - Web 基础功能**
提供页面渲染、JSON 响应、Session 管理等基础功能。这些是 Web 应用的基础能力,被 `X` 结构体继承使用。
#### 3.2.2 业务模块代码(`backend/modules/`)
业务代码按模块组织,每个模块代表一个业务领域。比如 `base` 模块包含用户、角色等基础功能,`res` 模块可能包含资源管理相关的功能。
每个模块通常包含两个目录:
- **`models/`**:数据模型,定义了数据库表的结构
- **`controllers/`**:控制器,处理 HTTP 请求,调用模型进行数据操作
**一个典型的模块结构**
以 Service 模块为例,它包含:
- `models/service.go`:定义了 Service 数据模型,包含名称、业务类型、状态等字段
- `controllers/service.go`:定义了 Service 控制器,继承 `g.XB`,自动获得所有 CRUD 功能
这种结构清晰明了,模型负责数据结构,控制器负责业务逻辑。
### 3.3 前端代码结构
#### 3.3.1 核心文件
**`app.vue` - 根组件**
这是整个前端应用的入口。它监听路由变化,当用户访问不同页面时,它会调用后端 API 获取页面配置,然后动态加载对应的 Vue 组件。这种设计使得页面可以完全由后端控制,前端只需要负责渲染。
**`libs/lib.ts` - 核心工具函数**
这个文件提供了前端最常用的工具函数:
- `curl()`:调用后端 API,会自动添加 `/web` 前缀,处理请求和响应
- `loadModal()`:加载模态框组件,用于编辑、新增等弹窗操作
- `loadComponent()`:动态加载 Vue 组件
- `smartUrl()`:智能处理 URL,将相对路径转换为绝对路径
这些函数封装了前后端交互的细节,让你可以专注于业务逻辑。
**`templates/index.vue` - 通用列表页模板**
这是框架提供的通用列表页模板。它根据后端返回的规则配置,自动生成搜索表单、数据表格、分页器等组件。你不需要为每个列表页都写一遍这些代码,框架已经帮你做好了。
#### 3.3.2 组件系统
框架提供了一系列通用组件,这些组件都是可复用的:
- **`searcher.vue`**:搜索器组件,根据规则自动生成搜索表单
- **`table.vue`**:数据表格组件,支持排序、选择、行操作
- **`pager.vue`**:分页器组件
- **`edit.vue`**:编辑表单组件,根据规则自动生成表单字段
- **`button.vue`**:按钮组件,支持不同类型的按钮样式
这些组件都是基于 Ant Design Vue 构建的,提供了统一的 UI 风格和交互体验。
### 3.4 代码阅读建议
阅读代码是一个循序渐进的过程,建议按照以下顺序:
**第一步:从入口开始**
了解应用的启动流程很重要。后端从 `main.go` 开始,它会初始化数据库、加载配置、注册路由。前端从 `main.ts` 开始,它会创建 Vue 应用、注册路由、挂载到 DOM。
**第二步:理解核心框架**
重点阅读 `backend/g/x.go`,这是整个框架的核心。理解 `X` 结构体如何工作,它的每个方法做了什么,这是理解整个框架的关键。
同时,理解 `rule.json` 如何驱动前端表单和后端验证。这是框架"配置驱动"理念的体现。
**第三步:跟踪数据流**
选择一个具体的功能(比如列表查询),从前端请求开始,跟踪数据如何流转:
1. 前端发起请求
2. 后端接收请求
3. 构建查询条件
4. 执行数据库查询
5. 处理返回数据
6. 返回给前端
7. 前端更新界面
理解这个流程,你就能理解整个系统是如何工作的。
**第四步:查看示例代码**
参考 `modules/base/` 和 `modules/res/` 中的示例代码。这些是实际可用的代码,可以帮助你理解如何在实际项目中使用框架。
---
## 四、核心设计思想
### 4.1 X 结构体 - 框架的核心
`X` 结构体是整个框架的核心,理解它是理解整个框架的关键。
#### 4.1.1 设计理念:约定优于配置
框架采用了"约定优于配置"的设计理念。这意味着框架定义了一套约定,只要你遵循这些约定,框架就能自动帮你完成大部分工作。
比如,你只需要:
- 定义数据模型(Model)
- 配置字段规则(rule.json)
- 创建 Controller 并继承 `X`
框架就会自动为你生成:
- 列表页
- 搜索功能
- 新增功能
- 编辑功能
- 删除功能
你不需要写大量的样板代码,框架已经帮你做好了。
#### 4.1.2 X 结构体的核心方法
`X` 结构体提供了五个核心方法,对应 CRUD 的五个操作:
**`ActionIndex` - 列表页渲染**
当用户访问列表页时,这个方法会被调用。它会:
1. 从 `rule.json` 加载字段规则
2. 构建工具栏按钮和行操作按钮
3. 获取 URL 参数(用于搜索条件)
4. 渲染前端模板,传递所有配置信息
前端模板会根据这些配置自动生成搜索表单、数据表格等组件。
**`ActionFetch` - 数据获取**
这是列表页获取数据的核心方法。当用户搜索、排序、翻页时,前端会调用这个方法。
它的工作流程是:
1. 接收前端传递的搜索参数、排序参数、分页参数
2. 根据 `rule.json` 中的 `search` 配置,构建 SQL 查询条件
3. 执行数据库查询,获取总数和数据列表
4. 调用 `WrapData` 处理数据(比如翻译外键 ID 为显示名称)
5. 返回 JSON 格式的数据给前端
**`ActionEdit` - 编辑页渲染**
当用户点击"新增"或"编辑"按钮时,这个方法会被调用。它会:
1. 判断是新增还是编辑(通过 URL 参数中的 `id`)
2. 如果是编辑,从数据库加载现有数据
3. 从 `rule.json` 加载字段规则
4. 渲染编辑表单模板,传递数据和规则
前端模板会根据规则自动生成表单字段,包括输入框、下拉选择、多行文本等。
**`ActionSave` - 数据保存**
当用户提交表单时,这个方法会被调用。它会:
1. 判断是新增还是编辑
2. 解析请求体中的数据
3. 根据 `rule.json` 中的 `required` 配置进行验证
4. 处理特殊字段(比如 JSON 字段、分隔符字段)
5. 保存到数据库(使用事务保证数据一致性)
6. 返回成功或失败信息
**`ActionDelete` - 数据删除**
当用户点击"删除"按钮时,这个方法会被调用。它会:
1. 从 URL 参数获取要删除的数据 ID
2. 从数据库查询数据是否存在
3. 调用模型的 `Delete` 方法删除数据(使用事务)
4. 返回成功信息
#### 4.1.3 查询条件的构建
`buildCondition` 方法负责根据搜索参数构建 SQL 查询条件。这是框架"规则驱动"的典型体现。
框架会根据 `rule.json` 中每个字段的 `search` 配置来决定如何构建查询条件:
- `search: 0`:不搜索,忽略该字段
- `search: 1`:精确匹配,生成 `WHERE field = value`
- `search: 2`:模糊搜索,生成 `WHERE field LIKE '%value%'`
- `search: 3`:IN 查询,生成 `WHERE field IN (value1, value2, ...)`
这样,你只需要在 `rule.json` 中配置搜索类型,框架就会自动处理,不需要写 SQL 代码。
### 4.2 XB 结构体 - 批量操作的扩展
`XB` 是 `X` 的扩展版本,专门用于支持批量操作。
#### 4.2.1 为什么需要 XB?
在实际业务中,经常需要对多条数据进行批量操作。比如批量修改状态、批量删除等。如果使用 `X`,你需要自己实现这些功能。而 `XB` 已经帮你实现了。
#### 4.2.2 XB 的设计
`XB` 使用 Go 的泛型特性,确保类型安全。它继承自 `X`,所以拥有 `X` 的所有功能,同时新增了三个方法:
- `ActionBatchEdit`:批量编辑,显示一个表单,可以选择要修改的字段
- `ActionBatchSave`:批量保存,将修改应用到选中的多条数据
- `ActionBatchDelete`:批量删除,删除选中的多条数据
#### 4.2.3 使用 XB 的好处
当你使用 `XB` 时,框架会自动:
1. 在工具栏添加"批量修改"和"批量删除"按钮
2. 在表格中启用多选功能
3. 注册批量操作的路由
你不需要写任何额外的代码,只需要将 `g.X` 改为 `g.XB` 即可。
### 4.3 Rule 规则配置 - 配置驱动的力量
`rule.json` 是框架的核心配置文件,它定义了每个表的字段规则。这是框架"配置驱动"理念的体现。
#### 4.3.1 规则配置的作用
通过 `rule.json`,你可以定义:
- 字段的显示名称(用于表单标签、表格列头)
- 字段是否必填(用于表单验证)
- 字段的搜索类型(用于构建查询条件)
- 字段的下拉选项(用于生成下拉选择框)
- 字段的翻译规则(用于将外键 ID 转换为显示名称)
- 字段的验证规则(用于在后端保存前做类型、范围、正则等校验)
框架会根据这些规则自动生成前端表单和后端验证逻辑,你不需要写代码。
#### 4.3.2 规则配置的字段说明
**基础字段**
- `key`:字段名,对应数据库表的列名
- `name`:显示名称,用于表单标签、表格列头
- `required`:是否必填,`true` 表示该字段在保存时必须填写
- `readonly`:是否只读,`true` 表示该字段在编辑页中不可编辑
- `default`:默认值,新增数据时自动填充
**搜索配置**
`search` 字段控制该字段在列表页的搜索行为:
- `0`:不搜索,该字段不会出现在搜索表单中
- `1`:精确匹配,搜索时使用 `WHERE field = value`
- `2`:模糊搜索,搜索时使用 `WHERE field LIKE '%value%'`
- `3`:IN 查询,支持选择多个值,搜索时使用 `WHERE field IN (value1, value2, ...)`
**显示配置**
- `textarea`:是否多行文本输入框,`true` 使用 `