惠企通
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

286 lines
7.1 KiB

<template>
<view class="dialog-container" v-if="visible">
<view class="dialog-mask" @click="close">×</view>
<view class="dialog-content" :style="{ height: isdx ? '88%' : '686rpx' }">
<view class="butss">
<image
style="width: 152rpx; margin-left: 20rpx; top: -120rpx; left: -2rpx; position: absolute"
src="@/static/img/aiimg.png"
mode="widthFix"
></image>
<view style="display: flex; align-items: center">
<view style="font-size: 50rpx; color: #007fff" @click="close">×</view>
<image
style="width: 40rpx; height: 40rpx; margin-left: 40rpx"
@click="dxclick"
:src="isdx ? '/static/img/sx.png' : '/static/img/fd.png'"
mode=""
></image>
</view>
</view>
<scroll-view class="message-box" scroll-y :style="{ height: isdx ? '80%' : '70%' }">
<view class="akstart" v-if="showfirst">
<view v-for="(msg, index) in messages" :key="index" :class="['message', msg.role]">
<image class="aicon" src="@/static/img/aiicon.png" mode=""></image>
<view class="bubble">
<text>{{ msg.content }}</text>
</view>
</view>
<view v-if="loading" class="loading">AI思考中...</view>
</view>
<view class="cnxw" v-else>
<view class="message assistant">
<image class="aicon" src="@/static/img/aiicon.png" mode="widthFix"></image>
<view class="bubble">
<text class="cwtitle">猜你想问</text>
<u-line color="#99CCFF" margin="20rpx 0"></u-line>
<text class="cwtxt" @click="askClcik('小微企业优惠政策')">小微企业优惠政策</text>
<text class="cwtxt" @click="askClcik('2025年最新小微企业优惠政策')">2025年最新小微企业优惠政策</text>
<text class="cwtxt" @click="askClcik('法律服务')">法律服务</text>
</view>
</view>
</view>
</scroll-view>
<view class="input-box" v-if="showfirst">
<input v-model="inputText" placeholder="请输入问题" @confirm="send" />
<button @click="send" :disabled="loading">发送</button>
</view>
<view class="inputbox" @click="showfirst = true" v-else>
<image style="width: 28rpx; height: 26rpx; margin-right: 8rpx" src="@/static/img/daan.png" mode=""></image>
找不到答案点此提问
</view>
</view>
</view>
</template>
<script setup>
import { ref } from 'vue'
import { ai } from '@/api/index'
const showfirst = ref(false)
const props = defineProps({
visible: Boolean
})
const emit = defineEmits(['close'])
const messages = ref([])
const inputText = ref('')
const loading = ref(false)
const close = () => emit('close')
const send = async () => {
if (!inputText.value.trim()) return
// 用户消息(右侧)
messages.value.push({
role: 'user',
content: inputText.value
})
const question = inputText.value
inputText.value = ''
loading.value = true
try {
const { data } = await ai({
messages: question
})
// AI回复(左侧)
messages.value.push({
role: 'assistant',
content: data.content
})
} catch (e) {
messages.value.push({
role: 'system',
content: '服务异常,请稍后重试'
})
} finally {
loading.value = false
}
}
const askClcik = (val) => {
showfirst.value = true
inputText.value = val
}
const isdx = ref(false)
const dxclick = () => {
isdx.value = !isdx.value
}
</script>
<style scoped lang="scss">
.dialog-container {
position: fixed;
top: 0;
left: 0;
right: 0;
bottom: 0;
z-index: 999;
}
.dialog-mask {
position: absolute;
width: 100%;
height: 100%;
background: rgba(0, 0, 0, 0.5);
}
.dialog-content {
position: absolute;
width: 100%;
bottom: 0;
background: #e7f3ff;
box-sizing: border-box;
border: 2rpx solid #ffffff;
box-shadow: 0rpx -30rpx 20rpx 0rpx rgba(0, 0, 0, 0.2);
border-radius: 96rpx 0rpx 0rpx 0rpx;
display: flex;
flex-direction: column;
}
.message-box {
padding: 30rpx 30rpx 10rpx 30rpx;
box-sizing: border-box;
}
.message {
margin-bottom: 30rpx;
display: flex;
}
.message.user {
justify-content: flex-end;
}
.message.assistant {
justify-content: flex-start;
}
.bubble {
max-width: 75%;
padding: 20rpx 30rpx;
border-radius: 10rpx;
background-color: aliceblue;
}
.user {
.bubble {
background: #95ec69;
}
.aicon {
width: 0;
height: 0;
}
}
.assistant {
.aicon {
width: 64rpx;
}
.bubble {
background: #ffffff;
margin-left: 20rpx;
text {
font-family: Source Han Sans;
font-size: 24rpx;
font-weight: 300;
line-height: 48rpx;
text-align: justify;
/* 浏览器可能不支持 */
display: flex;
align-items: center;
letter-spacing: normal;
color: #000000;
}
}
}
.input-box {
width: 100%;
position: fixed;
bottom: 0;
display: flex;
align-items: center;
padding: 25rpx;
box-sizing: border-box;
border-radius: 40rpx 40rpx 0rpx 0rpx;
background: #ffffff;
box-shadow: 0rpx -2rpx 12rpx 0rpx rgba(0, 0, 0, 0.05);
}
input {
flex: 1;
padding: 16rpx 24rpx;
border: 2rpx solid #ddd;
border-radius: 8rpx;
}
button {
margin-left: 20rpx;
padding: 0 30rpx;
background: #007aff;
color: white;
height: 70rpx;
display: flex;
align-items: center;
}
.loading {
text-align: center;
color: #999;
}
.cwtitle {
color: #007fff !important;
}
.cwtxt {
font-family: Source Han Sans;
font-size: 24rpx;
font-weight: 300;
line-height: 48rpx;
text-align: justify;
/* 浏览器可能不支持 */
display: flex;
align-items: center;
letter-spacing: normal;
color: #666666;
}
.inputbox {
height: 15%;
display: flex;
align-items: center;
justify-content: center;
padding: 20rpx;
border-radius: 40rpx 40rpx 0rpx 0rpx;
background: #ffffff;
box-shadow: 0rpx -2rpx 12rpx 0rpx rgba(0, 0, 0, 0.05);
font-family: Source Han Sans;
font-size: 24rpx;
font-weight: 300;
line-height: 48rpx;
text-align: justify;
/* 浏览器可能不支持 */
display: flex;
align-items: center;
letter-spacing: normal;
color: #007fff;
}
.butss {
width: 100%;
display: flex;
align-items: center;
justify-content: flex-end;
padding: 20rpx;
}
</style>