YingXingAI/pages/home/userInfo/index.vue

393 lines
9.4 KiB
Vue
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<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.jpg'
"
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">
<input
class="item-input"
v-model="userInfo.name"
placeholder="请输入姓名"
placeholder-style="color: #CCCCCC;"
/>
</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.genderText"
>请选择性别</text
>
<text v-else>{{ userInfo.genderText }}</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-select
v-model="showGenderSelect"
mode="single-column"
:list="genderList"
@confirm="confirmGender"
></u-select>
<!-- 归属地选择器 -->
<u-picker
v-model="showRegionSelect"
mode="single-column"
:list="regionList"
@confirm="confirmRegion"
></u-picker>
<!-- 选择器弹窗 -->
<u-picker
v-model="showPicker"
mode="selector"
:columns="pickerColumns"
@confirm="onPickerConfirm"
@cancel="showPicker = false"
></u-picker>
</view>
</template>
<script>
export default {
components: {},
data() {
return {
userInfo: {
avatar: "",
name: "",
gender: "",
region: "",
examYear: "",
highSchool: "",
major: "",
},
showPicker: false,
currentPicker: "",
pickerColumns: [],
pickerData: {
gender: ["男", "女"],
region: ["北京", "上海", "广州", "深圳", "江西", "湖南"],
examYear: ["2023", "2024", "2025", "2026"],
major: [
"计算机科学与技术",
"软件工程",
"人工智能",
"电子信息工程",
"机械工程",
],
},
// 性别选择器
showGenderSelect: false,
genderList: [
{
label: "男",
value: "0",
},
{
label: "女",
value: "1",
},
],
// 归属地选择器
showRegionSelect: false,
regionList: [
{
label: "北京",
value: "0",
},
{
label: "上海",
value: "1",
},
],
};
},
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) {
if (type === "gender") {
this.showGenderSelect = true;
return;
}
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;
},
// 确认性别
confirmGender(e) {
console.log("确认性别", e[0].value);
this.userInfo.gender = e[0].value;
this.userInfo.genderText = e[0].label;
this.showGenderSelect = 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>