From 14368e8a09c4b5793d0975f85e36a4c1d410ca36 Mon Sep 17 00:00:00 2001 From: wupengfei <834520024@qq.com> Date: 星期五, 16 五月 2025 17:27:24 +0800 Subject: [PATCH] feat: UI --- apps/taro/src/components/List/ListItemV2.vue | 63 ++++++++++ packages/components/src/components/Card/OrderCard.vue | 63 ++++++--- apps/taro/src/assets/mine/icon-mine-promotion.png | 0 apps/taro/src/pages/mine/index.vue | 51 +++++++ apps/taro/src/assets/mine/icon-mine-userId.png | 0 apps/taro/src/pages/mine/index.scss | 29 ++-- packages/components/src/constants/img.ts | 10 + apps/taro/src/assets/mine/icon-mine-order.png | 0 apps/taro/src/components/index.ts | 1 apps/taro/src/assets/mine/icon-mine-customer-service.png | 0 packages/components/src/styles/orderCard.scss | 80 +++++++++---- packages/components/src/styles/index.scss | 2 apps/taro/src/constants/img.ts | 3 apps/taro/src/assets/mine/icon-mine-data-board.png | 0 14 files changed, 235 insertions(+), 67 deletions(-) diff --git a/apps/taro/src/assets/mine/icon-mine-customer-service.png b/apps/taro/src/assets/mine/icon-mine-customer-service.png new file mode 100644 index 0000000..ddcbeb4 --- /dev/null +++ b/apps/taro/src/assets/mine/icon-mine-customer-service.png Binary files differ diff --git a/apps/taro/src/assets/mine/icon-mine-data-board.png b/apps/taro/src/assets/mine/icon-mine-data-board.png new file mode 100644 index 0000000..25e3831 --- /dev/null +++ b/apps/taro/src/assets/mine/icon-mine-data-board.png Binary files differ diff --git a/apps/taro/src/assets/mine/icon-mine-order.png b/apps/taro/src/assets/mine/icon-mine-order.png new file mode 100644 index 0000000..defd522 --- /dev/null +++ b/apps/taro/src/assets/mine/icon-mine-order.png Binary files differ diff --git a/apps/taro/src/assets/mine/icon-mine-promotion.png b/apps/taro/src/assets/mine/icon-mine-promotion.png new file mode 100644 index 0000000..5b733c5 --- /dev/null +++ b/apps/taro/src/assets/mine/icon-mine-promotion.png Binary files differ diff --git a/apps/taro/src/assets/mine/icon-mine-userId.png b/apps/taro/src/assets/mine/icon-mine-userId.png new file mode 100644 index 0000000..37fd1d0 --- /dev/null +++ b/apps/taro/src/assets/mine/icon-mine-userId.png Binary files differ diff --git a/apps/taro/src/components/List/ListItemV2.vue b/apps/taro/src/components/List/ListItemV2.vue new file mode 100644 index 0000000..e880e8f --- /dev/null +++ b/apps/taro/src/components/List/ListItemV2.vue @@ -0,0 +1,63 @@ +<template> + <div class="pro-list-itemV2"> + <div class="pro-list-itemV2-inner"> + <img v-if="icon" :src="icon" class="pro-list-itemV2-icon" /> + <div class="pro-list-itemV2-title">{{ title }}</div> + <slot name="extra"></slot> + <img v-if="showArrow" :src="IconArrow" class="pro-list-itemV2-arrow" /> + </div> + </div> +</template> + +<script setup lang="ts"> +import IconArrow from '@/assets/setting/icon-arrow.png'; + +defineOptions({ + name: 'ListItemV2', +}); + +type Props = { + icon?: string; + title?: string; + showArrow?: boolean; +}; + +const props = withDefaults(defineProps<Props>(), { + showArrow: true, +}); +</script> + +<style lang="scss"> +@import '@/styles/common.scss'; + +.pro-list-itemV2 { + padding: 0 boleGetCssVar('size', 'body-padding-h'); + + .pro-list-itemV2-inner { + height: 112px; + display: flex; + align-items: center; + + .pro-list-itemV2-icon { + width: 48px; + height: 48px; + margin-right: 16px; + } + + .pro-list-itemV2-title { + font-weight: 400; + font-size: 32px; + color: boleGetCssVar('text-color', 'primary'); + line-height: 44px; + flex: 1; + min-width: 0; + @include ellipsis; + } + + .pro-list-itemV2-arrow { + width: 32px; + height: 32px; + } + } +} +</style> diff --git a/apps/taro/src/components/index.ts b/apps/taro/src/components/index.ts index ff8db0e..7675d75 100644 --- a/apps/taro/src/components/index.ts +++ b/apps/taro/src/components/index.ts @@ -2,6 +2,7 @@ export { default as TransparentNavigationBar } from './NavigationBar/TransparentNavigationBar.vue'; export { default as List } from './List/List.vue'; export { default as ListItem } from './List/ListItem.vue'; +export { default as ListItemV2 } from './List/ListItemV2.vue'; export { default as LargeTitleNavigationBar } from './NavigationBar/LargeTitleNavigationBar.vue'; export { default as PageLayout } from './Layout/PageLayout.vue'; export { default as PageLayoutWithBg } from './Layout/PageLayoutWithBg.vue'; diff --git a/apps/taro/src/constants/img.ts b/apps/taro/src/constants/img.ts index 0694927..1a2db99 100644 --- a/apps/taro/src/constants/img.ts +++ b/apps/taro/src/constants/img.ts @@ -6,7 +6,8 @@ HomePageBg: `${OssBasePath}/lifePayment/assets/common/icon-home-page-bg.png`, }, mine: { - Bg: `${OssBasePath}/matchMakingMini/assets/mine/icon-bg.png`, + // Bg: `${OssBasePath}/matchMakingMini/assets/mine/icon-bg.png`, + Bg: `${OssBasePath}/lifePayment/assets/common/icon-home-page-bg.png`, IdBg: `${OssBasePath}/matchMakingMini/assets/mine/icon-id-bg.png`, }, setting: { diff --git a/apps/taro/src/pages/mine/index.scss b/apps/taro/src/pages/mine/index.scss index fcd093e..63af7e4 100644 --- a/apps/taro/src/pages/mine/index.scss +++ b/apps/taro/src/pages/mine/index.scss @@ -4,26 +4,27 @@ // background-color: $body-background-color; // } -.mine-page-bg { - position: fixed; - z-index: -1; - top: 0; - left: 0; - width: 750px; - height: 434px; - object-fit: cover; +.index-page-wrapper { + .home-page-bg { + position: fixed; + z-index: -1; + top: 0; + left: 0; + width: 100%; + height: 100%; + object-fit: cover; + } } .mine-page-top-view { display: flex; - padding: 30px 20px; - margin-top: 30px; + padding: 36px 36px 64px; .mine-avatar { - width: 120px; - height: 120px; + width: 176px; + height: 176px; object-fit: cover; - margin-right: 30px; + margin-right: 36px; } .user-info { @@ -44,5 +45,5 @@ } .mine-list-wrapper { - margin-top: 60px; + border-radius: 20px; } diff --git a/apps/taro/src/pages/mine/index.vue b/apps/taro/src/pages/mine/index.vue index 403801c..d6a3c92 100644 --- a/apps/taro/src/pages/mine/index.vue +++ b/apps/taro/src/pages/mine/index.vue @@ -1,5 +1,5 @@ <template> - <PageLayoutWithBg class="mine-page-wrapper" title="鎴戠殑" :need-auth="false"> + <!-- <PageLayoutWithBg class="mine-page-wrapper" title="鎴戠殑" :need-auth="false"> <template #navigationBar> <TransparentNavigationBar title="涓汉涓績" @@ -31,17 +31,60 @@ <ListItem v-if="isLogin" title="閫�鍑虹櫥褰�" @click="goLogout"></ListItem> </List> </ContentScrollView> - </PageLayoutWithBg> + </PageLayoutWithBg> --> + <PageLayout class="index-page-wrapper" :need-auth="false"> + <template #navigationBar> + <TransparentNavigationBar :title="'涓汉涓績'" :is-absolute="false"> + </TransparentNavigationBar> + </template> + <template #bg> + <img :src="OssAssets.common.HomePageBg" class="home-page-bg" /> + </template> + <div class="mine-page-top-view" @click="goLogin"> + <img class="mine-avatar" :src="DefaultAvatar" alt="" /> + <div class="user-info"> + <div class="user-info-name" v-if="isLogin"> + {{ hiddenPhoneNumber(virtualPhoneNumber) }} + </div> + <div class="mine-go-login" v-else>鐧诲綍</div> + </div> + </div> + <ContentView> + <List class="mine-list-wrapper"> + <ListItemV2 :icon="IconMineOrder" title="璁㈠崟绠$悊" @click="goOrderManage"></ListItemV2> + <ListItemV2 :icon="IconMineUserId" title="鎴峰彿绠$悊" @click="goUserAccountList"></ListItemV2> + <template v-if="isChannelAccount"> + <ListItemV2 :icon="IconMineDataBoard" title="鏁版嵁鐪嬫澘" @click="goDashboard"></ListItemV2> + <ListItemV2 + :icon="IconMinePromotion" + title="鎺ㄥ箍浜岀淮鐮�" + @click="goShareQrcode" + ></ListItemV2> + </template> + <ListItemV2 + :icon="IconMineCustomerService" + v-if="isWeb && !isInAlipay" + title="鍦ㄧ嚎瀹㈡湇" + @click="handleChat" + ></ListItemV2> + <ListItemV2 v-if="isLogin" title="閫�鍑虹櫥褰�" @click="goLogout"></ListItemV2> + </List> + </ContentView> + </PageLayout> </template> <script setup lang="ts"> -import { TransparentNavigationBar, List, ListItem } from '@/components'; +import { TransparentNavigationBar, List, ListItemV2 } from '@/components'; import { useUser, useIsLogin, useGoLogin, useAccessLogin, useOnlineService } from '@/hooks'; import Taro from '@tarojs/taro'; import { RouterPath, OssAssets } from '@/constants'; import DefaultAvatar from '@/assets/components/icon-default-avatar.png'; +import IconMineOrder from '@/assets/mine/icon-mine-order.png'; +import IconMineUserId from '@/assets/mine/icon-mine-userId.png'; +import IconMineDataBoard from '@/assets/mine/icon-mine-data-board.png'; +import IconMinePromotion from '@/assets/mine/icon-mine-promotion.png'; +import IconMineCustomerService from '@/assets/mine/icon-mine-customer-service.png'; import { useSystemStore } from '@/stores/modules/system'; -import PageLayoutWithBg from '@/components/Layout/PageLayoutWithBg.vue'; import { useUserStore } from '@/stores/modules/user'; import { Message } from '@/utils'; import { isWeb, isInAlipay } from '@/utils/env'; diff --git a/packages/components/src/components/Card/OrderCard.vue b/packages/components/src/components/Card/OrderCard.vue index d261033..d8f2a47 100644 --- a/packages/components/src/components/Card/OrderCard.vue +++ b/packages/components/src/components/Card/OrderCard.vue @@ -1,42 +1,44 @@ <template> <div class="order-card"> <div class="order-card-title"> - <div class="order-card-title-top"> + <div class="order-card-title-left"> <div class="order-card-title-text">{{ title }}</div> - <div class="order-card-title-status"> - {{ LifeRechargeConstants.LifePayOrderStatusEnumText[status] }} - </div> - </div> - <div class="order-card-title-ordernum-wrapper"> <div class="order-card-title-ordernum"> {{ `璁㈠崟缂栧彿锛�${orderNo}` }} </div> - <slot name="actions"> - <div - class="order-card-action" - v-if="status === LifeRechargeConstants.LifePayOrderStatusEnum.鍏呭�间腑" - @click="emit('goApplyRefund', id)" - > - 鐢宠閫�娆� - </div> - <div - class="order-card-action" - v-if="status === LifeRechargeConstants.LifePayOrderStatusEnum.閫�娆惧け璐�" - @click="emit('goRefundDetail', orderNo)" - > - 璇︽儏 - </div> - </slot> + </div> + <div class="order-card-title-status"> + <img :src="LifePayOrderStatusEnumImg[status]" alt="" /> </div> </div> <div class="order-card-content"> <slot></slot> </div> + <slot name="actions"> + <div class="order-card-footer" v-if="shoeFooter"> + <div + v-if="status === LifeRechargeConstants.LifePayOrderStatusEnum.鍏呭�间腑" + class="order-card-action" + @click="emit('goApplyRefund', id)" + > + 鐢宠閫�娆� + </div> + <div + class="order-card-action" + v-if="status === LifeRechargeConstants.LifePayOrderStatusEnum.閫�娆惧け璐�" + @click="emit('goRefundDetail', orderNo)" + > + 璇︽儏 + </div> + </div> + </slot> </div> </template> <script setup lang="ts"> import { LifeRechargeConstants } from '@life-payment/core-vue'; +import { OssAssets } from '../../constants'; +import { computed } from 'vue'; defineOptions({ name: 'OrderCard', @@ -55,4 +57,21 @@ (e: 'goApplyRefund', id: string): void; (e: 'goRefundDetail', orderNo: string): void; }>(); + +const LifePayOrderStatusEnumImg = { + [LifeRechargeConstants.LifePayOrderStatusEnum.鍏呭�间腑]: OssAssets.card.Recharge, + [LifeRechargeConstants.LifePayOrderStatusEnum.宸插け璐: OssAssets.card.Failed, + [LifeRechargeConstants.LifePayOrderStatusEnum.宸插畬鎴怾: OssAssets.card.Success, + [LifeRechargeConstants.LifePayOrderStatusEnum.寰呴��娆綸: OssAssets.card.WaitRefund, + [LifeRechargeConstants.LifePayOrderStatusEnum.宸查��娆綸: OssAssets.card.Refunded, + [LifeRechargeConstants.LifePayOrderStatusEnum.閫�娆惧け璐: OssAssets.card.RefundFail, + [LifeRechargeConstants.LifePayOrderStatusEnum.閫�娆句腑]: OssAssets.card.Refund, +}; + +const shoeFooter = computed(() => { + return ( + props.status === LifeRechargeConstants.LifePayOrderStatusEnum.鍏呭�间腑 || + props.status === LifeRechargeConstants.LifePayOrderStatusEnum.閫�娆惧け璐� + ); +}); </script> diff --git a/packages/components/src/constants/img.ts b/packages/components/src/constants/img.ts index cb5fab6..26f4d94 100644 --- a/packages/components/src/constants/img.ts +++ b/packages/components/src/constants/img.ts @@ -6,4 +6,14 @@ FreeDian: `${OssBasePath}/lifePayment/assets/home/icon-free-dian.png`, FreeGas: `${OssBasePath}/lifePayment/assets/home/icon-free-gas.png`, }, + + card: { + Failed: `${OssBasePath}/lifePayment/assets/card/card-status-failed.png`, + Recharge: `${OssBasePath}/lifePayment/assets/card/card-status-recharge.png`, + RefundFail: `${OssBasePath}/lifePayment/assets/card/card-status-refund-fail.png`, + Refund: `${OssBasePath}/lifePayment/assets/card/card-status-refund.png`, + Refunded: `${OssBasePath}/lifePayment/assets/card/card-status-refunded.png`, + Success: `${OssBasePath}/lifePayment/assets/card/card-status-success.png`, + WaitRefund: `${OssBasePath}/lifePayment/assets/card/card-status-wait-refund.png`, + }, }; diff --git a/packages/components/src/styles/index.scss b/packages/components/src/styles/index.scss index bb0c7c7..7ccae1d 100644 --- a/packages/components/src/styles/index.scss +++ b/packages/components/src/styles/index.scss @@ -52,5 +52,5 @@ .life-page-infinite-scroll-list { @include lifeListScrollView; - padding-top: 16px; + padding-top: 32px; } diff --git a/packages/components/src/styles/orderCard.scss b/packages/components/src/styles/orderCard.scss index 8578715..9619746 100644 --- a/packages/components/src/styles/orderCard.scss +++ b/packages/components/src/styles/orderCard.scss @@ -1,10 +1,9 @@ @use './common.scss' as *; .order-card { - border: 1px solid #e8e8e8; - border-radius: 12px; - padding: 20px; - margin-bottom: 20px; + border-radius: 24px; + padding: 40px 28px; + margin-bottom: 32px; background-color: #fff; &:last-child { @@ -13,46 +12,73 @@ .order-card-title { display: flex; - flex-direction: column; - border-bottom: 1px solid #e8e8e8; - padding-bottom: 20px; - margin-bottom: 20px; + border-bottom: 1px solid #f3f3f3; + padding-bottom: 32px; + margin-bottom: 32px; - .order-card-title-top { + .order-card-title-left { display: flex; + flex-direction: column; justify-content: space-between; color: #333333; - font-size: 28px; - line-height: 40px; - font-weight: 600; - margin-bottom: 12px; + flex: 1; + min-width: 0; + margin-right: 56px; + + .order-card-title-text { + font-size: 30px; + line-height: 42px; + font-weight: 400; + } } .order-card-title-ordernum { - font-size: 24px; - color: #999999; - flex: 1; - min-width: 0; + font-size: 28px; + line-height: 40px; + color: #575b6c; @include ellipsis; } - .order-card-title-ordernum-wrapper { - display: flex; - align-items: center; + .order-card-title-status { + width: 116px; + height: 116px; - .order-card-action { - font-size: 24px; - color: boleGetCssVar('color', 'primary'); + img { + width: 100%; + height: 100%; } } + } + + .order-card-content { + padding-bottom: 26px; + } + + .order-card-footer { + display: flex; + justify-content: flex-end; + padding-top: 32px; + border-top: solid 1px #f7f7f7; + } + + .order-card-action { + display: flex; + justify-content: center; + align-items: center; + padding: 6px 24px; + color: boleGetCssVar('color', 'primary'); + font-size: 26px; + line-height: 36px; + border: 1px solid boleGetCssVar('color', 'primary'); + border-radius: 8px; } } .order-card-item { display: flex; font-size: 28px; - line-height: 40px; - margin-bottom: 15px; + line-height: 48px; + margin-bottom: 8px; .order-card-item-label { color: #333333; @@ -69,4 +95,8 @@ color: boleGetCssVar('color', 'danger'); } } + + &:last-child { + margin-bottom: 0; + } } -- Gitblit v1.9.1