api.php 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340
  1. <?php
  2. use App\Http\Controllers\Account\AccountController;
  3. use App\Http\Controllers\DeepSeek\DeepSeekController;
  4. use App\Http\Controllers\Book\BookController;
  5. use App\Http\Controllers\Timbre\TimbreController;
  6. use App\Http\Controllers\AIGeneration\ImageGenerationController;
  7. use App\Http\Controllers\AIGeneration\VideoGenerationController;
  8. use App\Http\Controllers\Anime\AnimeController;
  9. use App\Http\Controllers\Canvas\CanvasController;
  10. use App\Http\Controllers\PromptTemplate\PromptTemplateController;
  11. use App\Http\Controllers\Points\PointsController;
  12. use App\Http\Controllers\Points\PointsStatsController;
  13. use App\Http\Controllers\Manage\ManageUserController;
  14. use App\Http\Controllers\Manage\ArtStyleController;
  15. use App\Http\Controllers\TaskCenter\TaskCenterController;
  16. use Illuminate\Support\Facades\Route;
  17. /*
  18. |--------------------------------------------------------------------------
  19. | API Routes
  20. |--------------------------------------------------------------------------
  21. |
  22. | Here is where you can register API routes for your application. These
  23. | routes are loaded by the RouteServiceProvider within a group which
  24. | is assigned the "api" middleware group. Enjoy building your API!
  25. |
  26. */
  27. Route::group(['middleware' => ['bindToken', 'bindExportToken', 'checkLogin']], function () {
  28. Route::get('userInfo', [AccountController::class, 'userInfo']); // 获取用户信息
  29. Route::group(['prefix' => 'book'], function () {
  30. // 书籍管理
  31. Route::get('list', [BookController::class, 'bookList']);
  32. Route::get('all', [BookController::class, 'allBooks']);
  33. Route::get('chapterList', [BookController::class, 'chapterList']);
  34. Route::get('chapterContent', [BookController::class, 'chapterContent']);
  35. // 海外小说
  36. Route::get('overseasBookList', [BookController::class, 'overseasBookList']);
  37. Route::get('overseasBooks', [BookController::class, 'overseasBooks']);
  38. // 版本管理
  39. Route::get('addVersion', [BookController::class, 'addBookVersion']);
  40. Route::get('editVersion', [BookController::class, 'editBookVersion']);
  41. Route::get('bookVersion', [BookController::class, 'bookVersion']);
  42. Route::get('versionList', [BookController::class, 'versionList']);
  43. Route::get('taskList', [BookController::class, 'taskList']);
  44. Route::get('taskDetail', [BookController::class, 'taskDetail']);
  45. // 音效
  46. Route::get('audioEffects', [BookController::class, 'audioEffects']);
  47. Route::get('audioEffectList', [BookController::class, 'audioEffectList']);
  48. Route::post('editAudioEffect', [BookController::class, 'editAudioEffect']);
  49. // bgm
  50. Route::get('bgms', [BookController::class, 'bgms']);
  51. Route::get('bgmList', [BookController::class, 'bgmList']);
  52. Route::post('editBgm', [BookController::class, 'editBgm']);
  53. });
  54. Route::group(['middleware' => ['bindToken', 'bindExportToken', 'checkLogin', 'checkSign'], 'prefix' => 'book'], function () {
  55. Route::post('uploadAudioEffect', [BookController::class, 'uploadAudioEffect']);
  56. Route::post('uploadBgm', [BookController::class, 'uploadBgm']);
  57. });
  58. Route::group(['prefix' => 'timbre'], function () {
  59. Route::get('addCategory', [TimbreController::class, 'addCategory']);
  60. Route::get('editCategory', [TimbreController::class, 'editCategory']);
  61. Route::get('categoryList', [TimbreController::class, 'categoryList']);
  62. Route::get('list', [TimbreController::class, 'timbreList']);
  63. Route::get('timbreCategories', [TimbreController::class, 'timbreCategories']);
  64. Route::get('edit', [TimbreController::class, 'editTimbre']);
  65. Route::get('groupList', [TimbreController::class, 'timbreGroupList']);
  66. Route::post('addGroup', [TimbreController::class, 'addTimbreGroup']);
  67. Route::post('editGroup', [TimbreController::class, 'editTimbreGroup']);
  68. // 情绪组
  69. Route::get('emotionGroupList', [TimbreController::class, 'emotionGroupList']);
  70. Route::post('addEmotionGroup', [TimbreController::class, 'addEmotionGroup']);
  71. Route::post('editEmotionGroup', [TimbreController::class, 'editEmotionGroup']);
  72. Route::get('delEmotionGroup', [TimbreController::class, 'delEmotionGroup']);
  73. });
  74. Route::group(['prefix' => 'points'], function () {
  75. // 积分流水
  76. Route::get('records', [PointsController::class, 'records']);
  77. // 积分明细导出(筛选条件与列表一致)
  78. Route::get('records/export', [PointsController::class, 'exportRecords']);
  79. // 统计系统:列表 / 筛选项 / 导出
  80. Route::get('stats/export', [PointsStatsController::class, 'export']);
  81. Route::get('stats/filters', [PointsStatsController::class, 'filters']);
  82. Route::get('stats', [PointsStatsController::class, 'stats']);
  83. Route::get('rules', [PointsController::class, 'rules']); // 获取积分规则
  84. Route::post('editRule', [PointsController::class, 'editRules']); // 编辑积分规则
  85. Route::post('grant', [PointsController::class, 'grantPoints']); // 发放/回收积分(平台→组织 / 组织→同公司组员,uid支持逗号分隔批量)
  86. Route::get('grantUsers', [PointsController::class, 'grantUsers']); // 可发放积分用户列表
  87. });
  88. Route::group(['prefix' => 'account'], function () {
  89. Route::get('list', [ManageUserController::class, 'list']); // 用户列表(超管全部 / 管理员自己+组员)
  90. Route::post('add', [ManageUserController::class, 'add']); // 添加账号(超管选公司/角色,管理员默认本公司且仅组员)
  91. Route::post('edit', [ManageUserController::class, 'edit']); // 修改用户(昵称/密码/是否启用/角色)
  92. Route::get('delete', [ManageUserController::class, 'delete']); // 删除用户(超管删 admin/user,管理员删自己的组员)
  93. Route::get('roleOptions', [ManageUserController::class, 'roleOptions']); // 角色可选项(超管 admin/user,管理员仅 user)
  94. });
  95. Route::group(['prefix' => 'company'], function () {
  96. Route::get('list', [ManageUserController::class, 'companyList']); // 公司列表(不带分页)
  97. });
  98. Route::group(['prefix' => 'artStyle'], function () {
  99. Route::get('adminList', [ArtStyleController::class, 'adminList']); // 画风管理列表(分页)
  100. Route::post('add', [ArtStyleController::class, 'add']); // 新增画风(图片URL必填)
  101. Route::post('edit', [ArtStyleController::class, 'edit']); // 修改画风(图片URL必填)
  102. Route::get('delete', [ArtStyleController::class, 'delete']); // 删除画风(软删除)
  103. });
  104. Route::group(['prefix' => 'deepseek'], function () {
  105. Route::post('chatWithReasoner', [DeepSeekController::class, 'chatWithReasoner']);
  106. Route::get('timbreList', [DeepSeekController::class, 'timbreList']);
  107. Route::get('paragraphAudios', [DeepSeekController::class, 'paragraphAudios']);
  108. Route::post('addGenerateTask', [DeepSeekController::class, 'addGenerateTask']);
  109. Route::get('setStsToken', [DeepSeekController::class, 'setStsToken']);
  110. Route::get('resetParagraphAudio', [DeepSeekController::class, 'resetParagraphAudio']);
  111. Route::post('saveParagraphAudio', [DeepSeekController::class, 'saveParagraphAudio']);
  112. Route::get('emotionGroups', [DeepSeekController::class, 'emotionGroups']);
  113. Route::post('insertAudioEffect', [DeepSeekController::class, 'insertAudioEffect']);
  114. Route::post('insertBgm', [DeepSeekController::class, 'insertBgm']);
  115. });
  116. Route::group(['middleware' => ['checkSign', 'checkCompany']], function () {
  117. Route::group(['prefix' => 'deepseek'], function () {
  118. // 剧本管理
  119. Route::get('scriptList', [DeepSeekController::class, 'scriptList']);
  120. Route::get('scripts', [DeepSeekController::class, 'scripts']);
  121. Route::get('scriptInfo', [DeepSeekController::class, 'scriptInfo']);
  122. Route::get('createScript', [DeepSeekController::class, 'createScript']);
  123. Route::post('editScript', [DeepSeekController::class, 'editScript']);
  124. Route::get('delScript', [DeepSeekController::class, 'delScript']);
  125. Route::get('createEpisode', [DeepSeekController::class, 'createEpisode']);
  126. Route::get('editEpisode', [DeepSeekController::class, 'editEpisode']);
  127. Route::get('delEpisode', [DeepSeekController::class, 'delEpisode']);
  128. Route::get('exportScript', [DeepSeekController::class, 'exportScript']);
  129. Route::get('getBookContent', [DeepSeekController::class, 'getBookContent']);
  130. Route::post('chatWithFile', [DeepSeekController::class, 'chatWithFile']);
  131. Route::post('chatWithFileStream', [DeepSeekController::class, 'chatWithFileStream']);
  132. Route::post('generateEpisodes', [DeepSeekController::class, 'generateEpisodes']);
  133. Route::get('getEpisodeContent', [DeepSeekController::class, 'getEpisodeContent']);
  134. Route::post('saveEpisodeContent', [DeepSeekController::class, 'saveEpisodeContent']);
  135. Route::post('saveScriptChatHistory', [DeepSeekController::class, 'saveScriptChatHistory']); // 保存剧本沟通历史记录
  136. Route::get('getScriptChatHistory', [DeepSeekController::class, 'getScriptChatHistory']); // 获取剧本历史对话记录
  137. });
  138. // AI生成
  139. Route::group(['prefix' => 'AIGeneration'], function () {
  140. // 图片生成相关路由
  141. Route::post('image/createTask', [ImageGenerationController::class, 'createTask']);
  142. Route::post('image/upscale', [ImageGenerationController::class, 'upscaleImage']); // 图片超清(超分辨率)放大
  143. Route::get('image/taskStatus', [ImageGenerationController::class, 'taskStatus']);
  144. Route::get('image/taskList', [ImageGenerationController::class, 'taskList']);
  145. // 视频生成相关路由
  146. Route::get('video/taskList', [VideoGenerationController::class, 'taskList']);
  147. // 即梦AI3.0视频生成路由
  148. Route::post('video/createJimengTask', [VideoGenerationController::class, 'createJimengTask']);
  149. Route::get('video/taskStatus', [VideoGenerationController::class, 'taskStatus']);
  150. // Seedance 1.5 Pro 视频生成路由
  151. Route::post('video/createSeedanceTask', [VideoGenerationController::class, 'createSeedanceTask']);
  152. // Route::get('video/seedance/taskStatus/{taskId}', [VideoGenerationController::class, 'getSeedanceTaskStatus']);
  153. // 快快AI真人素材库相关路由
  154. Route::post('video/kuaikuaiAsset/upload', [VideoGenerationController::class, 'kuaikuaiAssetUpload']); // 上传素材(单个或批量)
  155. Route::get('video/kuaikuaiAsset/status', [VideoGenerationController::class, 'kuaikuaiAssetStatus']); // 查询素材是否可用于生成视频
  156. Route::get('video/kuaikuaiAsset/list', [VideoGenerationController::class, 'kuaikuaiAssetList']); // 本地素材列表
  157. Route::post('video/kuaikuaiAsset/delete', [VideoGenerationController::class, 'kuaikuaiAssetDelete']); // 删除素材
  158. // 可灵Omni视频生成路由
  159. Route::post('video/createKelingTask', [VideoGenerationController::class, 'createKelingTask']);
  160. Route::get('video/keling/taskStatus/{taskId}', [VideoGenerationController::class, 'getKelingTaskStatus']);
  161. // 主体管理相关路由
  162. Route::post('element/create', [VideoGenerationController::class, 'createElement']);
  163. Route::get('element/status/{taskId}', [VideoGenerationController::class, 'getElementStatus']);
  164. Route::get('element/list', [VideoGenerationController::class, 'getElementsList']);
  165. Route::post('element/delete', [VideoGenerationController::class, 'deleteElement']);
  166. Route::get('element/local/list', [VideoGenerationController::class, 'getLocalElementsList']);
  167. });
  168. // 动漫管理
  169. Route::group(['prefix' => 'anime'], function () {
  170. Route::get('textModel', [AnimeController::class, 'textModel']); // 文字模型
  171. Route::get('imageModel', [AnimeController::class, 'imageModel']); // 图片模型
  172. Route::get('videoModel', [AnimeController::class, 'videoModel']); // 视频模型
  173. Route::get('seedanceModelOptions', [AnimeController::class, 'seedanceModelOptions']); // Seedance模型生成参数选项
  174. Route::get('artStyleList', [AnimeController::class, 'artStyleList']); // 艺术风格列表
  175. Route::post('create', [AnimeController::class, 'createAnime']); // 创建动漫
  176. Route::post('edit', [AnimeController::class, 'editAnime']); // 编辑动漫
  177. Route::get('delete', [AnimeController::class, 'delAnime']); // 删除动漫
  178. Route::post('addChat', [DeepSeekController::class, 'addChat']); // 新增动漫对话
  179. Route::post('reGenerateAnime', [DeepSeekController::class, 'reGenerateAnime']); // 调整动漫大纲
  180. Route::get('chatList', [AnimeController::class, 'chatList']); // 动漫列表
  181. Route::get('chatHistory', [AnimeController::class, 'chatHistory']); // 动漫对话历史
  182. Route::post('chat', [DeepSeekController::class, 'chat']); // 动漫对话
  183. Route::get('detail', [AnimeController::class, 'animeDetail']); // 动漫大纲
  184. Route::get('episodeInfo', [AnimeController::class, 'episodeInfo']); // 动漫剧集
  185. Route::get('segmentInfo', [AnimeController::class, 'segmentInfo']); // 分镜信息
  186. Route::get('copyEpisodeVersion', [AnimeController::class, 'copyEpisodeVersion']); // 复制动漫剧集
  187. Route::get('episodeVersions', [AnimeController::class, 'episodeVersions']); // 剧集版本
  188. Route::get('bindEpisodeVersion', [AnimeController::class, 'bindEpisodeVersion']); // 绑定剧集版本
  189. Route::post('changeEpisodeRoles', [AnimeController::class, 'changeEpisodeRoles']); // 更改分集主体列表
  190. Route::post('changeEpisodeScenes', [AnimeController::class, 'changeEpisodeScenes']); // 更改分集场景列表
  191. Route::post('changeEpisodeProps', [AnimeController::class, 'changeEpisodeProps']); // 更改分集道具列表
  192. Route::post('editSegment', [AnimeController::class, 'editSegment']); // 编辑分镜
  193. Route::post('batchUploadImg', [ImageGenerationController::class, 'batchUploadImg']); // 批量上传图片
  194. Route::post('batchSetRoleImg', [AnimeController::class, 'batchSetRoleImg']); // 批量生成角色形象
  195. Route::post('batchSetSceneImg', [AnimeController::class, 'batchSetSceneImg']); // 批量生成场景图片
  196. Route::post('chatChangeImg', [AnimeController::class, 'chatChangeImg']); // 对话改图
  197. Route::post('batchSetSegmentPics', [AnimeController::class, 'batchSetSegmentPics']); // 一键生成分镜图片
  198. Route::post('reGenerateSegment', [AnimeController::class, 'reGenerateSegment']); // 重新生成分镜
  199. Route::post('addSegment', [AnimeController::class, 'addSegment']); // 新增分镜
  200. Route::post('copySegment', [AnimeController::class, 'copySegment']); // 复制分镜
  201. Route::post('moveSegment', [AnimeController::class, 'moveSegment']); // 移动分镜
  202. Route::post('delSegment', [AnimeController::class, 'delSegment']); // 删除分镜
  203. Route::get('applySegment', [AnimeController::class, 'applySegment']); // 应用分镜
  204. Route::post('addAct', [AnimeController::class, 'addAct']); // 新增片段
  205. Route::post('editAct', [AnimeController::class, 'editAct']); // 编辑片段
  206. Route::post('copyAct', [AnimeController::class, 'copyAct']); // 复制片段
  207. Route::post('moveAct', [AnimeController::class, 'moveAct']); // 移动片段
  208. Route::post('delAct', [AnimeController::class, 'delAct']); // 删除片段
  209. Route::get('applyAct', [AnimeController::class, 'applyAct']); // 应用片段
  210. Route::post('segmentHistory', [AnimeController::class, 'segmentHistory']); // 分镜历史图片/视频
  211. Route::get('segmentChatHistory', [AnimeController::class, 'segmentChatHistory']); // 分镜对话历史记录
  212. Route::post('createSegmentVideoTask', [AnimeController::class, 'createSegmentVideoTask']); // 分镜图片转视频
  213. Route::post('batchSetSegmentVideos', [AnimeController::class, 'batchSetSegmentVideos']); // 一键转视频
  214. Route::post('applyAudioData', [AnimeController::class, 'applyAudioData']); // 修改分镜音频参数
  215. Route::post('previewAudio', [AnimeController::class, 'previewAudio']); // 音频试听
  216. Route::get('episodePicsInfo', [AnimeController::class, 'episodePicsInfo']); // 获取主体和场景图片生成信息
  217. Route::get('clipSegmentVideo', [AnimeController::class, 'clipSegmentVideo']); // 裁剪视频
  218. Route::post('addChatForAce', [DeepSeekController::class, 'addChatForAce']); // 新增动漫对话
  219. Route::post('reGenerateAnimeForAce', [DeepSeekController::class, 'reGenerateAnimeForAce']); // 调整动漫大纲
  220. Route::post('chatForAce', [DeepSeekController::class, 'chatForAce']); // 动漫对话(全能模式)
  221. Route::post('regenerateSegmentScript', [DeepSeekController::class, 'regenerateSegmentScript']); // 重新生成分段剧本
  222. Route::post('saveEpisodeActs', [DeepSeekController::class, 'saveEpisodeActs']); // 保存剧集片段
  223. Route::post('batchGenerateEpisodes', [DeepSeekController::class, 'batchGenerateEpisodes']); // 批量生成多个分集
  224. Route::get('getBatchGenerationTaskStatus', [DeepSeekController::class, 'getBatchGenerationTaskStatus']); // 获取批量生成任务状态
  225. Route::get('episodeInfoForAce', [AnimeController::class, 'episodeInfoForAce']); // 动漫剧集(全能模式)
  226. Route::get('actChatHistory', [AnimeController::class, 'actChatHistory']); // 片段对话历史记录
  227. Route::get('confirmActs', [AnimeController::class, 'confirmActs']); // 确认片段分镜
  228. Route::get('saveActVideoGenerateParams', [AnimeController::class, 'saveActVideoGenerateParams']); // 保存生成视频参数
  229. Route::post('createActVideoTask', [AnimeController::class, 'createActVideoTask']); // 片段转视频
  230. Route::post('generateVideo', [AnimeController::class, 'generateVideo']); // 文生视频(通用)
  231. Route::post('batchSetActVideos', [AnimeController::class, 'batchSetActVideos']); // 片段一键转视频
  232. Route::post('previewCharge', [AnimeController::class, 'previewCharge']); // 预估视频生成积分(单一/批量)
  233. // 完整视频合成任务
  234. Route::get('createCompleteVideoTask', [AnimeController::class, 'createCompleteVideoTask']);
  235. Route::any('generateImg', [AnimeController::class, 'generateImg']); // 文生图(通用)
  236. Route::post('generateText', [DeepSeekController::class, 'generateText']); // 文生文(通用)
  237. Route::post('createGenerateText', [DeepSeekController::class, 'createGenerateText']); // 新建剧本对话
  238. Route::post('newGenerateText', [DeepSeekController::class, 'newGenerateText']); // 文生文(通用-非流式)
  239. Route::get('getScriptGenerateTasks', [DeepSeekController::class, 'getScriptGenerateTasks']); // 获取剧本资产生成任务列表
  240. // 监控分镜图片和音频生成任务进度(SSE)
  241. Route::get('segmentPicsInfo', [AnimeController::class, 'monitorSegmentTasks']);
  242. // 导出全部分镜
  243. Route::get('exportEpisodeImages', [AnimeController::class, 'exportEpisodeImages']);
  244. // 导出动漫剧本为PDF
  245. Route::get('exportScriptPdf', [AnimeController::class, 'exportAnimeScriptPdf']);
  246. Route::get('globalProducts', [AnimeController::class, 'globalProducts']); // 角色库
  247. Route::post('createProduct', [AnimeController::class, 'createProduct']); // 创建资产
  248. Route::post('editProduct', [AnimeController::class, 'editProduct']); // 编辑资产
  249. // Route::get('getRoleVersions', [AnimeController::class, 'getRoleVersions']); // 获取资产版本历史
  250. // Route::post('restoreRoleVersion', [AnimeController::class, 'restoreRoleVersion']); // 恢复到指定版本
  251. Route::get('deleteProduct', [AnimeController::class, 'deleteProduct']); // 删除资产
  252. Route::post('createFolder', [AnimeController::class, 'createFolder']); // 新建文件夹
  253. Route::post('renameFolder', [AnimeController::class, 'renameFolder']); // 重命名文件夹
  254. Route::post('moveRoleOrFolder', [AnimeController::class, 'moveProductOrFolder']); // 移动资产或文件夹
  255. Route::get('getFolderPath', [AnimeController::class, 'getFolderPath']); // 获取文件夹路径
  256. // 生成三视图(基于参考图生成主体的标准正面、侧面、后面三视图,主体完整。在最左侧添加主体正视图的特写,主体清晰完整。背景修改成纯白色,整体保持与参考图一致的美术风格和色彩搭配。画面无说明文字)
  257. Route::post('generateThreeView', [AnimeController::class, 'generateThreeView']);
  258. // 推送资产或文件夹到目标位置
  259. Route::post('pushProductOrFolder', [AnimeController::class, 'pushProductOrFolder']);
  260. // 剧本资产关联管理
  261. Route::post('saveScriptProducts', [AnimeController::class, 'saveScriptProducts']); // 保存剧本资产
  262. Route::post('importScriptProductsByExcel', [AnimeController::class, 'importScriptProductsByExcel']); // Excel导入剧本资产
  263. Route::post('transferScriptOwner', [AnimeController::class, 'transferScriptOwner']); // 转让剧本归属(剧本+关联资产)
  264. Route::get('getScriptProducts', [AnimeController::class, 'getScriptProducts']); // 获取剧本资产
  265. Route::get('getScriptTotalEpisodes', [AnimeController::class, 'getScriptTotalEpisodes']); // 获取剧本总集数
  266. // 提示词模板管理
  267. Route::get('promptTemplates', [PromptTemplateController::class, 'promptTemplates']); // 提示词模板列表
  268. Route::post('createPromptTemplate', [PromptTemplateController::class, 'createTemplate']); // 创建提示词模板
  269. Route::post('editPromptTemplate', [PromptTemplateController::class, 'editTemplate']); // 编辑提示词模板
  270. Route::get('deletePromptTemplate', [PromptTemplateController::class, 'deleteTemplate']); // 删除提示词模板
  271. // 任务中心
  272. Route::get('taskCenter/detail', [TaskCenterController::class, 'detail']); // 查询任务详情
  273. Route::get('taskCenter/list', [TaskCenterController::class, 'taskList']); // 任务列表(分页)
  274. });
  275. // 画布模式
  276. Route::group(['prefix' => 'canvas'], function () {
  277. Route::get('list', [CanvasController::class, 'canvasList']); // 画布列表
  278. Route::post('create', [CanvasController::class, 'createCanvas']); // 创建画布
  279. Route::post('edit', [CanvasController::class, 'editCanvas']); // 编辑画布
  280. Route::get('detail', [CanvasController::class, 'canvasDetail']); // 画布详情(节点+关系)
  281. Route::get('del', [CanvasController::class, 'delCanvas']); // 删除画布
  282. Route::post('saveNode', [CanvasController::class, 'saveNode']); // 保存节点(含分镜数据)
  283. Route::get('nodeInfo', [CanvasController::class, 'nodeInfo']); // 节点详情
  284. Route::post('delNode', [CanvasController::class, 'delNode']); // 删除节点
  285. Route::get('nodeRels', [CanvasController::class, 'nodeRels']); // 获取节点关联
  286. Route::post('saveRels', [CanvasController::class, 'saveRels']); // 保存节点关联
  287. Route::get('graph', [CanvasController::class, 'graph']); // 画布关系图
  288. });
  289. });
  290. });
  291. Route::get('login', [AccountController::class, 'login']); // 登录
  292. Route::get('logout', [AccountController::class, 'logout']); // 退出
  293. // seedance回调
  294. Route::any('video/seedanceCallback', [VideoGenerationController::class, 'seedanceCallback']);
  295. Route::any('{slug}',[AccountController::class, 'index'])->where('slug', '(.*)?');