4.5 KiB
4.5 KiB
3.11 常见问题与排错
后端问题
Q: 新增接口返回 401
A: 检查以下几点:
- 请求头是否携带
Authorization: Bearer <token> - Token 是否过期(access_token 默认 2 小时,可调
/api/refresh续签) - 路由是否在
routes/api.php的认证中间件组内(组外为公开接口)
Q: 新增接口返回 403
A: 权限不足,检查:
- 是否在 Controller 方法上添加了
#[Permission]注解 - 权限码是否在菜单管理中配置(
permission字段与注解完全一致) - 用户角色是否包含该权限节点(角色管理 → 勾选菜单/按钮)
Q: 报 Table 'xxx.example' doesn't exist
A: DB_PREFIX 未配置。建表 SQL 使用 laravel_ 前缀,.env 中必须保留 DB_PREFIX=laravel_,改后执行 php artisan config:clear。
Q: 枚举显示名(statusText)为空
A: 检查:
- 字典表中是否存在对应的字典编码(如
example_status) - 字典项的 value 是否与数据中的值匹配
- Service 中
serializeMaps配置是否正确 - 字典缓存是否为旧数据:
php artisan dict:clear-cache
// ExampleService 中的配置
protected array $serializeMaps = [
'status' => 'example_status',
];
Q: 唯一性校验不生效 / 误报重复
A: 检查:
- Service 是否
use HasUniqueCheck(未启用时uniqueFields不生效) uniqueFields字段名是否与入参键名一致(snake_case)- 修改时是否正确排除自身(
checkUnique($data, $excludeId)由基类传入 id) - 软删除的旧记录仍占唯一规则——这正是不用数据库唯一索引的原因,如需彻底放开需先清理历史数据
Q: 排序不生效
A: 检查 Service 中 pageOrderBy 配置:
protected array $pageOrderBy = ['field' => 'sort', 'type' => 'asc'];
前端可通过 orderField / orderType 参数覆盖默认排序,但字段必须命中 pageOrderBy 默认字段与 orderFieldAllow 的并集(白名单防注入),否则被忽略。
Q: 新增/修改时报"参数验证失败",data 里没有字段明细
A: 两种校验路径的响应结构不同:
- FormRequest 注入失败:
data为{字段: [错误数组]}(code=1) - Service 业务异常:
data为 null(code=1,看 msg)
确认控制器方法是否类型注入了 FormRequest,以及是否误把格式规则写进了 Service。
Q: 审计字段(create_user)为空
A: create_user 取自当前登录用户(Auth::username()),需经 auth.jwt 中间件(登录态)调用;命令行/队列等无登录态场景需手动赋值。
前端问题
Q: 菜单不显示
A: 检查:
- 后端菜单管理中是否添加了对应菜单
- 菜单的组件路径是否正确(如
tool/example/index) - 前端
views目录下是否有对应的.vue文件 - 用户角色是否包含该菜单权限
Q: API 请求 404
A: 检查:
routes/api.php中是否注册了对应路由- 路由路径是否与前端 API 模块中的
url一致 - HTTP 方法是否正确(GET/POST/PUT/DELETE)
- 批量删除是 DELETE
batchDelete(请求体ids数组——方法为 DELETE 但仍携带 body)
Q: 表格数据不显示
A: 检查:
- API 返回的数据结构是否正确(
data应包含records和total) - 前端是否正确绑定了
tableData(res.records) - 浏览器控制台是否有报错
Q: 导入失败
A: 检查:
- 文件格式是否为
.xls或.xlsx(基类_import校验扩展名 + MIME + 10MB 上限) - 表头是否与
headerMap中定义的中文名一致 - 枚举字段的值是否在字典中存在(文本值需能反查到字典)
Q: 接口返回的键名大小写与预期不符
A: 项目开启了驼峰/下划线自动转换(API_CAMEL_SNAKE_CONVERT=true):
- 响应:
create_time→createTime(数据库字段 → 前端字段) - 请求:前端传 camelCase,Service 写入入口(doAdd/doUpdate)统一转为 snake_case
如需原样返回,使用 Result::success($data, $msg, true)($raw=true)。
生成器问题
Q: 用生成器生成的模块菜单没有出现
A: 检查生成配置中的父菜单 ID(.env 中 GENERATOR_PARENT_MENU_ID)是否存在,以及当前角色是否被分配了新菜单;生成后重新登录或刷新获取最新菜单。
Q: 生成的路由 404
A: 确认生成时是否勾选路由注册;手动检查 routes/api.php 中是否已有对应路由(重复注册会报错),改完执行 php artisan route:list 核对。