Files
YwxAppThink/addon/appmall/route/app.php
T

130 lines
7.7 KiB
PHP
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.
<?php
/*
* @Author: YwxApp <ywx@ywxapp.cn>
* @Date: 2026-07-21 13:36:46
* @LastEditors: YwxApp <ywx@ywxapp.cn>
* @LastEditTime: 2026-08-16 11:31:01
* @Description: 应用市场插件统一路由(对外 API + 主应用业务路由)
* @FilePath: \ywxapp_dev\addon\appmall\route\app.php
* @CustomString: Copyright (c) 2026 YwxApp
*/
// ============================================================
// 应用市场插件「统一路由入口」(替代原散落的 route/api.php)。
//
// 插件名前缀(/appmall)由外层加载器统一补全,本文件【不要】自行写前缀:
// 主应用:ywxapp/service/AppService::loadAddonRoutes() 包 Route::group('appmall')
//
// 全部路由(业务 + 对外 API)都在主应用 boot 阶段注册,形式为「相对组名」,
// 由外层 Route::group('appmall') 补全 → /appmall/backend、/appmall/developer、
// /appmall/api(与「插件名开头」约定一致,彻底避免多插件路由冲突)。
// 注意:group 前缀是累加的,文件内【不要】再写 /appmall/ 或 /api/ 这样的前缀(会双重前缀)。
// ============================================================
use think\facade\Route;
use addon\appmall\controller\api\Market;
use addon\appmall\controller\backend\AddonReview;
use addon\appmall\controller\backend\Developer;
use addon\appmall\controller\backend\Revenue as BackendRevenue;
use addon\appmall\controller\Developer as DeveloperCenter;
use addon\appmall\controller\backend\Framework;
use addon\appmall\controller\api\Framework as ApiFramework;
use addon\appmall\controller\Framework as FrontendFramework;
use addon\appmall\controller\Store;
// ===================== 业务路由 + 对外 API/appmall/* =====================
// 插件名前缀 /appmall 由 AppService::loadAddonRoutes() 的 Route::group('appmall') 补全。
// ---------- 后台:插件审核 / 开发者管理 / 收益与结算(统一前缀 /appmall/backend ----------
Route::group('backend', function () {
// 插件审核
Route::get('addonreview', [AddonReview::class, 'index']);
Route::get('addonreview/index', [AddonReview::class, 'index']);
Route::post('addonreview/approve', [AddonReview::class, 'approve']);
Route::post('addonreview/reject', [AddonReview::class, 'reject']);
Route::post('addonreview/updatePrice', [AddonReview::class, 'updatePrice']);
Route::get('addonreview/download', [AddonReview::class, 'download']);
Route::get('addonreview/detail', [AddonReview::class, 'detail']);
Route::get('addonreview/detailview', [AddonReview::class, 'detailview']);
Route::get('addonreview/history', [AddonReview::class, 'history']);
// 开发者管理
Route::get('developer', [Developer::class, 'index']);
Route::get('developer/index', [Developer::class, 'index']);
Route::post('developer/approve', [Developer::class, 'approve']);
Route::post('developer/disable', [Developer::class, 'disable']);
Route::post('developer/resend', [Developer::class, 'resend']);
Route::post('developer/reset', [Developer::class, 'reset']);
// 收益与结算
Route::get('revenue', [BackendRevenue::class, 'index']);
Route::get('revenue/index', [BackendRevenue::class, 'index']);
Route::get('revenue/withdrawals', [BackendRevenue::class, 'withdrawals']);
Route::post('revenue/settle', [BackendRevenue::class, 'settle']);
Route::post('revenue/reject', [BackendRevenue::class, 'rejectWithdrawal']);
// 主框架升级(原 upgrade 插件,已合并进 market
Route::get('framework', [Framework::class, 'index']);
Route::get('framework/index', [Framework::class, 'index']);
Route::post('framework/upload', [Framework::class, 'upload']);
Route::post('framework/publish', [Framework::class, 'publish']);
Route::post('framework/delete', [Framework::class, 'delete']);
Route::get('framework/download', [Framework::class, 'download']);
});
// ---------- 开发者中心(独立前台应用,公开注册/令牌/收益/提现,非会员中心):统一前缀 /appmall/developer ----------
// 仅【中心站】暴露:开发者自助注册/收益/提现依赖 appmall_developers / appmall_addon_revenues / appmall_addon_withdrawals 等
// 运营表,客户机(ywxapp.api_url 指向其他服务器,见 is_market_client())作为中心站客户端不持有这些表,故不在路由层注册,
// 访问即 404。配合 Developer 控制器 initialize() 的运行时兜底(即便路由缓存陈旧或被直连也能拦截)。
// ---------- 开发者中心(独立前台,令牌认证):/appmall/Developer/* ----------
Route::group('Developer', function () {
Route::get('index', [DeveloperCenter::class, 'index']);
Route::post('save', [DeveloperCenter::class, 'save']);
Route::get('mine', [DeveloperCenter::class, 'mine']);
Route::post('lookup', [DeveloperCenter::class, 'lookup']);
Route::get('dashboard', [DeveloperCenter::class, 'dashboard']);
Route::get('console', [DeveloperCenter::class, 'console']);
Route::post('overview', [DeveloperCenter::class, 'overview']);
Route::post('apps', [DeveloperCenter::class, 'apps']);
Route::post('price', [DeveloperCenter::class, 'price']);
Route::post('earnings', [DeveloperCenter::class, 'earnings']);
Route::post('withdraw', [DeveloperCenter::class, 'withdraw']);
});
// ---------- 对外 API(统一前缀 /appmall/api):远程客户机经 Remote/Addon/FrameworkService 调用 ----------
// 由 AppService::loadAddonRoutes() 的 Route::group('appmall') 补全插件名前缀 → /appmall/api/*
//(与 /appmall/backend、/appmall/developer 同源同构,均为「插件名开头」约定)。
// 调用方契约(勿单侧改动):
// RemoteAppmallService → /appmall/api/addon/*、/appmall/api/index
// AddonService → /appmall/api/addon/valid、/appmall/api/index/index
// FrameworkService → /appmall/api/framework/version、/appmall/api/framework/download
Route::group('api', function () {
Route::get('addon/lists', [Market::class, 'lists']);
Route::get('addon/info', [Market::class, 'info']);
Route::post('addon/valid', [Market::class, 'valid']);
Route::post('addon/submit', [Market::class, 'submit']);
Route::post('addon/buy', [Market::class, 'buy']);
Route::get('addon/orderStatus', [Market::class, 'orderStatus']);
Route::post('addon/notify', [Market::class, 'notify']);
Route::get('addon/payResult', [Market::class, 'payResult']);
Route::post('addon/refund', [Market::class, 'refund']);
Route::get('addon/my', [Market::class, 'my']);
// 插件 zip 下载(RemoteAppmallService 走 /appmall/api/indexAddonService 走 /appmall/api/index/index
Route::get('index', [Market::class, 'index']);
Route::get('index/index', [Market::class, 'index']);
// 主框架升级分发(FrameworkService 走 /appmall/api/framework/*
Route::get('framework/version', [ApiFramework::class, 'version']);
Route::get('framework/download', [ApiFramework::class, 'download']);
});
// ---------- 前台展示(公开,仅中心站):主框架发布/下载页 + 应用商店 ----------
// 前台控制器直接置于 addon\appmall\controller 下(如 ForumFrontend 惯例),
// 不套 frontend 子目录;URL 前缀为 /appmall/framework、/appmall/store。
Route::get('framework', [FrontendFramework::class, 'index']);
Route::get('framework/index', [FrontendFramework::class, 'index']);
// 应用商店:上线插件列表(/appmall/store
Route::get('store', [Store::class, 'index'])->completeMatch();
Route::get('store/index', [Store::class, 'index'])->completeMatch();
// 插件详情页(/appmall/store/detail/<name>
Route::get('store/detail/:name', [Store::class, 'detail'])
->pattern(['name' => '[\w\-]+']);