From 915c06ecab1c80d50486d7fd9af772c5b6b2979a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=B5=B5=E5=BF=A0=E6=9E=97?= <170083662@qq.com> Date: Fri, 26 Sep 2025 11:22:09 +0800 Subject: [PATCH] =?UTF-8?q?feat(user):=20=E6=9B=B4=E6=96=B0=E7=94=A8?= =?UTF-8?q?=E6=88=B7=E7=95=8C=E9=9D=A2=E5=92=8C=E5=8A=9F=E8=83=BD=E5=AE=9E?= =?UTF-8?q?=E7=8E=B0-=20=E9=BB=98=E8=AE=A4=20=E4=BF=AE=E6=94=B9=20UnifiedQ?= =?UTF-8?q?RButton=E7=B1=BB=E5=9E=8B=E4=B8=BA=20danger-=20=E6=9B=B4?= =?UTF-8?q?=E6=96=B0=20Banner=20=E7=BB=84=E4=BB=B6=E4=BD=BF=E7=94=A8=20get?= =?UTF-8?q?CmsAdByCode=20=E8=8E=B7=E5=8F=96=E5=B9=BF=E5=91=8A=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=20-=20=E6=96=B0=E5=A2=9E=20CMS=20=E6=96=87=E7=AB=A0?= =?UTF-8?q?=E6=9F=A5=E8=AF=A2=E6=8E=A5=E5=8F=A3=20getCmsArticleByCode=20-?= =?UTF-8?q?=20=E8=B0=83=E6=95=B4=20UserCard=20=E7=BB=84=E4=BB=B6=E7=95=8C?= =?UTF-8?q?=E9=9D=A2=E6=A0=B7=E5=BC=8F=E5=92=8C=E9=80=BB=E8=BE=91-?= =?UTF-8?q?=E4=BC=98=E5=8C=96=20BestSellers=20=E5=95=86=E5=93=81=E5=B1=95?= =?UTF-8?q?=E7=A4=BA=E7=BB=84=E4=BB=B6=20-=20=E6=9B=B4=E6=96=B0=20IsDealer?= =?UTF-8?q?=20=E7=BB=84=E4=BB=B6=E6=94=AF=E6=8C=81=E7=BD=91=E7=AB=99?= =?UTF-8?q?=E5=AD=97=E6=AE=B5=E9=85=8D=E7=BD=AE=20-=20=E7=A7=BB=E9=99=A4?= =?UTF-8?q?=E7=94=A8=E6=88=B7=E9=A1=B5=E9=9D=A2=E9=83=A8=E5=88=86=E5=86=97?= =?UTF-8?q?=E4=BD=99=E4=BB=A3=E7=A0=81=E5=92=8C=E6=A0=B7=E5=BC=8F=20-=20?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E4=B8=BB=E9=A2=98=E6=A0=B7=E5=BC=8F=E6=94=AF?= =?UTF-8?q?=E6=8C=81=E5=92=8C=E8=83=8C=E6=99=AF=E8=A3=85=E9=A5=B0=E5=85=83?= =?UTF-8?q?=E7=B4=A0=20-=20=E8=B0=83=E6=95=B4=E7=94=A8=E6=88=B7=E7=9B=B8?= =?UTF-8?q?=E5=85=B3=E7=BB=84=E4=BB=B6=E5=B1=82=E7=BA=A7=E5=92=8C=E5=AE=9A?= =?UTF-8?q?=E4=BD=8D=E6=A0=B7=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/api/cms/cmsAd/index.ts | 2 +- src/api/cms/cmsAd/model/index.ts | 2 +- src/api/cms/cmsArticle/index.ts | 14 +- src/api/cms/cmsWebsiteField/model/index.ts | 2 + src/app.config.ts | 8 +- src/assets/tabbar/category-active.png | Bin 0 -> 5468 bytes src/assets/tabbar/category.png | Bin 0 -> 5041 bytes src/assets/tabbar/tv-active.png | Bin 4550 -> 0 bytes src/assets/tabbar/tv.png | Bin 4406 -> 0 bytes src/components/UnifiedQRButton.tsx | 2 +- src/pages/index/Banner.tsx | 53 ++-- src/pages/index/BestSellers.scss | 0 src/pages/index/BestSellers.tsx | 210 ++++---------- src/pages/user/components/IsDealer.tsx | 40 +-- src/pages/user/components/UserCard.tsx | 102 +++---- src/pages/user/components/UserCell.tsx | 2 +- src/pages/user/components/UserGrid.tsx | 47 ++++ src/pages/user/components/UserOrder.tsx | 2 +- src/pages/user/user.tsx | 38 ++- src/pages/user_bak/components/IsDealer.tsx | 102 +++++++ src/pages/user_bak/components/UserCard.tsx | 277 +++++++++++++++++++ src/pages/user_bak/components/UserCell.tsx | 144 ++++++++++ src/pages/user_bak/components/UserFooter.tsx | 102 +++++++ src/pages/user_bak/components/UserGrid.tsx | 145 ++++++++++ src/pages/user_bak/components/UserOrder.tsx | 122 ++++++++ src/pages/user_bak/user.config.ts | 5 + src/pages/user_bak/user.scss | 9 + src/pages/user_bak/user.tsx | 46 +++ src/styles/gradients.ts | 6 +- tailwind.config.js | 2 +- 30 files changed, 1190 insertions(+), 294 deletions(-) create mode 100644 src/assets/tabbar/category-active.png create mode 100644 src/assets/tabbar/category.png delete mode 100644 src/assets/tabbar/tv-active.png delete mode 100644 src/assets/tabbar/tv.png delete mode 100644 src/pages/index/BestSellers.scss create mode 100644 src/pages/user_bak/components/IsDealer.tsx create mode 100644 src/pages/user_bak/components/UserCard.tsx create mode 100644 src/pages/user_bak/components/UserCell.tsx create mode 100644 src/pages/user_bak/components/UserFooter.tsx create mode 100644 src/pages/user_bak/components/UserGrid.tsx create mode 100644 src/pages/user_bak/components/UserOrder.tsx create mode 100644 src/pages/user_bak/user.config.ts create mode 100644 src/pages/user_bak/user.scss create mode 100644 src/pages/user_bak/user.tsx diff --git a/src/api/cms/cmsAd/index.ts b/src/api/cms/cmsAd/index.ts index a9b1ca7..37dae87 100644 --- a/src/api/cms/cmsAd/index.ts +++ b/src/api/cms/cmsAd/index.ts @@ -102,7 +102,7 @@ export async function getCmsAd(id: number) { } /** - * 根据id查询广告位 + * 根据code查询广告位 */ export async function getCmsAdByCode(code: string) { const res = await request.get>( diff --git a/src/api/cms/cmsAd/model/index.ts b/src/api/cms/cmsAd/model/index.ts index 76fd9a4..3f900a7 100644 --- a/src/api/cms/cmsAd/model/index.ts +++ b/src/api/cms/cmsAd/model/index.ts @@ -1,4 +1,4 @@ -import type { PageParam } from '@/api/index'; +import type { PageParam } from '@/api'; /** * 广告位 diff --git a/src/api/cms/cmsArticle/index.ts b/src/api/cms/cmsArticle/index.ts index 7bc2c44..94339ec 100644 --- a/src/api/cms/cmsArticle/index.ts +++ b/src/api/cms/cmsArticle/index.ts @@ -1,5 +1,5 @@ import request from '@/utils/request'; -import type {ApiResult, PageResult} from '@/api/index'; +import type {ApiResult, PageResult} from '@/api'; import type {CmsArticle, CmsArticleParam} from './model'; /** @@ -204,3 +204,15 @@ export async function getByIds(params?: CmsArticleParam) { return Promise.reject(new Error(res.message)); } +/** + * 根据code查询文章 + */ +export async function getCmsArticleByCode(code: string) { + const res = await request.get>( + '/cms/cms-article/getByCode/' + code + ); + if (res.code === 0 && res.data) { + return res.data; + } + return Promise.reject(new Error(res.message)); +} diff --git a/src/api/cms/cmsWebsiteField/model/index.ts b/src/api/cms/cmsWebsiteField/model/index.ts index d757a89..f5b6571 100644 --- a/src/api/cms/cmsWebsiteField/model/index.ts +++ b/src/api/cms/cmsWebsiteField/model/index.ts @@ -55,4 +55,6 @@ export interface Config { email?: string; loginTitle?: string; sysLogo?: string; + vipText?: string; + vipComments?: string; } diff --git a/src/app.config.ts b/src/app.config.ts index 3f56943..63cda8d 100644 --- a/src/app.config.ts +++ b/src/app.config.ts @@ -111,14 +111,14 @@ export default { list: [ { pagePath: "pages/index/index", - iconPath: "assets/tabbar/logo.png", - selectedIconPath: "assets/tabbar/logo.png", + iconPath: "assets/tabbar/home.png", + selectedIconPath: "assets/tabbar/home-active.png", text: "首页", }, { pagePath: "pages/cms/category/index", - iconPath: "assets/tabbar/tv.png", - selectedIconPath: "assets/tabbar/tv-active.png", + iconPath: "assets/tabbar/category.png", + selectedIconPath: "assets/tabbar/category-active.png", text: "基地生活", }, { diff --git a/src/assets/tabbar/category-active.png b/src/assets/tabbar/category-active.png new file mode 100644 index 0000000000000000000000000000000000000000..a7431dc01d068949ff4a71ccef63f27fbeb58500 GIT binary patch literal 5468 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 SDIfFz0000!EY-I--UKr!(MAjTWlyVui7$Ae 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 M&8$st8M7k)3zB(GivR!s diff --git a/src/components/UnifiedQRButton.tsx b/src/components/UnifiedQRButton.tsx index 18fee99..6c019d5 100644 --- a/src/components/UnifiedQRButton.tsx +++ b/src/components/UnifiedQRButton.tsx @@ -29,7 +29,7 @@ export interface UnifiedQRButtonProps { * 支持登录和核销两种类型的二维码扫描 */ const UnifiedQRButton: React.FC = ({ - type = 'default', + type = 'danger', size = 'small', text = '扫码', showIcon = true, diff --git a/src/pages/index/Banner.tsx b/src/pages/index/Banner.tsx index 35a1a91..d31d4ec 100644 --- a/src/pages/index/Banner.tsx +++ b/src/pages/index/Banner.tsx @@ -3,36 +3,35 @@ import {View} from '@tarojs/components' import {Swiper} from '@nutui/nutui-react-taro' import {CmsAd} from "@/api/cms/cmsAd/model"; import {Image} from '@nutui/nutui-react-taro' -import {getCmsAd} from "@/api/cms/cmsAd"; +import {getCmsAdByCode} from "@/api/cms/cmsAd"; import navTo from "@/utils/common"; -import {ShopGoods} from "@/api/shop/shopGoods/model"; -import {listShopGoods} from "@/api/shop/shopGoods"; +import {pageCmsArticle} from "@/api/cms/cmsArticle"; +import {CmsArticle} from "@/api/cms/cmsArticle/model"; const MyPage = () => { const [carouselData, setCarouselData] = useState() - // const [hotToday, setHotToday] = useState() - // const [groupBuy, setGroupBuy] = useState() - const [hotGoods, setHotGoods] = useState([]) + const [hotToday, setHotToday] = useState() + const [item, setItem] = useState() // 加载数据 - const loadData = () => { + const loadData = async () => { // 轮播图 - getCmsAd(439).then(data => { - setCarouselData(data) - }) - // 今日热卖素材(上层图片) - // getCmsAd(444).then(data => { - // setHotToday(data) - // }) - // 社区拼团素材(下层图片) - // getCmsAd(445).then(data => { - // setGroupBuy(data) - // }) + const flash = await getCmsAdByCode('flash') // 今日热卖 - listShopGoods({categoryId: 4424, limit: 2}).then(data => { - setHotGoods(data) - }) + const hotToday = await getCmsAdByCode('hot_today') + // 时里动态 + const news = await pageCmsArticle({limit:1,recommend:1}) + // 赋值 + if(flash){ + setCarouselData(flash) + } + if(hotToday){ + setHotToday(hotToday) + } + if(news && news.list.length > 0){ + setItem(news.list[0]) + } } useEffect(() => { @@ -77,12 +76,12 @@ const MyPage = () => { height: '110px' }}> { - hotGoods.map(item => ( + hotToday?.imageList?.map(item => ( { }} onClick={() => navTo('/shop/category/index?id=4424')} /> - 到手价¥{item.price} + {item.title || '到手价¥9.9'} )) } @@ -103,14 +102,14 @@ const MyPage = () => { navTo('cms/detail/index?id=10109')} + onClick={() => navTo('cms/detail/index?id=' + item?.articleId)} /> diff --git a/src/pages/index/BestSellers.scss b/src/pages/index/BestSellers.scss deleted file mode 100644 index e69de29..0000000 diff --git a/src/pages/index/BestSellers.tsx b/src/pages/index/BestSellers.tsx index 7c2c898..109d200 100644 --- a/src/pages/index/BestSellers.tsx +++ b/src/pages/index/BestSellers.tsx @@ -1,70 +1,37 @@ import {useEffect, useState} from "react"; -import {Image, Swiper, SwiperItem, Empty} from '@nutui/nutui-react-taro' +import {Image} from '@nutui/nutui-react-taro' import {Share} from '@nutui/icons-react-taro' import {View, Text} from '@tarojs/components'; import Taro from "@tarojs/taro"; -import {Tabs} from '@nutui/nutui-react-taro' import {ShopGoods} from "@/api/shop/shopGoods/model"; import {pageShopGoods} from "@/api/shop/shopGoods"; - const BestSellers = () => { - const [tab1value, setTab1value] = useState('0') const [list, setList] = useState([]) - const [goods, setGoods] = useState(null) - // 轮播图固定高度,可根据需求调整 - const SWIPER_HEIGHT = 180; + const [goods, setGoods] = useState() const reload = () => { pageShopGoods({}).then(res => { - const processGoodsItem = (item: ShopGoods) => { - const pics: string[] = []; - // 添加主图 - if (item.image) { - pics.push(item.image); - } - // 处理附加图片 - if (item.files) { - try { - // 解析文件字符串为对象 - const files = typeof item.files === "string" - ? JSON.parse(item.files) - : item.files; - - // 收集所有图片URL - Object.values(files).forEach(file => { - if (file?.url) { - pics.push(file.url); - } - }); - } catch (error) { - console.error('解析文件失败:', error); - } - } - // 返回新对象,避免直接修改原对象 - return {...item, pics}; - }; - - // 处理商品列表 - const goods = (res?.list || []).map(processGoodsItem); - setList(goods); - }).catch(err => { - console.error('获取商品列表失败:', err); - }); + setList(res?.list || []); + }) } // 处理分享点击 const handleShare = (item: ShopGoods) => { setGoods(item); + console.log(goods) + // 显示分享选项菜单 Taro.showActionSheet({ itemList: ['分享给好友'], success: (res) => { if (res.tapIndex === 0) { + // 分享给好友 - 触发转发 Taro.showShareMenu({ withShareTicket: true, success: () => { + // 提示用户点击右上角分享 Taro.showToast({ title: '请点击右上角分享给好友', icon: 'none', @@ -81,135 +48,56 @@ const BestSellers = () => { } useEffect(() => { - reload(); - }, []); + reload() + }, []) - // 配置分享内容 - Taro.useShareAppMessage(() => { - if (goods) { - return { - title: goods.name, - path: `/shop/goodsDetail/index?id=${goods.goodsId}`, - imageUrl: goods.image || '' - }; - } - return { - title: '热销商品', - path: '/pages/index/index' - }; - }); + // 注意:不在这里配置分享,避免与首页分享冲突 + // 商品分享应该在商品详情页处理,首页分享应该分享首页本身 return ( - - - { - setTab1value(value) - }} - style={{ - backgroundColor: '#fff', - }} - activeType="smile" - > - - - - - - - - - {tab1value == '0' && list?.map((item) => ( - - {/* 轮播图组件 */} - {item.pics && item.pics.length > 0 ? ( - - {item.pics.map((pic, picIndex) => ( - - Taro.navigateTo({ - url: `/shop/goodsDetail/index?id=${item.goodsId}` - })} - className="swiper-image" - /> - - ))} - - ) : ( - // 没有图片时显示占位图 - - 暂无图片 - - )} - - - - {item.name} - - {item.comments} - 已售 {item.sales} - - - - - {item.price} - - - - handleShare(item)} - > - + <> + + + {list?.map((item, index) => { + return ( + + Taro.navigateTo({url: '/shop/goodsDetail/index?id=' + item.goodsId})}/> + + + {item.name} + + {item.comments} + 已售 {item.sales} + + + + + {item.price} + + + + handleShare(item)} + > + + + + Taro.navigateTo({url: '/shop/goodsDetail/index?id=' + item.goodsId})}>购买 + - Taro.navigateTo({ - url: `/shop/goodsDetail/index?id=${item.goodsId}` - })} - > - 购买 - - - - ))} - - { - tab1value == '1' && - } - - { - tab1value == '2' && - } - + ) + })} + - + ) } - export default BestSellers diff --git a/src/pages/user/components/IsDealer.tsx b/src/pages/user/components/IsDealer.tsx index f8315aa..ec9302f 100644 --- a/src/pages/user/components/IsDealer.tsx +++ b/src/pages/user/components/IsDealer.tsx @@ -3,15 +3,23 @@ import navTo from "@/utils/common"; import {View, Text} from '@tarojs/components' import {ArrowRight, Reward, Setting} from '@nutui/icons-react-taro' import {useUser} from '@/hooks/useUser' -import {useEffect} from "react"; +import {useEffect, useState} from "react"; import {useDealerUser} from "@/hooks/useDealerUser"; +import {useThemeStyles} from "@/hooks/useTheme"; +import {configWebsiteField} from "@/api/cms/cmsWebsiteField"; +import {Config} from "@/api/cms/cmsWebsiteField/model"; -const UserCell = () => { +const IsDealer = () => { + const themeStyles = useThemeStyles(); + const [config, setConfig] = useState() const {isSuperAdmin} = useUser(); const {dealerUser} = useDealerUser() useEffect(() => { - + configWebsiteField().then(data => { + console.log(data) + setConfig(data) + }) }, []) /** @@ -20,12 +28,10 @@ const UserCell = () => { if (isSuperAdmin()) { return ( <> - + @@ -46,17 +52,15 @@ const UserCell = () => { if (dealerUser) { return ( <> - + 分销中心 + className={'pl-3 text-orange-100 font-medium'}>{config?.vipText || '入驻申请'} {/*门店核销*/} } @@ -73,17 +77,15 @@ const UserCell = () => { */ return ( <> - + - 开通VIP - 享优惠 + {config?.vipText || '开通VIP'} + {config?.vipComments || '享优惠'} } extra={} @@ -93,4 +95,4 @@ const UserCell = () => { ) } -export default UserCell +export default IsDealer diff --git a/src/pages/user/components/UserCard.tsx b/src/pages/user/components/UserCard.tsx index 164fa72..ccda8ed 100644 --- a/src/pages/user/components/UserCard.tsx +++ b/src/pages/user/components/UserCard.tsx @@ -1,5 +1,5 @@ -import {Avatar, Tag, Space, Button} from '@nutui/nutui-react-taro' -import {View, Text, Image} from '@tarojs/components' +import {Avatar, Tag, Space} from '@nutui/nutui-react-taro' +import {View, Text} from '@tarojs/components' import {getUserInfo, getWxOpenId} from '@/api/layout'; import Taro from '@tarojs/taro'; import {useEffect, useState, forwardRef, useImperativeHandle} from "react"; @@ -10,6 +10,7 @@ import {useUser} from "@/hooks/useUser"; import {useUserData} from "@/hooks/useUserData"; import {getStoredInviteParams} from "@/utils/invite"; import UnifiedQRButton from "@/components/UnifiedQRButton"; +import {useThemeStyles} from "@/hooks/useTheme"; const UserCard = forwardRef((_, ref) => { const {data, refresh} = useUserData() @@ -17,6 +18,8 @@ const UserCard = forwardRef((_, ref) => { const [IsLogin, setIsLogin] = useState(false) const [userInfo, setUserInfo] = useState() + const themeStyles = useThemeStyles(); + // 下拉刷新 const handleRefresh = async () => { await refresh() @@ -95,7 +98,6 @@ const UserCard = forwardRef((_, ref) => { }); }; - const openSetting = () => { // Taro.openSetting:调起客户端小程序设置界面,返回用户设置的操作结果。设置界面只会出现小程序已经向用户请求过的权限。 Taro.openSetting({ @@ -118,6 +120,11 @@ const UserCard = forwardRef((_, ref) => { const handleGetPhoneNumber = ({detail}: { detail: { code?: string, encryptedData?: string, iv?: string } }) => { const {code, encryptedData, iv} = detail + // 判断用户是否已登录 + if(IsLogin){ + return navTo(`/user/profile/profile`) + } + // 获取存储的邀请参数 const inviteParams = getStoredInviteParams() const refereeId = inviteParams?.inviter ? parseInt(inviteParams.inviter) : 0 @@ -165,34 +172,19 @@ const UserCard = forwardRef((_, ref) => { } return ( - - + {/* 使用相对定位容器,让个人资料图片可以绝对定位在右上角 */} - + - - { - IsLogin ? ( - - ) : ( - - ) - } + + - {getDisplayName()} + {getDisplayName()} {IsLogin ? ( @@ -210,7 +202,7 @@ const UserCard = forwardRef((_, ref) => { }}> {/*统一扫码入口 - 支持登录和核销*/} { console.log('统一扫码成功:', result); @@ -229,47 +221,31 @@ const UserCard = forwardRef((_, ref) => { /> - - navTo('/user/wallet/wallet', true)}> - 余额 - {data?.balance || '0.00'} - - - 积分 - {data?.points || 0} - - navTo('/user/coupon/index', true)}> - 优惠券 - {data?.coupons || 0} - - navTo('/user/gift/index', true)}> - 礼品卡 - {data?.giftCards || 0} + + + navTo('/user/wallet/wallet', true)}> + 余额 + {data?.balance || '0.00'} + + + 积分 + {data?.points || 0} + + navTo('/user/coupon/index', true)}> + 优惠券 + {data?.coupons || 0} + + navTo('/user/gift/index', true)}> + 礼品卡 + {data?.giftCards || 0} + - - {/* 个人资料图片,定位在右上角 */} - navTo('/user/profile/profile', true)} - > - - - ) }) diff --git a/src/pages/user/components/UserCell.tsx b/src/pages/user/components/UserCell.tsx index 7aa218d..46a0882 100644 --- a/src/pages/user/components/UserCell.tsx +++ b/src/pages/user/components/UserCell.tsx @@ -26,7 +26,7 @@ const UserCell = () => { return ( <> - + diff --git a/src/pages/user/components/UserGrid.tsx b/src/pages/user/components/UserGrid.tsx index 5c3e5da..faee87e 100644 --- a/src/pages/user/components/UserGrid.tsx +++ b/src/pages/user/components/UserGrid.tsx @@ -138,6 +138,53 @@ const UserCell = () => { + {/**/} + {/* 账号管理*/} + {/* */} + {/* */} + {/* navTo('/user/profile/profile', true)}>*/} + {/* */} + {/* */} + {/* */} + {/* */} + {/* */} + {/* */} + + {/* navTo('/user/theme/index', true)}>*/} + {/* */} + {/* */} + {/* */} + {/* */} + {/* */} + {/* */} + + {/* navTo('/user/about/index')}>*/} + {/* */} + {/* */} + {/* */} + {/* */} + {/* */} + {/* */} + + {/* */} + {/* */} + {/* */} + {/* */} + {/* */} + {/* */} + {/* */} + + {/* */} + {/* */} + {/**/} ) } diff --git a/src/pages/user/components/UserOrder.tsx b/src/pages/user/components/UserOrder.tsx index cc0f58d..0a17847 100644 --- a/src/pages/user/components/UserOrder.tsx +++ b/src/pages/user/components/UserOrder.tsx @@ -14,7 +14,7 @@ function UserOrder() { return ( <> - + () + const themeStyles = useThemeStyles(); // 下拉刷新处理 const handleRefresh = async () => { @@ -30,15 +33,30 @@ function User() { onRefresh={handleRefresh} headHeight={60} > -
- - - - - -
+ {/* 装饰性背景 */} + + {/* 装饰性背景元素 - 小程序兼容版本 */} + + + + + + + + + ) } diff --git a/src/pages/user_bak/components/IsDealer.tsx b/src/pages/user_bak/components/IsDealer.tsx new file mode 100644 index 0000000..c154f6d --- /dev/null +++ b/src/pages/user_bak/components/IsDealer.tsx @@ -0,0 +1,102 @@ +import {Cell} from '@nutui/nutui-react-taro' +import navTo from "@/utils/common"; +import {View, Text} from '@tarojs/components' +import {ArrowRight, Reward, Setting} from '@nutui/icons-react-taro' +import {useUser} from '@/hooks/useUser' +import {useEffect, useState} from "react"; +import {useDealerUser} from "@/hooks/useDealerUser"; +import {configWebsiteField} from "@/api/cms/cmsWebsiteField"; +import {Config} from "@/api/cms/cmsWebsiteField/model"; + +const UserCell = () => { + const {isSuperAdmin} = useUser(); + const {dealerUser} = useDealerUser() + const [config, setConfig] = useState() + + useEffect(() => { + configWebsiteField().then(data => { + console.log(data) + setConfig(data) + }) + }, []) + + /** + * 管理中心 + */ + if (isSuperAdmin()) { + return ( + <> + + + + 管理中心 + + } + extra={} + onClick={() => navTo('/admin/index', true)} + /> +
+ + ) + } + + /** + * 分销中心 + */ + if (dealerUser) { + return ( + <> + + + + 分销中心 + {/*门店核销*/} + + } + extra={} + onClick={() => navTo('/dealer/index', true)} + /> +
+ + ) + } + + /** + * 普通用户 + */ + return ( + <> + + + + {config?.vipText}开通VIP + {config?.vipComments}享优惠 + + } + extra={} + onClick={() => navTo('/dealer/apply/add', true)} + /> +
+ + ) +} +export default UserCell diff --git a/src/pages/user_bak/components/UserCard.tsx b/src/pages/user_bak/components/UserCard.tsx new file mode 100644 index 0000000..164fa72 --- /dev/null +++ b/src/pages/user_bak/components/UserCard.tsx @@ -0,0 +1,277 @@ +import {Avatar, Tag, Space, Button} from '@nutui/nutui-react-taro' +import {View, Text, Image} from '@tarojs/components' +import {getUserInfo, getWxOpenId} from '@/api/layout'; +import Taro from '@tarojs/taro'; +import {useEffect, useState, forwardRef, useImperativeHandle} from "react"; +import {User} from "@/api/system/user/model"; +import navTo from "@/utils/common"; +import {TenantId} from "@/config/app"; +import {useUser} from "@/hooks/useUser"; +import {useUserData} from "@/hooks/useUserData"; +import {getStoredInviteParams} from "@/utils/invite"; +import UnifiedQRButton from "@/components/UnifiedQRButton"; + +const UserCard = forwardRef((_, ref) => { + const {data, refresh} = useUserData() + const {getDisplayName, getRoleName} = useUser(); + const [IsLogin, setIsLogin] = useState(false) + const [userInfo, setUserInfo] = useState() + + // 下拉刷新 + const handleRefresh = async () => { + await refresh() + Taro.showToast({ + title: '刷新成功', + icon: 'success' + }) + } + + // 暴露方法给父组件 + useImperativeHandle(ref, () => ({ + handleRefresh + })) + + useEffect(() => { + // Taro.getSetting:获取用户的当前设置。返回值中只会出现小程序已经向用户请求过的权限。 + Taro.getSetting({ + success: (res) => { + if (res.authSetting['scope.userInfo']) { + // 用户已经授权过,可以直接获取用户信息 + console.log('用户已经授权过,可以直接获取用户信息') + reload(); + } else { + // 用户未授权,需要弹出授权窗口 + console.log('用户未授权,需要弹出授权窗口') + showAuthModal(); + } + } + }); + }, []); + + const reload = () => { + Taro.getUserInfo({ + success: (res) => { + const avatar = res.userInfo.avatarUrl; + setUserInfo({ + avatar, + nickname: res.userInfo.nickName, + sexName: res.userInfo.gender == 1 ? '男' : '女' + }) + getUserInfo().then((data) => { + if (data) { + setUserInfo(data) + setIsLogin(true); + Taro.setStorageSync('UserId', data.userId) + + // 获取openId + if (!data.openid) { + Taro.login({ + success: (res) => { + getWxOpenId({code: res.code}).then(() => { + }) + } + }) + } + } + }).catch(() => { + console.log('未登录') + }); + } + }); + }; + + const showAuthModal = () => { + Taro.showModal({ + title: '授权提示', + content: '需要获取您的用户信息', + confirmText: '去授权', + cancelText: '取消', + success: (res) => { + if (res.confirm) { + // 用户点击确认,打开授权设置页面 + openSetting(); + } + } + }); + }; + + + const openSetting = () => { + // Taro.openSetting:调起客户端小程序设置界面,返回用户设置的操作结果。设置界面只会出现小程序已经向用户请求过的权限。 + Taro.openSetting({ + success: (res) => { + if (res.authSetting['scope.userInfo']) { + // 用户授权成功,可以获取用户信息 + reload(); + } else { + // 用户拒绝授权,提示授权失败 + Taro.showToast({ + title: '授权失败', + icon: 'none' + }); + } + } + }); + }; + + /* 获取用户手机号 */ + const handleGetPhoneNumber = ({detail}: { detail: { code?: string, encryptedData?: string, iv?: string } }) => { + const {code, encryptedData, iv} = detail + + // 获取存储的邀请参数 + const inviteParams = getStoredInviteParams() + const refereeId = inviteParams?.inviter ? parseInt(inviteParams.inviter) : 0 + + Taro.login({ + success: function () { + if (code) { + Taro.request({ + url: 'https://server.websoft.top/api/wx-login/loginByMpWxPhone', + method: 'POST', + data: { + code, + encryptedData, + iv, + notVerifyPhone: true, + refereeId: refereeId, // 使用解析出的推荐人ID + sceneType: 'save_referee', + tenantId: TenantId + }, + header: { + 'content-type': 'application/json', + TenantId + }, + success: function (res) { + if (res.data.code == 1) { + Taro.showToast({ + title: res.data.message, + icon: 'error', + duration: 2000 + }) + return false; + } + // 登录成功 + Taro.setStorageSync('access_token', res.data.data.access_token) + Taro.setStorageSync('UserId', res.data.data.user.userId) + setUserInfo(res.data.data.user) + setIsLogin(true) + } + }) + } else { + console.log('登录失败!') + } + } + }) + } + + return ( + + + {/* 使用相对定位容器,让个人资料图片可以绝对定位在右上角 */} + + + + + { + IsLogin ? ( + + ) : ( + + ) + } + + {getDisplayName()} + {IsLogin ? ( + + + + {getRoleName()} + + + + ) : ''} + + + + {/*统一扫码入口 - 支持登录和核销*/} + { + console.log('统一扫码成功:', result); + // 根据扫码类型给出不同的提示 + if (result.type === 'verification') { + // 核销成功,可以显示更多信息或跳转到详情页 + Taro.showModal({ + title: '核销成功', + content: `已成功核销的品类:${result.data.goodsName || '礼品卡'},面值¥${result.data.faceValue}` + }); + } + }} + onError={(error) => { + console.error('统一扫码失败:', error); + }} + /> + + + + navTo('/user/wallet/wallet', true)}> + 余额 + {data?.balance || '0.00'} + + + 积分 + {data?.points || 0} + + navTo('/user/coupon/index', true)}> + 优惠券 + {data?.coupons || 0} + + navTo('/user/gift/index', true)}> + 礼品卡 + {data?.giftCards || 0} + + + + + {/* 个人资料图片,定位在右上角 */} + navTo('/user/profile/profile', true)} + > + + + + + + ) +}) + +export default UserCard; diff --git a/src/pages/user_bak/components/UserCell.tsx b/src/pages/user_bak/components/UserCell.tsx new file mode 100644 index 0000000..7aa218d --- /dev/null +++ b/src/pages/user_bak/components/UserCell.tsx @@ -0,0 +1,144 @@ +import {Cell} from '@nutui/nutui-react-taro' +import navTo from "@/utils/common"; +import Taro from '@tarojs/taro' +import {View, Text} from '@tarojs/components' +import {ArrowRight, ShieldCheck, LogisticsError, Location, Tips, Ask} from '@nutui/icons-react-taro' +import {useUser} from '@/hooks/useUser' + +const UserCell = () => { + const {logoutUser, isCertified} = useUser(); + + const onLogout = () => { + Taro.showModal({ + title: '提示', + content: '确定要退出登录吗?', + success: function (res) { + if (res.confirm) { + // 使用 useUser hook 的 logoutUser 方法 + logoutUser(); + Taro.reLaunch({ + url: '/pages/index/index' + }) + } + } + }) + } + + return ( + <> + + + + 我的服务 + + }> + + + 我的钱包 +
+ } + align="center" + extra={} + onClick={() => { + navTo('/user/wallet/index', true) + }} + /> + + + 收货地址 +
+ } + align="center" + extra={} + onClick={() => { + navTo('/user/address/index', true) + }} + /> + + + 实名认证 + {isCertified() && ( + 已认证 + )} +
+ } + align="center" + extra={} + onClick={() => { + navTo('/user/userVerify/index', true) + }} + /> + + + 常见问题 +
+ } + align="center" + extra={} + onClick={() => { + navTo('/user/help/index') + }} + /> + + + 关于我们 +
+ } + align="center" + extra={} + onClick={() => { + navTo('/user/about/index') + }} + /> + + + 账号管理 +
+ }> + } + onClick={() => navTo('/user/profile/profile', true)} + /> + } + onClick={() => navTo('/user/theme/index', true)} + /> + } + onClick={onLogout} + /> + +
+ + ) +} +export default UserCell diff --git a/src/pages/user_bak/components/UserFooter.tsx b/src/pages/user_bak/components/UserFooter.tsx new file mode 100644 index 0000000..fb74b71 --- /dev/null +++ b/src/pages/user_bak/components/UserFooter.tsx @@ -0,0 +1,102 @@ +import {loginBySms} from "@/api/passport/login"; +import {useState} from "react"; +import Taro from '@tarojs/taro' +import {Popup} from '@nutui/nutui-react-taro' +import {UserParam} from "@/api/system/user/model"; +import {Button} from '@nutui/nutui-react-taro' +import {Form, Input} from '@nutui/nutui-react-taro' +import {Copyright, Version} from "@/config/app"; +const UserFooter = () => { + const [openLoginByPhone, setOpenLoginByPhone] = useState(false) + const [clickNum, setClickNum] = useState(0) + const [FormData, setFormData] = useState( + { + phone: undefined, + password: undefined + } + ) + + const onLoginByPhone = () => { + setFormData({}) + setClickNum(clickNum + 1); + if (clickNum > 10) { + setOpenLoginByPhone(true); + } + } + + const closeLoginByPhone = () => { + setClickNum(0) + setOpenLoginByPhone(false) + } + + // 提交表单 + const submitByPhone = (values: any) => { + loginBySms({ + phone: values.phone, + code: values.code + }).then(() => { + setOpenLoginByPhone(false); + setTimeout(() => { + Taro.reLaunch({ + url: '/pages/index/index' + }) + },1000) + }) + } + + return ( + <> +
+
当前版本:{Version}
+
Copyright © { new Date().getFullYear() } {Copyright}
+
+ + +
submitByPhone(values)} + footer={ +
+ +
+ } + > + + + + + + +
+
+ + ) +} +export default UserFooter diff --git a/src/pages/user_bak/components/UserGrid.tsx b/src/pages/user_bak/components/UserGrid.tsx new file mode 100644 index 0000000..5c3e5da --- /dev/null +++ b/src/pages/user_bak/components/UserGrid.tsx @@ -0,0 +1,145 @@ +import {Grid, ConfigProvider} from '@nutui/nutui-react-taro' +import navTo from "@/utils/common"; +import Taro from '@tarojs/taro' +import {View, Button} from '@tarojs/components' +import { + ShieldCheck, + Location, + Tips, + Ask, + // Dongdong, + People, + // AfterSaleService, + Logout, + ShoppingAdd, + Service +} from '@nutui/icons-react-taro' +import {useUser} from "@/hooks/useUser"; + +const UserCell = () => { + const {logoutUser} = useUser(); + + const onLogout = () => { + Taro.showModal({ + title: '提示', + content: '确定要退出登录吗?', + success: function (res) { + if (res.confirm) { + // 使用 useUser hook 的 logoutUser 方法 + logoutUser(); + Taro.reLaunch({ + url: '/pages/index/index' + }) + } + } + }) + } + + return ( + <> + + 我的服务 + + + navTo('/user/poster/poster', true)}> + + + + + + + + {/* 修改联系我们为微信客服 */} + + + + + navTo('/user/address/index', true)}> + + + + + + + + navTo('/user/userVerify/index', true)}> + + + + + + + + navTo('/dealer/team/index', true)}> + + + + + + + + {/* navTo('/dealer/qrcode/index', true)}>*/} + {/* */} + {/* */} + {/* */} + {/* */} + {/* */} + {/**/} + + {/* navTo('/admin/index', true)}>*/} + {/* */} + {/* */} + {/* */} + {/* */} + {/* */} + {/**/} + + navTo('/user/help/index')}> + + + + + + + + navTo('/user/about/index')}> + + + + + + + + + + + + + + + + + + + + ) +} +export default UserCell + diff --git a/src/pages/user_bak/components/UserOrder.tsx b/src/pages/user_bak/components/UserOrder.tsx new file mode 100644 index 0000000..cc0f58d --- /dev/null +++ b/src/pages/user_bak/components/UserOrder.tsx @@ -0,0 +1,122 @@ +import navTo from "@/utils/common"; +import {View, Text} from '@tarojs/components'; +import {Badge} from '@nutui/nutui-react-taro'; +import {ArrowRight, Wallet, Comment, Transit, Refund, Package} from '@nutui/icons-react-taro'; +import {useOrderStats} from "@/hooks/useOrderStats"; + +function UserOrder() { + const { orderStats, refreshOrderStats } = useOrderStats(); + + // 处理长按刷新 + const handleLongPress = () => { + refreshOrderStats(); + }; + + return ( + <> + + + + 我的订单 + navTo('/user/order/order', true)} + onLongPress={handleLongPress} + > + 全部订单 + + + + + {/* 待付款 */} + {orderStats.pending > 0 ? ( + + + navTo('/user/order/order?statusFilter=0', true)}/> + 待付款 + + + ) : ( + navTo('/user/order/order?statusFilter=0', true)}> + + 待付款 + + )} + + {/* 待发货 */} + {orderStats.paid > 0 ? ( + + navTo('/user/order/order?statusFilter=1', true)}> + + 待发货 + + + ) : ( + navTo('/user/order/order?statusFilter=1', true)}> + + 待发货 + + )} + + {/* 待收货 */} + {orderStats.shipped > 0 ? ( + + navTo('/user/order/order?statusFilter=3', true)}> + + 待收货 + + + ) : ( + navTo('/user/order/order?statusFilter=3', true)}> + + 待收货 + + )} + + {/* 已完成 - 不显示badge */} + navTo('/user/order/order?statusFilter=5', true)}> + + 已完成 + + + {/* 退货/售后 */} + {orderStats.refund > 0 ? ( + + navTo('/user/order/order?statusFilter=6', true)}> + + 退货/售后 + + + ) : ( + navTo('/user/order/order?statusFilter=6', true)}> + + 退货/售后 + + )} + + + + + + ) +} + +export default UserOrder; diff --git a/src/pages/user_bak/user.config.ts b/src/pages/user_bak/user.config.ts new file mode 100644 index 0000000..31e4776 --- /dev/null +++ b/src/pages/user_bak/user.config.ts @@ -0,0 +1,5 @@ +export default definePageConfig({ + navigationBarTitleText: '我的', + navigationStyle: 'custom', + navigationBarBackgroundColor: '#e9fff2' +}) diff --git a/src/pages/user_bak/user.scss b/src/pages/user_bak/user.scss new file mode 100644 index 0000000..a01d79c --- /dev/null +++ b/src/pages/user_bak/user.scss @@ -0,0 +1,9 @@ +.header-bg{ + //background: url('https://oss.wsdns.cn/20250621/edb5d4da976b4d97ba185cb7077d2858.jpg') no-repeat top center; + background: linear-gradient(to bottom, #03605c, #18ae4f); + background-size: 100%; +} + +.my-bg{ + background: url('https://oss.wsdns.cn/20250913/5ae575a50dbb4ccaab086c3679c5e2c3.png') no-repeat top center; +} diff --git a/src/pages/user_bak/user.tsx b/src/pages/user_bak/user.tsx new file mode 100644 index 0000000..2ad1f98 --- /dev/null +++ b/src/pages/user_bak/user.tsx @@ -0,0 +1,46 @@ +import {useEffect, useRef} from 'react' +import {PullToRefresh} from '@nutui/nutui-react-taro' +import UserCard from "./components/UserCard"; +import UserOrder from "./components/UserOrder"; +import UserFooter from "./components/UserFooter"; +import {useUserData} from "@/hooks/useUserData"; +import './user.scss' +import IsDealer from "./components/IsDealer"; +import UserGrid from "@/pages/user/components/UserGrid"; + +function User() { + + const { refresh } = useUserData() + const userCardRef = useRef() + + // 下拉刷新处理 + const handleRefresh = async () => { + await refresh() + // 如果 UserCard 组件有自己的刷新方法,也可以调用 + if (userCardRef.current?.handleRefresh) { + await userCardRef.current.handleRefresh() + } + } + + useEffect(() => { + }, []); + + return ( + +
+ + + + + +
+
+ ) +} + +export default User diff --git a/src/styles/gradients.ts b/src/styles/gradients.ts index 2ad1cb4..11ab23a 100644 --- a/src/styles/gradients.ts +++ b/src/styles/gradients.ts @@ -40,9 +40,9 @@ export const gradientThemes: GradientTheme[] = [ }, { name: 'nature', - primary: '#43e97b', - secondary: '#38f9d7', - background: 'linear-gradient(135deg, #43e97b 0%, #38f9d7 100%)', + primary: '#03605c', + secondary: '#18ae4f', + background: 'linear-gradient(135deg, #03605c 0%, #18ae4f 100%)', textColor: '#ffffff', description: '自然绿青 - 生机与成长' }, diff --git a/tailwind.config.js b/tailwind.config.js index d257697..55ac80c 100644 --- a/tailwind.config.js +++ b/tailwind.config.js @@ -20,7 +20,7 @@ module.exports = { divideStyle: false, divideOpacity: false, // 新增禁用项,解决微信小程序兼容性问题 - gap: false, // 禁用 gap 类,因为微信小程序不支持 gap 属性 + gap: true, // 禁用 gap 类,因为微信小程序不支持 gap 属性 lineClamp: false, // 禁用 line-clamp 类,微信小程序不支持 textIndent: false, // 禁用 text-indent writingMode: false, // 禁用 writing-mode