diff --git a/app/Http/Controllers/Api/DialogController.php b/app/Http/Controllers/Api/DialogController.php index 6fdcbe7d1..b353c73ea 100755 --- a/app/Http/Controllers/Api/DialogController.php +++ b/app/Http/Controllers/Api/DialogController.php @@ -3175,6 +3175,14 @@ class DialogController extends AbstractController $sessions = WebSocketDialogSession::whereDialogId($dialog->id) ->orderByDesc('id') ->paginate(Base::getPaginate(100, 10)); + $sessions->transform(function ($item) use ($dialog) { + if ($item->id === $dialog->session_id) { + $item->is_open = 1; + } else { + $item->is_open = 0; + } + return $item; + }); // return Base::retSuccess('success', $sessions); } diff --git a/database/migrations/2025_02_07_163701_create_web_socket_dialog_sessions_table.php b/database/migrations/2025_02_07_163701_create_web_socket_dialog_sessions_table.php index 57def27cc..8eb0676f7 100644 --- a/database/migrations/2025_02_07_163701_create_web_socket_dialog_sessions_table.php +++ b/database/migrations/2025_02_07_163701_create_web_socket_dialog_sessions_table.php @@ -34,9 +34,10 @@ class CreateWebSocketDialogSessionsTable extends Migration ->get(); foreach ($list as $item) { $title = WebSocketDialogMsg::whereDialogId($item->id)->where('key', '!=', '')->orderBy('id')->value('key'); - $session = WebSocketDialogSession::create([ + $session = WebSocketDialogSession::createInstance([ 'dialog_id' => $item->id, 'title' => $title ? Base::cutStr($title, 100) : 'Unknown', + 'created_at' => $item->created_at, ]); $session->save(); $item->session_id = $session->id; diff --git a/resources/assets/js/pages/manage/components/DialogSessionHistory.vue b/resources/assets/js/pages/manage/components/DialogSessionHistory.vue new file mode 100644 index 000000000..e69b52535 --- /dev/null +++ b/resources/assets/js/pages/manage/components/DialogSessionHistory.vue @@ -0,0 +1,126 @@ + + + {{$L('与 (*) 会话历史', sessionData.name)}} + + + + + {{$L('当前')}}{{item.title || $L('新会话')}} + + + {{$A.timeFormat(item.created_at)}} + + + + + + + + + + + diff --git a/resources/assets/js/pages/manage/components/DialogWrapper.vue b/resources/assets/js/pages/manage/components/DialogWrapper.vue index 48b4df564..3339816cd 100644 --- a/resources/assets/js/pages/manage/components/DialogWrapper.vue +++ b/resources/assets/js/pages/manage/components/DialogWrapper.vue @@ -644,6 +644,18 @@ + + + + + li { + list-style: none; + padding: 12px; + margin: 6px; + border-top-right-radius: 6px; + border-top-left-radius: 6px; + position: relative; + + &::after { + display: table; + clear: both; + content: ""; + } + + &::before { + content: ""; + position: absolute; + left: 0; + bottom: 0; + right: 0; + height: 1px; + background: #eeeeee; + } + + &:hover { + background-color: rgba($primary-desc-color, 0.1); + } + + &:last-child { + &::before { + display: none; + } + } + + .history-title { + float: left; + line-height: 20px; + + > em { + font-style: normal; + font-size: 12px; + margin-right: 6px; + background: #666; + color: #ffffff; + padding: 0 6px; + border-radius: 6px; + line-height: 20px; + display: inline-block; + } + } + + .history-time { + float: right; + opacity: 0.5; + } + } + } + } + + .session-history-load { + display: flex; + justify-content: center; + align-items: center; + width: 100%; + height: 36px; + .common-loading { + width: 20px; + height: 20px; + } + } +} + +body.window-portrait { + .dialog-session-history { + .session-history-list { + > ul { + > li { + &:hover { + background-color: transparent; + } + } + } + } + } +}