Browse Source

完成任务中心页面

XSXS 2 months ago
parent
commit
45bf75dc17

+ 1 - 1
components/NicknamePopup/NicknamePopup.vue

@@ -2,7 +2,7 @@
 	<uv-popup ref="popup" mode="bottom" bgColor="none">
 		<view class="heard">
 			<slot name="heard"></slot>
-			<text class="title">{{ title }}</text>
+			<text class="title" v-if="title">{{ title }}</text>
 		</view>
 		<view v-if="subtitle" class="subtitle">{{ subtitle }}</view>
 		<view class="content">

+ 256 - 62
components/checkIn-popUp-window/checkIn-popUp-window.vue

@@ -1,28 +1,106 @@
 <template>
 	<uv-popup ref="popup" mode="bottom" bgColor="none">
 		<view class="content-box">
+			<image class="close" @click="close()" src="@/static/me/job/rw_icon_guanbi.png"></image>
 			<view class="bottomCompatibility">
 				<view class="left-title">
 					<image src="@/static/me/job/rw_wenzi_03.png"></image>
 					<view class="checkInDays">
 						<view>已签到 1 天 <view class="line"></view> 签到提醒</view>
+						<!-- <switch class="sign-switch" color="" :checked="signNotify"   /> -->
+
+						<!-- signNotify -->
+						<uv-switch v-model="falg" size="30rpx" @change="toggleSignNotify" activeColor="#acf934" inactiveColor="#aecc87"></uv-switch>
 					</view>
 				</view>
 				<view class="checkInContent">
 					<view class="horizontal-box">
-						<view class="item-box item-box1 item-box-one" :class="true ? 'active' : ''"></view>
-						<view class="item-box item-box2 item-box-one" :class="true ? 'active' : ''"></view>
-						<view class="item-box item-box3 item-box-two" :class="true ? 'active' : ''"></view>
+						<view class="item-box item-box1 item-box-one" :class="signInfo.signDay >= 1 ? 'active' : ''">
+							<view class="days">
+								1天
+							</view>
+							<view class="content">
+								<image src="@/static/me/job/wd_icon_xingyuan.png"></image>
+								<view class="tit one-omit">海浪操作作秀</view>
+							</view>
+						</view>
+						<view class="item-box item-box2 item-box-one" :class="signInfo.signDay >= 2 ? 'active' : ''">
+							<view class="days">
+								2天
+							</view>
+							<view class="content">
+								<image src="@/static/me/job/wd_icon_xingyuan(1).png"></image>
+								<view class="tit one-omit">红玫瑰x3</view>
+							</view>
+						</view>
+						<view class="item-box item-box3 item-box-two" :class="signInfo.signDay >= 3 ? 'active' : ''">
+							<view class="days">
+								3天
+							</view>
+							<view class="content">
+								<image src="@/static/me/job/wd_icon_xingyuan.png"></image>
+								<view class="tit one-omit">海浪操作作秀</view>
+							</view>
+						</view>
 					</view>
 					<view class="horizontal-box">
-						<view class="item-box item-box4 item-box-two" :class="true ? 'active' : ''"></view>
-						<view class="item-box item-box5 item-box-one" :class="true ? 'active' : ''"></view>
-						<view class="item-box item-box6 item-box-one" :class="true ? 'active' : ''"></view>
+						<view class="item-box item-box4 item-box-two" :class="signInfo.signDay >= 6 ? 'active' : ''">
+							<view class="days">
+								6天
+							</view>
+							<view class="content">
+								<image src="@/static/me/job/wd_icon_xingyuan(4).png"></image>
+								<view class="tit one-omit">樱花x3</view>
+							</view>
+						</view>
+						<view class="item-box item-box5 item-box-one" :class="signInfo.signDay >= 5 ? 'active' : ''">
+							<view class="days">
+								5天
+							</view>
+							<view class="content">
+								<image src="@/static/me/job/wd_icon_xingyuan(5).png"></image>
+								<view class="tit one-omit">海浪头像框</view>
+							</view>
+						</view>
+						<view class="item-box item-box6 item-box-one" :class="signInfo.signDay >= 4 ? 'active' : ''">
+							<view class="days">
+								4天
+							</view>
+							<view class="content">
+								<image src="@/static/me/job/wd_icon_xingyuan(1).png"></image>
+								<view class="tit one-omit">红玫瑰x3</view>
+							</view>
+						</view>
+					</view>
+					<view class="item-box item-box7" :class="signInfo.signDay >= 7 ? 'active' : ''">
+						<view class="days">
+							7天
+						</view>
+						<view class="itemBox7Content">
+							<view class="content">
+								<image src="@/static/me/job/wd_icon_xingyuan(1).png"></image>
+								<view class="tit one-omit">红玫瑰x3</view>
+							</view>
+							<view class="content">
+								<image src="@/static/me/job/wd_icon_xingyuan(4).png"></image>
+								<view class="tit one-omit">红玫瑰x3</view>
+							</view>
+							<view class="content">
+								<image src="@/static/me/job/wd_icon_xingyuan.png"></image>
+								<view class="tit one-omit">红玫瑰x3</view>
+							</view>
+							<view class="content">
+								<image src="@/static/me/job/wd_icon_xingyuan(1).png"></image>
+								<view class="tit one-omit">红玫瑰x3</view>
+							</view>
+						</view>
 					</view>
-					<view class="item-box item-box7" :class="true ? 'active' : ''"></view>
 				</view>
-				<view class="receiveBtn">
-					立即签到
+				<view v-if="signInfo.isSigned " class="receiveBtn" @click="confirmSign()">
+					今日已签到
+				</view>
+				<view v-else-if="!signInfo.isSigned " class="receiveBtn" @click="confirmSign()">
+					签到领取奖励
 				</view>
 			</view>
 		</view>
@@ -33,18 +111,28 @@
 import uvPopup from '@/uni_modules/uv-popup/components/uv-popup/uv-popup.vue'
 
 export default {
-	name: 'NicknamePopup',
+	name: 'checkInPopUpWindow',
 	components: {
 		uvPopup
 	},
-	props: {
-		title: {
-			type: String,
-			default: ''
+	data(){
+		return {
+			falg:this.signNotify	
+		}
+	},
+	props: { 
+		signInfo: {  // 签到信息
+			type: Object,
+			default: () => {}
 		},
-		subtitle: {
-			type: String,
-			default: ''
+		checkInDays: {  // 已签到天数
+
+			type: Number || String,
+			default: 1
+		},
+		signNotify: {  // 签到提醒
+			type: Boolean,
+			default: true
 		}
 	},
 	methods: {
@@ -53,6 +141,12 @@ export default {
 		},
 		close() {
 			this.$refs.popup.close();
+		},
+		toggleSignNotify(e) { 
+			this.$emit('toggleSignNotify', e);
+		},
+		confirmSign(){
+			this.$emit("confirmSign")
 		}
 	}
 }
@@ -62,6 +156,10 @@ export default {
 /* 添加样式 */
 .bottomCompatibility {
 	height: --window-bottom;
+	position: relative;
+	left: 0;
+	top: 0;
+
 }
 
 .content-box {
@@ -71,6 +169,14 @@ export default {
 	padding: 30rpx;
 	padding-top: 136rpx;
 
+	.close {
+		position: absolute;
+		top: 6rpx;
+		right: 30rpx;
+		width: 54rpx;
+		height: 54rpx;
+	}
+
 	.left-title {
 		width: 360rpx;
 		height: 142rpx;
@@ -118,87 +224,171 @@ export default {
 			display: flex;
 			align-items: start;
 			justify-content: space-between;
+		}
+
+		.item-box {
+			display: inline-block;
+			background: #000;
+			position: relative;
+			left: 0;
+			top: 0;
+			padding-top: 30rpx;
+			padding-bottom: 12rpx;
+			box-sizing: border-box;
 
-			.item-box {
-				display: inline-block;
-				background: #000;
+			.days {
+				font-weight: 700;
+				font-size: 18px;
+				color: #8CD914;
+				font-family: 'Alimama ShuHeiTi-Bold';
+				position: absolute;
+				top: 8rpx;
+				left: 18rpx;
 			}
 
-			.item-box-one {
-				width: 226rpx;
-				height: 172rpx;
+			.content {
+				width: 100%;
+				height: 100%;
+				display: flex;
+				align-items: center;
+				justify-content: center;
+				flex-direction: column;
+
+				image {
+					width: 76rpx;
+					height: 76rpx;
+				}
+
+				.tit {
+					max-width: 140rpx;
+					display: inline-block;
+					font-family: 'PingFang SC-Medium';
+					font-weight: 400;
+					font-size: 28rpx;
+					color: #2A3518;
+					margin-top: 12rpx;
+					text-align: center;
+				}
+
 			}
 
-			.item-box-two {
-				width: 212rpx;
-				height: 188rpx;
+			.itemBox7Content {
+				display: flex;
+				align-items: center;
 			}
 
-			.item-box1 {
-				background: url('@/static/me/job/rw_bg_jiangli01_moren.png') center / 100% no-repeat;
+			&.active {
+				.days {
+					color: #fff;
+
+				}
 
-				&.active {
-					background: url('@/static/me/job/rw_bg_jiangli01_dianji.png') center / 100% no-repeat;
-					transform: scale(1.07);
+				.content {
+					.tit {
+						color: #fff;
+					}
 				}
 			}
+		}
 
-			.item-box2 {
-				background: url('@/static/me/job/rw_bg_jiangli02_moren.png') center / 100% no-repeat;
+		.item-box-one {
+			width: 226rpx;
+			height: 172rpx;
+		}
 
-				&.active {
-					background: url('@/static/me/job/rw_bg_jiangli02_dianji.png') center / 100% no-repeat;
-					transform: scale(1.07);
-				}
+		.item-box-two {
+			width: 212rpx;
+			height: 188rpx;
+		}
+
+		.item-box1 {
+			background: url('@/static/me/job/rw_bg_jiangli01_moren.png') center / 100% no-repeat;
+
+			&.active {
+				background: url('@/static/me/job/rw_bg_jiangli01_dianji.png') center / 100% no-repeat;
+				transform: scale(1.07);
 			}
+		}
 
-			.item-box3 {
-				background: url('@/static/me/job/rw_bg_jiangli03_moren.png') center / 100% no-repeat;
+		.item-box2 {
+			background: url('@/static/me/job/rw_bg_jiangli02_moren.png') center / 100% no-repeat;
 
-				&.active {
-					background: url('@/static/me/job/rw_bg_jiangli03_dianji.png') center / 100% no-repeat;
-					transform: scale(1.07);
-				}
+			&.active {
+				background: url('@/static/me/job/rw_bg_jiangli02_dianji.png') center / 100% no-repeat;
+				transform: scale(1.07);
 			}
+		}
 
-			.item-box4 {
-				background: url('@/static/me/job/rw_bg_jiangli04_moren.png') center / 100% no-repeat;
+		.item-box3 {
+			background: url('@/static/me/job/rw_bg_jiangli03_moren.png') center / 100% no-repeat;
 
-				&.active {
-					background: url('@/static/me/job/rw_bg_jiangli04_dianji.png') center / 100% no-repeat;
-					transform: scale(1.07);
-				}
+			&.active {
+				background: url('@/static/me/job/rw_bg_jiangli03_dianji.png') center / 100% no-repeat;
+				transform: scale(1.07);
 			}
+		}
 
-			.item-box5 {
-				background: url('@/static/me/job/rw_bg_jiangli05_moren.png') center / 100% no-repeat;
+		.item-box4 {
+			background: url('@/static/me/job/rw_bg_jiangli04_moren.png') center / 100% no-repeat;
 
-				&.active {
-					background: url('@/static/me/job/rw_bg_jiangli05_dianji.png') center / 100% no-repeat;
-					transform: scale(1.07);
-				}
+			&.active {
+				background: url('@/static/me/job/rw_bg_jiangli04_dianji.png') center / 100% no-repeat;
+				transform: scale(1.07);
 			}
+		}
 
-			.item-box6 {
-				background: url('@/static/me/job/rw_bg_jiangli06_moren.png') center / 100% no-repeat;
+		.item-box5 {
+			background: url('@/static/me/job/rw_bg_jiangli05_moren.png') center / 100% no-repeat;
 
-				&.active {
-					background: url('@/static/me/job/rw_bg_jiangli06_dianji.png') center / 100% no-repeat;
-					transform: scale(1.07);
-				}
+			&.active {
+				background: url('@/static/me/job/rw_bg_jiangli05_dianji.png') center / 100% no-repeat;
+				transform: scale(1.07);
+			}
+		}
+
+		.item-box6 {
+			background: url('@/static/me/job/rw_bg_jiangli06_moren.png') center / 100% no-repeat;
+
+			&.active {
+				background: url('@/static/me/job/rw_bg_jiangli06_dianji.png') center / 100% no-repeat;
+				transform: scale(1.07);
 			}
 		}
 
+
 		.item-box7 {
 			width: 100%;
 			height: 172rpx;
 			background: url('@/static/me/job/rw_bg_jiangli07_moren.png') center / 100% no-repeat;
+			display: flex;
+			align-items: center;
+			justify-content: center;
+
+
+			.itemBox7Content {
+				display: flex;
+				align-items: center;
+				justify-content: space-between;
+				width: 540rpx;
+			}
+
+			.tit {
+				color: #4F3712;
+				font-size: 28rpx;
+				width: 130rpx;
+			}
 
 			&.active {
-				background: url('@/static/me/job/rw_bg_jiangli07_moren.png') center / 100% no-repeat;
+				background: url('@/static/me/job/rw_bg_jiangli07_dianji.png') center / 100% no-repeat;
 				transform: scale(1.01);
+
+				.tit {
+					color: #fff;
+				}
 			}
 		}
+
+
 	}
 
 	.receiveBtn {
@@ -211,5 +401,9 @@ export default {
 		width: 100%;
 		margin-top: 30rpx;
 	}
+
+	.sign-switch {
+		transform: scale(0.6);
+	}
 }
 </style>

+ 2 - 1
pages.json

@@ -230,7 +230,8 @@
 			"path": "pages/my/job",
 			"style": {
 				"navigationBarTitleText": "任务中心",
-				"navigationBarBackgroundColor": "#ffffff"
+				"navigationBarBackgroundColor": "#ffffff",
+				"navigationStyle": "custom"
 			}
 		}, {
 			"path": "pages/my/DelMemConfirm",

+ 468 - 0
pages/my/job copy.vue

@@ -0,0 +1,468 @@
+<template>
+	<view class="page">
+		<!-- 顶部黄色背景 -->
+		<view class="top-bg"></view>
+
+		<!-- 内容区域 -->
+		<view class="content-area">
+			<!-- 彩豆余额展示区 -->
+			<view class="bean-balance">
+				<view class="balance-header">
+					<view class="title-area">
+						<view class="yellow-dot"></view>
+						<text class="my-bean-title">我的彩豆</text>
+					</view>
+					<view class="exchange-btn" @click="showExchangePopup">兑换</view>
+				</view>
+				<view class="bean-number">{{ num_gmd }}</view>
+			</view>
+
+			<!-- 星愿打卡区域 -->
+			<view class="sign-cards">
+				<view class="card purple-card">
+					<view class="card-title">初次见面礼</view>
+					<view class="card-desc">完善个人资料可得</view>
+					<view class="card-reward">奖励+100彩豆</view>
+					<view class="card-progress">{{ newer_bfb }}</view>
+				</view>
+				<view class="card yellow-card">
+					<view class="card-title">每日签到</view>
+					<view class="card-desc">连续签到奖励更多</view>
+					<view class="sign-btn" @click="showSignPopup">立即签到</view>
+					<view class="sign-btn" @click="opencheckInPopUpWindow()">立即签到</view>
+				</view>
+			</view>
+
+			<!-- 每日任务列表 -->
+			<view class="task-list">
+				<view class="task-header">
+					<text class="task-title">每日任务</text>
+					<text class="task-subtitle">获取免费彩豆</text>
+				</view>
+
+				<!-- 任务项列表 -->
+				<view class="task-item" v-for="(item, index) in taskList" :key="index">
+					<view class="task-info">
+						<view class="task-name">{{ item.name }}</view>
+						<view class="task-desc">{{ item.content }}</view>
+					</view>
+					<view class="task-reward">+{{ item.num }}彩豆</view>
+					<view class="task-btn" :class="{ 'task-completed': item.status == 9 }" @click="claimReward(index)">
+						{{ item.status == 9 ? "已领取" : "领取" }}
+					</view>
+				</view>
+			</view>
+		</view>
+
+		<!-- 彩豆兑换弹窗 -->
+		<view class="exchange-popup" v-if="showExchange">
+			<view class="popup-mask" @click="hideExchangePopup"></view>
+			<view class="popup-content">
+				<!-- 弹窗顶部信息栏 -->
+				<view class="popup-header">
+					<text class="available-balance">可用M币: 14500</text>
+					<text class="exchange-title">兑换彩豆</text>
+				</view>
+
+				<!-- 兑换区域主体 -->
+				<view class="exchange-area">
+					<view class="exchange-title-area">
+						<text class="exchange-main-title">M币兑换彩豆数</text>
+						<text class="exchange-subtitle">兑换彩豆数必须是10的倍数</text>
+					</view>
+
+					<view class="input-area">
+						<view class="bean-icon"></view>
+						<input type="number" class="exchange-input" placeholder="请输入兑换彩豆数量" v-model="exchangeAmount" />
+					</view>
+
+					<!-- 操作按钮 -->
+					<view class="action-area">
+						<view class="exchange-btn-large" @click="confirmExchange">立即兑换彩豆</view>
+						<text class="tips-text">彩豆可用于创作(生成图片、音乐等AI创作功能)</text>
+					</view>
+				</view>
+			</view>
+		</view>
+
+		<!-- 签到弹窗 -->
+		<view class="sign-popup" v-if="showSign">
+			<view class="popup-mask" @click="hideSignPopup"></view>
+			<view class="sign-popup-content">
+				<!-- 弹窗顶部 -->
+				<view class="sign-popup-header">
+					<text class="sign-popup-title">每日签到领好礼</text>
+					<view class="sign-notify-switch">
+						<text class="sign-notify-text">签到消息提醒</text>
+						<switch class="sign-switch" color="#9C27B0" :checked="signNotify" @change="toggleSignNotify" />
+					</view>
+					<view class="sign-days-tag">已签到{{ signInfo.signDay }}天</view>
+				</view>
+
+				<!-- VIP特权区域 -->
+				<view class="vip-area">
+					<view class="vip-left">
+						<text class="vip-text">VIP十通会员,签到享专属好礼</text>
+					</view>
+					<view class="vip-right">
+						<text class="vip-offer">限时优惠 ></text>
+					</view>
+				</view>
+
+				<!-- 签到奖励网格布局 -->
+				<view class="sign-grid">
+					<view class="sign-grid-item" v-for="(item, index) in signRewards" :key="index" :class="{
+            'sign-received':
+              index < signInfo.signDay ||
+              (index === signInfo.signDay - 1 && signInfo.isSigned),
+          }">
+						<view class="sign-day-num">{{ item.dayNum }}</view>
+						<view class="sign-item-img"></view>
+						<view class="sign-item-name">{{ item.reward }}</view>
+						<view class="sign-vip-tag" v-if="item.isVip">VIP</view>
+						<view class="sign-received-mask" v-if="
+              index < signInfo.signDay ||
+              (index === signInfo.signDay - 1 && signInfo.isSigned)
+            ">
+							<text class="received-text">已领取</text>
+						</view>
+					</view>
+				</view>
+
+				<!-- 底部签到按钮 -->
+				<view class="sign-btn-large" :class="{ 'sign-btn-disabled': signInfo.isSigned }" @click="confirmSign">
+					{{ signInfo.isSigned ? "今日已签到" : "签到领取奖励" }}
+				</view>
+			</view>
+		</view>
+
+		<checkInPopUpWindow :checkInDays="6"
+		:signNotify="signNotify" @toggleSignNotify="toggleSignNotify" ref="checkInPopUpWindow"></checkInPopUpWindow>
+
+		<!-- 提示框 -->
+		<DialogBox ref="DialogBox"></DialogBox>
+	</view>
+</template>
+
+<script>
+	import checkInPopUpWindow from "@/components/checkIn-popUp-window/checkIn-popUp-window.vue";
+	export default {
+		components: {
+			checkInPopUpWindow
+		},
+		data() {
+			return {
+				title: "任务中心",
+				myinfo: {},
+				realname: "",
+				num_gmd: 0,
+				newer_bfb: "",
+				beanBalance: 2560,
+				showExchange: false,
+				exchangeAmount: "",
+				mCoinBalance: 14500,
+				showSign: false,
+				signNotify: true,
+				signRewards: [{
+						dayNum: "01",
+						reward: "10彩豆",
+						isVip: false,
+					},
+					{
+						dayNum: "02",
+						reward: "15彩豆",
+						isVip: false,
+					},
+					{
+						dayNum: "03",
+						reward: "20彩豆",
+						isVip: false,
+					},
+					{
+						dayNum: "04",
+						reward: "25彩豆",
+						isVip: false,
+					},
+					{
+						dayNum: "05",
+						reward: "30彩豆",
+						isVip: false,
+					},
+					{
+						dayNum: "06",
+						reward: "35彩豆",
+						isVip: true,
+					},
+					{
+						dayNum: "07",
+						reward: "50彩豆",
+						isVip: true,
+					},
+				],
+				signInfo: {
+					signDay: 1,
+					isSigned: false,
+					reward: 0,
+				},
+				taskList: [],
+			};
+		},
+		onLoad() {
+			this.loadData();
+			this.getSignInfo();
+		},
+		onShow() {
+		  },
+		methods: {
+			opencheckInPopUpWindow() {
+
+				this.$refs.checkInPopUpWindow.open();
+			},
+			closecheckInPopUpWindow() {
+				this.$refs.checkInPopUpWindow.close();
+			},
+			onBack() {},
+
+			loadData() {
+				uni.request({
+					url: this.$apiHost + "/Job/getlist",
+					data: {
+						uuid: getApp().globalData.uuid,
+					},
+					header: {
+						"content-type": "application/json",
+						sign: getApp().globalData.headerSign,
+					},
+					success: (res) => {
+						console.log("----:", res.data);
+						this.num_gmd = res.data.num_gmd;
+						this.newer_bfb = res.data.newer_bfb;
+						this.taskList = res.data.list;
+					},
+					complete: (com) => {
+						// uni.hideLoading();
+					},
+					fail: (e) => {
+						console.log("----e:", e);
+					},
+				});
+			},
+
+			// 获取签到信息
+			getSignInfo() {
+				uni.request({
+					url: this.$apiHost + "/User/sign7Day",
+					data: {
+						uuid: getApp().globalData.uuid,
+						action: "get",
+					},
+					header: {
+						"content-type": "application/json",
+						sign: getApp().globalData.headerSign,
+					},
+					success: (res) => {
+						if (res.data.success === "yes") {
+							this.signInfo = {
+								signDay: res.data.data.sign_day,
+								isSigned: res.data.data.is_signed,
+								reward: res.data.data.reward || 0,
+							};
+						}
+					},
+					fail: (e) => {
+						console.log("获取签到信息失败:", e);
+					},
+				});
+			},
+
+			// 显示兑换弹窗
+			showExchangePopup() {
+				this.showExchange = true;
+			},
+
+			// 隐藏兑换弹窗
+			hideExchangePopup() {
+				this.showExchange = false;
+			},
+
+			// 显示签到弹窗
+			showSignPopup() {
+				this.showSign = true;
+			},
+
+			// 隐藏签到弹窗
+			hideSignPopup() {
+				this.showSign = false;
+			},
+
+			// 切换签到通知开关
+			toggleSignNotify(falg) {
+				this.signNotify =falg;
+				console.log('1111111',falg);
+				
+			},
+
+			// 确认签到
+			confirmSign() {
+				if (this.signInfo.isSigned) {
+					uni.showToast({
+						title: "今日已签到",
+						icon: "none",
+					});
+					return;
+				}
+
+				uni.request({
+					url: this.$apiHost + "/User/sign7Day",
+					data: {
+						uuid: getApp().globalData.uuid,
+						action: "sign",
+					},
+					header: {
+						"content-type": "application/json",
+						sign: getApp().globalData.headerSign,
+					},
+					success: (res) => {
+						if (res.data.success === "yes") {
+							uni.showToast({
+								title: res.data.str,
+								icon: "none",
+							});
+							// 更新签到信息
+							this.getSignInfo();
+							// 更新彩豆数量
+							this.loadData();
+						} else {
+							uni.showToast({
+								title: res.data.str,
+								icon: "none",
+							});
+						}
+					},
+					fail: (e) => {
+						console.log("签到失败:", e);
+						uni.showToast({
+							title: "签到失败,请稍后重试",
+							icon: "none",
+						});
+					},
+				});
+			},
+
+			// 确认兑换
+			confirmExchange() {
+				if (!this.exchangeAmount) {
+					uni.showToast({
+						title: "请输入兑换数量",
+						icon: "none",
+					});
+					return;
+				}
+
+				const amount = parseInt(this.exchangeAmount);
+
+				if (isNaN(amount) || amount <= 0) {
+					uni.showToast({
+						title: "请输入有效数量",
+						icon: "none",
+					});
+					return;
+				}
+
+				if (amount % 10 !== 0) {
+					uni.showToast({
+						title: "兑换数量必须是10的倍数",
+						icon: "none",
+					});
+					return;
+				}
+				let that = this;
+				uni.request({
+					url: this.$apiHost + "/User/gmmToGMD",
+					data: {
+						uuid: getApp().globalData.uuid,
+						num: amount,
+					},
+					header: {
+						"content-type": "application/json",
+						sign: getApp().globalData.headerSign,
+					},
+					success: (res) => {
+						console.log("----:", res.data);
+						uni.showToast({
+							title: res.data.str,
+							icon: "none",
+						});
+						if (res.data.success == "yes") {
+							this.hideExchangePopup();
+							this.exchangeAmount = "";
+							setTimeout(function() {
+								that.loadData();
+							}, 900);
+						}
+					},
+					complete: (com) => {
+						// uni.hideLoading();
+					},
+					fail: (e) => {
+						console.log("----e:", e);
+					},
+				});
+
+				// // 模拟兑换处理
+				// uni.showToast({
+				// 	title: "兑换成功,获得" + amount + "彩豆",
+				// 	icon: 'none'
+				// });
+
+				// this.beanBalance += amount;
+				// this.hideExchangePopup();
+				// this.exchangeAmount = '';
+			},
+
+			claimReward(index) {
+				if (this.taskList[index].status == 9) {
+					uni.showToast({
+						title: "已领取该奖励",
+						icon: "none",
+					});
+					return;
+				}
+				let that = this;
+				uni.request({
+					url: this.$apiHost + "/Job/doAct",
+					data: {
+						uuid: getApp().globalData.uuid,
+						id: this.taskList[index].id,
+					},
+					header: {
+						"content-type": "application/json",
+						sign: getApp().globalData.headerSign,
+					},
+					success: (res) => {
+						console.log("----:", res.data);
+						if (res.data.success == "yes") {
+							uni.showToast({
+								title: res.data.str,
+								icon: "none",
+							});
+							setTimeout(function() {
+								that.loadData();
+							}, 900);
+						}
+					},
+					complete: (com) => {
+						// uni.hideLoading();
+					},
+					fail: (e) => {
+						console.log("----e:", e);
+					},
+				});
+			},
+		},
+	};
+</script>
+
+<style scoped lang="scss">
+	@import "job.scss";
+</style>

+ 788 - 550
pages/my/job.scss

@@ -1,598 +1,836 @@
 page {
-	background-color: #fff;
+  background-color: #fff;
+  font-family: "PingFang SC-Medium";
 }
 
 .page {
-	background-color: #fff;
-	position: relative;
+  background-color: #fff;
+  position: relative;
+  background: url("../../static/me/job/rw_bg_01.png") center top / 100% auto
+      no-repeat,
+    #f2f6f2;
 }
 
 // 顶部黄色背景
-.top-bg {
-	position: absolute;
-	top: 0;
-	left: 0;
-	width: 100%;
-	height: 200rpx;
-	background-color: #90d369;
-	z-index: 0;
+.PageHeader {
+  background: url("../../static/me/job/rw_bg_01.png") center top / 100% auto
+      no-repeat,
+    #f2f6f2;
+  background-position-y: var(--status-bar-height);
+}
+.occupyHigh {
+  height: calc(var(--status-bar-height) + 150rpx);
+  width: 100%;
 }
 
 // 内容区域
 .content-area {
-	position: relative;
-	z-index: 1;
-	padding: 30rpx;
+  position: relative;
+  z-index: 1;
+  padding: 0 20rpx;
 }
-
-.topbg {
+// 星源余额展示区
+.person-info {
+  display: flex;
+  justify-content: space-between;
+  align-items: center;
+  padding: 0 20rpx;
+  padding-bottom: 48rpx;
+  .person-info-left {
+    display: flex;
+    .avator {
+      width: 100rpx;
+      height: 100rpx;
+      border: 4rpx solid #fff;
+      margin-right: 28rpx;
+    }
+    .title-area {
+      .my-bean-title {
+        font-size: 24rpx;
+      }
+      .bean-number {
+        display: flex;
+        align-items: center;
+        font-family: "CustomFont";
+        font-weight: 700;
+        font-size: 48rpx;
+        color: #1f1f1f;
+        image {
+          width: 40rpx;
+          height: 40rpx;
+          margin-right: 8rpx;
+        }
+      }
+    }
+  }
+  .exchange-btn {
+    width: 140rpx;
+    height: 52rpx;
+    background: #1f1f1f;
+    border-radius: 26rpx;
+    font-size: 24rpx;
+    color: #acf934;
+    display: flex;
+    align-items: center;
+    justify-content: center;
+  }
 }
 
-.topBody {
-	width:750rpx;
-}
+// 星愿打卡区域
+.starWishCheckIn {
+  width: 710rpx;
+  height: 380rpx;
+  background: url("../../static/me/job/rw_bg_02.png") top left/100% no-repeat,
+    #ffffff;
+  box-shadow: 0rpx 6rpx 8rpx 0rpx rgba(231, 231, 231, 0.29);
+  border-radius: 20rpx;
+  padding: 20rpx;
+  padding-top: 96rpx;
+  margin-bottom: 20rpx;
+  display: flex;
+  justify-content: space-between;
+  position: relative;
+  left: 0;
+  top: 0;
+  .title {
+    position: absolute;
+    left: 20rpx;
+    top: 20rpx;
+    width: 200rpx;
+    height: 104rpx;
+  }
+  .card {
+    width: 328rpx;
+    height: 238rpx;
+    padding: 28rpx 26rpx 22rpx 24rpx;
+    box-sizing: border-box;
+    .card-title {
+      font-weight: 700;
+      font-size: 28rpx;
+      color: #ffffff;
+      font-family: "CustomFont";
+    }
+    .card-desc {
+      font-weight: 400;
+      font-size: 22rpx;
+      color: rgba(255, 255, 255, 0.8);
+      width: 180rpx;
+      padding-bottom: 20rpx;
+    }
+    .card-btn {
+      width: 276rpx;
+      height: 64rpx;
+      display: flex;
+      align-items: center;
+      justify-content: center;
+      padding-bottom: 10rpx;
 
-.header {
-	display: flex;flex-direction: row;justify-content: space-between;align-items: center;color:$title;
+      font-weight: 400;
+      font-size: 28rpx;
 
-	.title {
-		font-size: 34rpx;
-	}
+      &.card-reward {
+        background: url("../../static/me/job/rw_btn_01.png") center/100%
+          no-repeat;
+        color: #c88618;
+      }
+      &.sign-btn {
+        background: url("../../static/me/job/rw_btn_02.png") center/100%
+          no-repeat;
+        color: #0484ce;
+      }
+    }
+    &.purple-card {
+      background: url("../../static/me/job/sy_img_xingyuandaka01.png")
+        center/100% no-repeat;
+    }
+    &.yellow-card {
+      background: url("../../static/me/job/sy_img_xingyuandaka02.png")
+        center/100% no-repeat;
+    }
+  }
 }
 
-.thread {
-	height:210rpx;
-	padding:50rpx;font-size: 52rpx;color:#6E6A6A;padding-top: 80rpx;
-}
+// 任务列表
+.task-list-box {
+  box-shadow: 0rpx 6rpx 8rpx 0rpx rgba(231, 231, 231, 0.29);
+  border-radius: 20rpx;
+  background: url("../../static/me/job/rw_bg_02.png") top left/100% no-repeat,
+    #ffffff;
+  padding: 20rpx;
+  box-sizing: border-box;
+  .task-header {
+    display: flex;
+    align-items: center;
 
-.mainInfo {
-	width: 690rpx;
-	margin:30rpx 30rpx 60rpx;
-	display:flex;flex-direction: column;justify-content: space-around;
-	align-items: center;
-	// background: #FFFFFF;
-	
-	
-	.idList {
-		display: flex;flex-direction: row;justify-content: space-between;align-items: center;
-		// position: relative;
-		width: 610rpx;
-		height: 84rpx;
-		background: #282828;
-		border-radius: 24rpx 24rpx 24rpx 24rpx;
-		margin-top: 48rpx;
-		.left {
-			display: flex;flex-direction: row;justify-content: flex-start;align-items: center;
-			padding-left:24rpx;
+    image {
+      width: 200rpx;
+      height: 50rpx;
+      margin-right: 4rpx;
+    }
+    .task-subtitle {
+      font-weight: 400;
+      font-size: 22rpx;
+      color: #999999;
+    }
+  }
+  .task-item {
+    display: flex;
+    flex-direction: row;
+    align-items: center;
+    padding: 20rpx 0;
+    border-bottom: 1px solid #f0f0f0;
+    justify-content: space-between;
+    .task-info {
+      flex: 1;
+      display: flex;
+      align-items: center;
+      justify-content: flex-start;
+      max-width: 408rpx;
+      image {
+        width: 88rpx;
+        height: 88rpx;
+        flex-shrink: 0;
+        margin-right: 20rpx;
+      }
+      .task-name {
+        color: #333;
+        margin-bottom: 6rpx;
+        max-width: 310rpx;
+        font-weight: 400;
+        font-size: 28rpx;
+        color: #1f1f1f;
+        font-family: "PingFang SC-Bold";
+      }
 
+      .task-desc {
+        max-width: 310rpx;
+        font-weight: 400;
+        font-size: 22rpx;
+        color: #999999;
+      }
+    }
 
-		}
-		.right{
-			display: flex;flex-direction: row;justify-content: flex-start;align-items: center;
-			padding-right:24rpx;
+    .task-reward {
+      font-size: 28rpx;
+      color: #1f1f1f;
+      margin-right: 20rpx;
+      display: flex;
+      align-items: center;
+      justify-content: center;
+      image {
+        width: 36rpx;
+        height: 36rpx;
+      }
+    }
 
+    .task-btn {
+      display: flex;
+      justify-content: center;
+      align-items: center;
 
-		}
+      width: 140rpx;
+      height: 52rpx;
+      background: #1f1f1f;
+      border-radius: 26rpx;
+      font-weight: 400;
+      font-size: 24rpx;
+      color: #acf934;
+      border: 2rpx solid #1f1f1f;
 
-	}
-	
-	.reCheckBtn{
-		width: 610rpx;
-		height: 96rpx;
-		border-radius: 28rpx 28rpx 28rpx 28rpx;
-		border: 2rpx solid #404040;
-		display:flex;flex-direction: column;justify-content: space-around;
-		align-items: center;
-		margin-top: 74rpx;
-	}
-	
+      &.task-completed {
+        background-color: #fff;
+        color: #1f1f1f;
+        border: 2rpx solid #1f1f1f;
+      }
+    }
+  }
 }
 
-.blankHeight {
-	height:100rpx;
+// 兑换弹窗
+.NicknamePopUpWindowBox {
+		::v-deep.uv-popup .uv-popup__content {
+			border-radius: 28rpx 28rpx 0 0;
+			min-height: 400rpx;
+			background: url("../../static/me/wd_bg_jianjie.png") center top/100% auto no-repeat, #f2f6f2 !important;
+			padding-bottom: 40rpx;
+		
+		}
 }
 
-// 彩豆余额展示区
-.bean-balance {
-	width: 690rpx;
-	background-color: #FFFFFF;
-	border-radius: 24rpx;
-	padding: 30rpx;
-	margin-bottom: 30rpx;
-	box-shadow: 0 4rpx 16rpx rgba(0,0,0,0.05);
-	
-	.balance-header {
+.NicknamePopUpWindow {
+
+  .nickname-heard {
+    padding: 0 32rpx;
+    padding-top: 20rpx;
+    padding-bottom: -26rpx;
+    display: flex;
+    flex-direction: center;
+    align-items: center;
+    position: relative;
+    left: 0;
+    top: 0;
+    width: 100vw;
+    box-sizing: border-box;
+    .available-mCoin {
+      font-weight: 400;
+      font-size: 24rpx;
+      color: #1f1f1f;
+    }
+    .exchange-title {
+      position: absolute;
+      left: 50%;
+      top: calc(50% + 10rpx);
+      transform: translate(-50%, -50%);
+      font-family: "CustomFont";
+      font-weight: 700;
+      font-size: 36rpx;
+      color: #1f1f1f;
+    }
+  }
+  .content-box {
+width: 686rpx;
+height: 360rpx;
+background: #FFFFFF;
+border-radius: 20rpx;
+margin:  0 auto;
+    margin-bottom: 40rpx;
+	padding: 24rpx;
+	.prompt{
+		font-weight: 400;
+		font-size: 28rpx;
+		color: #1F1F1F;
+		padding-bottom: 24rpx;
+		text{
+			color: #999999;
+			font-size: 24rpx;
+		}
+	}
+	::v-deep.uv-input{
+		background-color: #f2f6f2;
+	}
+	.input-box{
+		width: 100%;
+		height: 88rpx;
+		background: #F2F6F2;
+		border-radius: 20rpx;
 		display: flex;
-		flex-direction: row;
-		justify-content: space-between;
 		align-items: center;
-		
-		.title-area {
-			display: flex;
-			flex-direction: row;
-			align-items: center;
-			
-			.yellow-dot {
-				width: 16rpx;
-				height: 16rpx;
-				border-radius: 50%;
-				background-color: #90d369;
-				margin-right: 10rpx;
-			}
-			
-			.my-bean-title {
-				font-size: 32rpx;
-				color: #333;
-				font-weight: bold;
-			}
-		}
-		
-		.exchange-btn {
-			width: 120rpx;
-			height: 60rpx;
-			background-color: #90d369;
-			border-radius: 30rpx;
-			display: flex;
-			justify-content: center;
-			align-items: center;
-			font-size: 28rpx;
-			color: #fff;
-			font-weight: bold;
+		justify-content: center;
+		margin-bottom: 60rpx;
+		padding:18rpx 24rpx ;
+		>image{
+			width: 48rpx;
+			height: 48rpx;
+			margin-right: 16rpx;
 		}
+	.input{
+	}	
 	}
 	
-	.bean-number {
-		font-size: 80rpx;
-		font-weight: bold;
-		color: #333;
-		margin-top: 20rpx;
-	}
+  }
+}
+
+// 星源余额展示区
+.bean-balance {
+  width: 690rpx;
+  background-color: #ffffff;
+  border-radius: 24rpx;
+  padding: 30rpx;
+  margin-bottom: 30rpx;
+  box-shadow: 0 4rpx 16rpx rgba(0, 0, 0, 0.05);
+
+  .balance-header {
+    display: flex;
+    flex-direction: row;
+    justify-content: space-between;
+    align-items: center;
+
+    .title-area {
+      display: flex;
+      flex-direction: row;
+      align-items: center;
+
+      .yellow-dot {
+        width: 16rpx;
+        height: 16rpx;
+        border-radius: 50%;
+        background-color: #90d369;
+        margin-right: 10rpx;
+      }
+
+      .my-bean-title {
+        font-size: 32rpx;
+        color: #333;
+        font-weight: bold;
+      }
+    }
+
+    .exchange-btn {
+      width: 120rpx;
+      height: 60rpx;
+      background-color: #90d369;
+      border-radius: 30rpx;
+      display: flex;
+      justify-content: center;
+      align-items: center;
+      font-size: 28rpx;
+      color: #fff;
+      font-weight: bold;
+    }
+  }
+
+  .bean-number {
+    font-size: 80rpx;
+    font-weight: bold;
+    color: #333;
+    margin-top: 20rpx;
+  }
 }
 
 // 星愿打卡区域
 .sign-cards {
-	display: flex;
-	flex-direction: row;
-	justify-content: space-between;
-	margin-bottom: 30rpx;
-	
-	.card {
-		width: 330rpx;
-		height: 240rpx;
-		border-radius: 24rpx;
-		padding: 24rpx;
-		display: flex;
-		flex-direction: column;
-		box-shadow: 0 4rpx 16rpx rgba(0,0,0,0.05);
-		
-		.card-title {
-			font-size: 34rpx;
-			font-weight: bold;
-			color: #FFFFFF;
-			margin-bottom: 10rpx;
-		}
-		
-		.card-desc {
-			font-size: 24rpx;
-			color: rgba(255, 255, 255, 0.8);
-			margin-bottom: 30rpx;
-		}
-		
-		.card-reward {
-			font-size: 30rpx;
-			color: #FFFFFF;
-			font-weight: bold;
-		}
-		
-		.card-progress {
-			font-size: 36rpx;
-			color: #FFFFFF;
-			font-weight: bold;
-			margin-top: auto;
-		}
-		
-		.sign-btn {
-			width: 180rpx;
-			height: 70rpx;
-			background-color: #FFFFFF;
-			border-radius: 35rpx;
-			display: flex;
-			justify-content: center;
-			align-items: center;
-			font-size: 28rpx;
-			color: #333;
-			font-weight: bold;
-			margin-top: auto;
-		}
-	}
-	
-	.purple-card {
-		background-color: #9C27B0;
-	}
-	
-	.yellow-card {
-		background-color: #90d369;
-	}
+  display: flex;
+  flex-direction: row;
+  justify-content: space-between;
+  margin-bottom: 30rpx;
+
+  .card {
+    width: 330rpx;
+    height: 240rpx;
+    border-radius: 24rpx;
+    padding: 24rpx;
+    display: flex;
+    flex-direction: column;
+    box-shadow: 0 4rpx 16rpx rgba(0, 0, 0, 0.05);
+
+    .card-title {
+      font-size: 34rpx;
+      font-weight: bold;
+      color: #ffffff;
+      margin-bottom: 10rpx;
+    }
+
+    .card-desc {
+      font-size: 24rpx;
+      color: rgba(255, 255, 255, 0.8);
+      margin-bottom: 30rpx;
+    }
+
+    .card-reward {
+      font-size: 30rpx;
+      color: #ffffff;
+      font-weight: bold;
+    }
+
+    .card-progress {
+      font-size: 36rpx;
+      color: #ffffff;
+      font-weight: bold;
+      margin-top: auto;
+    }
+
+    .sign-btn {
+      width: 180rpx;
+      height: 70rpx;
+      background-color: #ffffff;
+      border-radius: 35rpx;
+      display: flex;
+      justify-content: center;
+      align-items: center;
+      font-size: 28rpx;
+      color: #333;
+      font-weight: bold;
+      margin-top: auto;
+    }
+  }
+
+  .purple-card {
+    background-color: #9c27b0;
+  }
+
+  .yellow-card {
+    background-color: #90d369;
+  }
 }
 
 // 任务列表
 .task-list {
-	background-color: #FFFFFF;
-	border-radius: 24rpx;
-	padding: 30rpx;
-	box-shadow: 0 4rpx 16rpx rgba(0,0,0,0.05);
-	
-	.task-header {
-		display: flex;
-		flex-direction: row;
-		align-items: center;
-		margin-bottom: 30rpx;
-		
-		.task-title {
-			font-size: 34rpx;
-			color: #333;
-			font-weight: bold;
-			margin-right: 20rpx;
-		}
-		
-		.task-subtitle {
-			font-size: 24rpx;
-			color: #999;
-		}
-	}
-	
-	.task-item {
-		display: flex;
-		flex-direction: row;
-		align-items: center;
-		padding: 20rpx 0;
-		border-bottom: 1px solid #F0F0F0;
-		
-		.task-info {
-			flex: 1;
-			
-			.task-name {
-				font-size: 30rpx;
-				color: #333;
-				margin-bottom: 6rpx;
-			}
-			
-			.task-desc {
-				font-size: 24rpx;
-				color: #999;
-			}
-		}
-		
-		.task-reward {
-			font-size: 30rpx;
-			color: #90d369;
-			font-weight: bold;
-			margin-right: 20rpx;
-		}
-		
-		.task-btn {
-			width: 120rpx;
-			height: 60rpx;
-			background-color: #90d369;
-			border-radius: 30rpx;
-			display: flex;
-			justify-content: center;
-			align-items: center;
-			font-size: 26rpx;
-			color: #fff;
-			font-weight: bold;
-		}
-		
-		.task-completed {
-			background-color: #F0F0F0;
-			color: #999;
-		}
-	}
+  background-color: #ffffff;
+  border-radius: 24rpx;
+  padding: 30rpx;
+  box-shadow: 0 4rpx 16rpx rgba(0, 0, 0, 0.05);
+
+  .task-header {
+    display: flex;
+    flex-direction: row;
+    align-items: center;
+    margin-bottom: 30rpx;
+
+    .task-title {
+      font-size: 34rpx;
+      color: #333;
+      font-weight: bold;
+      margin-right: 20rpx;
+    }
+
+    .task-subtitle {
+      font-size: 24rpx;
+      color: #999;
+    }
+  }
+
+  .task-item {
+    display: flex;
+    flex-direction: row;
+    align-items: center;
+    padding: 20rpx 0;
+    border-bottom: 1px solid #f0f0f0;
+
+    .task-info {
+      flex: 1;
+
+      .task-name {
+        font-size: 30rpx;
+        color: #333;
+        margin-bottom: 6rpx;
+      }
+
+      .task-desc {
+        font-size: 24rpx;
+        color: #999;
+      }
+    }
+
+    .task-reward {
+      font-size: 30rpx;
+      color: #90d369;
+      font-weight: bold;
+      margin-right: 20rpx;
+    }
+
+    .task-btn {
+      width: 120rpx;
+      height: 60rpx;
+      background-color: #90d369;
+      border-radius: 30rpx;
+      display: flex;
+      justify-content: center;
+      align-items: center;
+      font-size: 26rpx;
+      color: #fff;
+      font-weight: bold;
+    }
+
+    .task-completed {
+      background-color: #f0f0f0;
+      color: #999;
+    }
+  }
 }
 
-// 彩豆兑换弹窗
+// 星源兑换弹窗
 .exchange-popup {
-	position: fixed;
-	bottom: 0;
-	left: 0;
-	width: 100%;
-	height: 100%;
-	z-index: 999;
-	
-	.popup-mask {
-		position: absolute;
-		top: 0;
-		left: 0;
-		width: 100%;
-		height: 100%;
-		background-color: rgba(0, 0, 0, 0.5);
-	}
-	
-	.popup-content {
-		position: absolute;
-		bottom: 0;
-		left: 0;
-		width: 100%;
-		background-color: #F5F5F5;
-		border-radius: 24rpx 24rpx 0 0;
-		padding-bottom: 50rpx;
-		
-		.popup-header {
-			display: flex;
-			flex-direction: row;
-			justify-content: space-between;
-			align-items: center;
-			padding: 30rpx;
-			
-			.available-balance {
-				font-size: 28rpx;
-				color: #333;
-			}
-			
-			.exchange-title {
-				font-size: 28rpx;
-				color: #333;
-				font-weight: bold;
-			}
-		}
-		
-		.exchange-area {
-			background-color: #FFFFFF;
-			margin: 0 30rpx;
-			border-radius: 20rpx;
-			padding: 30rpx;
-			
-			.exchange-title-area {
-				margin-bottom: 40rpx;
-				
-				.exchange-main-title {
-					font-size: 34rpx;
-					color: #333;
-					font-weight: bold;
-					display: block;
-					margin-bottom: 10rpx;
-				}
-				
-				.exchange-subtitle {
-					font-size: 24rpx;
-					color: #999;
-				}
-			}
-			
-			.input-area {
-				display: flex;
-				flex-direction: row;
-				align-items: center;
-				padding: 20rpx 0;
-				border-bottom: 1px solid #F0F0F0;
-				margin-bottom: 50rpx;
-				
-				.bean-icon {
-					width: 40rpx;
-					height: 40rpx;
-					border-radius: 50%;
-					background-color: #FFE156;
-					margin-right: 20rpx;
-				}
-				
-				.exchange-input {
-					flex: 1;
-					height: 60rpx;
-					font-size: 30rpx;
-				}
-			}
-			
-			.action-area {
-				display: flex;
-				flex-direction: column;
-				align-items: center;
-				
-				.exchange-btn-large {
-					width: 100%;
-					height: 90rpx;
-					background-color: #90d369;
-					border-radius: 45rpx;
-					display: flex;
-					justify-content: center;
-					align-items: center;
-					font-size: 32rpx;
-					color: #fff;
-					font-weight: bold;
-					margin-bottom: 20rpx;
-				}
-				
-				.tips-text {
-					font-size: 24rpx;
-					color: #999;
-					text-align: center;
-				}
-			}
-		}
-	}
+  position: fixed;
+  bottom: 0;
+  left: 0;
+  width: 100%;
+  height: 100%;
+  z-index: 999;
+
+  .popup-mask {
+    position: absolute;
+    top: 0;
+    left: 0;
+    width: 100%;
+    height: 100%;
+    background-color: rgba(0, 0, 0, 0.5);
+  }
+
+  .popup-content {
+    position: absolute;
+    bottom: 0;
+    left: 0;
+    width: 100%;
+    background-color: #f5f5f5;
+    border-radius: 24rpx 24rpx 0 0;
+    padding-bottom: 50rpx;
+
+    .popup-header {
+      display: flex;
+      flex-direction: row;
+      justify-content: space-between;
+      align-items: center;
+      padding: 30rpx;
+
+      .available-balance {
+        font-size: 28rpx;
+        color: #333;
+      }
+
+      .exchange-title {
+        font-size: 28rpx;
+        color: #333;
+        font-weight: bold;
+      }
+    }
+
+    .exchange-area {
+      background-color: #ffffff;
+      margin: 0 30rpx;
+      border-radius: 20rpx;
+      padding: 30rpx;
+
+      .exchange-title-area {
+        margin-bottom: 40rpx;
+
+        .exchange-main-title {
+          font-size: 34rpx;
+          color: #333;
+          font-weight: bold;
+          display: block;
+          margin-bottom: 10rpx;
+        }
+
+        .exchange-subtitle {
+          font-size: 24rpx;
+          color: #999;
+        }
+      }
+
+      .input-area {
+        display: flex;
+        flex-direction: row;
+        align-items: center;
+        padding: 20rpx 0;
+        border-bottom: 1px solid #f0f0f0;
+        margin-bottom: 50rpx;
+
+        .bean-icon {
+          width: 40rpx;
+          height: 40rpx;
+          border-radius: 50%;
+          background-color: #ffe156;
+          margin-right: 20rpx;
+        }
+
+        .exchange-input {
+          flex: 1;
+          height: 60rpx;
+          font-size: 30rpx;
+        }
+      }
+
+      .action-area {
+        display: flex;
+        flex-direction: column;
+        align-items: center;
+
+        .exchange-btn-large {
+          width: 100%;
+          height: 90rpx;
+          background-color: #90d369;
+          border-radius: 45rpx;
+          display: flex;
+          justify-content: center;
+          align-items: center;
+          font-size: 32rpx;
+          color: #fff;
+          font-weight: bold;
+          margin-bottom: 20rpx;
+        }
+
+        .tips-text {
+          font-size: 24rpx;
+          color: #999;
+          text-align: center;
+        }
+      }
+    }
+  }
 }
 
 // 签到弹窗
 .sign-popup {
-	position: fixed;
-	bottom: 0;
-	left: 0;
-	width: 100%;
-	height: 100%;
-	z-index: 1000;
-	
-	.popup-mask {
-		position: absolute;
-		top: 0;
-		left: 0;
-		width: 100%;
-		height: 100%;
-		background-color: rgba(0, 0, 0, 0.5);
-	}
-	
-	.sign-popup-content {
-		position: absolute;
-		bottom: 0;
-		left: 0;
-		width: 100%;
-		background: #FFFFFF;
-		border-radius: 24rpx 24rpx 0 0;
-		padding: 30rpx;
-		padding-bottom: 50rpx;
-		
-		.sign-popup-header {
-			position: relative;
-			padding-bottom: 30rpx;
-			
-			.sign-popup-title {
-				font-size: 36rpx;
-				color: #333333;
-				font-weight: bold;
-				margin-bottom: 30rpx;
-				display: block;
-			}
-			
-			.sign-notify-switch {
-				display: flex;
-				flex-direction: row;
-				align-items: center;
-				position: absolute;
-				top: 0;
-				right: 0;
-				
-				.sign-notify-text {
-					font-size: 24rpx;
-					color: #666666;
-					margin-right: 10rpx;
-				}
-				
-				.sign-switch {
-					transform: scale(0.7);
-				}
-			}
-			
-			.sign-days-tag {
-				display: inline-block;
-				padding: 6rpx 20rpx;
-				background-color: #FFD54F;
-				border-radius: 24rpx;
-				font-size: 24rpx;
-				color: #333;
-				font-weight: bold;
-			}
-		}
-		
-		.vip-area {
-			display: flex;
-			flex-direction: row;
-			justify-content: space-between;
-			align-items: center;
-			background-color: #F5F5F5;
-			border-radius: 12rpx;
-			padding: 20rpx;
-			margin-bottom: 30rpx;
-			
-			.vip-left {
-				.vip-text {
-					font-size: 26rpx;
-					color: #333333;
-				}
-			}
-			
-			.vip-right {
-				.vip-offer {
-					font-size: 24rpx;
-					color: #9C27B0;
-				}
-			}
-		}
-		
-		.sign-grid {
-			display: flex;
-			flex-direction: row;
-			flex-wrap: wrap;
-			margin: 0 -10rpx;
-			margin-bottom: 40rpx;
-			
-			.sign-grid-item {
-				width: calc(33.33% - 20rpx);
-				background-color: #F5F5F5;
-				border-radius: 12rpx;
-				padding: 20rpx;
-				margin: 10rpx;
-				position: relative;
-				height: 180rpx;
-				display: flex;
-				flex-direction: column;
-				
-				.sign-day-num {
-					font-size: 24rpx;
-					color: #666666;
-					margin-bottom: 10rpx;
-				}
-				
-				.sign-item-img {
-					width: 70rpx;
-					height: 70rpx;
-					background-color: #DDDDDD;
-					border-radius: 50%;
-					margin: 10rpx auto;
-				}
-				
-				.sign-item-name {
-					font-size: 24rpx;
-					color: #333333;
-					text-align: center;
-					margin-top: auto;
-				}
-				
-				.sign-vip-tag {
-					position: absolute;
-					top: 20rpx;
-					right: 20rpx;
-					padding: 4rpx 10rpx;
-					background-color: #9C27B0;
-					border-radius: 10rpx;
-					font-size: 20rpx;
-					color: #FFFFFF;
-				}
-				
-				.sign-received-mask {
-					position: absolute;
-					top: 0;
-					left: 0;
-					width: 100%;
-					height: 100%;
-					background-color: rgba(0, 0, 0, 0.5);
-					border-radius: 12rpx;
-					display: flex;
-					justify-content: center;
-					align-items: center;
-					
-					.received-text {
-						font-size: 28rpx;
-						color: #FFFFFF;
-						font-weight: bold;
-					}
-				}
-			}
-		}
-		
-		.sign-btn-large {
-			width: 100%;
-			height: 90rpx;
-			background-color: #9C27B0;
-			border-radius: 45rpx;
-			display: flex;
-			justify-content: center;
-			align-items: center;
-			font-size: 32rpx;
-			color: #FFFFFF;
-			font-weight: bold;
-
-			&.sign-btn-disabled {
-				background-color: #CCCCCC;
-				color: #999999;
-			}
-		}
-	}
-}
+  position: fixed;
+  bottom: 0;
+  left: 0;
+  width: 100%;
+  height: 100%;
+  z-index: 1000;
+
+  .popup-mask {
+    position: absolute;
+    top: 0;
+    left: 0;
+    width: 100%;
+    height: 100%;
+    background-color: rgba(0, 0, 0, 0.5);
+  }
+
+  .sign-popup-content {
+    position: absolute;
+    bottom: 0;
+    left: 0;
+    width: 100%;
+    background: #ffffff;
+    border-radius: 24rpx 24rpx 0 0;
+    padding: 30rpx;
+    padding-bottom: 50rpx;
+
+    .sign-popup-header {
+      position: relative;
+      padding-bottom: 30rpx;
+
+      .sign-popup-title {
+        font-size: 36rpx;
+        color: #333333;
+        font-weight: bold;
+        margin-bottom: 30rpx;
+        display: block;
+      }
+
+      .sign-notify-switch {
+        display: flex;
+        flex-direction: row;
+        align-items: center;
+        position: absolute;
+        top: 0;
+        right: 0;
+
+        .sign-notify-text {
+          font-size: 24rpx;
+          color: #666666;
+          margin-right: 10rpx;
+        }
+
+        .sign-switch {
+          transform: scale(0.7);
+        }
+      }
+
+      .sign-days-tag {
+        display: inline-block;
+        padding: 6rpx 20rpx;
+        background-color: #ffd54f;
+        border-radius: 24rpx;
+        font-size: 24rpx;
+        color: #333;
+        font-weight: bold;
+      }
+    }
+
+    .vip-area {
+      display: flex;
+      flex-direction: row;
+      justify-content: space-between;
+      align-items: center;
+      background-color: #f5f5f5;
+      border-radius: 12rpx;
+      padding: 20rpx;
+      margin-bottom: 30rpx;
+
+      .vip-left {
+        .vip-text {
+          font-size: 26rpx;
+          color: #333333;
+        }
+      }
+
+      .vip-right {
+        .vip-offer {
+          font-size: 24rpx;
+          color: #9c27b0;
+        }
+      }
+    }
+
+    .sign-grid {
+      display: flex;
+      flex-direction: row;
+      flex-wrap: wrap;
+      margin: 0 -10rpx;
+      margin-bottom: 40rpx;
+
+      .sign-grid-item {
+        width: calc(33.33% - 20rpx);
+        background-color: #f5f5f5;
+        border-radius: 12rpx;
+        padding: 20rpx;
+        margin: 10rpx;
+        position: relative;
+        height: 180rpx;
+        display: flex;
+        flex-direction: column;
+
+        .sign-day-num {
+          font-size: 24rpx;
+          color: #666666;
+          margin-bottom: 10rpx;
+        }
+
+        .sign-item-img {
+          width: 70rpx;
+          height: 70rpx;
+          background-color: #dddddd;
+          border-radius: 50%;
+          margin: 10rpx auto;
+        }
+
+        .sign-item-name {
+          font-size: 24rpx;
+          color: #333333;
+          text-align: center;
+          margin-top: auto;
+        }
+
+        .sign-vip-tag {
+          position: absolute;
+          top: 20rpx;
+          right: 20rpx;
+          padding: 4rpx 10rpx;
+          background-color: #9c27b0;
+          border-radius: 10rpx;
+          font-size: 20rpx;
+          color: #ffffff;
+        }
+
+        .sign-received-mask {
+          position: absolute;
+          top: 0;
+          left: 0;
+          width: 100%;
+          height: 100%;
+          background-color: rgba(0, 0, 0, 0.5);
+          border-radius: 12rpx;
+          display: flex;
+          justify-content: center;
+          align-items: center;
+
+          .received-text {
+            font-size: 28rpx;
+            color: #ffffff;
+            font-weight: bold;
+          }
+        }
+      }
+    }
+
+    .sign-btn-large {
+      width: 100%;
+      height: 90rpx;
+      background-color: #9c27b0;
+      border-radius: 45rpx;
+      display: flex;
+      justify-content: center;
+      align-items: center;
+      font-size: 32rpx;
+      color: #ffffff;
+      font-weight: bold;
+
+      &.sign-btn-disabled {
+        background-color: #cccccc;
+        color: #999999;
+      }
+    }
+  }
+}

+ 149 - 99
pages/my/job.vue

@@ -1,152 +1,187 @@
 <template>
 	<view class="page">
 		<!-- 顶部黄色背景 -->
-		<view class="top-bg"></view>
-
+		<PageHeader title="" class="PageHeader">
+			<template slot="center">
+				任务中心
+			</template>
+		</PageHeader>
+		<view class="occupyHigh"></view>
 		<!-- 内容区域 -->
 		<view class="content-area">
-			<!-- 彩豆余额展示区 -->
-			<view class="bean-balance">
+			<!-- 星源余额展示区 -->
+			<view class="person-info">
+				<view class="person-info-left">
+					<CircleAvatar class="avator" v-if="myinfo.avator" :src="myinfo.avator"></CircleAvatar>
+					<view class="title-area">
+						<text class="my-bean-title">我的星源</text>
+						<view class="bean-number">
+							<image src="@/static/me/job/wd_icon_xingyuan.png"></image> {{ num_gmd }}
+						</view>
+					</view>
+				</view>
+				<view class="exchange-btn" @click="openNicknamePopUpWindow()">兑换</view>
+			</view>
+			<!-- 星源余额展示区 -->
+			<!-- <view class="bean-balance"  >
 				<view class="balance-header">
 					<view class="title-area">
 						<view class="yellow-dot"></view>
-						<text class="my-bean-title">我的彩豆</text>
+						<text class="my-bean-title">我的星源</text>
 					</view>
 					<view class="exchange-btn" @click="showExchangePopup">兑换</view>
 				</view>
 				<view class="bean-number">{{ num_gmd }}</view>
+			</view> -->
+			<view class="starWishCheckIn">
+				<image src="@/static/me/job/rw_wenzi_01.png" class="title"></image>
+				<view class="card purple-card">
+					<view class="card-title">初次见面礼</view>
+					<view class="card-desc">完善个人资料达到{{ newer_bfb }}</view>
+					<view class="card-btn card-reward ">+100星源</view>
+				</view>
+				<view class="card yellow-card">
+					<view class="card-title">每日签到</view>
+					<view class="card-desc">签到领奖励,快来签到吧!</view> 
+					<view class="card-btn sign-btn" @click="opencheckInPopUpWindow()">立即签到</view>
+				</view>
 			</view>
-
 			<!-- 星愿打卡区域 -->
-			<view class="sign-cards">
+			<!-- <view class="sign-cards" v-if="false">
 				<view class="card purple-card">
 					<view class="card-title">初次见面礼</view>
 					<view class="card-desc">完善个人资料可得</view>
-					<view class="card-reward">奖励+100彩豆</view>
+					<view class="card-reward">奖励+100星源</view>
 					<view class="card-progress">{{ newer_bfb }}</view>
 				</view>
 				<view class="card yellow-card">
 					<view class="card-title">每日签到</view>
 					<view class="card-desc">连续签到奖励更多</view>
 					<view class="sign-btn" @click="showSignPopup">立即签到</view>
+					<view class="sign-btn" @click="opencheckInPopUpWindow()">立即签到</view>
 				</view>
-			</view>
+			</view> -->
+
 
 			<!-- 每日任务列表 -->
-			<view class="task-list">
+			<view class="task-list-box">
 				<view class="task-header">
-					<text class="task-title">每日任务</text>
-					<text class="task-subtitle">获取免费彩豆</text>
+					<image src="@/static/me/job/rw_wenzi_02.png"></image>
+					<text class="task-subtitle">(获取免费星源)</text>
 				</view>
 
 				<!-- 任务项列表 -->
+				<view class="task-item" v-for="(item, index) in taskList" :key="index">
+					<view class="task-info">
+						<image :src="item.image"></image>
+						<view>
+							<view class="task-name one-omit">{{ item.name }}</view>
+							<view class="task-desc one-omit">{{ item.content }}</view>
+						</view>
+					</view>
+					<view class="task-reward">
+						<image src="@/static/me/job/wd_icon_xingyuan.png"></image>+{{ item.num }}
+					</view>
+					<view class="task-btn" :class="{ 'task-completed': item.status == 9 }" @click="claimReward(index)">
+						{{ item.status == 9 ? "已领取" : "领取" }}
+					</view>
+				</view>
+			</view>
+
+
+			<!-- 每日任务列表 
+			<view class="task-list">
+				<view class="task-header">
+					<text class="task-title">每日任务</text>
+					<text class="task-subtitle">获取免费星源</text>
+				</view> 
 				<view class="task-item" v-for="(item, index) in taskList" :key="index">
 					<view class="task-info">
 						<view class="task-name">{{ item.name }}</view>
 						<view class="task-desc">{{ item.content }}</view>
 					</view>
-					<view class="task-reward">+{{ item.num }}彩豆</view>
+					<view class="task-reward">+{{ item.num }}星源</view>
 					<view class="task-btn" :class="{ 'task-completed': item.status == 9 }" @click="claimReward(index)">
 						{{ item.status == 9 ? "已领取" : "领取" }}
 					</view>
 				</view>
-			</view>
+			</view>-->
 		</view>
 
-		<!-- 彩豆兑换弹窗 -->
+		<!-- 星源兑换弹窗 -->
 		<view class="exchange-popup" v-if="showExchange">
 			<view class="popup-mask" @click="hideExchangePopup"></view>
 			<view class="popup-content">
 				<!-- 弹窗顶部信息栏 -->
 				<view class="popup-header">
 					<text class="available-balance">可用M币: 14500</text>
-					<text class="exchange-title">兑换彩豆</text>
+					<text class="exchange-title">兑换星源</text>
 				</view>
 
 				<!-- 兑换区域主体 -->
 				<view class="exchange-area">
 					<view class="exchange-title-area">
-						<text class="exchange-main-title">M币兑换彩豆数</text>
-						<text class="exchange-subtitle">兑换彩豆数必须是10的倍数</text>
+						<text class="exchange-main-title">M币兑换星源数</text>
+						<text class="exchange-subtitle">兑换星源数必须是10的倍数</text>
 					</view>
 
 					<view class="input-area">
 						<view class="bean-icon"></view>
-						<input type="number" class="exchange-input" placeholder="请输入兑换彩豆数量" v-model="exchangeAmount" />
+						<input type="number" class="exchange-input" placeholder="请输入兑换星源数量" v-model="exchangeAmount" />
 					</view>
 
 					<!-- 操作按钮 -->
 					<view class="action-area">
-						<view class="exchange-btn-large" @click="confirmExchange">立即兑换彩豆</view>
-						<text class="tips-text">彩豆可用于创作(生成图片、音乐等AI创作功能)</text>
+						<view class="exchange-btn-large" @click="confirmExchange">立即兑换星源</view>
+						<text class="tips-text">星源可用于创作(生成图片、音乐等AI创作功能)</text>
 					</view>
 				</view>
 			</view>
 		</view>
 
-		<!-- 签到弹窗 -->
-		<view class="sign-popup" v-if="showSign">
-			<view class="popup-mask" @click="hideSignPopup"></view>
-			<view class="sign-popup-content">
-				<!-- 弹窗顶部 -->
-				<view class="sign-popup-header">
-					<text class="sign-popup-title">每日签到领好礼</text>
-					<view class="sign-notify-switch">
-						<text class="sign-notify-text">签到消息提醒</text>
-						<switch class="sign-switch" color="#9C27B0" :checked="signNotify" @change="toggleSignNotify" />
-					</view>
-					<view class="sign-days-tag">已签到{{ signInfo.signDay }}天</view>
-				</view>
+	 
+		<checkInPopUpWindow :checkInDays="6" :signInfo="signInfo" :signNotify="signNotify"
+			@toggleSignNotify="toggleSignNotify" ref="checkInPopUpWindow" @confirmSign="confirmSign()">
+		</checkInPopUpWindow>
+
+		<!-- 提示框 -->
+		<DialogBox ref="DialogBox"></DialogBox>
+		<!-- 兑换m币弹窗-->
+		<view class="NicknamePopUpWindowBox">
 
-				<!-- VIP特权区域 -->
-				<view class="vip-area">
-					<view class="vip-left">
-						<text class="vip-text">VIP十通会员,签到享专属好礼</text>
-					</view>
-					<view class="vip-right">
-						<text class="vip-offer">限时优惠 ></text>
-					</view>
-				</view>
 
-				<!-- 签到奖励网格布局 -->
-				<view class="sign-grid">
-					<view class="sign-grid-item" v-for="(item, index) in signRewards" :key="index" :class="{
-            'sign-received':
-              index < signInfo.signDay ||
-              (index === signInfo.signDay - 1 && signInfo.isSigned),
-          }">
-						<view class="sign-day-num">{{ item.dayNum }}</view>
-						<view class="sign-item-img"></view>
-						<view class="sign-item-name">{{ item.reward }}</view>
-						<view class="sign-vip-tag" v-if="item.isVip">VIP</view>
-						<view class="sign-received-mask" v-if="
-              index < signInfo.signDay ||
-              (index === signInfo.signDay - 1 && signInfo.isSigned)
-            ">
-							<text class="received-text">已领取</text>
+			<NicknamePopup title="" subtitle="" class="NicknamePopUpWindow" ref="NicknamePopUpWindow">
+				<template slot="heard">
+					<view class="nickname-heard">
+						<view class="available-mCoin">可用M币:{{myinfo.num_gmm}}</view>
+						<view class="exchange-title">兑换星源</view>
+					</view>
+				</template>
+				<template slot="content">
+					<view class="content-box">
+						<view class="prompt">
+							M币兑换星源数<text>(兑换星源数必须是10的倍数)</text>
+						</view>
+						<view class="input-box">
+							<image src="@/static/me/job/wd_icon_xingyuan.png"></image>
+							<uv-input type="number" class="input" placeholder="请输入昵称" border="none"
+								v-model="exchangeAmount" maxlength="20"></uv-input>
 						</view>
+						<view class="btn-box" @click="confirmExchange">立即兑换星源</view>
 					</view>
-				</view>
-
-				<!-- 底部签到按钮 -->
-				<view class="sign-btn-large" :class="{ 'sign-btn-disabled': signInfo.isSigned }" @click="confirmSign">
-					{{ signInfo.isSigned ? "今日已签到" : "签到领取奖励" }}
-				</view>
-			</view>
+				</template>
+			</NicknamePopup>
 		</view>
-
-		<checkInPopUpWindow ref="checkInPopUpWindow"></checkInPopUpWindow>
-
-		<!-- 提示框 -->
-		<DialogBox ref="DialogBox"></DialogBox>
 	</view>
 </template>
 
 <script>
 	import checkInPopUpWindow from "@/components/checkIn-popUp-window/checkIn-popUp-window.vue";
+
 	export default {
 		components: {
-			checkInPopUpWindow
+			checkInPopUpWindow,
+
 		},
 		data() {
 			return {
@@ -158,42 +193,41 @@
 				beanBalance: 2560,
 				showExchange: false,
 				exchangeAmount: "",
-				mCoinBalance: 14500,
-				showSign: false,
+				mCoinBalance: 0, 
 				signNotify: true,
 				signRewards: [{
 						dayNum: "01",
-						reward: "10彩豆",
+						reward: "10星源",
 						isVip: false,
 					},
 					{
 						dayNum: "02",
-						reward: "15彩豆",
+						reward: "15星源",
 						isVip: false,
 					},
 					{
 						dayNum: "03",
-						reward: "20彩豆",
+						reward: "20星源",
 						isVip: false,
 					},
 					{
 						dayNum: "04",
-						reward: "25彩豆",
+						reward: "25星源",
 						isVip: false,
 					},
 					{
 						dayNum: "05",
-						reward: "30彩豆",
+						reward: "30星源",
 						isVip: false,
 					},
 					{
 						dayNum: "06",
-						reward: "35彩豆",
+						reward: "35星源",
 						isVip: true,
 					},
 					{
 						dayNum: "07",
-						reward: "50彩豆",
+						reward: "50星源",
 						isVip: true,
 					},
 				],
@@ -208,12 +242,10 @@
 		onLoad() {
 			this.loadData();
 			this.getSignInfo();
+
+
 		},
-		onShow() {
-			setTimeout(() => {
-				this.opencheckInPopUpWindow()
-			}, 100)
-		},
+		onShow() {},
 		methods: {
 			opencheckInPopUpWindow() {
 
@@ -222,6 +254,13 @@
 			closecheckInPopUpWindow() {
 				this.$refs.checkInPopUpWindow.close();
 			},
+			openNicknamePopUpWindow() {
+
+				this.$refs.NicknamePopUpWindow.open();
+			},
+			closeNicknamePopUpWindow() {
+				this.$refs.NicknamePopUpWindow.close();
+			},
 			onBack() {},
 
 			loadData() {
@@ -274,6 +313,24 @@
 						console.log("获取签到信息失败:", e);
 					},
 				});
+				uni.request({
+					url: this.$apiHost + "/User/getinfo",
+					data: {
+						uuid: getApp().globalData.uuid,
+						skey: getApp().globalData.skey,
+					},
+					header: {
+						"content-type": "application/json",
+						sign: getApp().globalData.headerSign,
+					},
+					success: (res) => {
+						this.myinfo = res.data;
+					},
+					complete: (com) => {},
+					fail: (e) => {
+						console.log("----e:", e);
+					},
+				});
 			},
 
 			// 显示兑换弹窗
@@ -286,19 +343,11 @@
 				this.showExchange = false;
 			},
 
-			// 显示签到弹窗
-			showSignPopup() {
-				this.showSign = true;
-			},
-
-			// 隐藏签到弹窗
-			hideSignPopup() {
-				this.showSign = false;
-			},
+			 
 
 			// 切换签到通知开关
-			toggleSignNotify(e) {
-				this.signNotify = e.detail.value;
+			toggleSignNotify(falg) {
+				this.signNotify = falg;
 			},
 
 			// 确认签到
@@ -329,7 +378,7 @@
 							});
 							// 更新签到信息
 							this.getSignInfo();
-							// 更新彩豆数量
+							// 更新星源数量
 							this.loadData();
 						} else {
 							uni.showToast({
@@ -402,6 +451,7 @@
 					},
 					complete: (com) => {
 						// uni.hideLoading();
+						this.closeNicknamePopUpWindow()
 					},
 					fail: (e) => {
 						console.log("----e:", e);
@@ -410,7 +460,7 @@
 
 				// // 模拟兑换处理
 				// uni.showToast({
-				// 	title: "兑换成功,获得" + amount + "彩豆",
+				// 	title: "兑换成功,获得" + amount + "星源",
 				// 	icon: 'none'
 				// });
 

BIN
static/me/job/rw_bg_jiangli06_dianji.png


BIN
static/me/job/rw_bg_jiangli06_moren.png


BIN
static/me/job/rw_bg_jiangli07_dianji.png


BIN
static/me/job/rw_icon_01.png


BIN
static/me/job/rw_icon_02.png


BIN
static/me/job/rw_icon_03.png


BIN
static/me/job/rw_icon_04.png


BIN
static/me/job/rw_icon_05.png


BIN
static/me/job/rw_icon_xiangqing.png


BIN
static/me/job/rw_wenzi_02.png


BIN
static/me/job/wd_icon_xingyuan(2).png


BIN
static/me/job/wd_icon_xingyuan(3).png


BIN
static/me/job/wd_icon_xingyuan(6).png


BIN
static/me/job/wd_icon_xingyuan(7).png


BIN
static/me/job/wd_icon_xingyuan(8).png


BIN
static/me/job/wd_icon_xingyuan(9).png


+ 4 - 4
static/me/job/修改.bat

@@ -1,11 +1,11 @@
-@echo off
+@3xecho off
 setlocal enabledelayedexpansion
 
 rem Loop through all files in the current directory
-for %%f in (*3x*) do (
-    rem Get the new filename by removing the '3x'
+for %%f in (*@3x*) do (
+    rem Get the new filename by removing the '@3x'
     set "newName=%%f"
-    set "newName=!newName:3x=!"
+    set "newName=!newName:@3x=!"
     
     rem Rename the file
     ren "%%f" "!newName!"

+ 20 - 0
static/me/job/修改q.bat

@@ -0,0 +1,20 @@
+@echo off
+setlocal enabledelayedexpansion
+
+rem 设置目标目录
+set "target_dir=d:\workProject\MoeNovaClient\components\checkIn-popUp-window"
+
+rem 遍历目标目录中的所有文件
+for %%f in ("%target_dir%\*") do (
+    set "filename=%%~nxf"
+    set "newfilename=!filename:(=!"
+    set "newfilename=!newfilename:)=!"
+
+    rem 如果文件名有变化,则重命名文件
+    if "!filename!" neq "!newfilename!" (
+        ren "%%f" "!newfilename!"
+        echo Renamed "%%f" to "!newfilename!"
+    )
+)
+
+endlocal

+ 14 - 0
uni_modules/uv-switch/changelog.md

@@ -0,0 +1,14 @@
+## 1.0.5(2023-09-21)
+1. 优化细节
+## 1.0.4(2023-08-23)
+1. 取消value传值,只能使用v-model传值,避免异步操作不生效的BUG
+## 1.0.3(2023-07-13)
+1. 修复  uv-switch设置value属性不生效的BUG
+## 1.0.2(2023-06-19)
+1. size属性兼容和单位一起使用
+
+## 1.0.1(2023-05-16)
+1. 优化组件依赖,修改后无需全局引入,组件导入即可使用
+2. 优化部分功能
+## 1.0.0(2023-05-10)
+uv-switch 开关选择器

+ 58 - 0
uni_modules/uv-switch/components/uv-switch/props.js

@@ -0,0 +1,58 @@
+export default {
+	props: {
+		value: {
+			type: [Boolean, String, Number],
+			default: false
+		},
+		modelValue: {
+			type: [Boolean, String, Number],
+			default: false
+		},
+		// 是否为加载中状态
+		loading: {
+			type: Boolean,
+			default: false
+		},
+		// 是否为禁用装填
+		disabled: {
+			type: Boolean,
+			default: false
+		},
+		// 开关尺寸,单位px
+		size: {
+			type: [String, Number],
+			default: 25
+		},
+		// 打开时的背景颜色
+		activeColor: {
+			type: String,
+			default: '#2979ff'
+		},
+		// 关闭时的背景颜色
+		inactiveColor: {
+			type: String,
+			default: '#fff'
+		},
+		// switch打开时的值
+		activeValue: {
+			type: [String, Number, Boolean],
+			default: true
+		},
+		// switch关闭时的值
+		inactiveValue: {
+			type: [String, Number, Boolean],
+			default: false
+		},
+		// 是否开启异步变更,开启后需要手动控制输入值
+		asyncChange: {
+			type: Boolean,
+			default: false
+		},
+		// 圆点与外边框的距离
+		space: {
+			type: [String, Number],
+			default: 0
+		},
+		...uni.$uv?.props?.switch
+	}
+}

+ 192 - 0
uni_modules/uv-switch/components/uv-switch/uv-switch.vue

@@ -0,0 +1,192 @@
+<template>
+	<view
+	  class="uv-switch"
+	  :class="[disabled && 'uv-switch--disabled']"
+	  :style="[switchStyle, $uv.addStyle(customStyle)]"
+	  @tap="clickHandler"
+	>
+		<view
+		  class="uv-switch__bg"
+		  :style="[bgStyle]"
+		>
+		</view>
+		<view
+		  class="uv-switch__node"
+		  :class="[innerValue && 'uv-switch__node--on']"
+		  :style="[nodeStyle]"
+		  ref="uv-switch__node"
+		>
+			<uv-loading-icon
+			  :show="loading"
+			  mode="circle"
+			  timingFunction='linear'
+			  :color="innerValue ? activeColor : '#AAABAD'"
+			  :size="size * 0.6"
+			/>
+		</view>
+	</view>
+</template>
+<script>
+	import mpMixin from '@/uni_modules/uv-ui-tools/libs/mixin/mpMixin.js'
+	import mixin from '@/uni_modules/uv-ui-tools/libs/mixin/mixin.js'
+	import props from './props.js';
+	/**
+	 * switch 开关选择器
+	 * @description 选择开关一般用于只有两个选择,且只能选其一的场景。
+	 * @tutorial https://www.uvui.cn/components/switch.html
+	 * @property {Boolean}						loading			是否处于加载中(默认 false )
+	 * @property {Boolean}						disabled		是否禁用(默认 false )
+	 * @property {String | Number}				size			开关尺寸,单位px (默认 25 )
+	 * @property {String}						activeColor		打开时的背景色 (默认 '#2979ff' )
+	 * @property {String} 						inactiveColor	关闭时的背景色 (默认 '#ffffff' )
+	 * @property {Boolean | String | Number}	value			通过v-model双向绑定的值 (默认 false )
+	 * @property {Boolean | String | Number}	activeValue		打开选择器时通过change事件发出的值 (默认 true )
+	 * @property {Boolean | String | Number}	inactiveValue	关闭选择器时通过change事件发出的值 (默认 false )
+	 * @property {Boolean}						asyncChange		是否开启异步变更,开启后需要手动控制输入值 (默认 false )
+	 * @property {String | Number}				space			圆点与外边框的距离 (默认 0 )
+	 * @property {Object}						customStyle		定义需要用到的外部样式
+	 *
+	 * @event {Function} change 在switch打开或关闭时触发
+	 * @example <uv-switch v-model="checked" active-color="red" inactive-color="#eee"></uv-switch>
+	 */
+	export default {
+		name: "uv-switch",
+		mixins: [mpMixin, mixin, props],
+		data() {
+			return {
+				bgColor: '#ffffff',
+				innerValue: false
+			}
+		},
+		watch: {
+			// #ifdef VUE2
+			value: {
+				immediate: true,
+				handler(newVal) {
+					if (newVal !== this.inactiveValue && newVal !== this.activeValue) {
+						return this.$uv.error('v-model绑定的值必须为inactiveValue、activeValue二者之一')
+					}
+					this.innerValue = newVal;
+				}
+			},
+			// #endif
+			// #ifndef VUE2
+			modelValue: {
+				immediate: true,
+				handler(newVal) {
+					if (newVal !== this.inactiveValue && newVal !== this.activeValue) {
+						return this.$uv.error('v-model绑定的值必须为inactiveValue、activeValue二者之一')
+					}
+					this.innerValue = newVal;
+				}
+			}
+			// #endif
+		},
+		created() {
+			this.innerValue = this.value || this.modelValue;
+		},
+		computed: {
+			isActive() {
+				return this.innerValue === this.activeValue;
+			},
+			switchStyle() {
+				let style = {}
+				// 这里需要加2,是为了腾出边框的距离,否则圆点node会和外边框紧贴在一起
+				style.width = this.$uv.addUnit(this.$uv.getPx(this.size) * 2 + 2)
+				style.height = this.$uv.addUnit(this.$uv.getPx(this.size) + 2)
+				// 如果自定义了“非激活”演示,name边框颜色设置为透明(跟非激活颜色一致)
+				// 这里不能简单的设置为非激活的颜色,否则打开状态时,会有边框,所以需要透明
+				if (this.customInactiveColor) {
+					style.borderColor = 'rgba(0, 0, 0, 0)'
+				}
+				style.backgroundColor = this.isActive ? this.activeColor : this.inactiveColor
+				return style;
+			},
+			nodeStyle() {
+				let style = {}
+				// 如果自定义非激活颜色,将node圆点的尺寸减少两个像素,让其与外边框距离更大一点
+				style.width = this.$uv.addUnit(this.$uv.getPx(this.size) - this.space)
+				style.height = this.$uv.addUnit(this.$uv.getPx(this.size) - this.space)
+				const translateX = this.isActive ? this.$uv.addUnit(this.space) : this.$uv.addUnit(this.$uv.getPx(this.size));
+				style.transform = `translateX(-${translateX})`
+				return style
+			},
+			bgStyle() {
+				let style = {}
+				// 这里配置一个多余的元素在HTML中,是为了让switch切换时,有更良好的背景色扩充体验(见实际效果)
+				style.width = this.$uv.addUnit(this.$uv.getPx(this.size) * 2 - this.$uv.getPx(this.size) / 2)
+				style.height = this.$uv.addUnit(this.$uv.getPx(this.size))
+				style.backgroundColor = this.inactiveColor
+				// 打开时,让此元素收缩,否则反之
+				style.transform = `scale(${this.isActive ? 0 : 1})`
+				return style
+			},
+			customInactiveColor() {
+				// 之所以需要判断是否自定义了“非激活”颜色,是为了让node圆点离外边框更宽一点的距离
+				return this.inactiveColor !== '#fff' && this.inactiveColor !== '#ffffff'
+			}
+		},
+		methods: {
+			clickHandler() {
+				if (!this.disabled && !this.loading) {
+					const oldValue = this.isActive ? this.inactiveValue : this.activeValue
+					if (!this.asyncChange) {
+						this.$emit('input', oldValue)
+						this.$emit('update:modelValue', oldValue)
+					}
+					// 放到下一个生命周期,因为双向绑定的value修改父组件状态需要时间,且是异步的
+					this.$nextTick(() => {
+						this.$emit('change', oldValue)
+					})
+				}
+			}
+		}
+	};
+</script>
+
+<style lang="scss" scoped>
+	@import '@/uni_modules/uv-ui-tools/libs/css/components.scss';
+	.uv-switch {
+		@include flex(row);
+		/* #ifndef APP-NVUE */
+		box-sizing: border-box;
+		/* #endif */
+		position: relative;
+		background-color: #fff;
+		border-width: 1px;
+		border-radius: 100px;
+		transition: background-color 0.4s;
+		border-color: rgba(0, 0, 0, 0.12);
+		border-style: solid;
+		justify-content: flex-end;
+		align-items: center;
+		// 由于weex为阿里逗着玩的KPI项目,导致bug奇多,这必须要写这一行,
+		// 否则在iOS上,点击页面任意地方,都会触发switch的点击事件
+		overflow: hidden;
+		&__node {
+			@include flex(row);
+			align-items: center;
+			justify-content: center;
+			border-radius: 100px;
+			background-color: #fff;
+			border-radius: 100px;
+			box-shadow: 1px 1px 1px 0 rgba(0, 0, 0, 0.25);
+			transition-property: transform;
+			transition-duration: 0.4s;
+			transition-timing-function: cubic-bezier(0.3, 1.05, 0.4, 1.05);
+		}
+		&__bg {
+			position: absolute;
+			border-radius: 100px;
+			background-color: #FFFFFF;
+			transition-property: transform;
+			transition-duration: 0.4s;
+			border-top-left-radius: 0;
+			border-bottom-left-radius: 0;
+			transition-timing-function: ease;
+		}
+		&--disabled {
+			opacity: 0.6;
+		}
+	}
+</style>

+ 88 - 0
uni_modules/uv-switch/package.json

@@ -0,0 +1,88 @@
+{
+  "id": "uv-switch",
+  "displayName": "uv-switch 开关选择器 全面兼容vue3+2、app、h5、小程序等多端",
+  "version": "1.0.5",
+  "description": "选择开关用于在打开和关闭状态之间进行切换,支持异步操作。",
+  "keywords": [
+    "uv-switch",
+    "uvui",
+    "uv-ui",
+    "switch",
+    "开关选择器"
+],
+  "repository": "",
+  "engines": {
+    "HBuilderX": "^3.1.0"
+  },
+  "dcloudext": {
+    "type": "component-vue",
+    "sale": {
+      "regular": {
+        "price": "0.00"
+      },
+      "sourcecode": {
+        "price": "0.00"
+      }
+    },
+    "contact": {
+      "qq": ""
+    },
+    "declaration": {
+    	"ads": "无",
+    	"data": "插件不采集任何数据",
+    	"permissions": "无"
+    },
+    "npmurl": ""
+  },
+  "uni_modules": {
+    "dependencies": [
+			"uv-ui-tools",
+			"uv-loading-icon"
+		],
+    "encrypt": [],
+    "platforms": {
+			"cloud": {
+				"tcb": "y",
+				"aliyun": "y"
+			},
+			"client": {
+				"Vue": {
+					"vue2": "y",
+					"vue3": "y"
+				},
+				"App": {
+					"app-vue": "y",
+					"app-nvue": "y"
+				},
+				"H5-mobile": {
+					"Safari": "y",
+					"Android Browser": "y",
+					"微信浏览器(Android)": "y",
+					"QQ浏览器(Android)": "y"
+				},
+				"H5-pc": {
+					"Chrome": "y",
+					"IE": "y",
+					"Edge": "y",
+					"Firefox": "y",
+					"Safari": "y"
+				},
+				"小程序": {
+					"微信": "y",
+					"阿里": "y",
+					"百度": "y",
+					"字节跳动": "y",
+					"QQ": "y",
+					"钉钉": "u",
+					"快手": "u",
+					"飞书": "u",
+					"京东": "u"
+				},
+				"快应用": {
+					"华为": "u",
+					"联盟": "u"
+				}
+			}
+		}
+  }
+}

+ 19 - 0
uni_modules/uv-switch/readme.md

@@ -0,0 +1,19 @@
+## Switch 开关选择器
+
+> **组件名:uv-switch**
+
+选择开关用于在打开和关闭状态之间进行切换,支持异步操作。
+
+# <a href="https://www.uvui.cn/components/switch.html" target="_blank">查看文档</a>
+
+## [下载完整示例项目](https://ext.dcloud.net.cn/plugin?name=uv-ui) <small>(请不要 下载插件ZIP)</small>
+
+### [更多插件,请关注uv-ui组件库](https://ext.dcloud.net.cn/plugin?name=uv-ui)
+
+<a href="https://ext.dcloud.net.cn/plugin?name=uv-ui" target="_blank">
+
+![image](https://mp-a667b617-c5f1-4a2d-9a54-683a67cff588.cdn.bspapp.com/uv-ui/banner.png)
+
+</a>
+
+#### 如使用过程中有任何问题反馈,或者您对uv-ui有一些好的建议,欢迎加入uv-ui官方交流群:<a href="https://www.uvui.cn/components/addQQGroup.html" target="_blank">官方QQ群</a>