feat: 格式化代码
This commit is contained in:
@@ -1,8 +1,12 @@
|
|||||||
<template>
|
<template>
|
||||||
<view class="container">
|
<view class="container">
|
||||||
<view class="chat-ai">
|
<view class="chat-ai">
|
||||||
<view class="loading-container" >
|
<view class="loading-container">
|
||||||
<image v-if="isLoading" class="loading-img" src="/static/msg_loading.svg" />
|
<image
|
||||||
|
v-if="isLoading"
|
||||||
|
class="loading-img"
|
||||||
|
src="/static/msg_loading.svg"
|
||||||
|
/>
|
||||||
<ChatMarkdown :key="textKey" :text="processedText" />
|
<ChatMarkdown :key="textKey" :text="processedText" />
|
||||||
</view>
|
</view>
|
||||||
<slot name="content"></slot>
|
<slot name="content"></slot>
|
||||||
@@ -89,5 +93,4 @@ watch(
|
|||||||
width: 32px;
|
width: 32px;
|
||||||
height: 32px;
|
height: 32px;
|
||||||
}
|
}
|
||||||
|
|
||||||
</style>
|
</style>
|
||||||
|
|||||||
@@ -6,26 +6,25 @@
|
|||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup>
|
<script setup>
|
||||||
import { defineProps } from "vue";
|
import { defineProps } from "vue";
|
||||||
defineProps({
|
defineProps({
|
||||||
text: {
|
text: {
|
||||||
type: String,
|
type: String,
|
||||||
default: ''
|
default: "",
|
||||||
}
|
},
|
||||||
})
|
});
|
||||||
|
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style lang="scss" scoped>
|
<style lang="scss" scoped>
|
||||||
.chat-mine {
|
.chat-mine {
|
||||||
margin: 6px 12px;
|
margin: 6px 12px;
|
||||||
padding: 8px 16px;
|
padding: 8px 16px;
|
||||||
|
|
||||||
background-color: #00A6FF;
|
background-color: #00a6ff;
|
||||||
box-shadow: 2px 2px 10px 0px rgba(0,0,0,0.1);
|
box-shadow: 2px 2px 10px 0px rgba(0, 0, 0, 0.1);
|
||||||
border-radius: 20px 4px 20px 20px;
|
border-radius: 20px 4px 20px 20px;
|
||||||
border: 1px solid;
|
border: 1px solid;
|
||||||
border-color: #FFFFFF;
|
border-color: #ffffff;
|
||||||
|
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
@@ -36,11 +35,11 @@
|
|||||||
font-family: PingFang SC, PingFang SC;
|
font-family: PingFang SC, PingFang SC;
|
||||||
font-weight: 400;
|
font-weight: 400;
|
||||||
font-size: 14px;
|
font-size: 14px;
|
||||||
color: #FFFFFF;
|
color: #ffffff;
|
||||||
line-height: 22px;
|
line-height: 22px;
|
||||||
text-align: justify;
|
text-align: justify;
|
||||||
font-style: normal;
|
font-style: normal;
|
||||||
text-transform: none;
|
text-transform: none;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
@@ -6,17 +6,17 @@
|
|||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup>
|
<script setup>
|
||||||
import { defineProps } from "vue";
|
import { defineProps } from "vue";
|
||||||
defineProps({
|
defineProps({
|
||||||
text: {
|
text: {
|
||||||
type: String,
|
type: String,
|
||||||
default: ''
|
default: "",
|
||||||
}
|
},
|
||||||
})
|
});
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style lang="scss" scoped>
|
<style lang="scss" scoped>
|
||||||
.chat-other {
|
.chat-other {
|
||||||
width: 100%;
|
width: 100%;
|
||||||
margin: 6px 0;
|
margin: 6px 0;
|
||||||
padding: 0 12px;
|
padding: 0 12px;
|
||||||
@@ -31,6 +31,5 @@
|
|||||||
font-size: 14px;
|
font-size: 14px;
|
||||||
color: #333333;
|
color: #333333;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
}
|
|
||||||
</style>
|
</style>
|
||||||
@@ -3,10 +3,7 @@
|
|||||||
<view v-if="!visibleWaveBtn" class="area-input">
|
<view v-if="!visibleWaveBtn" class="area-input">
|
||||||
<!-- 语音/键盘切换 -->
|
<!-- 语音/键盘切换 -->
|
||||||
<view class="input-container-voice" @click="toggleVoiceMode">
|
<view class="input-container-voice" @click="toggleVoiceMode">
|
||||||
<image
|
<image v-if="!isVoiceMode" src="/static/input_voice_icon.png"></image>
|
||||||
v-if="!isVoiceMode"
|
|
||||||
src="/static/input_voice_icon.png"
|
|
||||||
></image>
|
|
||||||
<image v-else src="/static/input_keyboard_icon.png"></image>
|
<image v-else src="/static/input_keyboard_icon.png"></image>
|
||||||
</view>
|
</view>
|
||||||
|
|
||||||
|
|||||||
@@ -38,9 +38,7 @@
|
|||||||
<template v-if="item.msgType === MessageRole.AI">
|
<template v-if="item.msgType === MessageRole.AI">
|
||||||
<ChatCardAI
|
<ChatCardAI
|
||||||
class="message-item-ai"
|
class="message-item-ai"
|
||||||
:key="`ai-${item.msgId}-${
|
:key="`ai-${item.msgId}-${item.msg ? item.msg.length : 0}`"
|
||||||
item.msg ? item.msg.length : 0
|
|
||||||
}`"
|
|
||||||
:text="item.msg || ''"
|
:text="item.msg || ''"
|
||||||
,
|
,
|
||||||
:isLoading="item.isLoading"
|
:isLoading="item.isLoading"
|
||||||
@@ -48,26 +46,21 @@
|
|||||||
<template #content v-if="item.toolCall">
|
<template #content v-if="item.toolCall">
|
||||||
<QuickBookingComponent
|
<QuickBookingComponent
|
||||||
v-if="
|
v-if="
|
||||||
item.toolCall.componentName ===
|
item.toolCall.componentName === CompName.quickBookingCard
|
||||||
CompName.quickBookingCard
|
|
||||||
"
|
"
|
||||||
/>
|
/>
|
||||||
<DiscoveryCardComponent
|
<DiscoveryCardComponent
|
||||||
v-else-if="
|
v-else-if="
|
||||||
item.toolCall.componentName ===
|
item.toolCall.componentName === CompName.discoveryCard
|
||||||
CompName.discoveryCard
|
|
||||||
"
|
"
|
||||||
/>
|
/>
|
||||||
<CreateServiceOrder
|
<CreateServiceOrder
|
||||||
v-else-if="
|
v-else-if="
|
||||||
item.toolCall.componentName ===
|
item.toolCall.componentName === CompName.createWorkOrderCard
|
||||||
CompName.createWorkOrderCard
|
|
||||||
"
|
"
|
||||||
/>
|
/>
|
||||||
<DetailCardCompontent
|
<DetailCardCompontent
|
||||||
v-else-if="
|
v-else-if="item.toolCall.componentName === ''"
|
||||||
item.toolCall.componentName === ''
|
|
||||||
"
|
|
||||||
:toolCall="item.toolCall"
|
:toolCall="item.toolCall"
|
||||||
/>
|
/>
|
||||||
</template>
|
</template>
|
||||||
@@ -84,18 +77,12 @@
|
|||||||
</template>
|
</template>
|
||||||
|
|
||||||
<template v-else-if="item.msgType === MessageRole.ME">
|
<template v-else-if="item.msgType === MessageRole.ME">
|
||||||
<ChatCardMine
|
<ChatCardMine class="message-item-mine" :text="item.msg">
|
||||||
class="message-item-mine"
|
|
||||||
:text="item.msg"
|
|
||||||
>
|
|
||||||
</ChatCardMine>
|
</ChatCardMine>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<template v-else>
|
<template v-else>
|
||||||
<ChatCardOther
|
<ChatCardOther class="message-item-other" :text="item.msg">
|
||||||
class="message-item-other"
|
|
||||||
:text="item.msg"
|
|
||||||
>
|
|
||||||
<ChatMoreTips
|
<ChatMoreTips
|
||||||
@replySent="handleReply"
|
@replySent="handleReply"
|
||||||
:itemList="mainPageDataModel.guideWords"
|
:itemList="mainPageDataModel.guideWords"
|
||||||
@@ -107,12 +94,8 @@
|
|||||||
/>
|
/>
|
||||||
|
|
||||||
<RecommendPostsComponent
|
<RecommendPostsComponent
|
||||||
v-if="
|
v-if="mainPageDataModel.recommendTheme.length > 0"
|
||||||
mainPageDataModel.recommendTheme.length > 0
|
:recommendThemeList="mainPageDataModel.recommendTheme"
|
||||||
"
|
|
||||||
:recommendThemeList="
|
|
||||||
mainPageDataModel.recommendTheme
|
|
||||||
"
|
|
||||||
/>
|
/>
|
||||||
</ChatCardOther>
|
</ChatCardOther>
|
||||||
</template>
|
</template>
|
||||||
@@ -353,6 +336,15 @@ onMounted(async () => {
|
|||||||
addNoticeListener();
|
addNoticeListener();
|
||||||
initTypewriterManager();
|
initTypewriterManager();
|
||||||
initWebSocket();
|
initWebSocket();
|
||||||
|
uni.getProvider({
|
||||||
|
service: "oauth",
|
||||||
|
success: (res) => {
|
||||||
|
console.log("getProvider success", res);
|
||||||
|
},
|
||||||
|
fail: (err) => {
|
||||||
|
console.log("getProvider fail", err);
|
||||||
|
},
|
||||||
|
});
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error("页面初始化错误:", error);
|
console.error("页面初始化错误:", error);
|
||||||
}
|
}
|
||||||
@@ -527,7 +519,7 @@ const initTypewriterManager = () => {
|
|||||||
|
|
||||||
typewriterManager = new TypewriterManager({
|
typewriterManager = new TypewriterManager({
|
||||||
typingSpeed: 30,
|
typingSpeed: 30,
|
||||||
cursorText: '',
|
cursorText: "",
|
||||||
});
|
});
|
||||||
|
|
||||||
// 设置回调函数
|
// 设置回调函数
|
||||||
|
|||||||
@@ -1,21 +1,18 @@
|
|||||||
<template>
|
<template>
|
||||||
<view>
|
<view>
|
||||||
<zero-markdown-view :markdown="text" :aiMode='true'></zero-markdown-view>
|
<zero-markdown-view :markdown="text" :aiMode="true"></zero-markdown-view>
|
||||||
</view>
|
</view>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup>
|
<script setup>
|
||||||
import { defineProps } from "vue";
|
import { defineProps } from "vue";
|
||||||
|
|
||||||
defineProps({
|
defineProps({
|
||||||
text: {
|
text: {
|
||||||
type: String,
|
type: String,
|
||||||
default: ''
|
default: "",
|
||||||
}
|
},
|
||||||
})
|
});
|
||||||
|
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style scoped>
|
<style scoped></style>
|
||||||
|
|
||||||
</style>
|
|
||||||
|
|||||||
@@ -16,9 +16,7 @@
|
|||||||
<image :src="item.icon"></image>
|
<image :src="item.icon"></image>
|
||||||
<text>{{ item.title }}</text>
|
<text>{{ item.title }}</text>
|
||||||
</view>
|
</view>
|
||||||
<text class="quick-access-item-content">{{
|
<text class="quick-access-item-content">{{ item.content }}</text>
|
||||||
item.content
|
|
||||||
}}</text>
|
|
||||||
</view>
|
</view>
|
||||||
</view>
|
</view>
|
||||||
</view>
|
</view>
|
||||||
|
|||||||
@@ -1,20 +1,18 @@
|
|||||||
<template>
|
<template>
|
||||||
<view class="top-bg">
|
<view class="top-bg"> </view>
|
||||||
</view>
|
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script>
|
<script></script>
|
||||||
</script>
|
|
||||||
|
|
||||||
<style lang="scss" scoped>
|
<style lang="scss" scoped>
|
||||||
.top-bg {
|
.top-bg {
|
||||||
width: 100%;
|
width: 100%;
|
||||||
height: 270px;
|
height: 270px;
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
background: linear-gradient( 180deg, #42ADF9 0%, #6CD1FF 51%, #E9F3F7 99%);
|
background: linear-gradient(180deg, #42adf9 0%, #6cd1ff 51%, #e9f3f7 99%);
|
||||||
.top-bg-img {
|
.top-bg-img {
|
||||||
width: 100%;
|
width: 100%;
|
||||||
height: 100%;
|
height: 100%;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
@@ -7,29 +7,27 @@
|
|||||||
<uni-drawer ref="showLeft" mode="left" :width="320">
|
<uni-drawer ref="showLeft" mode="left" :width="320">
|
||||||
<DrawerHome @closeDrawer="closeDrawer('showLeft')" />
|
<DrawerHome @closeDrawer="closeDrawer('showLeft')" />
|
||||||
</uni-drawer>
|
</uni-drawer>
|
||||||
|
|
||||||
</view>
|
</view>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup>
|
<script setup>
|
||||||
import { defineEmits, ref } from 'vue'
|
import { defineEmits, ref } from "vue";
|
||||||
import DrawerHome from "@/pages/drawer/DrawerHome.vue";
|
import DrawerHome from "@/pages/drawer/DrawerHome.vue";
|
||||||
|
|
||||||
const showLeft = ref(false)
|
const showLeft = ref(false);
|
||||||
|
|
||||||
// 打开窗口
|
|
||||||
const showDrawer = (e) => {
|
|
||||||
showLeft.value.open()
|
|
||||||
}
|
|
||||||
// 关闭窗口
|
|
||||||
const closeDrawer = (e) => {
|
|
||||||
showLeft.value.close()
|
|
||||||
}
|
|
||||||
|
|
||||||
|
// 打开窗口
|
||||||
|
const showDrawer = (e) => {
|
||||||
|
showLeft.value.open();
|
||||||
|
};
|
||||||
|
// 关闭窗口
|
||||||
|
const closeDrawer = (e) => {
|
||||||
|
showLeft.value.close();
|
||||||
|
};
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style lang="scss" scoped>
|
<style lang="scss" scoped>
|
||||||
.nav-bar {
|
.nav-bar {
|
||||||
display: flex;
|
display: flex;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
height: 44px;
|
height: 44px;
|
||||||
@@ -44,5 +42,5 @@
|
|||||||
width: 100%;
|
width: 100%;
|
||||||
height: 100%;
|
height: 100%;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
@@ -6,10 +6,7 @@
|
|||||||
class="top-item-left"
|
class="top-item-left"
|
||||||
:src="initPageImages.welcomeImageUrl"
|
:src="initPageImages.welcomeImageUrl"
|
||||||
></image>
|
></image>
|
||||||
<image
|
<image class="top-item-right" :src="initPageImages.logoImageUrl"></image>
|
||||||
class="top-item-right"
|
|
||||||
:src="initPageImages.logoImageUrl"
|
|
||||||
></image>
|
|
||||||
</view>
|
</view>
|
||||||
<ChatCardAI v-if="welcomeContent.length" :text="welcomeContent" />
|
<ChatCardAI v-if="welcomeContent.length" :text="welcomeContent" />
|
||||||
</view>
|
</view>
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
.chat-container {
|
.chat-container {
|
||||||
width: 100vw;
|
width: 100vw;
|
||||||
height: 100vh;
|
height: 100vh;
|
||||||
background-color: #E9F3F7;
|
background-color: #e9f3f7;
|
||||||
|
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
@@ -17,7 +17,7 @@
|
|||||||
right: 0;
|
right: 0;
|
||||||
z-index: 0;
|
z-index: 0;
|
||||||
height: 270px;
|
height: 270px;
|
||||||
background: linear-gradient( 180deg, #42ADF9 0%, #6CD1FF 51%, #E9F3F7 99%);
|
background: linear-gradient(180deg, #42adf9 0%, #6cd1ff 51%, #e9f3f7 99%);
|
||||||
}
|
}
|
||||||
|
|
||||||
.chat-content {
|
.chat-content {
|
||||||
@@ -64,13 +64,13 @@
|
|||||||
justify-content: center;
|
justify-content: center;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.footer-area {
|
.footer-area {
|
||||||
width: 100vw;
|
width: 100vw;
|
||||||
flex-shrink: 0;
|
flex-shrink: 0;
|
||||||
padding: 4px 0 20px 0; /* 直接设置20px底部安全距离 */
|
padding: 4px 0 20px 0; /* 直接设置20px底部安全距离 */
|
||||||
background-color: #E9F3F7;
|
background-color: #e9f3f7;
|
||||||
touch-action: pan-x;
|
touch-action: pan-x;
|
||||||
overflow-x: auto;
|
overflow-x: auto;
|
||||||
overflow-y: hidden;
|
overflow-y: hidden;
|
||||||
@@ -82,14 +82,14 @@
|
|||||||
/* 确保输入区域始终可见 */
|
/* 确保输入区域始终可见 */
|
||||||
// transform: translateZ(0);
|
// transform: translateZ(0);
|
||||||
// -webkit-transform: translateZ(0);
|
// -webkit-transform: translateZ(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
.area-input {
|
.area-input {
|
||||||
display: flex;
|
display: flex;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
border-radius: 22px;
|
border-radius: 22px;
|
||||||
background-color: #FFFFFF;
|
background-color: #ffffff;
|
||||||
box-shadow: 0px 0px 20px 0px rgba(52,25,204,0.05);
|
box-shadow: 0px 0px 20px 0px rgba(52, 25, 204, 0.05);
|
||||||
margin: 0 12px;
|
margin: 0 12px;
|
||||||
|
|
||||||
.input-container-voice {
|
.input-container-voice {
|
||||||
@@ -131,23 +131,25 @@
|
|||||||
margin-bottom: 2px;
|
margin-bottom: 2px;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// 打字机光标闪烁动画
|
// 打字机光标闪烁动画
|
||||||
.typing-cursor {
|
.typing-cursor {
|
||||||
display: inline-block;
|
display: inline-block;
|
||||||
color: #42ADF9;
|
color: #42adf9;
|
||||||
font-weight: bold;
|
font-weight: bold;
|
||||||
font-size: 1.2em;
|
font-size: 1.2em;
|
||||||
animation: blink 1s infinite;
|
animation: blink 1s infinite;
|
||||||
margin-left: 2px;
|
margin-left: 2px;
|
||||||
}
|
}
|
||||||
|
|
||||||
@keyframes blink {
|
@keyframes blink {
|
||||||
0%, 50% {
|
0%,
|
||||||
|
50% {
|
||||||
opacity: 1;
|
opacity: 1;
|
||||||
}
|
}
|
||||||
51%, 100% {
|
51%,
|
||||||
|
100% {
|
||||||
opacity: 0;
|
opacity: 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,35 +1,39 @@
|
|||||||
<template>
|
<template>
|
||||||
<view class="drawer-home">
|
<view class="drawer-home">
|
||||||
<view class="drawer-home-nav">
|
<view class="drawer-home-nav">
|
||||||
<uni-icons type="closeempty" size="22" color="#333333" class="close-icon" @click="closeDrawer"></uni-icons>
|
<uni-icons
|
||||||
|
type="closeempty"
|
||||||
|
size="22"
|
||||||
|
color="#333333"
|
||||||
|
class="close-icon"
|
||||||
|
@click="closeDrawer"
|
||||||
|
></uni-icons>
|
||||||
<text class="title">我的</text>
|
<text class="title">我的</text>
|
||||||
</view>
|
</view>
|
||||||
|
|
||||||
<MineSetting/>
|
<MineSetting />
|
||||||
|
|
||||||
</view>
|
</view>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup>
|
<script setup>
|
||||||
import MineSetting from './MineSetting.vue'
|
import MineSetting from "./MineSetting.vue";
|
||||||
import { defineEmits } from 'vue'
|
import { defineEmits } from "vue";
|
||||||
const emits = defineEmits(['closeDrawer'])
|
const emits = defineEmits(["closeDrawer"]);
|
||||||
|
|
||||||
const closeDrawer = () => {
|
|
||||||
emits('closeDrawer')
|
|
||||||
}
|
|
||||||
|
|
||||||
|
const closeDrawer = () => {
|
||||||
|
emits("closeDrawer");
|
||||||
|
};
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style lang="scss" scoped>
|
<style lang="scss" scoped>
|
||||||
.drawer-home {
|
.drawer-home {
|
||||||
width: 100%;
|
width: 100%;
|
||||||
height: 100vh;
|
height: 100vh;
|
||||||
background-color: #fff;
|
background-color: #fff;
|
||||||
padding-top: 44px;
|
padding-top: 44px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.drawer-home-nav {
|
.drawer-home-nav {
|
||||||
position: relative;
|
position: relative;
|
||||||
padding: 12px;
|
padding: 12px;
|
||||||
display: flex;
|
display: flex;
|
||||||
@@ -46,5 +50,5 @@
|
|||||||
position: absolute;
|
position: absolute;
|
||||||
left: 12px; /* 距离左边12px */
|
left: 12px; /* 距离左边12px */
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
@@ -36,60 +36,64 @@
|
|||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup>
|
<script setup>
|
||||||
import { ref, onMounted } from 'vue'
|
import { ref, onMounted } from "vue";
|
||||||
import { getLoginUserPhone } from '@/request/api/LoginApi'
|
import { getLoginUserPhone } from "@/request/api/LoginApi";
|
||||||
|
|
||||||
// 假数据
|
// 假数据
|
||||||
const userInfo = ref({
|
const userInfo = ref({
|
||||||
avatar: '/static/default-avatar.png',
|
avatar: "/static/default-avatar.png",
|
||||||
nickname: '微信用户',
|
nickname: "微信用户",
|
||||||
phone: ''
|
phone: "",
|
||||||
})
|
});
|
||||||
|
|
||||||
// 功能菜单列表(带 type 区分操作类型)
|
// 功能菜单列表(带 type 区分操作类型)
|
||||||
const menuList = ref([
|
const menuList = ref([
|
||||||
// { label: '修改手机号', type: 'navigate', url: '/pages/change-phone/change-phone' },
|
// { label: '修改手机号', type: 'navigate', url: '/pages/change-phone/change-phone' },
|
||||||
{ label: '账号注销', type: 'navigate', url: '/pages/cancel-account/cancel-account' },
|
{
|
||||||
|
label: "账号注销",
|
||||||
|
type: "navigate",
|
||||||
|
url: "/pages/cancel-account/cancel-account",
|
||||||
|
},
|
||||||
// { label: '营业资质&协议', type: 'navigate', url: '/pages/agreement/agreement' },
|
// { label: '营业资质&协议', type: 'navigate', url: '/pages/agreement/agreement' },
|
||||||
{ label: '联系客服', type: 'action', action: 'contactService' }
|
{ label: "联系客服", type: "action", action: "contactService" },
|
||||||
])
|
]);
|
||||||
|
|
||||||
// 生命周期钩子
|
// 生命周期钩子
|
||||||
onMounted(() => {
|
onMounted(() => {
|
||||||
getLoginUserPhoneInfo()
|
getLoginUserPhoneInfo();
|
||||||
})
|
});
|
||||||
|
|
||||||
const getLoginUserPhoneInfo = async () => {
|
const getLoginUserPhoneInfo = async () => {
|
||||||
const res = await getLoginUserPhone()
|
const res = await getLoginUserPhone();
|
||||||
if (res.code === 0) {
|
if (res.code === 0) {
|
||||||
userInfo.value.phone = res.data
|
userInfo.value.phone = res.data;
|
||||||
}
|
}
|
||||||
}
|
};
|
||||||
|
|
||||||
// 处理菜单点击
|
// 处理菜单点击
|
||||||
const handleMenuClick = (item) => {
|
const handleMenuClick = (item) => {
|
||||||
if (item.type === 'navigate' && item.url) {
|
if (item.type === "navigate" && item.url) {
|
||||||
uni.navigateTo({ url: item.url })
|
uni.navigateTo({ url: item.url });
|
||||||
} else if (item.type === 'action') {
|
} else if (item.type === "action") {
|
||||||
if (item.action === 'contactService') {
|
if (item.action === "contactService") {
|
||||||
uni.showToast({ title: '联系客服功能待实现', icon: 'none' })
|
uni.showToast({ title: "联系客服功能待实现", icon: "none" });
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
};
|
||||||
|
|
||||||
// 退出登录
|
// 退出登录
|
||||||
const handleLogout = () => {
|
const handleLogout = () => {
|
||||||
uni.showModal({
|
uni.showModal({
|
||||||
title: '温馨提示',
|
title: "温馨提示",
|
||||||
content: '确定要退出登录吗?',
|
content: "确定要退出登录吗?",
|
||||||
success: (res) => {
|
success: (res) => {
|
||||||
if (res.confirm) {
|
if (res.confirm) {
|
||||||
uni.clearStorageSync()
|
uni.clearStorageSync();
|
||||||
uni.reLaunch({ url: '/pages/login/index' })
|
uni.reLaunch({ url: "/pages/login/index" });
|
||||||
}
|
}
|
||||||
}
|
},
|
||||||
})
|
});
|
||||||
}
|
};
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style scoped>
|
<style scoped>
|
||||||
|
|||||||
@@ -12,32 +12,31 @@
|
|||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup>
|
<script setup>
|
||||||
import { ref, nextTick, defineEmits } from 'vue'
|
import { ref, nextTick, defineEmits } from "vue";
|
||||||
import { onMounted } from 'vue'
|
import { onMounted } from "vue";
|
||||||
import { SCROLL_TO_BOTTOM } from '@/constant/constant'
|
import { SCROLL_TO_BOTTOM } from "@/constant/constant";
|
||||||
const props = defineProps({
|
const props = defineProps({
|
||||||
question: {
|
question: {
|
||||||
type: String,
|
type: String,
|
||||||
default: ''
|
default: "",
|
||||||
}
|
},
|
||||||
})
|
});
|
||||||
|
|
||||||
const tags = ref([])
|
const tags = ref([]);
|
||||||
const emits = defineEmits(['replySent']);
|
const emits = defineEmits(["replySent"]);
|
||||||
|
|
||||||
const handleClick = (item) => {
|
const handleClick = (item) => {
|
||||||
emits('replySent', item)
|
emits("replySent", item);
|
||||||
}
|
};
|
||||||
|
|
||||||
onMounted(() => {
|
onMounted(() => {
|
||||||
tags.value = props.question.split(/[&|;]/).filter(tag => tag.trim() !== '')
|
tags.value = props.question.split(/[&|;]/).filter((tag) => tag.trim() !== "");
|
||||||
nextTick(() => {
|
nextTick(() => {
|
||||||
setTimeout(() => {
|
setTimeout(() => {
|
||||||
uni.$emit(SCROLL_TO_BOTTOM, true)
|
uni.$emit(SCROLL_TO_BOTTOM, true);
|
||||||
}, 300)
|
}, 300);
|
||||||
});
|
});
|
||||||
})
|
});
|
||||||
|
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style scoped lang="scss">
|
<style scoped lang="scss">
|
||||||
@@ -59,7 +58,7 @@ onMounted(() => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
.tag-text {
|
.tag-text {
|
||||||
color: #00A6FF; /* 蓝色文字,可根据设计调整 */
|
color: #00a6ff; /* 蓝色文字,可根据设计调整 */
|
||||||
font-size: 14px;
|
font-size: 14px;
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
|
|||||||
@@ -1,12 +1,15 @@
|
|||||||
<template>
|
<template>
|
||||||
<view class="container">
|
<view class="container">
|
||||||
<swiper class="swiper" circular
|
<swiper
|
||||||
|
class="swiper"
|
||||||
|
circular
|
||||||
:indicator-dots="activityList.length > 1"
|
:indicator-dots="activityList.length > 1"
|
||||||
indicator-color="#FFFFFF"
|
indicator-color="#FFFFFF"
|
||||||
indicator-active-color="#00A6FF"
|
indicator-active-color="#00A6FF"
|
||||||
:autoplay="autoplay"
|
:autoplay="autoplay"
|
||||||
:interval="interval"
|
:interval="interval"
|
||||||
:duration="duration">
|
:duration="duration"
|
||||||
|
>
|
||||||
<swiper-item v-for="item in activityList" :key="item.id">
|
<swiper-item v-for="item in activityList" :key="item.id">
|
||||||
<view class="swiper-item" @click="handleClick(item)">
|
<view class="swiper-item" @click="handleClick(item)">
|
||||||
<image :src="item.activityCover" mode="aspectFill"></image>
|
<image :src="item.activityCover" mode="aspectFill"></image>
|
||||||
@@ -14,33 +17,31 @@
|
|||||||
</view>
|
</view>
|
||||||
</swiper-item>
|
</swiper-item>
|
||||||
</swiper>
|
</swiper>
|
||||||
|
|
||||||
</view>
|
</view>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup>
|
<script setup>
|
||||||
import { ref } from 'vue'
|
import { ref } from "vue";
|
||||||
import { SEND_COMMAND_TEXT } from '@/constant/constant'
|
import { SEND_COMMAND_TEXT } from "@/constant/constant";
|
||||||
|
|
||||||
const autoplay = ref(true)
|
const autoplay = ref(true);
|
||||||
const interval = ref(3000)
|
const interval = ref(3000);
|
||||||
const duration = ref(500)
|
const duration = ref(500);
|
||||||
|
|
||||||
const props = defineProps({
|
const props = defineProps({
|
||||||
activityList: {
|
activityList: {
|
||||||
type: Array,
|
type: Array,
|
||||||
default: []
|
default: [],
|
||||||
}
|
},
|
||||||
})
|
});
|
||||||
|
|
||||||
const handleClick = (item) => {
|
|
||||||
uni.$emit(SEND_COMMAND_TEXT, '快速预定')
|
|
||||||
}
|
|
||||||
|
|
||||||
|
const handleClick = (item) => {
|
||||||
|
uni.$emit(SEND_COMMAND_TEXT, "快速预定");
|
||||||
|
};
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style scoped lang="scss">
|
<style scoped lang="scss">
|
||||||
.container {
|
.container {
|
||||||
margin-bottom: 6px;
|
margin-bottom: 6px;
|
||||||
|
|
||||||
.uni-margin-wrap {
|
.uni-margin-wrap {
|
||||||
@@ -77,6 +78,5 @@
|
|||||||
line-height: 1.5;
|
line-height: 1.5;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
}
|
|
||||||
</style>
|
</style>
|
||||||
@@ -22,7 +22,6 @@
|
|||||||
<text class="calendar-text">日历</text>
|
<text class="calendar-text">日历</text>
|
||||||
</view>
|
</view>
|
||||||
</view>
|
</view>
|
||||||
|
|
||||||
</view>
|
</view>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
|
|||||||
@@ -8,23 +8,21 @@
|
|||||||
<template v-if="toolCall.commodityList">
|
<template v-if="toolCall.commodityList">
|
||||||
<DetailCardGoodsContentList :commodityList="toolCall.commodityList" />
|
<DetailCardGoodsContentList :commodityList="toolCall.commodityList" />
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
</view>
|
</view>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup>
|
<script setup>
|
||||||
import { defineProps } from 'vue'
|
import { defineProps } from "vue";
|
||||||
import ModuleTitle from '@/components/ModuleTitle/index.vue'
|
import ModuleTitle from "@/components/ModuleTitle/index.vue";
|
||||||
import ImageSwiper from '@/components/ImageSwiper/index.vue'
|
import ImageSwiper from "@/components/ImageSwiper/index.vue";
|
||||||
import DetailCardGoodsContentList from './DetailCardGoodsContentList.vue'
|
import DetailCardGoodsContentList from "./DetailCardGoodsContentList.vue";
|
||||||
|
|
||||||
const props = defineProps({
|
const props = defineProps({
|
||||||
toolCall: {
|
toolCall: {
|
||||||
type: Object,
|
type: Object,
|
||||||
default: {}
|
default: {},
|
||||||
}
|
},
|
||||||
})
|
});
|
||||||
|
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style scoped lang="scss">
|
<style scoped lang="scss">
|
||||||
@@ -32,5 +30,4 @@
|
|||||||
width: 100%;
|
width: 100%;
|
||||||
padding: 12px 0;
|
padding: 12px 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
</style>
|
</style>
|
||||||
|
|||||||
@@ -7,37 +7,36 @@
|
|||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup>
|
<script setup>
|
||||||
import { ref, nextTick } from 'vue'
|
import { ref, nextTick } from "vue";
|
||||||
import { onMounted } from 'vue'
|
import { onMounted } from "vue";
|
||||||
import { discoveryCradComponent } from '@/request/api/MainPageDataApi'
|
import { discoveryCradComponent } from "@/request/api/MainPageDataApi";
|
||||||
import RecommendPostsList from '../recommend/RecommendPostsList.vue'
|
import RecommendPostsList from "../recommend/RecommendPostsList.vue";
|
||||||
import { SCROLL_TO_BOTTOM } from '@/constant/constant'
|
import { SCROLL_TO_BOTTOM } from "@/constant/constant";
|
||||||
|
|
||||||
const themeDTOList = ref([])
|
const themeDTOList = ref([]);
|
||||||
|
|
||||||
const loadDiscoveryCradComponent = async () => {
|
const loadDiscoveryCradComponent = async () => {
|
||||||
const res = await discoveryCradComponent()
|
const res = await discoveryCradComponent();
|
||||||
if(res.code === 0 && res.data) {
|
if (res.code === 0 && res.data) {
|
||||||
themeDTOList.value = res.data.themeDTOList
|
themeDTOList.value = res.data.themeDTOList;
|
||||||
|
|
||||||
nextTick(() => {
|
nextTick(() => {
|
||||||
setTimeout(() => {
|
setTimeout(() => {
|
||||||
uni.$emit(SCROLL_TO_BOTTOM, true)
|
uni.$emit(SCROLL_TO_BOTTOM, true);
|
||||||
}, 300)
|
}, 300);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
};
|
||||||
|
|
||||||
onMounted(() => {
|
|
||||||
loadDiscoveryCradComponent()
|
|
||||||
})
|
|
||||||
|
|
||||||
|
onMounted(() => {
|
||||||
|
loadDiscoveryCradComponent();
|
||||||
|
});
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style scoped lang="scss">
|
<style scoped lang="scss">
|
||||||
.container {
|
.container {
|
||||||
width: 100%;
|
width: 100%;
|
||||||
flex: 1;
|
flex: 1;
|
||||||
margin-bottom: 12px;
|
margin-bottom: 12px;
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
@@ -7,23 +7,21 @@
|
|||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup>
|
<script setup>
|
||||||
import RecommendPostsList from './RecommendPostsList.vue';
|
import RecommendPostsList from "./RecommendPostsList.vue";
|
||||||
|
|
||||||
import { defineProps } from 'vue'
|
import { defineProps } from "vue";
|
||||||
const props = defineProps({
|
const props = defineProps({
|
||||||
recommendThemeList: {
|
recommendThemeList: {
|
||||||
type: Array,
|
type: Array,
|
||||||
default: []
|
default: [],
|
||||||
}
|
},
|
||||||
})
|
});
|
||||||
|
|
||||||
|
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style scoped lang="scss">
|
<style scoped lang="scss">
|
||||||
.container {
|
.container {
|
||||||
width: 100%;
|
width: 100%;
|
||||||
flex: 1;
|
flex: 1;
|
||||||
margin-bottom: 12px;
|
margin-bottom: 12px;
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
Reference in New Issue
Block a user