Просмотр исходного кода

Merge remote-tracking branch 'origin/2025鹅状元数学' into 2025鹅状元数学

tanxue 5 дней назад
Родитель
Сommit
18dd56a309

+ 125 - 86
components/sharePopUp/index.vue

@@ -1,5 +1,5 @@
 <template>
-	<!-- 分享弹窗 -->
+	<!-- 分享弹窗,沿用你原有样式结构 -->
 	<uni-popup ref="popupRef" type="bottom" background-color="#fff" :mask-click="false">
 		<view class="share-popup-box">
 			<!-- 标题 -->
@@ -19,73 +19,100 @@
 						<text class="share-text">朋友圈</text>
 					</view>
 				</view>
-				<!-- <view class="share-close" @click="close">取消</view> -->
 			</scroll-view>
 		</view>
 	</uni-popup>
 </template>
 
+
+
+<!-- <SharePopup ref="sharePopup" :type="0" title="测试图文分享" desc="这是分享描述" link="https://xxx.com"
+	image="https://xxx.com/xxx.jpg" currentPage="" :mini-program="{
+				appId: 'wxXXXXXXX',
+				path: '/pages/index/index'
+			}" @success="handleShareSuccess" @error="handleShareError" /> -->
 <script setup>
 	import {
-		ref
+		ref,
+		computed
 	} from 'vue'
 
-	// 定义props
+	// 定义props,支持你指定的6种分享类型
 	const props = defineProps({
+		// 分享类型 0:图文 1:纯文字 2:纯图片 3:音乐 4:视频 5:小程序
+		type: {
+			type: [String, Number],
+			default: 0,
+			validator: (val) => [0, 1, 2, 3, 4, 5].includes(Number(val))
+		},
 		// 分享标题
 		title: {
 			type: String,
 			default: '分享标题'
 		},
-		// type=0: 图文分享(需要 title + summary + imageUrl)
-		// type=2: 纯图片分享(只需要 imageUrl)
-		type: {
-			type: [String, Number],
-			default: 0 // 0:图文
-		},
-		// 分享描述
+		// 分享描述/纯文字内容
 		desc: {
 			type: String,
 			default: '分享描述'
 		},
-		// 分享链接
+		// 分享链接,图文/音乐/视频/小程序使用
 		link: {
 			type: String,
 			default: ''
 		},
-		// 分享图片
+		// 分享图片/封面,纯图片/音乐/视频/小程序/图文使用
 		image: {
 			type: String,
 			default: ''
 		},
-		// 目前只是给海报用 (华为 卓网通问题)
+		// 标识是否为海报分享,华为卓易通纯图片分享传 haibao
 		currentPage: {
 			type: String,
 			default: ''
 		},
-
+		// 小程序专属配置,type=5时必传
+		miniProgram: {
+			type: Object,
+			default: () => ({
+				appId: '',
+				path: '',
+				hdImageUrl: '',
+				withShareTicket: false,
+				miniprogramType: 'release'
+			})
+		}
 	})
 
 	const emit = defineEmits(['close', 'select', 'success', 'error'])
 
 	const popupRef = ref(null)
+	// 计算标准化的分享类型
+	const shareType = computed(() => Number(props.type))
 
 	// 打开弹窗
 	const open = () => {
-		popupRef.value.open()
+		popupRef.value?.open()
 	}
 
 	// 关闭弹窗
 	const close = () => {
-		popupRef.value.close()
+		popupRef.value?.close()
 		emit('close')
 	}
 
-	// 选择分享方式
+	// 选择分享场景
 	const select = (scene) => {
-		//emit('select', scene)
-		console.log('props.currentPageprops.currentPageprops.currentPage',props.currentPage);
+		emit('select', scene)
 		try {
+			// 朋友圈限制:不支持纯文字、音乐、小程序
+			if (scene === 'timeline' && [1, 3, 5].includes(shareType.value)) {
+				uni.showToast({
+					title: '朋友圈不支持该分享类型',
+					icon: 'none'
+				})
+				return
+			}
+
 			if (props.currentPage == 'haibao') {
 				shareToWeChatHaibao(scene)
 			} else {
@@ -98,117 +125,129 @@
 		}
 	}
 
-
-
-
-	// 分享到微信
+	// 微信常规分享,支持6种类型
 	const shareToWeChat = (scene) => {
-		// 获取分享类型,确保是数字类型
-		const shareType = Number(props.type)
-
-		// 构建基础分享配置
+		const type = shareType.value
+		// 基础分享配置
 		const shareConfig = {
 			provider: 'weixin',
 			scene: scene === 'timeline' ? 'WXSceneTimeline' : 'WXSceneSession',
-			type: shareType,
-			success: function(res) {
+			type: type,
+			success: (res) => {
 				emit('success', {
 					scene
 				})
 			},
-			fail: function(err) {
+			fail: (err) => {
 				emit('error', err)
 				handleShareError(err)
 			}
 		}
-		// 根据类型添加不同的参数
-		if (shareType == 2) {
-			// 纯图片分享
-			shareConfig.imageUrl = props.image
-		} else {
-			// 图文或链接分享(兼容原有逻辑)
-			shareConfig.title = props.title
-			shareConfig.summary = props.desc
-			shareConfig.imageUrl = props.image
-			shareConfig.href = props.link
+
+		// 按类型填充参数
+		switch (type) {
+			// 图文分享
+			case 0:
+				shareConfig.title = props.title
+				shareConfig.summary = props.desc
+				shareConfig.imageUrl = props.image
+				shareConfig.href = props.link
+				break
+				// 纯文字分享
+			case 1:
+				shareConfig.summary = props.desc || props.title
+				break
+				// 纯图片分享
+			case 2:
+				shareConfig.imageUrl = props.image
+				break
+				// 音乐分享
+			case 3:
+				shareConfig.title = props.title
+				shareConfig.summary = props.desc
+				shareConfig.imageUrl = props.image
+				shareConfig.href = props.link
+				break
+				// 视频分享
+			case 4:
+				shareConfig.title = props.title
+				shareConfig.summary = props.desc
+				shareConfig.imageUrl = props.image
+				shareConfig.href = props.link
+				break
+				// 小程序分享,仅微信好友支持
+			case 5:
+				shareConfig.title = props.title
+				shareConfig.imageUrl = props.image
+				shareConfig.href = props.link
+				shareConfig.miniprogram = props.miniProgram
+				break
 		}
 
-		console.log('分享配置:', shareConfig)
+		console.log('常规微信分享配置', shareConfig)
 		uni.share(shareConfig)
 	}
-	// 分享针对海报
+
+	// 华为卓易通海报纯图片分享,保留你原有逻辑
 	const shareToWeChatHaibao = (scene) => {
-		console.log('12311');
+		console.log('海报分享模式')
+		if (!props.image) {
+			const err = new Error('海报图片地址不能为空')
+			emit('error', err)
+			handleShareError(err)
+			return
+		}
+
 		uni.downloadFile({
-			url: props.image, // 你的网络图片地址
+			url: props.image,
 			success: (downloadRes) => {
-				// 获取分享类型,确保是数字类型
-				const shareType = Number(props.type)
-				// 构建基础分享配置
+				const type = shareType.value
 				const shareConfig = {
 					provider: 'weixin',
 					scene: scene === 'timeline' ? 'WXSceneTimeline' : 'WXSceneSession',
-					type: shareType,
-					success: function(res) {
+					type: type,
+					success: (res) => {
 						emit('success', {
 							scene
 						})
 					},
-					fail: function(err) {
+					fail: (err) => {
 						emit('error', err)
 						handleShareError(err)
 					}
 				}
-				// 根据类型添加不同的参数
-				if (shareType == 2) {
-					// 纯图片分享
-					// shareConfig.imageUrl = props.image
+
+				// 仅纯图片类型使用本地临时路径
+				if (type == 2) {
 					shareConfig.imageUrl = downloadRes.tempFilePath
 				} else {
-					// 图文或链接分享(兼容原有逻辑)
 					shareConfig.title = props.title
 					shareConfig.summary = props.desc
 					shareConfig.imageUrl = props.image
 					shareConfig.href = props.link
+					// 小程序配置透传
+					if (type === 5) {
+						shareConfig.miniprogram = props.miniProgram
+					}
 				}
-				console.log('分享配置:', shareConfig)
+
+				console.log('海报分享配置', shareConfig)
 				uni.share(shareConfig)
+			},
+			fail: (err) => {
+				emit('error', err)
+				handleShareError(err)
 			}
 		})
 	}
 
-
-	// const shareToWeChat = (scene) => {
-	// 	console.log('props.link',props.link);
-	// 	uni.share({
-	// 		provider: 'weixin',
-	// 		scene: scene === 'timeline' ? 'WXSceneTimeline' : 'WXSceneSession',
-	// 		type: Number(props.type),
-	// 		title: props.title,
-	// 		summary: props.desc,
-	// 		href: props.link,
-	// 		imageUrl: props.image || 'https://qiniu-web-assets.dcloud.net.cn/unidoc/zh/uni@2x.png',
-	// 		success: function(res) {
-	// 			emit('success', {
-	// 				scene
-	// 			})
-	// 		},
-	// 		fail: function(err) {
-	// 			emit('error', err)
-	// 			handleShareError(err)
-	// 		}
-	// 	})
-	// }
-
-
-	// 错误处理
+	// 统一错误处理,沿用你原有逻辑
 	const handleShareError = (error) => {
 		console.error('分享失败:', error)
-
 		const errCode = error.errCode || error.code
 		const errMsg = error.errMsg || error.message
 
-		// 微信未安装
+		// 未安装微信
 		if (errCode === 1004 || errCode === -4004) {
 			uni.showModal({
 				title: '提示',
@@ -218,12 +257,12 @@
 			return
 		}
 
-		// 用户取消不提示
+		// 用户取消不提示
 		if (errCode === 1001 || errCode === -4001) {
 			return
 		}
 
-		// 其他错误
+		// 其他错误提示
 		uni.showToast({
 			title: errMsg || '分享失败,请重试',
 			icon: 'none',

+ 1 - 1
pages.json

@@ -115,7 +115,7 @@
 			}
 		},
 		{
-			"path" : "pages/chanpinShop/orderHistory",
+			"path" : "pages/chanpinMy/duihuanma",
 			"style" :
 			{
 				"navigationStyle": "custom"

+ 1 - 0
pages/chanpinMy/components/duihuanma/duihuanmaDialog.vue

@@ -58,6 +58,7 @@ const props = defineProps({
     type: String,
   },
 });
+
 const tipSmallPopup = ref(null); // 索引
 const duihuamaValue = ref(''); // 索引
 const $emit = defineEmits(['confirm-btn'])

+ 118 - 0
pages/chanpinMy/duihuanma.vue

@@ -0,0 +1,118 @@
+<template>
+	<view class="icon-title-navBar-box">
+		<view @click="handleBack" class="nav-bar-icon"></view>
+		<text class="nav-bar-title">使用兑换码</text>
+	</view>
+	<view>
+		<view class="tip-content-box">
+			<icon class="head-img-box" :style="{backgroundImage: 'url(' + myInfoData.icon + ')'}"></icon>
+			<view>{{ myInfoData.nickName }}</view>
+			<view>{{ myInfoData.userName }}</view>
+			<input class="duihuan-input" type="text" focus v-model="duihuamaValue" placeholder="请输入兑换码" />
+			<view class="tip-btn-box">
+				<view class="confirm-btn" @click="confirmBtn"></view>
+			</view>
+		</view>
+	</view>
+
+	<!-- 失败 -->
+	<duihuanError ref="dhErrRef"></duihuanError>
+	<!-- 成功 -->
+	<duihuanSuccess ref="dhSucRef"></duihuanSuccess>
+</template>
+
+<script setup>
+	import {
+		ref,reactive
+	} from 'vue';
+	import duihuanError from "./components/duihuanma/duihuanError";
+	import duihuanSuccess from "./components/duihuanma/duihuanSuccess";
+	import {
+		duihuanmaCode,
+	} from '@/api/my.js'
+	import cacheManager from '@/utils/cacheManager';
+  import {toast} from "@/utils/common";
+  import {myInfo} from "@/api/my";
+  import {
+    onLoad,
+    onShow
+  } from '@dcloudio/uni-app';
+
+	const duihuamaValue = ref(''); // 索引
+	const dhErrRef = ref(null);
+	const dhSucRef = ref(null);
+	const myInfoData = reactive({
+		userName: '',
+		nickName: '',
+		icon: '',
+	});
+
+	onLoad(() => {
+		getMyInfo();
+	})
+
+	// 获取用户数据
+	function getMyInfo() {
+		myInfo({}).then(res => {
+			myInfoData.userName = res.data.userName;
+			myInfoData.nickName = res.data.nickName;
+			if (res.data.nickName) {
+				myInfoData.nickName = res.data.nickName;
+			} else {
+				myInfoData.nickName = '鹅状元';
+			}
+			if (res.data.icon) {
+				myInfoData.icon = res.data.icon;
+			} else {
+				getUserImg(res.data.growthType)
+			}
+		})
+	}
+
+	// 获取用户头像
+	function getUserImg(data) {
+		switch (data) {
+			case 0:
+				myInfoData.icon = 'static/images/my/head-img0.png'
+				break;
+			case 1:
+				myInfoData.icon = 'static/images/my/head-img1.png'
+				break;
+			case 2:
+				myInfoData.icon = 'static/images/my/head-img2.png'
+				break;
+			case 3:
+				myInfoData.icon = 'static/images/my/head-img3.png'
+				break;
+			default:
+				myInfoData.icon = 'static/images/my/head-unlogin-img.png'
+				break;
+		}
+	}
+
+
+	function handleBack() {
+		uni.navigateBack()
+	}
+
+	// 确认
+	function confirmBtn() {
+		let req = {
+			code: duihuamaValue.value
+		}
+		duihuanmaCode(req).then(res => {
+			if (res.code == 0) {
+				toast('兑换成功')
+				// 清空缓存
+				cacheManager.remove("contentInfo");
+				duihuamaValue.value = '';
+			} else {
+				toast('兑换失败请重试或联系管理员')
+			}
+		})
+	}
+</script>
+
+<style>
+
+</style>

+ 19 - 13
pages/chanpinMy/my.vue

@@ -31,22 +31,17 @@
           <icon class="list-icon yysz-icon"></icon>
           <text>商城</text>
         </view>
-				<view v-if="appleCode=='true'&&currentPlatform=='ios' || currentPlatform=='android'" class="list-item"
+			<!-- <view v-if="appleCode=='true'&&currentPlatform=='ios' || currentPlatform=='android'" class="list-item" -->
+			<view class="list-item"
 					@click="duihuamaDuihuan">
-					<icon class="list-icon duihuanma-icon"></icon>
+					<icon class="list-icon yysz-icon"></icon>
 					<text>兑换码</text>
 				</view>
-
-<!--				<view class="list-item" @click="test">
-					<icon class="list-icon yysz-icon"></icon>
-					<text>test</text>
-				</view>-->
 			</view>
 		</view>
 
-		<duihuanmaDialog ref="duihuanmaDialogRef" :icon="myInfoData.icon" title="兑换" :userName="myInfoData.userName" :nickName="myInfoData.nickName"></duihuanmaDialog>
 		
-		<loginComp ref="loginRef"></loginComp>
+		<loginComp ref="loginRef" @success="handleSuccess"></loginComp>
 		<!-- 底部 -->
 		<custom-tab-bar :show="true" :current-index="currentTabIndex" />
 	</view>
@@ -72,6 +67,7 @@
 		reactive,
 		ref
 	} from "vue";
+  import {getUserIsYouke} from "../../utils/common";
 
 	let appleCode =ref(null)
 	let currentPlatform = ref(null);
@@ -87,7 +83,6 @@
 		icon: '',
 	});
 	let pageFrom = ref(null)
-	let duihuanmaDialogRef = ref(null)
 
 	onShow(() => {
 		currentTabIndex.value = 3
@@ -160,15 +155,26 @@
 
 	function duihuamaDuihuan() {
 		// 兑换码兑换策略
-		if (authInfo.value.youke) {
+		if (getUserIsYouke()) {
 			// 非登录 -- 登录
-			
+			loginRef.value.showPopup()
 		} else {
 			// 已登录
-			duihuanmaDialogRef.value.handleShow();
+			uni.navigateTo({
+				url:'/pages/chanpinMy/duihuanma'
+			})
 		}
 	}
 
+  function handleSuccess(authInfo) {
+    // 登录成功更改用户名
+    myInfoData.userName = authInfo.userName;
+    // 前往兑换码
+    uni.navigateTo({
+      url:'/pages/chanpinMy/duihuanma'
+    })
+  }
+
 	onLoad((options) => {
 		uni.hideTabBar()
 		getAuthData();

+ 0 - 13
pages/chanpinShop/orderHistory.vue

@@ -1,13 +0,0 @@
-<template>
-	<view>
-		
-	</view>
-</template>
-
-<script setup>
-
-</script>
-
-<style>
-
-</style>

+ 1 - 0
utils/common.js

@@ -147,6 +147,7 @@ export function convertTimeToSeconds(timeStr) {
     return totalSeconds.toString();
 }
 
+// 当前用户是否是非游客
 export function getUserIsYouke() {
 	const auth = cacheManager.get('auth');
 	if (!auth) {