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> |