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

Merge branch 'test' into check_points

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

+ 7 - 0
app/Http/Controllers/Account/AccountController.php

@@ -76,4 +76,11 @@ class AccountController extends BaseController
         $result = $this->accountService->logout($token);
         return $this->success(['success' => $result ? 1 : 0]);
     }
+
+    public function userInfo()
+    {
+        // 登录
+        $user = $this->accountService->userInfo();
+        return $this->success($user);
+    }
 }

+ 19 - 14
app/Libs/Helpers.php

@@ -3,6 +3,7 @@
 use App\Consts\BaseConst;
 use GuzzleHttp\Client;
 use Illuminate\Support\Facades\DB;
+use Illuminate\Support\Facades\Cache;
 use Illuminate\Support\Facades\Log;
 use Monolog\Handler\StreamHandler;
 use Monolog\Logger;
@@ -3438,7 +3439,8 @@ function handleEpisodeContentForAce($originalContent) {
     }
     
     // 提取主体列表 - 兼容多种格式
-    if (preg_match('/###\s*主体列表\s*\n(.*?)(?=\n\s*###[^#]|\z)/s', $originalContent, $charactersMatch)) {
+    // if (preg_match('/###\s*主体列表\s*\n(.*?)(?=\n\s*###[^#]|\z)/s', $originalContent, $charactersMatch)) {
+    if (preg_match('/###[ \t]*主体列表[ \t]*\r?\n(.*?)(?=###[^#\n]|\z)/s', $originalContent, $charactersMatch)) {
         $charactersText = trim($charactersMatch[1]);
         $characterLines = explode("\n", $charactersText);
         
@@ -3549,7 +3551,8 @@ function handleEpisodeContentForAce($originalContent) {
     }
     
     // 提取场景列表 - 兼容多种格式
-    if (preg_match('/###\s*场景列表\s*\n(.*?)(?=\n\s*###[^#]|\z)/s', $originalContent, $scenesMatch)) {
+    // if (preg_match('/###\s*场景列表\s*\n(.*?)(?=\n\s*###[^#]|\z)/s', $originalContent, $scenesMatch)) {
+    if (preg_match('/###[ \t]*场景列表[ \t]*\r?\n(.*?)(?=###[^#\n]|\z)/s', $originalContent, $scenesMatch)) {
         $scenesText = trim($scenesMatch[1]);
         $sceneLines = explode("\n", $scenesText);
         
@@ -3586,7 +3589,7 @@ function handleEpisodeContentForAce($originalContent) {
     }
     
     // 提取道具列表 - 兼容多种格式
-    if (preg_match('/###\s*道具列表\s*\n(.*?)(?=\n\s*###[^#]|\z)/s', $originalContent, $propsMatch)) {
+    if (preg_match('/###[ \t]*道具列表[ \t]*\r?\n(.*?)(?=###[^#\n]|\z)/s', $originalContent, $propsMatch)) {
         $propsText = trim($propsMatch[1]);
         $propLines = explode("\n", $propsText);
         
@@ -3612,12 +3615,10 @@ function handleEpisodeContentForAce($originalContent) {
                     'description' => $description
                 ];
                 
-                // 如果有道具图片提示词,添加到数组中
                 if ($picPrompt) {
                     $propData['pic_prompt'] = $picPrompt;
+                    $result['props'][] = $propData;
                 }
-                
-                $result['props'][] = $propData;
             }
         }
     }
@@ -5118,9 +5119,9 @@ function splitContent($content) {
             // 获取当前章节标题
             $titleLine = trim($matches[0][$i][0]);
             // 去除标题开头的特殊符号
-            $cleanTitle = preg_replace('/^[#*·\-_=\s]+/', '', $titleLine);
+            $cleanTitle = preg_replace('/^[#*·\-_=\s]+/u', '', $titleLine);
             // 去除标题结尾的冒号和特殊符号
-            $cleanTitle = preg_replace('/[#*·::\s]+$/', '', $cleanTitle);
+            $cleanTitle = preg_replace('/[#*·::\s]+$/u', '', $cleanTitle);
             $cleanTitle = trim($cleanTitle);
             
             // 获取当前标题的结束位置
@@ -5233,15 +5234,19 @@ function mapErrorMessage($errorMessage)
     }
 
     if (stripos($errorMessage, 'The request failed because the output video may be related to copyright restrictions') !== false) {
-        return '涉及到版权问题无法生成,请调整后重试';
+        return '输出视频可能涉及版权限制,请更换内容或降低相似度后重试。';
     }
 
-    if (stripos($errorMessage, 'sensitive') !== false) {
-        return '含有敏感词,请调整后重试';
+    // 未命中预设错误:调用模型生成友好翻译并缓存,避免轮询场景重复消耗
+    try {
+        $cacheKey = 'unknown_error_translate_' . md5((string)$errorMessage);
+        return Cache::remember($cacheKey, 600, function () use ($errorMessage) {
+            $friendlyError = app(\App\Services\DeepSeek\DeepSeekService::class)->analyzeErrorMessage($errorMessage);
+            return $friendlyError ?: '未知异常,请重试';
+        });
+    } catch (\Throwable $e) {
+        return '未知异常,请重试';
     }
-
-    // 默认返回
-    return '未知异常,请重试';
 }
 
 /**

+ 32 - 13
app/Services/AIGeneration/AIVideoGenerationService.php

@@ -3151,19 +3151,38 @@ class AIVideoGenerationService
             }
 
             $now = date('Y-m-d H:i:s');
-            DB::table('mp_anime_records')->insert([
-                'uid'           => getProp($segment, 'uid'),
-                'anime_id'      => getProp($segment, 'anime_id'),
-                'sequence'      => getProp($segment, 'episode_number'),
-                'role'          => 'assistant',
-                'content'       => '视频生成失败,异常原因:' . (string)$returnErrorMsg,
-                $recordField    => $recordValue,
-                'video_url'     => '',
-                'video_task_id' => $videoTaskId ?: null,
-                'reference_images' => json_encode([], 256),
-                'created_at'    => $now,
-                'updated_at'    => $now
-            ]);
+            $userContent = !empty($segment_id) ? '图片转视频' : '片段转视频';
+
+            // 与成功路径保持一致:user + assistant 双记录,失败时 assistant 记录错误信息
+            $records = [
+                [
+                    'uid'           => getProp($segment, 'uid'),
+                    'anime_id'      => getProp($segment, 'anime_id'),
+                    'sequence'      => getProp($segment, 'episode_number'),
+                    'role'          => 'user',
+                    'content'       => $userContent,
+                    $recordField    => $recordValue,
+                    'video_url'     => '',
+                    'video_task_id' => $videoTaskId ?: null,
+                    'reference_images' => json_encode([], 256),
+                    'created_at'    => $now,
+                    'updated_at'    => $now
+                ],
+                [
+                    'uid'           => getProp($segment, 'uid'),
+                    'anime_id'      => getProp($segment, 'anime_id'),
+                    'sequence'      => getProp($segment, 'episode_number'),
+                    'role'          => 'assistant',
+                    'content'       => '视频生成失败,异常原因:' . (string)$returnErrorMsg,
+                    $recordField    => $recordValue,
+                    'video_url'     => '',
+                    'video_task_id' => $videoTaskId ?: null,
+                    'reference_images' => json_encode([], 256),
+                    'created_at'    => $now,
+                    'updated_at'    => $now
+                ]
+            ];
+            DB::table('mp_anime_records')->insert($records);
 
             dLog('generate')->info('视频生成失败对话记录添加成功', [
                 'video_task_id' => $videoTaskId,

+ 28 - 0
app/Services/Account/AccountService.php

@@ -51,6 +51,34 @@ class AccountService
 
     }
 
+    public function userInfo(): array
+    {
+        $uid = Site::getUid();
+
+        $user = DB::table('mp_manage_users')->where('id', $uid)->first();
+        if (!$user) {
+            Utils::throwError('20003:用户不存在');
+        }
+        if ((int)getProp($user, 'is_enabled') === 0) {
+            Utils::throwError('20003:用户已被禁用');
+        }
+
+        // 更新token
+        $uid      = getProp($user, 'id');
+        $nickname = getProp($user, 'nickname');
+        $token    = getProp($user, 'token');
+        $token_expire_at = getProp($user, 'token_expire_at');
+        if ($token_expire_at) $token_expire_at = transDate($token_expire_at);
+        $refresh_token = getProp($user, 'refresh_token');
+        $refresh_token_expires_at = getProp($user, 'refresh_token_expires_at');
+        if ($refresh_token_expires_at) $refresh_token_expires_at = transDate($refresh_token_expires_at);
+
+        // 用户角色
+        $role = getProp($user, 'role');
+        $points = getProp($user, 'points');
+        return compact('uid', 'nickname', 'token', 'token_expire_at', 'refresh_token', 'refresh_token_expires_at', 'role', 'points');
+    }
+
     /**
      * 退出登录
      *

Разница между файлами не показана из-за своего большого размера
+ 544 - 15
app/Services/DeepSeek/DeepSeekService.php


Разница между файлами не показана из-за своего большого размера
+ 1 - 1
resources/views/animeIndex.blade.php


+ 1 - 4
routes/api.php

@@ -24,6 +24,7 @@ use Illuminate\Support\Facades\Route;
 */
 
 Route::group(['middleware' => ['bindToken', 'bindExportToken', 'checkLogin']], function () {
+    Route::get('userInfo', [AccountController::class, 'userInfo']); // 获取用户信息
 
     Route::group(['prefix' => 'book'], function () {
         // 书籍管理
@@ -280,10 +281,6 @@ Route::group(['middleware' => ['bindToken', 'bindExportToken', 'checkLogin']], f
 
 Route::get('login', [AccountController::class, 'login']); // 登录
 Route::get('logout', [AccountController::class, 'logout']); // 退出
-Route::get('sseLink', [DeepSeekController::class, 'sseLink']); // sseLink
-Route::get('testLink', function () {
-    return 'Hello, World!';
-});
 
 // seedance回调
 Route::any('video/seedanceCallback', [VideoGenerationController::class, 'seedanceCallback']);