Pārlūkot izejas kodu

feat: 对接知识库信息流

王晓东 1 mēnesi atpakaļ
vecāks
revīzija
d892fd011b
30 mainītis faili ar 359 papildinājumiem un 267 dzēšanām
  1. 21 3
      src/components/AgentPage/components/AgentSwap/index.tsx
  2. 19 12
      src/components/AgentPage/components/SummaryBar/index.tsx
  3. 5 1
      src/components/AgentPage/index.tsx
  4. 17 0
      src/components/GlobalModal/index.tsx
  5. 6 1
      src/components/WemetaModal/index.module.less
  6. 1 2
      src/components/WemetaModal/index.tsx
  7. 0 47
      src/components/floating-tips/index.module.less
  8. 0 31
      src/components/floating-tips/index.tsx
  9. 2 0
      src/components/page-wrapper/index.tsx
  10. 2 11
      src/pages/agent/components/AgentSetting/index.tsx
  11. 6 4
      src/pages/agent/index.tsx
  12. 8 56
      src/pages/editor-pages/editor-greeting/index.tsx
  13. 2 2
      src/pages/editor-pages/editor.module.less
  14. 12 10
      src/pages/index/components/InitView/index.tsx
  15. 0 0
      src/pages/index/components/WelcomeTips/index.module.less
  16. 0 0
      src/pages/index/components/WelcomeTips/index.tsx
  17. 3 7
      src/pages/index/index.tsx
  18. 35 16
      src/pages/knowledge/components/personal-tab/index.tsx
  19. 11 3
      src/pages/knowledge/components/view-style/ViewStyleChat.tsx
  20. 68 6
      src/pages/knowledge/components/view-style/ViewStyleList.tsx
  21. 10 0
      src/pages/knowledge/index.module.less
  22. 5 4
      src/pages/knowledge/index.tsx
  23. 0 1
      src/pages/voice/index.tsx
  24. 37 12
      src/service/knowledge.ts
  25. 6 7
      src/service/user.ts
  26. 1 1
      src/store/agentStore.ts
  27. 35 0
      src/store/modalStore.ts
  28. 10 17
      src/store/userStore.ts
  29. 29 13
      src/types/knowledge.ts
  30. 8 0
      src/types/user.ts

+ 21 - 3
src/components/AgentPage/components/AgentSwap/index.tsx

@@ -12,20 +12,38 @@ import Popup from "@/components/popup/popup";
 import { useState } from "react";
 import WemetaTabs from "@/components/wemeta-tabs/index";
 import { useAgentStore } from "@/store/agentStore";
+import { setDefaultAgent } from "@/service/agent";
+import { TAgent } from "@/types/agent";
+import Taro from "@tarojs/taro";
 interface IProps {
   show: boolean;
   setShow: (show: boolean) => void;
 }
 export default ({ show, setShow }: IProps) => {
 
-  const { agents } = useAgentStore()
-
+  const { agents, setDefaultAgent, fetchAgents } = useAgentStore()
+  let loading = false
   const personalAgents = agents.filter( item => !item.isEnt)
 
+  const handleClick = async (item: TAgent)=> {
+    if(loading){
+      return
+    }
+    loading = true;
+    Taro.showLoading({title: '加载中'})
+    const result = await setDefaultAgent(item.agentId)
+    
+    if(result){
+      await fetchAgents()
+    }
+    loading = false;
+    Taro.hideLoading()
+  }
+
   const renderPersonalAgents = ()=> {
     return personalAgents.map((item) => {
       return <View className={item.isDefault ? style.cardActive : style.card}>
-        <View className="flex items-start mb-24">
+        <View className="flex items-start mb-24" onClick={()=> handleClick(item)}>
           <View className="flex flex-col flex-1">
             <View className="flex items-end gap-8 text-gray-65">
               <View className="text-20 font-medium leading-28 text-black">

+ 19 - 12
src/components/AgentPage/components/SummaryBar/index.tsx

@@ -20,6 +20,8 @@ import Taro from "@tarojs/taro";
 import PopupSheets from "@/components/popup/popup-sheets";
 import { useAgentStore } from "@/store/agentStore";
 
+import { useModalStore } from "@/store/modalStore";
+
 export default () => {
   const headerHeight = useAppStore((state) => state.headerHeight);
   const [showAgentSwap, setShowAgentSwap] = useState(false);
@@ -30,6 +32,11 @@ export default () => {
   const agent = useAgentStore((state)=> state.agent)
   
 
+  const {showModal,} = useModalStore()
+
+  const test = ()=> {
+    
+  }
 
 
   // 自定义背景样式
@@ -127,19 +134,19 @@ export default () => {
                 <View className={style.icon}>
                   <IconPhoneGray />
                 </View>
-                <View>137 1234 1234</View>
+                <View>{agent?.mobile}</View>
               </View>
               <View className="flex items-center gap-12">
                 <View className={style.icon}>
                   <IconMailGray />
                 </View>
-                <View>zhangsan@eyeclear.com</View>
+                <View>{agent?.email}</View>
               </View>
               <View className="flex items-center gap-12">
                 <View className={style.icon}>
                   <IconLocationGray />
                 </View>
-                <View>浙江省杭州市上城区钱江国际时代广场2幢</View>
+                <View>{agent?.address}</View>
               </View>
             </View>
           </View>
@@ -159,16 +166,16 @@ export default () => {
           content={[
             {item: <View className="text-12 font-normal text-gray-45">删除后所有数据将被清空,且无法恢复</View>}, 
             {item:'删除', type: 'warn', onClick: ()=> {
-              Taro.showModal({
-                content: '确认删除该智能体?',
-                success: function (res) {
-                  if (res.confirm) {
-                    console.log('用户点击确定')
-                  } else if (res.cancel) {
-                    console.log('用户点击取消')
-                  }
+              
+              showModal({
+                content: <>确认删除该智能体?</>,
+                onConfirm() {
+                  console.log(111)
+                  setShowPopup(false);
+                },
+                onCancel() {
                   setShowPopup(false);
-                }
+                },
               })
               
             }},

+ 5 - 1
src/components/AgentPage/index.tsx

@@ -4,7 +4,9 @@ import { Image, Text, View } from "@tarojs/components";
 import Logo from "@/components/logo";
 import SummaryBar from "./components/SummaryBar";
 import { useAgentStore } from "@/store/agentStore";
-import { useEffect } from "react";
+import { useEffect, useState } from "react";
+
+
 
 interface IProps {
   agentId: string;
@@ -17,12 +19,14 @@ export default function Index({ agentId }: IProps) {
       fetchAgent(agentId);
     }
   }, [agentId]);
+
   
 
   return (
     <View className="w-full">
       <NavBarNormal scrollFadeIn showBgColor leftColumn={Logo}></NavBarNormal>
       <SummaryBar></SummaryBar>
+      
       <View className="p-16">
         <View className="rounded-12 bg-white p-24">
           杭州茗视佳眼科,引入先进的精品专项医院运营模式,引进了阿玛仕1050rs、新版蔡司、生物力学分析仪、欧堡眼底照相等国际先进设备,汇聚浙一浙二的顶级近视手术专家手术。开展Smart全激光、半飞秒、全飞秒、ICL晶体植入以及多焦点人工晶体置换手术。

+ 17 - 0
src/components/GlobalModal/index.tsx

@@ -0,0 +1,17 @@
+// components/GlobalModal.tsx
+import { useModalStore } from '@/store/modalStore';
+import WemetaModal from '@/components/WemetaModal'
+export function GlobalModal() {
+  const { isVisible, config, onConfirm, onCancel } = useModalStore();
+
+
+  if(!config?.content){
+    return <></>
+  }
+
+  return (
+    <WemetaModal show={isVisible} onConfirm={()=> onConfirm() } onCancel={()=> onCancel()} >
+        <>{config.content}</>
+      </WemetaModal>
+  );
+}

+ 6 - 1
src/components/wemeta-modal/index.module.less → src/components/WemetaModal/index.module.less

@@ -12,12 +12,13 @@
   backdrop-filter: blur(14px);
 }
 .modalContent{
+  min-width: 260px;
   border-radius: 10px;
   background-color: #FFF;
 }
 .content{
   display: flex;
-  padding: 20px 16px;
+  padding: 32px;
   flex-direction: column;
   align-items: center;
   
@@ -37,6 +38,10 @@
   text-align: center;
   font-size: 14px;
   line-height: 24px;
+  border-right: 1px solid rgba(#000, 0.08);
+  &:last-child{
+    border-right: 0;
+  }
 }
 .footerButtonPrimary{
   .footerButton();

+ 1 - 2
src/components/wemeta-modal/index.tsx → src/components/WemetaModal/index.tsx

@@ -1,5 +1,4 @@
 import {View} from '@tarojs/components'
-import { useState } from 'react'
 import style from './index.module.less'
 interface Props {
   show?: boolean
@@ -20,7 +19,7 @@ const index = ({show = false, children, onConfirm, onCancel, footer = true}: Pro
     return <>
       <View className={style.footer}>
         <View className={style.footerButton} onClick={handleCancel}>取消</View>
-        <View className={`${style.footerButtonPrimary}`} onClick={handleConfirm}>添加</View>
+        <View className={`${style.footerButtonPrimary}`} onClick={handleConfirm}>确定</View>
       </View>
     </>
   }

+ 0 - 47
src/components/floating-tips/index.module.less

@@ -1,47 +0,0 @@
-.container {
-  background: #000000bf;
-  border-radius: 50px;
-  padding: 12px;
-  position: fixed;
-  bottom: 10px;
-  left: 12px;
-  right: 12px;
-  z-index: 2;
-  display: flex;
-  flex-direction: row;
-  align-items: center;
-  font-weight: 500;
-}
-
-.closeBox {
-  width: 20px;
-  height: 20px;
-  border-radius: 20px;
-  background: #ffffff33;
-  padding: 5px;
-  display: flex;
-  align-items: center;
-  justify-content: center;
-}
-
-.icon {
-  height: 100%;
-  width: 100%;
-}
-
-.text {
-  color: white;
-  font-size: 15px;
-  line-height: 26px;
-  flex: 1;
-  text-align: center;
-}
-
-.btn {
-  background-color: #cbf706;
-  border-radius: 30px;
-  padding: 4px 16px;
-  color: black;
-  font-size: 13px;
-  line-height: 20px;
-}

+ 0 - 31
src/components/floating-tips/index.tsx

@@ -1,31 +0,0 @@
-import IconCloseWhite from "@/images/icon-close-white.svg";
-import { Image, View } from "@tarojs/components";
-import Taro from "@tarojs/taro";
-import { useState } from "react";
-import styles from "./index.module.less";
-
-interface CompProps {}
-const Comp: React.FC<CompProps> = () => {
-  const [hidden, setHidden] = useState(false);
-  const handleCloseAction = () => {
-    setHidden(true)
-  };
-  const handleCreateAction = () => {
-    Taro.switchTab({
-      url: "/pages/index/index",
-    });
-  }
-  return hidden ? (
-    <></>
-  ) : (
-    <View className={styles.container}>
-      <View className={styles.closeBox} onClick={handleCloseAction}>
-        <Image src={IconCloseWhite} className={styles.icon}></Image>
-      </View>
-      <View className={styles.text}>🥳 搭一个自己的智能主页吧~</View>
-      <View className={styles.btn} onClick={handleCreateAction}>前往</View>
-    </View>
-  );
-};
-
-export default Comp;

+ 2 - 0
src/components/page-wrapper/index.tsx

@@ -6,6 +6,7 @@ import React from "react";
 import pageStyle from "./index.module.less";
 import PopupVip from '@/components/popup/popup-vip/index'
 import PopupTips from '@/components/popup/popup-tips'
+import { GlobalModal } from '@/components/GlobalModal/index';
 import { useAppStore } from "@/store/appStore";
 interface Props {
   children?: React.ReactChild | React.ReactChild[];
@@ -40,6 +41,7 @@ const Index: React.FC<Props> = ({ children, style }) => {
       {/* fillBgRest 背景图100vh 视口高度以下填充颜色  */}
       {/* <View className={pageStyle.fillBgRest}></View> */}
       <View className="relative z-0">{children}</View>
+      <GlobalModal></GlobalModal>
     </View>
   );
 };

+ 2 - 11
src/pages/agent/components/AgentSetting/index.tsx

@@ -5,23 +5,14 @@ import AgentEmptyCard from './components/AgentEmptyCard'
 import AgentContactCard from './components/AgentContactCard'
 
 import React, { useEffect, useState } from "react";
-import { getAgents, getAgent, createAgent } from "@/service/agent";
-import { TAgentItem } from '@/types/agent'
+import { useAgentStore } from "@/store/agentStore";
 
 export default React.memo(function Index() {
   console.log('agent setting')
+  const {fetchAgents} = useAgentStore()
   
   
-
-  const fetchAgent = async () => {
-    // const a = await getAgent()
-    // console.log(a)
-  }
   
-  const fetchAgents = async () => {
-    const a = await getAgents()
-    console.log(a)
-  }
 
   useEffect(()=> {
     fetchAgents()

+ 6 - 4
src/pages/agent/index.tsx

@@ -7,10 +7,12 @@ import TabBarButtons from "@/components/wemeta-tabs/TabBarButtons";
 import AgentSetting from './components/AgentSetting/'
 import { useAgentStore } from "@/store/agentStore";
 import { useEffect, useState } from "react";
+import { useRouter } from "@tarojs/taro";
 
 export default function Index() {
   const [tabIndex, setTabIndex] = useState("1");
-  const agent = useAgentStore((state)=> state.agent)
+  const router = useRouter()
+  const agentId = router.params.agentId
   const {fetchAgent} = useAgentStore()
   const handleTabIndexChange = (index: string) => {
     setTabIndex(index);
@@ -26,10 +28,10 @@ export default function Index() {
       label: "微官网",
     },
   ];
-
+  
   useEffect(()=> {
-    agent?.agentId && fetchAgent(agent.agentId)
-  }, [agent?.agentId])
+    agentId && fetchAgent(agentId)
+  }, [agentId])
 
   return (
     <PageCustom>

+ 8 - 56
src/pages/editor-pages/editor-greeting/index.tsx

@@ -1,68 +1,21 @@
-import { useState } from "react";
-import { View } from "@tarojs/components";
 
+import { View } from "@tarojs/components";
 import PageCustom from "@/components/page-custom/index";
 import NavBarNormal from "@/components/nav-bar-normal/index";
-import editorStyle from "../editor.module.less";
-import { useComponentStore } from '@/store/componentStore'
-import { useCharacterStore } from '@/store/characterStore'
 import WemetaTextarea from "@/components/wemeta-textarea/index";
-import Taro, {useRouter, useUnload} from "@tarojs/taro";
+import { useAgentStore } from "@/store/agentStore";
+import useEditAgent from "@/hooks/useEditAgent";
 export default function Index() {
-  const router = useRouter();
-  const { id } = router.params;
-  let currentComponent = useComponentStore((state)=>  state.currentComponent);
-  const character = useCharacterStore((state)=> state.character);
-  const loading = useComponentStore((state)=> state.loading);
-  const { saveComponent } = useComponentStore();
-  const [value, setValue] = useState(currentComponent?.data?.text ?? '');
-  
-  const handleSave = async () => {
-    if(loading){
-      return
-    }
-    if(value.length <= 0){
-      return;
-    }
-    // const c = {
-    //   data: {
-    //     text: value,
-    //     layout: radioValue,
-    //   },
-    //   enabled: currentComponent?.enabled ?? true,
-    //   id: currentComponent?.id,
-    //   name: currentComponent?.name ?? "姓名",
-    //   index: currentComponent?.index,
-    //   characterProfileId: currentComponent?.characterProfileId ?? character?.profileId,
-    //   type: "title",
-    // };
-
-    
-    // await saveComponent(c)
-  };
 
-  const onChange = (e: any) => {
-    setValue(e);
-  };
-  
-
-  
-
-  const handleNavBack = async () => {
-    await handleSave()
-  }
-  
-  
+const agent = useAgentStore((state)=> state.agent)  
+const {handleSubmit, onChange, value} = useEditAgent('greeting', agent?.greeting ?? '')
 
   return (
     <PageCustom>
       <NavBarNormal backText="开场白"></NavBarNormal>
       <View className="flex flex-col items-center w-full">
-        <View className={editorStyle.container}>
-          <View
-            className={`${editorStyle.textInputContainer} ${editorStyle.underline}`}
-          >
-            <WemetaTextarea
+        <View className="w-full p-16">
+          <WemetaTextarea
               value={value}
               onBlur={(value: string) => onChange(value)}
               onInput={(value: string) => onChange(value)}
@@ -70,9 +23,8 @@ export default function Index() {
               autoFocus
               ai
             />
-          </View>
         </View>
-        <View className="bottom-bar">
+        <View className="bottom-bar" onClick={handleSubmit}>
           <View className="pt-12 px-20">
             <View className={`button-rounded button-primary`}>保存</View>
           </View>

+ 2 - 2
src/pages/editor-pages/editor.module.less

@@ -4,8 +4,8 @@
   box-sizing: border-box;
 }
 .textInputContainer{
-  background-color: white;
-  border-radius: 20px;
+  // background-color: white;
+  // border-radius: 20px;
 }
 .textInput{
   color: #000;

+ 12 - 10
src/pages/index/AgentNone.tsx → src/pages/index/components/InitView/index.tsx

@@ -8,10 +8,11 @@ import { UserInfoResponse } from '@/xiaolanbenlib/api/auth'
 import { onLogout, useIsLogin } from '@/xiaolanbenlib/hooks/data/useAuth'
 import refreshUserId, { clearUserInfo, getOpenIdAsync } from '@/xiaolanbenlib/utils/auth'
 
-import WelcomeTips from './components/welcome/index'
+import WelcomeTips from '../WelcomeTips/index'
 import { useAgentStore } from '@/store/agentStore'
 import { useSystemStore } from '@/store/systemStore'
 import { TAgent } from "@/types/agent";
+import { useUserStore } from "@/store/userStore";
 interface Iprops {
   setDefault: (agent: TAgent) => void
 }
@@ -22,6 +23,7 @@ export default function Index({setDefault}: Iprops) {
 
   const {fetchAgents} =  useAgentStore()
   const { getSysCoreCnf } =  useSystemStore()
+  const { getMyInfo } = useUserStore()
 
   async function initUserInfo() {
     await refreshUserId()
@@ -41,7 +43,7 @@ export default function Index({setDefault}: Iprops) {
         }
       })
     await getSysCoreCnf()
-
+    await getMyInfo()
     const agents = await fetchAgents()
     const agent = agents.find( item=> item.isDefault)
     if(agent){
@@ -63,14 +65,14 @@ export default function Index({setDefault}: Iprops) {
   return (
     <PageCustom>
       <NavBarNormal leftColumn={renderLogo}></NavBarNormal>
-      
-      <WelcomeTips>
-        <View className="flex items-center">
-          <View>{userInfo?.logo && <Image className="w-24 h-24" src={userInfo?.logo}></Image>}</View>
-          <View>{isLogin ? `已登录「${userInfo?.nickName}」` : '未登录'}</View>
-        </View>      
-      </WelcomeTips>
-      
+      <View className="relative w-full">
+        <WelcomeTips>
+          <View className="flex items-center">
+            <View>{userInfo?.logo && <Image className="w-24 h-24" src={userInfo?.logo}></Image>}</View>
+            <View>{isLogin ? `已登录「${userInfo?.nickName}」` : '未登录'}</View>
+          </View>      
+        </WelcomeTips>
+      </View>
       </PageCustom>
   );
 }

+ 0 - 0
src/pages/index/components/welcome/index.module.less → src/pages/index/components/WelcomeTips/index.module.less


+ 0 - 0
src/pages/index/components/welcome/index.tsx → src/pages/index/components/WelcomeTips/index.tsx


+ 3 - 7
src/pages/index/index.tsx

@@ -1,25 +1,21 @@
 
 import PageCustom from "@/components/page-custom/index";
-
+import { View } from "@tarojs/components";
 import { useEffect, useState } from "react";
 import DefaultAgent from '@/components/AgentPage'
-import AgentNone from './AgentNone'
+import InitView from './components/InitView'
 import { TAgent } from "@/types/agent";
 
 export default function Index() {
 
   const [defaultAgent, setDefaultAgent] = useState<TAgent|null>(null)
 
-
-  useEffect(()=> {
-    
-  }, [])
   
   
   return (
     <PageCustom>
       <>
-      {!defaultAgent && <AgentNone setDefault={setDefaultAgent}></AgentNone>}
+      {!defaultAgent && <InitView setDefault={setDefaultAgent}></InitView>}
       {defaultAgent && <DefaultAgent agentId={defaultAgent.agentId}></DefaultAgent>}
       </>
     </PageCustom>

+ 35 - 16
src/pages/knowledge/components/personal-tab/index.tsx

@@ -1,10 +1,10 @@
-import { Image, View } from "@tarojs/components";
+import { ScrollView, View } from "@tarojs/components";
 import RoundedLabel from "../rounded-label";
 import IconFilterFeeds from "@/components/icon/IconFilterFeeds";
 import IconFilterBatch from "@/components/icon/IconFilterBatch";
 import IconFilterList from "@/components/icon/IconFilterList";
 
-import IconFIleTxt from "@/components/icon/IconFIleTxt";
+import IconPlusBig from "@/components/icon/icon-plus-big";
 import IconFIlePDF from "@/components/icon/IconFIlePDF";
 import IconFIleXLSX from "@/components/icon/IconFIleXLSX";
 
@@ -15,30 +15,40 @@ import Popup from "@/components/popup/popup";
 import WemetaSwitch from "@/components/wemeta-switch";
 import { useEffect, useState } from "react";
 
-import ViewStyleChat from '../view-style/ViewStyleChat'
-import ViewStyleList from '../view-style/ViewStyleList'
-
+import ViewStyleChat from "../view-style/ViewStyleChat";
+import ViewStyleList from "../view-style/ViewStyleList";
+import Taro from "@tarojs/taro";
+import { uploadKnowledgeFile } from "@/service/knowledge";
+import style from "../../index.module.less";
 type TListStyle = "chat" | "list";
 
 const Index = () => {
-  
   const [checked, setChecked] = useState(false);
   const [showPopup, setShowPopup] = useState(false);
   const [listStyle, setListStyle] = useState<TListStyle>("chat");
-
   const handleListStyleChange = (listStyle: TListStyle) => {
     setListStyle(listStyle);
   };
 
-  
-
-  useEffect(() => {
-    console.log("hellow");
-  }, []);
+  const handleChooseFile = () => {
+    Taro.chooseMessageFile({
+      count: 1,
+      type: "all",
+      async success(res) {
+        // tempFilePath可以作为img标签的src属性显示图片
+        const tempFilePaths = res.tempFiles;
+        const response = await uploadKnowledgeFile({
+          tmpPath: tempFilePaths[0].path,
+          fileName: "field",
+        });
+        console.log(response);
+      },
+    });
+  };
 
   return (
     <>
-      <View className="pt-12">
+      <View className="pt-12 h-full">
         <View className="rounded-container-header"></View>
         <View className="px-16 pb-20">
           <View className="flex items-center">
@@ -70,11 +80,20 @@ const Index = () => {
             </View>
           </View>
         </View>
-        <View className="px-16">
-          {listStyle === "chat" ? <ViewStyleChat/> : <ViewStyleList />}
+        <View className="px-16  h-full">
+          
+            {listStyle === "chat" ? <ViewStyleChat /> : <ViewStyleList />}
+          
         </View>
       </View>
-      
+
+      <View
+        onClick={handleChooseFile}
+        className="fixed right-20 bottom-20 w-48 h-48 rounded-full bg-primary flex-center drop-shadow-[0_4px_16px_rgba(49,124,250,0.25)]"
+      >
+        <IconPlusBig></IconPlusBig>
+      </View>
+
       <Popup setShow={setShowPopup} show={showPopup} title="展示样式">
         <View
           className={`rounded-card ${

Failā izmaiņas netiks attēlotas, jo tās ir par lielu
+ 11 - 3
src/pages/knowledge/components/view-style/ViewStyleChat.tsx


+ 68 - 6
src/pages/knowledge/components/view-style/ViewStyleList.tsx

@@ -1,4 +1,4 @@
-import { Image, View } from "@tarojs/components";
+import { ScrollView, View } from "@tarojs/components";
 import MessageRobotRich from "@/components/chat-message/MessageRobotRich";
 import MessageRich from "@/components/chat-message/MessageRich";
 import { WelcomeCard, AddSuccessfulTips } from "../asistant-message";
@@ -9,13 +9,52 @@ import IconFIleXLSX from "@/components/icon/IconFIleXLSX";
 
 import FigureList from "@/components/list/figure-list";
 import FigureListItem from "@/components/list/figure-list-item";
-
+import { useDidShow } from "@tarojs/taro";
 import { useEffect, useState } from "react";
 
 import RotateLoading from "@/components/rotate-loading";
 import Taro from "@tarojs/taro";
 
+import { getKnowledgeList } from "@/service/knowledge";
+import { isSuccess } from "@/utils";
+import type { TKnowledgeListItem, TQAListItem } from "@/types/knowledge";
+
 const Index = () => {
+
+  const [scrollTop, setScrollTop] = useState(9999)
+  const [list, setList] = useState<TKnowledgeListItem[]>([])
+  
+  let startId:string|undefined = undefined
+  let loading = false
+  const loadMore = async () => {
+    if(loading){
+      return
+    }
+    loading = true
+    const response = await getKnowledgeList({
+      startId: startId,
+      pageSize: 10
+    })
+    
+    const result = isSuccess(response.status)
+    if(result){
+      const newData = [...response.data.data, ...list]
+      setList(newData)
+      startId = response.data.nextId
+    }
+    loading = false
+  }
+  const onScrollToUpper = async () => {
+    console.log('toUpper')
+    loadMore()
+    
+  }
+
+  useDidShow(()=> {
+    console.log(1111)
+    loadMore()
+  })
+
   const handleEdit = ()=> {
     Taro.navigateTo({
       url: '/pages/knowledge-item/index'
@@ -31,9 +70,32 @@ const Index = () => {
   };
 
   return (
-    <View>
+    <ScrollView
+      scrollY
+      onScrollToUpper={onScrollToUpper}
+      scrollTop={scrollTop}
+      style={{
+        flex: 1,
+        height: "100%", // 高度自适应
+      }}
+    >
       <FigureList>
-        <FigureListItem
+      {list.map(item => {
+        return <FigureListItem
+            figure={IconFIleTxt}
+            underline
+            arrow
+            onClick={handleEdit}
+          >
+            <View className="flex flex-col flex-1 gap-2 w-full">
+              <View className="text-14 leading-22">{item.title}</View>
+              <View className="text-12 leading-20 text-gray-45">
+              {item.createTime} | {item.fileSize}
+              </View>
+            </View>
+          </FigureListItem>
+      })}
+        {/* <FigureListItem
           figure={IconFIleTxt}
           underline
           arrow
@@ -56,9 +118,9 @@ const Index = () => {
               03-24 12:20 | 822.KB
             </View>
           </View>
-        </FigureListItem>
+        </FigureListItem> */}
       </FigureList>
-    </View>
+    </ScrollView>
   );
 };
 

+ 10 - 0
src/pages/knowledge/index.module.less

@@ -0,0 +1,10 @@
+page {
+  min-height: 100vh;
+}
+.container{
+  padding-top: 8px;
+  overflow: hidden;
+}
+.tabContent{
+  height: calc(100vh - 210px);
+}

+ 5 - 4
src/pages/knowledge/index.tsx

@@ -8,7 +8,8 @@ import PageCustom from "@/components/page-custom/index";
 import NavBarNormal from "@/components/nav-bar-normal/index";
 import WemetaTabs from "@/components/wemeta-tabs/index";
 import PersonalTab from './components/personal-tab'
-import CompanyTab from './components/CompanyTab'
+import CompanyTab from './components/CompanyTab';
+import style from "./index.module.less";
 import Taro from "@tarojs/taro";
 
 
@@ -23,7 +24,7 @@ export default function Index() {
     {
       key: "1",
       label: "个人知识",
-      children: <View>
+      children: <View className={style.tabContent}>
         {/* <View className="flex flex-col pt-56 items-center">
           <View className="data-empty"></View>
           <View className="text-12 text-gray-45 text-center leading-24 mt-12">
@@ -36,7 +37,7 @@ export default function Index() {
     {
       key: "2",
       label: "企业知识",
-      children: <View>
+      children: <View className={style.tabContent}>
           <View className="flex-center pt-40">
             <View className="text-center text-14 leading-28 text-gray-45 mb-44 w-172">
               <View className="text-center text-16 leading-24 font-medium text-black">绑定企业,知识自动到位</View>
@@ -54,7 +55,7 @@ export default function Index() {
     <PageCustom>
       <NavBarNormal backText="知识库"></NavBarNormal>
       <View className="w-full">
-        <View className="pt-8">
+        <View className={style.container}>
           <WemetaTabs current="1" list={tabList} className="px-16"></WemetaTabs>
         </View>
       </View>

+ 0 - 1
src/pages/voice/index.tsx

@@ -168,7 +168,6 @@ const VoiceTabs: React.FC<Props> = ({}) => {
         <View className={style.tabContent}>
           <ScrollView
             scrollY
-            id="scrollView"
             onScrollEnd={handleMaleScrollEnd}
             style={{
               flex: 1,

+ 37 - 12
src/service/knowledge.ts

@@ -3,13 +3,46 @@ import Taro from "@tarojs/taro";
 import { getHeaders } from "@/xiaolanbenlib/module/axios.js";
 import JsonChunkParser from "@/utils/jsonChunkParser";
 import request from "@/xiaolanbenlib/module/axios.js";
-import type { TKnowledgeListItem, TQAListItem } from "@/types/knowledge";
+import type { TKnowledgeItem, TQAListItem, TKnowledgeStreamResponseData } from "@/types/knowledge";
+import { getSimpleHeader } from "@/xiaolanbenlib/module/axios.js";
+import { isSuccess } from "@/utils";
 
 
+// 上传知识库文件
+export const uploadKnowledgeFile = (data: 
+  {
+    tmpPath: string,
+    fileName: string
+  }
+):Promise<boolean> => {
+  return new Promise((resolve, reject)=> {
+    Taro.uploadFile({
+      url: `${bluebookAiAgent}api/v1/my/knowledge/upload`,
+      filePath: data.tmpPath,
+      name: data.fileName,
+      formData: {
+        file: data.fileName,
+      },
+      header: {
+        ...getSimpleHeader(),
+      },
+      success(res) {
+        console.log(res)
+        resolve(isSuccess(res.statusCode))
+      },
+      fail(err) {
+        console.log(err);
+        reject(false);
+      },
+    });
+  })
+  
+}
+
 
 //我的知识库--列表
 export type TKnowledgeListResponse = {
-  "data": TKnowledgeListItem[][],
+  "data": TKnowledgeItem[],
   "nextId": string,
   "totalCount": number
 }
@@ -35,17 +68,9 @@ export const shareToEnt = (data:
 
 
 // 我的知识库--信息流
-export type TKnowledgeDataItem = {
-  // 信息流内容 可能为null; 如:已成功解析2份知识 ,
-  "content"?: string,
-  // 信息流关联文件列表; 可能为 null ,
-  "knowledgeList"?: TKnowledgeListItem[],
-  "role": string,
-  "streamId": number,
-  "type": string
-}
+
 export type TKnowLedgeStreamResponse = {
-  "data": TKnowledgeDataItem[][],
+  "data": TKnowledgeStreamResponseData[],
   "nextId": string,
   "totalCount": number
 }

+ 6 - 7
src/service/user.ts

@@ -1,12 +1,11 @@
-import request from '@/xiaolanbenlib/module/axios.js'
-import { TEntityUser } from '@/types/index'
+import { bluebookAiAgent } from "@/xiaolanbenlib/api/index";
+import Taro from "@tarojs/taro";
+import request from "@/xiaolanbenlib/module/axios.js";
+import { TUserInfo } from "@/types/user";
 
 
-export const putUser = (data: TEntityUser) => {
-  return request.put<TEntityUser, TEntityUser>('/v1/user', data)
-}
 
 
-export const getUser = () => {
-  return request.get<TEntityUser>('/v1/user')
+export const getMyInfo = () => {
+  return request.get<TUserInfo>(`${bluebookAiAgent}api/v1/my/info`,)
 }

+ 1 - 1
src/store/agentStore.ts

@@ -88,7 +88,7 @@ export const useAgentStore = create<AgentStoreState>((set, get) => ({
     const response = await _setDefaultAgent(agentId);
     const result = isSuccess(response.status)
     if(result){
-      await get().fetchAgent(agentId)
+      return await get().fetchAgent(agentId)
     }
     return null
   },

+ 35 - 0
src/store/modalStore.ts

@@ -0,0 +1,35 @@
+// stores/modalStore.ts
+import { ReactElement } from 'react';
+import { create } from 'zustand';
+
+
+type ModalConfig ={
+  content: React.ReactNode;
+  beforeClose?: () => Promise<void> | void; // 用户自定义关闭前回调
+  onCancel?: () => Promise<void> | void; // 用户自定义关闭前回调
+  onConfirm?: () => Promise<void> | void; // 用户自定义关闭前回调
+}
+type ModalStore = {
+  isVisible: boolean;
+  config: ModalConfig | null;
+  showModal: (config:ModalConfig) => void;
+  hideModal: () => void;
+  onConfirm: ()=> void
+  onCancel: ()=> void
+};
+
+export const useModalStore = create<ModalStore>((set, get) => ({
+  isVisible: false,
+  config: null,
+  showModal: (config) => set({ isVisible: true, config }),
+  hideModal: () => set({ isVisible: false }),
+  onConfirm: () => {
+    get().config?.onConfirm?.()
+    get().hideModal();
+  },
+  onCancel: () => {
+    get().config?.onCancel?.()
+    get().hideModal();
+  },
+  
+}));

+ 10 - 17
src/store/userStore.ts

@@ -1,24 +1,17 @@
 import { create } from 'zustand'
-import { getUser, putUser } from '@/service/user'
-import { TEntityUser } from '@/types/index'
+import { getMyInfo as _getMyInfo } from '@/service/user'
+import { TUserInfo } from '@/types/user'
+import { isSuccess } from '@/utils'
 export interface UserState {
-  user: TEntityUser | null
-  fetchUser: ()=> void
-  saveUser: (user: TEntityUser)=> Promise<TEntityUser | null>
+  whoami: TUserInfo | null
+  getMyInfo: ()=> Promise<void>
 }
 
 export const useUserStore = create<UserState>((set) => ({
-  user: null,
-  fetchUser: async () => {
-    const res = await getUser()
-    set({ user: res.data})
+  whoami: null,
+  getMyInfo: async () => {
+    const res = await _getMyInfo()
+    isSuccess(res.status)
+    set({ whoami: res.data})
   },
-  saveUser: async (user: TEntityUser) => {
-    const res = await putUser(user)
-    if(res.data){
-      set({ user: res.data})
-      return res.data
-    }
-    return null
-  }
 }))

+ 29 - 13
src/types/knowledge.ts

@@ -1,20 +1,36 @@
 
-export type TKnowledgeListItem = {
-  "answerCnt": number,
-  "createTime": string,
-  "enableExactAnswer": false,
-  "fileSizeStr": string,
-  "icon": string,
-  "knowledgeId": number,
-  "parseStatus": string,
-  "picUrl": string,
-  "title": string,
-  "type": string
-}
 
 export type TQAListItem = {
   "answer": string,
   "links": string[],
   "pics": string[],
   "question": string
-}
+}
+
+export type TKnowledgeItem = {
+  answerCnt: number;
+  createTime: string;
+  description: string;
+  enableExactAnswer: boolean;
+  fileSize: number;
+  fileSizeStr: string;
+  icon: string;
+  isParsing: boolean;
+  knowledgeId: number;
+  parseMsg: string;
+  parseStatus: string;
+  parseStatusDesc: string;
+  picUrl: string;
+  title: string;
+  type: string;
+};
+
+export type TKnowledgeStreamResponseData = {
+  content: string;
+  isParsing: boolean;
+  knowledgeList: TKnowledgeItem[];
+  msgTime: string;
+  role: string;
+  streamId: number;
+  type: string;
+};

+ 8 - 0
src/types/user.ts

@@ -0,0 +1,8 @@
+export type TUserInfo = {
+  avatarUrl?: string;
+  mobile?: string;
+  nickName?: string;
+  userId?: number;
+  userName?: string;
+};
+    

Daži faili netika attēloti, jo izmaiņu fails ir pārāk liels