Files
MBTI_wang/api/route/api.php
Ghost c4ac0f8a08 feat: 高考志愿与定价分销链路更新(管理端/API/小程序)
- 新增高考志愿核心服务、模型、控制器与迁移脚本

- 同步管理端定价/分销/设置与小程序入口、历史、测试选择和支付逻辑

- 补充相关开发文档

Made-with: Cursor
2026-04-25 16:19:08 +08:00

529 lines
29 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
// API路由定义
use think\facade\Route;
// ==================== 前端用户API路由 ====================
// 为避免匹配混淆,手机号接口单独声明完整路径(优先级更高)
Route::post('api/auth/wechat/phone', 'api.Auth/wechatPhone')->middleware(['cors', 'auth']);
// 前端公开API路由不需要认证
Route::group('api', function () {
// 用户认证相关
Route::post('auth/login', 'api.Auth/login');
Route::post('auth/register', 'api.Auth/register');
Route::post('auth/refresh', 'api.Auth/refresh');
// 微信小程序登录
Route::post('auth/wechat', 'api.Auth/wechatLogin');
// 服务内部异步推送入口:主业务 fire-and-forget 调用
Route::post('internal/outbound-push/dispatch', 'api.InternalPushHook/dispatch');
})->middleware('cors');
// 小程序/前端运行配置与面相分析(可选 token
Route::group('api', function () {
Route::get('config/runtime', 'api.AppConfig/runtime');
Route::get('config/deep-pricing', 'api.AppConfig/deepPricing');
// 与 ai/quick-questions 同源;部分线上网关仅放行 /api/config/*,供小程序公开拉取快捷问句
Route::get('config/ai-quick-questions', 'api.AiChat/quickQuestions');
Route::get('config/quick-questions', 'api.AiChat/quickQuestions');
// 与 mp/tabbar 同源;部分线上对 /api/mp/* 返回 nginx 404与 config/runtime 一并放行
Route::get('config/mp-tabbar', 'api.MpConfig/tabbar');
Route::post('analyze', 'api.Analyze/index');
// 小程序埋点批量上报(无需登录;带 token 时关联 user_id
Route::post('analytics/events', 'api.Analytics/batch');
// 好友打开分享卡片:凭 st 校验查看他人测试结果(无需登录)
Route::get('test/share-detail', 'api.Test/shareDetail');
// 神仙 AI · 推荐文章(无需登录也可拉取,首屏展示)
Route::get('ai/articles/recommended', 'api.AiChat/recommendedArticles');
Route::get('ai/articles/profile-teaser', 'api.AiChat/profileArticleTeaser');
Route::post('ai/articles/:id/click', 'api.AiChat/articleClick');
// 快捷问句:公开接口;若请求头带有效微信 token 则按用户 MBTI 个性化
Route::get('ai/quick-questions', 'api.AiChat/quickQuestions');
// 小程序 TabBar 动态配置(无需登录,启动拉取)
Route::get('mp/tabbar', 'api.MpConfig/tabbar');
})->middleware('cors');
// 前端需要认证的API路由
Route::group('api', function () {
// 用户信息
Route::get('auth/me', 'api.Auth/me');
Route::post('auth/logout', 'api.Auth/logout');
// 小程序扫码企业邀请后绑定企业
Route::post('enterprise/bind', 'api.Auth/wechatBindEnterprise');
// 企业版简历上传记录(具体路径放前面,避免被 POST resume-uploads 吞掉)
Route::get('enterprise/resume-uploads', 'api.EnterpriseResume/list');
Route::post('enterprise/resume-uploads/set-default', 'api.EnterpriseResume/setDefault');
Route::post('enterprise/resume-uploads/delete', 'api.EnterpriseResume/delete');
Route::post('enterprise/resume-uploads', 'api.EnterpriseResume/add');
// 企业合作模式(需微信登录且绑定企业)
Route::get('enterprise/cooperation-modes', 'api.Cooperation/modes');
Route::get('user/cooperation-status', 'api.Cooperation/status');
Route::post('user/cooperation-preference', 'api.Cooperation/submitPreference');
// 小程序用户更新资料
Route::put('auth/wechat/profile', 'api.Auth/updateWechatProfile');
// 小程序用户上传图片(头像等)
Route::post('upload/image', 'api.Upload/image');
// 小程序用户上传文件(候选人简历等)
Route::post('upload/file', 'api.Upload/file');
// 当前用户测试历史记录(小程序「测试历史」页)
Route::get('test/history', 'api.Test/history');
// 当前用户各类型最新一条记录(小程序「我的」页)
Route::get('test/recent', 'api.Test/recent');
// 单条测试详情
Route::get('test/detail', 'api.Test/detail');
// 启用题库(企业有则用企业,否则超管)
Route::get('test/questions', 'api.Test/questions');
// 提交测试结果MBTI/DISC/PDP 等)
Route::post('test/submit', 'api.Test/submit');
// 简历综合分析(基于人脸/MBTI/PDP/DISC 最近一次结果)
Route::post('resume/analyze', 'api.Analyze/resumeAnalysis');
// 支付与订单
Route::post('payment/create', 'api.Payment/create');
Route::post('payment/notify', 'api.Payment/notify');
Route::get('payment/query', 'api.Payment/query');
// 当前用户订单列表(小程序「我的订单」)
Route::get('orders', 'api.Order/index');
// 分销
Route::post('distribution/bind', 'api.Distribution/bind');
Route::get('distribution/my-invite-code', 'api.Distribution/myInviteCode');
Route::get('distribution/stats', 'api.Distribution/stats');
Route::get('distribution/bindings', 'api.Distribution/bindings');
Route::get('distribution/commissions', 'api.Distribution/commissions');
Route::post('distribution/withdraw', 'api.Distribution/withdraw');
Route::get('distribution/withdrawals', 'api.Distribution/withdrawals');
Route::post('distribution/withdrawals/query-transfer', 'api.Distribution/queryTransfer');
Route::get('distribution/qrcode', 'api.Distribution/qrcode');
Route::get('distribution/poster', 'api.Distribution/poster');
// 小程序主动触发出站推送(与主业务接口解耦)
Route::post('push-hook/trigger', 'api.PushHook/trigger');
// 微信商家转账结果回调(无需登录,但需配置到微信商户平台)
Route::post('wechat/transfer/notify', 'api.WechatTransferNotify/notify')->middleware('cors');
// 存客宝获客线索上报
Route::post('crm/report', 'api.CrmReport/report');
// ==================== 神仙 AI需要微信登录====================
Route::post('ai/chat', 'api.AiChat/chat');
Route::get('ai/chat/job', 'api.AiChat/chatJobStatus');
Route::get('ai/conversations', 'api.AiChat/conversations');
Route::get('ai/conversations/:id/messages', 'api.AiChat/messages');
Route::post('ai/transcribe', 'api.AiChat/transcribe');
// AI 深度画像报告
Route::post('ai/report/create', 'api.AiReport/create');
Route::get('ai/report/my-latest', 'api.AiReport/myLatest');
// 无歧义别名(避免网关/旧路由把 my-latest 吞掉或误匹配)
Route::get('ai/my-report/latest', 'api.AiReport/myLatest');
// :id 仅匹配数字,避免 my-latest 被误路由到 show 导致 404
Route::get('ai/report/:id', 'api.AiReport/show')->pattern(['id' => '\d+']);
Route::post('ai/report/:id/mark-paid-dev', 'api.AiReport/markPaidDev');
Route::post('ai/report/:id/regenerate', 'api.AiReport/regenerate');
// 高考志愿(小程序登录后)
Route::get('gaokao/task-status', 'api.Gaokao/taskStatus');
Route::get('gaokao/form', 'api.Gaokao/myForm');
Route::post('gaokao/form', 'api.Gaokao/saveForm');
Route::post('gaokao/analyze', 'api.Gaokao/analyze');
Route::get('gaokao/report/my-latest', 'api.Gaokao/latestReport');
Route::get('gaokao/pricing', 'api.Gaokao/pricing');
})->middleware(['cors', 'auth']);
// ==================== 兼容 /api/v1 前缀(与上方 api 组同权、同中间件)====================
// 部分 CDN / 网关 / 旧客户端只放行 /api/v1/*,会导致 POST /api/ai/chat 404此处镜像神仙 AI 相关路由
Route::group('api/v1', function () {
Route::post('ai/chat', 'api.AiChat/chat');
Route::get('ai/chat/job', 'api.AiChat/chatJobStatus');
Route::get('ai/conversations', 'api.AiChat/conversations');
Route::get('ai/conversations/:id/messages', 'api.AiChat/messages');
Route::post('ai/transcribe', 'api.AiChat/transcribe');
Route::post('ai/report/create', 'api.AiReport/create');
Route::get('ai/report/my-latest', 'api.AiReport/myLatest');
Route::get('ai/my-report/latest', 'api.AiReport/myLatest');
Route::get('ai/report/:id', 'api.AiReport/show')->pattern(['id' => '\d+']);
Route::post('ai/report/:id/mark-paid-dev', 'api.AiReport/markPaidDev');
Route::post('ai/report/:id/regenerate', 'api.AiReport/regenerate');
})->middleware(['cors', 'auth']);
// ==================== 小程序API路由匹配前端 /api 路径)====================
// 小程序公开API路由不需要认证- 与前端共用上面 api 组,此处可不再重复
// 小程序需要认证的API路由 - 与前端共用上面 api 组
// ==================== 普通管理员API路由匹配前端 /api/v1/admin 路径)====================
// 普通管理员认证路由(不需要认证)
Route::group('api/v1/admin', function () {
// 普通管理员登录
Route::post('auth/login', 'admin.Auth/adminLogin');
// 刷新Token
Route::post('auth/refresh', 'admin.Auth/refresh');
})->middleware('cors');
// 普通管理员路由(需要认证)
Route::group('api/v1/admin', function () {
// 管理员认证
Route::get('auth/me', 'admin.Auth/me');
Route::post('auth/logout', 'admin.Auth/logout');
// 仪表盘统计
Route::get('dashboard', 'admin.Dashboard/index');
// 邀请二维码
Route::get('invite/qrcode', 'admin.Invite/qrcode');
// 通用上传
Route::post('upload/image', 'admin.Upload/image');
// 测试用户(小程序用户,只读列表与详情)
Route::get('test-records/:id', 'admin.AppUser/testRecord');
Route::get('app-users/:id', 'admin.AppUser/detail');
Route::get('app-users', 'admin.AppUser/index');
Route::get('gaokao-users/:id', 'admin.GaokaoUser/detail');
Route::get('gaokao-users', 'admin.GaokaoUser/index');
// 订单列表(含用户与关联测试数据)
Route::get('orders', 'admin.Order/index');
// 用户管理(普通管理员和企业管理员,后台账号)
Route::get('users', 'admin.User/index');
Route::get('users/:id', 'admin.User/detail');
Route::post('users', 'admin.User/create');
Route::put('users/:id', 'admin.User/update');
Route::delete('users/:id', 'admin.User/delete');
Route::put('users/:id/status', 'admin.User/toggleStatus');
// 题库管理(企业管理员和普通管理员)
Route::get('questions/:id', 'admin.Question/detail');
Route::get('questions', 'admin.Question/index');
Route::post('questions', 'admin.Question/create');
Route::put('questions/:id', 'admin.Question/update');
Route::delete('questions/:id', 'admin.Question/delete');
Route::put('questions/:id/status', 'admin.Question/toggleStatus');
Route::post('questions/batch-import', 'admin.Question/batchImport');
// 定价管理(普通管理员)
Route::get('pricing', 'admin.Pricing/index');
Route::put('pricing', 'admin.Pricing/update');
// 系统设置(普通管理员,子路径放前面避免被 settings 吞掉)
Route::get('settings/push-hook', 'admin.Settings/getPushHookConfig');
Route::put('settings/push-hook', 'admin.Settings/updatePushHookConfig');
Route::post('settings/push-hook/test', 'admin.Settings/testPushHookConfig');
Route::post('settings/push-hook/test-result', 'admin.Settings/testPushHookTestResult');
Route::get('settings/miniprogram', 'admin.Settings/getMiniprogramConfig');
Route::put('settings/miniprogram', 'admin.Settings/updateMiniprogramConfig');
Route::get('settings/poster', 'admin.Settings/getPosterConfig');
Route::put('settings/poster', 'admin.Settings/updatePosterConfig');
Route::get('settings/fonts', 'admin.Settings/getFonts');
Route::get('settings/cunkebao-keys', 'admin.Settings/getCunkebaoKeys');
Route::put('settings/cunkebao-keys', 'admin.Settings/updateCunkebaoKeys');
Route::put('settings/credentials', 'admin.Settings/updateCredentials');
Route::get('settings', 'admin.Settings/index');
// 企业功能开关(企业管理员,受超管 permissionsCeiling 约束)
Route::get('enterprise/permissions', 'admin.EnterprisePermissions/index');
Route::put('enterprise/permissions', 'admin.EnterprisePermissions/update');
Route::get('enterprise/cooperation-modes', 'admin.EnterpriseCooperation/get');
Route::put('enterprise/cooperation-modes', 'admin.EnterpriseCooperation/update');
Route::get('enterprise/cooperation-choices/export', 'admin.EnterpriseCooperation/exportChoices');
Route::get('enterprise/cooperation-choices', 'admin.EnterpriseCooperation/listChoices');
// 分销管理(企业管理员)
Route::get('distribution/overview', 'admin.Distribution/overview');
Route::get('distribution/distributors', 'admin.Distribution/distributors');
Route::get('distribution/bindings', 'admin.Distribution/bindings');
Route::get('distribution/commissions', 'admin.Distribution/commissions');
Route::get('distribution/withdrawals', 'admin.Distribution/withdrawals');
Route::post('distribution/withdrawals/:id/approve', 'admin.Distribution/approveWithdrawal');
Route::post('distribution/withdrawals/:id/reject', 'admin.Distribution/rejectWithdrawal');
Route::get('distribution/settings', 'admin.Distribution/settings');
Route::put('distribution/settings', 'admin.Distribution/updateSettings');
// 企业财务(企业管理员)
Route::get('finance/overview', 'admin.Finance/overview');
Route::get('finance/records', 'admin.Finance/records');
Route::post('finance/recharge-qrcode', 'admin.Finance/rechargeQrcode');
Route::post('finance/recharge', 'admin.Finance/rechargeQrcode');
})->middleware(['cors', 'auth']);
// ==================== 超级管理员API路由匹配前端 /api/v1/superadmin 路径)====================
// 超级管理员认证路由(不需要认证)
Route::group('api/v1/superadmin', function () {
// 超级管理员登录
Route::post('auth/login', 'superadmin.Auth/login');
// 刷新Token
Route::post('auth/refresh', 'superadmin.Auth/refresh');
})->middleware('cors');
// 超级管理员路由(需要认证)
Route::group('api/v1/superadmin', function () {
// 超级管理员认证
Route::get('auth/me', 'superadmin.Auth/me');
Route::post('auth/logout', 'superadmin.Auth/logout');
// 全平台订单列表(与 admin.Order 共用逻辑,超管不限企业)
Route::get('orders', 'admin.Order/index');
// 将无 enterpriseId 的订单/测试等归并到指定企业(仅超管;默认预览)
Route::post('data-migration/attach-orphan-orders', 'superadmin.DataMigration/attachOrphanOrders');
// 将全平台无归属测试记录/小程序用户并入「存客宝」或指定企业(仅超管)
Route::post('data-migration/attach-orphans-to-cunkbao', 'superadmin.DataMigration/attachOrphansToCunkbao');
// 企业管理(超管专用)
// 注意:带参数的路由要放在不带参数的路由之前,避免路由匹配冲突
Route::get('enterprises/:id/cooperation-modes', 'superadmin.EnterpriseCooperation/get')->pattern(['id' => '\d+']);
Route::put('enterprises/:id/cooperation-modes', 'superadmin.EnterpriseCooperation/update')->pattern(['id' => '\d+']);
Route::get('enterprises/:id/cooperation-choices/export', 'superadmin.EnterpriseCooperation/exportUserChoices')->pattern(['id' => '\d+']);
Route::get('enterprises/:id/cooperation-choices', 'superadmin.EnterpriseCooperation/listUserChoices')->pattern(['id' => '\d+']);
Route::get('enterprises/:id/detail', 'superadmin.Enterprise/detail'); // 详细详情接口
Route::get('enterprises/:id', 'superadmin.Enterprise/detail');
Route::get('enterprises', 'superadmin.Enterprise/index');
Route::post('enterprises', 'superadmin.Enterprise/create');
Route::put('enterprises/:id', 'superadmin.Enterprise/update');
Route::delete('enterprises/:id', 'superadmin.Enterprise/delete');
Route::put('enterprises/:id/status', 'superadmin.Enterprise/toggleStatus');
// 题库管理(超管专用,管理超管题库)
Route::get('questions/:id', 'superadmin.Question/detail');
Route::get('questions', 'superadmin.Question/index');
Route::post('questions', 'superadmin.Question/create');
Route::put('questions/:id', 'superadmin.Question/update');
Route::delete('questions/:id', 'superadmin.Question/delete');
Route::put('questions/:id/status', 'superadmin.Question/toggleStatus');
Route::post('questions/batch-import', 'superadmin.Question/batchImport');
// 全局定价管理(超管专用)
Route::get('pricing', 'superadmin.Pricing/index');
Route::put('pricing', 'superadmin.Pricing/update');
Route::post('pricing/batch-update', 'superadmin.Pricing/batchUpdate');
// AI服务商配置管理超管专用
Route::get('ai-config', 'superadmin.AiConfig/index');
Route::put('ai-config', 'superadmin.AiConfig/update');
Route::post('ai-config/batch-update', 'superadmin.AiConfig/batchUpdate');
Route::post('ai-config/query-balance', 'superadmin.AiConfig/queryBalance');
Route::post('ai-config/query-all-balances', 'superadmin.AiConfig/queryAllBalances');
// 数据库管理(超管专用)
Route::get('database/info', 'superadmin.Database/info');
Route::get('database/tables', 'superadmin.Database/tables');
Route::get('database/view-table', 'superadmin.Database/viewTable');
Route::post('database/export-table', 'superadmin.Database/exportTable');
Route::post('database/clear-table', 'superadmin.Database/clearTable');
Route::post('database/backup', 'superadmin.Database/backup');
Route::get('database/backups', 'superadmin.Database/backups');
Route::delete('database/backups/:id', 'superadmin.Database/delete');
Route::post('database/backups/delete', 'superadmin.Database/delete');
Route::get('database/download', 'superadmin.Database/download');
Route::post('database/restore', 'superadmin.Database/restore');
// 通用上传(超管)
Route::post('upload/image', 'admin.Upload/image');
// 系统设置(超管专用,子路径放前面避免被 settings 吞掉)
Route::get('settings/push-hook', 'superadmin.Settings/getPushHookConfig');
Route::put('settings/push-hook', 'superadmin.Settings/updatePushHookConfig');
Route::post('settings/push-hook/test', 'superadmin.Settings/testPushHookConfig');
Route::post('settings/push-hook/test-result', 'superadmin.Settings/testPushHookTestResult');
Route::get('settings/fonts', 'superadmin.Settings/getFonts');
Route::get('settings/poster', 'superadmin.Settings/getPosterConfig');
Route::put('settings/poster', 'superadmin.Settings/updatePosterConfig');
Route::put('settings/review-mode', 'superadmin.Settings/updateReviewMode');
Route::post('settings/wechat-audit-sync', 'superadmin.Settings/syncWechatAuditStatus');
Route::get('settings', 'superadmin.Settings/index');
Route::put('settings/system', 'superadmin.Settings/updateSystem');
Route::put('settings/report-requires-payment', 'superadmin.Settings/updateReportRequiresPayment');
Route::put('settings/notification', 'superadmin.Settings/updateNotification');
Route::put('settings/prompts', 'superadmin.Settings/updatePrompts');
Route::put('settings/credentials', 'superadmin.Settings/updateCredentials');
// 测试用户(超管专用)
Route::get('app-users/overview', 'superadmin.AppUser/overview');
Route::get('test-records/:id', 'superadmin.AppUser/testRecord');
Route::get('app-users/:id', 'superadmin.AppUser/detail');
Route::get('app-users', 'superadmin.AppUser/index');
Route::get('gaokao-users/:id', 'superadmin.GaokaoUser/detail');
Route::get('gaokao-users', 'superadmin.GaokaoUser/index');
// 数据概览(超管专用,子路径放前面避免被 overview 吞掉)
Route::get('overview/recent-dynamics', 'superadmin.Overview/recentDynamics');
Route::get('overview/enterprise-ranking', 'superadmin.Overview/enterpriseRanking');
Route::get('overview/test-trends', 'superadmin.Overview/testTrends');
Route::get('overview', 'superadmin.Overview/index');
// 超管邀请小程序码(与企业后台同一控制层逻辑,企业版需 enterpriseId 或系统默认企业)
Route::get('invite/qrcode', 'admin.Invite/qrcode');
// 财务管理(超管专用)
Route::get('finance/overview', 'superadmin.Finance/overview');
Route::get('finance/revenue-details', 'superadmin.Finance/revenueDetails');
Route::get('finance/cost-details', 'superadmin.Finance/costDetails');
Route::get('finance/recharge-records', 'superadmin.Finance/rechargeRecords');
Route::get('finance/payment-records', 'superadmin.Finance/paymentRecords');
Route::post('finance/export', 'superadmin.Finance/export');
// 分销管理(超管专用 - 个人版全平台视图)
Route::get('distribution/overview', 'superadmin.Distribution/overview');
Route::get('distribution/bindings', 'superadmin.Distribution/bindings');
Route::get('distribution/commissions', 'superadmin.Distribution/commissions');
Route::get('distribution/withdrawals', 'superadmin.Distribution/withdrawals');
Route::post('distribution/withdrawals/:id/approve', 'superadmin.Distribution/approveWithdrawal');
Route::post('distribution/withdrawals/:id/reject', 'superadmin.Distribution/rejectWithdrawal');
Route::get('distribution/settings', 'superadmin.Distribution/settings');
Route::put('distribution/settings', 'superadmin.Distribution/updateSettings');
// 小程序埋点统计(仅超管)
Route::get('analytics/summary', 'superadmin.Analytics/summary');
Route::get('analytics/events', 'superadmin.Analytics/events');
Route::get('analytics/user-journey', 'superadmin.Analytics/userJourney');
Route::get('analytics/share-stats', 'superadmin.Analytics/shareStats');
Route::get('analytics/share-funnel', 'superadmin.Analytics/shareFunnel');
// Soul 文章采集与推荐(一场 soul 创业实验引流)
Route::get('soul-articles/ai-chat-display', 'superadmin.SoulArticle/aiChatDisplayGet');
Route::post('soul-articles/ai-chat-display', 'superadmin.SoulArticle/aiChatDisplaySave');
Route::post('soul-articles/sync', 'superadmin.SoulArticle/sync');
Route::post('soul-articles/:id/recommend', 'superadmin.SoulArticle/recommend');
Route::post('soul-articles/:id/order', 'superadmin.SoulArticle/setOrder');
Route::post('soul-articles/reorder-normalize', 'superadmin.SoulArticle/normalizeOrder');
Route::post('soul-articles/:id/delete', 'superadmin.SoulArticle/remove');
Route::get('soul-articles', 'superadmin.SoulArticle/index');
// 神仙 AI 健康与欠费监控
Route::get('ai/health', 'superadmin.SoulArticle/health');
Route::post('ai/balance-check', 'superadmin.AiMonitor/balanceCheck');
// 小程序 TabBar 后台可配
Route::get('tabbar', 'superadmin.MpTabBar/index');
Route::post('tabbar/save', 'superadmin.MpTabBar/save');
Route::post('tabbar/reorder', 'superadmin.MpTabBar/reorder');
Route::post('tabbar/:id/delete', 'superadmin.MpTabBar/remove');
// 分账规则
Route::get('profit-rules', 'superadmin.ProfitRule/index');
Route::post('profit-rules/save', 'superadmin.ProfitRule/save');
Route::post('profit-rules/:id/toggle', 'superadmin.ProfitRule/toggle');
})->middleware(['cors', 'auth', 'superadmin']);
// ==================== 兼容旧版路由(保留,逐步废弃)====================
// 管理后台认证路由(不需要认证)- 兼容旧版
Route::group('api/v1', function () {
// 管理员登录(兼容旧版)
Route::post('auth/admin/login', 'admin.Auth/adminLogin');
// 超级管理员登录(兼容旧版)
Route::post('auth/superadmin/login', 'superadmin.Auth/login');
// 刷新Token兼容旧版
Route::post('auth/refresh', 'admin.Auth/refresh');
})->middleware('cors');
// 管理后台路由(需要认证)- 兼容旧版
Route::group('api/v1', function () {
// 管理员认证(兼容旧版)
Route::get('auth/me', 'admin.Auth/me');
Route::post('auth/logout', 'admin.Auth/logout');
// 仪表盘统计(兼容旧版)
Route::get('dashboard', 'admin.Dashboard/index');
// 通用上传(兼容旧版)
Route::post('upload/image', 'admin.Upload/image');
// 用户管理(兼容旧版)
Route::get('users', 'admin.User/index');
Route::get('users/:id', 'admin.User/detail');
Route::post('users', 'admin.User/create');
Route::put('users/:id', 'admin.User/update');
Route::delete('users/:id', 'admin.User/delete');
Route::put('users/:id/status', 'admin.User/toggleStatus');
// 企业管理(超管,兼容旧版)
// 注意:带参数的路由要放在不带参数的路由之前,避免路由匹配冲突
Route::get('enterprises/:id/cooperation-modes', 'superadmin.EnterpriseCooperation/get')->pattern(['id' => '\d+']);
Route::put('enterprises/:id/cooperation-modes', 'superadmin.EnterpriseCooperation/update')->pattern(['id' => '\d+']);
Route::get('enterprises/:id/cooperation-choices/export', 'superadmin.EnterpriseCooperation/exportUserChoices')->pattern(['id' => '\d+']);
Route::get('enterprises/:id/cooperation-choices', 'superadmin.EnterpriseCooperation/listUserChoices')->pattern(['id' => '\d+']);
Route::get('enterprises/:id/detail', 'superadmin.Enterprise/detail'); // 详细详情接口
Route::get('enterprises/:id', 'superadmin.Enterprise/detail');
Route::get('enterprises', 'superadmin.Enterprise/index');
Route::post('enterprises', 'superadmin.Enterprise/create');
Route::put('enterprises/:id', 'superadmin.Enterprise/update');
Route::delete('enterprises/:id', 'superadmin.Enterprise/delete');
Route::put('enterprises/:id/status', 'superadmin.Enterprise/toggleStatus');
// 题库管理(兼容旧版)
Route::get('questions/:id', 'admin.Question/detail');
Route::get('questions', 'admin.Question/index');
Route::post('questions', 'admin.Question/create');
Route::put('questions/:id', 'admin.Question/update');
Route::delete('questions/:id', 'admin.Question/delete');
Route::put('questions/:id/status', 'admin.Question/toggleStatus');
Route::post('questions/batch-import', 'admin.Question/batchImport');
// 企业财务(兼容旧版)
Route::get('finance/overview', 'admin.Finance/overview');
Route::get('finance/records', 'admin.Finance/records');
Route::post('finance/recharge-qrcode', 'admin.Finance/rechargeQrcode');
Route::post('finance/recharge', 'admin.Finance/rechargeQrcode');
})->middleware(['cors', 'auth']);
// ==================== 兼容旧版路由(保留)====================
// 后台管理认证路由(不需要认证)- 兼容旧版
Route::group('api/admin', function () {
// 管理员登录
Route::post('auth/login', 'admin.Auth/login');
Route::post('auth/refresh', 'admin.Auth/refresh');
})->middleware('cors');
// 后台管理路由(需要认证)- 兼容旧版
Route::group('api/admin', function () {
// 管理员认证
Route::get('auth/me', 'admin.Auth/me');
Route::post('auth/logout', 'admin.Auth/logout');
// 仪表盘统计
Route::get('dashboard', 'admin.Dashboard/index');
// 通用上传
Route::post('upload/image', 'admin.Upload/image');
// 用户管理
Route::get('users', 'admin.User/index');
Route::get('users/:id', 'admin.User/detail');
Route::post('users', 'admin.User/create');
Route::put('users/:id', 'admin.User/update');
Route::delete('users/:id', 'admin.User/delete');
Route::put('users/:id/status', 'admin.User/toggleStatus');
// 企业财务
Route::get('finance/overview', 'admin.Finance/overview');
Route::get('finance/records', 'admin.Finance/records');
Route::post('finance/recharge-qrcode', 'admin.Finance/rechargeQrcode');
Route::post('finance/recharge', 'admin.Finance/rechargeQrcode');
})->middleware(['cors', 'auth']);
// ==================== 兼容旧版路由(保留)====================
// 后台管理认证路由(不需要认证)- 兼容旧版
Route::group('api/admin', function () {
// 管理员登录
Route::post('auth/login', 'admin.Auth/login');
Route::post('auth/refresh', 'admin.Auth/refresh');
})->middleware('cors');
// 后台管理路由(需要认证)- 兼容旧版
Route::group('api/admin', function () {
// 管理员认证
Route::get('auth/me', 'admin.Auth/me');
Route::post('auth/logout', 'admin.Auth/logout');
// 仪表盘统计
Route::get('dashboard', 'admin.Dashboard/index');
// 通用上传
Route::post('upload/image', 'admin.Upload/image');
// 用户管理
Route::get('users', 'admin.User/index');
Route::get('users/:id', 'admin.User/detail');
Route::post('users', 'admin.User/create');
Route::put('users/:id', 'admin.User/update');
Route::delete('users/:id', 'admin.User/delete');
Route::put('users/:id/status', 'admin.User/toggleStatus');
// 企业财务
Route::get('finance/overview', 'admin.Finance/overview');
Route::get('finance/records', 'admin.Finance/records');
Route::post('finance/recharge-qrcode', 'admin.Finance/rechargeQrcode');
Route::post('finance/recharge', 'admin.Finance/rechargeQrcode');
})->middleware(['cors', 'auth']);