- 🏠 简介
- 📥 源码下载
- 🚀 安装指南
- 🔧 niucloud (服务端)
- 🖥️ admin (后台管理端)
- 📱 uni-app(手机端前端)
- 🌐 web端(PC前端)
- ⚙️ 代码生成器
- ⚙️ 配置手册
- 📚 使用手册
- 🔄 版本更新
-
❓ 常见问题
- 服务器问题
- 安装问题
- 使用问题
- 版本问题
-
其他问题
- 怎么添加菜单,添加了菜单不出现怎么回事
- 站点site端(租户端、商家端)和saas管理端(平台端)究竟啥意思,有啥区别
- 框架中是有订单表order,假如开发一个商城插件,请问商城的订单数据是不是重新搞一个订单表shop_order
- 有些支付平台是绑定回调唯一网址或目录,如果有几个开发者开发插件都有支付那这块怎么解决?
- 站点过期,可以登录,这样对吗?
- 计划任务怎么启动啊
- Git多分支开发,切换分支
- 安装应用出现is_dir()报错处理方案
- 绑定授权时出现“请求来源产品与授权产品不一致”解决方案
- “未找到admin源码所在目录”的解决方案
- 页面装修本地开发环境配置
- 接口请求错误处理方案
- 未获取到授权信息问题处理方案
- 腾讯地图配置
- 请求超时问题处理方案
- 下载应用时提示找不到zip解决方案
- 怎么关闭开发调试模式
- 获取数据失败问题处理方案
- 框架安装后,访问域名无法进入admin端(多数发生在本地)
- 底部导航失效问题
- 开放平台小程序审核通过发布失败问题
- 先升级插件后升级框架,导致云编译报debounce的错误
- 微信公众号自动回复不通
- 如何修改访问域名默认跳转端口
- 插件与框架的版本兼容问题处理方案
- 升级提示mkdir()处理方案
- 云编译时node.js内存不足导致内存溢出处理方案
- 报错Allowed memory size of ** bytes exhausted (tried to allocate ** bytes)处理方法
- Mysql修改sql_mode模式
- 框架1.0.2之前升级最新版错误Undefined array key "content"
- 安装插件提示不适配框架版本的处理
路由
路由概述
基于ThinkPHP框架的路由系统实现,采用灵活的路由定义方式,支持域名路由、规则路由、分组路由、中间件应用等特性。系统将不同类型的路由进行分类管理,实现了清晰的权限控制和业务分离。
路由目录结构
路由文件分布在以下几个主要位置:
niucloud/
├── route/
│ └── app.php #主路由文件,定义基础路由规则
├── app/
│ ├── adminapi/route/ #管理后台API路由
│ │ ├── route.php #管理后台基础路由
│ │ └── addon.php #管理后台插件相关路由
│ ├── api/route/ #前端API路由
│ │ └── route.php #前端API路由定义
├── config/
│ └── route.php #路由配置文件
└── addon/ #插件目录,包含各插件的路由
主路由文件(route/app.php)
主路由文件定义了系统的基础路由规则,包括域名映射、页面跳转和插件路由加载等功能。
域名路由
系统使用Route::domain方法配置域名路由,将特定域名映射到对应控制器命名空间:
// 将install.php域名映射到app\install\controller命名空间
Route::domain('install.php', ':\app\install\controller');
页面跳转路由
系统定义了多个页面跳转路由,用于前端页面访问:
// 访问首页自动跳转到admin或wap
Route::rule('/', function () {
if (Request::isMobile()) {
return redirect('/wap');
} else {
return redirect('/admin');
}
});
// 管理后台页面路由
Route::rule('admin', function () {
return view(app()->getRootPath() . 'public/admin/index.html');
})->pattern(['any' => '\\w+']);
// 其他页面路由(site、home、decorate、wap、web等)
// ...
插件路由加载
主路由文件负责动态加载所有插件的路由配置:
// 加载插件的route
$addon_dir = root_path() . 'addon';
$addons = array_diff(scandir($addon_dir), ['.', '..']);
foreach ($addons as $addon) {
$route = $addon_dir . DIRECTORY_SEPARATOR . $addon . DIRECTORY_SEPARATOR . 'app' . DIRECTORY_SEPARATOR . 'config' . DIRECTORY_SEPARATOR . 'route.php';
if (file_exists($route)) {
include $route;
}
}
路由配置文件(config/route.php)
路由配置文件定义了系统路由的基础参数设置:
return [
// pathinfo分隔符
'pathinfo_depr' => '/',
// URL伪静态后缀
'url_html_suffix' => 'html',
// URL普通方式参数 用于自动生成
'url_common_param' => true,
// 是否开启路由延迟解析
'url_lazy_route' => false,
// 是否强制使用路由
'url_route_must' => false,
// 路由是否完全匹配
'route_complete_match' => false,
// 访问控制器层名称
'controller_layer' => 'controller',
// 空控制器名
'empty_controller' => 'Error',
// 默认控制器名
'default_controller' => 'Index',
// 默认操作名
'default_action' => 'index',
// 其他配置...
];
业务路由实现
API路由(app/api/route/route.php)
API路由定义了前端接口的访问规则,支持多种请求方式和中间件应用:
// 引入中间件
use app\api\middleware\ApiChannel;
use app\api\middleware\ApiCheckToken;
use app\api\middleware\ApiLog;
// 公众号消息推送路由,应用多个中间件
Route::any('wechat/serve/:site_id', 'wechat.Serve/serve')
->middleware(ApiChannel::class)
->middleware(ApiCheckToken::class)
->middleware(ApiLog::class);
// 分组路由定义
Route::group(function () {
//登录接口
Route::get('login', 'login.Login/login');
//注册接口
Route::post('register', 'login.Register/account');
Route::post('register/mobile', 'login.Register/mobile');
//会员相关接口
//地区管理接口
//其他业务接口...
});
// 加载插件路由
( new DictLoader("Route") )->load([ 'app_type' => 'api' ]);
管理后台路由(app/adminapi/route/route.php)
管理后台路由定义了管理端接口的访问规则:
// 基础登录相关路由
Route::group(function() {
//用户登录
Route::get('login/:app_type', 'login.Login/login');
//登录注册设置
Route::get('login/config', 'login.Config/getConfig');
//生成验证码
Route::get('captcha/create', 'login.Captcha/create');
//一次校验验证码
Route::get('captcha/check', 'login.Captcha/check');
});
//加载插件路由
( new DictLoader("Route") )->load([ 'app_type' => 'adminapi' ]);
插件管理路由(app/adminapi/route/addon.php)
插件管理路由定义了插件管理相关的接口规则,应用了管理后台中间件:
use app\adminapi\middleware\AdminCheckRole;
use app\adminapi\middleware\AdminCheckToken;
use app\adminapi\middleware\AdminLog;
// 应用插件相关路由
Route::group(function () {
//获取本地插件
Route::get('addon/init', 'addon.Addon/init');
Route::get('addon/local', 'addon.Addon/getLocalAddonList');
//获取插件列表
Route::get('addon', 'addon.Addon/lists');
//获取插件详情
Route::get('addon/:id', 'addon.Addon/info');
//安装插件
Route::post('addon/install/:addon', 'addon.Addon/install');
//其他插件管理接口...
})->middleware(AdminCheckToken::class)
->middleware(AdminCheckRole::class)
->middleware(AdminLog::class);