From 7692e06e56a2d56bb57733ba303b2a23b36975a2 Mon Sep 17 00:00:00 2001
From: xiangpei <xiangpei@timesnew.cn>
Date: 星期二, 25 三月 2025 18:06:14 +0800
Subject: [PATCH] 对话、知识库页面,首页

---
 src/assets/img/logo.png          |    0 
 src/App.vue                      |    1 
 src/router/index.js              |   26 +++--
 src/components/KnowledgeBase.vue |  149 +++++++++++++++++++++++++++++
 src/views/Index.vue              |  105 +++++++++++++++++++++
 src/components/AiChat.vue        |    6 
 6 files changed, 273 insertions(+), 14 deletions(-)

diff --git a/src/App.vue b/src/App.vue
index aada410..c102b28 100644
--- a/src/App.vue
+++ b/src/App.vue
@@ -9,7 +9,6 @@
   font-family: Avenir, Helvetica, Arial, sans-serif;
   -webkit-font-smoothing: antialiased;
   -moz-osx-font-smoothing: grayscale;
-  text-align: center;
   color: #2c3e50;
 }
 
diff --git a/src/assets/img/logo.png b/src/assets/img/logo.png
new file mode 100644
index 0000000..5de8ee8
--- /dev/null
+++ b/src/assets/img/logo.png
Binary files differ
diff --git a/src/components/AiChat.vue b/src/components/AiChat.vue
index 2e01898..41a0fd7 100644
--- a/src/components/AiChat.vue
+++ b/src/components/AiChat.vue
@@ -1,5 +1,5 @@
 <template>
-  <div>
+  <div style="position: relative;height: 800px;width: 100%;display: flex;justify-content: center">
     <!-- 鑱婂ぉ娑堟伅鍒楄〃 -->
     <div class="chat-messages">
       <div
@@ -139,9 +139,11 @@
 }
 
 .chat-messages {
-  flex: 1;
   padding: 16px;
+  margin-top: 54px;
   overflow-y: auto;
+  width: 800px;
+  height: 680px;
 }
 
 .message {
diff --git a/src/components/KnowledgeBase.vue b/src/components/KnowledgeBase.vue
new file mode 100644
index 0000000..531a9b0
--- /dev/null
+++ b/src/components/KnowledgeBase.vue
@@ -0,0 +1,149 @@
+<template>
+  <div style="display: flex;justify-content: center">
+    <div class="knowledge-body">
+      <el-select v-model="value" size="medium" placeholder="璇烽�夋嫨鐭ヨ瘑搴�">
+        <el-option
+            v-for="item in options"
+            :key="item.value"
+            :label="item.label"
+            :value="item.value">
+        </el-option>
+      </el-select>
+      <div class="normal-text" style="margin-top: 15px;margin-bottom: 5px">閫夋嫨鐭ヨ瘑鏂囦欢(鍗曚釜鏂囦欢涓嶈秴杩�200M)</div>
+      <el-alert
+          description="HTML,MD,JSON,CSV,PDF,PNG,JPG,JPEG,BMP,EML,MSG,RST,RIF,TXT,XML,DOCX,EPUB,ODT,PPT,PPTX,TSV,HTM"
+          type="info"
+          :closable="false"
+          show-icon>
+      </el-alert>
+      <el-upload
+          class="upload"
+          drag
+          :on-change="handleChange"
+          :before-upload="handleUpload"
+          :file-list="fileList"
+          multiple>
+        <i class="el-icon-upload"></i>
+        <div class="el-upload__text">
+          <div>灏嗘枃浠舵嫋鍒版澶勶紝鎴�<em>鐐瑰嚮涓婁紶</em></div>
+        </div>
+      </el-upload>
+      <div class="file-setting">
+        <div class="file-setting-content">
+          <div class="normal-text file-setting-title">鏂囦欢澶勭悊閰嶇疆</div>
+          <el-form :inline="true" :model="form" size="mini" label-position="top" class="form-inline">
+            <el-form-item label="鍗曟鏂囨湰鏈�澶ч暱搴︼細">
+              <el-input v-model="form.user" type="number"></el-input>
+            </el-form-item>
+            <el-form-item label="鐩搁偦鏂囨湰閲嶅悎闀垮害锛�">
+              <el-input v-model="form.user" type="number"></el-input>
+            </el-form-item>
+            <el-form-item label="鍏跺畠锛�">
+              <el-checkbox v-model="form.checked">寮�鍚腑鏂囨爣棰樺姞寮�</el-checkbox>
+            </el-form-item>
+          </el-form>
+        </div>
+      </div>
+      <div style="margin-top: 15px">
+        <el-button type="primary" size="small">娣诲姞鏂囦欢鍒扮煡璇嗗簱</el-button>
+      </div>
+    </div>
+  </div>
+</template>
+
+<script>
+export default {
+  name: "KnowledgeBase",
+  data() {
+    return {
+      fileList: [],
+      form: {
+
+      },
+      options: [{
+        value: '閫夐」1',
+        label: '榛勯噾绯�'
+      }, {
+        value: '閫夐」2',
+        label: '鍙岀毊濂�'
+      }, {
+        value: '閫夐」3',
+        label: '铓典粩鐓�'
+      }, {
+        value: '閫夐」4',
+        label: '榫欓』闈�'
+      }, {
+        value: '閫夐」5',
+        label: '鍖椾含鐑ら腑'
+      }],
+      value: ''
+    }
+  },
+  methods: {
+    handleUpload(file) {
+      if (this.fileList.indexOf(file) === -1) {
+        this.fileList.push(file)
+      }
+      return false
+    },
+    handleChange(file, fileList) {
+      this.fileList = fileList;
+    }
+  }
+}
+</script>
+
+<style scoped>
+.knowledge-body {
+  width: 650px;
+  margin-top: 70px;
+}
+.upload {
+  margin-top: 5px;
+}
+.normal-text {
+  color: #606266;
+  font-size: 14px;
+}
+.file-setting {
+  width: 100%;
+  height: 100px;
+  border: 1px solid lightgray;
+  border-radius: 6px;
+  position: relative;
+}
+.file-setting-title {
+  margin-bottom: 10px;
+}
+.file-setting-content {
+  width: 100%;
+  height: 100%;
+  padding: 8px;
+}
+.form-inline {
+  padding-left: 10px;
+}
+.el-select {
+  width: 100%;
+}
+.el-upload__tip {
+  word-wrap: break-word;  /* 闀垮崟璇嶆垨URL鎹㈣ */
+  overflow-wrap: break-word; /* 鏇寸幇浠g殑灞炴�э紝鏁堟灉绫讳技 */
+  white-space: normal; /* 榛樿鍊硷紝鍏佽鎹㈣ */
+}
+::v-deep .el-upload-dragger {
+  width: 650px !important;
+}
+
+::v-deep .el-upload-list {
+  max-height: 100px;
+  overflow-y: scroll;
+}
+::v-deep .el-form-item__label {
+  padding-bottom: 0px;
+}
+
+::v-deep .el-form-item {
+  margin-right: 20px;
+}
+</style>
diff --git a/src/router/index.js b/src/router/index.js
index 13499be..d8b25ab 100644
--- a/src/router/index.js
+++ b/src/router/index.js
@@ -1,23 +1,27 @@
 import Vue from 'vue'
 import VueRouter from 'vue-router'
-import HomeView from '../views/HomeView.vue'
 
 Vue.use(VueRouter)
 
 const routes = [
   {
     path: '/',
-    name: 'home',
-    component: HomeView
+    name: 'index',
+    component: () => import(/* webpackChunkName: "about" */ '../views/Index.vue'),
+    children: [
+      {
+        path: '/chat',
+        name: 'chat',
+        component: () => import(/* webpackChunkName: "about" */ '../components/AiChat.vue')
+      },
+      {
+        path: '/knowledge',
+        name: 'knowledge',
+        component: () => import(/* webpackChunkName: "about" */ '../components/KnowledgeBase.vue')
+      },
+    ]
   },
-  // {
-  //   path: '/about',
-  //   name: 'about',
-  //   // route level code-splitting
-  //   // this generates a separate chunk (about.[hash].js) for this route
-  //   // which is lazy-loaded when the route is visited.
-  //   component: () => import(/* webpackChunkName: "about" */ '../views/AboutView.vue')
-  // }
+
 ]
 
 const router = new VueRouter({
diff --git a/src/views/Index.vue b/src/views/Index.vue
new file mode 100644
index 0000000..84ebc4a
--- /dev/null
+++ b/src/views/Index.vue
@@ -0,0 +1,105 @@
+<template>
+  <div class="index">
+    <div class="left">
+      <div class="logo">
+        <img style="width: 60px;height: 60px" src="@/assets/img/logo.png"/>
+      </div>
+      <div class="menu">
+        <div :class="{tab: true, activeTab: activeTab === 0}" @click="changeTab(0)">
+          <svg t="1742895429099" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="1205" width="18" height="18">
+            <path d="M174.72 855.68l130.048-43.392 23.424 11.392C382.4 849.984 444.352 864 512 864c223.744 0 384-159.872 384-352 0-192.832-159.104-352-384-352S128 319.168 128 512a341.12 341.12 0 0 0 69.248 204.288l21.632 28.8-44.16 110.528z m-45.248 82.56A32 32 0 0 1 89.6 896l56.512-141.248A405.12 405.12 0 0 1 64 512C64 299.904 235.648 96 512 96s448 203.904 448 416-173.44 416-448 416c-79.68 0-150.848-17.152-211.712-46.72l-170.88 56.96z" p-id="1206" :fill="activeTab === 0 ? 'blue' : 'grey'">
+            </path></svg>
+          <span style="margin-left: 10px">瀵硅瘽</span></div>
+        <div :class="{tab: true, activeTab: activeTab === 1}" style="margin-top: 2px" @click="changeTab(1)">
+          <svg style="margin-left: -1px" t="1742895849411" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="1227" width="20" height="20"><path d="M921.6 366.592L512 102.4 102.4 366.592l409.6 264.192z m-409.6-153.6L759.296 358.4 512 503.296 264.704 358.4z m0 621.568l-361.472-224.256-48.128 47.104L512 921.6l409.6-264.192-48.64-48.128z m0-145.408L150.528 464.896 102.4 512l409.6 264.192L921.6 512l-48.64-48.128z" p-id="1228" :fill="activeTab === 1 ? 'blue' : 'grey'"></path></svg>
+          <span style="margin-left: 8px">鐭ヨ瘑搴撶鐞�</span>
+        </div>
+      </div>
+      <div class="setting">
+        杩欐槸閰嶇疆鏉垮潡
+      </div>
+    </div>
+    <div class="right">
+      <router-view></router-view>
+    </div>
+  </div>
+</template>
+
+<script>
+export default {
+  name: "IndexView",
+  data() {
+    return {
+      activeTab: 0
+    }
+  },
+  mounted() {
+    this.changeRoute(this.activeTab)
+  },
+  methods: {
+    changeTab(index) {
+      if (index !== this.activeTab) {
+        this.activeTab = index
+        this.changeRoute(index)
+      }
+    },
+    changeRoute(index) {
+      console.log(this.$router.currentRoute.path, "璺敱")
+      if (index === 0 && this.$router.currentRoute.path !== "/chat") {
+        this.$router.push("/chat")
+      } else if (index === 1 && this.$router.currentRoute.path !== "/knowledge") {
+        this.$router.push("/knowledge")
+      }
+    }
+  }
+}
+</script>
+
+<style scoped>
+.index {
+  display: flex;
+}
+.left {
+  width: 250px;
+  height: calc(100vh - 20px);
+  background-color: #f3f3f3;
+  padding: 0px 40px;
+}
+.right {
+  width: 1600px;
+}
+.logo {
+  width: 100%;
+  height: 80px;
+  display: flex;
+  justify-content: center;
+  align-items: center;
+}
+.menu {
+  height: 150px;
+  width: 100%;
+  display: flex;
+  flex-direction: column;
+  justify-content: center;
+  align-items: center;
+}
+.tab {
+  width: 100%;
+  line-height: 30px;
+  padding-left: 16px;
+  display: flex;
+  justify-content: flex-start;
+  border-radius: 8px;
+  align-items: center;
+}
+.activeTab {
+  background-color: #bed7f5;
+  color: blue;
+}
+.tab:hover {
+  cursor: pointer;
+  background-color: #bed7f5;
+  color: blue;
+}
+
+</style>

--
Gitblit v1.8.0