Browse Source

feat:多个提示词类型,切换角色

zhangwl 4 weeks ago
parent
commit
feaac38742

+ 2 - 1
chat-ai-ui-main/src/router/index.ts

@@ -4,7 +4,8 @@ import ChatView from '../views/ChatView.vue';
 
 const routes = [
   { path: '/', component: LoadingView },
-  { path: '/chat', component: ChatView },
+  { path: '/chat', redirect: '/default' }, // 兼容旧路由
+  { path: '/:promptType', component: ChatView }, // 支持 /default, /entrepreneur, /femininity
 ];
 
 export const router = createRouter({

+ 5 - 4
chat-ai-ui-main/src/stores/chat.ts

@@ -97,6 +97,7 @@ export const useChatStore = defineStore('chat', () => {
   const sessionId = ref<string>(generateUUID());
   const sessions = ref<Session[]>([]);
   const sidebarOpen = ref(false);
+  const promptType = ref<string>('default'); // 新增:当前使用的 promptType
 
   const userStore = useUserStore();
 
@@ -176,7 +177,7 @@ export const useChatStore = defineStore('chat', () => {
           attachments: files,
         }];
         const { data } = await axios.post(
-          `${import.meta.env.VITE_API_URL}/chat/chat`,
+          `${import.meta.env.VITE_API_URL}/chat/chat/${promptType.value}`,
           { messages: requestMessages, stream: false, sessionId: sessionId.value },
           { headers: { 'Authorization': `Bearer ${userStore.userId}`, 'Content-Type': 'application/json' } }
         );
@@ -230,14 +231,14 @@ export const useChatStore = defineStore('chat', () => {
         body: JSON.stringify({ messages: historySnapshot, stream: true, sessionId: sessionId.value }),
       };
 
-      let response = await fetch(`${import.meta.env.VITE_API_URL}/chat/chat`, fetchOptions);
+      let response = await fetch(`${import.meta.env.VITE_API_URL}/chat/chat/${promptType.value}`, fetchOptions);
 
       // 401 处理:刷新 token 后重试一次
       if (response.status === 401) {
         try {
           const newToken = await refreshAuthToken();
           (fetchOptions.headers as Record<string, string>)['Authorization'] = `Bearer ${newToken}`;
-          response = await fetch(`${import.meta.env.VITE_API_URL}/chat/chat`, fetchOptions);
+          response = await fetch(`${import.meta.env.VITE_API_URL}/chat/chat/${promptType.value}`, fetchOptions);
         } catch {
           userStore.logout();
           messages.value[aiMessageIndex] = {
@@ -358,5 +359,5 @@ export const useChatStore = defineStore('chat', () => {
     }
   };
 
-  return { messages, isLoading, sessionId, sessions, sidebarOpen, loadChatHistory, loadSessions, sendMessage, newConversation, switchSession, deleteSession };
+  return { messages, isLoading, sessionId, sessions, sidebarOpen, promptType, loadChatHistory, loadSessions, sendMessage, newConversation, switchSession, deleteSession };
 });

+ 44 - 2
chat-ai-ui-main/src/views/ChatView.vue

@@ -1,7 +1,10 @@
 <script setup lang="ts">
 import { onMounted, nextTick } from 'vue';
+import { useRoute, useRouter } from 'vue-router';
+import axios from 'axios';
 
 import { useChatStore } from '../stores/chat';
+import { useUserStore } from '../stores/user';
 
 import Header from '../components/Header.vue';
 import ChatInput from '../components/ChatInput.vue';
@@ -10,8 +13,10 @@ import { marked } from 'marked';
 import hljs from 'highlight.js';
 import { markedHighlight } from 'marked-highlight';
 
-
+const route = useRoute();
+const router = useRouter();
 const chatStore = useChatStore();
+const userStore = useUserStore();
 
 
 // 配置标记以获得更好的呈现
@@ -54,7 +59,44 @@ const scrollToBottom = () => {
 };
 
 // 初始化页面后进行加载历史消息
-onMounted(() => {
+onMounted(async () => {
+  // 从路由参数获取 promptType,默认为 'default'
+  const routePromptType = route.params.promptType as string || 'default';
+  chatStore.promptType = routePromptType;
+
+  // 检查 URL 中是否有 token 参数(直接访问 /entrepreneur?token=xxx 的情况)
+  const urlParams = new URLSearchParams(window.location.search);
+  const token = urlParams.get('token');
+  const source = urlParams.get('source');
+
+  // 如果有 token 但用户未登录,先验证 token
+  if (token && !userStore.userId) {
+    try {
+      console.log('[ChatView] Token found in URL, verifying...');
+      const { data } = await axios.post(
+        `${import.meta.env.VITE_API_URL}/users/token/third-party`,
+        { token, source }
+      );
+
+      console.log('[ChatView] Token verified, logging in user');
+      userStore.setUser({
+        userId: data.access_token,
+        name: data.username,
+        refreshToken: data.refresh_token,
+      });
+
+      // 清理 URL 中的 token 参数(避免刷新时重复验证)
+      const newUrl = `${window.location.pathname}`;
+      window.history.replaceState({}, '', newUrl);
+    } catch (error) {
+      console.error('[ChatView] Token verification failed:', error);
+      // 验证失败,跳转到根路径让 LoadingView 处理
+      await router.replace('/');
+      return;
+    }
+  }
+
+  // 加载聊天历史和会话列表
   chatStore.loadChatHistory().then(() => scrollToBottom());
   chatStore.loadSessions();
 });

+ 4 - 4
chat-ai-ui-main/src/views/LoadingView.vue

@@ -18,8 +18,8 @@ onMounted(async () => {
 
   // 防WebView循环:如果已登录且没有token参数,直接跳转到chat
   if (!token && userStore.userId) {
-    console.log('[LoadingView] User already logged in, redirecting to /chat');
-    await router.replace('/chat');
+    console.log('[LoadingView] User already logged in, redirecting to /default');
+    await router.replace('/default');
     return;
   }
 
@@ -45,8 +45,8 @@ onMounted(async () => {
     });
 
     // 使用 router.replace 而不是硬导航,避免 WebView 页面重新加载
-    console.log('[LoadingView] Navigating to /chat');
-    await router.replace('/chat');
+    console.log('[LoadingView] Navigating to /default');
+    await router.replace('/default');
   } catch (err: any) {
     console.error('[LoadingView] Token verification failed:', err);
     error.value = err.response?.data?.detail || '验证失败,请检查链接后重试';