Files
2026-10-20 21:19:44 +08:00

171 lines
6.7 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 1.4 新手入门指南
:::tip 概述
本节面向第一次接触本项目的开发者,给出一条最短路径:跑起来 → 看懂一个请求 → 改一个字段 → 开发一个新模块。全程约 1 小时。
:::
## 学习路径总览
```mermaid
graph TD
A[克隆代码] --> B[初始化数据库]
B --> C[启动后端 :8000]
C --> D[启动前端 :9100]
D --> E[登录 admin/123456]
E --> F[读懂一个请求的完整链路]
F --> G[照着 example 模块仿写]
G --> H[用生成器生成新模块]
H --> I[阅读第 3 章模块开发实战]
style A fill:#e8f5e9
style E fill:#e8f5e9
style I fill:#fff3e0
```
## 第一步:跑起来
```sh
# 1. 导入数据库(MySQL)
# 库名:easygoadmin.goframe.elevue(注意库名含点)
mysql -uroot -p easygoadmin.goframe.elevue < document/mysql/easygoadmin.goframe.elevue.sql
# 2. 检查 manifest/config/config.yaml(数据库/Redis 连接信息)
# 3. 启动后端
go build -o bin/admin-server.exe main.go && ./bin/admin-server.exe
# 4. 启动前端(新终端)
cd ui && pnpm install && pnpm dev
```
访问前端页面,使用 **admin / 123456** 登录(超管,角色 `ROLE_SUPER_ADMIN`)。
## 第二步:读懂一个请求的完整链路
以「用户管理 → 列表页」为例,一个 `GET /api/user/page` 请求经过:
```text
前端 useHttp.get('/user/page')
→ axios 拦截器(带 Authorization: Bearer xxx)
→ 中间件链:CORS → Response → RateLimit → Demo → JWT → Tenant → OperationLog
→ Bind 包装层:读 gmeta 元数据 → HasPerm("sys:user:page") 权限校验
→ 参数解析(gvalid 校验)→ CUser.Page
→ service.User().Page
→ logic.sUser.Page → userSpec.Page(ModuleSpec 流水线)
→ dao.User.Ctx(ctx)(自动注入 del_flag=0 + tenant_id)
→ 数据库
← 统一信封 {"code":0,"ok":true,"msg":"操作成功","data":{records:[…],total:…}}
← OperationLog 中间件异步落库(GET 查询默认记录)
```
建议打断点或加日志逐层跟踪一次,比读十遍文档更有效。
## 第三步:改一个字段感受全流程
以「职级管理」为例,给 `goframe_level` 表加一个 `remark` 备注字段:
```sql
ALTER TABLE goframe_level ADD COLUMN remark varchar(255) DEFAULT '' COMMENT '备注';
```
然后:
```sh
# 刷新 dao(entity/do 同步更新)
gf gen dao -c hack/config.yaml
```
手工补齐四处:`api/v1/level.go` 的 Req/Res 结构体加 `Remark` 字段 → `logic/level.go` 的 ToData 加映射 → 前端 `querySchemas.ts`/`edit.vue`/`columns.ts` 加展示项 → `go build ./...` 重启。
这个过程就是日常开发的最小闭环。熟练后大部分此类变更可以用生成器的覆盖模式批量完成。
## 第四步:看懂 example 模块
`internal/logic/example.go` 是官方完整样板,演示了基座的全部常用声明:
+ 筛选(LikeFields/EqFields)
+ 字典文本(SerializeMaps → {field}Text)
+ 状态切换(Status 方法)
+ Excel 导入导出(Import/Export + ChunkQuery)
+ 前端五件套(`ui/src/views/tool/example/`:index/edit/detail/columns/querySchemas)
第 3 章模块开发实战全程以它为参照。
## 第五步:跑一遍生成器
用库中真实存在的 `goframe_example` 表练手(命令可直接执行):
```sh
# 预览(不落盘,查看将产出的文件与内容)
go run ./cmd/generator -tables "goframe_example|案例演示表" -preview
# 生成(example 已完整实现——将演示幂等保护:文件全跳过、菜单/字典/路由查重命中)
go run ./cmd/generator -tables "goframe_example|案例演示表"
go build ./... # 编译并重启
```
开发**新模块**时同样命令把表名换成你的表(如 `"goframe_xxx|中文名"`),生成后在「角色管理」为角色勾选新模块的权限节点。登录后在「系统管理 → 代码生成」页面也能操作(Web 界面)。完整实战见 [10.8 实战案例](./generator/demo)。
## 新手常见误区
:::warning 注意
1. **不要运行 `gf gen service`**——service 接口文件是手工重组维护的,整体运行会覆盖。
2. **不要绕过 dao 直连 `g.DB()`**——会绕过全局钩子(软删/租户/审计全部失效)。
3. **不要手写 del_flag/tenant_id 条件**——`dao.{X}.Ctx(ctx)` 已自动注入。
4. **不要在事务内做 HTTP/文件 IO**——bcrypt 等 CPU 操作也要在事务外预计算。
5. **前端登录读 `data.access_token`**(下划线命名),这是 OAuth2 惯例例外,勿改驼峰。
:::
## 常用命令速查
项目根目录执行(Windows 环境无 make,可直接用等价 go/gf 命令;Makefile 提供 run/build/test/vet/fmt/gen/clean 目标供类 Unix 环境使用):
```sh
# 编译与运行
go build ./... # 全量编译
go build -o bin/admin-server.exe main.go # 编译产物
./bin/admin-server.exe # 运行(:8000)
go run main.go # 开发直接运行
# 质量门禁
go test ./... # 测试(sqlite 集成 + hooks MySQL 集成)
go vet ./... # 静态检查
gofmt -l . # 格式检查(无输出=通过)
# 表结构变更后刷新 dao(service 手维护,勿运行 gf gen service)
gf gen dao -c hack/config.yaml
# 代码生成(文件+菜单+字典+路由,幂等)
go run ./cmd/generator -tables "goframe_example|案例演示表" # 一键生成
go run ./cmd/generator -tables "goframe_example|案例演示表" -preview # 仅预览
go run ./cmd/generator -tables "goframe_example|案例演示表" -batch # 批量统计
# 整库迁移(五方言互迁,含结构+注释+索引+数据+序列)
go run ./cmd/migrator -src-type=mysql -src-host=127.0.0.1 -src-hostport=3306 \
-src-database=easygoadmin.goframe.elevue -src-username=root -src-password=root \
-dst-type=pgsql -dst-host=127.0.0.1 -dst-hostport=5432 \
-dst-database=easygoadmin.goframe.elevue -dst-username=postgres -dst-password=123456 \
-drop-target-first
```
```sh
# 前端(ui/ 目录)
pnpm install # 安装依赖
pnpm dev # 开发服务器
pnpm build # 生产构建
pnpm type:check # vue-tsc 类型检查
pnpm lint:eslint # ESLint 修复
# Windows 重启(端口 8000)
netstat -ano | findstr ":8000" | findstr LISTENING
taskkill /F /PID <pid>
```
## 下一步阅读
+ 想快速搭环境:第 2 章「快速入门」
+ 想开发业务模块:第 3 章「模块开发实战」
+ 想理解设计原理:第 4 章「架构设计」
+ 想偷懒用生成器:第 10 章「代码生成器」