提交 71d00e6d authored 作者: 王鹏飞's avatar 王鹏飞

chore: update

上级 57c3abc7
......@@ -25,7 +25,8 @@
"pinia": "^2.1.6",
"vue": "^3.3.4",
"vue-echarts": "^6.6.1",
"vue-router": "^4.2.4"
"vue-router": "^4.2.4",
"xss": "^1.0.15"
},
"devDependencies": {
"@rushstack/eslint-patch": "^1.2.0",
......@@ -2415,6 +2416,11 @@
"node": ">= 0.8"
}
},
"node_modules/commander": {
"version": "2.20.3",
"resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
"integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ=="
},
"node_modules/concat-map": {
"version": "0.0.1",
"resolved": "https://registry.npmmirror.com/concat-map/-/concat-map-0.0.1.tgz",
......@@ -2492,6 +2498,11 @@
"node": ">=4"
}
},
"node_modules/cssfilter": {
"version": "0.0.10",
"resolved": "https://registry.npmjs.org/cssfilter/-/cssfilter-0.0.10.tgz",
"integrity": "sha512-FAaLDaplstoRsDR8XGYH51znUN0UY7nMc6Z9/fvE8EXGwvJE9hu7W2vHwx1+bd6gCYnln9nLbzxFTrcO9YQDZw=="
},
"node_modules/csstype": {
"version": "3.1.2",
"resolved": "https://registry.npmmirror.com/csstype/-/csstype-3.1.2.tgz",
......@@ -5709,6 +5720,21 @@
"node": ">=4.0"
}
},
"node_modules/xss": {
"version": "1.0.15",
"resolved": "https://registry.npmjs.org/xss/-/xss-1.0.15.tgz",
"integrity": "sha512-FVdlVVC67WOIPvfOwhoMETV72f6GbW7aOabBC3WxN/oUdoEMDyLz4OgRv5/gck2ZeNqEQu+Tb0kloovXOfpYVg==",
"dependencies": {
"commander": "^2.20.3",
"cssfilter": "0.0.10"
},
"bin": {
"xss": "bin/xss"
},
"engines": {
"node": ">= 0.10.0"
}
},
"node_modules/xtend": {
"version": "4.0.2",
"resolved": "https://registry.npmmirror.com/xtend/-/xtend-4.0.2.tgz",
......
......@@ -32,7 +32,8 @@
"pinia": "^2.1.6",
"vue": "^3.3.4",
"vue-echarts": "^6.6.1",
"vue-router": "^4.2.4"
"vue-router": "^4.2.4",
"xss": "^1.0.15"
},
"devDependencies": {
"@rushstack/eslint-patch": "^1.2.0",
......
......@@ -31,6 +31,7 @@ const isEmpty = computed(() => {
if (!props.options) return true
return !Object.keys(props.options)
})
const color = ['#af1c40', '#c17933', '#8f0034', '#d45548', '#ab3259', '#dec34c', '#8b8920', '#a25a6d']
</script>
<template>
......@@ -49,7 +50,7 @@ const isEmpty = computed(() => {
<div class="chart-bd" v-loading="loading">
<slot>
<el-empty v-if="isEmpty" />
<v-chart class="chart" :option="options" autoresize ref="chart" v-else />
<v-chart class="chart" :option="{ ...options, color }" autoresize ref="chart" v-else />
</slot>
</div>
</div>
......
......@@ -13,7 +13,8 @@ export function useEvent() {
eventList.value = res.data.items
}
onMounted(() => {
if (!eventList.value?.length) fetchEventList()
// if (!eventList.value?.length) fetchEventList()
fetchEventList()
})
return { fetchEventList, eventList, eventValues }
}
......@@ -2,12 +2,14 @@
import { useClipboard } from '@vueuse/core'
import { useChat } from '../composables/useChat'
import { useMapStore } from '@/stores/map'
import { useUserStore } from '@/stores/user'
import { useConnection } from '../composables/useConnection'
import { useIndustry } from '../composables/useIndustry'
import { getNameByValue, materialMethodList, materialUsageList, materialUsersList } from '@/utils/dictionary'
import IconComputer from './IconComputer.vue'
import IconUser from './IconUser.vue'
import IconAI from './IconAI.vue'
import xss from 'xss'
const form = defineModel()
......@@ -23,7 +25,7 @@ const welcomeMessage = computed(() => {
const scenario = getNameByValue(form.value.scenario_type, materialUsageList)
const connection = connectionList.value.find(item => item.id == form.value.channel)?.type_name
const key = form.value.key_points
return `你将以 <b class="bold">${way}</b> 的方式创作一个 <b class="bold">${type}内容</b> ,该营销内容的所属行业是 <b class="bold">${industry}</b> ,主要使用人员是 <b class="bold">${personnel}</b> ,主要使用的场景是用于 <b class="bold">${scenario}</b> ,主要投放渠道是在 <b class="bold">${connection}</b> ,内容的关键突出点包含了 <b class="bold">${key}</b>。`
return `你将以<b class="bold">${way}</b>的方式创作一个<b class="bold">${type}内容</b>,该营销内容的所属行业是<b class="bold">${industry}</b>,主要使用人员是<b class="bold">${personnel}</b>,主要使用的场景是用于<b class="bold">${scenario}</b>,主要投放渠道是在<b class="bold">${connection}</b>,内容的关键突出点包含了<b class="bold">${key}</b>。`
})
const content = ref('')
......@@ -37,6 +39,10 @@ onMounted(() => {
}
})
watch(welcomeMessage, () => {
messages.value.splice(0, 1, { role: 'system', content: welcomeMessage.value })
})
// 设置为最后一条ai回复的内容
watchEffect(() => {
const botLastMessage = messages.value.findLast(item => item.role === 'bot')
......@@ -60,15 +66,21 @@ async function handleSend(event) {
}
async function handleSendType(type, context) {
const userName = useUserStore().user.name
context = xss(context, {
whiteList: {}, // 白名单为空,表示过滤所有标签
stripIgnoreTag: true, // 过滤所有非白名单标签的HTML
stripIgnoreTagBody: ['script'] // script标签较特殊,需要过滤标签中间的内容
})
switch (type) {
case 2:
context = `请帮我创作一个,${context}`
context = `我是${userName},请帮我创作一个文本内容,${context.replace('你将以在线AI 的方式创作一个文本内容,', '')}`
break
case 3:
context = `请帮我润色一个,${context}`
context = `我是${userName},请帮我润色一个文本内容,${context.replace('你将以在线AI 的方式创作一个文本内容,', '')}`
break
case 4:
context = `请帮我扩写一个,${context}`
context = `我是${userName},请帮我扩写一个文本内容,${context.replace('你将以在线AI 的方式创作一个文本内容,', '')}`
break
}
......@@ -85,6 +97,15 @@ watch(messages.value, () => nextTick(() => scrollToBottom()))
const { copy } = useClipboard()
function handleCopy(content) {
const html = xss(content, {
whiteList: {}, // 白名单为空,表示过滤所有标签
stripIgnoreTag: true, // 过滤所有非白名单标签的HTML
stripIgnoreTagBody: ['script'] // script标签较特殊,需要过滤标签中间的内容
})
copy(html)
}
function parseHtml(content) {
return content.replaceAll('\n', '<br/>')
}
......@@ -101,7 +122,7 @@ function parseHtml(content) {
<div class="chat-message-main">
<div class="chat-message-content" v-html="parseHtml(item.content)"></div>
<div class="chat-message-extra" v-if="item.role !== 'user'">
<el-button size="small" type="primary" @click="copy(item.content)">复制</el-button>
<el-button size="small" type="primary" @click="handleCopy(item.content)">复制</el-button>
<el-button size="small" type="primary" @click="handleSendType(5, item.input || item.content)" v-if="item.role == 'bot'"
>刷新({{ usages.ai_refresh_count }}/{{ usages.ai_refresh_max_count }})</el-button
>
......@@ -233,6 +254,7 @@ function parseHtml(content) {
}
}
.bold {
padding: 0 3px;
font-size: 16px;
font-weight: bold;
color: var(--main-color);
......
......@@ -25,7 +25,7 @@ router.beforeEach(async (to, from, next) => {
path: to.path,
query: {
...to.query,
experiment_id: from.query.experiment_id || '7178628857853902848',
experiment_id: from.query.experiment_id || '7165149417073278976',
student_id: from.query.student_id,
force_tgc: from.query.force_tgc
}
......
......@@ -80,6 +80,12 @@ const studentMenus: IMenuItem[] = [
icon: markRaw(IconImage),
tag: 'v1-experiment-marketing-material-list'
},
{
name: '卡券资料管理',
path: '/material?type=8',
icon: markRaw(IconCard),
tag: 'v1-experiment-marketing-material-list'
},
{
name: '语音资料管理',
path: '/material?type=3',
......@@ -104,12 +110,6 @@ const studentMenus: IMenuItem[] = [
path: '/material?type=7',
icon: markRaw(IconMiniProgram),
tag: 'v1-experiment-marketing-material-list'
},
{
name: '卡券资料管理',
path: '/material?type=8',
icon: markRaw(IconCard),
tag: 'v1-experiment-marketing-material-list'
}
]
},
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论