From 6e3158cdb43f386f6b5b030bbfdf1fd98b544ff8 Mon Sep 17 00:00:00 2001 From: rd <1344903914@qq.com> Date: Wed, 20 Aug 2025 18:17:23 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E9=A6=96=E9=A1=B5=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package.json | 1 + pnpm-lock.yaml | 39 ++++++ .../xt-chat/conversations/index.vue | 11 +- src/layouts/Basic.vue | 2 +- .../navbar/components/middle-side/index.vue | 5 +- src/router/index.ts | 2 +- src/styles/components/chat-bubble.scss | 21 ++++ src/styles/components/index.scss | 1 + src/utils/user.ts | 8 +- .../components/conversation-detail/index.vue | 112 ++++++++++++++++++ .../components/conversation-detail/style.scss | 9 ++ src/views/home/components/created/index.vue | 85 +++++++++++++ src/views/home/components/created/style.scss | 32 +++++ .../history-conversation copy/index.vue | 0 .../history-conversation copy/style.scss | 0 .../history-conversation-drawer/index.vue | 13 ++ .../home/components/sender-input/index.vue | 107 +++++++++++++++++ src/views/home/index.vue | 91 ++------------ src/views/home/style.scss | 38 +----- 19 files changed, 446 insertions(+), 131 deletions(-) create mode 100644 src/styles/components/chat-bubble.scss create mode 100644 src/views/home/components/conversation-detail/index.vue create mode 100644 src/views/home/components/conversation-detail/style.scss create mode 100644 src/views/home/components/created/index.vue create mode 100644 src/views/home/components/created/style.scss delete mode 100644 src/views/home/components/history-conversation copy/index.vue delete mode 100644 src/views/home/components/history-conversation copy/style.scss create mode 100644 src/views/home/components/sender-input/index.vue diff --git a/package.json b/package.json index d34818e..db2fa92 100644 --- a/package.json +++ b/package.json @@ -25,6 +25,7 @@ "html2canvas": "^1.4.1", "jspdf": "^3.0.1", "lodash-es": "^4.17.21", + "markdown-it": "^14.1.0", "marked": "^16.1.1", "mitt": "^3.0.0", "normalize.css": "^8.0.1", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 4b0971c..ac9f515 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -50,6 +50,9 @@ importers: lodash-es: specifier: ^4.17.21 version: 4.17.21 + markdown-it: + specifier: ^14.1.0 + version: 14.1.0 marked: specifier: ^16.1.1 version: 16.1.2 @@ -3489,6 +3492,9 @@ packages: resolution: {integrity: sha512-9JROoBW7pobfsx+Sq2JsASvCo6Pfo6WWoUW79HuB1BCoBXD4PLWJPqDF6fNj67pqBYTbAHkE57M1kS/+L1neOg==} engines: {node: '>=10'} + linkify-it@5.0.0: + resolution: {integrity: sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==} + lint-staged@13.1.0: resolution: {integrity: sha512-pn/sR8IrcF/T0vpWLilih8jmVouMlxqXxKuAojmbiGX5n/gDnz+abdPptlj0vYnbfE0SQNl3CY/HwtM0+yfOVQ==} engines: {node: ^14.13.1 || >=16.0.0} @@ -3722,6 +3728,10 @@ packages: resolution: {integrity: sha512-4y7uGv8bd2WdM9vpQsiQNo41Ln1NvhvDRuVt0k2JZQ+ezN2uaQes7lZeZ+QQUHOLQAtDaBJ+7wCbi+ab/KFs+w==} engines: {node: '>=0.10.0'} + markdown-it@14.1.0: + resolution: {integrity: sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg==} + hasBin: true + marked@16.1.2: resolution: {integrity: sha512-rNQt5EvRinalby7zJZu/mB+BvaAY2oz3wCuCjt1RDrWNpS1Pdf9xqMOeC9Hm5adBdcV/3XZPJpG58eT+WBc0XQ==} engines: {node: '>= 20'} @@ -3752,6 +3762,9 @@ packages: mdn-data@2.0.30: resolution: {integrity: sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==} + mdurl@2.0.0: + resolution: {integrity: sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==} + memory-fs@0.5.0: resolution: {integrity: sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA==} engines: {node: '>=4.3.0 <5.0.0 || >=5.10'} @@ -4384,6 +4397,10 @@ packages: pump@3.0.0: resolution: {integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==} + punycode.js@2.3.1: + resolution: {integrity: sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==} + engines: {node: '>=6'} + punycode@2.3.0: resolution: {integrity: sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==} engines: {node: '>=6'} @@ -5236,6 +5253,9 @@ packages: engines: {node: '>=4.2.0'} hasBin: true + uc.micro@2.1.0: + resolution: {integrity: sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==} + ufo@1.0.1: resolution: {integrity: sha512-boAm74ubXHY7KJQZLlXrtMz52qFvpsbOxDcZOnw/Wf+LS4Mmyu7JxmzD4tDLtUQtmZECypJ0FrCz4QIe6dvKRA==} @@ -9818,6 +9838,10 @@ snapshots: lilconfig@2.0.6: {} + linkify-it@5.0.0: + dependencies: + uc.micro: 2.1.0 + lint-staged@13.1.0: dependencies: cli-truncate: 3.1.0 @@ -10134,6 +10158,15 @@ snapshots: dependencies: object-visit: 1.0.1 + markdown-it@14.1.0: + dependencies: + argparse: 2.0.1 + entities: 4.5.0 + linkify-it: 5.0.0 + mdurl: 2.0.0 + punycode.js: 2.3.1 + uc.micro: 2.1.0 + marked@16.1.2: {} match-file@0.2.2: @@ -10171,6 +10204,8 @@ snapshots: mdn-data@2.0.30: {} + mdurl@2.0.0: {} + memory-fs@0.5.0: dependencies: errno: 0.1.8 @@ -10850,6 +10885,8 @@ snapshots: end-of-stream: 1.4.4 once: 1.4.0 + punycode.js@2.3.1: {} + punycode@2.3.0: {} qs@6.12.1: @@ -11925,6 +11962,8 @@ snapshots: typescript@4.9.5: {} + uc.micro@2.1.0: {} + ufo@1.0.1: {} ufo@1.5.3: {} diff --git a/src/components/xt-chat/conversations/index.vue b/src/components/xt-chat/conversations/index.vue index a900110..40502e4 100644 --- a/src/components/xt-chat/conversations/index.vue +++ b/src/components/xt-chat/conversations/index.vue @@ -4,8 +4,8 @@ import { Input, Dropdown, Menu } from 'ant-design-vue'; import type { MenuProps } from 'ant-design-vue'; import type { VNode } from 'vue'; -import SvgIcon from '@/components/svg-icon'; -import TextoverTips from '@/components/text-over-tips'; +import SvgIcon from '@/components/svg-icon/index.vue'; +import TextoverTips from '@/components/text-over-tips/index.vue'; // 定义对话项类型 interface ConversationItem { @@ -63,10 +63,11 @@ export default defineComponent({ const menuConfigs = ref(props.menu ?? DEFAULT_MENU_CONFIG); // 处理选中变更 - const handleActiveChange = (value: string) => { + const handleActiveChange = (item: ConversationItem) => { + const { value } = item; activeKey.value = value; emit('update:modelValue', value); - emit('activeChange', value); + emit('activeChange', item); }; const onMenuItemClick = ({ menuInfo, item }) => { const { key } = menuInfo; @@ -102,7 +103,7 @@ export default defineComponent({ class={`group flex justify-between cursor-pointer items-center p-8px h-40px rounded-8px hover:bg-#F2F3F5 ${ activeKey.value === item.key ? 'bg-#F2F3F5' : '' }`} - onClick={() => handleActiveChange(item.key)} + onClick={() => handleActiveChange(item)} > {item.editing ? ( { position: fixed; top: 0; left: 0; - z-index: 999; + z-index: 9999; width: 100%; } .layout-content-wrap { diff --git a/src/layouts/components/navbar/components/middle-side/index.vue b/src/layouts/components/navbar/components/middle-side/index.vue index 0db1fe1..9eae6af 100644 --- a/src/layouts/components/navbar/components/middle-side/index.vue +++ b/src/layouts/components/navbar/components/middle-side/index.vue @@ -1,13 +1,16 @@ + + diff --git a/src/views/home/components/conversation-detail/style.scss b/src/views/home/components/conversation-detail/style.scss new file mode 100644 index 0000000..2a1c36c --- /dev/null +++ b/src/views/home/components/conversation-detail/style.scss @@ -0,0 +1,9 @@ +.conversation-detail-wrap { + .cts { + color: var(--Text-1, #737478); + font-size: 14px; + font-style: normal; + font-weight: 400; + line-height: 22px; + } +} diff --git a/src/views/home/components/created/index.vue b/src/views/home/components/created/index.vue new file mode 100644 index 0000000..7091a22 --- /dev/null +++ b/src/views/home/components/created/index.vue @@ -0,0 +1,85 @@ + + + diff --git a/src/views/home/components/created/style.scss b/src/views/home/components/created/style.scss new file mode 100644 index 0000000..c5fd26c --- /dev/null +++ b/src/views/home/components/created/style.scss @@ -0,0 +1,32 @@ +.create-conversation-wrap { + .cts { + color: var(--Text-1, #737478); + font-size: 14px; + font-style: normal; + font-weight: 400; + line-height: 22px; + } + .main { + .title { + color: var(--Text-1, #211f24); + text-align: center; + font-family: $font-family-medium; + font-size: 32px; + font-style: normal; + font-weight: 700; + line-height: 48px; + .s1 { + background: linear-gradient(90deg, #6d4cfe 38.12%, #b93bf0 100%); + background-clip: text; + -webkit-background-clip: text; + -webkit-text-fill-color: transparent; + } + } + :deep(.expandable-tags-container) { + .tag-list { + row-gap: 6px; + column-gap: 12px; + } + } + } +} diff --git a/src/views/home/components/history-conversation copy/index.vue b/src/views/home/components/history-conversation copy/index.vue deleted file mode 100644 index e69de29..0000000 diff --git a/src/views/home/components/history-conversation copy/style.scss b/src/views/home/components/history-conversation copy/style.scss deleted file mode 100644 index e69de29..0000000 diff --git a/src/views/home/components/history-conversation-drawer/index.vue b/src/views/home/components/history-conversation-drawer/index.vue index 40f9cbe..be78eee 100644 --- a/src/views/home/components/history-conversation-drawer/index.vue +++ b/src/views/home/components/history-conversation-drawer/index.vue @@ -5,9 +5,11 @@ import Conversations from '@/components/xt-chat/conversations'; import SvgIcon from '@/components/svg-icon'; import { Button, Flex, Input } from 'ant-design-vue'; import DeleteChatModal from './delete-chat-modal.vue'; +import { useRouter } from 'vue-router'; export default { setup(props, { emit, expose }) { + const router = useRouter(); const open = ref(false); const dataSource = ref([]); const activeKey = ref(''); @@ -19,6 +21,7 @@ export default { }; const getData = () => { dataSource.value = Array.from({ length: 4 }).map((conversation, index) => ({ + id: `${index + 1}`, key: `item${index + 1}`, label: `Conversation Item ${index + 1}Conversation Item 1`, })); @@ -43,6 +46,15 @@ export default { const handleRename = (item) => { console.log('handleRename', item); }; + const handleActiveChange = (item) => { + const { id } = item; + router.push({ + name: 'Home', + params: { + conversationId: id, + }, + }); + }; expose({ showDrawer, @@ -60,6 +72,7 @@ export default { dataSource={dataSource.value} onMenuClick={handleMenuClick} onRename={handleRename} + onActiveChange={handleActiveChange} /> diff --git a/src/views/home/components/sender-input/index.vue b/src/views/home/components/sender-input/index.vue new file mode 100644 index 0000000..0d8ddba --- /dev/null +++ b/src/views/home/components/sender-input/index.vue @@ -0,0 +1,107 @@ + + + diff --git a/src/views/home/index.vue b/src/views/home/index.vue index 483236d..20a249b 100644 --- a/src/views/home/index.vue +++ b/src/views/home/index.vue @@ -1,93 +1,24 @@