Files
easygoadmin-wiki/EasyGoAdmin_GoFrame_EleVue/zh/guide/faq.md
T
2026-10-20 21:19:44 +08:00

90 lines
4.1 KiB
Markdown
Raw 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.
# 3.11 常见问题与排错
:::tip 概述
本节收录模块开发阶段的高频问题,按「路由/编译/数据/权限/生成器」分组。更多通用排障见 [附录 A](../appendix/faq)。
:::
## 路由与注册
### Q:新增接口 404
排查顺序:
```text
1. router.go 是否有 Bind(s, new(controller.CXxx)) 注册行(生成器会自动写)
2. 请求结构体是否内嵌 gmeta.Meta 且 method/path 标签正确
3. 控制器方法签名是否为 (ctx, *v1.XxxReq) (*v1.XxxRes, error)——签名不符静默跳过
4. 路径是否误带 /v1(本项目 URL 无版本段)
```
验证:`curl http://127.0.0.1:8000/api.json | grep "xxx"`——gmeta 会补注册进 OpenAPI。
### Q:取用 service panic `implement not found`
logic 的 `init()` 未调用 `service.RegisterXxx`,或接口文件的取用函数名与注册函数名不匹配。检查三件套(接口/取用/注册)拼写一致。
## 编译与结构
### Q:`go build` 报 logic 循环引用
logic 是单包,跨模块直接调用包级函数即可,不要在 logic 内 import 其他会 import logic 的包。依赖红线:`task → logic` 单向允许;`logic → task` 禁止;middleware 经 wire.go 函数变量接线(不 import 业务包)。
### Q:改动 logic 方法签名后编译通过但运行 403/空响应
service 接口是手工维护的——签名变更必须同步 `internal/service/{模块}.go`,否则 controller 调用的是旧接口(编译期不报错的场景是接口方法恰好同签名但语义变化)。
### Q:新增了字段但接口返回里没有
三处都要检查:entity 是否刷新(`gf gen dao`)→ Req/Res 结构体是否含该字段 → ToData 是否映射(写侧)。读侧展示字段在 Item/DetailRes 声明即可(Struct 自动映射)。
## 数据与隔离
### Q:新增数据 tenant_id 为 0 或报错
租户级表必须把表名加入 `internal/model/hooks/hooks.go` 的 `tenantTables` 清单(生成器不自动维护)。插入行为:租户用户零值自动填自身;超管未指定填 `tenant.defaultId`;显式 0 建平台共享行。
### Q:查询结果包含已删除数据
是否绕过了 `dao.{X}.Ctx(ctx)` 直连 `g.DB()`?红线:唯一查询入口是 dao.Ctx,它自动注入 `del_flag=0`。
### Q:唯一校验漏报 1062 或跨租户误报
`UniqueFields` 的 `Group` 范围必须等于唯一索引范围:索引含 tenant_id 时必须 `Group:"tenant_id"`。手写检查(如 user 的 username/mobile)按"被改行现租户"校验。
### Q:删除报"存在下级或关联"
模块 BeforeDelete 守卫(如 dept 有子级/用户、user 关联清理 user_role)。这是业务保护,需要先处理关联数据。
## 权限与日志
### Q:新接口一直 403
```text
1. gmeta permission 标签是否声明(空则仅需登录)
2. 菜单里权限节点是否存在(sys:{module小驼峰}:{action})
3. 角色是否勾选该节点并保存(保存会清身份缓存)
4. 测试账号是否重新登录(身份缓存 300s;可 DEL easygoadmin:user:identity:{uid})
```
### Q:操作日志没记录
检查:gmeta `log` 标签是否为空(空不记录);`logType:"query"` 且 `operationLog.logQuery: false` 时查询类跳过;`operationLog.enable` 总开关;通道满会丢弃(每丢 100 条告警一次)。
## 生成器
### Q:生成器不创建字典
枚举注释格式不对——须为 `字段名:1-正常 2-禁用` 形式(`-`/`—`/`=`/`=` 分隔)。非 MySQL 库内省不到注释,建议在 MySQL 上生成。
### Q:生成的前端页面路由 404
菜单由生成器创建(path `/{domain}/{moduleCamel}`),但角色未勾选新菜单;或 component 路径与实际文件不符(domain 归属由 genDomainMap 决定)。
### Q:重复生成会覆盖我的手工修改吗
默认不会——`generator.overwrite: false` 时已存在文件跳过(计入 Skipped)。`overwrite: true` 时全部覆盖(计入 Overwritten),批量覆盖前务必备份或临时改回 false。
### Q:租户级新表生成后数据不隔离
生成器不维护 `tenantTables` 清单,需手工把表名加入 `internal/model/hooks/hooks.go` 后重启。