Skip to content

Commit 1fe40b6

Browse files
committed
【代码评审】AI:code review 思维导图的逻辑
1 parent 86880b4 commit 1fe40b6

File tree

8 files changed

+816
-62
lines changed

8 files changed

+816
-62
lines changed

build/vite/optimize.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,9 @@ const include = [
2929
'@wangeditor/editor-for-vue',
3030
'@microsoft/fetch-event-source',
3131
'markdown-it',
32+
'markmap-view',
33+
'markmap-lib',
34+
'markmap-toolbar',
3235
'highlight.js',
3336
'element-plus',
3437
'element-plus/es',

package.json

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,6 @@
5353
"jsencrypt": "^3.3.2",
5454
"lodash-es": "^4.17.21",
5555
"markdown-it": "^14.1.0",
56-
"marked": "^12.0.2",
5756
"markmap-common": "^0.16.0",
5857
"markmap-lib": "^0.16.1",
5958
"markmap-toolbar": "^0.17.0",

pnpm-lock.yaml

Lines changed: 755 additions & 25 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/api/ai/mindmap/index.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@ import { config } from '@/config/axios/config'
55
export interface AiMindMapGenerateReqVO {
66
prompt: string
77
}
8-
//
98

109
export const AiMindMapApi = {
1110
generateMindMap: ({

src/views/ai/mindmap/index/components/Left.vue

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -20,13 +20,14 @@
2020
type="primary"
2121
:loading="isGenerating"
2222
@click="emits('submit', formData)"
23-
>智能生成思维导图</el-button
2423
>
24+
智能生成思维导图
25+
</el-button>
2526
</div>
2627
<div class="mt-[30px]">
2728
<el-text tag="b">使用已有内容生成?</el-text>
2829
<el-input
29-
v-model="existPrompt"
30+
v-model="generatedContent"
3031
maxlength="1024"
3132
rows="5"
3233
class="w-100% mt-15px"
@@ -38,17 +39,18 @@
3839
<el-button
3940
class="!w-full mt-[15px]"
4041
type="primary"
41-
@click="emits('directGenerate', existPrompt)"
42+
@click="emits('directGenerate', generatedContent)"
4243
:disabled="isGenerating"
43-
>直接生成</el-button
4444
>
45+
直接生成
46+
</el-button>
4547
</div>
4648
</div>
4749
</div>
4850
</template>
4951

5052
<script setup lang="ts">
51-
import { MindmapExitExample } from '@/views/ai/utils/constants'
53+
import { MindMapContentExample } from '@/views/ai/utils/constants'
5254
5355
const emits = defineEmits(['submit', 'directGenerate'])
5456
defineProps<{
@@ -59,11 +61,12 @@ const formData = reactive({
5961
prompt: ''
6062
})
6163
62-
const existPrompt = ref(MindmapExitExample) // 已有的内容
64+
const generatedContent = ref(MindMapContentExample) // 已有的内容
6365
6466
defineExpose({
65-
setExistPrompt(e: string){ // 设置已有的内容,在生成结束的时候将结果赋值给该值
66-
existPrompt.value = e
67+
setGeneratedContent(newContent: string) {
68+
// 设置已有的内容,在生成结束的时候将结果赋值给该值
69+
generatedContent.value = newContent
6770
}
6871
})
6972
</script>

src/views/ai/mindmap/index/components/Right.vue

Lines changed: 23 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
<template>
22
<el-card class="my-card h-full flex-grow">
3-
<template #header
4-
><h3 class="m-0 px-7 shrink-0 flex items-center justify-between">
3+
<template #header>
4+
<h3 class="m-0 px-7 shrink-0 flex items-center justify-between">
55
<span>思维导图预览</span>
66
<!-- 展示在右上角 -->
77
<el-button type="primary" v-show="isEnd" @click="downloadImage" size="small">
@@ -10,13 +10,13 @@
1010
</template>
1111
下载图片
1212
</el-button>
13-
</h3></template
14-
>
13+
</h3>
14+
</template>
1515

1616
<div ref="contentRef" class="hide-scroll-bar h-full box-border">
17-
<!--展示markdown的容器,最终生成的是html字符串,直接用v-html嵌入-->
17+
<!--展示 markdown 的容器,最终生成的是 html 字符串,直接用 v-html 嵌入-->
1818
<div v-if="isGenerating" ref="mdContainerRef" class="wh-full overflow-y-auto">
19-
<div class="flex flex-col items-center justify-center" v-html="html"></div>
19+
<div class="flex flex-col items-center justify-center" v-html="html"></div>
2020
</div>
2121

2222
<div ref="mindmapRef" class="wh-full">
@@ -34,24 +34,25 @@ import { Toolbar } from 'markmap-toolbar'
3434
import markdownit from 'markdown-it'
3535
3636
const md = markdownit()
37+
const message = useMessage() // 消息弹窗
38+
39+
// TODO @hhero:mindmap 改成 mindMap 更精准哈
3740
const props = defineProps<{
38-
mindmapResult: string // 生成结果
41+
mindmapResult: string // 生成结果 TODO @hhero 改成 generatedContent 会不会好点
3942
isEnd: boolean // 是否结束
4043
isGenerating: boolean // 是否正在生成
41-
isStart: boolean // 开始状态,开始时需要清除html
44+
isStart: boolean // 开始状态,开始时需要清除 html
4245
}>()
4346
const contentRef = ref<HTMLDivElement>() // 右侧出来header以下的区域
44-
const mdContainerRef = ref<HTMLDivElement>() // markdown的容器,用来滚动到底下的
47+
const mdContainerRef = ref<HTMLDivElement>() // markdown 的容器,用来滚动到底下的
4548
const mindmapRef = ref<HTMLDivElement>() // 思维导图的容器
46-
const svgRef = ref<SVGElement>() // 思维导图的渲染svg
49+
const svgRef = ref<SVGElement>() // 思维导图的渲染 svg
4750
const toolBarRef = ref<HTMLDivElement>() // 思维导图右下角的工具栏,缩放等
4851
const html = ref('') // 生成过程中的文本
49-
const contentAreaHeight = ref(0) // 生成区域的高度,出去header部分
52+
const contentAreaHeight = ref(0) // 生成区域的高度,出去 header 部分
5053
let markMap: Markmap | null = null
5154
const transformer = new Transformer()
5255
53-
const message = useMessage()
54-
5556
onMounted(() => {
5657
contentAreaHeight.value = contentRef.value?.clientHeight || 0 // 获取区域高度
5758
/** 初始化思维导图 **/
@@ -66,11 +67,11 @@ onMounted(() => {
6667
})
6768
6869
watch(props, ({ mindmapResult, isGenerating, isEnd, isStart }) => {
69-
// 开始生成的时候清空一下markdown的内容
70+
// 开始生成的时候清空一下 markdown 的内容
7071
if (isStart) {
7172
html.value = ''
7273
}
73-
// 生成内容的时候使用markdown来渲染
74+
// 生成内容的时候使用 markdown 来渲染
7475
if (isGenerating) {
7576
html.value = md.render(mindmapResult)
7677
}
@@ -79,6 +80,7 @@ watch(props, ({ mindmapResult, isGenerating, isEnd, isStart }) => {
7980
}
8081
})
8182
83+
/** 更新思维导图的展示 */
8284
const update = () => {
8385
try {
8486
const { root } = transformer.transform(processContent(props.mindmapResult))
@@ -89,7 +91,8 @@ const update = () => {
8991
}
9092
}
9193
92-
const processContent = (text) => {
94+
/** 处理内容 */
95+
const processContent = (text: string) => {
9396
const arr: string[] = []
9497
const lines = text.split('\n')
9598
for (let line of lines) {
@@ -101,6 +104,9 @@ const processContent = (text) => {
101104
}
102105
return arr.join('\n')
103106
}
107+
108+
/** 下载图片 */
109+
// TODO @hhhero:可以抽到 download 这个里面,src/utils/download.ts 么?复用 image 方法?
104110
// download SVG to png file
105111
const downloadImage = () => {
106112
const svgElement = mindmapRef.value
@@ -121,7 +127,7 @@ const downloadImage = () => {
121127
image.onload = function () {
122128
context?.drawImage(image, 0, 0)
123129
const a = document.createElement('a')
124-
a.download = 'ruoyi-mindmap.png'
130+
a.download = 'mindmap.png'
125131
a.href = canvas.toDataURL(`image/png`)
126132
a.click()
127133
}

src/views/ai/mindmap/index/index.vue

Lines changed: 18 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,12 @@
11
<template>
22
<div class="absolute top-0 left-0 right-0 bottom-0 flex">
33
<!--表单区域-->
4-
<Left ref="leftRef" @submit="submit" @direct-generate="directGenerate" :is-generating="isGenerating" />
4+
<Left
5+
ref="leftRef"
6+
@submit="submit"
7+
@direct-generate="directGenerate"
8+
:is-generating="isGenerating"
9+
/>
510
<!--右边生成思维导图区域-->
611
<Right
712
ref="rightRef"
@@ -17,10 +22,10 @@
1722
import Left from './components/Left.vue'
1823
import Right from './components/Right.vue'
1924
import { AiMindMapApi, AiMindMapGenerateReqVO } from '@/api/ai/mindmap'
20-
import { MindmapExitExample } from '@/views/ai/utils/constants'
25+
import { MindMapContentExample } from '@/views/ai/utils/constants'
2126
2227
defineOptions({
23-
name: 'AIMindMap'
28+
name: 'AiMindMap'
2429
})
2530
const ctrl = ref<AbortController>() // 请求控制
2631
const isGenerating = ref(false) // 是否正在生成思维导图
@@ -33,21 +38,21 @@ const mindmapResult = ref('') // 生成思维导图结果
3338
const leftRef = ref<InstanceType<typeof Left>>() // 左边组件
3439
const rightRef = ref<InstanceType<typeof Right>>() // 右边组件
3540
36-
onMounted(() => {
37-
mindmapResult.value = MindmapExitExample
38-
})
3941
/** 使用已有内容直接生成 **/
4042
const directGenerate = (existPrompt: string) => {
4143
isEnd.value = false // 先设置为false再设置为true,让子组建的watch能够监听到
4244
mindmapResult.value = existPrompt
4345
isEnd.value = true
4446
}
47+
4548
/** 停止 stream 生成 */
4649
const stopStream = () => {
4750
isGenerating.value = false
4851
isStart.value = false
4952
ctrl.value?.abort()
5053
}
54+
55+
/** 提交生成 */
5156
const submit = (data: AiMindMapGenerateReqVO) => {
5257
isGenerating.value = true
5358
isStart.value = true
@@ -56,7 +61,7 @@ const submit = (data: AiMindMapGenerateReqVO) => {
5661
mindmapResult.value = '' // 清空生成数据
5762
AiMindMapApi.generateMindMap({
5863
data,
59-
onMessage:async (res) => {
64+
onMessage: async (res) => {
6065
const { code, data, msg } = JSON.parse(res.data)
6166
if (code !== 0) {
6267
message.alert(`生成思维导图异常! ${msg}`)
@@ -69,7 +74,7 @@ const submit = (data: AiMindMapGenerateReqVO) => {
6974
},
7075
onClose() {
7176
isEnd.value = true
72-
leftRef.value?.setExistPrompt(mindmapResult.value)
77+
leftRef.value?.setGeneratedContent(mindmapResult.value)
7378
stopStream()
7479
},
7580
onError(err) {
@@ -79,4 +84,9 @@ const submit = (data: AiMindMapGenerateReqVO) => {
7984
ctrl: ctrl.value
8085
})
8186
}
87+
88+
/** 初始化 */
89+
onMounted(() => {
90+
mindmapResult.value = MindMapContentExample
91+
})
8292
</script>

src/views/ai/utils/constants.ts

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -67,10 +67,11 @@ export enum AiWriteTypeEnum {
6767
// 表格展示对照map
6868
export const AiWriteTypeTableRender = {
6969
[AiWriteTypeEnum.WRITING]: '撰写',
70-
[AiWriteTypeEnum.REPLY]: '回复',
70+
[AiWriteTypeEnum.REPLY]: '回复'
7171
}
7272

7373
// ========== 【图片 UI】相关的枚举 ==========
74+
7475
export const ImageHotWords = [
7576
'中国旗袍',
7677
'古装美女',
@@ -414,8 +415,11 @@ export const WriteExample = {
414415
data: '您的请假申请已收悉,经核实和考虑,暂时无法批准您的请假申请。\n\n如有特殊情况或紧急事务,请及时与我联系。\n\n祝工作顺利。\n\n谢谢。'
415416
}
416417
}
418+
419+
// ========== 【思维导图 UI】相关的枚举 ==========
420+
417421
/** 思维导图已有内容生成示例 **/
418-
export const MindmapExitExample = `# Java 技术栈
422+
export const MindMapContentExample = `# Java 技术栈
419423
420424
## 核心技术
421425
### Java SE

0 commit comments

Comments
 (0)