Compare commits
No commits in common. "b12b64d651f69e602000ca4630476a8df41b4687" and "4d04cbf9a1bb7c817166b1118789189eaa350f2f" have entirely different histories.
b12b64d651
...
4d04cbf9a1
Binary file not shown.
|
Before Width: | Height: | Size: 1.2 MiB |
|
|
@ -1 +0,0 @@
|
||||||
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1692600654355" class="icon" viewBox="0 0 1295 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="4085" xmlns:xlink="http://www.w3.org/1999/xlink" width="252.9296875" height="200"><path d="M694.151529 942.622118l-0.602353-1.024c-0.813176-1.415529-2.228706-3.222588-3.463529-4.818824l-0.421647-0.692706c-0.632471-0.903529-1.385412-1.867294-1.867294-2.770823l-3.102118-4.48753-0.361412-0.421647-151.943529-233.893647a125.711059 125.711059 0 0 1-18.070588-92.79247 122.699294 122.699294 0 0 1 50.507294-78.817883 116.615529 116.615529 0 0 1 118.061176-8.583529V123.392C682.706824 55.416471 733.936941 0 796.882824 0c62.855529 0 114.176 55.416471 114.176 123.482353v125.590588a91.557647 91.557647 0 0 1 28.672-4.668235c29.756235 0 57.886118 14.336 77.703529 39.092706a96.527059 96.527059 0 0 1 52.073412-16.143059 94.870588 94.870588 0 0 1 58.729411 20.751059c13.101176 10.24 24.094118 23.491765 32.075295 38.881882 9.276235-2.921412 18.913882-4.517647 28.581647-4.517647 58.578824 0 106.194824 55.416471 106.194823 123.482353v328.523294c0 72.673882-32.135529 152.997647-81.859765 204.739765-27.708235 28.822588-57.524706 44.784941-84.239058 44.784941H804.382118c-60.837647 0-88.154353-45.116235-110.230589-81.377882z m441.434353 20.660706c9.848471 0 34.334118-16.444235 58.337883-52.856471 25.750588-39.303529 40.508235-86.347294 40.508235-128.903529V443.602824c0-27.617882-17.046588-51.591529-36.472471-51.59153a25.901176 25.901176 0 0 0-12.288 3.162353v118.181647h-0.12047c-1.385412 19.817412-17.287529 35.177412-36.472471 35.267765-19.245176 0-35.237647-15.661176-36.532706-35.237647h-0.060235V410.804706l-2.198588-28.792471c-1.897412-25.660235-18.311529-46.592-36.653177-46.592-8.131765 0-16.474353 4.517647-23.070117 12.047059v127.819294c-0.060235 20.901647-16.444235 37.797647-36.683294 37.857883-20.178824-0.090353-36.532706-16.986353-36.592942-37.857883v-112.459294l-2.740705-13.131294c-4.517647-21.865412-19.696941-38.309647-35.147295-38.309647-10.541176 0-21.082353 7.469176-28.220235 19.606588l-1.174588 126.795294v47.676236c0 18.492235-14.667294 33.701647-32.557177 33.701647h-7.920941c-17.980235 0-32.587294-15.209412-32.587294-33.701647V124.897882l-0.210823-13.43247c0-28.461176-19.998118-51.501176-44.724706-51.501177-24.696471 0-44.694588 23.100235-44.694589 51.501177l1.596236 369.844706c0.090353 1.114353 0.120471 2.258824 0.12047 3.403294v146.733176c-0.301176 18.883765-13.944471 34.695529-32.045176 37.104941a36.743529 36.743529 0 0 1-40.056471-27.527529l-13.763764-41.472a49.784471 49.784471 0 0 0-31.774118-21.985882 48.489412 48.489412 0 0 0-37.466353 7.770353c-22.889412 15.902118-28.943059 47.947294-13.613176 71.619764l156.641882 240.730353 0.512 0.662588 1.927529 2.95153 2.409412 3.70447c1.475765 2.409412 3.072 4.698353 4.487529 6.475295l1.024 1.325176 0.752942 1.656471c24.395294 40.297412 33.792 49.001412 52.314353 49.001411h335.209411v-0.240941 0.060236z" fill="#000000" p-id="4086"></path><path d="M308.495059 30.117647h60.235294v843.294118h-60.235294zM450.951529 888.832l-105.953882 105.984a9.035294 9.035294 0 0 1-12.769882 0l-105.984-105.984A9.035294 9.035294 0 0 1 232.628706 873.411765h211.937882a9.035294 9.035294 0 0 1 6.384941 15.420235z" fill="#000000" p-id="4087"></path><path d="M150.588235 1024H90.352941V180.705882h60.235294z" fill="#000000" p-id="4088"></path><path d="M8.131765 165.285647l105.953882-105.984a9.035294 9.035294 0 0 1 12.769882 0l105.984 105.984A9.035294 9.035294 0 0 1 226.424471 180.705882H14.516706a9.035294 9.035294 0 0 1-6.415059-15.420235z" fill="#000000" p-id="4089"></path></svg>
|
|
||||||
|
Before Width: | Height: | Size: 3.6 KiB |
|
|
@ -61,10 +61,10 @@ service.interceptors.response.use(
|
||||||
error => {
|
error => {
|
||||||
const authModal = useAuthModal();
|
const authModal = useAuthModal();
|
||||||
const userInfo = useUserInfo();
|
const userInfo = useUserInfo();
|
||||||
|
|
||||||
if (error.message == 'canceled') return Promise.reject(error)
|
if (error.message == 'canceled') return Promise.reject(error)
|
||||||
const res = error.response?.data
|
const res = error.response?.data
|
||||||
|
|
||||||
const { requestBaseUrl } = error.config
|
const { requestBaseUrl } = error.config
|
||||||
if (requestBaseUrl == 'chat') {
|
if (requestBaseUrl == 'chat') {
|
||||||
if (res.errcode == 401) {
|
if (res.errcode == 401) {
|
||||||
|
|
@ -73,9 +73,6 @@ service.interceptors.response.use(
|
||||||
userInfo.updateUserInfo({});
|
userInfo.updateUserInfo({});
|
||||||
localCache.remove('auth');
|
localCache.remove('auth');
|
||||||
localCache.remove('userInfo');
|
localCache.remove('userInfo');
|
||||||
} else if (res.errcode == 10011) {
|
|
||||||
localCache.remove('auth');
|
|
||||||
localCache.remove('userInfo');
|
|
||||||
} else {
|
} else {
|
||||||
showToast(res.errmsg || 'Error')
|
showToast(res.errmsg || 'Error')
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -16,7 +16,6 @@ const router = createRouter({
|
||||||
meta: {
|
meta: {
|
||||||
title: "首页", // 页面标题
|
title: "首页", // 页面标题
|
||||||
group: 'home', // 导航归属
|
group: 'home', // 导航归属
|
||||||
footer: false,
|
|
||||||
},
|
},
|
||||||
component: () => import("@/views/home/index.vue"),
|
component: () => import("@/views/home/index.vue"),
|
||||||
},
|
},
|
||||||
|
|
@ -34,7 +33,7 @@ const router = createRouter({
|
||||||
component: () => import("@/views/chat/index.vue"),
|
component: () => import("@/views/chat/index.vue"),
|
||||||
meta: {
|
meta: {
|
||||||
title: 'AI助理',
|
title: 'AI助理',
|
||||||
|
footer: false,
|
||||||
}
|
}
|
||||||
}]
|
}]
|
||||||
},
|
},
|
||||||
|
|
|
||||||
|
|
@ -1,19 +1,16 @@
|
||||||
<template>
|
<template>
|
||||||
<Layout path="/chat">
|
<Layout path="/chat">
|
||||||
<div class="h-full flex flex-col justify-center text-white">
|
<div class="h-full flex flex-col justify-center text-white">
|
||||||
<div class="min-h-900px">
|
<TitleComp title="AI助理" :src="TitleSrc" />
|
||||||
<TitleComp title="AI助理" :src="TitleSrc" />
|
<div class="mt-36px text-27px font-bold">
|
||||||
<div class="mt-36px text-27px font-bold">CHATGPT接口AI助手</div>
|
CHATGPT接口AI助手
|
||||||
<div class="text-22px mt-28px text-[#C2C5CA] leading-29px">
|
</div>
|
||||||
在AI助理板块,用户可以上传文件给AI翻阅并帮助您解决问题,您可以自己输入关键字或者使用自带的prompt模板
|
<div class="text-22px mt-28px text-[#C2C5CA] leading-29px">
|
||||||
</div>
|
在AI助理板块,用户可以上传文件给AI翻阅并帮助您解决问题,您可以自己输入关键字或者使用自带的prompt模板
|
||||||
|
</div>
|
||||||
<div class="text-center">
|
|
||||||
<img
|
<div class="text-center">
|
||||||
class="w-618px mx-auto"
|
<img class="w-618px mx-auto" src="@/assets/images/ai_assistant_02.png" />
|
||||||
src="@/assets/images/ai_assistant_02.png"
|
|
||||||
/>
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</Layout>
|
</Layout>
|
||||||
|
|
|
||||||
|
|
@ -1,26 +1,21 @@
|
||||||
<template>
|
<template>
|
||||||
<Layout path="/business">
|
<Layout path="/business">
|
||||||
<div class="h-full flex flex-col justify-center text-white">
|
<div class="h-full flex flex-col justify-center text-white">
|
||||||
<div class="min-h-900px">
|
<TitleComp title="AI商情" :src="TitleSrc">
|
||||||
<TitleComp title="AI商情" :src="TitleSrc">
|
<template #en>
|
||||||
<template #en>
|
<img class="h-104px w-auto" :src="TitleSrc" alt="" srcset="" />
|
||||||
<img class="h-104px w-auto" :src="TitleSrc" alt="" srcset="" />
|
</template>
|
||||||
</template>
|
</TitleComp>
|
||||||
</TitleComp>
|
<div class="mt-36px text-27px font-bold">AI商情预测</div>
|
||||||
<div class="mt-36px text-27px font-bold">AI商情预测</div>
|
<div class="text-22px mt-28px text-[#C2C5CA] leading-29px">
|
||||||
<div class="text-22px mt-28px text-[#C2C5CA] leading-29px">
|
在AI助理板块,用户可以上传文件给AI翻阅并帮助您解决问题,您可以自己输入关键字或者使用自带的prompt模板在AI助理板块,用户可以上传文件给AI翻阅并帮助您解决问题,您可以自己输入关键字或者使用自带的prompt模
|
||||||
在AI助理板块,用户可以上传文件给AI翻阅并帮助您解决问题,您可以自己输入关键字或者使用自带的prompt模板在AI助理板块,用户可以上传文件给AI翻阅并帮助您解决问题,您可以自己输入关键字或者使用自带的prompt模
|
</div>
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="mt-61px">
|
<div class="mt-61px">
|
||||||
<img
|
<img class="w-658px mx-auto inline-block" src="@/assets/images/ai_busionessinfomation_01.png" />
|
||||||
class="w-658px mx-auto inline-block"
|
</div>
|
||||||
src="@/assets/images/ai_busionessinfomation_01.png"
|
|
||||||
/>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</Layout>
|
||||||
</div>
|
|
||||||
</Layout>
|
|
||||||
</template>
|
</template>
|
||||||
<script setup>
|
<script setup>
|
||||||
import TitleComp from '@/views/home/components/title.vue'
|
import TitleComp from '@/views/home/components/title.vue'
|
||||||
|
|
|
||||||
|
|
@ -35,13 +35,12 @@
|
||||||
<div class="mt-10px h-600px">
|
<div class="mt-10px h-600px">
|
||||||
<ScrollContainer class="!h-full" ref="scrollRefAi">
|
<ScrollContainer class="!h-full" ref="scrollRefAi">
|
||||||
<div class="px-0">
|
<div class="px-0">
|
||||||
<div class="text-27px text-white leading-34px">
|
<div class="text-27px text-white opacity-40 leading-34px">
|
||||||
<div class="text-center" v-if="contentLoading">
|
<div class="text-center" v-if="contentLoading">
|
||||||
<van-loading type="spinner" size="24"/>
|
<van-loading type="spinner" size="24"/>
|
||||||
</div>
|
</div>
|
||||||
<div class="text-white" v-else>
|
<div v-else>
|
||||||
<TextComponent class="cu-text" :text="contenText" :inversion="false"></TextComponent>
|
{{ contenText }}
|
||||||
<!-- {{ contenText }} -->
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<Message
|
<Message
|
||||||
|
|
@ -90,7 +89,6 @@ import { ref, computed, nextTick } from 'vue'
|
||||||
import http from '@/io/request'
|
import http from '@/io/request'
|
||||||
import { v4 as uuidv4 } from 'uuid'
|
import { v4 as uuidv4 } from 'uuid'
|
||||||
import { useAiChat } from '@/stores/aichat'
|
import { useAiChat } from '@/stores/aichat'
|
||||||
import TextComponent from './text.vue'
|
|
||||||
const props = defineProps({
|
const props = defineProps({
|
||||||
top: {
|
top: {
|
||||||
type: String,
|
type: String,
|
||||||
|
|
@ -140,9 +138,7 @@ const options = [
|
||||||
name: 'Q&A',
|
name: 'Q&A',
|
||||||
value: `
|
value: `
|
||||||
Instructions: List the highlights of the content in the form of Q&As, no less than 3 Q&As. Here is an example of the template output you should use:
|
Instructions: List the highlights of the content in the form of Q&As, no less than 3 Q&As. Here is an example of the template output you should use:
|
||||||
|
##### Who are you?
|
||||||
Who are you?
|
|
||||||
|
|
||||||
I am AI.
|
I am AI.
|
||||||
|
|
||||||
Be sure not to write out the template examples.
|
Be sure not to write out the template examples.
|
||||||
|
|
@ -364,12 +360,6 @@ function scrollToBottomIfAtBottom() {
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style lang="scss">
|
<style lang="scss">
|
||||||
.cu-text{
|
|
||||||
&.message-reply{
|
|
||||||
background: transparent !important;
|
|
||||||
@apply text-sm;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
.cu-field-ai {
|
.cu-field-ai {
|
||||||
height: 100% !important;
|
height: 100% !important;
|
||||||
background-color: #1e1f21;
|
background-color: #1e1f21;
|
||||||
|
|
|
||||||
|
|
@ -11,15 +11,15 @@
|
||||||
></SvgIcon>
|
></SvgIcon>
|
||||||
<SvgIcon class="text-white text-40px mb-46px" name="dh"></SvgIcon>
|
<SvgIcon class="text-white text-40px mb-46px" name="dh"></SvgIcon>
|
||||||
<div class="flex-1"></div>
|
<div class="flex-1"></div>
|
||||||
<!-- <SvgIcon class="text-white text-40px mb-46px" name="人工客服"></SvgIcon>
|
<SvgIcon class="text-white text-40px mb-46px" name="人工客服"></SvgIcon>
|
||||||
<SvgIcon class="text-white text-40px mb-46px" name="疑问"></SvgIcon> -->
|
<SvgIcon class="text-white text-40px mb-46px" name="疑问"></SvgIcon>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<van-popup v-model:show="show" position="left" class="slider-class">
|
<van-popup v-model:show="show" position="left" class="slider-class">
|
||||||
<div class="w-479px h-full flex flex-col overflow-hidden">
|
<div class="w-479px h-full flex flex-col">
|
||||||
<div class="h-100px"></div>
|
<div class="h-100px"></div>
|
||||||
<div
|
<div
|
||||||
class="bg-gradient-to-b to-[#101011] from-[#414548] flex-1 border-t-7px border-[#3662FE] flex flex-col items-center overflow-y-auto"
|
class="bg-gradient-to-b to-[#101011] from-[#414548] flex-1 border-t-7px border-[#3662FE] flex flex-col items-center"
|
||||||
>
|
>
|
||||||
<SilderBtn @click="openTemplateModal">
|
<SilderBtn @click="openTemplateModal">
|
||||||
<template #icon>
|
<template #icon>
|
||||||
|
|
@ -76,7 +76,7 @@
|
||||||
:data="item"
|
:data="item"
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
<!-- <SilderBtn>
|
<SilderBtn>
|
||||||
<template #icon>
|
<template #icon>
|
||||||
<SvgIcon
|
<SvgIcon
|
||||||
class="text-white text-35px transform rotate-45"
|
class="text-white text-35px transform rotate-45"
|
||||||
|
|
@ -93,7 +93,7 @@
|
||||||
></SvgIcon>
|
></SvgIcon>
|
||||||
</template>
|
</template>
|
||||||
<div>帮助</div>
|
<div>帮助</div>
|
||||||
</SilderBtn> -->
|
</SilderBtn>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</van-popup>
|
</van-popup>
|
||||||
|
|
|
||||||
|
|
@ -56,7 +56,7 @@
|
||||||
<UploadComp @change="handleFileChange">
|
<UploadComp @change="handleFileChange">
|
||||||
<van-button
|
<van-button
|
||||||
type="primary"
|
type="primary"
|
||||||
class="!rounded-2px !h-53px !mr-14px border-[#414548] text-white !border-none !text-22px !leading-53px"
|
class="!rounded-2px !h-53px !mr-14px border-[#414548] text-white !border-none text-22px !leading-53px"
|
||||||
>
|
>
|
||||||
<template #icon>
|
<template #icon>
|
||||||
<SvgIcon name="cloud-upload" class="text-25px mr-13px" />
|
<SvgIcon name="cloud-upload" class="text-25px mr-13px" />
|
||||||
|
|
@ -68,7 +68,7 @@
|
||||||
<van-button
|
<van-button
|
||||||
@click="handleSubmit"
|
@click="handleSubmit"
|
||||||
type="primary"
|
type="primary"
|
||||||
class="!rounded-2px !h-53px border-[#414548] text-white !border-none !text-22px"
|
class="!rounded-2px !h-53px border-[#414548] text-white !border-none text-22px"
|
||||||
>
|
>
|
||||||
<template #icon>
|
<template #icon>
|
||||||
<SvgIcon name="generated" class="text-25px mr-13px" />
|
<SvgIcon name="generated" class="text-25px mr-13px" />
|
||||||
|
|
@ -100,7 +100,7 @@ import UploadComp from './components/upload-comp.vue'
|
||||||
import extractTextFromPDF from '@/utils/pdfUtils.js'
|
import extractTextFromPDF from '@/utils/pdfUtils.js'
|
||||||
import extractDocxText from '@/utils/docxUtils.js'
|
import extractDocxText from '@/utils/docxUtils.js'
|
||||||
import { getFileInfo } from '@/utils/fileUtils.js'
|
import { getFileInfo } from '@/utils/fileUtils.js'
|
||||||
import { showToast } from 'vant'
|
import { showToast } from "vant";
|
||||||
import { useAuthModal } from '@/stores/authModal'
|
import { useAuthModal } from '@/stores/authModal'
|
||||||
import { useUserInfo } from '@/stores/userInfo'
|
import { useUserInfo } from '@/stores/userInfo'
|
||||||
const userInfo = useUserInfo()
|
const userInfo = useUserInfo()
|
||||||
|
|
@ -136,7 +136,7 @@ const currentChart = computed(() => chatStore.getCurrentChat)
|
||||||
async function handleFileChange(file) {
|
async function handleFileChange(file) {
|
||||||
if (!isLogin.value) {
|
if (!isLogin.value) {
|
||||||
authModal.setAuthModalType('login')
|
authModal.setAuthModalType('login')
|
||||||
authModal.showAuthModal()
|
authModal.showAuthModal()
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -248,7 +248,7 @@ function handleSubmit() {
|
||||||
}
|
}
|
||||||
|
|
||||||
async function onConversation(action = 'next', file, fileText) {
|
async function onConversation(action = 'next', file, fileText) {
|
||||||
let message = inputValue.value || fileText
|
let message = inputValue.value || fileText
|
||||||
if (loading.value) return
|
if (loading.value) return
|
||||||
if ((!message || message.trim() === '') && action == 'next') return
|
if ((!message || message.trim() === '') && action == 'next') return
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,277 +0,0 @@
|
||||||
<template>
|
|
||||||
<van-popup
|
|
||||||
v-model:show="isShow"
|
|
||||||
position="center"
|
|
||||||
closeable
|
|
||||||
:style="{
|
|
||||||
background: '#161718',
|
|
||||||
borderRadius: '6px',
|
|
||||||
width: '90%',
|
|
||||||
}"
|
|
||||||
>
|
|
||||||
<div class="text-white">
|
|
||||||
<!-- <div class="bg-[#111F63] w-75 p-6 flex-1 flex-none flex flex-col">
|
|
||||||
<div class="text-2xl font-bold">需求留言问卷</div>
|
|
||||||
<div class="mt-9 text-base font-bold flex-1">
|
|
||||||
<p>感谢您对海兔AI的关注</p>
|
|
||||||
<p>请留下您的信息</p>
|
|
||||||
<p>我们会尽快联系您!</p>
|
|
||||||
</div>
|
|
||||||
<div class="w-43 h-43 border"></div>
|
|
||||||
<div class="mt-6 text-base">了解更多,一键扫码咨询</div>
|
|
||||||
</div> -->
|
|
||||||
<div class="flex justify-between pt-40px">
|
|
||||||
<div class="text-22px text-white text-opacity-40">
|
|
||||||
<p class="text-30px font-bold text-white">感谢您对海兔AI的关注</p>
|
|
||||||
<p class="mt-20px">请留下您的信息</p>
|
|
||||||
<p class="mt-10px">我们会尽快联系您!</p>
|
|
||||||
</div>
|
|
||||||
<!-- <div>
|
|
||||||
<div class="w-200px h-200px border"></div>
|
|
||||||
</div> -->
|
|
||||||
</div>
|
|
||||||
<div class="p-17px flex-1 text-white mt-20px">
|
|
||||||
<div class="text-27px mb-22px">
|
|
||||||
<div class="required">需求类型</div>
|
|
||||||
<div class="flex items-center mt-14px">
|
|
||||||
<van-radio-group
|
|
||||||
class="cu-radio"
|
|
||||||
shape="dot"
|
|
||||||
direction="horizontal"
|
|
||||||
v-model="form.type_id"
|
|
||||||
>
|
|
||||||
<van-radio
|
|
||||||
v-for="(item, i) in typeList"
|
|
||||||
:key="i"
|
|
||||||
:name="item.id"
|
|
||||||
>{{ item.name }}</van-radio
|
|
||||||
>
|
|
||||||
</van-radio-group>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="text-27px mb-22px">
|
|
||||||
<div class="required">性别</div>
|
|
||||||
<div class="flex items-center mt-14px">
|
|
||||||
<van-radio-group
|
|
||||||
class="cu-radio"
|
|
||||||
shape="dot"
|
|
||||||
direction="horizontal"
|
|
||||||
v-model="form.sex"
|
|
||||||
>
|
|
||||||
<van-radio name="1">男</van-radio>
|
|
||||||
<van-radio name="0">女</van-radio>
|
|
||||||
</van-radio-group>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="text-27px mb-22px">
|
|
||||||
<div class="required">姓名</div>
|
|
||||||
<div class="flex items-center mt-14px">
|
|
||||||
<van-field
|
|
||||||
v-model="form.name"
|
|
||||||
placeholder="请输入姓名"
|
|
||||||
class="cu-field-input !text-white"
|
|
||||||
></van-field>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="text-27px mb-22px">
|
|
||||||
<div class="required">联系方式</div>
|
|
||||||
<div class="flex items-center mt-14px">
|
|
||||||
<van-field
|
|
||||||
v-model="form.phone"
|
|
||||||
placeholder="请输入手机号"
|
|
||||||
class="cu-field-input !text-white"
|
|
||||||
></van-field>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="text-27px mb-22px">
|
|
||||||
<div class="">公司名称</div>
|
|
||||||
<div class="flex items-center mt-14px">
|
|
||||||
<van-field
|
|
||||||
v-model="form.company"
|
|
||||||
placeholder="请输入公司名称"
|
|
||||||
class="cu-field-input !text-white"
|
|
||||||
></van-field>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="text-27px mb-22px">
|
|
||||||
<div class="">企业邮箱</div>
|
|
||||||
<div class="flex items-center mt-14px">
|
|
||||||
<van-field
|
|
||||||
v-model="form.email"
|
|
||||||
placeholder="请输入企业邮箱"
|
|
||||||
class="cu-field-input !text-white"
|
|
||||||
></van-field>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="text-27px mb-22px">
|
|
||||||
<div class="">职位</div>
|
|
||||||
<div class="flex items-center mt-14px">
|
|
||||||
<van-field
|
|
||||||
v-model="form.job"
|
|
||||||
placeholder="请输入职位"
|
|
||||||
class="cu-field-input !text-white"
|
|
||||||
></van-field>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="text-27px mb-22px">
|
|
||||||
<div class="">需求描述</div>
|
|
||||||
<div class="flex items-center mt-14px">
|
|
||||||
<van-field
|
|
||||||
v-model="form.content"
|
|
||||||
type="textarea"
|
|
||||||
placeholder="请输入需求描述"
|
|
||||||
class="cu-field-input !text-white"
|
|
||||||
></van-field>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="text-right flex mt-30px">
|
|
||||||
<van-button
|
|
||||||
@click="handleSumbit"
|
|
||||||
type="primary"
|
|
||||||
class="!rounded-2px !h-66px w-full border-[#414548] text-white !border-none !text-27px"
|
|
||||||
>
|
|
||||||
确认
|
|
||||||
</van-button>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</van-popup>
|
|
||||||
</template>
|
|
||||||
<script setup>
|
|
||||||
import { ref, reactive, toRaw, onBeforeMount, computed, watch } from 'vue'
|
|
||||||
import { showToast } from 'vant'
|
|
||||||
import http from '@/io/request'
|
|
||||||
const emit = defineEmits(['update:value'])
|
|
||||||
|
|
||||||
const telReg = /^1[3-9]\d{9}$/
|
|
||||||
const emailReg = /^[\w\.-]+@[a-zA-Z\d\.-]+\.[a-zA-Z]{2,}$/
|
|
||||||
|
|
||||||
const props = defineProps({
|
|
||||||
value: {
|
|
||||||
type: Boolean,
|
|
||||||
default: false,
|
|
||||||
},
|
|
||||||
})
|
|
||||||
const isShow = computed({
|
|
||||||
get() {
|
|
||||||
return props.value
|
|
||||||
},
|
|
||||||
set(val) {
|
|
||||||
emit('update:value', val)
|
|
||||||
},
|
|
||||||
})
|
|
||||||
|
|
||||||
const defaultForm = {
|
|
||||||
type_id: '',
|
|
||||||
sex: 1,
|
|
||||||
name: '',
|
|
||||||
phone: '',
|
|
||||||
company: '',
|
|
||||||
email: '',
|
|
||||||
job: '',
|
|
||||||
content: '',
|
|
||||||
}
|
|
||||||
const typeList = ref([])
|
|
||||||
const loading = ref(false)
|
|
||||||
const form = reactive(Object.assign({}, defaultForm))
|
|
||||||
const getTypes = async () => {
|
|
||||||
const res = await http.get('/api/keywords?type_key=feedback')
|
|
||||||
typeList.value = res
|
|
||||||
if (res.length && !form.type_id) {
|
|
||||||
form.type_id = res[0].id
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function handleSumbit() {
|
|
||||||
const _form = toRaw(form)
|
|
||||||
if (!_form.type_id) return showToast('请选择需求类型')
|
|
||||||
if (!_form.name) return showToast('请输入姓名')
|
|
||||||
if (!_form.phone) return showToast('请输入手机号')
|
|
||||||
if (!telReg.test(_form.phone)) return showToast('请输入正确的手机号')
|
|
||||||
if (_form.email && !emailReg.test(_form.email))
|
|
||||||
return showToast('请输入正确的邮箱')
|
|
||||||
if (loading.value) return
|
|
||||||
|
|
||||||
loading.value = true
|
|
||||||
http
|
|
||||||
.post('/api/feedback', _form)
|
|
||||||
.then(() => {
|
|
||||||
showToast('提交成功')
|
|
||||||
form.value = Object.assign({}, defaultForm)
|
|
||||||
isShow.value = false
|
|
||||||
loading.value = false
|
|
||||||
})
|
|
||||||
.catch(() => {
|
|
||||||
loading.value = false
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
watch(
|
|
||||||
() => isShow.value,
|
|
||||||
(val) => {
|
|
||||||
if (!val) {
|
|
||||||
form.value = Object.assign({}, defaultForm)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
)
|
|
||||||
|
|
||||||
onBeforeMount(() => {
|
|
||||||
getTypes()
|
|
||||||
})
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<style lang="scss">
|
|
||||||
.required {
|
|
||||||
position: relative;
|
|
||||||
&::before {
|
|
||||||
position: absolute;
|
|
||||||
display: inline-block;
|
|
||||||
color: #ff4d4f;
|
|
||||||
font-size: 28px;
|
|
||||||
line-height: 1;
|
|
||||||
left: -20px;
|
|
||||||
top: 50%;
|
|
||||||
transform: translateY(-50%);
|
|
||||||
content: '*';
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.cu-field-input {
|
|
||||||
background: #161718;
|
|
||||||
border: 1px solid #414548;
|
|
||||||
color: #fff !important;
|
|
||||||
font-size: 22px;
|
|
||||||
padding: 0 19px;
|
|
||||||
|
|
||||||
display: flex;
|
|
||||||
align-items: center;
|
|
||||||
&::placeholder {
|
|
||||||
color: #fff;
|
|
||||||
opacity: 0.4;
|
|
||||||
}
|
|
||||||
input {
|
|
||||||
color: #fff;
|
|
||||||
height: 72px;
|
|
||||||
}
|
|
||||||
textarea {
|
|
||||||
color: #fff;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
.cu-radio {
|
|
||||||
.van-radio__icon--dot {
|
|
||||||
height: 24px;
|
|
||||||
width: 24px;
|
|
||||||
border-radius: 4px;
|
|
||||||
&__icon {
|
|
||||||
width: 80%;
|
|
||||||
height: 80%;
|
|
||||||
border-radius: 4px;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
.van-radio__label {
|
|
||||||
font-size: 22px;
|
|
||||||
color: white;
|
|
||||||
margin-left: 8px !important;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
|
|
@ -27,10 +27,7 @@
|
||||||
一些相关的描述文字一些相关的描述文字一些相关的描述文字一些相关的描述文字一些相关的描述文字一些相关的描述文字一些相关的描述文字一些相关的描述文字一些相关的描述文字
|
一些相关的描述文字一些相关的描述文字一些相关的描述文字一些相关的描述文字一些相关的描述文字一些相关的描述文字一些相关的描述文字一些相关的描述文字一些相关的描述文字
|
||||||
</div>
|
</div>
|
||||||
<div class="mt-43px">
|
<div class="mt-43px">
|
||||||
<van-button
|
<van-button type="primary" class="!rounded-full !h-56px !text-27px"
|
||||||
@click="isShow = true"
|
|
||||||
type="primary"
|
|
||||||
class="!rounded-full !h-56px !text-27px"
|
|
||||||
>立即体验</van-button
|
>立即体验</van-button
|
||||||
>
|
>
|
||||||
</div>
|
</div>
|
||||||
|
|
@ -66,10 +63,7 @@
|
||||||
一些相关的描述文字一些相关的描述文字一些相关的描述文字一些相关的描述文字一些相关的描述文字一些相关的描述文字一些相关的描述文字一些相关的描述文字一些相关的描述文字
|
一些相关的描述文字一些相关的描述文字一些相关的描述文字一些相关的描述文字一些相关的描述文字一些相关的描述文字一些相关的描述文字一些相关的描述文字一些相关的描述文字
|
||||||
</div>
|
</div>
|
||||||
<div class="mt-43px">
|
<div class="mt-43px">
|
||||||
<van-button
|
<van-button type="primary" class="!rounded-full !h-56px !text-27px"
|
||||||
@click="isShow = true"
|
|
||||||
type="primary"
|
|
||||||
class="!rounded-full !h-56px !text-27px"
|
|
||||||
>立即体验</van-button
|
>立即体验</van-button
|
||||||
>
|
>
|
||||||
</div>
|
</div>
|
||||||
|
|
@ -216,7 +210,6 @@
|
||||||
</div>
|
</div>
|
||||||
<div class="mt-54px text-center pb-192px">
|
<div class="mt-54px text-center pb-192px">
|
||||||
<van-button
|
<van-button
|
||||||
@click="isShow = true"
|
|
||||||
type="primary"
|
type="primary"
|
||||||
class="!rounded-full w-300px !h-68px !text-23px"
|
class="!rounded-full w-300px !h-68px !text-23px"
|
||||||
>联系我们</van-button
|
>联系我们</van-button
|
||||||
|
|
@ -240,18 +233,14 @@
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</van-popup>
|
</van-popup>
|
||||||
|
|
||||||
<Contacts v-model:value="isShow"></Contacts>
|
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
<script setup>
|
<script setup>
|
||||||
import Contacts from './components/contacts.vue'
|
|
||||||
import TagItem from './components/tag-item.vue'
|
import TagItem from './components/tag-item.vue'
|
||||||
import videoBg2 from '@/assets/images/stream/l2.png'
|
import videoBg2 from '@/assets/images/stream/l2.png'
|
||||||
import videoBg3 from '@/assets/images/stream/l3.png'
|
import videoBg3 from '@/assets/images/stream/l3.png'
|
||||||
import videoBg4 from '@/assets/images/stream/l4.png'
|
import videoBg4 from '@/assets/images/stream/l4.png'
|
||||||
import { ref } from 'vue'
|
import { ref } from 'vue'
|
||||||
const isShow = ref(false)
|
|
||||||
const videoShow = ref(false)
|
const videoShow = ref(false)
|
||||||
const video = ref(null)
|
const video = ref(null)
|
||||||
const videos = ref([
|
const videos = ref([
|
||||||
|
|
|
||||||
|
|
@ -1,18 +1,16 @@
|
||||||
<template>
|
<template>
|
||||||
<Layout path="/communication">
|
<Layout path="/communication">
|
||||||
<div class="h-full flex flex-col justify-center text-white">
|
<div class="h-full flex flex-col justify-center text-white">
|
||||||
<div class="min-h-900px">
|
<TitleComp title="AI传播" :src="TitleSrc"></TitleComp>
|
||||||
<TitleComp title="AI传播" :src="TitleSrc"></TitleComp>
|
<div class="mt-34px text-27px font-bold">AI虚拟人直播</div>
|
||||||
<div class="mt-34px text-27px font-bold">AI虚拟人直播</div>
|
<div class="text-22px mt-36px text-[#C2C5CA] leading-29px">
|
||||||
<div class="text-22px mt-36px text-[#C2C5CA] leading-29px">
|
在AI助理板块,用户可以上传文件给AI翻阅并帮助您解决问题,您可以自己输入关键字或者使用自带的prompt模板在AI助理板块,用户可以上传文件给AI翻阅并帮助您解决问题,您可以自己输入关键字或者使用自带的prompt模
|
||||||
在AI助理板块,用户可以上传文件给AI翻阅并帮助您解决问题,您可以自己输入关键字或者使用自带的prompt模板在AI助理板块,用户可以上传文件给AI翻阅并帮助您解决问题,您可以自己输入关键字或者使用自带的prompt模
|
</div>
|
||||||
</div>
|
<div class="mt-139px">
|
||||||
<div class="mt-139px">
|
<img
|
||||||
<img
|
class="w-670px mx-auto inline-block"
|
||||||
class="w-670px mx-auto inline-block"
|
src="@/assets/images/ai_stream_01.png"
|
||||||
src="@/assets/images/ai_stream_01.png"
|
/>
|
||||||
/>
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</Layout>
|
</Layout>
|
||||||
|
|
|
||||||
|
|
@ -31,9 +31,6 @@
|
||||||
>
|
>
|
||||||
<component :is="item.component" />
|
<component :is="item.component" />
|
||||||
</swiper-slide>
|
</swiper-slide>
|
||||||
<swiper-slide class="!h-690px">
|
|
||||||
<Footer></Footer>
|
|
||||||
</swiper-slide>
|
|
||||||
</swiper>
|
</swiper>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
@ -62,7 +59,6 @@ import Assistant from '@/views/assistant/index.vue'
|
||||||
import Business from '@/views/business/index.vue'
|
import Business from '@/views/business/index.vue'
|
||||||
import Stream from '@/views/communication/index.vue'
|
import Stream from '@/views/communication/index.vue'
|
||||||
import Training from '@/views/training/index.vue'
|
import Training from '@/views/training/index.vue'
|
||||||
import Footer from '@/layouts/Footer.vue'
|
|
||||||
|
|
||||||
import { Swiper, SwiperSlide } from 'swiper/vue'
|
import { Swiper, SwiperSlide } from 'swiper/vue'
|
||||||
import { Mousewheel, Pagination } from 'swiper/modules'
|
import { Mousewheel, Pagination } from 'swiper/modules'
|
||||||
|
|
|
||||||
|
|
@ -1,19 +1,17 @@
|
||||||
<template>
|
<template>
|
||||||
<Layout path="/training">
|
<Layout path="/training">
|
||||||
<div class="h-full flex flex-col justify-center text-white">
|
<div class="h-full flex flex-col justify-center text-white">
|
||||||
<div class="min-h-900px">
|
<TitleComp title="AI培训" :src="TitleSrc"></TitleComp>
|
||||||
<TitleComp title="AI培训" :src="TitleSrc"></TitleComp>
|
<div class="mt-38px text-27px font-bold">AI培训课程</div>
|
||||||
<div class="mt-38px text-27px font-bold">AI培训课程</div>
|
<div class="text-22px mt-36px text-[#C2C5CA] leading-29px">
|
||||||
<div class="text-22px mt-36px text-[#C2C5CA] leading-29px">
|
在AI助理板块,用户可以上传文件给AI翻阅并帮助您解决问题,您可以自己输入关键字或者使用自带的prompt模板在AI助理板块,用户可以上传文件给AI翻阅并帮助您解决问题,您可以自己输入关键字或者使用自带的prompt模板在AI
|
||||||
在AI助理板块,用户可以上传文件给AI翻阅并帮助您解决问题,您可以自己输入关键字或者使用自带的prompt模板在AI助理板块,用户可以上传文件给AI翻阅并帮助您解决问题,您可以自己输入关键字或者使用自带的prompt模板在AI
|
</div>
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="mt-69px">
|
<div class="mt-69px">
|
||||||
<img
|
<img
|
||||||
class="w-670px mx-auto inline-block"
|
class="w-670px mx-auto inline-block"
|
||||||
src="@/assets/images/cultivate_01.png"
|
src="@/assets/images/ai_stream_01.png"
|
||||||
/>
|
/>
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</Layout>
|
</Layout>
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue