webman配合vue3构建h5后台的关键是路由显式注册、静态资源路径对齐、token手动校验、控制器统一返回json;四者任一出错即导致白屏或401。

Webman 配合 Vue3 构建 H5 管理后台,关键不在“能不能跑”,而在「路由对不对、静态资源放哪、token 怎么验、接口怎么返」——这四点错一个,前端就白屏或 401。
Vue3 请求 404 或 405?检查 Webman 路由是否显式注册
Vue3 前端发 /admin/auth/login,后端返回 404,大概率不是跨域或 Nginx 问题,而是 Webman 根本没这条路由。Webman 不像 ThinkPHP 自动解析 auth.admin 这类点号路径,它只认你手写的 Route::post()。
- 错误写法:
Route::post('/admin/auth.admin/login', [...])—— Webman 不识别点号分隔,直接 404 - 正确写法:在
app/route.php中显式声明:Route::group('/admin', function () { Route::post('/auth/login', [AuthController::class, 'login']); }); - 前端 axios baseURL 必须与之对齐,不能漏掉
/admin前缀,也不能多加斜杠(如//admin/auth/login) - 如果用代码生成器(如 SaiAdmin),生成的控制器方法名可能带
adminMySelf这种驼峰,但路由路径仍要手动映射为/auth/myself,别指望框架自动转下划线
前端白屏或 JS 404?确认 public 目录结构和 publicPath 配置
Vue3 打包后丢进 Webman 的 public/ 目录,但浏览器控制台报 Failed to load resource: the server responded with a status of 404 (),基本是路径没对齐。
- Vue 项目必须配置
vue.config.js:outputDir: '../public/h5-admin'+publicPath: '/h5-admin/',否则 JS/CSS 路径默认指向根目录 - 构建后检查
public/h5-admin/index.html里的<script src="/js/app.xxx.js"></script>—— 如果没带/h5-admin/前缀,说明publicPath没生效 - Nginx 必须兜底所有
/h5-admin/*请求:location ^~ /h5-admin/ { alias /path/to/webman/public/h5-admin/; try_files $uri $uri/ /h5-admin/index.html; },不能靠 Webman 的Route::any()拦截 - 别把 Vue 的
index.html放到app/view/下试图用 PHP 渲染——Webman 的 view 层不处理 SPA 的 history 路由
登录成功却拿不到用户信息?token 校验不能依赖中间件自动挂载
Vue3 存了 JWT 到 localStorage,每次请求带 Authorization: Bearer xxx,但后端 $request->user 始终为空——这不是前端没传,是 Webman 的 Request 对象不可变,中间件无法动态添加属性。
- 不要写全局中间件往
$request上塞user,会报错或静默失败 - 每个需要鉴权的接口里手动校验:
$user = AuthHelper::checkToken($request); if (!$user) return json(['code' => 401]); -
AuthHelper::checkToken()应从 header 提取 token,用openssl_verify()或firebase/php-jwt验签,并检查exp和role字段,别只 decode 就放行 - 避免在控制器里重复写校验逻辑,可封装成 trait 或基类方法,但别用构造函数自动执行——Webman 控制器不是每次请求都 new 实例,有复用可能
接口返回空数据或格式错乱?控制器必须显式返回 JSON
Vue3 接收响应时提示 Unexpected end of JSON input,或 data 是 HTML 字符串而非对象,说明后端没走标准 JSON 流程。
- 禁止在控制器里用
echo json_encode(...)或var_dump()—— 这会污染响应体,导致前端解析失败 - 统一用 Webman 内置的
json()辅助函数:return json(['code' => 0, 'data' => $user]); - 确保控制器方法返回值是
Response实例,不要有exit、die或未捕获异常,否则中间件链中断,JSON 头可能没发出去 - 开发期关闭 PHP 错误显示:在
start.php开头加ini_set('display_errors', 'Off');,否则Notice会混在 JSON 前面,前端解析直接崩溃
最易被忽略的是:Webman 的常驻内存特性会让静态变量、全局数组在多次请求间残留,比如你在中间件里 static $cache = [] 存 token 解析结果,下次请求可能拿到上个用户的缓存——这种 bug 不在日志里,只在特定并发场景下偶现。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











