pattern(['id' => '\d+']); Route::get('works', 'api.Work/list'); Route::get('map/spots', 'api.Map/spots'); })->middleware($cors); Route::group('api/v1', function () { Route::post('upload', 'api.Upload/image'); Route::post('auth/bind-phone', 'api.MpAuth/bindPhone'); // 必须先注册更具体规则,否则 route_complete_match=false 时 POST works/5/like 会误匹配到 create,点赞会报「标题限 1~10 字」 Route::post('works/:id/like', 'api.Work/toggleLike')->pattern(['id' => '\d+']); Route::post('works/:id/resubmit', 'api.Work/resubmit')->pattern(['id' => '\d+']); Route::post('works', 'api.Work/create'); Route::get('me/profile', 'api.Profile/get'); Route::post('me/profile', 'api.Profile/save'); Route::get('me/works', 'api.Profile/myWorks'); Route::get('me/stats', 'api.Profile/stats'); Route::get('download-assets', 'api.DownloadAsset/get'); })->middleware([$cors, $mini]); // ---------- 管理后台 API ---------- Route::group('admin/v1', function () { Route::post('login', 'admin.Auth/login'); })->middleware($cors); Route::group('admin/v1', function () { Route::get('profile', 'admin.Auth/profile'); Route::get('menus/my', 'admin.Auth/menus'); Route::get('dashboard/stats', 'admin.Dashboard/stats'); Route::get('works/pending', 'admin.WorkAudit/pendingList'); Route::get('works/rejected', 'admin.WorkAudit/rejectedList'); Route::get('works/approved', 'admin.WorkAudit/approvedList'); Route::get('works/:id/detail', 'admin.WorkAudit/detail')->pattern(['id' => '\d+']); Route::post('works/:id/approve', 'admin.WorkAudit/approve')->pattern(['id' => '\d+']); Route::post('works/:id/reject', 'admin.WorkAudit/reject')->pattern(['id' => '\d+']); Route::post('works/:id/delete', 'admin.WorkAudit/delete')->pattern(['id' => '\d+']); Route::post('works/sort', 'admin.WorkAudit/sortApproved'); Route::get('users', 'admin.AdminUser/list'); Route::post('users/save', 'admin.AdminUser/save'); Route::post('users/:id/delete', 'admin.AdminUser/delete')->pattern(['id' => '\d+']); Route::get('roles', 'admin.Role/list'); Route::post('roles/save', 'admin.Role/save'); Route::post('roles/:id/delete', 'admin.Role/delete')->pattern(['id' => '\d+']); Route::get('roles/:id/menus', 'admin.Role/menuIds')->pattern(['id' => '\d+']); Route::post('roles/:id/menus', 'admin.Role/saveMenus')->pattern(['id' => '\d+']); Route::get('menus/tree', 'admin.Menu/tree'); Route::post('menus/save', 'admin.Menu/save'); Route::post('menus/:id/delete', 'admin.Menu/delete')->pattern(['id' => '\d+']); Route::get('mp-users', 'admin.MpUser/list'); Route::post('mp-users/save', 'admin.MpUser/save'); Route::post('mp-users/:id/delete', 'admin.MpUser/delete')->pattern(['id' => '\d+']); Route::post('upload', 'admin.Upload/image'); /** 管理端拉取作品原图 Blob(跨域静态资源无 CORS 时用此接口) */ Route::get('uploads/raw', 'admin.UploadServe/raw'); Route::get('banners', 'admin.BannerAdmin/list'); Route::post('banners/save', 'admin.BannerAdmin/save'); Route::post('banners/:id/delete', 'admin.BannerAdmin/delete')->pattern(['id' => '\d+']); Route::get('map-spots', 'admin.MapSpotAdmin/list'); Route::post('map-spots/save', 'admin.MapSpotAdmin/save'); Route::post('map-spots/:id/delete', 'admin.MapSpotAdmin/delete')->pattern(['id' => '\d+']); Route::get('download-assets', 'admin.DownloadAsset/get'); Route::post('download-assets/save', 'admin.DownloadAsset/save'); })->middleware([$cors, $adm]);