{{wikiTitle}}
前台后端添加路由说明
复制链接
编辑文档
CRMEB PRO 前台后端添加路由说明
概述
CRMEB PRO 使用 ThinkPHP 8.0 的路由机制,路由配置文件位于 route/ 目录下。本文档介绍如何在前台和后台添加新的路由规则。
路由文件结构
route/
├── admin.php # 后台管理路由
├── api.php # 前端API路由(用户端)
├── erp.php # ERP对接路由
├── kefu.php # 客服系统路由
├── out.php # 对外接口路由
├── supplier.php # 供应商路由
└── zroute.php # 其他路由
前端API路由 (api.php)
路由组织结构
<?php
use think\facade\Route;
// 所有前端API路由都在 'api' 组下
Route::group('api', function () {
// 无需授权的接口
Route::group(function () {
Route::get('public/config', 'v1.PublicController/getConfig');
});
// 登录类接口
Route::group(function () {
Route::post('login', 'v1.Login/login');
})->middleware(StationOpenMiddleware::class);
// 需要授权但不强制的接口
Route::group(function () {
Route::get('product/list', 'v1.product.StoreProduct/lst');
})->middleware(AuthTokenMiddleware::class, false);
// 必须授权的接口
Route::group(function () {
Route::get('user', 'v1.user.User/user');
Route::post('order/create', 'v1.order.StoreOrder/create');
})->middleware(AuthTokenMiddleware::class, true);
})->prefix('api.')->middleware(InstallMiddleware::class);
添加前端路由示例
示例1: 添加无需授权的接口
// 在 route/api.php 的无需授权组中添加
Route::group(function () {
// 新增: 获取活动列表
Route::get('activity/list', 'v1.activity.MyActivity/getList')->name('activityList');
// 新增: 获取活动详情
Route::get('activity/detail/:id', 'v1.activity.MyActivity/getDetail')->name('activityDetail');
})->middleware(StationOpenMiddleware::class);
对应的控制器:
<?php
// app/controller/api/v1/activity/MyActivity.php
namespace app\controller\api\v1\activity;
use app\Request;
use app\services\activity\MyActivityServices;
class MyActivity
{
protected MyActivityServices $services;
public function __construct(MyActivityServices $services)
{
$this->services = $services;
}
/**
* 获取活动列表
*/
public function getList(Request $request)
{
$where = $request->getMore([
['page', 1],
['limit', 10],
]);
$data = $this->services->getList($where);
return app('json')->success($data);
}
/**
* 获取活动详情
*/
public function getDetail(int $id)
{
$data = $this->services->getDetail($id);
return app('json')->success($data);
}
}
示例2: 添加需要授权的接口
// 在 route/api.php 的授权组中添加
Route::group(function () {
// 新增: 用户收藏活动
Route::post('activity/collect/:id', 'v1.activity.MyActivity/collect')
->middleware(BlockerMiddleware::class) // 防重复提交
->name('activityCollect');
// 新增: 用户参与活动
Route::post('activity/join/:id', 'v1.activity.MyActivity/join')
->middleware(BlockerMiddleware::class)
->name('activityJoin');
})->middleware(StationOpenMiddleware::class)
->middleware(AuthTokenMiddleware::class, true);
对应的控制器方法:
/**
* 收藏活动
*/
public function collect(Request $request, int $id)
{
$uid = $request->uid;
$this->services->collectActivity($uid, $id);
return app('json')->success('收藏成功');
}
/**
* 参与活动
*/
public function join(Request $request, int $id)
{
$uid = $request->uid;
$result = $this->services->joinActivity($uid, $id);
return app('json')->success('参与成功', $result);
}
示例3: 添加路由分组
// 在 route/api.php 中添加新的功能模块
/**
* 新功能模块路由
*/
Route::group('mymodule', function () {
// 无需登录
Route::group(function () {
Route::get('config', 'v1.mymodule.Config/getConfig');
Route::get('list', 'v1.mymodule.MyModule/getList');
});
// 需要登录
Route::group(function () {
Route::post('create', 'v1.mymodule.MyModule/create');
Route::put('update/:id', 'v1.mymodule.MyModule/update');
Route::delete('delete/:id', 'v1.mymodule.MyModule/delete');
})->middleware(AuthTokenMiddleware::class, true);
})->middleware(StationOpenMiddleware::class);
后台管理路由 (admin.php)
路由组织结构
<?php
use think\facade\Route;
Route::group('adminapi', function () {
// 无需授权的接口
Route::group(function () {
Route::post('login', 'Login/login')->name('AdminLogin');
Route::get('captcha', 'Login/captcha');
})->middleware(AllowOriginMiddleware::class);
// 需要授权的接口
Route::group(function () {
Route::get('home/header', 'Common/homeStatics');
})->middleware([
AllowOriginMiddleware::class,
AdminAuthTokenMiddleware::class,
AdminCkeckRoleMiddleware::class,
AdminLogMiddleware::class
]);
})->prefix('admin.');
添加后台路由示例
示例1: 添加单个接口
// 在 route/admin.php 的授权组中添加
Route::group(function () {
// 新增: 获取自定义数据
Route::get('custom/data', 'v1.custom.CustomController/getData')
->option(['real_name' => '获取自定义数据']);
// 新增: 保存自定义数据
Route::post('custom/save', 'v1.custom.CustomController/saveData')
->option(['real_name' => '保存自定义数据']);
})->middleware([
AllowOriginMiddleware::class,
AdminAuthTokenMiddleware::class,
AdminCkeckRoleMiddleware::class,
AdminLogMiddleware::class
]);
示例2: 添加资源路由(CRUD)
// 在 route/admin.php 中添加
Route::group('custom', function () {
// 修改状态
Route::put('set_status/:id/:status', 'v1.custom.Custom/set_status')
->name('CustomSetStatus')
->option(['real_name' => '修改状态']);
// 资源路由(自动生成 index/create/save/edit/update/delete)
Route::resource('list', 'v1.custom.Custom')
->name('CustomResource')
->option(['real_name' => [
'index' => '获取列表',
'read' => '获取详情',
'create' => '获取创建表单',
'save' => '保存',
'edit' => '获取编辑表单',
'update' => '更新',
'delete' => '删除'
]]);
})->middleware([
AllowOriginMiddleware::class,
AdminAuthTokenMiddleware::class,
AdminCkeckRoleMiddleware::class,
AdminLogMiddleware::class
]);
对应的控制器:
<?php
// app/controller/admin/v1/custom/Custom.php
namespace app\controller\admin\v1\custom;
use app\controller\admin\AuthController;
use app\services\custom\CustomServices;
class Custom extends AuthController
{
protected CustomServices $services;
public function __construct(CustomServices $services)
{
parent::__construct();
$this->services = $services;
}
/**
* 列表
*/
public function index()
{
$where = $this->request->getMore([
['keyword', ''],
['status', ''],
]);
$list = $this->services->getList($where);
return app('json')->success($list);
}
/**
* 详情
*/
public function read(int $id)
{
$info = $this->services->getInfo($id);
return app('json')->success($info);
}
/**
* 创建表单
*/
public function create()
{
return app('json')->success($this->services->createForm());
}
/**
* 保存
*/
public function save()
{
$data = $this->request->postMore([
['name', ''],
['status', 1],
]);
$this->services->save($data);
return app('json')->success('添加成功');
}
/**
* 编辑表单
*/
public function edit(int $id)
{
return app('json')->success($this->services->editForm($id));
}
/**
* 更新
*/
public function update(int $id)
{
$data = $this->request->postMore([
['name', ''],
['status', 1],
]);
$this->services->update($id, $data);
return app('json')->success('修改成功');
}
/**
* 删除
*/
public function delete(int $id)
{
$this->services->delete($id);
return app('json')->success('删除成功');
}
/**
* 修改状态
*/
public function set_status(int $id, int $status)
{
$this->services->setStatus($id, $status);
return app('json')->success('修改成功');
}
}
示例3: 添加完整的功能模块路由
// 在 route/admin.php 中添加
/**
* 营销活动管理
*/
Route::group('marketing', function () {
// 活动列表
Route::get('activity/list', 'v1.marketing.Activity/index')
->option(['real_name' => '活动列表']);
// 活动详情
Route::get('activity/info/:id', 'v1.marketing.Activity/read')
->option(['real_name' => '活动详情']);
// 创建活动
Route::post('activity/save', 'v1.marketing.Activity/save')
->option(['real_name' => '创建活动']);
// 编辑活动
Route::put('activity/update/:id', 'v1.marketing.Activity/update')
->option(['real_name' => '编辑活动']);
// 删除活动
Route::delete('activity/delete/:id', 'v1.marketing.Activity/delete')
->option(['real_name' => '删除活动']);
// 修改活动状态
Route::put('activity/set_status/:id/:status', 'v1.marketing.Activity/setStatus')
->option(['real_name' => '修改活动状态']);
// 活动参与记录
Route::get('activity/record/:id', 'v1.marketing.Activity/record')
->option(['real_name' => '活动参与记录']);
// 活动统计
Route::get('activity/statistics/:id', 'v1.marketing.Activity/statistics')
->option(['real_name' => '活动统计']);
})->middleware([
AllowOriginMiddleware::class,
AdminAuthTokenMiddleware::class,
AdminCkeckRoleMiddleware::class,
AdminLogMiddleware::class
]);
路由参数说明
常用路由方法
| 方法 | 说明 | 示例 |
|---|---|---|
Route::get() |
GET请求 | Route::get('list', 'User/list') |
Route::post() |
POST请求 | Route::post('save', 'User/save') |
Route::put() |
PUT请求 | Route::put('update/:id', 'User/update') |
Route::delete() |
DELETE请求 | Route::delete('delete/:id', 'User/delete') |
Route::any() |
任意请求 | Route::any('action', 'User/action') |
Route::resource() |
资源路由 | Route::resource('user', 'User') |
路由参数
// 必选参数
Route::get('user/:id', 'User/read');
// 可选参数
Route::get('user/[:id]', 'User/read');
// 多个参数
Route::get('order/:uid/:status', 'Order/list');
// 参数规则
Route::get('user/:id', 'User/read')->pattern(['id' => '\d+']);
路由选项
Route::get('user/list', 'User/index')
->name('userList') // 路由别名
->option(['real_name' => '用户列表']) // 真实名称(用于权限)
->middleware(SomeMiddleware::class) // 中间件
->ext('html') // URL后缀
->https() // 仅HTTPS
->domain('api.example.com'); // 域名绑定
路由分组
Route::group('user', function () {
Route::get('list', 'User/index');
Route::get('info/:id', 'User/read');
Route::post('save', 'User/save');
})->prefix('v1.') // 控制器前缀
->middleware([MiddlewareA::class]) // 中间件
->pattern(['id' => '\d+']); // 参数规则
添加路由权限
后台路由需要配置权限才能在权限管理中控制:
1. 配置权限标识
在 config/auth.php 中添加权限配置:
// config/auth.php
return [
// ...其他配置
'auth_rule' => [
// 新增模块权限
'marketing-activity' => [
'marketing-activity-index', // 列表权限
'marketing-activity-create', // 创建权限
'marketing-activity-edit', // 编辑权限
'marketing-activity-delete', // 删除权限
],
],
];
2. 在路由中使用权限标识
Route::get('activity/list', 'v1.marketing.Activity/index')
->option([
'real_name' => '活动列表',
'unique_auth' => 'marketing-activity-index'
]);
3. 在后台菜单管理中添加菜单
通过后台管理界面添加对应的菜单和权限节点。
路由调试
查看所有路由
php think route:list
测试路由
// 在测试代码中
$url = url('userList'); // 根据路由别名生成URL
最佳实践
- 按模块组织: 将相关功能的路由放在同一个分组中
- 使用中间件: 合理使用中间件控制访问权限
- 命名规范: 路由别名使用驼峰命名,option中的real_name使用中文
- 版本控制: API接口使用版本号(v1/v2)管理
- RESTful风格: 遵循RESTful API设计规范
- 防重复提交: 关键操作使用BlockerMiddleware中间件
注意事项
- 路由文件位置:后台路由配置在
route/admin.php,前端API路由在route/api.php,供应商路由在route/supplier.php,请勿混淆 - 路由分组前缀:路由分组会自动拼接前缀,注意避免路径重复或冲突
- 中间件顺序:路由组的中间件会覆盖全局中间件配置,确保认证和权限中间件正确配置
- 权限标识唯一性:
unique_auth权限标识必须全局唯一,建议使用模块-功能-操作的命名格式 - 路由缓存:生产环境修改路由后需要清除路由缓存才能生效,执行
php think optimize:route - 参数验证:路由参数使用正则约束(如
\d+)可以在路由层面过滤非法请求 - MISS 路由:注意
miss路由的配置,用于处理未匹配的请求,避免暴露系统信息 - 跨域问题:前后端分离项目需要确保跨域中间件在路由组中正确配置
常见问题
Q: 新增的路由访问返回404错误?
A: 检查以下几点:1) 确认路由文件已正确保存;2) 检查控制器类和方法是否存在;3) 确认路由分组前缀是否正确拼接;4) 生产环境需清除路由缓存Q: 路由配置正确但权限验证失败?
A: 确认unique_auth标识已添加到菜单管理的权限节点中,并且当前角色已分配该权限Q: 如何设置某个接口允许游客访问?
A: 在API路由中,将AuthTokenMiddleware的参数设为false,或将该路由放在无认证中间件的分组中Q: 路由别名冲突如何解决?
A: 路由别名必须全局唯一,建议使用模块_功能_操作的命名方式避免冲突Q: 如何在路由中传递额外参数给控制器?
A: 使用option(['extra' => 'value'])配置额外参数,在控制器中通过$request->route('extra')获取Q: RESTful 风格的路由如何快速定义?
A: 使用Route::resource('article', 'v1.Article')可以快速生成标准的 CRUD 路由
评论({{cateWiki.comment_num}})
最新
最早
{{cateWiki.page_view_num}}人看过该文档
评论(0)
最新
最早
281人看过
登录/注册
即可发表评论
{{item.user ? item.user.nickname : ''}}
(自评)
{{item.content}}
搜索结果
为您找到{{wikiCount}}条结果
{{item.page_view_num}}
{{item.like ? item.like.like_num : 0}}
{{item.comment ? item.comment.comment_num : 0}}
位置:
{{path.name}}
{{(i+1) == item.catalogue.path_data.length ? '':'/'}}
