Commit 523c65df by User

补充聊天模块的完整文件和依赖

parent 75526240
# DeepSeek API 集成指南
## 功能特性
**已完成的功能**
- ✅ DeepSeek API 完整集成
- ✅ 实时思考过程展示
- ✅ 打字机效果显示
- ✅ Markdown 格式化回复
- ✅ 对话历史管理
- ✅ API 配置界面
- ✅ 连接测试功能
- ✅ 流式响应支持
## 快速开始
### 1. 获取 DeepSeek API Key
- 访问 [DeepSeek 官网](https://www.deepseek.com/)
- 注册账号并获取 API Key
### 2. 访问聊天界面
- 在浏览器中打开:`http://localhost:3000/chat/deepseek`
- 或通过侧边导航:AI聊天 → DeepSeek Chat
### 3. 配置 API Key
1. 点击左侧工具栏中的 ⚙️ 配置按钮
2. 输入您的 DeepSeek API Key
3. 点击"测试连接"验证配置
4. 点击"保存配置"
### 4. 开始对话
- 在底部输入框输入问题
- 按 Enter 发送,Shift+Enter 换行
- 享受AI的深度思考过程!
## 核心文件说明
### API 服务层
- `src/service/api/deepseek.ts` - DeepSeek API 封装服务
- `src/components/chat/ApiConfig.vue` - API 配置组件
### 用户界面
- `src/views/chat/deepseek.vue` - 主要聊天界面
- `src/router/routes/index.ts` - 路由配置
## API 配置选项
- **API Key**: 您的 DeepSeek API 密钥
- **模型**: 支持 `deepseek-chat``deepseek-coder`
- **Base URL**: 默认 `https://api.deepseek.com`
## 特殊功能
### 思考过程展示
AI 会先展示详细的思考过程,然后给出最终答案:
1. 🤖 思考中... (显示实时计时)
2. 🧠 深度思考过程 (打字机效果显示)
3. ✅ 最终答案 (Markdown 格式化)
### 对话管理
- 自动保存对话历史
- 支持新建多个对话
- 支持搜索历史对话
## 使用技巧
1. **复杂问题**: 对于编程、分析等复杂问题,AI 会展示详细的思考过程
2. **代码生成**: 支持多种编程语言的代码生成和解释
3. **Markdown**: 回复支持完整的 Markdown 格式,包括代码块、表格、列表等
## 故障排除
### API 连接失败
1. 检查 API Key 是否正确
2. 确认网络连接
3. 查看浏览器控制台错误信息
### 思考过程不显示
1. 确认 API 响应正常
2. 检查 JavaScript 控制台是否有错误
3. 刷新页面重试
## 开发说明
如需自定义或扩展功能:
1. **修改思考逻辑**: 编辑 `deepseek.ts` 中的 `generateThinking` 方法
2. **调整界面样式**: 修改 `deepseek.vue` 中的 SCSS 样式
3. **添加新模型**: 在 `ApiConfig.vue` 中添加模型选项
## 技术栈
- Vue 3 + TypeScript
- Naive UI 组件库
- Markdown-it 渲染器
- DeepSeek API
---
🎉 **现在您可以开始使用 DeepSeek AI 进行智能对话了!**
<!doctype html>
<html lang="zh-cmn-Hans">
<head>
<meta name="buildTime" content="2025-04-25 17:56:27">
<meta name="buildTime" content="2025-06-10 15:32:11">
<meta charset="UTF-8" />
<link rel="icon" href="/favicon.svg" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta name="color-scheme" content="light dark" />
<title>VueDashboard</title>
<script type="module" crossorigin src="/Content/VueDashboardUi/VueDashboard1/assets/index-CsI39EZy.js"></script>
<link rel="stylesheet" crossorigin href="/Content/VueDashboardUi/VueDashboard1/assets/index-DhhgO4aJ.css">
<script type="module" crossorigin src="/Content/VueDashboardUi/VueDashboard1/assets/index-BV5IaHCk.js"></script>
<link rel="stylesheet" crossorigin href="/Content/VueDashboardUi/VueDashboard1/assets/index-BFEuYhFr.css">
</head>
<body>
<div id="app"></div>
......
......@@ -50,6 +50,18 @@ importers:
font-awesome:
specifier: 4.7.0
version: 4.7.0
highlight.js:
specifier: ^11.11.1
version: 11.11.1
katex:
specifier: ^0.16.22
version: 0.16.22
markdown-it:
specifier: ^14.1.0
version: 14.1.0
markdown-it-katex:
specifier: ^2.0.3
version: 2.0.3
naive-ui:
specifier: 2.39.0
version: 2.39.0(vue@3.4.35(typescript@5.5.4))
......@@ -79,7 +91,7 @@ importers:
version: 4.4.1(vue@3.4.35(typescript@5.5.4))
vue3-sfc-loader:
specifier: ^0.9.5
version: 0.9.5(lodash@4.17.21)(vue@3.4.35(typescript@5.5.4))
version: 0.9.5(hogan.js@3.0.2)(lodash@4.17.21)(vue@3.4.35(typescript@5.5.4))
wangeditor:
specifier: 4.7.15
version: 4.7.15
......@@ -1686,6 +1698,9 @@ packages:
slate: ^0.72.0
snabbdom: ^3.1.0
abbrev@1.1.1:
resolution: {integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==}
acorn-jsx@5.3.2:
resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==}
peerDependencies:
......@@ -2031,6 +2046,10 @@ packages:
resolution: {integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==}
engines: {node: '>= 10'}
commander@8.3.0:
resolution: {integrity: sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==}
engines: {node: '>= 12'}
comment-parser@1.4.1:
resolution: {integrity: sha512-buhp5kePrmda3vhc5B9t7pUQXAb2Tnd0qgpkIhPhkHXxJpiPJ11H0ZEU0oBpJ2QztSbzG/ZxMj/CHsYJqRHmyg==}
engines: {node: '>= 12.0.0'}
......@@ -3029,10 +3048,14 @@ packages:
resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==}
hasBin: true
highlight.js@11.10.0:
resolution: {integrity: sha512-SYVnVFswQER+zu1laSya563s+F8VDGt7o35d4utbamowvUNLLMovFqwCLSocpZTz3MgaSRA1IbqRWZv97dtErQ==}
highlight.js@11.11.1:
resolution: {integrity: sha512-Xwwo44whKBVCYoliBQwaPvtd/2tYFkRQtXDWj1nackaV2JPXx3L0+Jvd8/qCJ2p+ML0/XVkJ2q+Mr+UVdpJK5w==}
engines: {node: '>=12.0.0'}
hogan.js@3.0.2:
resolution: {integrity: sha512-RqGs4wavGYJWE07t35JQccByczmNUXQT0E12ZYV1VKYu5UiAU9lsos/yBAcf840+zrUQQxgVduCR5/B8nNtibg==}
hasBin: true
hookable@5.5.3:
resolution: {integrity: sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==}
......@@ -3403,6 +3426,14 @@ packages:
jsonfile@6.1.0:
resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==}
katex@0.16.22:
resolution: {integrity: sha512-XCHRdUw4lf3SKBaJe4EvgqIuWwkPSo9XoeO8GjQW94Bp7TWv9hNhzZjZ+OH9yf1UmLygb7DIT5GSFQiyt16zYg==}
hasBin: true
katex@0.6.0:
resolution: {integrity: sha512-rS4mY3SvHYg5LtQV6RBcK0if7ur6plyEukAOV+jGGPqFImuzu8fHL6M752iBmRGoUyF0bhZbAPoezehn7xYksA==}
hasBin: true
keyv@4.5.4:
resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==}
......@@ -3450,6 +3481,9 @@ packages:
lines-and-columns@1.2.4:
resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==}
linkify-it@5.0.0:
resolution: {integrity: sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==}
lint-staged@15.2.7:
resolution: {integrity: sha512-+FdVbbCZ+yoh7E/RosSdqKJyUM2OEjTciH0TFNkawKgvFp1zbGlEC39RADg+xKBG1R4mhoH2j85myBQZ5wR+lw==}
engines: {node: '>=18.12.0'}
......@@ -3554,6 +3588,16 @@ packages:
resolution: {integrity: sha512-4y7uGv8bd2WdM9vpQsiQNo41Ln1NvhvDRuVt0k2JZQ+ezN2uaQes7lZeZ+QQUHOLQAtDaBJ+7wCbi+ab/KFs+w==}
engines: {node: '>=0.10.0'}
markdown-it-katex@2.0.3:
resolution: {integrity: sha512-nUkkMtRWeg7OpdflamflE/Ho/pWl64Lk9wNBKOmaj33XkQdumhXAIYhI0WO03GeiycPCsxbmX536V5NEXpC3Ng==}
markdown-it@14.1.0:
resolution: {integrity: sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg==}
hasBin: true
match-at@0.1.1:
resolution: {integrity: sha512-h4Yd392z9mST+dzc+yjuybOGFNOZjmXIPKWjxBd1Bb23r4SmDOsk2NYCU2BMUBGbSpZqwVsZYNq26QS3xfaT3Q==}
mdast-util-from-markdown@2.0.1:
resolution: {integrity: sha512-aJEUyzZ6TzlsX2s5B4Of7lN7EQtAxvtradMMglCQDyaTFgse6CmtmdJ15ElnVRlCg1vpNyVtbem0PWzlNieZsA==}
......@@ -3566,6 +3610,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==}
merge-options@1.0.1:
resolution: {integrity: sha512-iuPV41VWKWBIOpBsjoxjDZw8/GbSfZ2mk7N1453bwMrfzdrIk7EzBd+8UVR6rkw67th7xnk9Dytl3J+lHPdxvg==}
engines: {node: '>=4'}
......@@ -3718,6 +3765,10 @@ packages:
resolution: {integrity: sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==}
engines: {node: '>=0.10.0'}
mkdirp@0.3.0:
resolution: {integrity: sha512-OHsdUcVAQ6pOtg5JYWpCBo9W/GySVuwvP9hueRMW7UqshC0tbfzLv8wjySTPm3tfUZ/21CE9E1pJagOA91Pxew==}
deprecated: Legacy versions of mkdirp are no longer supported. Please update to mkdirp 1.x. (Note that the API surface has changed to use Promises in 1.x.)
mkdirp@1.0.4:
resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==}
engines: {node: '>=10'}
......@@ -3788,6 +3839,10 @@ packages:
node-releases@2.0.18:
resolution: {integrity: sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==}
nopt@1.0.10:
resolution: {integrity: sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg==}
hasBin: true
normalize-package-data@2.5.0:
resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==}
......@@ -4138,6 +4193,10 @@ packages:
pseudomap@1.0.2:
resolution: {integrity: sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==}
punycode.js@2.3.1:
resolution: {integrity: sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==}
engines: {node: '>=6'}
punycode@2.3.1:
resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==}
engines: {node: '>=6'}
......@@ -4692,6 +4751,9 @@ packages:
engines: {node: '>=14.17'}
hasBin: true
uc.micro@2.1.0:
resolution: {integrity: sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==}
ufo@1.5.4:
resolution: {integrity: sha512-UsUk3byDzKd04EyoZ7U4DOlxQaD14JUKQl6/P7wiX4FNvUfm3XL246n9W5AmqwW5RSFJ27NAuM0iLscAOYUiGQ==}
......@@ -5178,7 +5240,7 @@ snapshots:
'@babel/helper-member-expression-to-functions@7.24.8':
dependencies:
'@babel/traverse': 7.25.3
'@babel/types': 7.25.2
'@babel/types': 7.26.0
transitivePeerDependencies:
- supports-color
......@@ -5189,7 +5251,7 @@ snapshots:
'@babel/helper-module-imports@7.24.7':
dependencies:
'@babel/traverse': 7.25.3
'@babel/types': 7.25.2
'@babel/types': 7.26.0
transitivePeerDependencies:
- supports-color
......@@ -5231,7 +5293,7 @@ snapshots:
'@babel/helper-optimise-call-expression@7.24.7':
dependencies:
'@babel/types': 7.25.2
'@babel/types': 7.26.0
'@babel/helper-plugin-utils@7.24.8': {}
......@@ -5249,7 +5311,7 @@ snapshots:
'@babel/helper-simple-access@7.24.7':
dependencies:
'@babel/traverse': 7.25.3
'@babel/types': 7.25.2
'@babel/types': 7.26.0
transitivePeerDependencies:
- supports-color
......@@ -6469,9 +6531,9 @@ snapshots:
de-indent: 1.0.2
he: 1.2.0
'@vue/component-compiler-utils@3.3.0(lodash@4.17.21)':
'@vue/component-compiler-utils@3.3.0(hogan.js@3.0.2)(lodash@4.17.21)':
dependencies:
consolidate: 0.15.1(lodash@4.17.21)
consolidate: 0.15.1(hogan.js@3.0.2)(lodash@4.17.21)
hash-sum: 1.0.2
lru-cache: 4.1.5
merge-source-map: 1.1.0
......@@ -6728,6 +6790,9 @@ snapshots:
slate: 0.72.8
snabbdom: 3.6.2
abbrev@1.1.1:
optional: true
acorn-jsx@5.3.2(acorn@8.12.1):
dependencies:
acorn: 8.12.1
......@@ -7105,6 +7170,8 @@ snapshots:
commander@7.2.0: {}
commander@8.3.0: {}
comment-parser@1.4.1: {}
compatx@0.1.8:
......@@ -7124,10 +7191,11 @@ snapshots:
consola@3.2.3: {}
consolidate@0.15.1(lodash@4.17.21):
consolidate@0.15.1(hogan.js@3.0.2)(lodash@4.17.21):
dependencies:
bluebird: 3.7.2
optionalDependencies:
hogan.js: 3.0.2
lodash: 4.17.21
convert-gitmoji@0.1.5: {}
......@@ -8139,7 +8207,13 @@ snapshots:
he@1.2.0: {}
highlight.js@11.10.0: {}
highlight.js@11.11.1: {}
hogan.js@3.0.2:
dependencies:
mkdirp: 0.3.0
nopt: 1.0.10
optional: true
hookable@5.5.3: {}
......@@ -8444,6 +8518,14 @@ snapshots:
optionalDependencies:
graceful-fs: 4.2.11
katex@0.16.22:
dependencies:
commander: 8.3.0
katex@0.6.0:
dependencies:
match-at: 0.1.1
keyv@4.5.4:
dependencies:
json-buffer: 3.0.1
......@@ -8482,6 +8564,10 @@ snapshots:
lines-and-columns@1.2.4: {}
linkify-it@5.0.0:
dependencies:
uc.micro: 2.1.0
lint-staged@15.2.7:
dependencies:
chalk: 5.3.0
......@@ -8601,6 +8687,21 @@ snapshots:
dependencies:
object-visit: 1.0.1
markdown-it-katex@2.0.3:
dependencies:
katex: 0.6.0
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
match-at@0.1.1: {}
mdast-util-from-markdown@2.0.1:
dependencies:
'@types/mdast': 4.0.4
......@@ -8626,6 +8727,8 @@ snapshots:
mdn-data@2.0.30: {}
mdurl@2.0.0: {}
merge-options@1.0.1:
dependencies:
is-plain-obj: 1.1.0
......@@ -8848,6 +8951,9 @@ snapshots:
for-in: 1.0.2
is-extendable: 1.0.1
mkdirp@0.3.0:
optional: true
mkdirp@1.0.4: {}
mkdirp@3.0.1: {}
......@@ -8892,7 +8998,7 @@ snapshots:
date-fns: 2.30.0
date-fns-tz: 2.0.1(date-fns@2.30.0)
evtd: 0.2.4
highlight.js: 11.10.0
highlight.js: 11.11.1
lodash: 4.17.21
lodash-es: 4.17.21
seemly: 0.3.8
......@@ -8932,6 +9038,11 @@ snapshots:
node-releases@2.0.18: {}
nopt@1.0.10:
dependencies:
abbrev: 1.1.1
optional: true
normalize-package-data@2.5.0:
dependencies:
hosted-git-info: 2.8.9
......@@ -9257,6 +9368,8 @@ snapshots:
pseudomap@1.0.2: {}
punycode.js@2.3.1: {}
punycode@2.3.1: {}
qs@6.12.3:
......@@ -9876,6 +9989,8 @@ snapshots:
typescript@5.5.4: {}
uc.micro@2.1.0: {}
ufo@1.5.4: {}
unbox-primitive@1.0.2:
......@@ -10199,7 +10314,7 @@ snapshots:
semver: 7.6.3
typescript: 5.5.4
vue3-sfc-loader@0.9.5(lodash@4.17.21)(vue@3.4.35(typescript@5.5.4)):
vue3-sfc-loader@0.9.5(hogan.js@3.0.2)(lodash@4.17.21)(vue@3.4.35(typescript@5.5.4)):
dependencies:
'@babel/code-frame': 7.24.7
'@babel/core': 7.25.2
......@@ -10216,7 +10331,7 @@ snapshots:
'@vue/babel-preset-jsx': 1.4.0(@babel/core@7.25.2)(vue@3.4.35(typescript@5.5.4))
'@vue/compiler-dom': 3.4.35
'@vue/compiler-sfc': 3.4.35
'@vue/component-compiler-utils': 3.3.0(lodash@4.17.21)
'@vue/component-compiler-utils': 3.3.0(hogan.js@3.0.2)(lodash@4.17.21)
'@vue/shared': 3.4.35
spark-md5: 3.0.2
vue-template-compiler: 2.7.16
......
......@@ -2,10 +2,14 @@ import { createApp } from 'vue';
import { Editor, Toolbar } from '@wangeditor/editor-for-vue';
import '@wangeditor/editor/dist/css/style.css';
import VueGridLayout from 'vue-grid-layout';
import MateChat from '@matechat/core';
import '@devui-design/icons/icomoon/devui-icon.css';
import './plugins/assets';
import { localStg } from '@/utils/storage';
// main.js or main.ts
import 'font-awesome/css/font-awesome.css';
// 引入 KaTeX 样式以支持数学公式渲染
import 'katex/dist/katex.min.css';
import { setupDayjs, setupIconifyOffline, setupLoading, setupNProgress } from './plugins';
import { setupStore } from './store';
import { setupRouter } from './router';
......@@ -79,6 +83,7 @@ async function setupApp() {
// startInactivityTimer(app);
app.use(VueGridLayout);
app.use(MateChat);
// 全局注册 wangeditor 组件
app.component('WangEditor', Editor);
......
......@@ -78,7 +78,6 @@ export function getTabByRoute(route: App.Global.TabRoute) {
fixedIndex: fixedIndexInTab,
icon,
localIcon,
icons: icons as string,
i18nKey
};
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment