Browse Source

hunk-2025-02-25 00:28:36

genlitex 2 tháng trước cách đây
mục cha
commit
ea7b980bba

Những thai đổi đã bị hủy bỏ vì nó quá lớn
+ 0 - 0
dist/assets/index-C0CcPcXb.css


Những thai đổi đã bị hủy bỏ vì nó quá lớn
+ 4 - 0
dist/assets/index-DR7a88IG.js


+ 14 - 0
dist/index.html

@@ -0,0 +1,14 @@
+<!doctype html>
+<html lang="en">
+  <head>
+    <meta charset="UTF-8" />
+    <link rel="icon" type="image/svg+xml" href="/vite.svg" />
+    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+    <title>Vite + Vue</title>
+    <script type="module" crossorigin src="/ide/proxy/6000/assets/index-DR7a88IG.js"></script>
+    <link rel="stylesheet" crossorigin href="/ide/proxy/6000/assets/index-C0CcPcXb.css">
+  </head>
+  <body>
+    <div id="app"></div>
+  </body>
+</html>

+ 63 - 100
src/assets/templates/dashboard.vue

@@ -1,131 +1,94 @@
 <template>
-  <div class="min-h-screen bg-[#1A103C] text-white flex">
+  <div class="min-h-screen flex bg-gradient-to-br from-white to-purple-600 text-gray-800">
     <!-- Sidebar -->
-    <nav class="w-64 bg-[#231849] p-4 space-y-4">
-      <div class="flex items-center gap-2 mb-8">
-        <div class="w-8 h-8 bg-purple-600 rounded-lg"></div>
-        <h1 class="text-xl font-semibold">GEN <span class="text-purple-500">LTEX</span></h1>
-      </div>
+    <nav class="w-64 bg-[#08002E] p-4 space-y-4">
+<div class="flex items-center gap-2 mb-8">
+  <h1 class="text-xl font-semibold bg-gradient-to-r from-purple-600 to-violet-400 bg-clip-text text-transparent">首页</h1>
+</div>
 
       <!-- Navigation Items -->
       <div class="space-y-2">
-        <a href="#" class="flex items-center gap-3 p-3 rounded-lg bg-[#2A1F53] text-white/90 hover:bg-[#2A1F53]/80">
-          <HomeIcon class="w-5 h-5" />
-          <span>Home</span>
-        </a>
+<a href="#/portal" class="flex items-center gap-3 p-3 rounded-lg text-white hover:bg-[#2A1F53]/80">
+  <HomeIcon class="w-5 h-5" />
+  <span>首页</span>
+</a>
 
-        <div class="mt-8 mb-4 text-xs text-white/50 px-3">MANAGER YOUR CONTEXT</div>
+        <!-- Remove this section -->
 
-        <template v-for="item in navItems" :key="item.name">
-          <a href="#" class="flex items-center gap-3 p-3 rounded-lg text-white/70 hover:bg-[#2A1F53]/80">
-            <component :is="item.icon" class="w-5 h-5" />
-            <span>{{ item.name }}</span>
-            <span v-if="item.badge" class="ml-auto bg-purple-500 text-white text-xs px-2 py-0.5 rounded-full">
-              {{ item.badge }}
-            </span>
-          </a>
-        </template>
+<a href="#/project-management" class="flex items-center gap-3 p-3 rounded-lg text-white hover:bg-[#2A1F53]/80">
+  <BriefcaseIcon class="w-5 h-5" />
+  <span>项目管理</span>
+</a>
+<a href="#/data-analysis" class="flex items-center gap-3 p-3 rounded-lg text-white hover:bg-[#2A1F53]/80">
+  <ActivityIcon class="w-5 h-5" />
+  <span>数据分析</span>
+</a>
       </div>
 
       <!-- User Profile -->
-      <div class="absolute bottom-4 flex items-center gap-3 p-3 text-white/70">
-        <div class="w-8 h-8 bg-gray-600 rounded-full"></div>
-        <div>
-          <div class="text-sm">zbytest003</div>
-          <div class="text-xs text-white/50">platform admin</div>
-        </div>
-      </div>
+<!-- Remove user profile section -->
     </nav>
 
     <!-- Main Content -->
-    <main class="flex-1 p-6 space-y-6">
+    <main class="flex-1 p-6 space-y-6 bg-gradient-to-br from-white to-purple-600">
       <!-- Hero Section -->
-      <section class="p-8 rounded-2xl bg-[#231849]">
-        <h1 class="text-4xl font-bold mb-4">
-          <span class="text-purple-500">Empowering</span><br />
-          Your Future with<br />
-          GenAI Solutions<br />
-          for <span class="text-purple-500">TDLC</span>
-        </h1>
-        <p class="text-white/70 max-w-md">
-          Explore Our Innovative Features and Unlock the Full Potential of GenAI for Your Project's Success
-        </p>
-      </section>
+<!-- Remove hero section -->
 
       <!-- Cards Grid -->
-      <div class="grid md:grid-cols-2 gap-6">
-        <!-- TDLC Card -->
-        <div class="p-6 rounded-2xl bg-[#231849]">
-          <div class="w-12 h-12 mb-4 bg-purple-500/20 rounded-lg flex items-center justify-center">
-            <LayoutIcon class="w-6 h-6 text-purple-500" />
-          </div>
-          <h2 class="text-2xl font-semibold mb-2">
-            TDLC for <span class="text-purple-500">System Integration</span> project
-          </h2>
-          <p class="text-white/70 mb-6">
-            Get comprehensive guidance for your new projects, from the initial concept all the way through detailed design and implementation.
-          </p>
-          <button class="px-4 py-2 bg-purple-500 rounded-lg hover:bg-purple-600 transition-colors">
-            Begin Your Journey
-          </button>
-        </div>
+<!-- Light and Easy Version Module -->
+<div class="flex flex-col md:flex-row gap-6">
+  <!-- Generate User Stories Module -->
+  <div class="p-6 rounded-2xl bg-white shadow-md flex-1">
+    <h2 class="text-2xl font-semibold mb-2">生成用户故事</h2>
+    <p class="text-gray-600 mb-6">
+      创建详细的用户故事以指导项目的开发过程。
+    </p>
+    <button @click="navigateToUserStories" class="px-4 py-2 bg-purple-500 text-white rounded-lg hover:bg-purple-600 transition-colors">
+      生成用户故事
+    </button>
+  </div>
 
-        <!-- Analysis Card -->
-        <div class="p-6 rounded-2xl bg-[#231849]">
-          <div class="w-12 h-12 mb-4 bg-purple-500/20 rounded-lg flex items-center justify-center">
-            <ActivityIcon class="w-6 h-6 text-purple-500" />
-          </div>
-          <h2 class="text-2xl font-semibold mb-2">
-            Intelligent <span class="text-purple-500">Project Analysis</span>
-          </h2>
-          <p class="text-white/70 mb-6">
-            Upload a ZIP file containing your existing project files and let GenAI analyze it for you.
-          </p>
-          <button class="px-4 py-2 bg-purple-500 rounded-lg hover:bg-purple-600 transition-colors">
-            Gain New Insights
-          </button>
-        </div>
+  <!-- Generate Test Scripts Module -->
+  <div class="p-6 rounded-2xl bg-white shadow-md flex-1">
+    <h2 class="text-2xl font-semibold mb-2">生成测试脚本</h2>
+    <p class="text-gray-600 mb-6">
+      自动生成测试脚本以确保项目的质量。
+    </p>
+    <button class="px-4 py-2 bg-purple-500 text-white rounded-lg hover:bg-purple-600 transition-colors">
+      生成测试脚本
+    </button>
+  </div>
+</div>
 
-        <!-- Workspace Card -->
-        <div class="md:col-span-2 p-6 rounded-2xl bg-[#231849]">
-          <div class="w-12 h-12 mb-4 bg-purple-500/20 rounded-lg flex items-center justify-center">
-            <MessageSquareIcon class="w-6 h-6 text-purple-500" />
-          </div>
-          <h2 class="text-2xl font-semibold mb-2">
-            Let's <span class="text-purple-500">Talk</span> To Your Workspace Knowledge
-          </h2>
-          <p class="text-white/70">
-            A smart chatbot designed to interact with and retrieve information from your workspace.
-          </p>
-        </div>
-      </div>
+<!-- Intelligent Project Analysis Module -->
+<div class="p-6 rounded-2xl bg-white shadow-md">
+  <h2 class="text-2xl font-semibold mb-2">智能项目分析</h2>
+  <p class="text-gray-600 mb-6">
+    利用智能工具分析项目,提供深入的见解和建议。
+  </p>
+  <button class="px-4 py-2 bg-purple-500 text-white rounded-lg hover:bg-purple-600 transition-colors">
+    进行项目分析
+  </button>
+</div>
     </main>
   </div>
 </template>
 
 <script setup>
+import { useRouter } from 'vue-router'
 import {
   Home as HomeIcon,
-  Layout as LayoutIcon,
-  Activity as ActivityIcon,
-  MessageSquare as MessageSquareIcon,
-  FileText as FileTextIcon,
-  Link as LinkIcon,
-  User as UserIcon,
-  Bell as BellIcon,
-  Briefcase as BriefcaseIcon
+  Briefcase as BriefcaseIcon,
+  Activity as ActivityIcon
 } from 'lucide-vue-next'
 
-const navItems = [
-  { name: 'Workspace', icon: BriefcaseIcon },
-  { name: 'Knowledge', icon: FileTextIcon },
-  { name: 'Prompt', icon: MessageSquareIcon },
-  { name: 'Link', icon: LinkIcon },
-  { name: 'User', icon: UserIcon },
-  { name: 'Notifications', icon: BellIcon, badge: '0' },
-]
+const router = useRouter()
+
+const navigateToUserStories = () => {
+  router.push('/user-stories')
+}
 </script>
 
 <style>
 
-</style>
+</style>

+ 60 - 98
src/assets/templates/generate_user_stories.vue

@@ -1,110 +1,65 @@
 <template>
-  <div class="flex h-screen bg-gray-50">
-    <!-- Sidebar -->
-    <aside class="w-64 bg-[#1A1A2E] text-white flex flex-col">
-      <!-- Logo -->
-      <div class="p-6">
-        <div class="flex items-center gap-2">
-          <div class="w-8 h-8 bg-purple-500 rounded-lg flex items-center justify-center">
-            <PlaySquare class="w-5 h-5" />
-          </div>
-          <span class="text-xl font-semibold">GEN <span class="text-purple-400">LTEX</span></span>
-        </div>
-      </div>
-
-      <!-- Navigation -->
-      <nav class="flex-1 px-4">
-        <div class="mb-8">
-          <div class="flex items-center justify-between mb-4">
-            <span class="text-sm">Sessions</span>
-            <button class="px-3 py-1 text-xs bg-purple-600 rounded-md hover:bg-purple-700">
-              + New Requirement
-            </button>
-          </div>
-        </div>
-
-        <div class="space-y-6">
-          <div class="text-xs text-gray-400 uppercase">MANAGE YOUR CONTEXT</div>
-          <div class="space-y-2">
-            <a v-for="(item, index) in menuItems"
-               :key="index"
-               href="#"
-               class="flex items-center gap-3 px-3 py-2 text-gray-300 rounded-lg hover:bg-purple-600/20">
-              <component :is="item.icon" class="w-5 h-5" />
-              {{ item.name }}
-              <span v-if="item.badge"
-                    class="ml-auto px-2 py-0.5 text-xs bg-purple-500 rounded-full">
-                {{ item.badge }}
-              </span>
-            </a>
-          </div>
-        </div>
-      </nav>
-
-      <!-- User Profile -->
-      <div class="p-4 border-t border-gray-700">
-        <div class="flex items-center gap-3">
-          <div class="w-10 h-10 bg-gray-600 rounded-full"></div>
-          <div>
-            <div class="text-sm font-medium">zbytest003</div>
-            <div class="text-xs text-gray-400">platform admin</div>
-          </div>
-          <ChevronRight class="w-4 h-4 ml-auto text-gray-400" />
-        </div>
-      </div>
-    </aside>
+  <div class="flex h-screen bg-gradient-to-br from-white to-purple-600">
+<!-- Sidebar -->
+<aside class="w-64 bg-[#08002E] text-white flex flex-col">
+  <!-- Chat History -->
+  <div class="p-6">
+    <h2 class="text-xl font-semibold">聊天历史记录</h2>
+    <ul class="mt-4 space-y-2">
+      <li v-for="(message, index) in chatHistory" :key="index" class="text-gray-300">
+        {{ message }}
+      </li>
+    </ul>
+  </div>
+</aside>
 
-    <!-- Main Content -->
-    <main class="flex-1 overflow-auto">
-      <div class="max-w-4xl mx-auto p-8">
-        <!-- Header -->
-        <div class="flex justify-between items-center mb-8">
-          <div>
-            <h1 class="text-2xl font-semibold mb-2">Hi, zbytest003</h1>
-            <p class="text-gray-600">I am GenliteX User Story generator, I'm here to help.</p>
-          </div>
-          <div class="w-64">
-            <select class="w-full p-2 border rounded-lg">
-              <option value="">Select a model</option>
-            </select>
+<!-- Main Content -->
+<main class="flex-1 overflow-auto p-6 bg-gradient-to-br from-white to-purple-600">
+  <div class="flex flex-col md:flex-row h-full">
+    <!-- Chat Content -->
+    <div class="flex-1 p-4 bg-white shadow-md">
+      <div class="h-full flex flex-col">
+        <div class="flex-1 overflow-y-auto">
+          <div v-for="(message, index) in chatMessages" :key="index" class="mb-4">
+            <div v-if="message.type === 'user'" class="flex justify-end">
+              <div class="max-w-md px-4 py-2 bg-blue-100 rounded-lg text-gray-800">
+                {{ message.text }}
+              </div>
+            </div>
+            <div v-else class="flex justify-start">
+              <div class="max-w-md px-4 py-2 bg-gray-100 rounded-lg text-gray-800">
+                {{ message.text }}
+              </div>
+            </div>
           </div>
         </div>
-
-        <!-- Content -->
-        <div class="bg-white p-6 rounded-lg shadow-sm mb-6">
-          <p class="text-gray-600 mb-4">
-            Simply upload the related documents you have so that I can understand the background and generate user stories more accurately.
-          </p>
-          <p class="text-gray-600">
-            You can also constantly clarify your requests through the conversation.
-          </p>
-        </div>
-
-        <!-- Chat Input -->
-        <div class="flex gap-2">
-          <div class="flex-1 relative">
+        <div class="border-t border-gray-200 p-4">
+          <div class="flex gap-2">
             <input
+                v-model="userInput"
                 type="text"
-                placeholder="Chat with GentLiteX Chatbot ..."
+                placeholder="Type a message..."
                 class="w-full p-3 pr-12 border rounded-lg"
             />
             <Upload class="absolute right-4 top-1/2 -translate-y-1/2 text-gray-400" />
+            <button @click="sendMessage" class="p-3 bg-purple-500 text-white rounded-lg hover:bg-purple-600">
+              <Send class="w-5 h-5" />
+            </button>
           </div>
-          <button class="p-3 bg-purple-500 text-white rounded-lg hover:bg-purple-600">
-            <Send class="w-5 h-5" />
-          </button>
         </div>
       </div>
-    </main>
+    </div>
+  </div>
+</main>
   </div>
 </template>
 
 <script setup>
 import {
-  PlaySquare,
-  ChevronRight,
   Upload,
   Send,
+  PlaySquare,
+  ChevronRight,
   Home,
   Briefcase,
   Book,
@@ -114,17 +69,24 @@ import {
   Bell
 } from 'lucide-vue-next'
 
-const menuItems = [
-  { name: 'Home', icon: Home },
-  { name: 'Workspace', icon: Briefcase },
-  { name: 'Knowledge', icon: Book },
-  { name: 'Prompt', icon: MessageSquare },
-  { name: 'Link', icon: Link },
-  { name: 'User', icon: User },
-  { name: 'Notifications', icon: Bell, badge: '0' },
-]
+import { ref } from 'vue'
+
+const chatHistory = ref(['消息1', '消息2', '消息3'])
+const chatMessages = ref([])
+const userInput = ref('')
+
+const sendMessage = () => {
+  if (userInput.value.trim()) {
+    chatMessages.value.push({ type: 'user', text: userInput.value })
+    userInput.value = ''
+    // Simulate an auto-reply
+    setTimeout(() => {
+      chatMessages.value.push({ type: 'bot', text: '这是自动回复的消息' })
+    }, 500)
+  }
+}
 </script>
 
 <style>
 /* Additional styles can be added here if needed */
-</style>
+</style>

+ 37 - 54
src/assets/templates/login.vue

@@ -1,40 +1,31 @@
 <template>
-  <div class="min-h-screen flex bg-gradient-to-br from-purple-950 to-black">
-    <!-- Left side - Logo & Description -->
-    <div class="hidden lg:flex lg:w-1/2 flex-col items-center justify-center p-12">
-      <h1 class="text-7xl font-bold bg-gradient-to-r from-purple-600 to-violet-400 bg-clip-text text-transparent">
-        GenLiteX
-      </h1>
-      <p class="mt-6 text-2xl text-center text-gray-300 max-w-xl">
-        Generative Artificial Intelligent for Technology Development Lifecycle Platform
-      </p>
-    </div>
+  <div class="min-h-screen flex bg-gradient-to-br from-white to-purple-600">
+<!-- No header/logo/description needed -->
 
     <!-- Right side - Login Form -->
     <div class="w-full lg:w-1/2 flex flex-col justify-between p-8 lg:p-12">
       <div class="max-w-md w-full mx-auto mt-8">
-        <div class="mb-8">
-          <h2 class="text-3xl font-semibold text-white mb-2">Login</h2>
-          <p class="text-gray-400">Glad you're back!</p>
-        </div>
+<div class="mb-8">
+  <h2 class="text-3xl font-semibold text-gray-800 mb-2">Login</h2>
+</div>
 
         <form @submit.prevent="handleLogin" class="space-y-6">
           <div>
-            <input
-                type="text"
-                v-model="username"
-                placeholder="Username"
-                class="w-full px-4 py-3 rounded-lg bg-gray-900/50 border border-gray-700 text-white placeholder-gray-400 focus:outline-none focus:border-purple-500"
-            />
+<input
+    type="text"
+    v-model="username"
+    placeholder="请输入用户名"
+    class="w-full px-4 py-3 rounded-lg bg-white border border-gray-300 text-gray-800 placeholder-gray-400 focus:outline-none focus:border-purple-500"
+/>
           </div>
 
           <div>
-            <input
-                type="password"
-                v-model="password"
-                placeholder="Password"
-                class="w-full px-4 py-3 rounded-lg bg-gray-900/50 border border-gray-700 text-white placeholder-gray-400 focus:outline-none focus:border-purple-500"
-            />
+<input
+    type="password"
+    v-model="password"
+    placeholder="请输入密码"
+    class="w-full px-4 py-3 rounded-lg bg-white border border-gray-300 text-gray-800 placeholder-gray-400 focus:outline-none focus:border-purple-500"
+/>
           </div>
 
           <div class="flex items-center">
@@ -47,21 +38,18 @@
             <label for="remember" class="ml-2 text-gray-400">Remember me</label>
           </div>
 
-          <button
-              type="submit"
-              class="w-full py-3 rounded-lg bg-purple-500 hover:bg-purple-600 text-white font-medium transition-colors"
-          >
-            Login
-          </button>
+<button
+    type="submit"
+    class="w-full py-3 rounded-lg bg-purple-500 hover:bg-purple-600 text-white font-medium transition-colors"
+>
+  登录
+</button>
 
-          <div class="text-center">
-            <a href="#" class="text-purple-400 hover:text-purple-300">Forgot password ?</a>
-          </div>
+<div class="text-center">
+  <a href="#" class="text-gray-600 hover:text-purple-500">忘记密码 ?</a>
+</div>
 
-          <div class="text-center text-gray-400">
-            Don't have an account ?
-            <a href="#" class="text-purple-400 hover:text-purple-300">Signup</a>
-          </div>
+<!-- Remove signup link -->
         </form>
 
         <!-- Language Selector -->
@@ -78,20 +66,16 @@
         </div>
       </div>
 
-      <!-- Footer -->
-      <div class="mt-auto pt-8">
-        <div class="flex justify-center gap-6 text-sm text-gray-400">
-          <a href="#" class="hover:text-purple-400">Terms & Conditions</a>
-          <a href="#" class="hover:text-purple-400">Support</a>
-          <a href="#" class="hover:text-purple-400">Customer Care</a>
-        </div>
-      </div>
+<!-- Remove footer links -->
     </div>
   </div>
 </template>
 
 <script setup>
 import { ref } from 'vue'
+import { useRouter } from 'vue-router'
+
+const router = useRouter()
 
 const username = ref('')
 const password = ref('')
@@ -99,11 +83,10 @@ const rememberMe = ref(false)
 const language = ref('en')
 
 const handleLogin = () => {
-  // Handle login logic here
-  console.log({
-    username: username.value,
-    password: password.value,
-    rememberMe: rememberMe.value
-  })
+  if (username.value === 'admin' && password.value === 'admin') {
+    router.push('/portal')
+  } else {
+    alert('用户名或密码错误')
+  }
 }
-</script>
+</script>

+ 18 - 0
src/router/index.js

@@ -1,11 +1,29 @@
 import { createRouter, createWebHashHistory } from 'vue-router'
 import HomeView from '../views/HomeView.vue'
+import LoginView from '../views/LoginView.vue'
+import PortalView from '../views/PortalView.vue'
+import UserStoriesView from '../views/UserStoriesView.vue'
 
 const routes = [
   {
     path: '/',
     name: 'home',
     component: HomeView
+  },
+  {
+    path: '/login',
+    name: 'login',
+    component: LoginView
+  },
+  {
+    path: '/portal',
+    name: 'portal',
+    component: PortalView
+  },
+  {
+    path: '/user-stories',
+    name: 'user-stories',
+    component: UserStoriesView
   }
 ]
 

+ 86 - 0
src/views/LoginView.vue

@@ -0,0 +1,86 @@
+<template>
+  <div class="min-h-screen flex bg-gradient-to-br from-white to-purple-600">
+    <!-- Right side - Login Form -->
+    <div class="w-full lg:w-1/2 flex flex-col justify-between p-8 lg:p-12">
+      <div class="max-w-md w-full mx-auto mt-8">
+        <div class="mb-8">
+          <h2 class="text-3xl font-semibold text-gray-800 mb-2">Login</h2>
+        </div>
+
+        <form @submit.prevent="handleLogin" class="space-y-6">
+          <div>
+            <input
+                type="text"
+                v-model="username"
+                placeholder="请输入用户名"
+                class="w-full px-4 py-3 rounded-lg bg-white border border-gray-300 text-gray-800 placeholder-gray-400 focus:outline-none focus:border-purple-500"
+            />
+          </div>
+
+          <div>
+            <input
+                type="password"
+                v-model="password"
+                placeholder="请输入密码"
+                class="w-full px-4 py-3 rounded-lg bg-white border border-gray-300 text-gray-800 placeholder-gray-400 focus:outline-none focus:border-purple-500"
+            />
+          </div>
+
+          <div class="flex items-center">
+            <input
+                type="checkbox"
+                id="remember"
+                v-model="rememberMe"
+                class="w-4 h-4 rounded border-gray-700 bg-gray-900/50 text-purple-500 focus:ring-purple-500"
+            />
+            <label for="remember" class="ml-2 text-gray-400">记住我</label>
+          </div>
+
+          <button
+              type="submit"
+              class="w-full py-3 rounded-lg bg-purple-500 hover:bg-purple-600 text-white font-medium transition-colors"
+          >
+            登录
+          </button>
+
+          <div class="text-center">
+            <a href="#/forgot-password" class="text-gray-600 hover:text-purple-500">忘记密码 ?</a>
+          </div>
+
+          <!-- Language Selector -->
+          <div class="mt-8 flex items-center justify-center gap-2">
+            <span class="text-gray-400">语言:</span>
+            <select
+                v-model="language"
+                class="px-3 py-1.5 rounded bg-gray-900/50 border border-gray-700 text-gray-300 focus:outline-none focus:border-purple-500"
+            >
+              <option value="en">English</option>
+              <option value="es">Español</option>
+              <option value="fr">Français</option>
+            </select>
+          </div>
+        </form>
+      </div>
+    </div>
+  </div>
+</template>
+
+<script setup>
+import { ref } from 'vue'
+import { useRouter } from 'vue-router'
+
+const router = useRouter()
+
+const username = ref('')
+const password = ref('')
+const rememberMe = ref(false)
+const language = ref('en')
+
+const handleLogin = () => {
+  if (username.value === 'admin' && password.value === 'admin') {
+    router.push('/portal')
+  } else {
+    alert('用户名或密码错误')
+  }
+}
+</script>

+ 81 - 0
src/views/PortalView.vue

@@ -0,0 +1,81 @@
+<template>
+  <div class="min-h-screen flex bg-gradient-to-br from-white to-purple-600 text-gray-800">
+    <!-- Sidebar -->
+    <nav class="w-64 bg-[#08002E] p-4 space-y-4">
+      <div class="p-6">
+        <h2 class="text-xl font-semibold bg-gradient-to-r from-purple-600 to-violet-400 bg-clip-text text-transparent">首页</h2>
+      </div>
+
+      <!-- Navigation Items -->
+      <div class="space-y-2">
+        <a href="#/portal" class="flex items-center gap-3 p-3 rounded-lg text-white hover:bg-[#2A1F53]/80">
+          <HomeIcon class="w-5 h-5" />
+          <span>首页</span>
+        </a>
+
+        <a href="#/project-management" class="flex items-center gap-3 p-3 rounded-lg text-white hover:bg-[#2A1F53]/80">
+          <BriefcaseIcon class="w-5 h-5" />
+          <span>项目管理</span>
+        </a>
+        <a href="#/data-analysis" class="flex items-center gap-3 p-3 rounded-lg text-white hover:bg-[#2A1F53]/80">
+          <ActivityIcon class="w-5 h-5" />
+          <span>数据分析</span>
+        </a>
+      </div>
+    </nav>
+
+    <!-- Main Content -->
+    <main class="flex-1 p-6 space-y-6 bg-gradient-to-br from-white to-purple-600">
+      <!-- Light and Easy Version Module -->
+      <div class="flex flex-col md:flex-row gap-6">
+        <!-- Generate User Stories Module -->
+        <div class="p-6 rounded-2xl bg-white shadow-md flex-1">
+          <h2 class="text-2xl font-semibold mb-2">生成用户故事</h2>
+          <p class="text-gray-600 mb-6">
+            创建详细的用户故事以指导项目的开发过程。
+          </p>
+          <button @click="navigateToUserStories" class="px-4 py-2 bg-purple-500 text-white rounded-lg hover:bg-purple-600 transition-colors">
+            生成用户故事
+          </button>
+        </div>
+
+        <!-- Generate Test Scripts Module -->
+        <div class="p-6 rounded-2xl bg-white shadow-md flex-1">
+          <h2 class="text-2xl font-semibold mb-2">生成测试脚本</h2>
+          <p class="text-gray-600 mb-6">
+            自动生成测试脚本以确保项目的质量。
+          </p>
+          <button class="px-4 py-2 bg-purple-500 text-white rounded-lg hover:bg-purple-600 transition-colors">
+            生成测试脚本
+          </button>
+        </div>
+      </div>
+
+      <!-- Intelligent Project Analysis Module -->
+      <div class="p-6 rounded-2xl bg-white shadow-md">
+        <h2 class="text-2xl font-semibold mb-2">智能项目分析</h2>
+        <p class="text-gray-600 mb-6">
+          利用智能工具分析项目,提供深入的见解和建议。
+        </p>
+        <button class="px-4 py-2 bg-purple-500 text-white rounded-lg hover:bg-purple-600 transition-colors">
+          进行项目分析
+        </button>
+      </div>
+    </main>
+  </div>
+</template>
+
+<script setup>
+import { useRouter } from 'vue-router'
+import {
+  Home as HomeIcon,
+  Briefcase as BriefcaseIcon,
+  Activity as ActivityIcon
+} from 'lucide-vue-next'
+
+const router = useRouter()
+
+const navigateToUserStories = () => {
+  router.push('/user-stories')
+}
+</script>

+ 88 - 0
src/views/UserStoriesView.vue

@@ -0,0 +1,88 @@
+<template>
+  <div class="flex h-screen bg-gradient-to-br from-white to-purple-600">
+    <!-- Sidebar -->
+    <aside class="w-64 bg-[#08002E] text-white flex flex-col">
+      <!-- Chat History -->
+      <div class="p-6">
+        <h2 class="text-xl font-semibold">聊天历史记录</h2>
+        <ul class="mt-4 space-y-2">
+          <li v-for="(message, index) in chatHistory" :key="index" class="text-gray-300">
+            {{ message }}
+          </li>
+        </ul>
+      </div>
+    </aside>
+
+    <!-- Main Content -->
+    <main class="flex-1 overflow-auto p-6 bg-gradient-to-br from-white to-purple-600">
+      <div class="flex flex-col md:flex-row h-full">
+        <!-- Chat Content -->
+        <div class="flex-1 p-4 bg-white shadow-md">
+          <div class="h-full flex flex-col">
+            <div class="flex-1 overflow-y-auto">
+              <div v-for="(message, index) in chatMessages" :key="index" class="mb-4">
+                <div v-if="message.type === 'user'" class="flex justify-end">
+                  <div class="max-w-md px-4 py-2 bg-blue-100 rounded-lg text-gray-800">
+                    {{ message.text }}
+                  </div>
+                </div>
+                <div v-else class="flex justify-start">
+                  <div class="max-w-md px-4 py-2 bg-gray-100 rounded-lg text-gray-800">
+                    {{ message.text }}
+                  </div>
+                </div>
+              </div>
+            </div>
+            <div class="border-t border-gray-200 p-4">
+              <div class="flex gap-2">
+                <input
+                    v-model="userInput"
+                    type="text"
+                    placeholder="Type a message..."
+                    class="w-full p-3 pr-12 border rounded-lg"
+                />
+                <Upload class="absolute right-4 top-1/2 -translate-y-1/2 text-gray-400" />
+                <button @click="sendMessage" class="p-3 bg-purple-500 text-white rounded-lg hover:bg-purple-600">
+                  <Send class="w-5 h-5" />
+                </button>
+              </div>
+            </div>
+          </div>
+        </div>
+      </div>
+    </main>
+  </div>
+</template>
+
+<script setup>
+import {
+  Upload,
+  Send,
+  PlaySquare,
+  ChevronRight,
+  Home,
+  Briefcase,
+  Book,
+  MessageSquare,
+  Link,
+  User,
+  Bell
+} from 'lucide-vue-next'
+
+import { ref } from 'vue'
+
+const chatHistory = ref(['消息1', '消息2', '消息3'])
+const chatMessages = ref([])
+const userInput = ref('')
+
+const sendMessage = () => {
+  if (userInput.value.trim()) {
+    chatMessages.value.push({ type: 'user', text: userInput.value })
+    userInput.value = ''
+    // Simulate an auto-reply
+    setTimeout(() => {
+      chatMessages.value.push({ type: 'bot', text: '这是自动回复的消息' })
+    }, 500)
+  }
+}
+</script>

Một số tệp đã không được hiển thị bởi vì quá nhiều tập tin thay đổi trong này khác