first commit

This commit is contained in:
2026-02-26 09:32:03 +08:00
commit 36a8e4c51b
845 changed files with 116474 additions and 0 deletions
@@ -0,0 +1,331 @@
<script setup lang="ts">
import * as R from "ramda";
import dayjs from 'dayjs'
import useEventEmit from "@/hooks/useEventEmit";
import { EventEnum } from "@/constant/enums";
import { useConfigStore, useUserStore } from "@/store";
import MineSkeleton from "./components/mine-skeleton.vue";
const configStore = useConfigStore();
const userStore = useUserStore();
import { Agreement } from "@/constant/enums";
import Config from '@/config/index'
import {formatTimestampWithMonthName, loadWeixinService} from "@/utils/utils";
const { t } = useI18n();
const loading = ref(true);
const emits = defineEmits<{
chooseLanguage: [];
logOut: [];
inviteUser: [];
customerService: [];
changeOrder: [];
}>();
interface Tab {
iconPath: string;
path: string;
text: string;
code: string;
isLogin: boolean;
}
const tabBarList = ref<Tab[]>([
{
iconPath: "/static/images/chef/100201.png",
path: "/pages-user/pages/coupon/index",
text: t("pages.mine.discount"),
code: "discount",
isLogin: true,
},
{
iconPath: "/static/images/chef/100200.png",
path: "/pages-user/pages/faqs/index",
text: t("pages.mine.help"),
code: "help",
isLogin: true,
},
{
iconPath: "/static/images/chef/100199.png",
path: "/pages-user/pages/coupon/index",
text: t("pages.mine.inviteFriends"),
code: "inviteFriends",
isLogin: true,
},
{
iconPath: "/static/images/100203.png",
path: "/pages-user/pages/invited-person/index",
text: t('pages.mine.my-invitations'),
code: "myInvitations",
isLogin: true,
},
{
iconPath: "/static/images/chef/100198.png",
path: "/pages-user/pages/store-settle-in/index",
text: t("pages.mine.storeSettled"),
code: "storeSettled",
isLogin: false,
},
{
iconPath: "/static/images/chef/100197.png",
path: "/pages-user/pages/coupon/index",
text: t("pages.mine.support"),
code: "support",
isLogin: true,
},
{
iconPath: "/static/images/chef/100196.png",
path: "/pages/agreement/index?code=" + Agreement.CHEF_PLATFORM_AGREEMENT,
text: t("pages.mine.platformAgreement"),
code: "platformAgreement",
isLogin: true,
},
{
iconPath: "/static/images/chef/100195.png",
path: "/pages/agreement/index?code=" + Agreement.PRIVACY_POLICY,
text: t("pages.mine.privacyPolicy"),
code: "privacyPolicy",
isLogin: true,
},
{
iconPath: "/static/images/chef/100194.png",
path: "/pages-user/pages/complaints/index",
text: t("pages.mine.complaintsAndSuggestions"),
code: "complaintsAndSuggestions",
isLogin: true,
},
{
iconPath: "/static/images/chef/100192.png",
path: "/pages-user/pages/setting/index",
text: t("pages.mine.set"),
code: "set",
isLogin: true,
},
]);
function navigateTo(url: string) {
if(userStore.checkLogin()) {
uni.navigateTo({
url,
});
}
}
function checkNeedLogin(isNeedLogin: boolean) {
return isNeedLogin ? userStore.checkLogin() : true;
}
// 用户会员状态是否已开通
const isUserMember = computed(()=> {
if(!userStore.userInfo.userMembershipVo) return false
if(userStore.userInfo.userMembershipVo && userStore.userInfo.userMembershipVo.expireTime ){
return dayjs().isBefore(dayjs(Number(userStore.userInfo.userMembershipVo.expireTime)))
} else {
return false
}
})
function handleTabClick(item: Tab) {
switch (item.code) {
case "inviteFriends": {
// R.both(checkNeedLogin, R.pipe(() => emits("inviteUser"), R.T))(item.isLogin)
emits("inviteUser");
break;
}
case "support": {
// emits("customerService");
loadWeixinService()
break;
}
default: {
// navigateTo(item.path)
if (item.code === "set") {
navigateTo("/pages-user/pages/setting/index");
} else {
R.both(
checkNeedLogin,
R.pipe(() => navigateTo(item.path), R.T)
)(item.isLogin);
}
break;
}
}
}
function changeOrderFn() {
emits("changeOrder");
}
async function initData() {
loading.value = false;
// setTimeout(() => {
// loading.value = false;
// }, 300);
userStore.getUserInfo()
}
async function getPlatformDefaultStoreInfo() {}
defineExpose({
initData,
init: getPlatformDefaultStoreInfo,
});
</script>
<template>
<view
class="bg-#fff"
:style="[
{
height: configStore.windowHeight + 'px',
},
]"
>
<z-paging ref="paging">
<template #top>
<status-bar />
</template>
<view
v-show="loading"
class="animate-in fade-in animate-ease-out animate-duration-300"
>
<mine-skeleton />
</view>
<view
v-show="!loading"
class="animate-in fade-in animate-ease-in animate-duration-300"
>
<view class="px-30rpx">
<view
@click="navigateTo('/pages-user/pages/user-info/index')"
class="flex-center-sb mt-32rpx mb-82rpx"
>
<!-- <text class="text-56rpx text-#333 leading-56rpx font-bold tracking-[.04em]"-->
<!-- >{{ userStore.isLogin ? `${userStore.userInfo.firstName} ${userStore.userInfo.surname}` : t('common.pleaseLogin') }}-->
<!-- </text>-->
<text
class="text-56rpx text-#333 leading-56rpx font-bold tracking-[.04em]"
>
{{
userStore.isLogin
? ([userStore.userInfo.firstName, userStore.userInfo.surname].filter(Boolean).join(' ') || t('common.unknownUser'))
: t('common.pleaseLogin')
}}
</text>
<image
v-if="userStore.isLogin"
:src="userStore.userInfo.avatar"
class="w-130rpx h-130rpx rounded-50%"
mode="aspectFill"
/>
<image
v-else
class="w-130rpx h-130rpx rounded-50%"
mode="aspectFill"
src="@img/chef/default_avatar.png"
/>
</view>
<view class="flex-center-sb mb-36rpx">
<view
@click="navigateTo('/pages-user/pages/collection/index')"
class="flex-1 flex-col center bg-#F6F6F6 rounded-24rpx h-194rpx"
>
<view
class="text-44rpx text-#333 leading-44rpx font-bold mb-24rpx"
>{{ userStore.userInfo.collectNum || 0 }}</view
>
<view class="text-28rpx text-#333 leading-28rpx tracking-[.04em]">{{
t("pages.mine.collection")
}}</view>
</view>
<view
@click="navigateTo('/pages-user/pages/balance/index')"
class="flex-1 mx-32rpx flex-col center bg-#F6F6F6 rounded-24rpx h-194rpx"
>
<view
class="text-44rpx text-#333 leading-44rpx font-bold mb-24rpx"
>{{ userStore.userInfo?.balance || 0 }}</view
>
<view class="text-28rpx text-#333 leading-28rpx tracking-[.04em]">{{
t("pages.mine.wallet")
}}</view>
</view>
<view
@click="changeOrderFn"
class="flex-1 flex-col center bg-#F6F6F6 rounded-24rpx h-194rpx"
>
<view
class="text-44rpx text-#333 leading-44rpx font-bold mb-24rpx"
>{{ userStore.userInfo.orderNum || 0 }}</view
>
<view class="text-28rpx text-#333 leading-28rpx tracking-[.04em]">{{
t("pages.mine.order")
}}</view>
</view>
</view>
<template v-if="isUserMember">
<view @click="navigateTo('/pages-user/pages/member/index')" class="w-full h-152rpx relative mb-52rpx">
<image src="@img/chef/100203.png" class="w-full h-full absolute top-0 left-0"></image>
<view class="pl-28rpx py-22rpx pr-165rpx relative z-1 h-full flex flex-col justify-between">
<view class="text-40rpx text-#333 font-bold">
{{ Config.appName }}
</view>
<view class="text-24rpx lh-24rpx text-#935D04 tracking-[.08em]">
{{ t('common.expireTime') }}{{ formatTimestampWithMonthName(userStore.userInfo.userMembershipVo?.expireTime) }}
</view>
</view>
</view>
</template>
<template v-else>
<view @click="navigateTo('/pages-user/pages/member/index')" class="w-full h-152rpx relative mb-52rpx">
<image src="@img/chef/100203.png" class="w-full h-full absolute top-0 left-0"></image>
<view class="pl-28rpx py-22rpx pr-165rpx relative z-1 h-full flex flex-col justify-between">
<view class="text-40rpx text-#333 font-bold">
<!--用户没有试用过会员-->
<template v-if="!userStore.userInfo.userMembershipVo">{{ t('pages.mine.member-title') }}</template>
<template v-else>{{ t('pages.mine.join') }} {{ Config.appName }}</template>
</view>
<view class="text-24rpx lh-24rpx text-#935D04 tracking-[.08em]">{{ t('pages.mine.member-desc') }}</view>
</view>
</view>
</template>
<view
class="flex-center-sb py-28rpx bg-#fff"
v-for="(item, index) in tabBarList"
:key="item.code"
:class="[
index === tabBarList.length - 1 ? 'mb-58rpx' : 'border-bottom',
]"
@click="handleTabClick(item)"
>
<view class="flex items-center">
<image
class="w-44rpx h-44rpx shrink-0 mr-18rpx"
:src="item.iconPath"
></image>
<text class="text-30rpx text-primary font-500 lh-30rpx tracking-[.04em]">{{
item.text
}}</text>
</view>
<view class="flex items-center shrink-0 ml-20rpx">
<image class="w-22rpx h-30rpx" src="@img/chef/100202.png"></image>
</view>
</view>
</view>
</view>
<template #bottom>
<view class="h-50px"></view>
<view :style="[configStore.iosSafeBottomPlaceholder]"></view>
</template>
</z-paging>
</view>
</template>
<style scoped lang="scss">
.border-bottom {
border-bottom: 1rpx solid #dfdfdf;
}
</style>