Home.vue 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222
  1. <template>
  2. <div id="app">
  3. <Slider @select-nav="selectNav" :index="navIndex" v-show="!closeOthers"></Slider>
  4. <div class="main">
  5. <div :class="{ 'history-wrap': true, 'history-wrap-open': !closeOthers && navIndex > -1 }">
  6. <History
  7. @set-new="
  8. () => {
  9. showDialog = false;
  10. }
  11. "
  12. @handle-click="selectHistory"
  13. />
  14. </div>
  15. <div class="wrap">
  16. <Index :number="swiperNumber" v-if="navIndex === -1" @select-nav="selectNav" />
  17. <div class="border-wrap" v-else>
  18. <div>
  19. <header>
  20. <div>
  21. <img src="@/assets/other/robot.gif" width="52" />
  22. <p>
  23. 信通小数<span>{{ slider[navIndex].title }}</span>
  24. </p>
  25. <span>{{ slider[navIndex].dialog }}</span>
  26. </div>
  27. </header>
  28. <section>
  29. <Answer v-if="navIndex === 0 && !showDialog" />
  30. <dialog-wrap
  31. v-if="showDialog"
  32. :agentInfo="data"
  33. :userInfo="userInfo"
  34. :isSetting="false"
  35. :readonly="readonly"
  36. @setReadonly="setReadonly"
  37. />
  38. </section>
  39. <footer>
  40. <message-input :readonly="readonly" eventName="open-dialog" />
  41. </footer>
  42. <a-tooltip :content="closeOthers ? '收起' : '展开'">
  43. <div @click="openAll">
  44. <img src="@/assets/other/open.svg" width="20" v-if="closeOthers" />
  45. <img src="@/assets/other/close.svg" width="20" v-else />
  46. </div>
  47. </a-tooltip>
  48. </div>
  49. </div>
  50. </div>
  51. </div>
  52. </div>
  53. </template>
  54. <script>
  55. import DialogWrap from "../components/DialogWrap.vue";
  56. import Slider from "../components/Slider.vue";
  57. import History from "../components/History.vue";
  58. import MessageInput from "../components/MessageInput.vue";
  59. import Index from "./Index.vue";
  60. import Answer from "./Answer.vue";
  61. import { defineComponent, ref, onMounted, inject, onBeforeUnmount } from "vue";
  62. export default defineComponent({
  63. components: {
  64. Slider,
  65. History,
  66. Index,
  67. Answer,
  68. MessageInput,
  69. DialogWrap
  70. },
  71. setup() {
  72. const { config, helper } = inject("$global");
  73. const closeOthers = ref(false);
  74. const swiperNumber = ref(5);
  75. const navIndex = ref(-1);
  76. const readonly = ref(false);
  77. const showDialog = ref(false);
  78. const userInfo = {
  79. name: "奇橙",
  80. avatar: "https://s21.ax1x.com/2024/04/18/pFzyA0O.png"
  81. };
  82. const data = {
  83. avatar: "https://s21.ax1x.com/2024/04/18/pFzyA0O.png",
  84. title: "论文解读助手",
  85. name: "@奇橙",
  86. content: "你好,我是一名专业的论文检索助手,可以帮你查找并详细解读你需要的学术论文。",
  87. hot: 345,
  88. star: 34,
  89. id: "111"
  90. };
  91. const openAll = () => {
  92. closeOthers.value = !closeOthers.value;
  93. };
  94. const selectNav = (index) => {
  95. navIndex.value = index;
  96. if (index === -1) {
  97. swiperNumber.value = 5;
  98. } else {
  99. swiperNumber.value = 4;
  100. }
  101. helper.$bus.emit("stop-writing");
  102. showDialog.value = false;
  103. };
  104. const setReadonly = (status) => {
  105. readonly.value = status;
  106. };
  107. const selectHistory = (id) => {
  108. console.log(id);
  109. };
  110. onMounted(() => {
  111. helper.$bus.on("open-dialog", (value) => {
  112. showDialog.value = true;
  113. setTimeout(() => {
  114. helper.$bus.emit("send-message", value);
  115. }, 300);
  116. });
  117. });
  118. onBeforeUnmount(() => {
  119. helper.$bus.off("open-dialog");
  120. });
  121. return {
  122. navIndex,
  123. selectNav,
  124. swiperNumber,
  125. slider: config.slider,
  126. readonly,
  127. userInfo,
  128. setReadonly,
  129. data,
  130. showDialog,
  131. selectHistory,
  132. closeOthers,
  133. openAll
  134. };
  135. }
  136. });
  137. </script>
  138. <style lang="scss" scoped>
  139. .main {
  140. flex: 1;
  141. position: relative;
  142. display: flex;
  143. .history-wrap {
  144. width: 0px;
  145. opacity: 0;
  146. overflow: hidden;
  147. transition-duration: 0.3s;
  148. transition-property: width;
  149. &-open {
  150. opacity: 1;
  151. width: 260px;
  152. }
  153. }
  154. .wrap {
  155. flex: 1;
  156. }
  157. .border-wrap {
  158. position: relative;
  159. padding: 30px 16px 30px 40px;
  160. flex: 1;
  161. height: 100%;
  162. > div {
  163. width: 100%;
  164. height: 100%;
  165. background: #fff;
  166. box-shadow: 0 0 20px 0 rgba(0, 0, 0, 0.03);
  167. border-radius: 14px;
  168. display: flex;
  169. flex-direction: column;
  170. padding: 0 32px;
  171. position: relative;
  172. > div {
  173. position: absolute;
  174. bottom: -10px;
  175. left: -10px;
  176. z-index: 10;
  177. width: 38px;
  178. height: 38px;
  179. border-radius: 20px;
  180. background: #fff;
  181. display: flex;
  182. align-items: center;
  183. justify-content: center;
  184. cursor: pointer;
  185. }
  186. > header {
  187. > div {
  188. display: inline-block;
  189. margin-top: 20px;
  190. > img {
  191. transform: translateX(-12px);
  192. }
  193. > p {
  194. font-size: 36px;
  195. font-weight: bold;
  196. color: #000;
  197. > span {
  198. font-weight: bold;
  199. background: linear-gradient(180deg, #41d98c, #31c4c9);
  200. -webkit-background-clip: text;
  201. -webkit-text-fill-color: transparent;
  202. }
  203. }
  204. > span {
  205. display: block;
  206. color: #000;
  207. font-size: 15px;
  208. margin: 13px 0 32px;
  209. }
  210. }
  211. }
  212. > section {
  213. flex: 1;
  214. padding-bottom: 50px;
  215. overflow: hidden;
  216. }
  217. > footer {
  218. }
  219. }
  220. }
  221. }
  222. </style>