Просмотр исходного кода

1.新增音色库2.新增验签中间件3.新增公司权限检查

lh 1 месяц назад
Родитель
Сommit
4bbbdb1af4

+ 4 - 0
app/Client/Site.php

@@ -52,4 +52,8 @@ class Site
     {
         return (string)getProp($this->site, 'token');
     }
+
+    public function getCpid() {
+        return (int)getProp($this->site, 'cpid');
+    }
 }

+ 28 - 0
app/Http/Controllers/Anime/AnimeController.php

@@ -2001,6 +2001,34 @@ class AnimeController extends BaseController
         $result = $this->AnimeService->deleteRole($data);
         return $this->success(['success' => $result ? 1 : 0]);
     }
+    
+    // 新建文件夹
+    public function createFolder(Request $request) {
+        $data = $request->all();
+        $result = $this->AnimeService->createFolder($data);
+        return $this->success(['id' => $result]);
+    }
+    
+    // 重命名文件夹或角色
+    public function renameFolder(Request $request) {
+        $data = $request->all();
+        $result = $this->AnimeService->renameFolder($data);
+        return $this->success(['success' => $result ? 1 : 0]);
+    }
+    
+    // 移动角色或文件夹
+    public function moveRoleOrFolder(Request $request) {
+        $data = $request->all();
+        $result = $this->AnimeService->moveRoleOrFolder($data);
+        return $this->success(['success' => $result ? 1 : 0]);
+    }
+    
+    // 获取文件夹路径(面包屑导航)
+    public function getFolderPath(Request $request) {
+        $data = $request->all();
+        $result = $this->AnimeService->getFolderPath($data);
+        return $this->success($result);
+    }
 
     // 生成三视图
     public function generateThreeView(Request $request) {

+ 1 - 0
app/Http/Kernel.php

@@ -68,6 +68,7 @@ class Kernel extends HttpKernel
         'bindToken'        => \App\Http\Middleware\BindToken::class,
         'bindExportToken'  => \App\Http\Middleware\BindExportToken::class,
         'checkSign'        => \App\Http\Middleware\CheckSign::class,
+        'checkCompany'     => \App\Http\Middleware\CheckCompany::class,
         'externalSignCheck' => \App\Http\Middleware\ExternalSignCheck::class,
     ];
 }

+ 57 - 0
app/Http/Middleware/CheckCompany.php

@@ -0,0 +1,57 @@
+<?php
+
+
+namespace App\Http\Middleware;
+
+use App\Cache\UserCache;
+use App\Consts\ErrorConst;
+use App\Libs\Utils;
+use App\Facade\Site;
+use App\Models\Channel\Channel;
+use Closure;
+use App\Exceptions\ApiException;
+use Illuminate\Support\Facades\Log;
+use Illuminate\Support\Facades\DB;
+
+class CheckCompany
+{
+    /**
+     * @param         $request
+     * @param Closure $next
+     * @return mixed
+     * @throws ApiException
+     */
+    public function handle($request, Closure $next)
+    {
+        $params = $request->all();
+        $token = $request->header('d-token', '');
+        if (!$token) Utils::throwError(ErrorConst::NOT_LOGIN);
+
+        if (env('CHECK_COMPANY')) {
+            $cpid = Site::getCpid();
+            
+            $script_id = getProp($params, 'script_id');
+            if ($script_id) {
+                if (!DB::table('mp_scripts')->where('id', $script_id)->where('cpid', $cpid)->value('id')) {
+                    Utils::throwError(ErrorConst::NOT_ACCESS);
+                }
+            }
+
+            $anime_id = getProp($params, 'anime_id');
+            if ($anime_id) {
+                if (!DB::table('mp_animes')->where('id', $anime_id)->where('cpid', $cpid)->value('id')) {
+                    Utils::throwError(ErrorConst::NOT_ACCESS);
+                }
+            }
+
+            $episode_id = getProp($params, 'episode_id');
+            if ($episode_id) {
+                if (!DB::table('mp_anime_episodes')->where('id', $episode_id)->where('cpid', $cpid)->value('id')) {
+                    Utils::throwError(ErrorConst::NOT_ACCESS);
+                }
+            }
+        }
+
+        return $next($request);
+    }
+}

+ 15 - 21
app/Http/Middleware/CheckSign.php

@@ -21,35 +21,29 @@ class CheckSign
      */
     public function handle($request, Closure $next)
     {
-        $params = $request->all();
         $token = $request->header('d-token', '');
+        $param_sign = $request->header('sign', '');
+        $nonce = $request->header('nonce', '');
+        $timestamp = $request->header('timestamp', '');
         if (!$token) Utils::throwError(ErrorConst::NOT_LOGIN);
 
-        $referer_url = '';
-        if (isset($params['_url'])) {
-            $referer_url = $params['_url'];
-            unset($params['_url']);
-        }
+        $referer_url = $request->input('_url', '');
         // 先验签(非本地模式需要验签)
-        if (env('CHECK_SIGN') && $params) {
-            $param_sign = getProp($params, 'sign');
-            $timestamp = getProp($params, 'timestamp');
+        if (env('CHECK_SIGN')) {
             $check_params = [
                 'd-token'   => $token,
-                'nonce_str' => getProp($params, 'nonce_str'),
+                'nonce' => $nonce,
                 'timestamp' => $timestamp,
             ];
-            if (!getProp($params, 'nonce_str') || !$timestamp) {
-                Log::info('验签失败, 请求参数不正确;传参: '.json_encode($params, 256));
-                Utils::throwError('1002:数据异常,请求参数不正确');
+            $params = $check_params;
+            $params['_url'] = $referer_url;
+            if (!$nonce || !$timestamp) {
+                dLog('checkSign')->info('验签失败, 请求参数不正确;传参: '.json_encode($params, 256));
+                Utils::throwError('1002:签名异常');
             }
             if (time() - $timestamp > 300) {
-                Log::info('验签失败, 签名5分钟内有效;传参: '.json_encode($params, 256));
-                Utils::throwError('1002:数据异常,签名5分钟内有效');
-            }
-
-            foreach ($params as $k=>$v) {
-                if (!$v) unset($params[$k]);
+                dLog('checkSign')->info('验签失败, 签名5分钟内有效;传参: '.json_encode($params, 256));
+                Utils::throwError('1002:签名异常');
             }
 
             ksort($check_params);
@@ -60,8 +54,8 @@ class CheckSign
                 $params['sign'] = $param_sign;
                 $params['check_sign'] = $sign;
                 $params['check_str'] = $str.'&key='.env('SIGN_SALT');
-                Log::info('验签失败, 签名不正确;传参: '.json_encode($params, 256));
-                Utils::throwError('1002:数据异常,签名不正确');
+                dLog('checkSign')->info('验签失败, 签名不正确;传参: '.json_encode($params, 256));
+                Utils::throwError('1002:签名异常');
             }
         }
 

+ 1 - 0
app/Http/Middleware/CheckTokenTrait.php

@@ -25,6 +25,7 @@ trait CheckTokenTrait
         $site->role     = getProp($user, 'role');
         $site->mobile    = getProp($user, 'mobile');
         $site->nickname = getProp($user, 'nickname');
+        $site->cpid     = getProp($user, 'cpid');
         $site->token    = $token;
     }
 }

+ 377 - 20
app/Services/Anime/AnimeService.php

@@ -4319,21 +4319,345 @@ class AnimeService
         }
     }
 
+    /**
+     * 获取角色库列表(支持文件夹)
+     * @param array $data 包含 parent_id(父文件夹ID,默认0)、role(搜索关键词)
+     * @return array 返回文件夹和角色列表
+     */
     public function globalRoles($data) {
+        $cpid = Site::getCpid();
+        $parent_id = getProp($data, 'parent_id', 0);
         $role = getProp($data, 'role');
-        $query = DB::table('mp_roles')->where('is_deleted', 0)->select('id', 'role', 'url', 'pic_prompt', 'three_view_image_url', 'created_at');
-        if ($role) $query->where('role', 'like', "%{$role}%");
-        $result = $query->orderBy('id', 'desc')->get()->map(function($value) {
-            $value = (array)$value;
-            $value['created_at'] = transDate($value['created_at'], 'Y-m-d');
-            return $value;
-        })->toArray();
+        
+        // 构建查询
+        $query = DB::table('mp_roles')
+            ->where('cpid', $cpid)
+            ->where('is_deleted', 0)
+            ->where('parent_id', $parent_id)
+            ->select('id', 'type', 'parent_id', 'level', 'role', 'url', 'pic_prompt', 'three_view_image_url', 'sort_order', 'created_at');
+        
+        // 如果有搜索关键词,只搜索角色图片(type=1)
+        if ($role) {
+            $query->where('type', 1)->where('role', 'like', "%{$role}%");
+        }
+        
+        // 排序:文件夹优先,然后按 sort_order 降序,最后按创建时间降序
+        $result = $query->orderByRaw('type DESC, sort_order DESC, created_at DESC')
+            ->get()
+            ->map(function($value) {
+                $value = (array)$value;
+                $value['created_at'] = transDate($value['created_at'], 'Y-m-d');
+                $value['type'] = (int)$value['type'];
+                $value['parent_id'] = (int)$value['parent_id'];
+                $value['level'] = (int)$value['level'];
+                $value['sort_order'] = (int)$value['sort_order'];
+                return $value;
+            })
+            ->toArray();
 
         return $result;
     }
+    
+    /**
+     * 创建文件夹
+     * @param array $data 包含 parent_id(父文件夹ID)、role(文件夹名称)
+     * @return int 返回新建文件夹ID
+     */
+    public function createFolder($data) {
+        $uid = Site::getUid();
+        $cpid = Site::getCpid();
+        $parent_id = getProp($data, 'parent_id', 0);
+        $folder_name = getProp($data, 'role', '新建文件夹');
+        
+        // 验证父文件夹
+        $parent_level = 0;
+        if ($parent_id > 0) {
+            $parent = DB::table('mp_roles')
+                ->where('id', $parent_id)
+                ->where('type', 2)
+                ->where('is_deleted', 0)
+                ->first();
+            
+            if (!$parent) {
+                Utils::throwError('20003:父文件夹不存在');
+            }
+            
+            $parent_level = $parent->level;
+            
+            // 检查层级限制(最多3层)
+            if ($parent_level >= 3) {
+                // Utils::throwError('20003:文件夹层级不能超过3层');
+            }
+        }
+        
+        // 检查当前目录下是否已存在空白文件夹
+        $empty_folder_exists = DB::table('mp_roles')
+            ->where('parent_id', $parent_id)
+            ->where('type', 2)
+            ->where('role', '新建文件夹')
+            ->where('is_deleted', 0)
+            ->exists();
+        
+        if ($empty_folder_exists) {
+            Utils::throwError('20003:不允许创建多个空白文件夹,请先重命名现有文件夹');
+        }
+        
+        // 创建文件夹
+        $folder_id = DB::table('mp_roles')->insertGetId([
+            'user_id' => $uid,
+            'cpid' => $cpid,
+            'type' => 2,
+            'parent_id' => $parent_id,
+            'level' => $parent_level + 1,
+            'role' => $folder_name,
+            'sort_order' => time(), // 使用时间戳作为排序权重
+            'is_deleted' => 0,
+            'created_at' => date('Y-m-d H:i:s'),
+            'updated_at' => date('Y-m-d H:i:s')
+        ]);
+        
+        return $folder_id;
+    }
+    
+    /**
+     * 重命名文件夹或角色
+     * @param array $data 包含 id、role(新名称)
+     * @return bool
+     */
+    public function renameFolder($data) {
+        $uid = Site::getUid();
+        $cpid = Site::getCpid();
+        $id = getProp($data, 'id');
+        $new_name = getProp($data, 'role');
+        
+        if (!$id || !$new_name) {
+            Utils::throwError('20003:参数不完整');
+        }
+        
+        // 检查是否存在
+        $item = DB::table('mp_roles')
+            ->where('id', $id)
+            ->where('cpid', $cpid)
+            ->where('is_deleted', 0)
+            ->first();
+        
+        if (!$item) {
+            Utils::throwError('20003:项目不存在');
+        }
+        
+        return DB::table('mp_roles')
+            ->where('id', $id)
+            ->where('cpid', $cpid)
+            ->update([
+                'role' => $new_name,
+                'updated_at' => date('Y-m-d H:i:s')
+            ]);
+    }
+    
+    /**
+     * 移动角色或文件夹到指定文件夹
+     * @param array $data 包含 id(要移动的项目ID)、target_parent_id(目标父文件夹ID)
+     * @return bool
+     */
+    public function moveRoleOrFolder($data) {
+        $cpid = Site::getCpid();
+        $id = getProp($data, 'id');
+        $target_parent_id = getProp($data, 'target_parent_id', 0);
+        
+        if (!$id) {
+            Utils::throwError('20003:请选择要移动的项目');
+        }
+        
+        // 检查要移动的项目
+        $item = DB::table('mp_roles')
+            ->where('id', $id)
+            ->where('cpid', $cpid)
+            ->where('is_deleted', 0)
+            ->first();
+        
+        if (!$item) {
+            Utils::throwError('20003:项目不存在');
+        }
+        
+        // 验证目标文件夹
+        $target_level = 0;
+        if ($target_parent_id > 0) {
+            $target_parent = DB::table('mp_roles')
+                ->where('id', $target_parent_id)
+                ->where('cpid', $cpid)
+                ->where('type', 2)
+                ->where('is_deleted', 0)
+                ->first();
+            
+            if (!$target_parent) {
+                Utils::throwError('20003:目标文件夹不存在');
+            }
+            
+            $target_level = $target_parent->level;
+            
+            // 如果移动的是文件夹,需要检查层级
+            if ($item->type == 2) {
+                // 计算移动后的最大层级
+                $max_child_level = $this->getMaxChildLevel($id);
+                $depth = $max_child_level - $item->level;
+                
+                if ($target_level + 1 + $depth > 3) {
+                    // Utils::throwError('20003:移动后文件夹层级将超过3层限制');
+                }
+                
+                // 不能移动到自己或自己的子文件夹下
+                if ($this->isDescendant($target_parent_id, $id)) {
+                    Utils::throwError('20003:不能移动到自己或子文件夹下');
+                }
+            }
+        }
+        
+        // 更新父文件夹和层级
+        $new_level = $target_level + 1;
+        DB::table('mp_roles')
+            ->where('id', $id)
+            ->update([
+                'parent_id' => $target_parent_id,
+                'level' => $new_level,
+                'updated_at' => date('Y-m-d H:i:s')
+            ]);
+        
+        // 如果是文件夹,需要递归更新所有子项的层级
+        if ($item->type == 2) {
+            $this->updateChildrenLevel($id, $new_level);
+        }
+        
+        return true;
+    }
+    
+    /**
+     * 获取文件夹下最大子层级
+     * @param int $folder_id
+     * @return int
+     */
+    private function getMaxChildLevel($folder_id) {
+        $max_level = DB::table('mp_roles')
+            ->where('parent_id', $folder_id)
+            ->where('is_deleted', 0)
+            ->max('level');
+        
+        if (!$max_level) {
+            return DB::table('mp_roles')->where('id', $folder_id)->value('level');
+        }
+        
+        // 递归查找子文件夹
+        $children = DB::table('mp_roles')
+            ->where('parent_id', $folder_id)
+            ->where('type', 2)
+            ->where('is_deleted', 0)
+            ->pluck('id');
+        
+        foreach ($children as $child_id) {
+            $child_max = $this->getMaxChildLevel($child_id);
+            if ($child_max > $max_level) {
+                $max_level = $child_max;
+            }
+        }
+        
+        return $max_level;
+    }
+    
+    /**
+     * 检查 target_id 是否是 folder_id 的后代
+     * @param int $target_id
+     * @param int $folder_id
+     * @return bool
+     */
+    private function isDescendant($target_id, $folder_id) {
+        if ($target_id == $folder_id) {
+            return true;
+        }
+        
+        $parent = DB::table('mp_roles')
+            ->where('id', $target_id)
+            ->where('is_deleted', 0)
+            ->first();
+        
+        if (!$parent || $parent->parent_id == 0) {
+            return false;
+        }
+        
+        return $this->isDescendant($parent->parent_id, $folder_id);
+    }
+    
+    /**
+     * 递归更新子项层级
+     * @param int $parent_id
+     * @param int $parent_level
+     */
+    private function updateChildrenLevel($parent_id, $parent_level) {
+        $children = DB::table('mp_roles')
+            ->where('parent_id', $parent_id)
+            ->where('is_deleted', 0)
+            ->get();
+        
+        foreach ($children as $child) {
+            $new_level = $parent_level + 1;
+            DB::table('mp_roles')
+                ->where('id', $child->id)
+                ->update([
+                    'level' => $new_level,
+                    'updated_at' => date('Y-m-d H:i:s')
+                ]);
+            
+            // 如果是文件夹,继续递归
+            if ($child->type == 2) {
+                $this->updateChildrenLevel($child->id, $new_level);
+            }
+        }
+    }
+    
+    /**
+     * 获取文件夹路径(面包屑导航)
+     * @param array $data 包含 folder_id
+     * @return array 返回路径数组
+     */
+    public function getFolderPath($data) {
+        $folder_id = getProp($data, 'id', 0);
+        
+        if ($folder_id == 0) {
+            return [
+                ['id' => 0, 'name' => '根目录']
+            ];
+        }
+        
+        $path = [];
+        $current_id = $folder_id;
+
+        
+        while ($current_id > 0) {
+            $folder = DB::table('mp_roles')
+                ->where('id', $current_id)
+                ->where('type', 2)
+                ->where('is_deleted', 0)
+                ->first();
+            
+            if (!$folder) {
+                break;
+            }
+            
+            array_unshift($path, [
+                'id' => $folder->id,
+                'name' => $folder->role
+            ]);
+            
+            $current_id = $folder->parent_id;
+        }
+        
+        // 添加根目录
+        array_unshift($path, ['id' => 0, 'name' => '根目录']);
+        
+        return $path;
+    }
 
     public function createRole($data) {
         $uid = Site::getUid();
+        $cpid = Site::getCpid();
         $role = trim(getProp($data, 'role'));
         if (!$role) Utils::throwError('20003:角色名不能为空');
         $url = trim(getProp($data, 'url'));
@@ -4349,12 +4673,36 @@ class AnimeService
         }
         $pic_prompt = trim(getProp($data, 'pic_prompt'));
         if (!$pic_prompt) Utils::throwError('20003:角色提示词不能为空');
+        
+        // 获取父文件夹ID和层级
+        $parent_id = getProp($data, 'parent_id', 0);
+        $parent_level = 0;
+        
+        if ($parent_id > 0) {
+            $parent = DB::table('mp_roles')
+                ->where('id', $parent_id)
+                ->where('cpid', $cpid)
+                ->where('type', 2)
+                ->where('is_deleted', 0)
+                ->first();
+            
+            if (!$parent) {
+                Utils::throwError('20003:父文件夹不存在');
+            }
+            
+            $parent_level = $parent->level;
+        }
 
         $id = DB::table('mp_roles')->insertGetId([
             'user_id'       => $uid,
+            'cpid'          => $cpid,
+            'type'          => 1, // 1=角色图片
+            'parent_id'     => $parent_id,
+            'level'         => $parent_level + 1,
             'role'          => $role,
             'url'           => $url,
-            'pic_prompt'     => $pic_prompt,
+            'pic_prompt'    => $pic_prompt,
+            'sort_order'    => time(), // 使用时间戳作为排序权重
             'created_at'    => date('Y-m-d H:i:s'),
             'updated_at'    => date('Y-m-d H:i:s')
         ]);
@@ -4362,6 +4710,9 @@ class AnimeService
         if (!$id) Utils::throwError('20003:创建角色失败');
         return [
             'id'            => $id,
+            'type'          => 1,
+            'parent_id'     => $parent_id,
+            'level'         => $parent_level + 1,
             'role'          => $role,
             'url'           => $url,
             'pic_prompt'    => $pic_prompt
@@ -4370,14 +4721,16 @@ class AnimeService
 
     public function editRole($data) {
         $uid = Site::getUid();
+        $cpid = Site::getCpid();
         $id = getProp($data, 'id');
         if (!$id) Utils::throwError('20003:角色ID不能为空');
         
         // 检查角色是否存在且属于当前用户
         $role = DB::table('mp_roles')
-        // ->where('user_id', $uid)
-        ->where('id', $id)->first();
-        if (!$role) Utils::throwError('20003:角色不存在或无权限操作');
+        ->where('id', $id)
+        ->where('cpid', $cpid)
+        ->where('type', 1)->first();
+        if (!$role) Utils::throwError('20003:角色不存在');
         
         $updateData = [];
         
@@ -4414,36 +4767,40 @@ class AnimeService
         $updateData['updated_at'] = date('Y-m-d H:i:s');
         
         return DB::table('mp_roles')
-        // ->where('user_id', $uid)
+        ->where('cpid', $cpid)
         ->where('id', $id)->update($updateData);
     }
 
     public function deleteRole($data) {
         $uid = Site::getUid();
+        $cpid = Site::getCpid();
         $id = getProp($data, 'id');
         if (!$id) Utils::throwError('20003:角色ID不能为空');
         
         // 检查角色是否存在且属于当前用户
         $role = DB::table('mp_roles')
-        // ->where('user_id', $uid)
-        ->where('id', $id)->first();
-        if (!$role) Utils::throwError('20003:角色不存在或无权限操作');
+        ->where('id', $id)
+        ->where('cpid', $cpid)
+        ->where('type', 1)->first();
+        if (!$role) Utils::throwError('20003:角色不存在');
         
         return DB::table('mp_roles')
-        // ->where('user_id', $uid)
+        ->where('cpid', $cpid)
         ->where('id', $id)->delete();
     }
 
     public function generateThreeView($data) {
         $uid = Site::getUid();
+        $cpid = Site::getCpid();
         $id = getProp($data, 'id');
         if (!$id) Utils::throwError('20003:角色ID不能为空');
         
         // 检查角色是否存在且属于当前用户
         $role = DB::table('mp_roles')
-        // ->where('user_id', $uid)
-        ->where('id', $id)->first();
-        if (!$role) Utils::throwError('20003:角色不存在或无权限操作');
+        ->where('id', $id)
+        ->where('cpid', $cpid)
+        ->where('type', 1)->first();
+        if (!$role) Utils::throwError('20003:角色不存在');
         
         $prompt = trim(getProp($data, 'prompt', '基于参考图生成主体的标准正面、侧面、后面三视图,主体完整。在最左侧添加主体正视图的特写,主体清晰完整。背景修改成纯白色,整体保持与参考图一致的美术风格和色彩搭配。画面无说明文字'));
         $ref_img_url = trim(getProp($data, 'ref_img_url'));
@@ -4549,7 +4906,7 @@ class AnimeService
             // 保存三视图到 mp_roles 表
             DB::table('mp_roles')
                 ->where('id', $id)
-                // ->where('user_id', $uid)
+                ->where('cpid', $cpid)
                 ->update([
                     'three_view_image_url' => $img_url,
                     'updated_at' => date('Y-m-d H:i:s')

+ 117 - 109
routes/api.php

@@ -90,117 +90,125 @@ Route::group(['middleware' => ['bindToken', 'bindExportToken', 'checkLogin']], f
         Route::get('emotionGroups', [DeepSeekController::class, 'emotionGroups']);
         Route::post('insertAudioEffect', [DeepSeekController::class, 'insertAudioEffect']);
         Route::post('insertBgm', [DeepSeekController::class, 'insertBgm']);
-
-        // 剧本管理
-        Route::get('scriptList', [DeepSeekController::class, 'scriptList']);
-        Route::get('scripts', [DeepSeekController::class, 'scripts']);
-        Route::get('scriptInfo', [DeepSeekController::class, 'scriptInfo']);
-        Route::get('createScript', [DeepSeekController::class, 'createScript']);
-        Route::post('editScript', [DeepSeekController::class, 'editScript']);
-        Route::get('delScript', [DeepSeekController::class, 'delScript']);
-        Route::get('createEpisode', [DeepSeekController::class, 'createEpisode']);
-        Route::get('editEpisode', [DeepSeekController::class, 'editEpisode']);
-        Route::get('delEpisode', [DeepSeekController::class, 'delEpisode']);
-        Route::get('exportScript', [DeepSeekController::class, 'exportScript']);
-        Route::get('getBookContent', [DeepSeekController::class, 'getBookContent']);
-        Route::post('chatWithFile', [DeepSeekController::class, 'chatWithFile']);
-        Route::post('chatWithFileStream', [DeepSeekController::class, 'chatWithFileStream']);
-        Route::post('generateEpisodes', [DeepSeekController::class, 'generateEpisodes']);
-        Route::get('getEpisodeContent', [DeepSeekController::class, 'getEpisodeContent']);
-        Route::post('saveEpisodeContent', [DeepSeekController::class, 'saveEpisodeContent']);
-    });
-
-    // AI生成
-    Route::group(['prefix' => 'AIGeneration'], function () {
-        // 图片生成相关路由
-        Route::post('image/createTask', [ImageGenerationController::class, 'createTask']);
-        Route::get('image/taskStatus', [ImageGenerationController::class, 'taskStatus']);
-        Route::get('image/taskList', [ImageGenerationController::class, 'taskList']);
-        
-        // 视频生成相关路由
-        Route::get('video/taskList', [VideoGenerationController::class, 'taskList']);
-        // 即梦AI3.0视频生成路由
-        Route::post('video/createJimengTask', [VideoGenerationController::class, 'createJimengTask']);
-        Route::get('video/taskStatus', [VideoGenerationController::class, 'taskStatus']);
-        
-        // Seedance 1.5 Pro 视频生成路由
-        Route::post('video/createSeedanceTask', [VideoGenerationController::class, 'createSeedanceTask']);
-        // Route::get('video/seedance/taskStatus/{taskId}', [VideoGenerationController::class, 'getSeedanceTaskStatus']);
-
-        // 可灵Omni视频生成路由
-        Route::post('video/createKelingTask', [VideoGenerationController::class, 'createKelingTask']);
-        Route::get('video/keling/taskStatus/{taskId}', [VideoGenerationController::class, 'getKelingTaskStatus']);
-        
-        // 主体管理相关路由
-        Route::post('element/create', [VideoGenerationController::class, 'createElement']);
-        Route::get('element/status/{taskId}', [VideoGenerationController::class, 'getElementStatus']);
-        Route::get('element/list', [VideoGenerationController::class, 'getElementsList']);
-        Route::post('element/delete', [VideoGenerationController::class, 'deleteElement']);
-        Route::get('element/local/list', [VideoGenerationController::class, 'getLocalElementsList']);
     });
 
-    // 动漫管理
-    Route::group(['prefix' => 'anime'], function () {
-        Route::get('textModel', [AnimeController::class, 'textModel']);                         // 文字模型
-        Route::get('imageModel', [AnimeController::class, 'imageModel']);                       // 图片模型
-        Route::get('videoModel', [AnimeController::class, 'videoModel']);                       // 视频模型
-        Route::get('artStyleList', [AnimeController::class, 'artStyleList']);                   // 艺术风格列表
-        Route::post('create', [AnimeController::class, 'createAnime']);                         // 创建动漫
-        Route::post('edit', [AnimeController::class, 'editAnime']);                             // 编辑动漫
-        Route::get('delete', [AnimeController::class, 'delAnime']);                             // 删除动漫
-        Route::post('addChat', [DeepSeekController::class, 'addChat']);                         // 新增动漫对话
-        Route::post('reGenerateAnime', [DeepSeekController::class, 'reGenerateAnime']);         // 调整动漫大纲
-        Route::get('chatList', [AnimeController::class, 'chatList']);                           // 动漫列表
-        Route::get('chatHistory', [AnimeController::class, 'chatHistory']);                     // 动漫对话历史
-        Route::post('chat', [DeepSeekController::class, 'chat']);                               // 动漫对话
-        Route::get('detail', [AnimeController::class, 'animeDetail']);                          // 动漫大纲
-        Route::get('episodeInfo', [AnimeController::class, 'episodeInfo']);                     // 动漫剧集
-        Route::get('segmentInfo', [AnimeController::class, 'segmentInfo']);                     // 分镜信息
-        Route::get('copyEpisodeVersion', [AnimeController::class, 'copyEpisodeVersion']);       // 复制动漫剧集
-        Route::get('episodeVersions', [AnimeController::class, 'episodeVersions']);             // 剧集版本
-        Route::get('bindEpisodeVersion', [AnimeController::class, 'bindEpisodeVersion']);       // 绑定剧集版本
-        Route::post('changeEpisodeRoles', [AnimeController::class, 'changeEpisodeRoles']);      // 更改分集主体列表
-        Route::post('changeEpisodeScenes', [AnimeController::class, 'changeEpisodeScenes']);    // 更改分集场景列表
-        Route::post('editSegment', [AnimeController::class, 'editSegment']);                    // 编辑分镜
-        Route::post('batchUploadImg', [ImageGenerationController::class, 'batchUploadImg']);    // 批量上传图片
-        Route::post('batchSetRoleImg', [AnimeController::class, 'batchSetRoleImg']);            // 批量生成角色形象
-        Route::post('batchSetSceneImg', [AnimeController::class, 'batchSetSceneImg']);          // 批量生成场景图片
-        Route::post('chatChangeImg', [AnimeController::class, 'chatChangeImg']);                // 对话改图
-        Route::post('batchSetSegmentPics', [AnimeController::class, 'batchSetSegmentPics']);    // 一键生成分镜图片
-        Route::post('reGenerateSegment', [AnimeController::class, 'reGenerateSegment']);        // 重新生成分镜
-        Route::post('addSegment', [AnimeController::class, 'addSegment']);                      // 新增分镜
-        Route::post('copySegment', [AnimeController::class, 'copySegment']);                    // 复制分镜
-        Route::post('moveSegment', [AnimeController::class, 'moveSegment']);                    // 移动分镜
-        Route::post('delSegment', [AnimeController::class, 'delSegment']);                      // 删除分镜
-        Route::get('applySegment', [AnimeController::class, 'applySegment']);                  // 应用分镜
-        Route::post('segmentHistory', [AnimeController::class, 'segmentHistory']);              // 分镜历史图片/视频
-        Route::get('segmentChatHistory', [AnimeController::class, 'segmentChatHistory']);           // 分镜对话历史记录
-        Route::post('createSegmentVideoTask', [AnimeController::class, 'createSegmentVideoTask']);  // 分镜图片转视频
-        Route::post('batchSetSegmentVideos', [AnimeController::class, 'batchSetSegmentVideos']);    // 一键转视频
-        Route::post('applyAudioData', [AnimeController::class, 'applyAudioData']);                  // 修改分镜音频参数
-        Route::post('previewAudio', [AnimeController::class, 'previewAudio']);                      // 音频试听
-        Route::get('episodePicsInfo', [AnimeController::class, 'episodePicsInfo']);                 // 获取主体和场景图片生成信息
-        Route::get('clipSegmentVideo', [AnimeController::class, 'clipSegmentVideo']);                       // 裁剪视频
-        
-        // 完整视频合成任务
-        Route::get('createCompleteVideoTask', [AnimeController::class, 'createCompleteVideoTask']);
-        
-        Route::get('generateImg', [AnimeController::class, 'generateImg']);     // 文生图(通用)
-        Route::post('generateText', [DeepSeekController::class, 'generateText']);    // 文生文(通用)
-        
-        // 监控分镜图片和音频生成任务进度(SSE)
-        Route::get('segmentPicsInfo', [AnimeController::class, 'monitorSegmentTasks']);
-        
-        // 导出全部分镜
-        Route::get('exportEpisodeImages', [AnimeController::class, 'exportEpisodeImages']);
-
-        Route::get('globalRoles', [AnimeController::class, 'globalRoles']);     // 角色库
-        Route::post('createRole', [AnimeController::class, 'createRole']);      // 创建角色
-        Route::post('editRole', [AnimeController::class, 'editRole']);          // 编辑角色
-        Route::get('deleteRole', [AnimeController::class, 'deleteRole']);       // 删除角色
-        // 生成三视图(基于参考图生成主体的标准正面、侧面、后面三视图,主体完整。在最左侧添加主体正视图的特写,主体清晰完整。背景修改成纯白色,整体保持与参考图一致的美术风格和色彩搭配。画面无说明文字)
-        Route::post('generateThreeView', [AnimeController::class, 'generateThreeView']);
-
+    Route::group(['middleware' => ['checkSign', 'checkCompany']], function () {
+        Route::group(['prefix' => 'deepseek'], function () {
+            // 剧本管理
+            Route::get('scriptList', [DeepSeekController::class, 'scriptList']);
+            Route::get('scripts', [DeepSeekController::class, 'scripts']);
+            Route::get('scriptInfo', [DeepSeekController::class, 'scriptInfo']);
+            Route::get('createScript', [DeepSeekController::class, 'createScript']);
+            Route::post('editScript', [DeepSeekController::class, 'editScript']);
+            Route::get('delScript', [DeepSeekController::class, 'delScript']);
+            Route::get('createEpisode', [DeepSeekController::class, 'createEpisode']);
+            Route::get('editEpisode', [DeepSeekController::class, 'editEpisode']);
+            Route::get('delEpisode', [DeepSeekController::class, 'delEpisode']);
+            Route::get('exportScript', [DeepSeekController::class, 'exportScript']);
+            Route::get('getBookContent', [DeepSeekController::class, 'getBookContent']);
+            Route::post('chatWithFile', [DeepSeekController::class, 'chatWithFile']);
+            Route::post('chatWithFileStream', [DeepSeekController::class, 'chatWithFileStream']);
+            Route::post('generateEpisodes', [DeepSeekController::class, 'generateEpisodes']);
+            Route::get('getEpisodeContent', [DeepSeekController::class, 'getEpisodeContent']);
+            Route::post('saveEpisodeContent', [DeepSeekController::class, 'saveEpisodeContent']);
+        });  
+
+        // AI生成
+        Route::group(['prefix' => 'AIGeneration'], function () {
+            // 图片生成相关路由
+            Route::post('image/createTask', [ImageGenerationController::class, 'createTask']);
+            Route::get('image/taskStatus', [ImageGenerationController::class, 'taskStatus']);
+            Route::get('image/taskList', [ImageGenerationController::class, 'taskList']);
+            
+            // 视频生成相关路由
+            Route::get('video/taskList', [VideoGenerationController::class, 'taskList']);
+            // 即梦AI3.0视频生成路由
+            Route::post('video/createJimengTask', [VideoGenerationController::class, 'createJimengTask']);
+            Route::get('video/taskStatus', [VideoGenerationController::class, 'taskStatus']);
+            
+            // Seedance 1.5 Pro 视频生成路由
+            Route::post('video/createSeedanceTask', [VideoGenerationController::class, 'createSeedanceTask']);
+            // Route::get('video/seedance/taskStatus/{taskId}', [VideoGenerationController::class, 'getSeedanceTaskStatus']);
+
+            // 可灵Omni视频生成路由
+            Route::post('video/createKelingTask', [VideoGenerationController::class, 'createKelingTask']);
+            Route::get('video/keling/taskStatus/{taskId}', [VideoGenerationController::class, 'getKelingTaskStatus']);
+            
+            // 主体管理相关路由
+            Route::post('element/create', [VideoGenerationController::class, 'createElement']);
+            Route::get('element/status/{taskId}', [VideoGenerationController::class, 'getElementStatus']);
+            Route::get('element/list', [VideoGenerationController::class, 'getElementsList']);
+            Route::post('element/delete', [VideoGenerationController::class, 'deleteElement']);
+            Route::get('element/local/list', [VideoGenerationController::class, 'getLocalElementsList']);
+        });
+
+        // 动漫管理
+        Route::group(['prefix' => 'anime'], function () {
+            Route::get('textModel', [AnimeController::class, 'textModel']);                         // 文字模型
+            Route::get('imageModel', [AnimeController::class, 'imageModel']);                       // 图片模型
+            Route::get('videoModel', [AnimeController::class, 'videoModel']);                       // 视频模型
+            Route::get('artStyleList', [AnimeController::class, 'artStyleList']);                   // 艺术风格列表
+            Route::post('create', [AnimeController::class, 'createAnime']);                         // 创建动漫
+            Route::post('edit', [AnimeController::class, 'editAnime']);                             // 编辑动漫
+            Route::get('delete', [AnimeController::class, 'delAnime']);                             // 删除动漫
+            Route::post('addChat', [DeepSeekController::class, 'addChat']);                         // 新增动漫对话
+            Route::post('reGenerateAnime', [DeepSeekController::class, 'reGenerateAnime']);         // 调整动漫大纲
+            Route::get('chatList', [AnimeController::class, 'chatList']);                           // 动漫列表
+            Route::get('chatHistory', [AnimeController::class, 'chatHistory']);                     // 动漫对话历史
+            Route::post('chat', [DeepSeekController::class, 'chat']);                               // 动漫对话
+            Route::get('detail', [AnimeController::class, 'animeDetail']);                          // 动漫大纲
+            Route::get('episodeInfo', [AnimeController::class, 'episodeInfo']);                     // 动漫剧集
+            Route::get('segmentInfo', [AnimeController::class, 'segmentInfo']);                     // 分镜信息
+            Route::get('copyEpisodeVersion', [AnimeController::class, 'copyEpisodeVersion']);       // 复制动漫剧集
+            Route::get('episodeVersions', [AnimeController::class, 'episodeVersions']);             // 剧集版本
+            Route::get('bindEpisodeVersion', [AnimeController::class, 'bindEpisodeVersion']);       // 绑定剧集版本
+            Route::post('changeEpisodeRoles', [AnimeController::class, 'changeEpisodeRoles']);      // 更改分集主体列表
+            Route::post('changeEpisodeScenes', [AnimeController::class, 'changeEpisodeScenes']);    // 更改分集场景列表
+            Route::post('editSegment', [AnimeController::class, 'editSegment']);                    // 编辑分镜
+            Route::post('batchUploadImg', [ImageGenerationController::class, 'batchUploadImg']);    // 批量上传图片
+            Route::post('batchSetRoleImg', [AnimeController::class, 'batchSetRoleImg']);            // 批量生成角色形象
+            Route::post('batchSetSceneImg', [AnimeController::class, 'batchSetSceneImg']);          // 批量生成场景图片
+            Route::post('chatChangeImg', [AnimeController::class, 'chatChangeImg']);                // 对话改图
+            Route::post('batchSetSegmentPics', [AnimeController::class, 'batchSetSegmentPics']);    // 一键生成分镜图片
+            Route::post('reGenerateSegment', [AnimeController::class, 'reGenerateSegment']);        // 重新生成分镜
+            Route::post('addSegment', [AnimeController::class, 'addSegment']);                      // 新增分镜
+            Route::post('copySegment', [AnimeController::class, 'copySegment']);                    // 复制分镜
+            Route::post('moveSegment', [AnimeController::class, 'moveSegment']);                    // 移动分镜
+            Route::post('delSegment', [AnimeController::class, 'delSegment']);                      // 删除分镜
+            Route::get('applySegment', [AnimeController::class, 'applySegment']);                  // 应用分镜
+            Route::post('segmentHistory', [AnimeController::class, 'segmentHistory']);              // 分镜历史图片/视频
+            Route::get('segmentChatHistory', [AnimeController::class, 'segmentChatHistory']);           // 分镜对话历史记录
+            Route::post('createSegmentVideoTask', [AnimeController::class, 'createSegmentVideoTask']);  // 分镜图片转视频
+            Route::post('batchSetSegmentVideos', [AnimeController::class, 'batchSetSegmentVideos']);    // 一键转视频
+            Route::post('applyAudioData', [AnimeController::class, 'applyAudioData']);                  // 修改分镜音频参数
+            Route::post('previewAudio', [AnimeController::class, 'previewAudio']);                      // 音频试听
+            Route::get('episodePicsInfo', [AnimeController::class, 'episodePicsInfo']);                 // 获取主体和场景图片生成信息
+            Route::get('clipSegmentVideo', [AnimeController::class, 'clipSegmentVideo']);                       // 裁剪视频
+            
+            // 完整视频合成任务
+            Route::get('createCompleteVideoTask', [AnimeController::class, 'createCompleteVideoTask']);
+            
+            Route::get('generateImg', [AnimeController::class, 'generateImg']);     // 文生图(通用)
+            Route::post('generateText', [DeepSeekController::class, 'generateText']);    // 文生文(通用)
+            
+            // 监控分镜图片和音频生成任务进度(SSE)
+            Route::get('segmentPicsInfo', [AnimeController::class, 'monitorSegmentTasks']);
+            
+            // 导出全部分镜
+            Route::get('exportEpisodeImages', [AnimeController::class, 'exportEpisodeImages']);
+
+            Route::get('globalRoles', [AnimeController::class, 'globalRoles']);     // 角色库
+            Route::post('createRole', [AnimeController::class, 'createRole']);      // 创建角色
+            Route::post('editRole', [AnimeController::class, 'editRole']);          // 编辑角色
+            Route::get('deleteRole', [AnimeController::class, 'deleteRole']);       // 删除角色
+            Route::post('createFolder', [AnimeController::class, 'createFolder']);  // 新建文件夹
+            Route::post('renameFolder', [AnimeController::class, 'renameFolder']); // 重命名文件夹
+            Route::post('moveRoleOrFolder', [AnimeController::class, 'moveRoleOrFolder']); // 移动角色或文件夹
+            Route::get('getFolderPath', [AnimeController::class, 'getFolderPath']); // 获取文件夹路径
+            // 生成三视图(基于参考图生成主体的标准正面、侧面、后面三视图,主体完整。在最左侧添加主体正视图的特写,主体清晰完整。背景修改成纯白色,整体保持与参考图一致的美术风格和色彩搭配。画面无说明文字)
+            Route::post('generateThreeView', [AnimeController::class, 'generateThreeView']);
+
+        });
     });
     
 });