feat: 格式化代码

This commit is contained in:
2025-08-27 18:37:50 +08:00
parent 9de068e7fc
commit 0e51fdcd69
21 changed files with 1502 additions and 1522 deletions

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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: "",
}); });
// 设置回调函数 // 设置回调函数

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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;
} }
} }

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -22,7 +22,6 @@
<text class="calendar-text">日历</text> <text class="calendar-text">日历</text>
</view> </view>
</view> </view>
</view> </view>
</template> </template>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>