refactor: clean up codebase and add new features

Replace SCSS variable usages with explicit pixel/hex values for consistent styling across all components
Fix broken template syntax including missing class spaces and incorrect closing tags
Migrate constant and API imports to centralized @/constants and @/api modules
Add new utility classes: IdUtils, CallbackUtils, and TimerUtils
Add new chat conversation API endpoints for recent conversations and message lists
Add new Discovery page components (FindTabs, QuickQuestions, CardSwiper) and their styles
Update app store config to use environment variables for base API and WebSocket URLs
Add new selected tab icon assets
This commit is contained in:
duanshuwen
2026-05-26 23:50:37 +08:00
parent c977c485ef
commit 1a5a2ae6a9
101 changed files with 1488 additions and 745 deletions

View File

@@ -1,4 +1,4 @@
.booking {
background: linear-gradient(180deg, $theme-color-100 0%, #f5f7fa 100%) 0 86px / 100%
background: linear-gradient(180deg, #e8fff1 0%, #f5f7fa 100%) 0 86px / 100%
100px no-repeat;
}

View File

@@ -16,7 +16,7 @@
top: -12rpx;
left: 24rpx;
font-size: 20rpx;
color: $uni-text-color-grey;
color: #333-grey;
background-color: #fff;
padding: 0 8rpx;
z-index: 1;
@@ -41,7 +41,7 @@
.date-text {
font-size: 32rpx;
font-weight: 500;
color: $uni-text-color;
color: #333;
}
.day-text {

View File

@@ -1,17 +1,13 @@
<template>
<div class="demo-container">
<div class="demo-header">
<spanclass="demo-title">GoodConfirm 组件演示</text>
<span class="demo-title">GoodConfirm 组件演示</span>
</div>
<div class="demo-section">
<div class="section-title">基础用法</div>
<button class="demo-btn" @click="showConfirm">显示商品确认弹窗</button>
<button
class="demo-btn"
@click="setQuantity(5)"
style="margin-left: 12px"
>
<button class="demo-btn" @click="setQuantity(5)" style="margin-left: 12px">
设置5人测试横向滚动
</button>
</div>
@@ -22,42 +18,29 @@
<text>Stepper数量: {{ quantity }}</text>
<text>表单项数量: {{ userFormCount }}</text>
<text>总价: ¥{{ totalPrice }}</text>
<spanclass="debug-info">实时quantity值: {{ quantity }}</text>
<spanclass="feature-highlight"> 支持横向滚动浏览多个游客信息</text>
<spanclass="feature-highlight"
>🗑 支持删除游客信息至少保留一位</text
>
<span class="debug-info">实时quantity值: {{ quantity }}</span>
<span class="feature-highlight"> 支持横向滚动浏览多个游客信息</span>
<span class="feature-highlight">🗑 支持删除游客信息至少保留一位</span>
</div>
</div>
<div class="demo-section" v-if="lastOrderData">
<div class="section-title">最后提交的数据</div>
<div class="order-data">
<text>商品: {{ lastOrderData.goodsData.commodityName }}</text>
<text>数量: {{ lastOrderData.quantity }}</text>
<text>总价: ¥{{ lastOrderData.totalPrice }}</text>
<text>用户信息:</text>
<span>商品: {{ lastOrderData.goodsData.commodityName }}</span>
<span>数量: {{ lastOrderData.quantity }}</span>
<span>总价: ¥{{ lastOrderData.totalPrice }}</span>
<span>用户信息:</span>
<div class="user-list">
<div
v-for="(user, index) in lastOrderData.userFormList"
:key="index"
class="user-item"
>
<text
>游客{{ index + 1 }}: {{ user.name || "未填写" }} -
{{ user.phone || "未填写" }}</text
>
<div v-for="(user, index) in lastOrderData.userFormList" :key="index" class="user-item">
<span>游客{{ index + 1 }}: {{ user.name || "未填写" }} -
{{ user.phone || "未填写" }}</span>
</div>
</div>
</div>
</div>
<GoodConfirm
ref="confirmRef"
:goodsData="goodsData"
@confirm="handleConfirm"
@close="handleClose"
/>
<GoodConfirm ref="confirmRef" :goodsData="goodsData" @confirm="handleConfirm" @close="handleClose" />
</div>
</template>

View File

@@ -15,7 +15,7 @@
.header-title {
font-size: 18px;
font-weight: 600;
color: $uni-text-color;
color: #333;
flex: 1;
text-align: center;
}
@@ -62,9 +62,9 @@
justify-content: space-between;
.goods-title {
font-size: $uni-font-size-lg;
font-size: 16px;
font-weight: 500;
color: $uni-text-color;
color: #333;
line-height: 22px;
margin-bottom: 8px;
display: -webkit-box;
@@ -79,7 +79,7 @@
margin-bottom: 12px;
.currency {
font-size: $uni-font-size-base;
font-size: 14px;
color: #ff6b35;
font-weight: 500;
}
@@ -92,8 +92,8 @@
}
.price-desc {
font-size: $uni-font-size-base;
color: $uni-text-color-grey;
font-size: 14px;
color: #333-grey;
font-weight: 400;
margin-left: 12px;
}
@@ -107,9 +107,9 @@
}
.service-title {
font-size: $uni-font-size-base;
font-size: 14px;
font-weight: 500;
color: $uni-text-color;
color: #333;
}
.goods-service-item {
@@ -120,16 +120,16 @@
.service-label,
.service-value {
font-size: $uni-font-size-base;
font-size: 14px;
font-weight: 500;
}
.service-label {
color: $uni-text-color;
color: #333;
}
.service-value {
color: $uni-text-color-grey;
color: #333-grey;
}
}
}
@@ -166,8 +166,8 @@
}
.total-count {
font-size: $uni-font-size-sm;
color: $uni-text-color;
font-size: 12px;
color: #333;
}
.total-price {
@@ -178,7 +178,7 @@
&::before {
content: "¥";
font-size: $uni-font-size-sm;
font-size: 12px;
}
}
@@ -189,7 +189,7 @@
color: #fff;
border: none;
border-radius: 24px;
font-size: $uni-font-size-lg;
font-size: 16px;
font-weight: 600;
display: flex;
align-items: center;

View File

@@ -8,8 +8,8 @@
margin-bottom: 12px;
.title {
font-size: $uni-font-size-lg;
color: $uni-text-color;
font-size: 16px;
color: #333;
font-weight: 600;
line-height: 1.4;
flex: 0 280px;
@@ -54,8 +54,8 @@
border-radius: 6px;
.facility-text {
font-size: $uni-font-size-sm;
color: $uni-text-color;
font-size: 12px;
color: #333;
line-height: 1;
white-space: nowrap;
overflow: hidden;

View File

@@ -37,8 +37,8 @@ $button-color: #00a6ff;
flex-shrink: 0;
.module-title {
font-size: $uni-font-size-base;
color: $uni-text-color;
font-size: 14px;
color: #333;
text-align: center;
word-wrap: break-word;
margin-left: 4px;
@@ -47,7 +47,7 @@ $button-color: #00a6ff;
.module-desc {
flex: 1;
font-size: $uni-font-size-sm;
font-size: 12px;
color: #666;
line-height: 1.5;
margin-top: 4px;

View File

@@ -14,7 +14,7 @@
<script setup>
import { ref } from "vue";
import { SEND_MESSAGE_COMMAND_TYPE } from "@/constant/constant";
import { SEND_MESSAGE_COMMAND_TYPE } from "@/constants/constant";
const commandModel = ref({
icon: "",

View File

@@ -27,8 +27,8 @@
right: 12px;
bottom: 12px;
background-color: #ffeb00;
color: $uni-text-color;
font-size: $uni-font-size-base;
color: #333;
font-size: 14px;
font-weight: 500;
padding: 4px 12px;
border-radius: 20px;

View File

@@ -31,14 +31,14 @@
<script setup>
import { defineProps, computed, watch, onBeforeUnmount } from "vue";
import ChatMarkdown from "./ChatMarkdown/index.vue";
import ChatMarkdown from "../ChatMarkdown/index.vue";
import ChatLoading from "./ChatLoading/index.vue";
import StreamManager from '@/utils/StreamManager.js';
import {
getLongTextPredivText,
getLongTextValue,
hasLongTextExtraSections,
} from "@/utils/longTextCard";
} from "@/constants/longTextCard";
// 直接根据文字长度判断超过约100个字符认为会溢出约3行
const props = defineProps({

View File

@@ -12,7 +12,7 @@ import { onMounted } from "vue";
import {
SCROLL_TO_BOTTOM,
SEND_MESSAGE_CONTENT_TEXT,
} from "@/constant/constant";
} from "@/constants/constant";
const props = defineProps({
question: {

View File

@@ -19,5 +19,5 @@
.tag-text {
color: #0ccd58;
font-size: $uni-font-size-base;
font-size: 14px;
}

View File

@@ -33,8 +33,8 @@
.hold-to-talk-button {
width: 100%;
height: 44px;
color: $uni-text-color;
font-size: $uni-font-size-lg;
color: #333;
font-size: 16px;
display: flex;
justify-content: center;
align-items: center;
@@ -99,7 +99,7 @@
width: 100%;
max-height: 92px;
min-height: 22px;
font-size: $uni-font-size-lg;
font-size: 16px;
line-height: 22px;
margin: 6px 0;

View File

@@ -44,7 +44,7 @@ import {
LONG_TEXT_KEYS,
getLongTextSections,
getLongTextValue,
} from "@/utils/longTextCard";
} from "@/constants/longTextCard";
const props = defineProps({
answerText: {

View File

@@ -46,7 +46,7 @@
:finish="item.finish"
/> -->
<LongTextGuideCardPrediv v-if="item.componentName && isLongTextCard(item.componentName)"
<LongTextGuideCardPreview v-if="item.componentName && isLongTextCard(item.componentName)"
:componentName="item.componentName" />
<QuickBookingComponent v-if="
@@ -147,12 +147,12 @@ import {
SEND_MESSAGE_COMMAND_TYPE,
NOTICE_EVENT_LOGOUT,
NOTICE_EVENT_LOGIN_SUCCESS,
} from "@/constant/constant";
import { MessageRole, MessageType, CompName, Command } from "@/model/ChatModel";
} from "@/constants/constant";
import { MessageRole, MessageType, CompName, Command } from "@/constants/ChatModel";
import HomeWelcome from "../HomeWelcome/index.vue";
import AiTabSwitch from "@/components/AiTabSwitch/index.vue";
import Discovery from "../../Discovery/index.vue";
import Discovery from "../Discovery/index.vue";
import ChatGuide from "../ChatGuide/index.vue";
import ChatTopNavBar from "../ChatTopNavBar/index.vue";
@@ -162,37 +162,36 @@ import ChatCardOther from "../ChatCardOther/index.vue";
import ChatQuickAccess from "../ChatQuickAccess/index.vue";
import ChatInputArea from "../ChatInputArea/index.vue";
import QuickBookingComponent from "../../ChatModule/QuickBookingComponent/index.vue";
import DiscoveryCardComponent from "../../ChatModule/DiscoveryCardComponent/index.vue";
import ActivityListComponent from "../../ChatModule/ActivityListComponent/index.vue";
import RecommendPostsComponent from "../../ChatModule/RecommendPostsComponent/index.vue";
import AttachListComponent from "../../ChatModule/AttachListComponent/index.vue";
import DetailCardCompontent from "../../ChatModule/DetailCardCompontent/index.vue";
import OpenMapComponent from "../../ChatModule/OpenMapComponent/index.vue";
import AnswerComponent from "../../ChatModule/AnswerComponent/index.vue";
import GeneratorPhotoComponent from "../../ChatModule/GeneratorPhotoComponent/index.vue";
import QuickBookingComponent from "../QuickBookingComponent/index.vue";
import DiscoveryCardComponent from "../DiscoveryCardComponent/index.vue";
import ActivityListComponent from "../ActivityListComponent/index.vue";
import RecommendPostsComponent from "../RecommendPostsComponent/index.vue";
import AttachListComponent from "../AttachListComponent/index.vue";
import DetailCardCompontent from "../DetailCardCompontent/index.vue";
import OpenMapComponent from "../OpenMapComponent/index.vue";
import AnswerComponent from "../AnswerComponent/index.vue";
import GeneratorPhotoComponent from "../GeneratorPhotoComponent/index.vue";
import ZModuleC01 from "../../ChatModule/ZModuleC01/index.vue";
import LongTextGuideCardPrediv from "../../ChatModule/LongTextGuideCardPrediv/index.vue";
import LongTextGuideCardPreview from "../LongTextGuideCardPreview/index.vue";
import CreateServiceOrder from "@/components/CreateServiceOrder/index.vue";
import Feedback from "@/components/Feedback/index.vue";
import AddCarCrad from "@/components/AddCarCrad/index.vue";
import SurveyQuestionnaire from "@/components/SurveyQuestionnaire/index.vue";
import { mainPageData } from "@/request/api/MainPageDataApi";
import { mainPageData } from "@/api/home";
import {
conversationMsgList,
recentConversation,
} from "@/request/api/ConversationApi";
} from "@/api/home";
import WebSocketManager from "@/utils/WebSocketManager";
import { IdUtils } from "@/utils";
import { IdUtils } from "@/utils/IdUtils";
import {
appendLongTextChunk,
createLongTextData,
} from "@/utils/longTextCard";
} from "@/constants/longTextCard";
import { checkToken } from "@/hooks/useGoLogin";
import { useAppStore } from "@/store";
import { getAccessToken } from "@/constant/token";
import { getAccessToken } from "@/constants/token";
const emit = defineEmits(["showDrawer"]);
const appStore = useAppStore();

View File

@@ -11,7 +11,7 @@
</template>
<script setup>
import { SEND_MESSAGE_CONTENT_TEXT } from "@/constant/constant";
import { SEND_MESSAGE_CONTENT_TEXT } from "@/constants/constant";
import { defineProps } from "vue";
defineProps({

View File

@@ -15,7 +15,7 @@
<script setup>
import { ref } from "vue";
import { Command } from "@/model/ChatModel";
import { SEND_MESSAGE_COMMAND_TYPE } from "@/constant/constant";
import { SEND_MESSAGE_COMMAND_TYPE } from "@/constants/constant";
import { checkToken } from "@/hooks/useGoLogin";
const itemList = ref([

View File

@@ -25,7 +25,7 @@
<script setup>
import { ref, defineProps, computed, defineExpose } from "vue";
import { getCurrentConfig } from "@/constant/base";
import { getCurrentConfig } from "@/constants/base";
import SpriteAnimator from "@/components/Sprite/SpriteAnimator.vue";
const props = defineProps({

View File

@@ -18,7 +18,7 @@ v
<script setup>
import { defineProps, computed, getCurrentInstance, defineExpose } from "vue";
import { getCurrentConfig } from "@/constant/base";
import { getCurrentConfig } from "@/constants/base";
import ChatMoreTips from "../ChatMoreTips/index.vue";
import SpriteAnimator from "@/components/Sprite/SpriteAnimator.vue";

View File

@@ -20,7 +20,7 @@
<script setup>
import { getCurrentInstance, nextTick, onMounted, ref, watch } from "vue";
import { isZhiNian } from "@/constant/base";
import { isZhiNian } from "@/constants/base";
import indicatorSrc from "./images/selected_tabs_icon.png";
import indicatorSrcB from "./images/selected_tabs_icon_b.png";

View File

@@ -17,9 +17,9 @@
<script setup>
import { onMounted, ref } from "vue";
import { SEND_MESSAGE_CONTENT_TEXT, SEND_MESSAGE_COMMAND_TYPE, SWITCH_TO_COMPANION_TAB } from "@/constant/constant";
import { SEND_MESSAGE_CONTENT_TEXT, SEND_MESSAGE_COMMAND_TYPE, SWITCH_TO_COMPANION_TAB } from "@/constants/constant";
import { navigateTo } from "@/router";
import { getAccessToken } from "@/constant/token";
import { getAccessToken } from "@/constants/token";
import FindTabs from "./components/FindTabs/index.vue";
import CardSwiper from "./components/CardSwiper/index.vue";

View File

@@ -8,8 +8,8 @@
<script setup>
import { ref, onMounted, nextTick } from "vue";
import { SCROLL_TO_BOTTOM } from "@/constant/constant";
import { discoveryCradComponent } from "@/request/api/MainPageDataApi";
import { SCROLL_TO_BOTTOM } from "@/constants/constant";
import { discoveryCradComponent } from "@/api/home";
import RecommendPostsList from "../RecommendPostsList/index.vue";
const themeDTOList = ref([]);

View File

@@ -13,7 +13,7 @@
</template>
<script setup>
import { SEND_MESSAGE_CONTENT_TEXT, SEND_MESSAGE_COMMAND_TYPE } from "@/constant/constant";
import { SEND_MESSAGE_CONTENT_TEXT, SEND_MESSAGE_COMMAND_TYPE } from "@/constants/constant";
import { defineProps } from "vue";
import ModuleTitle from "@/components/ModuleTitle/index.vue";

View File

@@ -25,8 +25,8 @@
padding: 12px;
text-align: center;
font-weight: 500;
font-size: $uni-font-size-sm;
color: $uni-text-color;
font-size: 12px;
color: #333;
}
}
}

View File

@@ -32,8 +32,8 @@
<script setup>
import { ref, defineEmits, defineExpose } from "vue";
import { getLoginUserPhone } from "@/request/api/LoginApi";
import { NOTICE_EVENT_LOGOUT } from "@/constant/constant";
import { getLoginUserPhone } from "@/api/login";
import { NOTICE_EVENT_LOGOUT } from "@/constants/constant";
import { useAppStore } from "@/store";
const appStore = useAppStore();
@@ -88,22 +88,7 @@ const handleMenuClick = (item) => {
};
// 退出登录
const handleLogout = () => {
uni.showModal({
title: "温馨提示",
content: "确定要退出登录吗?",
success: (res) => {
if (res.confirm) {
uni.clearStorageSync();
emits("close");
uni.$emit(NOTICE_EVENT_LOGOUT);
uni.showToast({
title: "退出登录成功",
});
}
},
});
};
const handleLogout = () => { };
defineExpose({ getLoginUserPhoneInfo });
</script>

View File

@@ -32,7 +32,7 @@
.label {
font-size: 28rpx;
color: $uni-text-color;
color: #333;
}
.value {
@@ -59,7 +59,7 @@
height: 42px;
margin-top: 40px;
background-color: #fff;
color: $uni-text-color;
color: #333;
border-radius: 8rpx;
border: none;
}

View File

@@ -15,7 +15,7 @@
.title {
font-size: 18px;
text-align: center;
color: $uni-text-color;
color: #333;
}
.close-icon {

View File

@@ -35,8 +35,8 @@
import { defineProps, nextTick, onMounted, computed } from "vue";
import {
SCROLL_TO_BOTTOM,
} from "@/constant/constant";
import { getAccessToken } from "@/constant/token";
} from "@/constants/constant";
import { getAccessToken } from "@/constants/token";
import { navigateTo } from "@/router";

View File

@@ -4,7 +4,7 @@
}
.content {
background: linear-gradient(180deg, $theme-color-100 0%, #0ccd58 100%);
background: linear-gradient(180deg, #e8fff1 0%, #0ccd58 100%);
border-radius: 24px 24px 24px 24px;
border: 1px solid #ffffff;
position: relative;
@@ -23,8 +23,8 @@
.btn-bg-sub {
background: #0ccd58;
box-shadow:
inset 0px 0px 41px 0px $theme-color-50,
inset 0px 0px 15px 0px $theme-color-100;
inset 0px 0px 41px 0px #f0f8f3,
inset 0px 0px 15px 0px #e8fff1;
}
/* 左上角标签容器 */

View File

@@ -20,7 +20,7 @@ import { onMounted, ref } from "vue";
import { defineProps, computed } from "vue";
import SpriteAnimator from "@/components/Sprite/SpriteAnimator.vue";
import NoticeMessage from "../NoticeMessage/index.vue";
import { getLocalWeather } from "@/request/api/MainPageDataApi";
import { getLocalWeather } from "@/api/home";
const weatherText = ref('');

View File

@@ -79,7 +79,7 @@
<script setup>
import TopNavBar from "@/components/TopNavBar/index.vue";
import { SEND_MESSAGE_CONTENT_TEXT } from "@/constant/constant";
import { SEND_MESSAGE_CONTENT_TEXT } from "@/constants/constant";
const products = [
{

View File

@@ -76,8 +76,8 @@
<script setup>
import TopNavBar from "@/components/TopNavBar/index.vue";
import { SEND_MESSAGE_CONTENT_TEXT } from "@/constant/constant";
import { getAccessToken } from "@/constant/token";
import { SEND_MESSAGE_CONTENT_TEXT } from "@/constants/constant";
import { getAccessToken } from "@/constants/token";
import { navigateTo } from "@/router";
const photo = {

View File

@@ -69,7 +69,7 @@
<script setup>
import TopNavBar from "@/components/TopNavBar/index.vue";
import { SEND_MESSAGE_CONTENT_TEXT } from "@/constant/constant";
import { SEND_MESSAGE_CONTENT_TEXT } from "@/constants/constant";
const faq = ["古桥有什么传说", "最佳观赏时间", "旁边还有什么景点"];

View File

@@ -94,7 +94,7 @@
<script setup>
import TopNavBar from "@/components/TopNavBar/index.vue";
import { SEND_MESSAGE_CONTENT_TEXT } from "@/constant/constant";
import { SEND_MESSAGE_CONTENT_TEXT } from "@/constants/constant";
const steps = [
{

View File

@@ -30,8 +30,8 @@
<script setup>
import { ref } from "vue";
import { Command } from "@/model/ChatModel";
import { SEND_MESSAGE_COMMAND_TYPE } from "@/constant/constant";
import { Command } from "@/constants/ChatModel";
import { SEND_MESSAGE_COMMAND_TYPE } from "@/constants/constant";
import { checkToken } from "@/hooks/useGoLogin";
const popup = ref(null);

View File

@@ -37,8 +37,8 @@
<script setup>
import { computed, onMounted, ref } from "vue";
import { getTimeNoticeList } from "@/request/api/MainPageDataApi";
import { NOTICE_EVENT_LOGIN_SUCCESS } from "@/constant/constant";
import { getTimeNoticeList } from "@/api/home";
import { NOTICE_EVENT_LOGIN_SUCCESS } from "@/constants/constant";
const props = defineProps({
tipsMessage: {

View File

@@ -24,7 +24,7 @@
.label {
font-size: 24rpx;
color: $uni-text-color-grey;
color: #333-grey;
}
.date {
font-size: 28rpx;

View File

@@ -12,8 +12,8 @@ import QuickBookingCalender from "../QuickBookingCalender/index.vue";
import QuickBookingContentList from "../QuickBookingContentList/index.vue";
import { ref, nextTick } from "vue";
import { onMounted } from "vue";
import { quickBookingComponent } from "@/request/api/MainPageDataApi";
import { SCROLL_TO_BOTTOM } from "@/constant/constant";
import { quickBookingComponent } from "@/api/home";
import { SCROLL_TO_BOTTOM } from "@/constants/constant";
const selectedDate = ref({});

View File

@@ -25,7 +25,7 @@
left: 8px;
background: #ffe7b2;
color: #b97a00;
font-size: $uni-font-size-sm;
font-size: 12px;
padding: 2px 8px;
border-radius: 4px;
z-index: 2;
@@ -59,7 +59,7 @@
}
.card-title {
font-size: $uni-font-size-lg;
font-size: 16px;
font-weight: bold;
color: #222;
width: 100%;
@@ -112,7 +112,7 @@
.card-price {
color: #ff6600;
font-size: $uni-font-size-lg;
font-size: 16px;
font-weight: bold;
}
.card-unit {

View File

@@ -23,7 +23,7 @@
<script setup>
import { defineProps } from "vue";
import { SEND_MESSAGE_CONTENT_TEXT, SEND_MESSAGE_COMMAND_TYPE } from "@/constant/constant";
import { SEND_MESSAGE_CONTENT_TEXT, SEND_MESSAGE_COMMAND_TYPE } from "@/constants/constant";
import ModuleTitle from "@/components/ModuleTitle/index.vue";
const props = defineProps({

View File

@@ -14,7 +14,7 @@
.popup-title {
font-size: 18px;
font-weight: 600;
color: $uni-text-color;
color: #333;
text-align: center;
line-height: 24px;
}
@@ -65,8 +65,8 @@
align-items: center;
justify-content: center;
color: #ffffff;
border-radius: $uni-border-radius-50px;
font-size: $uni-font-size-lg;
border-radius: 50px;
font-size: 16px;
font-weight: 500;
transition: all 0.3s ease;

View File

@@ -56,7 +56,7 @@ import {
import CheckBox from "@/components/CheckBox/index.vue";
import AgreePopup from "./components/AgreePopup/index.vue";
import { zniconsMap } from "@/static/fonts/znicons";
import { getCurrentConfig } from "@/constant/base";
import { getCurrentConfig } from "@/constants/base";
// 是否需要微信手机号授权登录
const needWxAuthLogin = ref(false);

View File

@@ -7,7 +7,7 @@
.notice-title {
display: flex;
align-items: center;
font-size: $uni-font-size-lg;
font-size: 16px;
font-weight: 500;
color: $uni-text-color;
color: #333;
}

View File

@@ -21,7 +21,7 @@
}
.tab-text {
font-size: $uni-font-size-base;
font-size: 14px;
color: #666;
font-weight: 400;
transition: all 0.3s ease;
@@ -29,14 +29,14 @@
}
.tab-text-active {
color: $uni-text-color;
font-size: $uni-font-size-lg;
color: #333;
font-size: 16px;
font-weight: 600;
}
.tab-item-active {
.tab-text {
color: $uni-text-color;
color: #333;
font-weight: 600;
}
}
@@ -48,7 +48,8 @@
min-height: 3px; /* 确保最小高度 */
background-color: #007aff;
border-radius: 10px;
transition: left 0.3s cubic-bezier(0.4, 0, 0.2, 1),
transition:
left 0.3s cubic-bezier(0.4, 0, 0.2, 1),
width 0.3s cubic-bezier(0.4, 0, 0.2, 1);
z-index: 1;
transform: translateZ(0); /* 启用硬件加速 */

View File

@@ -1,4 +1,4 @@
.order-detail-wrapper {
background: linear-gradient(180deg, $theme-color-100 0%, #f5f7fa 100%);
background: linear-gradient(180deg, #e8fff1 0%, #f5f7fa 100%);
padding: 0 12px 40px;
}

View File

@@ -1,5 +1,5 @@
.tab-wrapper {
background-color: $theme-color-100;
background-color: #e8fff1;
height: 48px;
overflow-x: auto;
/* 支持横向滚动 */

View File

@@ -2,10 +2,7 @@
<div class="order-card bg-white border-box p-12 rounded-12 m-12">
<!-- 卡片头部 -->
<div class="border-box flex flex-items-center pb-12">
<img
class="icon mr-4"
src="https://oss.nianxx.cn/mp/static/version_101/service/service_icon.png"
/>
<img class="icon mr-4" src="https://oss.nianxx.cn/mp/static/version_101/service/service_icon.png" />
<span class="font-size-14 color-525866 line-height-20">工单</span>
<span class="font-size-12 color-525866 line-height-20 ml-auto">{{
isCancelWork ? "已取消" : workOrderStatus(orderData.workOrderStatus)
@@ -25,54 +22,34 @@
</div>
</div>
<img
v-if="orderData.contentImgUrl"
class="right rounded-6"
:src="orderData.contentImgUrl"
mode="aspectFill"
/>
<img v-if="orderData.contentImgUrl" class="right rounded-6" :src="orderData.contentImgUrl" mode="aspectFill" />
</div>
<!-- 服务人员 -->
<div
v-if="orderData.processMemberName && orderData.processMemberPhone"
class="service-user border-box p-8 flex flex-items-center flex-justify-between mb-12"
>
<div v-if="orderData.processMemberName && orderData.processMemberPhone"
class="service-user border-box p-8 flex flex-items-center flex-justify-between mb-12">
<div class="font-size-12 line-height-16">
服务人员{{ orderData.processMemberName }}
</div>
<uni-icons
class="ml-auto mr-4"
type="phone-filled"
size="14"
color="#436799"
/>
<span class="font-size-12 line-height-16" @click="callService"
>拨打电话</span
>
<uni-icons class="ml-auto mr-4" type="phone-filled" size="14" color="#436799" />
<span class="font-size-12 line-height-16" @click="callService">拨打电话</span>
</div>
<!-- 取消操作 -->
<div
v-if="
!isCancelWork &&
orderData.workOrderStatus !== '2' &&
orderData.workOrderStatus !== '3'
"
class="flex flex-items-center flex-justify-between"
>
<span
class="cancel border-box border rounded-6 font-size-12 line-height-16 color-525866 ml-auto"
@click="cancelCall"
>取消呼叫</span
>
<div v-if="
!isCancelWork &&
orderData.workOrderStatus !== '2' &&
orderData.workOrderStatus !== '3'
" class="flex flex-items-center flex-justify-between">
<span class="cancel border-box border rounded-6 font-size-12 line-height-16 color-525866 ml-auto"
@click="cancelCall">取消呼叫</span>
</div>
</div>
</template>
<script setup>
import { defineProps } from "vue";
import { closeWorkOrder } from "@/request/api/WorkOrderApi";
import { closeWorkOrder } from "@/api/WorkOrder";
import { ref } from "vue";
const isCancelWork = ref(false);

View File

@@ -1,36 +1,21 @@
<template>
<z-paging
:bg-color="
'linear-gradient(180deg, ' +
$theme -
color -
100 +
' 0%, #F5F7FA 100%) 0 86px / 100% 100px no-repeat'
"
ref="paging"
v-model="dataList"
use-virtual-list
:force-close-inner-list="true"
cell-height-mode="dynamic"
safe-area-inset-bottom
@query="queryList"
>
<z-paging :bg-color="'linear-gradient(180deg, ' +
$theme -
color -
100 +
' 0%, #F5F7FA 100%) 0 86px / 100% 100px no-repeat'
" ref="paging" v-model="dataList" use-virtual-list :force-close-inner-list="true" cell-height-mode="dynamic"
safe-area-inset-bottom @query="queryList">
<template #top>
<TopNavBar title="呼叫服务" />
</template>
<template #empty>
<CustomEmpty
emptyIcon="https://oss.nianxx.cn/mp/static/version_101/order/service_empty.png"
statusspan="您暂无呼叫服务"
/>
<CustomEmpty emptyIcon="https://oss.nianxx.cn/mp/static/version_101/order/service_empty.png"
statusspan="您暂无呼叫服务" />
</template>
<OrderCard
v-for="(item, index) in dataList"
:key="item.id || index"
:orderData="item"
/>
<OrderCard v-for="(item, index) in dataList" :key="item.id || index" :orderData="item" />
</z-paging>
</template>
@@ -39,7 +24,7 @@ import { ref } from "vue";
import TopNavBar from "@/components/TopNavBar/index.vue";
import CustomEmpty from "@/components/CustomEmpty/index.vue";
import OrderCard from "./components/OrderCard/index.vue";
import { userWorkOrderList } from "@/request/api/WorkOrderApi";
import { userWorkOrderList } from "@/api/WorkOrder";
const dataList = ref([]);
const paging = ref(null);