Browse Source

feat: 多对象返回处理已经three布局,增加返回按钮调整

sunxiao 8 months ago
parent
commit
290fb42dc2

+ 0 - 9
package-lock.json

@@ -25,7 +25,6 @@
         "sass": "^1.77.1",
         "sass-loader": "^14.2.1",
         "three": "^0.166.1",
-        "three-obj-mtl-loader": "^1.0.3",
         "vue": "^3.4.21",
         "vue-router": "^4.3.0"
       },
@@ -7306,14 +7305,6 @@
       "resolved": "https://registry.npmmirror.com/three/-/three-0.166.1.tgz",
       "integrity": "sha512-LtuafkKHHzm61AQA1be2MAYIw1IjmhOUxhBa0prrLpEMWbV7ijvxCRHjSgHPGp2493wLBzwKV46tA9nivLEgKg=="
     },
-    "node_modules/three-obj-mtl-loader": {
-      "version": "1.0.3",
-      "resolved": "https://registry.npmmirror.com/three-obj-mtl-loader/-/three-obj-mtl-loader-1.0.3.tgz",
-      "integrity": "sha512-0z7BfyG6vYPY9RvxJvL4rq8PbNrF42Kn4zxeqTfeDzJN++2oKbtCQhxHs5vLULnDuCRTEyDFf5TYvO+1vnJ7KQ==",
-      "peerDependencies": {
-        "three": ">= 0.91"
-      }
-    },
     "node_modules/to-fast-properties": {
       "version": "2.0.0",
       "resolved": "https://registry.npmmirror.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz",

+ 0 - 1
package.json

@@ -32,7 +32,6 @@
     "sass": "^1.77.1",
     "sass-loader": "^14.2.1",
     "three": "^0.166.1",
-    "three-obj-mtl-loader": "^1.0.3",
     "vue": "^3.4.21",
     "vue-router": "^4.3.0"
   },

BIN
public/factory.glb


File diff suppressed because it is too large
+ 97282 - 0
public/factory.obj


+ 22 - 0
public/texture.mtl

@@ -0,0 +1,22 @@
+# Blender 4.1.1 MTL File: '水厂6.blend'
+# www.blender.org
+
+newmtl 材质.001
+Ns 250.000000
+Ka 1.000000 1.000000 1.000000
+Kd 0.156420 0.800416 0.155804
+Ks 0.500000 0.500000 0.500000
+Ke 0.000000 0.000000 0.000000
+Ni 1.500000
+d 1.000000
+illum 2
+
+newmtl 材质.002
+Ns 360.000000
+Ka 1.000000 1.000000 1.000000
+Kd 0.800000 0.800000 0.800000
+Ks 0.500000 0.500000 0.500000
+Ke 0.000000 0.000000 0.000000
+Ni 1.000000
+d 1.000000
+illum 2

+ 1 - 1
src/App.vue

@@ -27,7 +27,7 @@ const themeOverrides: GlobalThemeOverrides = {
     arrowColorChildActive: primaryColor
   },
   Scrollbar: {
-    width: '0px',
+    width: '2px',
   },
   Select: {
     peers: {

+ 4 - 4
src/components/Chat/ChatText.vue

@@ -20,10 +20,10 @@ const highlightBlock = (str, lang) => {
   `
 }
 const mdi = new MarkdownIt({
-  html: true,
-  linkify: true,
-  breaks: true,
-  typographer: true,
+  // html: true,
+  // linkify: true,
+  // breaks: true,
+  // typographer: true,
   highlight (code, language) {
     const validLang = !!(language && hljs.getLanguage(language))
     if (validLang) {

+ 17 - 9
src/components/Layout/TheChatView.vue

@@ -36,8 +36,8 @@ defineExpose({ targetScrollDom });
   <div class="flex-1 h-full chat-container">
     <div class="chat-wrapper w-full h-full flex flex-col rounded-[20px]">
       <div class="chat-header flex items-center justify-between py-[24px] px-[18px] ">
-        <div class="left_inner">
-          <span @click="handleClickBack" v-if="isBackBtn" class="back-btn"></span>
+        <div class="left_inner" @click="handleClickBack">
+          <span v-if="isBackBtn" class="back-btn"></span>
         </div>
         <div class="right_inner flex items-center space-x-[16px]">
           <UserTop></UserTop>
@@ -64,18 +64,26 @@ defineExpose({ targetScrollDom });
 
   .chat-header {
     .left_inner {
+      display: flex;
+      align-items: center;
+      padding: 6px;
+      border-radius: 8px;
+      cursor: pointer;
+
+      &:hover {
+        background: #dceffe;
+      }
       .back-btn {
         display: inline-block;
-        width: 24px;
-        height: 24px;
+        width: 30px;
+        height: 30px;
         background: url("@/assets/images/chat/back-btn.png") no-repeat;
         background-size: cover;
-        cursor: pointer;
 
-        &:hover {
-          background: url("@/assets/images/chat/back-btn-active.png") no-repeat;
-          background-size: cover;
-        }
+        // &:hover {
+        //   background: url("@/assets/images/chat/back-btn-active.png") no-repeat;
+        //   background-size: cover;
+        // }
       }
     }
   }

+ 20 - 5
src/composables/useFetchStream.js

@@ -47,11 +47,16 @@ export function useFetchStream(url, options = {}, immediate = true) {
 
       const reader = response.body.getReader();
       const textDecoder = new TextDecoder();
+
       let result = true;
 
+
       while (result) {
+   
         const { done, value } = await reader.read();
 
+        const chunkText = textDecoder.decode(value);
+
         if (done) {
           console.log('Stream ended');
           doneHandler && doneHandler(done);
@@ -59,16 +64,26 @@ export function useFetchStream(url, options = {}, immediate = true) {
           break;
         }
 
-        const chunkText = textDecoder.decode(value);
-        completeData.value.push(chunkText);
-        streamData.value = chunkText;
-        successHandler && successHandler(chunkText);
+        if ( chunkText.includes("}{") ) {
+          const regex = /{[^{}]*}/g;
+          const result1 = chunkText.match(regex);
+          result1.forEach(item => {
+            completeData.value.push(item);
+            streamData.value = item;
+            successHandler && successHandler(item);
+          })
+        } else {
+          completeData.value.push(chunkText);
+          streamData.value = chunkText;
+          successHandler && successHandler(chunkText);
+        }
+
       }
 
       return completeData;
     } catch (err) {
       errorHandler && errorHandler();
-      console.log("fetch: cancel request success");
+      console.log("fetch: cancel request success", err);
       error.value = err;
     } finally {
       loading.value = false;

+ 1 - 1
src/router/index.js

@@ -12,7 +12,7 @@ const constantRouterMap = [
   // {
   //   path: '/test',
   //   name: 'TempTest',
-  //   component: () => import('@/views/test/index.vue'),
+  //   component: () => import('@/views/screen/ScreenView2.vue'),
   //   meta: {
   //     title: "测试建模文件"
   //   }

+ 1 - 0
src/views/analyse/WaterView.vue

@@ -252,6 +252,7 @@ const onRegenerate = async () => {
     body: JSON.stringify({ ...flowParams, feedback: JSON.stringify(feedback) }),
     errorHandler: () => {},
     successHandler: data => {
+      
       const item = JSON.parse(data);
 
       answerLoading.value = false;

BIN
src/views/screen/3d/factory.glb


File diff suppressed because it is too large
+ 97282 - 0
src/views/screen/3d/factory.obj


+ 161 - 0
src/views/screen/3d/renderModel.js

@@ -0,0 +1,161 @@
+import * as THREE from 'three'//导入three.js核心库
+import { OrbitControls } from 'three/examples/jsm/controls/OrbitControls' //导入轨道控制器
+import { OBJLoader } from 'three/examples/jsm/loaders/OBJLoader'
+import { MTLLoader } from 'three/examples/jsm/loaders/MTLLoader'
+import { GLTFLoader } from 'three/examples/jsm/loaders/GLTFLoader'
+
+class motor3d {
+  constructor(selector) {
+    this.container = document.querySelector(selector)
+    this.scene
+    this.camera
+    this.renderer
+    this.controls
+    this.init()
+    this.animate()
+  }
+
+  init() {
+    // 初始化场景
+    this.initScene()
+    // 初始化辅助轴
+    this.initAxesHelper()
+    // 初始化灯光
+    this.initLight()
+    // 初始化Mesh
+    this.initMesh()
+    // 初始化相机
+    this.initCamera()
+    // 初始化渲染器
+    this.initRender()
+    // 初始化轨道控制器
+    this.initControls()
+    // 监听场景大小改变,重新渲染尺寸
+    window.addEventListener('resize', this.onWindowResize.bind(this))
+  }
+
+  initScene() {
+    this.scene = new THREE.Scene()
+    // this.scene.background = new THREE.Color(0xa0a0a0)
+    this.scene.background = null;
+  }
+
+  initAxesHelper() {
+    const axesHelper = new THREE.AxesHelper(5)
+    this.scene.add(axesHelper)
+  }
+
+  initLight() {
+    const hesLight = new THREE.HemisphereLight(0xffffff, 0.5)
+    hesLight.intensity = 1
+    this.scene.add(hesLight)
+
+    const dirLight = new THREE.DirectionalLight()
+    dirLight.position.set(10, 10, 10).normalize();
+    this.scene.add(dirLight)
+  }
+  recordCameraChanges() {
+    // 记录位置
+    const position = this.camera.position;
+    console.log(`Position: (${position.x}, ${position.y}, ${position.z})`);
+  };
+  initMesh() {
+    this.addOBJFModel()
+  }
+  initCamera() {
+    this.camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 100)
+    // this.camera.position.set(3.5, 5.5, 1.5)
+    // this.camera.position.set(28.07, 22.32, -12.92)
+    // this.camera.position.set(37.3642, 24.8315, -22.6927)
+    // this.camera.position.set(24.5564, 16.6944, -9.8434)
+    this.camera.position.set(20.47294749946306, 25.9193717746894, -10.426531907485199)
+
+  }
+
+  initRender() {
+    this.renderer = new THREE.WebGLRenderer({ antialias: true, alpha: true })//设置抗锯齿
+    //设置屏幕像素比
+    this.renderer.setPixelRatio(window.devicePixelRatio)
+    //渲染的尺寸大小
+    this.renderer.setSize(this.container.offsetWidth, this.container.offsetHeight)
+    // 添加到容器
+    this.container.appendChild(this.renderer.domElement)
+    // 设置清除颜色的 Alpha 为 0
+    this.renderer.setClearColor(0xffffff, 0)
+
+    this.renderer.outputEncoding = THREE.sRGBEncoding;
+  }
+
+  animate() {
+    this.renderer.setAnimationLoop(this.render.bind(this))
+  }
+  render() {
+    this.renderer.render(this.scene, this.camera)
+  }
+  initControls() {
+    this.controls = new OrbitControls(this.camera, this.renderer.domElement)
+  }
+  // 加载模型
+  addOBJFModel(modelName) {
+    return new Promise((resolve, reject) => {
+      const mtlLoader = new MTLLoader()
+      const objLoader = new OBJLoader()
+      const gltfLoader = new GLTFLoader();
+      
+      gltfLoader.load('/factory.glb', (gltf) => {
+        const model = gltf.scene;
+        // console.log("glb 加载成功", gltf)
+
+        model.position.set(-4, 10, 0); // 设置模型位置
+        // model.rotation.set(0, Math.PI / 0, 0); // 设置模型旋转
+        // model.scale.set(1, 0.5, 1); // 设置模型缩放
+
+        this.scene.add(model);
+
+      },(xhr) => {
+        console.log(xhr);
+      }, (error) => {
+        console.log(error);
+      })
+
+      // mtlLoader.load('./texture.mtl', (mtl) => {
+      //   mtl.preload();
+
+      //   objLoader.setMaterials(mtl);
+
+      //   objLoader.load('./factory.obj', (obj) => {
+      //     obj.position.set(0, 10, 0);
+      //     obj.traverse(function (child) {
+      //       console.log(child);
+      //       if (child instanceof THREE.Mesh) {
+      //         if (child.material instanceof THREE.MeshStandardMaterial ||
+      //           child.material instanceof THREE.MeshPhongMaterial) {
+      //             child.material.color.set('ffffff');
+      //         }
+      //       }
+      //     })
+      //     this.scene.add(obj)
+      //     resolve('模型添加成功')
+      //   })
+      // })
+
+    })
+  }
+
+  onWindowResize() {
+    this.recordCameraChanges();
+    this.camera.aspect = this.container.offsetWidth / this.container.offsetHeight
+    this.camera.updateProjectionMatrix()//更新矩阵,将3d内容投射到2d画面上转换
+    this.renderer.setSize(this.container.offsetWidth, this.container.offsetHeight)
+  }
+
+  dispose() {
+    this.scene.dispose();
+    this.camera.dispose();
+    this.renderer.dispose();
+    this.controls.dispose();
+    window.removeEventListener('resize', this.onWindowResize);
+  }
+
+}
+export default motor3d;

+ 22 - 0
src/views/screen/3d/texture.mtl

@@ -0,0 +1,22 @@
+# Blender 4.1.1 MTL File: '水厂6.blend'
+# www.blender.org
+
+newmtl 材质.001
+Ns 250.000000
+Ka 1.000000 1.000000 1.000000
+Kd 0.156420 0.800416 0.155804
+Ks 0.500000 0.500000 0.500000
+Ke 0.000000 0.000000 0.000000
+Ni 1.500000
+d 1.000000
+illum 2
+
+newmtl 材质.002
+Ns 360.000000
+Ka 1.000000 1.000000 1.000000
+Kd 0.800000 0.800000 0.800000
+Ks 0.500000 0.500000 0.500000
+Ke 0.000000 0.000000 0.000000
+Ni 1.000000
+d 1.000000
+illum 2

+ 336 - 0
src/views/screen/ScreenView2.vue

@@ -0,0 +1,336 @@
+<script setup>
+import { ref, onBeforeUnmount, onMounted } from "vue";
+import { userTop } from '@/components';
+import shuizhi from "./components/shuizhi";
+import dataBox from "./components/dataBox";
+import liuliang from "./components/liuliang";
+import gongyi from "./components/gongyi";
+import middleBox from "./components/middleBox";
+import EchartBar from "./components/EchartBar";
+// import motor3d from './3d/renderModel.js';
+import ControlHelper from "./components/ControlHelper";
+import { screenApi } from "@/api/screen"
+import dayjs from 'dayjs';
+import 'dayjs/locale/zh-cn';
+
+dayjs.locale('zh-cn'); // 设置day.js使用中文/ 导入中文语言包
+
+const gongyiData = ref([])
+const reportData = ref({})
+const screenData = ref({})
+const time = ref('')
+let timer = null
+let timeHour = null
+
+const dataTime = ref("");
+
+// 获取工艺管控 助手
+const getWarningList = () => {
+  screenApi.warningList().then(res => {
+    gongyiData.value = res.data || []
+  })
+}
+
+// 获取数据费助手
+const getLeastShortReport = () => {
+  screenApi.getLeastShortReport().then(res => {
+    reportData.value = res.data
+  })
+}
+
+// 获取大屏分析数据
+const getRealTimeData = () => {
+  screenApi.realTimeData().then(res => {
+    screenData.value = res.data
+    dataTime.value = `更新时间:${res.data.testHour}`
+    time.value = dayjs(res.data.timestamp).format('HH:mm:ss')
+    timeHour = setInterval(() => {
+      time.value = updateCurrentTime(res.data.timestamp)
+    }, 1000)
+  })
+}
+
+const updateCurrentTime = (timestamp) => {
+  // 计算从初始时间戳到现在经过的时间
+  const now = dayjs();
+  const initialTime = dayjs(timestamp);
+  const elapsedTime = now.diff(initialTime);
+
+  // 使用初始时间戳加上经过的时间来更新当前时间
+  const currentTime = initialTime.add(elapsedTime, 'millisecond');
+  return currentTime.format('HH:mm:ss');
+}
+const init = () => {
+  getRealTimeData()
+  getWarningList()
+  getLeastShortReport()
+}
+
+init()
+
+onMounted(() => {
+
+  //每5s刷新数据
+  timer = setInterval(() => {
+    init()
+  }, 1000 * 60 * 60)
+})
+
+onBeforeUnmount(() => {
+  clearInterval(timer)
+  clearInterval(timeHour)
+  timer = null;
+  timeHour = null
+})
+
+</script>
+<template>
+  <div class="screen-view" id="screen-view">
+    <div class="screen-view-top">
+      <div class="left space-x-[1rem]">
+        <span class="time">{{ time }}</span>
+        <span class="line"></span>
+        <div class="data">
+          <div>{{ dayjs(screenData.timestamp).format("dddd") }}</div>
+          <div class="text-[12px]">{{ dayjs(screenData.timestamp).format('YYYY-MM-DD') }}</div>
+        </div>
+      </div>
+      <div class="chat-header flex items-center justify-end pr-[18px] space-x-[16px]">
+        <userTop></userTop>
+      </div>
+    </div>
+    <div class="menu">
+      <RouterLink to="/" class="item item1">智慧总控</RouterLink>
+      <RouterLink to="/answer" class="item item2">专家问答</RouterLink>
+      <RouterLink to="/water-warn" class="item item3">工艺管控</RouterLink>
+      <RouterLink to="/work" class="item item4">智能办公</RouterLink>
+    </div>
+    <div class="screen-container">
+      <div class="screen-container-main">
+        <div class="left">
+          <shuizhi :screenData="screenData"></shuizhi>
+          <EchartBar :screenData="screenData"></EchartBar>
+          <liuliang :screenData="screenData"></liuliang>
+        </div>
+        <div class="middle">
+          <middleBox :dataTime="dataTime"></middleBox>
+        </div>
+        <div class="right">
+          <ControlHelper></ControlHelper>
+          <dataBox :reportData="reportData"></dataBox>
+          <gongyi :gongyiData="gongyiData"></gongyi>
+        </div>
+      </div>
+    </div>
+  </div>
+</template>
+
+<style lang="scss" scoped>
+.screen-view {
+  position: relative;
+  display: flex;
+  justify-content: space-around;
+  flex-flow: column;
+  width: 100vw;
+  height: 100vh;
+  background: url(@/assets/images/home/home_bg1.png) center center no-repeat;
+  background-size: 100% 100%;
+  overflow: hidden;
+
+  &-top {
+    display: flex;
+    align-items: end;
+    justify-content: space-between;
+    padding: 0 5rem;
+    height: 9rem;
+
+    .left {
+      display: flex;
+      align-items: center;
+      font-size: 1.6rem;
+    }
+
+    .time {
+      font-size: 3.6rem;
+      font-weight: bold;
+      color: #333;
+    }
+
+    .line {
+      margin: 0 1rem 0 1.5rem;
+      display: inline-block;
+      background: #767C82;
+      height: 2.8rem;
+      width: 0.2rem;
+    }
+
+    .data {
+      color: #415B73;
+    }
+  }
+
+  .menu {
+    display: flex;
+    align-content: center;
+    justify-content: center;
+    flex-shrink: 0;
+
+    .item {
+      width: 21.8rem;
+      height: 5.2rem;
+      display: inline-block;
+      font-size: 0;
+    }
+
+    .item1 {
+      background: url('@/assets/images/home/menu_1_hover.png') no-repeat;
+      background-size: 100% 100%;
+    }
+
+    .item2 {
+      background: url('@/assets/images/home/menu_2.png') no-repeat;
+      background-size: 100% 100%;
+      margin-right: 20rem;
+
+      &:hover {
+        background: url('@/assets/images/home/menu_2_hover.png') no-repeat;
+        background-size: 100% 100%;
+      }
+    }
+
+    .item3 {
+      background: url('@/assets/images/home/menu_3.png') no-repeat;
+      background-size: 100% 100%;
+
+      &:hover {
+        background: url('@/assets/images/home/menu_3_hover.png') no-repeat;
+        background-size: 100% 100%;
+      }
+    }
+
+    .item4 {
+      background: url('@/assets/images/home/menu_4.png') no-repeat;
+      background-size: 100% 100%;
+
+      &:hover {
+        background: url('@/assets/images/home/menu_4_hover.png') no-repeat;
+        background-size: 100% 100%;
+      }
+    }
+
+  }
+
+  .water-work-inner {
+    position: absolute;
+    left: 50%;
+    top: 50%;
+    transform: translate(-50%, -50%);
+    width: 150rem;
+    height: 80rem;
+    background: url("@assets/images/home/water-work.png") no-repeat;
+  }
+
+  .screen-container {
+    position: relative;
+    display: flex;
+    flex-flow: column;
+    height: 80rem;
+    padding: 0 6rem;
+    z-index: 2;
+
+
+
+    &-main {
+      position: relative;
+      height: 100%;
+      display: flex;
+      justify-content: space-between;
+      z-index: 2;
+
+      .left {
+        position: relative;
+        display: flex;
+        flex-flow: column;
+        z-index: 3;
+      }
+
+      .middle {
+        position: relative;
+        flex: 1;
+
+        // .send-ask {
+        //   position: relative;
+        //   z-index: 2;
+        // }
+      }
+      .right {
+        position: relative;
+        z-index: 3;
+      }
+    }
+  }
+
+  .img-card {
+    position: absolute;
+    top: 50%;
+    left: 50%;
+    transform: translate(-50%, -50%);
+    width: 79rem;
+    height: 59rem;
+  }
+}
+
+@media screen and (max-width: 1440px) {
+  .screen-view {
+    justify-content: flex-start;
+    // background: url(@/assets/images/home/home_bg.png) center top no-repeat;
+    // background-size: contain;
+  }
+}
+</style>
+
+<style lang="scss">
+.home-box {
+  width: 54rem;
+  // width: 540px;
+  border-radius: 0.8rem;
+  // border: 1px solid #fff;
+  // margin-bottom: 2rem;
+
+  &-top {
+    padding: 0.7rem 2.4rem 0.7rem 1.2rem;
+    display: flex;
+    justify-content: space-between;
+    position: relative;
+    align-items: center;
+
+    &::after {
+      content: '';
+      height: 0.2rem;
+      background: url('@/assets/images/home/line.png') no-repeat;
+      background-size: 100% 100%;
+      width: 100%;
+      position: absolute;
+      left: 1.2rem;
+      bottom: 0;
+    }
+
+    .title {
+      font-size: 1.8rem;
+      font-weight: bold;
+      display: flex;
+      align-items: center;
+
+      &::before {
+        content: '';
+        width: 2rem;
+        height: 2rem;
+        background: url('@/assets/images/home/mark.png') no-repeat;
+        background-size: cover;
+        margin-right: 0.8rem;
+        display: inline-block;
+      }
+    }
+  }
+}
+</style>

+ 19 - 8
src/views/screen/components/dataBox.vue

@@ -17,13 +17,16 @@ const content = '① 因房地产市场并不十分活跃和顺利运转,因
         <RouterLink to="/work-order" class="flex items-center space-x-[0.4rem] text-[1.6rem]">
           <span>更多</span>
           <svg width="1.5rem" height="2rem" viewBox="0 0 15 20" fill="none" xmlns="http://www.w3.org/2000/svg">
-            <path fill-rule="evenodd" clip-rule="evenodd" d="M14.5303 10L4.53033 0L2.84959 1.68074L11.1688 10L2.84959 18.3193L4.53033 20L14.5303 10ZM7.39954 10L2.1534 4.75386L0.472656 6.4346L4.03805 10L0.472656 13.5654L2.1534 15.2461L7.39954 10Z" fill="url(#paint0_linear_1909_2940)"/>
+            <path fill-rule="evenodd" clip-rule="evenodd"
+              d="M14.5303 10L4.53033 0L2.84959 1.68074L11.1688 10L2.84959 18.3193L4.53033 20L14.5303 10ZM7.39954 10L2.1534 4.75386L0.472656 6.4346L4.03805 10L0.472656 13.5654L2.1534 15.2461L7.39954 10Z"
+              fill="url(#paint0_linear_1909_2940)" />
             <defs>
-            <linearGradient id="paint0_linear_1909_2940" x1="14.5303" y1="10" x2="-0.817942" y2="10.5941" gradientUnits="userSpaceOnUse">
-            <stop stop-color="#1872D8"/>
-            <stop offset="0.43028" stop-color="#08AEF1"/>
-            <stop offset="1" stop-color="white"/>
-            </linearGradient>
+              <linearGradient id="paint0_linear_1909_2940" x1="14.5303" y1="10" x2="-0.817942" y2="10.5941"
+                gradientUnits="userSpaceOnUse">
+                <stop stop-color="#1872D8" />
+                <stop offset="0.43028" stop-color="#08AEF1" />
+                <stop offset="1" stop-color="white" />
+              </linearGradient>
             </defs>
           </svg>
         </RouterLink>
@@ -53,17 +56,19 @@ const content = '① 因房地产市场并不十分活跃和顺利运转,因
       .markdown-inner {
         height: 20rem;
         overflow-y: scroll;
+
         &::-webkit-scrollbar-track {
-          background-color: rgba(255,255,255,0.3);
+          background-color: rgba(255, 255, 255, 0.3);
         }
       }
+
       // .markdown-body{
       //   &::-webkit-scrollbar {
       //     width: 0px !important;
       //   }
       // }
       .title {
-        margin-bottom:1.6rem;
+        margin-bottom: 1.6rem;
         font-size: 1.6rem;
         font-weight: bold;
       }
@@ -94,4 +99,10 @@ const content = '① 因房地产市场并不十分活跃和顺利运转,因
     }
   }
 }
+</style>
+
+<style >
+.data-box .data-box-main .content .markdown-body .custom-table-wrapper {
+  width: 45rem !important;
+}
 </style>

+ 21 - 0
src/views/screen/components/middleBox.vue

@@ -1,11 +1,21 @@
 <script setup>
+import { onMounted } from "vue";
+// import motor3d from '../3d/renderModel.js';
+
+
 defineProps({
   dataTime: ''
 })
+
+onMounted(() => {
+  // new motor3d('#scene') 
+})
+
 </script>
 
 <template>
   <div class="send-ask">
+    <div id="scene" class="3d-scene"></div>
     <RouterLink class="send-ask-button" to="/answer" :data-time="dataTime">输入您的问题或需求</RouterLink>
   </div>
 </template>
@@ -15,6 +25,16 @@ defineProps({
   margin: 0 2rem;
   position: relative;
   height: 100%;
+  
+  #scene {
+    position: absolute;
+    top: 50%;
+    left: 50%;
+    transform: translate(-50%, -50%);
+    width: 116rem;
+    height: calc(100% - 6rem);
+    z-index: 1;
+  }
 
   &-button {
     position: absolute;
@@ -30,6 +50,7 @@ defineProps({
     justify-content: space-between;
     padding: 0 1.7rem 0 3.4rem;
     bottom: 4.7rem;
+    z-index: 2;
 
     &::before {
       content: attr(data-time);

+ 2 - 2
src/views/test/index.vue

@@ -3,12 +3,12 @@ import { ref, onMounted, onUnmounted } from 'vue';
 import * as THREE from 'three';
 import { OBJLoader } from 'three/examples/jsm/loaders/OBJLoader'
 import { OrbitControls } from 'three/examples/jsm/controls/OrbitControls';
-import motor3d from './renderModel';
+// import motor3d from './renderModel';
 
 
 
 onMounted(() => {
-  new motor3d('#scene') 
+  // new motor3d('#scene') 
 
 //   const scene = new THREE.Scene();
 

+ 29 - 11
src/views/test/renderModel.js

@@ -1,7 +1,7 @@
 import * as THREE from 'three'//导入three.js核心库
 import { OrbitControls } from 'three/examples/jsm/controls/OrbitControls' //导入轨道控制器
 import { OBJLoader } from 'three/examples/jsm/loaders/OBJLoader'
-import { debounce } from '@/utils/tools';
+import { MTLLoader } from 'three/examples/jsm/loaders/MTLLoader'
 
 class motor3d {
   constructor(selector) {
@@ -45,12 +45,12 @@ class motor3d {
   }
 
   initLight() {
-    const hesLight = new THREE.HemisphereLight(0xffffff, 0x333333)
-    hesLight.intensity = 0.6
+    const hesLight = new THREE.HemisphereLight(0xffffff, 0.5)
+    // hesLight.intensity = 0.6
     this.scene.add(hesLight)
 
     const dirLight = new THREE.DirectionalLight()
-    dirLight.position.set(1, 1, 1)
+    dirLight.position.set(10, 10, 10).normalize();
     this.scene.add(dirLight)
   }
   recordCameraChanges () {
@@ -59,7 +59,7 @@ class motor3d {
     console.log(`Position: (${position.x}, ${position.y}, ${position.z})`);
   };
   initMesh() {
-    this.addOBJFModel('motor03.gltf')
+    this.addOBJFModel()
   }
   initCamera() {
     this.camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 100)
@@ -78,6 +78,8 @@ class motor3d {
     this.container.appendChild(this.renderer.domElement)
     // 设置清除颜色的 Alpha 为 0
     this.renderer.setClearColor(0xffffff, 0)
+
+    this.renderer.outputEncoding = THREE.sRGBEncoding;
   }
 
   animate() {
@@ -92,12 +94,20 @@ class motor3d {
   // 加载模型
   addOBJFModel(modelName) {
     return new Promise((resolve, reject) => {
-      const loader = new OBJLoader()
-      loader.load('./factory.obj', (obj) => {
-        console.log(obj);
-        this.scene.add(obj)
-        resolve(this.modelName + '模型添加成功')
+      const mtlLoader = new MTLLoader()
+      const objLoader = new OBJLoader()
+
+      mtlLoader.load('./texture.mtl', (mtl) => {
+        mtl.preload();
+
+        objLoader.setMaterials(mtl);
+
+        objLoader.load('./factory.obj', (obj) => {
+          this.scene.add(obj)
+          resolve('模型添加成功')
+        })
       })
+
     })
   }
 
@@ -107,5 +117,13 @@ class motor3d {
     this.camera.updateProjectionMatrix()//更新矩阵,将3d内容投射到2d画面上转换
     this.renderer.setSize(window.innerWidth, window.innerHeight)
   }
+
+  dispose() {
+    this.scene.dispose();
+    this.camera.dispose();
+    this.renderer.dispose();
+    this.controls.dispose();
+    window.removeEventListener('resize', this.onWindowResize);
+  }
 }
-export default motor3d
+export default motor3d;

+ 22 - 0
src/views/test/texture.mtl

@@ -0,0 +1,22 @@
+# Blender 4.1.1 MTL File: '水厂6.blend'
+# www.blender.org
+
+newmtl 材质.001
+Ns 250.000000
+Ka 1.000000 1.000000 1.000000
+Kd 0.156420 0.800416 0.155804
+Ks 0.500000 0.500000 0.500000
+Ke 0.000000 0.000000 0.000000
+Ni 1.500000
+d 1.000000
+illum 2
+
+newmtl 材质.002
+Ns 360.000000
+Ka 1.000000 1.000000 1.000000
+Kd 0.800000 0.800000 0.800000
+Ks 0.500000 0.500000 0.500000
+Ke 0.000000 0.000000 0.000000
+Ni 1.000000
+d 1.000000
+illum 2

+ 17 - 5
src/views/work/WorkView.vue

@@ -12,7 +12,7 @@ const ANSWER_ID_KEY = '@@id@@';
 
 let controller = new AbortController();
 
-const { recordList, isFetching, onScrolltolower, onReset, addHistoryRecord } = useInfinite('/front/bigModel/qa/pageList', { module: 2 });
+const { recordList, isFetching, onScrolltolower, onReset, } = useInfinite('/front/bigModel/qa/pageList', { module: 2 });
 const { scrollRef, scrollToBottom, scrollToBottomIfAtBottom } = useScroll();
 const { chatDataSource, addChat, updateChat, clearChat, updateById } = useChat();
 
@@ -65,8 +65,6 @@ const handleChatDetail = async ({ sessionId }) => {
   chatDataSource.value = data.map(item => ({ ...item, loading: false, }));
   currenSessionId.value = sessionId;
 
-
-
   scrollToBottom();
 }
 
@@ -151,7 +149,6 @@ const handleSubmit = async (question, realQuestion = '') => {
 
 // 处理推荐问题
 const handleWelcomeRecommend = ({ content }) => {
-  console.log(inputRef.value)
   inputRef.value.inpVal = content;
   inputRef.value.handleInpFocus();
 }
@@ -164,6 +161,21 @@ const handeChatDelete = async (id) => {
   message.success('删除成功');
 }
 
+// 返回操作
+const handleback = async () => {
+
+  controller?.abort();
+  // await chatApi.getStopChatStream(currenSessionId.value);
+
+  inputRef.value.clearInpVal();
+
+  recordActive.value = null;
+
+  currenSessionId.value = null;
+
+  clearChat();
+}
+
 onMounted(async () => {
   const { data } = await helperApi.getHelperList();
   helperList.value = data;
@@ -190,7 +202,7 @@ onUnmounted(() => {
       </div>
     </TheSubMenu>
 
-    <TheChatView ref="scrollRef">
+    <TheChatView ref="scrollRef" :is-back-btn="!!chatDataSource.length" @on-click-back="handleback">
       <div v-if="!chatDataSource.length">
         <ChatWelcome title="您好,我是LibraAI智能助手" :sub-title="[
           'LibarAI智能助手模块提供撰写文章、生成报告等服务',

Some files were not shown because too many files changed in this diff