361 lines
9.2 KiB
Vue
361 lines
9.2 KiB
Vue
|
<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">
|
|||
|
<image
|
|||
|
class="avatar"
|
|||
|
:src="teacherInfo.avatar || '@/static/notes/default-avatar.png'"
|
|||
|
mode="aspectFill"
|
|||
|
></image>
|
|||
|
</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">
|
|||
|
<div class="form-item-merge">
|
|||
|
<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>
|
|||
|
</div>
|
|||
|
<div class="line" style="height: 1px"></div>
|
|||
|
<div class="form-item-merge">
|
|||
|
<div class="form-label">学院</div>
|
|||
|
<div class="form-value" @click="showCollegePicker = true">
|
|||
|
{{ teacherInfo.collegeName || "请选择学院" }}
|
|||
|
<u-icon name="arrow-right" color="#999" size="24"></u-icon>
|
|||
|
</div>
|
|||
|
</div>
|
|||
|
<div class="line" style="height: 1px"></div>
|
|||
|
<div class="form-item-merge">
|
|||
|
<div class="form-label">专业</div>
|
|||
|
<div class="form-value" @click="showMajorPicker = true">
|
|||
|
{{ teacherInfo.professionalName || "请选择专业" }}
|
|||
|
<u-icon name="arrow-right" color="#999" size="24"></u-icon>
|
|||
|
</div>
|
|||
|
</div>
|
|||
|
<div class="line" style="height: 1px"></div>
|
|||
|
<div class="form-item-merge">
|
|||
|
<div class="form-label">岗位</div>
|
|||
|
<div class="form-value">
|
|||
|
<u-input
|
|||
|
v-model="teacherInfo.post"
|
|||
|
:border="false"
|
|||
|
placeholder="请输入岗位"
|
|||
|
:clearable="false"
|
|||
|
:custom-style="{ textAlign: 'right' }"
|
|||
|
></u-input>
|
|||
|
</div>
|
|||
|
</div>
|
|||
|
</div>
|
|||
|
</div>
|
|||
|
</div>
|
|||
|
<div class="save-btn" @click="saveInfo">保存</div>
|
|||
|
<!-- 学院选择器 -->
|
|||
|
<u-select
|
|||
|
v-model="showCollegePicker"
|
|||
|
:list="collegeList"
|
|||
|
@confirm="confirmCollege"
|
|||
|
></u-select>
|
|||
|
|
|||
|
<!-- 专业选择器 -->
|
|||
|
<u-select
|
|||
|
v-model="showMajorPicker"
|
|||
|
:list="majorList"
|
|||
|
@confirm="confirmMajor"
|
|||
|
></u-select>
|
|||
|
</div>
|
|||
|
</template>
|
|||
|
|
|||
|
<script>
|
|||
|
import PageHeader from "@/components/PageHeader.vue";
|
|||
|
|
|||
|
export default {
|
|||
|
name: "PersonalInfo",
|
|||
|
components: {
|
|||
|
PageHeader,
|
|||
|
},
|
|||
|
data() {
|
|||
|
return {
|
|||
|
teacherInfo: {
|
|||
|
name: "",
|
|||
|
id: "",
|
|||
|
collegeName: "",
|
|||
|
professionalName: "",
|
|||
|
post: "",
|
|||
|
collegeManagementId: "",
|
|||
|
professionalManagementId: "",
|
|||
|
schoolName: ""
|
|||
|
},
|
|||
|
headerBackground: {
|
|||
|
background: "transparent",
|
|||
|
},
|
|||
|
showCollegePicker: false,
|
|||
|
showMajorPicker: false,
|
|||
|
collegeList: [],
|
|||
|
majorList: [],
|
|||
|
};
|
|||
|
},
|
|||
|
onLoad() {
|
|||
|
// 从vuex获取教师信息
|
|||
|
const info = this.vuex_teacherInfo || {};
|
|||
|
this.teacherInfo = {
|
|||
|
...info,
|
|||
|
schoolName: "江西新能源科技职业技术学院",
|
|||
|
};
|
|||
|
|
|||
|
this.getSchoolInfo();
|
|||
|
},
|
|||
|
methods: {
|
|||
|
// 获取学院和专业信息
|
|||
|
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,
|
|||
|
}));
|
|||
|
|
|||
|
// 设置初始专业列表为第一个学院的专业
|
|||
|
if (res.data[0].children && res.data[0].children.length > 0) {
|
|||
|
this.majorList = res.data[0].children;
|
|||
|
}
|
|||
|
|
|||
|
// 如果已有选择的学院,则设置对应的专业列表
|
|||
|
if (this.teacherInfo.collegeName) {
|
|||
|
const selectedCollege = res.data.find(
|
|||
|
(item) => item.label === this.teacherInfo.collegeName
|
|||
|
);
|
|||
|
if (selectedCollege && selectedCollege.children) {
|
|||
|
this.majorList = selectedCollege.children;
|
|||
|
|
|||
|
// 如果没有collegeManagementId,则设置它
|
|||
|
if (!this.teacherInfo.collegeManagementId) {
|
|||
|
this.teacherInfo.collegeManagementId = selectedCollege.value;
|
|||
|
}
|
|||
|
|
|||
|
// 如果有专业名称但没有专业ID,则设置专业ID
|
|||
|
if (this.teacherInfo.professionalName && !this.teacherInfo.professionalManagementId) {
|
|||
|
const selectedMajor = selectedCollege.children.find(
|
|||
|
(item) => item.label === this.teacherInfo.professionalName
|
|||
|
);
|
|||
|
if (selectedMajor) {
|
|||
|
this.teacherInfo.professionalManagementId = selectedMajor.value;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
},
|
|||
|
|
|||
|
// 确认学院选择
|
|||
|
confirmCollege(e) {
|
|||
|
this.teacherInfo.collegeName = e[0].label;
|
|||
|
this.teacherInfo.collegeManagementId = e[0].value;
|
|||
|
|
|||
|
// 根据选中的学院更新专业列表
|
|||
|
this.$u.api.getData().then((res) => {
|
|||
|
if (res.succeed && res.data) {
|
|||
|
const selectedCollege = res.data.find(
|
|||
|
(item) => item.label === this.teacherInfo.collegeName
|
|||
|
);
|
|||
|
|
|||
|
if (selectedCollege && selectedCollege.children) {
|
|||
|
this.majorList = selectedCollege.children;
|
|||
|
// 清空之前选择的专业
|
|||
|
this.teacherInfo.professionalName = "";
|
|||
|
}
|
|||
|
}
|
|||
|
});
|
|||
|
},
|
|||
|
|
|||
|
// 确认专业选择
|
|||
|
confirmMajor(e) {
|
|||
|
this.teacherInfo.professionalName = e[0].label;
|
|||
|
this.teacherInfo.professionalManagementId = e[0].value;
|
|||
|
},
|
|||
|
|
|||
|
// 保存个人信息
|
|||
|
saveInfo() {
|
|||
|
// 表单验证
|
|||
|
if (!this.teacherInfo.name) {
|
|||
|
return this.$u.toast("请输入姓名");
|
|||
|
}
|
|||
|
if (!this.teacherInfo.schoolName) {
|
|||
|
return this.$u.toast("请输入学校名称");
|
|||
|
}
|
|||
|
if (!this.teacherInfo.collegeName) {
|
|||
|
return this.$u.toast("请选择学院");
|
|||
|
}
|
|||
|
if (!this.teacherInfo.professionalName) {
|
|||
|
return this.$u.toast("请选择专业");
|
|||
|
}
|
|||
|
if (!this.teacherInfo.post) {
|
|||
|
return this.$u.toast("请输入岗位");
|
|||
|
}
|
|||
|
|
|||
|
this.$u.vuex("vuex_teacherInfo", this.teacherInfo);
|
|||
|
console.log("this.teacherInfo----", this.teacherInfo);
|
|||
|
let query = {
|
|||
|
...this.teacherInfo,
|
|||
|
schoolName: "江西新能源科技职业技术学院",
|
|||
|
};
|
|||
|
|
|||
|
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>
|