YingXingAI/pages/my/personalInfo.vue

371 lines
9.1 KiB
Vue
Raw Normal View History

2025-07-22 09:39:42 +08:00
<template>
<div class="personal-info">
<PageHeader
title="个人信息"
:is-back="true"
:border-bottom="false"
:background="headerBackground"
/>
<div class="content-wrapper">
<div class="form-container">
<div class="form-item">
<div class="form-label">头像</div>
<div class="form-value">
2026-01-21 11:30:22 +08:00
<div>
<uni-file-picker
v-model="imageValue"
limit="1"
:del-icon="false"
disable-preview
:imageStyles="imageStyles"
file-mediatype="image"
style="font-size: 12rpx;margin-left: auto;"
@select="onSelect"
>
<text></text>
</uni-file-picker>
</div>
2025-07-22 09:39:42 +08:00
</div>
</div>
<div class="form-item">
<div class="form-label">姓名</div>
<div class="form-value">
<u-input
v-model="teacherInfo.name"
:border="false"
placeholder="请输入姓名"
:clearable="false"
:custom-style="{ textAlign: 'right' }"
></u-input>
</div>
</div>
<div class="form-merge">
2026-01-21 11:30:22 +08:00
<!-- <div class="form-item-merge">
2025-07-22 09:39:42 +08:00
<div class="form-label">所属学校</div>
<div class="form-value">
<u-input
v-model="teacherInfo.schoolName"
:border="false"
placeholder="请输入学校名称"
:clearable="false"
:custom-style="{ textAlign: 'right' }"
:disabled="true"
></u-input>
</div>
2026-01-21 11:30:22 +08:00
</div> -->
2025-07-22 09:39:42 +08:00
<div class="line" style="height: 1px"></div>
<div class="form-item-merge">
2026-01-21 11:30:22 +08:00
<div class="form-label">部门</div>
2025-07-22 09:39:42 +08:00
<div class="form-value" @click="showCollegePicker = true">
2026-01-21 11:30:22 +08:00
{{ teacherInfo.collegeName || "请选择部门" }}
2025-07-22 09:39:42 +08:00
<u-icon name="arrow-right" color="#999" size="24"></u-icon>
</div>
</div>
</div>
</div>
</div>
<div class="save-btn" @click="saveInfo">保存</div>
<!-- 学院选择器 -->
<u-select
v-model="showCollegePicker"
:list="collegeList"
@confirm="confirmCollege"
></u-select>
</div>
</template>
<script>
import PageHeader from "@/components/PageHeader.vue";
export default {
name: "PersonalInfo",
components: {
PageHeader,
},
data() {
return {
2026-01-21 11:30:22 +08:00
baseUrl: "",
imageUrl: "",
imageValue: [],
imageStyles: {
width: 52,
height: 52,
border: {
radius: "50%",
},
},
2025-07-22 09:39:42 +08:00
teacherInfo: {
name: "",
id: "",
collegeName: "",
collegeManagementId: "",
schoolName: ""
},
headerBackground: {
background: "transparent",
},
showCollegePicker: false,
collegeList: [],
};
},
onLoad() {
// 从vuex获取教师信息
const info = this.vuex_teacherInfo || {};
2026-01-21 11:30:22 +08:00
this.baseUrl = this.$u.http.config.baseUrl;
2025-07-22 09:39:42 +08:00
this.teacherInfo = {
...info,
};
2026-01-21 11:30:22 +08:00
this.initAvatar(info);
2025-07-22 09:39:42 +08:00
this.getSchoolInfo();
},
methods: {
2026-01-21 11:30:22 +08:00
initAvatar(info) {
const rawUrl = info.headSculptureUrl || info.avatar || "";
const displayUrl = this.buildAvatarUrl(rawUrl);
if (displayUrl) {
this.imageValue = [
{
url: displayUrl,
extname: "",
name: "",
},
];
}
if (info.headSculptureUrl) {
this.imageUrl = info.headSculptureUrl;
}
},
// 拼装头像地址,兼容相对路径
buildAvatarUrl(url) {
const fallback = "/static/common/images/avatar_default.jpg";
if (!url) return fallback;
if (/^https?:\/\//i.test(url)) return url;
const baseUrl = this.baseUrl || this.$u?.http?.config?.baseUrl || "";
if (baseUrl) return `${baseUrl}/${url}`;
return url.startsWith("/") ? url : `/${url}`;
},
// 获取上传状态
onSelect(data) {
const file = (data && data.tempFiles && data.tempFiles[0]) || {};
const filePath =
file.path || file.url || (file.image && file.image.location);
if (!filePath) {
this.$u.toast("无法获取文件路径");
return;
}
this.$u.api
.UploadSingleImage({
filePath,
name: "file",
formData: {},
})
.then((res) => {
if (res.succeed) {
this.imageUrl = res.data.replace(/\\/g, "/") || "";
this.imageValue = [
{
url: `${this.baseUrl}/${this.imageUrl}`,
extname: file.extname || "",
name: "",
},
];
2026-01-27 16:17:49 +08:00
this.teacherInfo.headSculptureUrl = this.imageUrl;
2026-01-21 11:30:22 +08:00
// this.teacherInfo.avatar = this.imageValue[0].url;
this.$u.toast("上传成功");
} else {
this.$u.toast(res.error || "上传失败");
}
});
},
2025-07-22 09:39:42 +08:00
// 获取学院和专业信息
getSchoolInfo() {
this.$u.api.getData().then((res) => {
if (res.succeed && res.data) {
this.handleSchoolInfo(res);
}
});
},
// 处理获取的接口数据
handleSchoolInfo(res) {
// 处理学院信息
if (res.data && res.data.length > 0) {
// 设置学院列表
this.collegeList = res.data.map((item) => ({
value: item.value,
label: item.label,
}));
2026-01-21 11:30:22 +08:00
// 如果已有选择的学院则设置对应的学院ID
2025-07-22 09:39:42 +08:00
if (this.teacherInfo.collegeName) {
const selectedCollege = res.data.find(
(item) => item.label === this.teacherInfo.collegeName
);
2026-01-27 16:17:49 +08:00
if (selectedCollege) {
2025-07-22 09:39:42 +08:00
// 如果没有collegeManagementId则设置它
if (!this.teacherInfo.collegeManagementId) {
this.teacherInfo.collegeManagementId = selectedCollege.value;
}
}
}
}
},
// 确认学院选择
confirmCollege(e) {
this.teacherInfo.collegeName = e[0].label;
this.teacherInfo.collegeManagementId = e[0].value;
},
// 保存个人信息
saveInfo() {
// 表单验证
if (!this.teacherInfo.name) {
return this.$u.toast("请输入姓名");
}
2026-01-21 11:30:22 +08:00
// if (!this.teacherInfo.schoolName) {
// return this.$u.toast("请输入学校名称");
// }
2025-07-22 09:39:42 +08:00
if (!this.teacherInfo.collegeName) {
return this.$u.toast("请选择学院");
}
this.$u.vuex("vuex_teacherInfo", this.teacherInfo);
2026-01-21 11:30:22 +08:00
2025-07-22 09:39:42 +08:00
console.log("this.teacherInfo----", this.teacherInfo);
2026-01-27 16:17:49 +08:00
const persistedInfo = this.vuex_teacherInfo || {};
2025-07-22 09:39:42 +08:00
let query = {
2026-01-27 16:17:49 +08:00
...persistedInfo,
2025-07-22 09:39:42 +08:00
...this.teacherInfo,
2026-01-27 16:17:49 +08:00
collegeName: this.teacherInfo.collegeName || persistedInfo.collegeName,
collegeManagementId:
this.teacherInfo.collegeManagementId ||
persistedInfo.collegeManagementId,
2026-01-21 11:30:22 +08:00
// schoolName: "江西新能源科技职业技术学院",
2025-07-22 09:39:42 +08:00
};
2026-01-21 11:30:22 +08:00
console.log('query',query);
2025-07-22 09:39:42 +08:00
this.$u.api
.updateTeacherInfo(query)
.then((res) => {
this.$u.toast("保存成功");
setTimeout(() => {
uni.navigateBack();
}, 1500);
})
.catch((err) => {
this.$u.toast("保存失败,请重试");
});
// 模拟保存成功
this.$u.toast("保存成功");
setTimeout(() => {
uni.navigateBack();
}, 1500);
},
},
};
</script>
<style scoped>
.personal-info {
height: 100vh;
background-image: url("@/static/notes/bg.png");
background-position: center top;
background-repeat: no-repeat;
background-size: 100% auto;
display: flex;
flex-direction: column;
position: relative;
}
.content-wrapper {
flex: 1;
display: flex;
flex-direction: column;
padding: 20rpx 30rpx 60px;
overflow: hidden;
}
.form-container {
border-radius: 8px;
margin-top: 46rpx;
}
.form-item {
display: flex;
justify-content: space-between;
align-items: center;
padding: 30rpx;
border-radius: 20rpx;
margin-bottom: 20rpx;
background-color: #fff;
}
.form-merge {
display: flex;
flex-direction: column;
border-radius: 20rpx;
background-color: #fff;
}
.form-item-merge {
display: flex;
justify-content: space-between;
align-items: center;
padding: 30rpx;
}
.line {
width: 90%;
height: 1px;
background-color: #f0f0f0;
margin: 0 auto;
}
.form-label {
font-size: 28rpx;
font-weight: 500;
color: #333;
flex-shrink: 0;
width: 160rpx;
}
.form-value {
display: flex;
align-items: center;
font-size: 27rpx;
font-weight: 500;
color: #333;
flex: 1;
justify-content: flex-end;
text-align: right;
}
.avatar {
width: 52rpx;
height: 52rpx;
border-radius: 50%;
margin-right: 20rpx;
}
.save-btn {
width: 90%;
height: 90rpx;
line-height: 90rpx;
text-align: center;
color: #fff;
background: #4f6aff;
border-radius: 16rpx;
margin: 60rpx auto;
font-size: 32rpx;
font-weight: bold;
display: fixed;
bottom: 0;
}
</style>