Selaa lähdekoodia

Merge branch 'master' of http://gitlab.smartai.com/zhupei/smartai2dian0

张涛 1 vuosi sitten
vanhempi
sitoutus
b0d1f4cd1b
100 muutettua tiedostoa jossa 581 lisäystä ja 169 poistoa
  1. 1 1
      dist/assets/About-0_4mn409.js
  2. 0 0
      dist/assets/Action-Dh_xwaUN.js
  3. 0 0
      dist/assets/Action-VeLFm1C_.js
  4. 0 1
      dist/assets/Agent-CaN-MG-w.js
  5. 1 0
      dist/assets/Agent-h7sFnnjs.js
  6. 1 1
      dist/assets/BreadCrumbMenu-B_hTgBrP.js
  7. 0 0
      dist/assets/CardItem-BMmuuHdU.js
  8. 0 0
      dist/assets/ChatAsideMenu-Ba1RpVeM.js
  9. 0 1
      dist/assets/ContentContainer-BHCaXtzf.js
  10. 1 0
      dist/assets/ContentContainer-CJX9CKtt.js
  11. 1 1
      dist/assets/Conversation-DB2-IjXS.js
  12. 0 0
      dist/assets/ConversationBoard-BgPO_vVT.js
  13. 0 0
      dist/assets/ConversationHistory-CCJzmL-m.js
  14. 0 0
      dist/assets/ConversationQA-BqdQCLBN.js
  15. 0 0
      dist/assets/ConversationQA-D-k21gUf.css
  16. 0 0
      dist/assets/ConversationQA-Dkt1Yl5i.css
  17. 0 0
      dist/assets/ConversationQA-M5wqc5rk.js
  18. 0 0
      dist/assets/Header-BJnGagkP.js
  19. 0 0
      dist/assets/Header-EV6WKNRC.js
  20. 0 0
      dist/assets/Intelligent-DccD9ar3.js
  21. 0 0
      dist/assets/Knowledge-DULLtUIJ.js
  22. 0 0
      dist/assets/Knowledge-b1L_xP6f.js
  23. 0 0
      dist/assets/KnowledgeDetail-CGoEBgCR.js
  24. 0 1
      dist/assets/KnowledgeDetail-D-Wwg7jt.css
  25. 0 0
      dist/assets/KnowledgeDetail-DOUFNcvw.css
  26. 0 1
      dist/assets/KnowledgeDetail-gfDzy0tu.js
  27. 1 1
      dist/assets/LayoutExperience-CMFHTFFA.js
  28. 1 1
      dist/assets/LayoutPermission-CNHpQmOR.js
  29. 0 0
      dist/assets/Login-rBg_rNVN.js
  30. 0 0
      dist/assets/Model-ByV4wKi0.js
  31. 0 0
      dist/assets/Model-XbZauoqo.js
  32. 0 0
      dist/assets/PermissionAccount-DZhva8ir.js
  33. 0 0
      dist/assets/PermissionAccount-DlJVT4KS.js
  34. 0 0
      dist/assets/PermissionGroup-CnybK5Ri.js
  35. 0 0
      dist/assets/PermissionGroup-sOE28ckl.js
  36. 0 0
      dist/assets/PermissionOrganization-CrQo3ose.js
  37. 0 0
      dist/assets/PermissionOrganization-Dmv63NTr.js
  38. 1 1
      dist/assets/PermissionResource-D-GO84cn.js
  39. 0 0
      dist/assets/PermissionRole-BtCNHZLr.js
  40. 0 0
      dist/assets/PermissionRole-eNq1Mdy5.js
  41. 0 1
      dist/assets/Profiles-D9xyrjtb.js
  42. 1 0
      dist/assets/Profiles-XHtNipP0.js
  43. 1 1
      dist/assets/Register-DtOMFRAZ.js
  44. 1 0
      dist/assets/Settings-AXoo_5m7.js
  45. 0 1
      dist/assets/Settings-BA1t7Nga.js
  46. 3 3
      dist/assets/Xiaoshu-618H8DaN.js
  47. 1 1
      dist/assets/api-conversation-board-BFqUe5Q2.js
  48. 0 0
      dist/assets/common-CgahEqA5.js
  49. 1 0
      dist/assets/common-CnTRIzmN.js
  50. 0 0
      dist/assets/common-De0VX7go.js
  51. 0 1
      dist/assets/common-DwtO0d57.js
  52. 1 0
      dist/assets/difyDetail-B74V7FrB.css
  53. 0 2
      dist/assets/difyDetail-Byb6J_hP.js
  54. 2 0
      dist/assets/difyDetail-CT7ZC2lQ.js
  55. 0 1
      dist/assets/difyDetail-DBZmuZRU.css
  56. 0 0
      dist/assets/index-CSqHrY5V.js
  57. 0 0
      dist/assets/index-Q_8H4hiR.css
  58. 0 0
      dist/assets/index-VA7QPrnA.css
  59. 0 0
      dist/assets/rgflow-dify-BHR_3Je4.js
  60. BIN
      dist/assets/step1-vQjBW3d2.png
  61. BIN
      dist/assets/step2-BNwS3ZaL.png
  62. 1 1
      dist/assets/use-all-agents-CF3vx0As.js
  63. 0 1
      dist/assets/use-current-user-eSXbuPAj.js
  64. 1 0
      dist/assets/use-current-user-snSpV2ft.js
  65. BIN
      dist/font/PingFang-SC-Bold.ttf
  66. BIN
      dist/font/PingFang-SC-Light.ttf
  67. BIN
      dist/font/PingFang-SC-Regular.ttf
  68. 2 2
      dist/index.html
  69. 66 0
      package-lock.json
  70. 2 0
      package.json
  71. 14 0
      src/3rd-libs/clipboard.js
  72. BIN
      src/assets/file-upload.png
  73. BIN
      src/assets/question-define.png
  74. 1 1
      src/modules/conversation-chat/DialogFooter.vue
  75. 1 1
      src/modules/conversation-chat/DialogHeader.vue
  76. 67 29
      src/modules/conversation-chat/DialogInput.vue
  77. 23 4
      src/modules/conversation-chat/DialogItem.vue
  78. 13 2
      src/modules/conversation-chat/DialogList.vue
  79. 29 4
      src/modules/conversation-chat/dialog-input/InputActions.vue
  80. 17 2
      src/modules/conversation-chat/dialog-item/BtnStopChat.vue
  81. 17 5
      src/modules/conversation-chat/dialog-item/DialogActions.vue
  82. 7 3
      src/modules/conversation-chat/dialog-item/DialogAnswer.vue
  83. 5 1
      src/modules/conversation-chat/dialog-item/DialogQuestion.vue
  84. 21 0
      src/modules/conversation-chat/use-file-select.js
  85. 17 0
      src/modules/conversation-chat/use-scroll-bottom.js
  86. 20 20
      src/modules/conversation-dialog/format-anwser-string.js
  87. 2 5
      src/modules/conversation-dialog/format-dialog-answer-for-loading.js
  88. 32 0
      src/modules/conversation-dialog/format-dialog-answer-from-history.js
  89. 15 4
      src/modules/conversation-dialog/format-dialog-answer-from-websocket_receive_message.js
  90. 0 29
      src/modules/conversation-dialog/format-dialog-chat-finished-message.js
  91. 0 8
      src/modules/conversation-dialog/format-dialog-history-item.js
  92. 0 17
      src/modules/conversation-dialog/format-dialog-history-messages.js
  93. 19 0
      src/modules/conversation-dialog/format-dialog-history.js
  94. 21 0
      src/modules/conversation-dialog/format-dialog-question-by-client.js
  95. 32 0
      src/modules/conversation-dialog/format-dialog-question-by-history.js
  96. 2 9
      src/modules/conversation-dialog/use-websocket-chat.js
  97. 34 0
      src/modules/file-upload/FileUploadBtn.vue
  98. 68 0
      src/modules/file-upload/FileUploadPreview.vue
  99. 0 0
      src/modules/file-upload/README.md
  100. 13 0
      src/utils/generate-client-unique-id.js

+ 1 - 1
dist/assets/About-CNObF9j1.js → dist/assets/About-0_4mn409.js

@@ -1 +1 @@
-import{_ as e,d as o,o as t}from"./index-CV-b1sqb.js";const c={};function n(r,a){return t(),o("div",null,"about")}const _=e(c,[["render",n]]);export{_ as default};
+import{_ as e,d as o,o as t}from"./index-CSqHrY5V.js";const c={};function n(r,a){return t(),o("div",null,"about")}const _=e(c,[["render",n]]);export{_ as default};

Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 0 - 0
dist/assets/Action-Dh_xwaUN.js


Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 0 - 0
dist/assets/Action-VeLFm1C_.js


+ 0 - 1
dist/assets/Agent-CaN-MG-w.js

@@ -1 +0,0 @@
-import{L as o}from"./LayoutExperience-Di0ppgmQ.js";import{C as r}from"./ContentContainer-BHCaXtzf.js";import{g as a,w as e,o as n,f as s,e as p}from"./index-CV-b1sqb.js";import"./Header-BJnGagkP.js";import"./Header.vue_vue_type_style_index_0_scoped_0b4b82f2_lang-CmyFc8-Z.js";import"./use-current-user-eSXbuPAj.js";/* empty css                                                                         */const x={__name:"Agent",setup(i){return(m,t)=>(n(),a(o,null,{default:e(()=>[s(r,null,{default:e(()=>t[0]||(t[0]=[p("div",{class:"agent"},"Agent",-1)])),_:1})]),_:1}))}};export{x as default};

+ 1 - 0
dist/assets/Agent-h7sFnnjs.js

@@ -0,0 +1 @@
+import{L as o}from"./LayoutExperience-CMFHTFFA.js";import{C as r}from"./ContentContainer-CJX9CKtt.js";import{g as a,w as e,o as n,f as s,e as p}from"./index-CSqHrY5V.js";import"./Header-EV6WKNRC.js";import"./Header.vue_vue_type_style_index_0_scoped_0b4b82f2_lang-CmyFc8-Z.js";import"./use-current-user-snSpV2ft.js";/* empty css                                                                         */const x={__name:"Agent",setup(i){return(m,t)=>(n(),a(o,null,{default:e(()=>[s(r,null,{default:e(()=>t[0]||(t[0]=[p("div",{class:"agent"},"Agent",-1)])),_:1})]),_:1}))}};export{x as default};

+ 1 - 1
dist/assets/BreadCrumbMenu-DhsppHDy.js → dist/assets/BreadCrumbMenu-B_hTgBrP.js

@@ -1 +1 @@
-import{_ as u,c as r,o as l,g as m,w as e,f as a,i as o,t as p}from"./index-CV-b1sqb.js";const b={__name:"BreadCrumbMenu",props:{current_label:String},setup(c){return(d,n)=>{const s=r("icon-apps"),t=r("a-breadcrumb-item"),_=r("a-breadcrumb");return l(),m(_,{class:"breadcrumb"},{default:e(()=>[a(t,null,{default:e(()=>[a(s)]),_:1}),a(t,null,{default:e(()=>n[0]||(n[0]=[o("权限管理")])),_:1}),a(t,null,{default:e(()=>[o(p(c.current_label),1)]),_:1})]),_:1})}}},f=u(b,[["__scopeId","data-v-e64b0b37"]]);export{f as B};
+import{_ as u,c as r,o as l,g as m,w as e,f as a,i as o,t as p}from"./index-CSqHrY5V.js";const b={__name:"BreadCrumbMenu",props:{current_label:String},setup(c){return(d,n)=>{const s=r("icon-apps"),t=r("a-breadcrumb-item"),_=r("a-breadcrumb");return l(),m(_,{class:"breadcrumb"},{default:e(()=>[a(t,null,{default:e(()=>[a(s)]),_:1}),a(t,null,{default:e(()=>n[0]||(n[0]=[o("权限管理")])),_:1}),a(t,null,{default:e(()=>[o(p(c.current_label),1)]),_:1})]),_:1})}}},f=u(b,[["__scopeId","data-v-e64b0b37"]]);export{f as B};

Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 0 - 0
dist/assets/CardItem-BMmuuHdU.js


Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 0 - 0
dist/assets/ChatAsideMenu-Ba1RpVeM.js


+ 0 - 1
dist/assets/ContentContainer-BHCaXtzf.js

@@ -1 +0,0 @@
-import{_ as n,o,d as a,l as r,p as s}from"./index-CV-b1sqb.js";const c={__name:"ContentContainer",props:{containerStyle:Object},setup(e){return(t,l)=>(o(),a("div",{class:"content-container",style:s(e.containerStyle)},[r(t.$slots,"default",{},void 0,!0)],4))}},_=n(c,[["__scopeId","data-v-15f5fc60"]]);export{_ as C};

+ 1 - 0
dist/assets/ContentContainer-CJX9CKtt.js

@@ -0,0 +1 @@
+import{_ as n,o,d as a,l as r,s}from"./index-CSqHrY5V.js";const c={__name:"ContentContainer",props:{containerStyle:Object},setup(e){return(t,l)=>(o(),a("div",{class:"content-container",style:s(e.containerStyle)},[r(t.$slots,"default",{},void 0,!0)],4))}},_=n(c,[["__scopeId","data-v-15f5fc60"]]);export{_ as C};

+ 1 - 1
dist/assets/Conversation-DB5d3Rk6.js → dist/assets/Conversation-DB2-IjXS.js

@@ -1 +1 @@
-import{L as r}from"./LayoutExperience-Di0ppgmQ.js";import{C as a}from"./ContentContainer-BHCaXtzf.js";import{C as s}from"./ChatAsideMenu-BvUkIqqv.js";import{g as n,o as i,w as o,f as e,e as m}from"./index-CV-b1sqb.js";import"./Header-BJnGagkP.js";import"./Header.vue_vue_type_style_index_0_scoped_0b4b82f2_lang-CmyFc8-Z.js";import"./use-current-user-eSXbuPAj.js";/* empty css                                                                         */import"./utils-nRFFHnCp.js";const k={__name:"Conversation",setup(p){return(l,t)=>(i(),n(r,null,{default:o(()=>[e(a,null,{default:o(()=>[e(s),t[0]||(t[0]=m("div",{class:"conversation"},"会话",-1))]),_:1})]),_:1}))}};export{k as default};
+import{L as r}from"./LayoutExperience-CMFHTFFA.js";import{C as a}from"./ContentContainer-CJX9CKtt.js";import{C as s}from"./ChatAsideMenu-Ba1RpVeM.js";import{g as n,o as i,w as o,f as e,e as m}from"./index-CSqHrY5V.js";import"./Header-EV6WKNRC.js";import"./Header.vue_vue_type_style_index_0_scoped_0b4b82f2_lang-CmyFc8-Z.js";import"./use-current-user-snSpV2ft.js";/* empty css                                                                         */import"./utils-nRFFHnCp.js";const k={__name:"Conversation",setup(p){return(l,t)=>(i(),n(r,null,{default:o(()=>[e(a,null,{default:o(()=>[e(s),t[0]||(t[0]=m("div",{class:"conversation"},"会话",-1))]),_:1})]),_:1}))}};export{k as default};

Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 0 - 0
dist/assets/ConversationBoard-BgPO_vVT.js


Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 0 - 0
dist/assets/ConversationHistory-CCJzmL-m.js


Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 0 - 0
dist/assets/ConversationQA-BqdQCLBN.js


Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 0 - 0
dist/assets/ConversationQA-D-k21gUf.css


Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 0 - 0
dist/assets/ConversationQA-Dkt1Yl5i.css


Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 0 - 0
dist/assets/ConversationQA-M5wqc5rk.js


Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 0 - 0
dist/assets/Header-BJnGagkP.js


Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 0 - 0
dist/assets/Header-EV6WKNRC.js


Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 0 - 0
dist/assets/Intelligent-DccD9ar3.js


Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 0 - 0
dist/assets/Knowledge-DULLtUIJ.js


Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 0 - 0
dist/assets/Knowledge-b1L_xP6f.js


Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 0 - 0
dist/assets/KnowledgeDetail-CGoEBgCR.js


+ 0 - 1
dist/assets/KnowledgeDetail-D-Wwg7jt.css

@@ -1 +0,0 @@
-.breadcrumb[data-v-8b4206c8]{margin-bottom:16px}

Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 0 - 0
dist/assets/KnowledgeDetail-DOUFNcvw.css


+ 0 - 1
dist/assets/KnowledgeDetail-gfDzy0tu.js

@@ -1 +0,0 @@
-import{_ as m,c as a,o as _,g as d,w as t,f as e,i as u,t as f,d as b,y as g,j as i}from"./index-CV-b1sqb.js";import{L as x}from"./LayoutExperience-Di0ppgmQ.js";import{C}from"./ContentContainer-BHCaXtzf.js";import"./Header-BJnGagkP.js";import"./Header.vue_vue_type_style_index_0_scoped_0b4b82f2_lang-CmyFc8-Z.js";import"./use-current-user-eSXbuPAj.js";/* empty css                                                                         */const k={__name:"TopBreadCrumb",props:{current_label:String},setup(c){return(s,r)=>{const n=a("icon-apps"),o=a("a-breadcrumb-item"),l=a("router-link"),p=a("a-breadcrumb");return _(),d(p,{class:"breadcrumb"},{default:t(()=>[e(o,null,{default:t(()=>[e(n)]),_:1}),e(o,null,{default:t(()=>[e(l,{to:"/knowledge"},{default:t(()=>r[0]||(r[0]=[u("知识库管理")])),_:1})]),_:1}),e(o,null,{default:t(()=>[u(f(c.current_label),1)]),_:1})]),_:1})}}},B=m(k,[["__scopeId","data-v-8b4206c8"]]),w={},y={class:"message-detail"};function h(c,s){return _(),b("div",y,"知识库详情")}const v=m(w,[["render",h]]),$={__name:"KnowledgeDetail",setup(c){const s=g(),{id:r,name:n}=s.query;return console.log(r,n),(o,l)=>(_(),d(x,null,{default:t(()=>[e(C,null,{default:t(()=>[e(B,{current_label:i(n)},null,8,["current_label"]),e(v,{id:i(r)},null,8,["id"])]),_:1})]),_:1}))}};export{$ as default};

+ 1 - 1
dist/assets/LayoutExperience-Di0ppgmQ.js → dist/assets/LayoutExperience-CMFHTFFA.js

@@ -1 +1 @@
-import{H as o}from"./Header-BJnGagkP.js";/* empty css                                                                         */import{_ as t,o as r,d as a,f as s,l as c}from"./index-CV-b1sqb.js";const n={class:"layout-expierience"},_={__name:"LayoutExperience",setup(p){return(e,d)=>(r(),a("div",n,[s(o),c(e.$slots,"default",{},void 0,!0)]))}},m=t(_,[["__scopeId","data-v-d5330c8b"]]);export{m as L};
+import{H as o}from"./Header-EV6WKNRC.js";/* empty css                                                                         */import{_ as t,o as r,d as a,f as s,l as c}from"./index-CSqHrY5V.js";const n={class:"layout-expierience"},_={__name:"LayoutExperience",setup(p){return(e,d)=>(r(),a("div",n,[s(o),c(e.$slots,"default",{},void 0,!0)]))}},m=t(_,[["__scopeId","data-v-d5330c8b"]]);export{m as L};

+ 1 - 1
dist/assets/LayoutPermission-DGwU0qfS.js → dist/assets/LayoutPermission-CNHpQmOR.js

@@ -1 +1 @@
-import{H as t}from"./Header-BJnGagkP.js";import{_ as s,d as r,f as o,c as a,o as c}from"./index-CV-b1sqb.js";import"./Header.vue_vue_type_style_index_0_scoped_0b4b82f2_lang-CmyFc8-Z.js";import"./use-current-user-eSXbuPAj.js";const _={class:"layout-permission"},n={__name:"LayoutPermission",setup(i){return(m,p)=>{const e=a("router-view");return c(),r("div",_,[o(t),o(e)])}}},v=s(n,[["__scopeId","data-v-11c5428e"]]);export{v as default};
+import{H as t}from"./Header-EV6WKNRC.js";import{_ as s,d as r,f as o,c as a,o as c}from"./index-CSqHrY5V.js";import"./Header.vue_vue_type_style_index_0_scoped_0b4b82f2_lang-CmyFc8-Z.js";import"./use-current-user-snSpV2ft.js";const _={class:"layout-permission"},n={__name:"LayoutPermission",setup(i){return(m,p)=>{const e=a("router-view");return c(),r("div",_,[o(t),o(e)])}}},v=s(n,[["__scopeId","data-v-11c5428e"]]);export{v as default};

Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 0 - 0
dist/assets/Login-rBg_rNVN.js


Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 0 - 0
dist/assets/Model-ByV4wKi0.js


Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 0 - 0
dist/assets/Model-XbZauoqo.js


Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 0 - 0
dist/assets/PermissionAccount-DZhva8ir.js


Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 0 - 0
dist/assets/PermissionAccount-DlJVT4KS.js


Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 0 - 0
dist/assets/PermissionGroup-CnybK5Ri.js


Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 0 - 0
dist/assets/PermissionGroup-sOE28ckl.js


Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 0 - 0
dist/assets/PermissionOrganization-CrQo3ose.js


Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 0 - 0
dist/assets/PermissionOrganization-Dmv63NTr.js


+ 1 - 1
dist/assets/PermissionResource-CDShEfkI.js → dist/assets/PermissionResource-D-GO84cn.js

@@ -1 +1 @@
-import{C as r}from"./ContentContainer-BHCaXtzf.js";import{B as o}from"./BreadCrumbMenu-DhsppHDy.js";import{g as s,w as t,o as a,f as n,e as i}from"./index-CV-b1sqb.js";const _={__name:"PermissionResource",setup(m){return(u,e)=>(a(),s(r,null,{default:t(()=>[n(o,{current_label:"资源"}),e[0]||(e[0]=i("div",{class:"permission-resource"},"权限管理: 资源",-1))]),_:1}))}};export{_ as default};
+import{C as r}from"./ContentContainer-CJX9CKtt.js";import{B as o}from"./BreadCrumbMenu-B_hTgBrP.js";import{g as s,w as t,o as a,f as n,e as i}from"./index-CSqHrY5V.js";const _={__name:"PermissionResource",setup(m){return(u,e)=>(a(),s(r,null,{default:t(()=>[n(o,{current_label:"资源"}),e[0]||(e[0]=i("div",{class:"permission-resource"},"权限管理: 资源",-1))]),_:1}))}};export{_ as default};

Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 0 - 0
dist/assets/PermissionRole-BtCNHZLr.js


Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 0 - 0
dist/assets/PermissionRole-eNq1Mdy5.js


+ 0 - 1
dist/assets/Profiles-D9xyrjtb.js

@@ -1 +0,0 @@
-import{L as o}from"./LayoutExperience-Di0ppgmQ.js";import{C as r}from"./ContentContainer-BHCaXtzf.js";import{g as a,w as t,o as s,f as i,e as p}from"./index-CV-b1sqb.js";import"./Header-BJnGagkP.js";import"./Header.vue_vue_type_style_index_0_scoped_0b4b82f2_lang-CmyFc8-Z.js";import"./use-current-user-eSXbuPAj.js";/* empty css                                                                         */const C={__name:"Profiles",setup(n){return(l,e)=>(s(),a(o,null,{default:t(()=>[i(r,null,{default:t(()=>e[0]||(e[0]=[p("div",{class:"profile"},"用户中心",-1)])),_:1})]),_:1}))}};export{C as default};

+ 1 - 0
dist/assets/Profiles-XHtNipP0.js

@@ -0,0 +1 @@
+import{L as o}from"./LayoutExperience-CMFHTFFA.js";import{C as r}from"./ContentContainer-CJX9CKtt.js";import{g as a,w as t,o as s,f as i,e as p}from"./index-CSqHrY5V.js";import"./Header-EV6WKNRC.js";import"./Header.vue_vue_type_style_index_0_scoped_0b4b82f2_lang-CmyFc8-Z.js";import"./use-current-user-snSpV2ft.js";/* empty css                                                                         */const C={__name:"Profiles",setup(n){return(l,e)=>(s(),a(o,null,{default:t(()=>[i(r,null,{default:t(()=>e[0]||(e[0]=[p("div",{class:"profile"},"用户中心",-1)])),_:1})]),_:1}))}};export{C as default};

+ 1 - 1
dist/assets/Register-DlHDD1Rc.js → dist/assets/Register-DtOMFRAZ.js

@@ -1 +1 @@
-import{_ as e,d as c,o as r}from"./index-CV-b1sqb.js";const t={};function n(o,s){return r(),c("div",null,"注册")}const a=e(t,[["render",n]]);export{a as default};
+import{_ as e,d as c,o as r}from"./index-CSqHrY5V.js";const t={};function n(o,s){return r(),c("div",null,"注册")}const a=e(t,[["render",n]]);export{a as default};

+ 1 - 0
dist/assets/Settings-AXoo_5m7.js

@@ -0,0 +1 @@
+import{L as o}from"./LayoutExperience-CMFHTFFA.js";import{C as r}from"./ContentContainer-CJX9CKtt.js";import{g as a,w as e,o as s,f as n,e as i}from"./index-CSqHrY5V.js";import"./Header-EV6WKNRC.js";import"./Header.vue_vue_type_style_index_0_scoped_0b4b82f2_lang-CmyFc8-Z.js";import"./use-current-user-snSpV2ft.js";/* empty css                                                                         */const C={__name:"Settings",setup(p){return(m,t)=>(s(),a(o,null,{default:e(()=>[n(r,null,{default:e(()=>t[0]||(t[0]=[i("div",{class:"settings"},"设置",-1)])),_:1})]),_:1}))}};export{C as default};

+ 0 - 1
dist/assets/Settings-BA1t7Nga.js

@@ -1 +0,0 @@
-import{L as o}from"./LayoutExperience-Di0ppgmQ.js";import{C as r}from"./ContentContainer-BHCaXtzf.js";import{g as a,w as e,o as s,f as n,e as i}from"./index-CV-b1sqb.js";import"./Header-BJnGagkP.js";import"./Header.vue_vue_type_style_index_0_scoped_0b4b82f2_lang-CmyFc8-Z.js";import"./use-current-user-eSXbuPAj.js";/* empty css                                                                         */const C={__name:"Settings",setup(p){return(m,t)=>(s(),a(o,null,{default:e(()=>[n(r,null,{default:e(()=>t[0]||(t[0]=[i("div",{class:"settings"},"设置",-1)])),_:1})]),_:1}))}};export{C as default};

+ 3 - 3
dist/assets/Xiaoshu-BtjxCVXM.js → dist/assets/Xiaoshu-618H8DaN.js

@@ -1,4 +1,4 @@
-import{r,q as g,g as a,w as k,u as y,a2 as i,o as n,d as v,h as c,j as u,F as C,a3 as w}from"./index-CV-b1sqb.js";import"./Header.vue_vue_type_style_index_0_scoped_0b4b82f2_lang-CmyFc8-Z.js";import{u as S}from"./use-current-user-eSXbuPAj.js";/* empty css                                                                         */import{C as A}from"./ContentContainer-BHCaXtzf.js";const N={__name:"Xiaoshu",props:{},setup(l){const d=y(),{bus:p}=i,m=l,e=r(!1),s=r([]),f=w("XIAOSHU_URL"),h={padding:0};return g(()=>{const t=S(),o=t.token,_={userName:t.username,token:o},x=`
+import{r as a,y as g,g as r,w as k,u as y,aa as i,o as n,d as v,h as c,j as u,F as C,ab as w}from"./index-CSqHrY5V.js";import"./Header.vue_vue_type_style_index_0_scoped_0b4b82f2_lang-CmyFc8-Z.js";import{u as S}from"./use-current-user-snSpV2ft.js";/* empty css                                                                         */import{C as A}from"./ContentContainer-CJX9CKtt.js";const N={__name:"Xiaoshu",props:{},setup(l){const d=y(),{bus:p}=i,m=l,e=a(!1),s=a([]),f=w("XIAOSHU_URL"),h={padding:0};return g(()=>{const t=S(),o=t.token,_={userName:t.username,token:o},b=`
     localStorage.setItem('xintongxiaoshu', '${JSON.stringify(_)}');
 
     const box = document.querySelector('.xiaoshu-aside-left-menus-container');
@@ -13,7 +13,7 @@ import{r,q as g,g as a,w as k,u as y,a2 as i,o as n,d as v,h as c,j as u,F as C,
         window.$wujie?.bus.$emit("xiaoshuAsideBack");
       });
     }
-  `,b=`
+  `,x=`
     .xiaoshu-aside-left-back-btn{
       width: 100%;
       height: 40px;
@@ -24,4 +24,4 @@ import{r,q as g,g as a,w as k,u as y,a2 as i,o as n,d as v,h as c,j as u,F as C,
       display: inline-block;
       cursor: pointer;
     }
-  `;p.$on("xiaoshuAsideBack",function(){d.back()}),s.value=[{jsAfterLoaders:[{content:x}]},{cssAfterLoaders:[{content:b}]}],e.value=!0}),(t,o)=>(n(),a(A,{containerStyle:h},{default:k(()=>[e.value?c("",!0):(n(),v(C,{key:0},[],64)),e.value?(n(),a(u(i),{key:1,width:"100%",height:"100%",name:"xiaoshu",url:u(f),sync:!1,props:m,plugins:s.value},null,8,["url","props","plugins"])):c("",!0)]),_:1}))}};export{N as default};
+  `;p.$on("xiaoshuAsideBack",function(){d.back()}),s.value=[{jsAfterLoaders:[{content:b}]},{cssAfterLoaders:[{content:x}]}],e.value=!0}),(t,o)=>(n(),r(A,{containerStyle:h},{default:k(()=>[e.value?c("",!0):(n(),v(C,{key:0},[],64)),e.value?(n(),r(u(i),{key:1,width:"100%",height:"100%",name:"xiaoshu",url:u(f),sync:!1,props:m,plugins:s.value},null,8,["url","props","plugins"])):c("",!0)]),_:1}))}};export{N as default};

+ 1 - 1
dist/assets/api-conversation-board-CoOIXlU8.js → dist/assets/api-conversation-board-BFqUe5Q2.js

@@ -1 +1 @@
-import{x as o}from"./index-CV-b1sqb.js";const p={code:200,msg:"",data:[{id:"94873c72-d194-4306-a965-286affe426bf",name:"报告生成",agent_type:2,type:"report"},{id:"basic_excel_merge",name:"报表合并",agent_type:3,type:"excelMerge"},{id:"42e4fcdc9bea11efac300242ac160006",name:"知识问答",agent_type:1,type:"knowledgeQA"},{id:"c684bab4-f05b-423e-8727-f50497e73ebf",name:"文档智能",agent_type:2,type:"report"},{id:"90d533729c0211efbf6b0242ac160006",name:"智能问答",agent_type:1,type:"chat"},{id:"basic_excel_talk",name:"智能数据",agent_type:3,type:"excelTalk"},{id:"basic_question_talk",name:"出题组卷",agent_type:3,type:"questionTalk"},{id:"9d75142a-66eb-4e23-b7d4-03efe4584915",name:"小数绘图",agent_type:4,type:"imageTalk"},{id:"basic_paper_talk",name:"文档出卷",agent_type:3,type:"paperTalk"},{id:"basic_report_clean",name:"文档报告",agent_type:4,type:"reportWorkflow"}]},s=a=>new Promise((t,n)=>{setTimeout(()=>{t(p)},1e3)}),d=a=>{const t="/api/label/list",n={};return"search"in a&&a.search&&(n.keyword=a.search),new Promise((c,i)=>{o({url:t,method:"get",params:n}).then(e=>{e.code/1===200?c({code:e.code,data:e.data.rows,msg:e.msg}):c(e)}).catch(i)})};export{d as a,s as c};
+import{x as o}from"./index-CSqHrY5V.js";const p={code:200,msg:"",data:[{id:"94873c72-d194-4306-a965-286affe426bf",name:"报告生成",agent_type:2,type:"report"},{id:"basic_excel_merge",name:"报表合并",agent_type:3,type:"excelMerge"},{id:"42e4fcdc9bea11efac300242ac160006",name:"知识问答",agent_type:1,type:"knowledgeQA"},{id:"c684bab4-f05b-423e-8727-f50497e73ebf",name:"文档智能",agent_type:2,type:"report"},{id:"90d533729c0211efbf6b0242ac160006",name:"智能问答",agent_type:1,type:"chat"},{id:"basic_excel_talk",name:"智能数据",agent_type:3,type:"excelTalk"},{id:"basic_question_talk",name:"出题组卷",agent_type:3,type:"questionTalk"},{id:"9d75142a-66eb-4e23-b7d4-03efe4584915",name:"小数绘图",agent_type:4,type:"imageTalk"},{id:"basic_paper_talk",name:"文档出卷",agent_type:3,type:"paperTalk"},{id:"basic_report_clean",name:"文档报告",agent_type:4,type:"reportWorkflow"}]},s=a=>new Promise((t,n)=>{setTimeout(()=>{t(p)},1e3)}),d=a=>{const t="/api/label/list",n={};return"search"in a&&a.search&&(n.keyword=a.search),new Promise((c,i)=>{o({url:t,method:"get",params:n}).then(e=>{e.code/1===200?c({code:e.code,data:e.data.rows,msg:e.msg}):c(e)}).catch(i)})};export{d as a,s as c};

Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 0 - 0
dist/assets/common-CgahEqA5.js


+ 1 - 0
dist/assets/common-CnTRIzmN.js

@@ -0,0 +1 @@
+import{a2 as g,c as f,o as _,g as k,w as v,l as b,j as l,$ as h,x as t}from"./index-CSqHrY5V.js";const y={__name:"Modal",props:{visible:Boolean,title:{type:String,required:!0,default:"标题"}},emits:["ok","cancel"],setup(e,{emit:n}){const r=e,o=n,{visible:a,title:i}=g(r),u=()=>{o("ok")},c=()=>{o("cancel")};return(p,s)=>{const m=f("a-modal");return _(),k(m,{visible:l(a),"onUpdate:visible":s[0]||(s[0]=d=>h(a)?a.value=d:null),title:l(i),onOk:u,onCancel:c,width:"40%"},{default:v(()=>[b(p.$slots,"default")]),_:3},8,["visible","title"])}}};function Q(){return t({url:"/api/role/list",method:"get",params:{current:1,pageSize:999}})}function S(){return t({url:"/api/dept/list",method:"get"})}function x(){return t({url:"/api/knowledge/list",method:"get",params:{current:1,pageSize:999}})}function C(){return t({url:"/api/dialog/list",method:"get",params:{current:1,pageSize:999}})}export{Q,y as _,S as a,x as b,C as c};

Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 0 - 0
dist/assets/common-De0VX7go.js


+ 0 - 1
dist/assets/common-DwtO0d57.js

@@ -1 +0,0 @@
-import{U as g,c as f,o as _,g as k,w as v,l as b,j as l,N as h,x as t}from"./index-CV-b1sqb.js";const y={__name:"Modal",props:{visible:Boolean,title:{type:String,required:!0,default:"标题"}},emits:["ok","cancel"],setup(e,{emit:n}){const r=e,o=n,{visible:a,title:i}=g(r),u=()=>{o("ok")},c=()=>{o("cancel")};return(p,s)=>{const m=f("a-modal");return _(),k(m,{visible:l(a),"onUpdate:visible":s[0]||(s[0]=d=>h(a)?a.value=d:null),title:l(i),onOk:u,onCancel:c,width:"40%"},{default:v(()=>[b(p.$slots,"default")]),_:3},8,["visible","title"])}}};function Q(){return t({url:"/api/role/list",method:"get",params:{current:1,pageSize:999}})}function S(){return t({url:"/api/dept/list",method:"get"})}function x(){return t({url:"/api/knowledge/list",method:"get",params:{current:1,pageSize:999}})}function C(){return t({url:"/api/dialog/list",method:"get",params:{current:1,pageSize:999}})}export{Q,y as _,S as a,x as b,C as c};

+ 1 - 0
dist/assets/difyDetail-B74V7FrB.css

@@ -0,0 +1 @@
+.breadcrumb[data-v-50c22a10]{height:40px}.body-container[data-v-2540a833]{position:relative;margin-top:15px;height:calc(100% - 55px)}.arco-spin[data-v-2540a833]{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%)}

+ 0 - 2
dist/assets/difyDetail-Byb6J_hP.js

@@ -1,2 +0,0 @@
-import{_ as m,c as i,o as _,g as f,w as a,f as t,i as d,t as y,r as u,q as b,d as g,e as w,y as k,j as p}from"./index-CV-b1sqb.js";import{L as v}from"./LayoutExperience-Di0ppgmQ.js";import{C as x}from"./ContentContainer-BHCaXtzf.js";import{t as B}from"./use-current-user-eSXbuPAj.js";import"./Header-BJnGagkP.js";import"./Header.vue_vue_type_style_index_0_scoped_0b4b82f2_lang-CmyFc8-Z.js";/* empty css                                                                         */const S={__name:"TopSetting",props:{current_label:String},setup(c){return(l,n)=>{const s=i("icon-apps"),r=i("a-breadcrumb-item"),o=i("router-link"),e=i("a-breadcrumb");return _(),f(e,{class:"breadcrumb"},{default:a(()=>[t(r,null,{default:a(()=>[t(s)]),_:1}),t(r,null,{default:a(()=>[t(o,{to:"/intelligent"},{default:a(()=>n[0]||(n[0]=[d("智能体")])),_:1})]),_:1}),t(r,null,{default:a(()=>[d(y(c.current_label),1)]),_:1})]),_:1})}}},h=m(S,[["__scopeId","data-v-50c22a10"]]),E={class:"body-container"},L=["src"],R={__name:"MessageBody",props:{id:{type:String,required:!0}},setup(c){const l=c,n=u(""),s=window.RGFLOW_BASE_URL,r=async()=>{const e=await B();e.code==200&&(n.value=e.data.dify_token)},o=u("");return b(async()=>{await r(),o.value=s+"/app/"+l.id+`/workflow?token=${n.value}`,console.log("defaultURL",o.value);const e=document.getElementById("dify");e.onload=function(){e&&e.contentWindow&&(console.log("iframe loaded",e.contentWindow),e.contentWindow.postMessage(JSON.stringify({type:"insertStyle",value:`
-            .sticky{display:none;}`}),o.value))}}),(e,N)=>(_(),g("div",E,[w("iframe",{id:"dify",src:o.value,width:"100%",height:"100%",frameborder:"0"},null,8,L)]))}},C=m(R,[["__scopeId","data-v-e0cdeb71"]]),O={__name:"difyDetail",setup(c){const l=k(),{id:n,name:s}=l.query;return(r,o)=>(_(),f(v,null,{default:a(()=>[t(x,null,{default:a(()=>[t(h,{current_label:p(s)},null,8,["current_label"]),t(C,{id:p(n)},null,8,["id"])]),_:1})]),_:1}))}};export{O as default};

+ 2 - 0
dist/assets/difyDetail-CT7ZC2lQ.js

@@ -0,0 +1,2 @@
+import{_ as f,c,o as _,g as d,w as o,f as t,i as p,t as b,r as u,v as g,y as k,d as v,e as w,h as B,B as h,j as m}from"./index-CSqHrY5V.js";import{L as S}from"./LayoutExperience-CMFHTFFA.js";import{C as x}from"./ContentContainer-CJX9CKtt.js";import"./Header-EV6WKNRC.js";import"./Header.vue_vue_type_style_index_0_scoped_0b4b82f2_lang-CmyFc8-Z.js";import"./use-current-user-snSpV2ft.js";/* empty css                                                                         */const C={__name:"TopSetting",props:{current_label:String},setup(i){return(l,n)=>{const s=c("icon-apps"),a=c("a-breadcrumb-item"),r=c("router-link"),e=c("a-breadcrumb");return _(),d(e,{class:"breadcrumb"},{default:o(()=>[t(a,null,{default:o(()=>[t(s)]),_:1}),t(a,null,{default:o(()=>[t(r,{to:"/intelligent"},{default:o(()=>n[0]||(n[0]=[p("智能体")])),_:1})]),_:1}),t(a,null,{default:o(()=>[p(b(i.current_label),1)]),_:1})]),_:1})}}},E=f(C,[["__scopeId","data-v-50c22a10"]]),L={class:"body-container"},N=["src"],I={__name:"MessageBody",props:{id:{type:String,required:!0}},setup(i){const l=i,n=u(!0);u("");const s=window.DIFY_BASE_URL,a=g.get(),r=u("");return k(async()=>{r.value=s+"/app/"+l.id+`/workflow?token=${a}`;const e=document.getElementById("dify");e.onload=function(){e&&e.contentWindow&&(console.log("iframe loaded",e.contentWindow),e.contentWindow.postMessage(JSON.stringify({type:"insertStyle",value:`
+            .sticky{display:none;}`}),r.value)),n.value=!1}}),(e,R)=>{const y=c("a-spin");return _(),v("div",L,[w("iframe",{id:"dify",src:r.value,width:"100%",height:"100%",frameborder:"0"},null,8,N),n.value?(_(),d(y,{key:0,dot:""})):B("",!0)])}}},M=f(I,[["__scopeId","data-v-2540a833"]]),q={__name:"difyDetail",setup(i){const l=h(),{id:n,name:s}=l.query;return(a,r)=>(_(),d(S,null,{default:o(()=>[t(x,null,{default:o(()=>[t(E,{current_label:m(s)},null,8,["current_label"]),t(M,{id:m(n)},null,8,["id"])]),_:1})]),_:1}))}};export{q as default};

+ 0 - 1
dist/assets/difyDetail-DBZmuZRU.css

@@ -1 +0,0 @@
-.breadcrumb[data-v-50c22a10]{height:40px}.body-container[data-v-e0cdeb71]{margin-top:15px;height:calc(100% - 55px)}

Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 0 - 0
dist/assets/index-CSqHrY5V.js


Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 0 - 0
dist/assets/index-Q_8H4hiR.css


Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 0 - 0
dist/assets/index-VA7QPrnA.css


Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 0 - 0
dist/assets/rgflow-dify-BHR_3Je4.js


BIN
dist/assets/step1-vQjBW3d2.png


BIN
dist/assets/step2-BNwS3ZaL.png


+ 1 - 1
dist/assets/use-all-agents-XeaNTQ9D.js → dist/assets/use-all-agents-CF3vx0As.js

@@ -1 +1 @@
-import{H as l,I as e}from"./index-CV-b1sqb.js";import{a as n,j as r}from"./utils-nRFFHnCp.js";function a(s){const t=r(s);e.setItem(t)}function i(){const s=e.getItem(),t=n(s);return t===null?[]:t}const u=l("all_agents",{state:()=>({agents:[]}),actions:{getList(){if(this.agents.length===0){const t=i();return this.agents=t,this.agents}return this.agents},setList(s){const t=n(r(s));this.agents=t,a(t)}}});export{u};
+import{J as l,K as e}from"./index-CSqHrY5V.js";import{a as n,j as r}from"./utils-nRFFHnCp.js";function a(s){const t=r(s);e.setItem(t)}function i(){const s=e.getItem(),t=n(s);return t===null?[]:t}const u=l("all_agents",{state:()=>({agents:[]}),actions:{getList(){if(this.agents.length===0){const t=i();return this.agents=t,this.agents}return this.agents},setList(s){const t=n(r(s));this.agents=t,a(t)}}});export{u};

+ 0 - 1
dist/assets/use-current-user-eSXbuPAj.js

@@ -1 +0,0 @@
-import{x as n,H as u,v as s}from"./index-CV-b1sqb.js";function c(t){return n({url:"/api/auth/v2/login",method:"post",data:t})}function d(t){return n({url:"/api/auth/v2/register",method:"post",data:t})}function p(t){return n({url:`/api/auth/v2/sync?userFlag=${t}`,method:"get"})}function h(){return n({url:"/api/user/user_info",method:"get"})}function g(){return n({url:"/api/auth/token",method:"get"})}const k=u("current_user",{state:()=>({name:"Jack",token_type:"",token:s.get(),username:"",nickname:"",dept:[],roles:[],permissions:[],user:{}}),actions:{updateName(t){this.name=t},toLogin(t){const{username:o,password:r}=t;return new Promise((i,a)=>{c({username:o,password:r}).then(e=>{e.code==200&&e.data.access_token.length?(this.token=e.data.access_token,this.token_type=e.data.token_type,this.username=e.data.username,this.nickname=e.data.nickname,s.set(e.data.access_token),i(e.msg),this.getInfo()):a(e.msg)}).catch(e=>{a(e)})})},async getInfo(){try{const t=await h();if(t.code===200)return this.dept=t.data.dept,this.roles=t.roles||["ROLE_DEFAULT"],this.permissions=t.permissions,t.msg;throw new Error(t.msg)}catch(t){throw t}}}});export{p as a,d as r,g as t,k as u};

+ 1 - 0
dist/assets/use-current-user-snSpV2ft.js

@@ -0,0 +1 @@
+import{x as s,J as u,v as n}from"./index-CSqHrY5V.js";function c(t){return s({url:"/api/auth/v2/login",method:"post",data:t})}function p(t){return s({url:"/api/auth/v2/register",method:"post",data:t})}function d(t){return s({url:`/api/auth/v2/sync?userFlag=${t}`,method:"get"})}function m(){return s({url:"/api/user/user_info",method:"get"})}const g=u("current_user",{persist:{enabled:!0,strategies:[{key:"info",storage:localStorage,paths:["username"]}]},state:()=>({name:"Jack",token_type:"",token:n.get(),username:"",nickname:"",dept:[],roles:[],permissions:[],user:{}}),actions:{updateName(t){this.name=t},toLogin(t){const{username:r,password:o}=t;return new Promise((i,a)=>{c({username:r,password:o}).then(e=>{e.code==200&&e.data.access_token.length?(this.token=e.data.access_token,this.token_type=e.data.token_type,this.username=e.data.username,this.nickname=e.data.nickname,n.set(e.data.access_token),i(e.msg),this.getInfo()):a(e.msg)}).catch(e=>{a(e)})})},async getInfo(){try{const t=await m();if(t.code===200)return this.dept=t.data.dept,this.roles=t.roles||["ROLE_DEFAULT"],this.permissions=t.permissions,t.msg;throw new Error(t.msg)}catch(t){throw t}}}});export{d as a,p as r,g as u};

BIN
dist/font/PingFang-SC-Bold.ttf


BIN
dist/font/PingFang-SC-Light.ttf


BIN
dist/font/PingFang-SC-Regular.ttf


+ 2 - 2
dist/index.html

@@ -6,8 +6,8 @@
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
     <title>大模型2.0</title>
     <script type="module" src="/config.js"></script>
-    <script type="module" crossorigin src="/assets/index-CV-b1sqb.js"></script>
-    <link rel="stylesheet" crossorigin href="/assets/index-Q_8H4hiR.css">
+    <script type="module" crossorigin src="/assets/index-CSqHrY5V.js"></script>
+    <link rel="stylesheet" crossorigin href="/assets/index-VA7QPrnA.css">
   </head>
   <body>
     <div id="app"></div>

+ 66 - 0
package-lock.json

@@ -11,9 +11,11 @@
       "dependencies": {
         "@arco-design/web-vue": "2.56.3",
         "axios": "1.7.8",
+        "clipboard": "2.0.11",
         "dayjs": "1.11.13",
         "highlight.js": "11.10.0",
         "js-cookie": "3.0.5",
+        "md5": "2.3.0",
         "mitt": "3.0.1",
         "pinia": "2.2.8",
         "pinia-plugin-persist": "1.0.0",
@@ -1975,6 +1977,24 @@
         "url": "https://github.com/sponsors/wooorm"
       }
     },
+    "node_modules/charenc": {
+      "version": "0.0.2",
+      "resolved": "https://registry.npmmirror.com/charenc/-/charenc-0.0.2.tgz",
+      "integrity": "sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA==",
+      "engines": {
+        "node": "*"
+      }
+    },
+    "node_modules/clipboard": {
+      "version": "2.0.11",
+      "resolved": "https://registry.npmmirror.com/clipboard/-/clipboard-2.0.11.tgz",
+      "integrity": "sha512-C+0bbOqkezLIsmWSvlsXS0Q0bmkugu7jcfMIACB+RDEntIzQIkdr148we28AfSloQLRdZlYL/QYyrq05j/3Faw==",
+      "dependencies": {
+        "good-listener": "^1.2.2",
+        "select": "^1.1.2",
+        "tiny-emitter": "^2.0.0"
+      }
+    },
     "node_modules/color": {
       "version": "3.2.1",
       "resolved": "https://registry.npmmirror.com/color/-/color-3.2.1.tgz",
@@ -2073,6 +2093,14 @@
         "node": ">= 8"
       }
     },
+    "node_modules/crypt": {
+      "version": "0.0.2",
+      "resolved": "https://registry.npmmirror.com/crypt/-/crypt-0.0.2.tgz",
+      "integrity": "sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow==",
+      "engines": {
+        "node": "*"
+      }
+    },
     "node_modules/cssesc": {
       "version": "3.0.0",
       "resolved": "https://registry.npmmirror.com/cssesc/-/cssesc-3.0.0.tgz",
@@ -2166,6 +2194,11 @@
         "node": ">=0.4.0"
       }
     },
+    "node_modules/delegate": {
+      "version": "3.2.0",
+      "resolved": "https://registry.npmmirror.com/delegate/-/delegate-3.2.0.tgz",
+      "integrity": "sha512-IofjkYBZaZivn0V8nnsMJGBr4jVLxHDheKSW88PyxS5QC4Vo9ZbZVvhzlSxY87fVq3STR6r+4cGepyHkcWOQSw=="
+    },
     "node_modules/dequal": {
       "version": "2.0.3",
       "resolved": "https://registry.npmmirror.com/dequal/-/dequal-2.0.3.tgz",
@@ -2677,6 +2710,14 @@
         "url": "https://github.com/sponsors/sindresorhus"
       }
     },
+    "node_modules/good-listener": {
+      "version": "1.2.2",
+      "resolved": "https://registry.npmmirror.com/good-listener/-/good-listener-1.2.2.tgz",
+      "integrity": "sha512-goW1b+d9q/HIwbVYZzZ6SsTr4IgE+WA44A0GmPIQstuOrgsFcT7VEJ48nmr9GaRtNu0XTKacFLGnBPAM6Afouw==",
+      "dependencies": {
+        "delegate": "^3.1.2"
+      }
+    },
     "node_modules/graceful-fs": {
       "version": "4.2.11",
       "resolved": "https://registry.npmmirror.com/graceful-fs/-/graceful-fs-4.2.11.tgz",
@@ -2812,6 +2853,11 @@
       "resolved": "https://registry.npmmirror.com/is-arrayish/-/is-arrayish-0.3.2.tgz",
       "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ=="
     },
+    "node_modules/is-buffer": {
+      "version": "1.1.6",
+      "resolved": "https://registry.npmmirror.com/is-buffer/-/is-buffer-1.1.6.tgz",
+      "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w=="
+    },
     "node_modules/is-docker": {
       "version": "3.0.0",
       "resolved": "https://registry.npmmirror.com/is-docker/-/is-docker-3.0.0.tgz",
@@ -3105,6 +3151,16 @@
         "node": ">= 18"
       }
     },
+    "node_modules/md5": {
+      "version": "2.3.0",
+      "resolved": "https://registry.npmmirror.com/md5/-/md5-2.3.0.tgz",
+      "integrity": "sha512-T1GITYmFaKuO91vxyoQMFETst+O71VUPEU3ze5GNzDm0OWdP8v1ziTaAEPUr/3kLsY3Sftgz242A1SetQiDL7g==",
+      "dependencies": {
+        "charenc": "0.0.2",
+        "crypt": "0.0.2",
+        "is-buffer": "~1.1.6"
+      }
+    },
     "node_modules/mdast-util-to-hast": {
       "version": "13.2.0",
       "resolved": "https://registry.npmmirror.com/mdast-util-to-hast/-/mdast-util-to-hast-13.2.0.tgz",
@@ -3808,6 +3864,11 @@
       "dev": true,
       "peer": true
     },
+    "node_modules/select": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmmirror.com/select/-/select-1.1.2.tgz",
+      "integrity": "sha512-OwpTSOfy6xSs1+pwcNrv0RBMOzI39Lp3qQKUTPVVPRjCdNa5JH/oPRiqsesIskK8TVgmRiHwO4KXlV2Li9dANA=="
+    },
     "node_modules/semver": {
       "version": "7.6.3",
       "resolved": "https://registry.npmmirror.com/semver/-/semver-7.6.3.tgz",
@@ -3990,6 +4051,11 @@
       "integrity": "sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==",
       "dev": true
     },
+    "node_modules/tiny-emitter": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmmirror.com/tiny-emitter/-/tiny-emitter-2.1.0.tgz",
+      "integrity": "sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q=="
+    },
     "node_modules/totalist": {
       "version": "3.0.1",
       "resolved": "https://registry.npmmirror.com/totalist/-/totalist-3.0.1.tgz",

+ 2 - 0
package.json

@@ -26,9 +26,11 @@
   "dependencies": {
     "@arco-design/web-vue": "2.56.3",
     "axios": "1.7.8",
+    "clipboard": "2.0.11",
     "dayjs": "1.11.13",
     "highlight.js": "11.10.0",
     "js-cookie": "3.0.5",
+    "md5": "2.3.0",
     "mitt": "3.0.1",
     "pinia": "2.2.8",
     "pinia-plugin-persist": "1.0.0",

+ 14 - 0
src/3rd-libs/clipboard.js

@@ -0,0 +1,14 @@
+/**
+ * https://www.npmjs.com/package/clipboard
+ * https://github.com/zenorocha/clipboard.js
+ */
+
+import Clipboard from 'clipboard';
+
+/**
+ * 在剪贴板复制一个字符串
+ * @param {string} str
+ */
+export default function copyText(str) {
+  Clipboard.copy(str);
+}

BIN
src/assets/file-upload.png


BIN
src/assets/question-define.png


+ 1 - 1
src/modules/conversation-chat/DialogFooter.vue

@@ -1,6 +1,6 @@
 <template>
   <div class="dialog-footer">
-    <div>对话底部</div>
+    <div>内容由 AI 大模型生成,请仔细甄别</div>
   </div>
 </template>
 

+ 1 - 1
src/modules/conversation-chat/DialogHeader.vue

@@ -1,6 +1,6 @@
 <template>
   <div class="dialog-header">
-    <div>对话顶部</div>
+    <div>修改名称</div>
   </div>
 </template>
 

+ 67 - 29
src/modules/conversation-chat/DialogInput.vue

@@ -1,33 +1,37 @@
 <template>
-  <div class="dialog-input">
-    <div>
-      <a-textarea
-        placeholder="输入文本内容"
-        :model-value="input_text_value"
-        allow-clear
-        :auto-size="{
-          minRows: 1,
-          maxRows: 4
-        }"
-        @input="handleTextInput"
-        @keyup="handleTextKeyUp"
+  <div>
+    <div class="dialog-input-area-container">
+      <div class="textarea-container">
+        <a-textarea
+          class="textarea-input"
+          placeholder="输入文本内容"
+          :model-value="input_text_value"
+          allow-clear
+          :auto-size="{
+            minRows: 1,
+            maxRows: 4
+          }"
+          @input="handleTextInput"
+          @keyup="handleTextKeyUp"
+        />
+      </div>
+
+      <InputActions
+        :disabled="disabled"
+        :enable_file_upload="enable_file_upload"
+        :enable_frequent_question="enable_frequent_question"
+        :enable_voice_recognition="enable_voice_recognition"
+        :file_upload_type="file_upload_type"
+        :file_upload_limit="file_upload_limit"
+        @fileUpload="handleFileUpload"
+        @questionDefine="handleQuestionDefine"
+        @voiceRecognize="handleVoiceRecognize"
+        @submit="handleSubmit"
       />
-    </div>
 
-    <InputActions
-      :disabled="disabled"
-      :enable_file_upload="enable_file_upload"
-      :enable_frequent_question="enable_frequent_question"
-      :enable_voice_recognition="enable_voice_recognition"
-      :file_upload_type="file_upload_type"
-      :file_upload_limit="file_upload_limit"
-      @fileUpload="handleFileUpload"
-      @questionDefine="handleQuestionDefine"
-      @voiceRecognize="handleVoiceRecognize"
-      @submit="handleSubmit"
-    />
-
-    <div>文件上传预览区: 当点击文件上传,选择某个文件后,此处需要展示进行预览。</div>
+      <!-- <input type="file" ref="file_upload_input" class="file-input-btn" /> -->
+      <!-- <FileUploadPreview :file_list="input_file_list" /> -->
+    </div>
   </div>
 </template>
 
@@ -35,6 +39,9 @@
 import { ref } from 'vue';
 import InputActions from './dialog-input/InputActions.vue';
 
+import FileUploadPreview from '../file-upload/FileUploadPreview.vue';
+import useFileSelect from './use-file-select';
+
 const props = defineProps({
   /**
    * 是否禁用操作
@@ -133,9 +140,12 @@ const props = defineProps({
  * 文本域输入的内容
  */
 const input_text_value = ref('');
+const input_file_list = ref([]);
 
 const emit = defineEmits(['inputTextChange', 'inputFileChange', 'submit']);
 
+// const fileSelect = useFileSelect('file_upload_input');
+
 const handleSubmit = () => {
   // 检查是否是禁用状态
   if (props.disabled) {
@@ -152,7 +162,9 @@ const clear = () => {
 /**
  * 文件上传
  */
-const handleFileUpload = () => {};
+const handleFileUpload = () => {
+  // fileSelect();
+};
 /**
  * 常用问题定义
  */
@@ -208,10 +220,36 @@ const handleTextKeyUp = (e) => {
     }
   }
 };
+
+defineExpose({
+  clear: clear
+});
 </script>
 
 <style lang="css" scoped>
-.dialog-input {
+.dialog-input-area-container {
+  display: flex;
+  flex-direction: column;
   color: var(--color-text-1);
+  box-shadow: 0 0 5px #ccc;
+  border-radius: 10px;
+  padding: 10px;
+  background-color: #fff;
+  flex-grow: 1;
+}
+
+.textarea-container {
+  flex-grow: 1;
+  display: flex;
+
+  margin-bottom: 5px;
+}
+
+.textarea-input {
+  border-radius: 5px;
+}
+
+.file-input-btn {
+  display: none;
 }
 </style>

+ 23 - 4
src/modules/conversation-chat/DialogItem.vue

@@ -1,8 +1,14 @@
 <template>
   <div class="dialog-item-container">
-    <DialogQuestion :question="questionInfo" />
+    <DialogQuestion v-if="item_type === 'q'" :question="questionInfo" />
 
-    <DialogAnswer :answer="answerInfo" @stop="handleStopChat" @retry="handleRetryChat" @select="handleSelectChat" />
+    <DialogAnswer
+      v-if="item_type === 'a'"
+      :answer="answerInfo"
+      @stop="handleStopChat"
+      @retry="handleRetryChat"
+      @select="handleSelectChat"
+    />
   </div>
 </template>
 
@@ -19,7 +25,18 @@ const props = defineProps({
 const emit = defineEmits(['stop', 'retry', 'select']);
 
 /**
- * 客户端提问数据信息
+ * 当前这一项的类别,有两个值
+ * q 提问
+ * a 智能体的回答
+ */
+const item_type = computed(() => {
+  const item = props.dialog;
+
+  return item.client_custom_item_type;
+});
+
+/**
+ * 客户端提问数据
  */
 const questionInfo = computed(() => {
   return {
@@ -28,7 +45,7 @@ const questionInfo = computed(() => {
 });
 
 /**
- * 智能体回答相关信息
+ * 智能体回答的答案
  */
 const answerInfo = computed(() => {
   const chat_info = props.dialog;
@@ -69,5 +86,7 @@ const handleSelectChat = () => {
 
 <style lang="css" scoped>
 .dialog-item-container {
+  margin-top: 10px;
+  margin-bottom: 10px;
 }
 </style>

+ 13 - 2
src/modules/conversation-chat/DialogList.vue

@@ -1,7 +1,7 @@
 <template>
-  <a-scrollbar type="track" :style="container_style">
+  <a-scrollbar type="track" :style="container_style" ref="scroll_container">
     <div class="dialog-list">
-      <DialogItem v-for="(item, index) of list" :dialog="item" :index="index" :key="item.id" />
+      <DialogItem v-for="(item, index) of list" :dialog="item" :index="index" :key="item.client_custom_unique_id" />
 
       <DialogSuggestion v-if="suggestion.length !== 0" :suggestion="suggestion" />
     </div>
@@ -13,6 +13,8 @@ import { computed } from 'vue';
 import DialogItem from './DialogItem.vue';
 import DialogSuggestion from './DialogSuggestion.vue';
 
+import useScrollBottom from './use-scroll-bottom';
+
 const props = defineProps({
   height: Number,
 
@@ -28,16 +30,25 @@ const props = defineProps({
 
   /**
    * 推荐项
+   * 当一轮对话结束时,智能体可能会返回推荐项目信息
    */
   suggestion: Array
 });
 
+const scroll2Bottom = useScrollBottom('scroll_container');
+
 const container_style = computed(() => {
   return {
     height: props.height + 'px',
     overflow: 'auto'
   };
 });
+
+defineExpose({
+  scroll2Bottom: () => {
+    scroll2Bottom(1000000);
+  }
+});
 </script>
 
 <style lang="css" scoped>

+ 29 - 4
src/modules/conversation-chat/dialog-input/InputActions.vue

@@ -5,10 +5,25 @@
     </div>
 
     <div class="dialog-input-action-right">
-      <div v-if="enable_frequent_question" @click="handleQuestionDefine">常用问题定义</div>
-      <div v-if="enable_file_upload" @click="handleFileUpload">文件上传</div>
-      <div v-if="enable_voice_recognition" @click="handleVoiceRecognize">语音识别</div>
-      <div @click="handleSubmit">发送</div>
+      <a-tooltip content="常用问题定义" position="top">
+        <div v-if="enable_frequent_question" class="action-right-item-btn" @click="handleQuestionDefine">
+          <img src="../../../assets/question-define.png" />
+        </div>
+      </a-tooltip>
+
+      <a-tooltip content="文件上传" position="top">
+        <div v-if="enable_file_upload" class="action-right-item-btn" @click="handleFileUpload">
+          <img src="../../../assets/file-upload.png" />
+        </div>
+      </a-tooltip>
+
+      <a-tooltip content="语音识别" position="top">
+        <div v-if="enable_voice_recognition" class="action-right-item-btn" @click="handleVoiceRecognize">语音识别</div>
+      </a-tooltip>
+
+      <a-tooltip content="请输入您的问题" position="top">
+        <div class="action-right-item-btn" @click="handleSubmit">发送</div>
+      </a-tooltip>
     </div>
   </div>
 </template>
@@ -105,6 +120,7 @@ const handleSubmit = () => {
   display: flex;
   justify-content: space-between;
   align-items: center;
+  height: 30px;
 }
 
 .dialog-input-action-left {
@@ -115,4 +131,13 @@ const handleSubmit = () => {
   justify-content: space-between;
   align-items: center;
 }
+
+.action-right-item-btn {
+  margin-left: 10px;
+  cursor: pointer;
+}
+
+.action-right-item-btn img {
+  width: 24px;
+}
 </style>

+ 17 - 2
src/modules/conversation-chat/dialog-item/BtnStopChat.vue

@@ -1,5 +1,5 @@
 <template>
-  <div @click="handleClick">停止生成</div>
+  <div class="btn-chat-stop-generate" @click="handleClick">停止生成</div>
 </template>
 
 <script setup>
@@ -10,4 +10,19 @@ const handleClick = () => {
 };
 </script>
 
-<style lang="css" scoped></style>
+<style lang="css" scoped>
+.btn-chat-stop-generate {
+  margin-top: 5px;
+  padding: 5px;
+  font-size: 14px;
+
+  border-radius: 5px;
+  border-width: 1px;
+  border-style: solid;
+  border-color: rgb(var(--primary-6));
+  /* color: var(--color-text-1); */
+  color: rgb(var(--primary-6));
+  display: inline-block;
+  cursor: pointer;
+}
+</style>

+ 17 - 5
src/modules/conversation-chat/dialog-item/DialogActions.vue

@@ -7,8 +7,16 @@
     </div>
 
     <div class="dialog-action-part dialog-action-right">
-      <div class="action-btn-item" @click="handleLike">赞</div>
-      <div class="action-btn-item" @click="handleHate">踩</div>
+      <div class="action-btn-item" @click="handleLike">
+        <svg width="1em" height="1em" fill="currentColor" aria-hidden="true" focusable="false" class="">
+          <use xlink:href="#mshd-vote-up"></use>
+        </svg>
+      </div>
+      <div class="action-btn-item" @click="handleHate">
+        <svg width="1em" height="1em" fill="currentColor" aria-hidden="true" focusable="false" class="">
+          <use xlink:href="#mshd-vote-down"></use>
+        </svg>
+      </div>
     </div>
   </div>
 </template>
@@ -59,8 +67,12 @@ const handleHate = () => {};
   align-items: center;
 }
 
-.action-btn-item {
-  margin-left: 5px;
-  margin-right: 5px;
+.dialog-action-left .action-btn-item {
+  /* margin-left: 5px; */
+  margin-right: 10px;
+}
+.dialog-action-right .action-btn-item {
+  margin-left: 10px;
+  /* margin-right: 5px; */
 }
 </style>

+ 7 - 3
src/modules/conversation-chat/dialog-item/DialogAnswer.vue

@@ -31,6 +31,7 @@
  * 4. 回答反馈:分享、点赞、复制
  */
 import { computed } from 'vue';
+import { Message } from '@arco-design/web-vue';
 import BtnSelectItem from './BtnSelectItem.vue';
 import DialogContent from '../dialog-content/DialogContent.vue';
 import DialogActions from './DialogActions.vue';
@@ -38,6 +39,8 @@ import BtnStopChat from './BtnStopChat.vue';
 
 import formatAnwserString from '../../conversation-dialog/format-anwser-string';
 
+import copyText from '../../../3rd-libs/clipboard';
+
 const props = defineProps({
   /**
    * 是否显示选择按钮
@@ -84,9 +87,7 @@ const is_content_loading = computed(() => {
 const answer_html = computed(() => {
   const str = props.answer.content;
 
-  console.log(str, 'str::str');
   const answer_string = formatAnwserString(str);
-  console.log(answer_string, 'answer_string::answer_string');
 
   return answer_string;
 });
@@ -105,7 +106,10 @@ const handleStopChat = () => {
 /**
  * copy
  */
-const handleAnswerCopy = () => {};
+const handleAnswerCopy = () => {
+  copyText(answer_html.value);
+  Message.success('已复制');
+};
 
 /**
  * 分享答案

+ 5 - 1
src/modules/conversation-chat/dialog-item/DialogQuestion.vue

@@ -5,7 +5,7 @@
     <div class="dialog-main question-main">
       <div class="dialog-content question-content">
         <div>
-          <DialogContent :content="question.content" />
+          <DialogContent :content="question.content" class="question-content-core-text" />
         </div>
       </div>
 
@@ -51,6 +51,10 @@ const handleSelectChange = () => {};
   display: flex;
   justify-content: flex-end;
 }
+.question-content-core-text {
+  background-color: rgb(var(--primary-6));
+  color: #fff;
+}
 .question-icon {
   margin-left: 5px;
 }

+ 21 - 0
src/modules/conversation-chat/use-file-select.js

@@ -0,0 +1,21 @@
+// dialog_input
+import { ref, getCurrentInstance, onMounted, onUnmounted, computed } from 'vue';
+
+/**
+ * 获取对话区域的DOM元素尺寸
+ * @param {string} ref_name
+ * @returns
+ */
+export default function useFileSelect(ref_name) {
+  const { proxy } = getCurrentInstance();
+
+  return (value) => {
+    const target = proxy.$refs[ref_name];
+
+    target.click();
+
+    target.onchange = function (e) {
+      console.log(e, '文件发生了变化');
+    };
+  };
+}

+ 17 - 0
src/modules/conversation-chat/use-scroll-bottom.js

@@ -0,0 +1,17 @@
+// dialog_input
+import { ref, getCurrentInstance, onMounted, onUnmounted, computed } from 'vue';
+
+/**
+ * 获取对话区域的DOM元素尺寸
+ * @param {string} ref_name
+ * @returns
+ */
+export default function useScrollBottom(ref_name) {
+  const { proxy } = getCurrentInstance();
+
+  return (value) => {
+    const target = proxy.$refs[ref_name];
+
+    target.scrollTop(value);
+  };
+}

+ 20 - 20
src/modules/conversation-dialog/format-anwser-string.js

@@ -42,25 +42,25 @@ export default function formatAnwserString(string) {
    */
   let parse_href = result.replace('<a href=', '<a target="_blank" href=');
 
-  /**
-   * 替换图片字符串
-   * 将字符串中的图片数据替换掉
-   */
-  var rep_img = parse_href.replace(/<img [^>]*src=['"]([^'"]+)[^>]*>/gi, function (match, str) {
-    // match值类似于
-    //         <img src="https://res.stepfun.com/image_gen/20241125/01936254e2ad7aea9d3d371d9a376469.png?X-Tos-Algorithm=TOS4-HMAC-SHA256&X-Tos-Credential=AKLTYTJhYzZiM2JhZTU2N
-    // GMxMGFkNTkwNTk3OTVkJDQ%2F20241125%2Fcn-shanghai%2Ftos%2Frequest&X-Tos-Date=20241125T075910Z&X-Tos-Expires=3600&x-Tos-Signature=3fa70bdbcc1759ab45aaa1b8bd60eef886e55114c32a39f478ee85d4f262804e&x-Tos-SignededH
-    // eaders=host" alt="">
-
-    const box = document.createElement('div');
-    box.innerHTML = match;
-    const image_ele = box.querySelector('img');
-    const img_src = image_ele.src; // 图片链接
-    // const img_src = 'http://localhost/src/assets/slider/logo.jpg';
-    const img_alt = image_ele.alt; // 图片alt属性
-
-    return `<span class="xiaoshuhuitu-image-container" data-src="${img_src}" data-alt="${img_alt}"></span>`;
-  });
+  // /**
+  //  * 替换图片字符串
+  //  * 将字符串中的图片数据替换掉
+  //  */
+  // var rep_img = parse_href.replace(/<img [^>]*src=['"]([^'"]+)[^>]*>/gi, function (match, str) {
+  //   // match值类似于
+  //   //         <img src="https://res.stepfun.com/image_gen/20241125/01936254e2ad7aea9d3d371d9a376469.png?X-Tos-Algorithm=TOS4-HMAC-SHA256&X-Tos-Credential=AKLTYTJhYzZiM2JhZTU2N
+  //   // GMxMGFkNTkwNTk3OTVkJDQ%2F20241125%2Fcn-shanghai%2Ftos%2Frequest&X-Tos-Date=20241125T075910Z&X-Tos-Expires=3600&x-Tos-Signature=3fa70bdbcc1759ab45aaa1b8bd60eef886e55114c32a39f478ee85d4f262804e&x-Tos-SignededH
+  //   // eaders=host" alt="">
+
+  //   const box = document.createElement('div');
+  //   box.innerHTML = match;
+  //   const image_ele = box.querySelector('img');
+  //   const img_src = image_ele.src; // 图片链接
+  //   // const img_src = 'http://localhost/src/assets/slider/logo.jpg';
+  //   const img_alt = image_ele.alt; // 图片alt属性
+
+  //   return `<span class="xiaoshuhuitu-image-container" data-src="${img_src}" data-alt="${img_alt}"></span>`;
+  // });
 
   /**
    * 文档引用效果
@@ -73,7 +73,7 @@ export default function formatAnwserString(string) {
    * 在界面中可以通过 refference-flag 获取到对应的元素
    */
   let idx = 0; // 记录当前是第几次匹配
-  const formated = rep_img.replaceAll(reg, function (match, index, full_str, c) {
+  const formated = parse_href.replaceAll(reg, function (match, index, full_str, c) {
     let match_final = match.replace('></span>', `data-flag-index="${idx}"></span>`);
 
     match_final = match_final.replace('class="circle"', `class="refflag-refflag-refflag ${REFFERENCE_FLAG}"`);

+ 2 - 5
src/modules/conversation-dialog/format-dialog-temp-loading-message.js → src/modules/conversation-dialog/format-dialog-answer-for-loading.js

@@ -1,12 +1,9 @@
-import { jsonParse, jsonStringify } from '../../utils/utils';
-
-import { formatCodePython, formatCodeSql } from './format-code-string';
-
 /**
+ * 此方法返回一个answer,仅用于加载中状态
  * 当用户已发送消息,但是还未返回时
  * 此时界面上应该显示一个Loading状态
  */
-export default function formatDialogTempLoadingMessage() {
+export default function formatDialogAnswerForLoading() {
   const currentMsg = {
     /**
      * 对话消息类别

+ 32 - 0
src/modules/conversation-dialog/format-dialog-answer-from-history.js

@@ -0,0 +1,32 @@
+import generateClientUniqueId from '../../utils/generate-client-unique-id';
+
+/**
+ * 格式化用户的对话记录的回答数据
+ */
+export default function formatDialogAnswerFromHistory(item) {
+  return {
+    /**
+     * 对话消息类别
+     * 0 历史消息
+     * 1 新消息(本次进入页面新建的消息,但是已经结束轮次)
+     * 2 当前的消息(此刻正在进行中的消息)
+     */
+    client_custom_chat_type: 0,
+    /**
+     * 此项的类别
+     * a 智能体的回答
+     * q 客户端的提问
+     */
+    client_custom_item_type: 'a', // 回答的答案
+    /**
+     * 会话展示时,可以通过此值,判断该如何进行内容显示
+     * 当值为0时,可能显示加载中动画
+     * 当值为1时,展示消息内容,展示 停止生成按钮
+     * 当值为2时,可能展示反馈操作按钮
+     */
+    client_custom_chat_status: 2, // 此轮会话的状态值 0 加载中 1 进行中 2 已结束
+
+    client_custom_unique_id: generateClientUniqueId(item.answer),
+    answer: item.answer
+  };
+}

+ 15 - 4
src/modules/conversation-dialog/format-dialog-receive-message.js → src/modules/conversation-dialog/format-dialog-answer-from-websocket_receive_message.js

@@ -1,19 +1,18 @@
 import { jsonParse, jsonStringify } from '../../utils/utils';
 
 import { formatCodePython, formatCodeSql } from './format-code-string';
+import generateClientUniqueId from '../../utils/generate-client-unique-id';
 
 /**
  * 格式化websocket发送消息的参数
+ * 此方法返回的数据项,为智能体返回的回答的数据
  * @param {string} message_str
  * @param {object} preMsg - 前一次的消息,如果是流式消息,则需要上一次的Content进行拼接,从而形成新的消息
  * @returns
  */
-export default function formatDialogReceiveMessage(message_str, preMsg) {
+export default function formatDialogAnswerFromWebsocketReceiveMessage(message_str, preMsg) {
   const res_content = jsonParse(message_str);
 
-  console.log('收到消息::');
-  console.log(res_content);
-
   // 复制一份原消息内容
   const copyPreMsg = jsonParse(jsonStringify(preMsg));
 
@@ -49,6 +48,12 @@ export default function formatDialogReceiveMessage(message_str, preMsg) {
      * 2 当前的消息(此刻正在进行中的消息)
      */
     client_custom_chat_type: 2,
+    /**
+     * 此项的类别
+     * a 智能体的回答
+     * q 客户端的提问
+     */
+    client_custom_item_type: 'a', // 回答的答案
     /**
      * 会话展示时,可以通过此值,判断该如何进行内容显示
      * 当值为0时,可能显示加载中动画
@@ -236,6 +241,12 @@ export default function formatDialogReceiveMessage(message_str, preMsg) {
     chat_status = 3;
   }
 
+  /**
+   * 依据智能体回答的内容
+   * 生成一个唯一的ID
+   */
+  currentMsg.client_custom_unique_id = generateClientUniqueId(currentMsg.answer);
+
   return {
     status: chat_status, // 0 未开始 1 进行中 2 已结束 3 错误
     message: chat_msg,

+ 0 - 29
src/modules/conversation-dialog/format-dialog-chat-finished-message.js

@@ -1,29 +0,0 @@
-import { jsonParse, jsonStringify } from '../../utils/utils';
-
-import { formatCodePython, formatCodeSql } from './format-code-string';
-
-/**
- * 当用户已发送消息,但是还未返回时
- * 此时界面上应该显示一个Loading状态
- */
-export default function formatDialogChatFinishedMessage(preMsg) {
-  // 本次对话的消息内容
-  const currentMsg = {
-    /**
-     * 客户端自定义字段
-     */
-    client_custom_type: '',
-    /**
-     * 会话展示时,可以通过此值,判断该如何进行内容显示
-     * 当值为0时,可能显示加载中动画
-     * 当值为1时,展示消息内容,展示 停止生成按钮
-     * 当值为2时,可能展示反馈操作按钮
-     */
-    client_custom_chat_status: 2, // 此轮会话的状态值 0 加载中 1 进行中 2 已结束
-
-    content: '', // 消息正文,markdown格式,需要进行解析
-    system: '' // 系统消息
-  };
-
-  return currentMsg;
-}

+ 0 - 8
src/modules/conversation-dialog/format-dialog-history-item.js

@@ -1,8 +0,0 @@
-import { jsonParse, jsonStringify } from '../../utils/utils';
-
-/**
- * 格式化用户的对话记录的每一项数据
- */
-export default function formatDialogHistoryItem(session_item) {
-  return {};
-}

+ 0 - 17
src/modules/conversation-dialog/format-dialog-history-messages.js

@@ -1,17 +0,0 @@
-import { jsonParse, jsonStringify } from '../../utils/utils';
-import formatDialogHistoryItem from './format-dialog-history-item';
-
-/**
- * 格式化用户的对话记录数据
- */
-export default function formatDialogHistoryMessages(session_list) {
-  const arr = [];
-
-  session_list.forEach((item) => {
-    const msg = formatDialogHistoryItem(item);
-
-    arr.push(msg);
-  });
-
-  return arr;
-}

+ 19 - 0
src/modules/conversation-dialog/format-dialog-history.js

@@ -0,0 +1,19 @@
+import formatDialogQuestionByHistory from './format-dialog-question-by-history';
+import formatDialogAnswerFromHistory from './format-dialog-answer-from-history';
+
+/**
+ * 格式化用户的对话历史记录数据
+ */
+export default function formatDialogHistoryMessages(session_list) {
+  const arr = [];
+
+  session_list.forEach((item) => {
+    const question = formatDialogQuestionByHistory(item);
+    const answer = formatDialogAnswerFromHistory(item);
+
+    arr.push(question);
+    arr.push(answer);
+  });
+
+  return arr;
+}

+ 21 - 0
src/modules/conversation-dialog/format-dialog-question-by-client.js

@@ -0,0 +1,21 @@
+import generateClientUniqueId from '../../utils/generate-client-unique-id';
+
+/**
+ * 组装客户端用户提问的数据
+ */
+export default function formatDialogQuestionByClient(text, file_list) {
+  const cur_stamp = Date.now();
+
+  return {
+    /**
+     * 此项的类别
+     * a 智能体的回答
+     * q 客户端的提问
+     */
+    client_custom_item_type: 'q', // 提问
+    client_custom_create_time: cur_stamp, // 创建的时间戳
+    client_custom_unique_id: generateClientUniqueId(text + cur_stamp),
+
+    question: text
+  };
+}

+ 32 - 0
src/modules/conversation-dialog/format-dialog-question-by-history.js

@@ -0,0 +1,32 @@
+import generateClientUniqueId from '../../utils/generate-client-unique-id';
+
+/**
+ * 格式化用户的对话历史记录的提问数据
+ */
+export default function formatDialogQuestionByHistory(item) {
+  return {
+    /**
+     * 对话消息类别
+     * 0 历史消息
+     * 1 新消息(本次进入页面新建的消息,但是已经结束轮次)
+     * 2 当前的消息(此刻正在进行中的消息)
+     */
+    client_custom_chat_type: 0,
+    /**
+     * 此项的类别
+     * a 智能体的回答
+     * q 客户端的提问
+     */
+    client_custom_item_type: 'q', // 回答的答案
+    /**
+     * 会话展示时,可以通过此值,判断该如何进行内容显示
+     * 当值为0时,可能显示加载中动画
+     * 当值为1时,展示消息内容,展示 停止生成按钮
+     * 当值为2时,可能展示反馈操作按钮
+     */
+    client_custom_chat_status: 2, // 此轮会话的状态值 0 加载中 1 进行中 2 已结束
+
+    client_custom_unique_id: generateClientUniqueId(item.question),
+    question: item.question
+  };
+}

+ 2 - 9
src/modules/conversation-dialog/use-websocket-chat.js

@@ -137,38 +137,31 @@ export default function useWebSocketChat(trigger) {
      * @param {string} msg
      */
     sendWSMessage(msg) {
-      console.log('发送消息', msg);
-
       if (websocket === null) {
-        console.log('websocket为空,还未创建,开始创建');
+        // console.log('websocket为空,还未创建,开始创建');
 
         // websocket未创建:立即创建
         websocket = createWSConnection(temp_agent_id, temp_chat_id, temp_type);
       } else {
-        console.log('websocket已创建,不用再次创建');
+        // console.log('websocket已创建,不用再次创建');
       }
 
       // 判断socket是否开启
       // 如果开启,则直接发送,如果没有开启,则将数据推入消息队列
       if (websocket.readyState === 0) {
-        console.log('00');
         delay_message_list.push(msg);
       }
 
       if (websocket.readyState === 1) {
-        console.log('11');
         websocket.send(msg);
       }
 
       if (websocket.readyState === 2) {
-        console.log('22');
         // 正在关闭
         console.log('web socket正在关闭');
       }
 
       if (websocket.readyState === 3) {
-        console.log('33');
-
         delay_message_list.push(msg);
 
         // 已关闭: 重新创建socket

+ 34 - 0
src/modules/file-upload/FileUploadBtn.vue

@@ -0,0 +1,34 @@
+<template>
+  <div class="dialog-input-actions">
+    <div class="dialog-input-action-left">
+      <div>文件上传</div>
+    </div>
+  </div>
+</template>
+
+<script setup>
+const props = defineProps({
+  /**
+   * 是否禁用操作
+   * 默认 false
+   * 当此值为 true 时,此组件的任何功能都不可用
+   * 当对话正在进行时,此值应为 true,意味着不允许继续对话
+   * 直到一轮对话结束,或者一轮对话终止,此值才应该变为 false
+   */
+  disabled: {
+    type: Boolean,
+    default: false,
+    required: false
+  }
+});
+
+const emit = defineEmits(['fileUpload', 'questionDefine', 'voiceRecognize', 'submit']);
+</script>
+
+<style lang="css" scoped>
+.dialog-input-actions {
+  display: flex;
+  justify-content: space-between;
+  align-items: center;
+}
+</style>

+ 68 - 0
src/modules/file-upload/FileUploadPreview.vue

@@ -0,0 +1,68 @@
+<template>
+  <div class="file-upload-preview-area">
+    <div>文件预览区域</div>
+
+    <a-upload
+      :file-list="file_list"
+      :multiple="true"
+      :limit="MAX_ACCEPT_FILE"
+      :auto-upload="false"
+      :show-upload-button="{ showOnExceedLimit: false }"
+      accept=".pdf,.docx"
+      @change="handleFileChange"
+    >
+      <template #upload-button>
+        <a-tooltip :content="upload_warning_text">
+          <a-button class="upload-button">
+            <template #icon>
+              <icon-upload />
+            </template>
+
+            <template #default>点击上传</template>
+          </a-button>
+        </a-tooltip>
+      </template>
+
+      <template #file-name="{ fileItem }">
+        <a-tooltip :content="fileItem.name">
+          <span>{{ fileItem.name }}</span>
+        </a-tooltip>
+      </template>
+
+      <!-- <template #upload-item="{ fileItem, index }">
+                <div>
+                    <div>{{ fileItem.name }}</div>
+                </div>
+            </template> -->
+    </a-upload>
+  </div>
+</template>
+
+<script setup>
+import { ref, computed } from 'vue';
+
+const props = defineProps({
+  file_list: Array
+});
+
+/**
+ * 文件处理
+ */
+const file_list = ref([]);
+const MAX_ACCEPT_FILE = 30;
+const file_total = computed(() => {
+  return file_list.value.length;
+});
+
+const upload_warning_text = '';
+
+const handleFileChange = () => {};
+</script>
+
+<style lang="css" scoped>
+.file-upload-preview-area {
+  display: flex;
+  justify-content: space-between;
+  align-items: center;
+}
+</style>

+ 0 - 0
src/modules/files/README.md → src/modules/file-upload/README.md


+ 13 - 0
src/utils/generate-client-unique-id.js

@@ -0,0 +1,13 @@
+import md5 from 'md5';
+
+/**
+ * 根据一个字符串,生成一个客户端的ID
+ * @param {string} string 
+ */
+export default function generateClientUniqueId(string) {
+    if (!string) {
+        return Date.now() + ''; // 返回当前时间戳
+    } else {
+        return md5(string);
+    }
+}

Kaikkia tiedostoja ei voida näyttää, sillä liian monta tiedostoa muuttui tässä diffissä