YH_0525 пре 1 месец
родитељ
комит
ca843d20d9

+ 229 - 0
LiangZhiYUMao/pages/matchmaker-workbench/account-settings.vue

@@ -0,0 +1,229 @@
+<template>
+  <view class="account-settings" :class="{ 'dark-mode': darkMode }">
+    <!-- 顶部导航栏 -->
+    <view class="header">
+      <view class="back-btn" @click="goBack">
+        <text class="back-icon">←</text>
+      </view>
+      <text class="header-title">账户设置</text>
+      <view class="placeholder"></view>
+    </view>
+
+    <scroll-view scroll-y class="content">
+      <!-- 账号安全 -->
+      <view class="group-block">
+        <text class="group-title">账户安全</text>
+        <view class="card">
+          <view class="setting-item" @click="goTo('changePassword')">
+            <view class="item-left">
+              <text class="item-icon shield">🛡️</text>
+              <text class="item-text">修改密码</text>
+            </view>
+            <text class="item-arrow">›</text>
+          </view>
+          <view class="setting-item" @click="goTo('phone')">
+            <view class="item-left">
+              <text class="item-icon phone">📱</text>
+              <text class="item-text">手机号码</text>
+            </view>
+            <view class="item-right">
+              <text class="item-value">{{ phoneNumber }}</text>
+              <text class="item-arrow">›</text>
+            </view>
+          </view>
+        </view>
+      </view>
+
+      <!-- 功能设置 -->
+      <view class="group-block">
+        <text class="group-title">功能设置</text>
+        <view class="card">
+          <view class="setting-item">
+            <view class="item-left">
+              <text class="item-icon bell">🔔</text>
+              <text class="item-text">新消息通知</text>
+            </view>
+            <switch :checked="notifyNewMessage" @change="e => notifyNewMessage = e.detail.value" color="#9C27B0" />
+          </view>
+          <view class="setting-item">
+            <view class="item-left">
+              <text class="item-icon heart">💜</text>
+              <text class="item-text">匹配成功通知</text>
+            </view>
+            <switch :checked="notifyMatchSuccess" @change="e => notifyMatchSuccess = e.detail.value" color="#9C27B0" />
+          </view>
+          <view class="setting-item">
+            <view class="item-left">
+              <text class="item-icon horn">📣</text>
+              <text class="item-text">系统公告通知</text>
+            </view>
+            <switch :checked="notifySystem" @change="e => notifySystem = e.detail.value" color="#9C27B0" />
+          </view>
+        </view>
+      </view>
+
+      <!-- 显示设置 -->
+      <view class="group-block">
+        <text class="group-title">显示设置</text>
+        <view class="card">
+          <view class="setting-item">
+            <view class="item-left">
+              <text class="item-icon moon">🌙</text>
+              <text class="item-text">深色模式</text>
+            </view>
+            <switch :checked="darkMode" @change="onToggleDarkMode" color="#9C27B0" />
+          </view>
+        </view>
+      </view>
+    </scroll-view>
+  </view>
+</template>
+
+<script>
+export default {
+  name: 'matchmaker-account-settings',
+  data() {
+    return {
+      phoneNumber: '138****5678',
+      notifyNewMessage: true,
+      notifyMatchSuccess: true,
+      notifySystem: true,
+      darkMode: false
+    }
+  },
+  onLoad() {
+    // 读取本地存储的深色模式状态
+    const stored = uni.getStorageSync('matchmakerDarkMode')
+    if (stored === true || stored === false) {
+      this.darkMode = stored
+    }
+  },
+  methods: {
+    goBack() {
+      uni.navigateBack()
+    },
+    goTo(type) {
+      // 这里预留具体跳转逻辑
+      uni.showToast({
+        title: '功能开发中',
+        icon: 'none'
+      })
+    },
+    onToggleDarkMode(e) {
+      const value = e.detail.value
+      this.darkMode = value
+      uni.setStorageSync('matchmakerDarkMode', value)
+    }
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+.account-settings {
+  min-height: 100vh;
+  background: #F5F5F5;
+  display: flex;
+  flex-direction: column;
+  color: #333;
+}
+
+.header {
+  display: flex;
+  align-items: center;
+  justify-content: space-between;
+  padding: 25rpx 30rpx;
+  padding-top: calc(25rpx + env(safe-area-inset-top));
+  background: #E9D7F5;
+
+  .back-btn {
+    width: 60rpx;
+    height: 60rpx;
+    display: flex;
+    align-items: center;
+    justify-content: center;
+
+    .back-icon {
+      font-size: 40rpx;
+      color: #333;
+      font-weight: bold;
+    }
+  }
+
+  .header-title {
+    font-size: 36rpx;
+    font-weight: bold;
+    color: #333;
+  }
+
+  .placeholder {
+    width: 60rpx;
+  }
+}
+
+.content {
+  flex: 1;
+  background: #F5F5F5;
+}
+
+.group-block {
+  margin-top: 20rpx;
+
+  .group-title {
+    padding: 30rpx 30rpx 10rpx;
+    font-size: 26rpx;
+    color: #999;
+  }
+
+  .card {
+    margin: 0 20rpx;
+    background: #FFFFFF;
+    border-radius: 20rpx;
+    box-shadow: 0 4rpx 12rpx rgba(0, 0, 0, 0.04);
+    overflow: hidden;
+  }
+}
+
+.setting-item {
+  display: flex;
+  align-items: center;
+  justify-content: space-between;
+  padding: 28rpx 26rpx;
+  border-bottom: 1rpx solid #F5F5F5;
+
+  &:last-child {
+    border-bottom: none;
+  }
+
+  .item-left {
+    display: flex;
+    align-items: center;
+    flex: 1;
+
+    .item-icon {
+      font-size: 34rpx;
+      margin-right: 18rpx;
+    }
+
+    .item-text {
+      font-size: 30rpx;
+      color: #333;
+    }
+  }
+
+  .item-right {
+    display: flex;
+    align-items: center;
+
+    .item-value {
+      font-size: 26rpx;
+      color: #999;
+      margin-right: 10rpx;
+    }
+  }
+
+  .item-arrow {
+    font-size: 34rpx;
+    color: #CCC;
+  }
+}
+</style>

+ 452 - 0
LiangZhiYUMao/pages/matchmaker-workbench/add-resource.vue

@@ -0,0 +1,452 @@
+<template>
+	<view class="add-resource">
+		<!-- 顶部导航栏 -->
+		<view class="header">
+			<view class="back-btn" @click="goBack">
+				<text class="back-icon">‹</text>
+			</view>
+			<text class="header-title">信息录入</text>
+			<view class="header-right">
+				<text class="more-icon">⋯</text>
+				<text class="info-icon">ⓘ</text>
+			</view>
+		</view>
+
+		<scroll-view scroll-y class="content">
+			<!-- 社会属性 -->
+			<view class="section">
+				<view class="section-title">
+					<text class="section-label">社会属性</text>
+				</view>
+
+				<!-- 婚况 -->
+				<view class="form-group">
+					<text class="label">婚况</text>
+					<view class="select-wrapper">
+						<picker @change="onMarriageChange" :value="formData.marriageIndex" :range="marriageOptions">
+							<view class="select-input">
+								<text>{{ formData.marriage || '请选择婚况' }}</text>
+								<text class="arrow">▼</text>
+							</view>
+						</picker>
+					</view>
+				</view>
+
+				<!-- 学历 -->
+				<view class="form-group">
+					<text class="label">学历</text>
+					<view class="select-wrapper">
+						<picker @change="onEducationChange" :value="formData.educationIndex" :range="educationOptions">
+							<view class="select-input">
+								<text>{{ formData.education || '请选择学历' }}</text>
+								<text class="arrow">▼</text>
+							</view>
+						</picker>
+					</view>
+				</view>
+
+				<!-- 年收入 -->
+				<view class="form-group">
+					<text class="label">年收入(万元)</text>
+					<input type="text" class="text-input" placeholder="请输入年收入" v-model="formData.income" />
+				</view>
+
+				<!-- 住址 -->
+				<view class="form-group">
+					<text class="label">住址</text>
+					<input type="text" class="text-input" placeholder="请输入住址" v-model="formData.address" />
+				</view>
+
+				<!-- 户籍地 -->
+				<view class="form-group">
+					<text class="label">户籍地</text>
+					<input type="text" class="text-input" placeholder="请输入户籍地" v-model="formData.hometown" />
+				</view>
+
+				<!-- 职业 -->
+				<view class="form-group">
+					<text class="label">职业</text>
+					<input type="text" class="text-input" placeholder="请输入职业" v-model="formData.occupation" />
+				</view>
+
+				<!-- 购房 -->
+				<view class="form-group">
+					<text class="label">购房</text>
+					<view class="checkbox-group">
+						<view class="checkbox-item" @click="toggleCheckbox('hasHouse')">
+							<view class="checkbox" :class="{ checked: formData.hasHouse }"></view>
+							<text>有房</text>
+						</view>
+					</view>
+				</view>
+
+				<!-- 购车 -->
+				<view class="form-group">
+					<text class="label">购车</text>
+					<view class="checkbox-group">
+						<view class="checkbox-item" @click="toggleCheckbox('hasCar')">
+							<view class="checkbox" :class="{ checked: formData.hasCar }"></view>
+							<text>有车</text>
+						</view>
+					</view>
+				</view>
+			</view>
+
+			<!-- 基本信息 -->
+			<view class="section">
+				<view class="section-title">
+					<text class="section-label">基本信息</text>
+				</view>
+
+				<!-- 姓名 -->
+				<view class="form-group">
+					<text class="label required">姓名</text>
+					<input type="text" class="text-input" placeholder="请输入姓名" v-model="formData.name" />
+				</view>
+
+				<!-- 年龄 -->
+				<view class="form-group">
+					<text class="label">年龄</text>
+					<input type="number" class="text-input" placeholder="请输入年龄" v-model="formData.age" />
+				</view>
+
+				<!-- 性别 -->
+				<view class="form-group">
+					<text class="label">性别</text>
+					<view class="select-wrapper">
+						<picker @change="onGenderChange" :value="formData.genderIndex" :range="genderOptions">
+							<view class="select-input">
+								<text>{{ formData.gender || '请选择性别' }}</text>
+								<text class="arrow">▼</text>
+							</view>
+						</picker>
+					</view>
+				</view>
+
+				<!-- 星座 -->
+				<view class="form-group">
+					<text class="label">星座</text>
+					<view class="select-wrapper">
+						<picker @change="onZodiacChange" :value="formData.zodiacIndex" :range="zodiacOptions">
+							<view class="select-input">
+								<text>{{ formData.zodiac || '请选择星座' }}</text>
+								<text class="arrow">▼</text>
+							</view>
+						</picker>
+					</view>
+				</view>
+
+				<!-- 身高 -->
+				<view class="form-group">
+					<text class="label">身高 (cm)</text>
+					<input type="number" class="text-input" placeholder="请输入身高" v-model="formData.height" />
+				</view>
+
+				<!-- 体重 -->
+				<view class="form-group">
+					<text class="label">体重 (kg)</text>
+					<input type="number" class="text-input" placeholder="请输入体重" v-model="formData.weight" />
+				</view>
+			</view>
+
+			<!-- 底部按钮 -->
+			<view class="button-group">
+				<view class="reset-btn" @click="resetForm">重置</view>
+				<view class="submit-btn" @click="submitForm">提交</view>
+			</view>
+		</scroll-view>
+	</view>
+</template>
+
+<script>
+export default {
+	data() {
+		return {
+			formData: {
+				// 社会属性
+				marriage: '',
+				marriageIndex: 0,
+				education: '',
+				educationIndex: 0,
+				income: '',
+				address: '',
+				hometown: '',
+				occupation: '',
+				hasHouse: false,
+				hasCar: false,
+				// 基本信息
+				name: '',
+				age: '',
+				gender: '',
+				genderIndex: 0,
+				zodiac: '',
+				zodiacIndex: 0,
+				height: '',
+				weight: ''
+			},
+			marriageOptions: ['未婚', '已婚', '离异', '丧偶'],
+			educationOptions: ['初中', '高中', '大专', '本科', '硕士', '博士'],
+			genderOptions: ['男', '女'],
+			zodiacOptions: ['白羊座', '金牛座', '双子座', '巨蟹座', '狮子座', '处女座', '天秤座', '天蝎座', '射手座', '摩羯座', '水瓶座', '双鱼座']
+		}
+	},
+	methods: {
+		goBack() {
+			uni.navigateBack()
+		},
+		onMarriageChange(e) {
+			this.formData.marriageIndex = e.detail.value
+			this.formData.marriage = this.marriageOptions[e.detail.value]
+		},
+		onEducationChange(e) {
+			this.formData.educationIndex = e.detail.value
+			this.formData.education = this.educationOptions[e.detail.value]
+		},
+		onGenderChange(e) {
+			this.formData.genderIndex = e.detail.value
+			this.formData.gender = this.genderOptions[e.detail.value]
+		},
+		onZodiacChange(e) {
+			this.formData.zodiacIndex = e.detail.value
+			this.formData.zodiac = this.zodiacOptions[e.detail.value]
+		},
+		toggleCheckbox(field) {
+			this.formData[field] = !this.formData[field]
+		},
+		resetForm() {
+			this.formData = {
+				marriage: '',
+				marriageIndex: 0,
+				education: '',
+				educationIndex: 0,
+				income: '',
+				address: '',
+				hometown: '',
+				occupation: '',
+				hasHouse: false,
+				hasCar: false,
+				name: '',
+				age: '',
+				gender: '',
+				genderIndex: 0,
+				zodiac: '',
+				zodiacIndex: 0,
+				height: '',
+				weight: ''
+			}
+		},
+		submitForm() {
+			if (!this.formData.name) {
+				uni.showToast({
+					title: '请输入姓名',
+					icon: 'none'
+				})
+				return
+			}
+			console.log('提交表单:', this.formData)
+			uni.showToast({
+				title: '提交成功',
+				icon: 'success'
+			})
+			setTimeout(() => {
+				uni.navigateBack()
+			}, 1500)
+		}
+	}
+}
+</script>
+
+<style lang="scss" scoped>
+.add-resource {
+	min-height: 100vh;
+	background: #FFF9F9;
+	display: flex;
+	flex-direction: column;
+}
+
+/* 顶部导航栏 */
+.header {
+	display: flex;
+	align-items: center;
+	justify-content: space-between;
+	padding: 20rpx 30rpx;
+	padding-top: calc(20rpx + env(safe-area-inset-top));
+	background: #FFF9F9;
+	border-bottom: 1rpx solid #F0F0F0;
+
+	.back-btn {
+		width: 50rpx;
+		height: 50rpx;
+		display: flex;
+		align-items: center;
+		justify-content: center;
+
+		.back-icon {
+			font-size: 40rpx;
+			color: #9C27B0;
+		}
+	}
+
+	.header-title {
+		font-size: 32rpx;
+		font-weight: bold;
+		color: #333;
+		flex: 1;
+		text-align: center;
+	}
+
+	.header-right {
+		display: flex;
+		align-items: center;
+		gap: 15rpx;
+
+		.more-icon,
+		.info-icon {
+			font-size: 28rpx;
+			color: #999;
+		}
+	}
+}
+
+.content {
+	flex: 1;
+	overflow-y: auto;
+	padding: 20rpx;
+}
+
+/* 表单区域 */
+.section {
+	background: #FFFFFF;
+	border-radius: 16rpx;
+	padding: 20rpx;
+	margin-bottom: 20rpx;
+	box-shadow: 0 2rpx 8rpx rgba(0, 0, 0, 0.05);
+
+	.section-title {
+		margin-bottom: 20rpx;
+
+		.section-label {
+			display: inline-block;
+			background: #FFEBEE;
+			color: #E91E63;
+			font-size: 24rpx;
+			font-weight: bold;
+			padding: 6rpx 14rpx;
+			border-radius: 8rpx;
+			border: 2rpx solid #E91E63;
+		}
+	}
+}
+
+/* 表单组 */
+.form-group {
+	margin-bottom: 20rpx;
+
+	&:last-child {
+		margin-bottom: 0;
+	}
+
+	.label {
+		display: block;
+		font-size: 26rpx;
+		color: #666;
+		margin-bottom: 10rpx;
+
+		&.required::after {
+			content: ' *';
+			color: #E91E63;
+		}
+	}
+
+	.text-input {
+		width: 100%;
+		padding: 12rpx 16rpx;
+		border: 1rpx solid #E0E0E0;
+		border-radius: 8rpx;
+		font-size: 26rpx;
+		color: #333;
+		background: #F8F8F8;
+
+		&::placeholder {
+			color: #999;
+		}
+	}
+
+	.select-wrapper {
+		.select-input {
+			display: flex;
+			align-items: center;
+			justify-content: space-between;
+			padding: 12rpx 16rpx;
+			border: 1rpx solid #E0E0E0;
+			border-radius: 8rpx;
+			font-size: 26rpx;
+			color: #333;
+			background: #F8F8F8;
+
+			.arrow {
+				font-size: 20rpx;
+				color: #999;
+			}
+		}
+	}
+
+	.checkbox-group {
+		display: flex;
+		flex-wrap: wrap;
+		gap: 15rpx;
+
+		.checkbox-item {
+			display: flex;
+			align-items: center;
+			gap: 8rpx;
+
+			.checkbox {
+				width: 24rpx;
+				height: 24rpx;
+				border: 2rpx solid #E0E0E0;
+				border-radius: 4rpx;
+				background: #FFFFFF;
+
+				&.checked {
+					background: #E91E63;
+					border-color: #E91E63;
+				}
+			}
+
+			text {
+				font-size: 26rpx;
+				color: #333;
+			}
+		}
+	}
+}
+
+/* 按钮组 */
+.button-group {
+	display: flex;
+	gap: 15rpx;
+	margin: 30rpx 0;
+
+	.reset-btn,
+	.submit-btn {
+		flex: 1;
+		padding: 16rpx;
+		border-radius: 12rpx;
+		font-size: 28rpx;
+		font-weight: bold;
+		text-align: center;
+	}
+
+	.reset-btn {
+		background: #F5F5F5;
+		color: #666;
+		border: 1rpx solid #E0E0E0;
+	}
+
+	.submit-btn {
+		background: linear-gradient(135deg, #E91E63 0%, #C2185B 100%);
+		color: #FFFFFF;
+	}
+}
+</style>

+ 307 - 0
LiangZhiYUMao/pages/matchmaker-workbench/edit-profile.vue

@@ -0,0 +1,307 @@
+<template>
+  <view class="edit-profile" :class="{ 'dark-mode': isDarkTheme }">
+    <!-- 顶部导航栏 -->
+    <view class="header">
+      <view class="back-btn" @click="goBack">
+        <text class="back-icon">←</text>
+      </view>
+      <text class="header-title">编辑资料</text>
+      <view class="placeholder"></view>
+    </view>
+
+    <scroll-view scroll-y class="content">
+      <view class="card">
+        <!-- 头像区域 -->
+        <view class="avatar-section">
+          <view class="avatar-circle">
+            <image v-if="form.avatar" :src="form.avatar" class="avatar-img" mode="aspectFill" />
+            <view v-else class="avatar-placeholder">👩</view>
+            <view class="camera-btn" @click="changeAvatar">
+              <text class="camera-icon">📷</text>
+            </view>
+          </view>
+          <text class="change-avatar-text" @click="changeAvatar">更换头像</text>
+        </view>
+
+        <!-- 表单项 -->
+        <view class="form-group">
+          <text class="label">姓名</text>
+          <input class="input" v-model="form.name" placeholder="请输入姓名" />
+        </view>
+
+        <view class="form-group">
+          <text class="label">性别</text>
+          <picker mode="selector" :range="genderOptions" :value="genderIndex" @change="onGenderChange">
+            <view class="input picker-value">{{ form.gender || '请选择性别' }}</view>
+          </picker>
+        </view>
+
+        <view class="form-group">
+          <text class="label">手机号</text>
+          <input class="input" v-model="form.phone" placeholder="请输入手机号" type="number" maxlength="11" />
+        </view>
+
+        <view class="form-group">
+          <text class="label">红娘等级</text>
+          <view class="input readonly">
+            <text class="level-icon">🏅</text>
+            <text class="level-text">{{ form.level || '金牌红娘' }}</text>
+          </view>
+        </view>
+
+        <view class="form-group">
+          <text class="label">个人简介</text>
+          <textarea class="textarea" v-model="form.bio" placeholder="请输入个人简介..." />
+        </view>
+
+        <view class="save-btn" @click="handleSave">保存</view>
+      </view>
+    </scroll-view>
+  </view>
+</template>
+
+<script>
+export default {
+  name: 'matchmaker-edit-profile',
+  data() {
+    return {
+      isDarkTheme: false,
+      genderOptions: ['女', '男'],
+      genderIndex: 0,
+      form: {
+        avatar: '',
+        name: '高红娘',
+        gender: '女',
+        phone: '',
+        level: '金牌红娘',
+        bio: '我是一名专业的红娘,拥有丰富的婚恋服务经验,已成功帮助1200对单身男女找到幸福。'
+      }
+    }
+  },
+  onShow() {
+    const stored = uni.getStorageSync('matchmakerDarkMode')
+    if (stored === true || stored === false) {
+      this.isDarkTheme = stored
+    }
+  },
+  methods: {
+    goBack() {
+      uni.navigateBack()
+    },
+    changeAvatar() {
+      uni.showToast({ title: '更换头像开发中', icon: 'none' })
+    },
+    onGenderChange(e) {
+      const index = Number(e.detail.value)
+      this.genderIndex = index
+      this.form.gender = this.genderOptions[index]
+    },
+    handleSave() {
+      uni.showToast({ title: '已保存', icon: 'success' })
+      // 这里可以接入实际保存接口
+    }
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+.edit-profile {
+  min-height: 100vh;
+  background: #F5F5F5;
+  display: flex;
+  flex-direction: column;
+}
+
+.header {
+  display: flex;
+  align-items: center;
+  justify-content: space-between;
+  padding: 25rpx 30rpx;
+  padding-top: calc(25rpx + env(safe-area-inset-top));
+  background: #E9D7F5;
+
+  .back-btn {
+    width: 60rpx;
+    height: 60rpx;
+    display: flex;
+    align-items: center;
+    justify-content: center;
+
+    .back-icon {
+      font-size: 40rpx;
+      color: #333;
+      font-weight: bold;
+    }
+  }
+
+  .header-title {
+    font-size: 36rpx;
+    font-weight: bold;
+    color: #333;
+  }
+
+  .placeholder {
+    width: 60rpx;
+  }
+}
+
+.content {
+  flex: 1;
+  padding: 20rpx 20rpx 40rpx;
+}
+
+.card {
+  background: #FFFFFF;
+  border-radius: 24rpx;
+  padding: 30rpx 24rpx 40rpx;
+  box-shadow: 0 4rpx 16rpx rgba(0, 0, 0, 0.04);
+}
+
+.avatar-section {
+  display: flex;
+  flex-direction: column;
+  align-items: center;
+  margin-bottom: 30rpx;
+
+  .avatar-circle {
+    width: 150rpx;
+    height: 150rpx;
+    border-radius: 50%;
+    border: 4rpx solid #E1D5FA;
+    display: flex;
+    align-items: center;
+    justify-content: center;
+    position: relative;
+
+    .avatar-img,
+    .avatar-placeholder {
+      width: 130rpx;
+      height: 130rpx;
+      border-radius: 50%;
+      background: #F5F5F5;
+      display: flex;
+      align-items: center;
+      justify-content: center;
+      font-size: 64rpx;
+    }
+
+    .camera-btn {
+      position: absolute;
+      right: 0;
+      bottom: 10rpx;
+      width: 48rpx;
+      height: 48rpx;
+      border-radius: 50%;
+      background: #9C27B0;
+      display: flex;
+      align-items: center;
+      justify-content: center;
+      box-shadow: 0 4rpx 12rpx rgba(156, 39, 176, 0.4);
+
+      .camera-icon {
+        font-size: 26rpx;
+        color: #FFF;
+      }
+    }
+  }
+
+  .change-avatar-text {
+    margin-top: 16rpx;
+    font-size: 26rpx;
+    color: #9C27B0;
+  }
+}
+
+.form-group {
+  margin-top: 20rpx;
+
+  .label {
+    display: block;
+    font-size: 26rpx;
+    color: #666;
+    margin-bottom: 10rpx;
+  }
+
+  .input {
+    width: 100%;
+    padding: 18rpx 20rpx;
+    border-radius: 16rpx;
+    background: #F7F7F9;
+    font-size: 28rpx;
+    color: #333;
+    box-sizing: border-box;
+  }
+
+  .picker-value {
+    line-height: 1.4;
+  }
+
+  .readonly {
+    display: flex;
+    align-items: center;
+    gap: 8rpx;
+
+    .level-icon { font-size: 30rpx; }
+    .level-text { font-size: 28rpx; color: #333; }
+  }
+
+  .textarea {
+    width: 100%;
+    min-height: 160rpx;
+    padding: 18rpx 20rpx;
+    border-radius: 16rpx;
+    background: #F7F7F9;
+    font-size: 28rpx;
+    color: #333;
+    box-sizing: border-box;
+  }
+}
+
+.save-btn {
+  margin-top: 30rpx;
+  width: 100%;
+  padding: 22rpx 0;
+  text-align: center;
+  border-radius: 26rpx;
+  background: linear-gradient(135deg, #F48FB1 0%, #EC407A 100%);
+  color: #FFFFFF;
+  font-size: 30rpx;
+  font-weight: bold;
+}
+
+/* 深色模式适配 */
+.edit-profile.dark-mode {
+  background: #121212;
+  color: #f5f5f5;
+
+  .header {
+    background: #1f1f1f;
+
+    .back-icon,
+    .header-title {
+      color: #f5f5f5;
+    }
+  }
+
+  .content {
+    background: #121212;
+  }
+
+  .card {
+    background: #1e1e1e;
+    box-shadow: 0 4rpx 16rpx rgba(0, 0, 0, 0.6);
+  }
+
+  .form-group {
+    .label { color: #b0b0b0; }
+    .input,
+    .textarea,
+    .readonly {
+      background: #242424;
+      color: #f5f5f5;
+    }
+  }
+
+  .change-avatar-text { color: #c792ea; }
+}
+</style>

+ 470 - 0
LiangZhiYUMao/pages/matchmaker-workbench/sign-in.vue

@@ -0,0 +1,470 @@
+<template>
+	<view class="sign-in-page">
+		<!-- 顶部导航栏 -->
+		<view class="header">
+			<view class="back-btn" @click="goBack">
+				<text class="back-icon">‹</text>
+			</view>
+			<text class="header-title">签到</text>
+			<view class="placeholder"></view>
+		</view>
+
+		<scroll-view scroll-y class="content">
+			<!-- 签到日历标题 -->
+			<view class="calendar-header">
+				<text class="calendar-title">11月签到日历</text>
+				<text class="calendar-subtitle">红线相系,良缘成就一生欢喜。</text>
+			</view>
+
+			<!-- 月份选择 -->
+			<view class="month-selector">
+				<text class="month-text">2025年 11月</text>
+				<view class="streak-badge">
+					<text class="streak-text">红线季良缘</text>
+				</view>
+				<view class="calendar-icon">📅</view>
+			</view>
+
+			<!-- 日历 -->
+			<view class="calendar">
+				<view class="weekdays">
+					<text class="weekday">日</text>
+					<text class="weekday">一</text>
+					<text class="weekday">二</text>
+					<text class="weekday">三</text>
+					<text class="weekday">四</text>
+					<text class="weekday">五</text>
+					<text class="weekday">六</text>
+				</view>
+
+				<view class="days">
+					<view 
+						v-for="(day, index) in calendarDays" 
+						:key="index" 
+						class="day-item"
+						:class="{ 
+							'other-month': day.isOtherMonth,
+							'signed': day.isSigned,
+							'today': day.isToday
+						}"
+					>
+						<text class="day-number">{{ day.day }}</text>
+					</view>
+				</view>
+			</view>
+
+			<!-- 签到统计 -->
+			<view class="sign-stats">
+				<view class="stat-item">
+					<text class="stat-icon">📊</text>
+					<text class="stat-text">累计签到: {{ totalSignDays }}天</text>
+				</view>
+				<view class="stat-item">
+					<text class="stat-icon">💗</text>
+					<text class="stat-text">可用积分: {{ availablePoints }}</text>
+				</view>
+				<view class="gift-icon">🎁</view>
+			</view>
+
+			<!-- 连续签到进度 -->
+			<view class="streak-progress">
+				<text class="progress-label">连续签到奖励</text>
+				<text class="progress-days">连续{{ consecutiveDays }}天</text>
+			</view>
+			<view class="progress-bar">
+				<view class="progress-fill" :style="{ width: progressWidth }"></view>
+			</view>
+
+			<!-- 签到按钮 -->
+			<view class="sign-button" :class="{ disabled: isSigned }" @click="handleSignIn">
+				<text class="button-text">{{ isSigned ? '今日已签到' : '今日签到 +10积分' }}</text>
+			</view>
+
+			<!-- 提示文字 -->
+			<view class="tips">
+				<text class="tips-text">坚持签到,缘分更近一步</text>
+				<text class="tips-sub">品牌出品 | 青鸟之恋1跟平台</text>
+			</view>
+		</scroll-view>
+	</view>
+</template>
+
+<script>
+export default {
+	data() {
+		return {
+			currentYear: 2025,
+			currentMonth: 11,
+			totalSignDays: 0,
+			availablePoints: 0,
+			consecutiveDays: 0,
+			isSigned: false,
+			calendarDays: [],
+			signedDates: [] // 已签到的日期
+		}
+	},
+	computed: {
+		progressWidth() {
+			// 假设7天为一个周期
+			const progress = (this.consecutiveDays % 7) / 7 * 100
+			return progress + '%'
+		}
+	},
+	onLoad() {
+		this.loadSignInData()
+		this.generateCalendar()
+	},
+	methods: {
+		goBack() {
+			uni.navigateBack()
+		},
+		async loadSignInData() {
+			// 模拟加载签到数据
+			this.totalSignDays = 0
+			this.availablePoints = 0
+			this.consecutiveDays = 0
+			this.isSigned = false
+			
+			// 模拟已签到日期
+			this.signedDates = [2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 23, 24, 25, 30]
+		},
+		generateCalendar() {
+			const year = this.currentYear
+			const month = this.currentMonth
+			
+			// 获取当月第一天是星期几
+			const firstDay = new Date(year, month - 1, 1).getDay()
+			// 获取当月天数
+			const daysInMonth = new Date(year, month, 0).getDate()
+			// 获取上月天数
+			const prevMonthDays = new Date(year, month - 1, 0).getDate()
+			
+			const days = []
+			
+			// 添加上月日期
+			for (let i = firstDay - 1; i >= 0; i--) {
+				days.push({
+					day: prevMonthDays - i,
+					isOtherMonth: true,
+					isSigned: false,
+					isToday: false
+				})
+			}
+			
+			// 添加当月日期
+			const today = new Date().getDate()
+			const currentMonthNow = new Date().getMonth() + 1
+			
+			for (let i = 1; i <= daysInMonth; i++) {
+				days.push({
+					day: i,
+					isOtherMonth: false,
+					isSigned: this.signedDates.includes(i),
+					isToday: i === today && month === currentMonthNow
+				})
+			}
+			
+			// 添加下月日期补齐
+			const remainingDays = 42 - days.length // 6行7列
+			for (let i = 1; i <= remainingDays; i++) {
+				days.push({
+					day: i,
+					isOtherMonth: true,
+					isSigned: false,
+					isToday: false
+				})
+			}
+			
+			this.calendarDays = days
+		},
+		handleSignIn() {
+			if (this.isSigned) {
+				uni.showToast({
+					title: '今日已签到',
+					icon: 'none'
+				})
+				return
+			}
+			
+			// 执行签到
+			this.isSigned = true
+			this.totalSignDays++
+			this.availablePoints += 10
+			this.consecutiveDays++
+			
+			// 更新今天的签到状态
+			const today = new Date().getDate()
+			this.signedDates.push(today)
+			this.generateCalendar()
+			
+			uni.showToast({
+				title: '签到成功 +10积分',
+				icon: 'success'
+			})
+		}
+	}
+}
+</script>
+
+<style lang="scss" scoped>
+.sign-in-page {
+	min-height: 100vh;
+	background: linear-gradient(180deg, #F3E5F5 0%, #FFF9F9 40%);
+	display: flex;
+	flex-direction: column;
+}
+
+/* 顶部导航栏 */
+.header {
+	display: flex;
+	align-items: center;
+	justify-content: space-between;
+	padding: 20rpx 30rpx;
+	padding-top: calc(20rpx + env(safe-area-inset-top));
+	background: transparent;
+
+	.back-btn {
+		width: 50rpx;
+		height: 50rpx;
+		display: flex;
+		align-items: center;
+		justify-content: center;
+
+		.back-icon {
+			font-size: 40rpx;
+			color: #333;
+		}
+	}
+
+	.header-title {
+		font-size: 32rpx;
+		font-weight: bold;
+		color: #333;
+	}
+
+	.placeholder {
+		width: 50rpx;
+	}
+}
+
+.content {
+	flex: 1;
+	padding: 10rpx 20rpx 20rpx;
+}
+
+/* 日历标题 */
+.calendar-header {
+	margin-bottom: 20rpx;
+
+	.calendar-title {
+		display: block;
+		font-size: 32rpx;
+		font-weight: bold;
+		color: #333;
+		margin-bottom: 8rpx;
+	}
+
+	.calendar-subtitle {
+		display: block;
+		font-size: 24rpx;
+		color: #FF6B9D;
+	}
+}
+
+/* 月份选择 */
+.month-selector {
+	display: flex;
+	align-items: center;
+	justify-content: space-between;
+	margin-bottom: 20rpx;
+
+	.month-text {
+		font-size: 28rpx;
+		font-weight: bold;
+		color: #7B1FA2;
+	}
+
+	.streak-badge {
+		background: linear-gradient(135deg, #9C27B0 0%, #BA68C8 100%);
+		color: #FFFFFF;
+		font-size: 22rpx;
+		font-weight: bold;
+		padding: 6rpx 14rpx;
+		border-radius: 12rpx;
+	}
+
+	.calendar-icon {
+		font-size: 32rpx;
+	}
+}
+
+/* 日历 */
+.calendar {
+	background: #FFFFFF;
+	border-radius: 16rpx;
+	padding: 20rpx;
+	margin-bottom: 20rpx;
+	box-shadow: 0 2rpx 8rpx rgba(0, 0, 0, 0.05);
+
+	.weekdays {
+		display: grid;
+		grid-template-columns: repeat(7, 1fr);
+		margin-bottom: 15rpx;
+
+		.weekday {
+			text-align: center;
+			font-size: 24rpx;
+			color: #666;
+			font-weight: bold;
+		}
+	}
+
+	.days {
+		display: grid;
+		grid-template-columns: repeat(7, 1fr);
+		gap: 8rpx;
+
+		.day-item {
+			aspect-ratio: 1;
+			display: flex;
+			align-items: center;
+			justify-content: center;
+			border-radius: 12rpx;
+			background: #F5F5F5;
+
+			&.other-month {
+				background: transparent;
+
+				.day-number {
+					color: #CCC;
+				}
+			}
+
+			&.signed {
+				background: linear-gradient(135deg, #CE93D8 0%, #BA68C8 100%);
+
+				.day-number {
+					color: #FFFFFF;
+					font-weight: bold;
+				}
+			}
+
+			&.today {
+				border: 2rpx solid #9C27B0;
+			}
+
+			.day-number {
+				font-size: 24rpx;
+				color: #333;
+			}
+		}
+	}
+}
+
+/* 签到统计 */
+.sign-stats {
+	display: flex;
+	align-items: center;
+	justify-content: space-between;
+	background: #FFFFFF;
+	border-radius: 16rpx;
+	padding: 15rpx 20rpx;
+	margin-bottom: 15rpx;
+	box-shadow: 0 2rpx 8rpx rgba(0, 0, 0, 0.05);
+
+	.stat-item {
+		display: flex;
+		align-items: center;
+		gap: 8rpx;
+		flex: 1;
+
+		.stat-icon {
+			font-size: 24rpx;
+		}
+
+		.stat-text {
+			font-size: 24rpx;
+			color: #666;
+		}
+	}
+
+	.gift-icon {
+		font-size: 32rpx;
+	}
+}
+
+/* 连续签到进度 */
+.streak-progress {
+	display: flex;
+	align-items: center;
+	justify-content: space-between;
+	margin-bottom: 10rpx;
+
+	.progress-label {
+		font-size: 24rpx;
+		color: #666;
+	}
+
+	.progress-days {
+		font-size: 24rpx;
+		color: #9C27B0;
+		font-weight: bold;
+	}
+}
+
+.progress-bar {
+	width: 100%;
+	height: 12rpx;
+	background: #E0E0E0;
+	border-radius: 6rpx;
+	margin-bottom: 25rpx;
+	overflow: hidden;
+
+	.progress-fill {
+		height: 100%;
+		background: linear-gradient(90deg, #9C27B0 0%, #BA68C8 100%);
+		border-radius: 6rpx;
+		transition: width 0.3s ease;
+	}
+}
+
+/* 签到按钮 */
+.sign-button {
+	background: linear-gradient(135deg, #9C27B0 0%, #BA68C8 100%);
+	border-radius: 16rpx;
+	padding: 20rpx;
+	margin-bottom: 20rpx;
+	box-shadow: 0 4rpx 12rpx rgba(156, 39, 176, 0.3);
+
+	&.disabled {
+		background: #E0E0E0;
+		box-shadow: none;
+	}
+
+	.button-text {
+		display: block;
+		text-align: center;
+		font-size: 28rpx;
+		font-weight: bold;
+		color: #FFFFFF;
+	}
+}
+
+/* 提示文字 */
+.tips {
+	text-align: center;
+
+	.tips-text {
+		display: block;
+		font-size: 26rpx;
+		color: #666;
+		margin-bottom: 8rpx;
+	}
+
+	.tips-sub {
+		display: block;
+		font-size: 22rpx;
+		color: #999;
+	}
+}
+</style>