331 lines
8.1 KiB
Vue
331 lines
8.1 KiB
Vue
|
<template>
|
|||
|
<view class="userInfo-container">
|
|||
|
<view class="header">
|
|||
|
<div class="header-left">
|
|||
|
<u-icon
|
|||
|
class="header-left-icon"
|
|||
|
name="arrow-left"
|
|||
|
@click="handleLeftClick"
|
|||
|
></u-icon>
|
|||
|
</div>
|
|||
|
<text class="header-title">个人信息</text>
|
|||
|
<div></div>
|
|||
|
</view>
|
|||
|
|
|||
|
<view class="user-info-content">
|
|||
|
<!-- 第一个卡片:头像 -->
|
|||
|
<view class="info-card">
|
|||
|
<view class="info-item avatar-item">
|
|||
|
<text class="item-label">头像</text>
|
|||
|
<view class="item-content avatar-content">
|
|||
|
<image
|
|||
|
class="avatar-image"
|
|||
|
:src="
|
|||
|
userInfo.avatar || '/static/common/images/avatar_default.png'
|
|||
|
"
|
|||
|
mode="aspectFill"
|
|||
|
@click="chooseAvatar"
|
|||
|
></image>
|
|||
|
</view>
|
|||
|
</view>
|
|||
|
</view>
|
|||
|
|
|||
|
<!-- 第二个卡片:姓名和性别 -->
|
|||
|
<view class="info-card">
|
|||
|
<view class="info-item">
|
|||
|
<text class="item-label">姓名</text>
|
|||
|
<view class="item-content">
|
|||
|
<text>{{ userInfo.name }}</text>
|
|||
|
</view>
|
|||
|
</view>
|
|||
|
|
|||
|
<view class="info-item">
|
|||
|
<text class="item-label">性别</text>
|
|||
|
<view class="item-content" @click="openPicker('gender')">
|
|||
|
<text class="placeholder-text" v-if="!userInfo.gender"
|
|||
|
>请选择性别</text
|
|||
|
>
|
|||
|
<text v-else>{{ userInfo.gender }}</text>
|
|||
|
<text class="arrow-icon">></text>
|
|||
|
</view>
|
|||
|
</view>
|
|||
|
</view>
|
|||
|
|
|||
|
<!-- 第三个卡片:归属地、高考年份、生源高中、意向学院专业 -->
|
|||
|
<view class="info-card">
|
|||
|
<view class="info-item">
|
|||
|
<text class="item-label">归属地</text>
|
|||
|
<view class="item-content" @click="openPicker('region')">
|
|||
|
<text class="placeholder-text" v-if="!userInfo.region"
|
|||
|
>请选择归属地</text
|
|||
|
>
|
|||
|
<text v-else>{{ userInfo.region }}</text>
|
|||
|
<text class="arrow-icon">></text>
|
|||
|
</view>
|
|||
|
</view>
|
|||
|
|
|||
|
<view class="info-item">
|
|||
|
<text class="item-label">高考年份</text>
|
|||
|
<view class="item-content" @click="openPicker('examYear')">
|
|||
|
<text class="placeholder-text" v-if="!userInfo.examYear"
|
|||
|
>请选择高考年份</text
|
|||
|
>
|
|||
|
<text v-else>{{ userInfo.examYear }}</text>
|
|||
|
<text class="arrow-icon">></text>
|
|||
|
</view>
|
|||
|
</view>
|
|||
|
|
|||
|
<view class="info-item">
|
|||
|
<text class="item-label">生源高中</text>
|
|||
|
<view class="item-content">
|
|||
|
<input
|
|||
|
class="item-input"
|
|||
|
v-model="userInfo.highSchool"
|
|||
|
placeholder="请输入生源高中"
|
|||
|
placeholder-style="color: #CCCCCC;"
|
|||
|
/>
|
|||
|
</view>
|
|||
|
</view>
|
|||
|
|
|||
|
<view class="info-item">
|
|||
|
<text class="item-label">意向学院专业</text>
|
|||
|
<view class="item-content" @click="openPicker('major')">
|
|||
|
<text class="placeholder-text" v-if="!userInfo.major"
|
|||
|
>请选择意向学院专业</text
|
|||
|
>
|
|||
|
<text v-else>{{ userInfo.major }}</text>
|
|||
|
<text class="arrow-icon">></text>
|
|||
|
</view>
|
|||
|
</view>
|
|||
|
</view>
|
|||
|
</view>
|
|||
|
|
|||
|
<div class="user-info-footer">
|
|||
|
<u-button class="user-info-footer-button" @click="handleSave">
|
|||
|
保存
|
|||
|
</u-button>
|
|||
|
</div>
|
|||
|
|
|||
|
<!-- 选择器弹窗 -->
|
|||
|
<u-picker
|
|||
|
v-model="showPicker"
|
|||
|
:columns="pickerColumns"
|
|||
|
@confirm="onPickerConfirm"
|
|||
|
@cancel="showPicker = false"
|
|||
|
></u-picker>
|
|||
|
</view>
|
|||
|
</template>
|
|||
|
|
|||
|
<script>
|
|||
|
export default {
|
|||
|
components: {},
|
|||
|
data() {
|
|||
|
return {
|
|||
|
userInfo: {
|
|||
|
avatar: "/static/common/images/avatar_default.png",
|
|||
|
name: "杨翼",
|
|||
|
gender: "",
|
|||
|
region: "",
|
|||
|
examYear: "",
|
|||
|
highSchool: "",
|
|||
|
major: "",
|
|||
|
},
|
|||
|
showPicker: false,
|
|||
|
currentPicker: "",
|
|||
|
pickerColumns: [],
|
|||
|
pickerData: {
|
|||
|
gender: ["男", "女"],
|
|||
|
region: ["北京", "上海", "广州", "深圳", "江西", "湖南"],
|
|||
|
examYear: ["2023", "2024", "2025", "2026"],
|
|||
|
major: [
|
|||
|
"计算机科学与技术",
|
|||
|
"软件工程",
|
|||
|
"人工智能",
|
|||
|
"电子信息工程",
|
|||
|
"机械工程",
|
|||
|
],
|
|||
|
},
|
|||
|
};
|
|||
|
},
|
|||
|
mounted() {},
|
|||
|
onLoad(options) {
|
|||
|
if (options.userId) {
|
|||
|
this.userId = options.userId;
|
|||
|
this.getUserInfo();
|
|||
|
}
|
|||
|
},
|
|||
|
methods: {
|
|||
|
handleLeftClick() {
|
|||
|
uni.navigateBack();
|
|||
|
},
|
|||
|
getUserInfo() {
|
|||
|
// 模拟获取用户信息的接口
|
|||
|
console.log("获取用户ID为", this.userId, "的信息");
|
|||
|
// 实际开发中这里应该调用接口获取用户信息
|
|||
|
},
|
|||
|
chooseAvatar() {
|
|||
|
uni.chooseImage({
|
|||
|
count: 1,
|
|||
|
sizeType: ["compressed"],
|
|||
|
sourceType: ["album", "camera"],
|
|||
|
success: (res) => {
|
|||
|
this.userInfo.avatar = res.tempFilePaths[0];
|
|||
|
// 实际开发中这里应该上传头像到服务器
|
|||
|
},
|
|||
|
});
|
|||
|
},
|
|||
|
openPicker(type) {
|
|||
|
this.currentPicker = type;
|
|||
|
this.pickerColumns = [this.pickerData[type]];
|
|||
|
this.showPicker = true;
|
|||
|
},
|
|||
|
onPickerConfirm(e) {
|
|||
|
const value = e.value[0];
|
|||
|
switch (this.currentPicker) {
|
|||
|
case "gender":
|
|||
|
this.userInfo.gender = value;
|
|||
|
break;
|
|||
|
case "region":
|
|||
|
this.userInfo.region = value;
|
|||
|
break;
|
|||
|
case "examYear":
|
|||
|
this.userInfo.examYear = value;
|
|||
|
break;
|
|||
|
case "major":
|
|||
|
this.userInfo.major = value;
|
|||
|
break;
|
|||
|
}
|
|||
|
this.showPicker = false;
|
|||
|
},
|
|||
|
},
|
|||
|
};
|
|||
|
</script>
|
|||
|
|
|||
|
<style lang="scss" scoped>
|
|||
|
.userInfo-container {
|
|||
|
min-height: 100vh;
|
|||
|
padding-bottom: calc(112rpx + env(safe-area-inset-bottom));
|
|||
|
padding: 32rpx;
|
|||
|
padding-top: calc(88rpx + 40rpx);
|
|||
|
|
|||
|
background-image: url(/static//common/images/images_bg.png);
|
|||
|
background-repeat: no-repeat;
|
|||
|
background-size: 100% 100%;
|
|||
|
background-position: center;
|
|||
|
|
|||
|
.header {
|
|||
|
position: fixed;
|
|||
|
top: 0;
|
|||
|
left: 0;
|
|||
|
right: 0;
|
|||
|
// background-color: #ffffff;
|
|||
|
height: 88rpx;
|
|||
|
display: flex;
|
|||
|
align-items: center;
|
|||
|
justify-content: space-between;
|
|||
|
padding: 0 30rpx;
|
|||
|
z-index: 99;
|
|||
|
|
|||
|
.header-left {
|
|||
|
font-size: 36rpx;
|
|||
|
}
|
|||
|
|
|||
|
.header-title {
|
|||
|
font-size: 36rpx;
|
|||
|
font-weight: 500;
|
|||
|
color: #333333;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
.user-info-content {
|
|||
|
.info-card {
|
|||
|
background-color: #ffffff;
|
|||
|
border-radius: 20rpx;
|
|||
|
padding: 0 32rpx;
|
|||
|
margin-bottom: 32rpx;
|
|||
|
|
|||
|
.info-item {
|
|||
|
height: 110rpx;
|
|||
|
display: flex;
|
|||
|
justify-content: space-between;
|
|||
|
align-items: center;
|
|||
|
border-bottom: 1rpx solid #f2f2f2;
|
|||
|
|
|||
|
&:last-child {
|
|||
|
border-bottom: none;
|
|||
|
}
|
|||
|
|
|||
|
.item-label {
|
|||
|
font-family: PingFang SC;
|
|||
|
font-size: 28rpx;
|
|||
|
color: #333333;
|
|||
|
}
|
|||
|
|
|||
|
.item-content {
|
|||
|
flex: 1;
|
|||
|
display: flex;
|
|||
|
justify-content: flex-end;
|
|||
|
align-items: center;
|
|||
|
font-size: 28rpx;
|
|||
|
color: #333333;
|
|||
|
|
|||
|
.item-input {
|
|||
|
text-align: right;
|
|||
|
width: 100%;
|
|||
|
font-size: 28rpx;
|
|||
|
}
|
|||
|
|
|||
|
.placeholder-text {
|
|||
|
color: #cccccc;
|
|||
|
}
|
|||
|
|
|||
|
.arrow-icon {
|
|||
|
margin-left: 10rpx;
|
|||
|
color: #cccccc;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
&.avatar-item {
|
|||
|
.avatar-content {
|
|||
|
display: flex;
|
|||
|
align-items: center;
|
|||
|
}
|
|||
|
|
|||
|
.avatar-image {
|
|||
|
width: 68rpx;
|
|||
|
height: 68rpx;
|
|||
|
border-radius: 50%;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
.user-info-footer {
|
|||
|
position: fixed;
|
|||
|
bottom: 32rpx;
|
|||
|
left: 0;
|
|||
|
right: 0;
|
|||
|
padding: 0 32rpx;
|
|||
|
.user-info-footer-button {
|
|||
|
width: 100%;
|
|||
|
height: 85rpx;
|
|||
|
background: #4f6aff;
|
|||
|
color: #ffffff;
|
|||
|
border-radius: 16rpx;
|
|||
|
opacity: 0.9;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
/* 响应式布局 - PC端样式 */
|
|||
|
@media screen and (min-width: 768px) {
|
|||
|
.userInfo-container {
|
|||
|
.user-info-content {
|
|||
|
max-width: 1200rpx;
|
|||
|
margin: 0 auto;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
</style>
|