浏览代码

学生注册信息

lifanagju_citu 2 月之前
父节点
当前提交
81c71ee152

+ 0 - 27
api/pickerData.js

@@ -1,27 +0,0 @@
-import request from "@/utils/request"
-
-// 学校列表
-export const schoolList = (data) => {
-  return request({
-    url: '/app-api/flames/school/list',
-    method: 'POST',
-    data,
-    custom: {
-      showLoading: false,
-      auth: false
-    }
-  })
-}
-
-// 院系列表
-export const departmentList = (data) => {
-  return request({
-    url: '/app-api/flames/school/department/list',
-    method: 'POST',
-    data,
-    custom: {
-      showLoading: false,
-      auth: false
-    }
-  })
-}

+ 37 - 1
api/student.js

@@ -89,4 +89,40 @@ export const getStudentPracticeCompanyList = async () => {
 			auth: true
 		}
 	})
-}
+}
+
+// 获取学校信息列表
+export const getSchoolList = async (params) => {
+	return request({
+		url: '/app-api/menduner/system/school/info/list',
+		params,
+		method: 'GET',
+		custom: {
+			auth: false
+		}
+	})
+}
+
+// 根据学校id获取院系列表
+export const getDepartmentListBySchoolId = async (params) => {
+	return request({
+		url: '/app-api/menduner/system/school/organization/list',
+		params,
+		method: 'GET',
+		custom: {
+			auth: false
+		}
+	})
+}
+
+// 获取专业列表
+export const getMajorList = async (params) => {
+	return request({
+    url: '/app-api/menduner/system/major/list',
+		params,
+		method: 'GET',
+		custom: {
+			auth: false
+		}
+	})
+}

+ 362 - 0
components/searchCombox/index.vue

@@ -0,0 +1,362 @@
+<template>
+	<view class="uni-combox" :class="border ? '' : 'uni-combox__no-border'">
+		<view class="uni-combox__input-box">
+			<input class="uni-combox__input" type="text" :placeholder="placeholder" placeholder-class="uni-combox__input-plac"
+				v-model="inputVal" @input="onInput" @focus="onFocus" @blur="onBlur" />
+			<uni-icons :type="showSelector? 'top' : 'bottom'" size="14" color="#999" @click="toggleSelector"></uni-icons>
+		</view>
+		<view class="uni-combox__selector" v-if="showSelector">
+			<view class="uni-popper__arrow"></view>
+			<scroll-view scroll-y="true" class="uni-combox__selector-scroll">
+				<view class="uni-combox__selector-empty" v-if="filterCandidatesLength === 0">
+					<text>{{emptyTips}}</text>
+				</view>
+				<view
+          class="uni-combox__selector-item"
+          v-for="(item,index) in filterCandidates" :key="index"
+          :style="item[valueKey] == dictVal ? 'font-weight: bold;background-color: ' + selectedBackground + ';color: ' + selectedColor : ''"
+					@click="onSelectorClick(index)"
+        >
+					<text>{{item[`${labelKey}`]}}</text>
+				</view>
+			</scroll-view>
+		</view>
+	</view>
+</template>
+
+<script>
+	/**
+	 * Combox 组合输入框
+	 * @description 组合输入框一般用于既可以输入也可以选择的场景
+	 * @tutorial https://ext.dcloud.net.cn/plugin?id=1261
+	 * @property {String} label 左侧文字
+	 * @property {String} labelWidth 左侧内容宽度
+	 * @property {String} placeholder 输入框占位符
+	 * @property {Array} candidates 候选项列表
+	 * @property {String} emptyTips 筛选结果为空时显示的文字
+	 * @property {String} value 组合框的值
+	 */
+  const _this = this
+  export default {
+		name: 'uniCombox',
+		emits: ['input', 'update:modelValue', 'onBlur'],
+		props: {
+			border: {
+				type: Boolean,
+				default: true
+			},
+			label: {
+				type: String,
+				default: ''
+			},
+			labelWidth: {
+				type: String,
+				default: 'auto'
+			},
+			keyValue: {
+				type: String,
+				default: ''
+			},
+			placeholder: {
+				type: String,
+				default: ''
+			},
+			candidates: {
+				type: Array,
+				default () {
+					return []
+				}
+			},
+			emptyTips: {
+				type: String,
+				default: '无匹配项'
+			},
+			itemTextName: {
+				type: String,
+				default: 'label'
+			},
+			itemValueName: {
+				type: String,
+				default: 'value'
+			},
+			labelKey: {
+				type: String,
+				default: 'text'
+			},
+			valueKey: {
+				type: String,
+				default: 'value'
+			},
+			// #ifndef VUE3
+			value: {
+				type: [String, Number],
+				default: ''
+			},
+			// #endif
+			// #ifdef VUE3
+			modelValue: {
+				type: [String, Number],
+				default: ''
+			},
+      // 被选中的背景颜色
+      selectedBackground: {
+        type: String,
+        default: '#e5e5e5',
+      },
+      // 被选中的字体颜色
+      selectedColor: {
+        type: String,
+        default: '#3774c6',
+      },
+			// #endif
+		},
+
+		data() {
+			return {
+				showSelector: false,
+				inputVal: '', //显示
+				dictVal: '', // id
+				filterCandidates: []
+			}
+		},
+		computed: {
+			labelStyle() {
+				if (this.labelWidth === 'auto') {
+					return ''
+				}
+				return `width: ${this.labelWidth}`
+			},
+			// 为了点击选择能够显示所有选项,把这个filterCandidates放在data中
+			// filterCandidates() {
+			// 	return this.candidates.filter((item) => {
+			// 		return item[`${this.labelKey}`].toString().indexOf(this.inputVal) > -1
+			// 	})
+			// },
+			filterCandidatesLength() {
+				return this.filterCandidates.length
+			}
+		},
+		watch: {
+			//默认值
+			keyValue: {
+				handler(newVal) {
+					this.inputVal = newVal
+				},
+				immediate: true
+			},
+			// #ifndef VUE3
+			value: {
+				handler(newVal) {
+					this.dictVal = newVal
+				},
+				immediate: true
+			},
+			// #endif
+			// #ifndef VUE3
+			// 因为获取列表是个异步的过程,需要对列表进行监听
+			candidates: function(arr) {
+				this.setLabel()
+				this.filterCandidates = arr.filter(item => {
+					return item[`${this.labelKey}`].toString().indexOf(this.inputVal) > -1
+				})
+			},
+			// #endif
+			// #ifdef VUE3
+			modelValue: {
+				handler(newVal) {
+					this.inputVal = newVal
+					this.dictVal = newVal
+					this.setLabel()
+				},
+				immediate: true,
+				deep: true
+			},
+			// #endif
+		},
+		methods: {
+			toggleSelector() {
+				this.showSelector = !this.showSelector
+			},
+			onFocus() {
+				this.filterCandidates = this.candidates
+				this.showSelector = true
+			},
+			onBlur() {
+				setTimeout(() => {
+					this.showSelector = false
+					//输入后赋值
+					// if (this.inputVal) {
+					// 	this.$emit('input', this.inputVal)
+					// 	this.$emit('update:modelValue', this.inputVal)
+					// }
+          this.$emit('onBlur')
+				}, 153)
+			},
+			onSelectorClick(index) {
+				this.dictVal = this.filterCandidates[index][`${this.valueKey}`]
+				//this.dictVal 的赋值一定要在this.inputVal前执行,
+				//因为this.filterCandidates会监听this.inputVal的变化被重新赋值
+				//这样在选择列表中非第一个选项会报错
+				this.inputVal = this.filterCandidates[index][`${this.labelKey}`]
+				this.showSelector = false
+				this.$emit('input', this.dictVal)
+				this.$emit('update:modelValue', this.dictVal)
+			},
+			onInput() {
+				this.filterCandidates = this.candidates.filter(item => {
+					return item[`${this.labelKey}`].toString().indexOf(this.inputVal) > -1
+				})
+				setTimeout(() => {
+          if (!this.inputVal) this.dictVal = this.inputVal
+					this.$emit('input', this.inputVal)
+					this.$emit('update:modelValue', this.inputVal)
+				})
+			},
+			setLabel() {
+				this.$nextTick(()=>{
+					if (this.candidates?.length > 0 && this.dictVal) {
+						const obj = this.candidates.find(item => item[`${this.valueKey}`] === this.dictVal)
+						if (obj) {
+							this.inputVal = obj[`${this.labelKey}`]
+						}
+					}
+				})
+			},
+			getOnInputValueObj() {
+        return { [this.itemTextName]: this.inputVal, [this.itemValueName]: null }
+			},
+			getOnInputValue() {
+        return this.inputVal
+			}
+		}
+	}
+</script>
+
+<style lang="scss">
+	.uni-combox {
+		font-weight: 300;
+		font-size: 28upx;
+		background-color: #fff;
+		border: #c6adad solid 2upx;
+		border-radius: 6upx;
+		padding: 12upx 20upx;
+		position: relative;
+		/* #ifndef APP-NVUE */
+		display: flex;
+		/* #endif */
+		// height: 40px;
+		flex-direction: row;
+		align-items: center;
+		// border-bottom: solid 1px #DDDDDD;
+	}
+
+	.uni-combox__label {
+		font-size: 16px;
+		line-height: 22px;
+		padding-right: 10px;
+		color: #999999;
+	}
+
+	.uni-combox__input-box {
+		position: relative;
+		/* #ifndef APP-NVUE */
+		display: flex;
+		/* #endif */
+		flex: 1;
+		flex-direction: row;
+		align-items: center;
+	}
+
+	.uni-combox__input {
+		flex: 1;
+		font-size: 28upx;
+		height: 22px;
+		line-height: 22px;
+	}
+
+	.uni-combox__input-plac {
+		font-size: 14px;
+		color: grey;
+		font-weight: 300;
+	}
+
+	.uni-combox__selector {
+		/* #ifndef APP-NVUE */
+		box-sizing: border-box;
+		/* #endif */
+		position: absolute;
+		top: calc(100% + 12px);
+		left: 0;
+		width: 100%;
+		background-color: #FFFFFF;
+		border: 1px solid #EBEEF5;
+		border-radius: 6px;
+		box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1);
+		z-index: 999;
+		padding: 4px 0;
+	}
+
+	.uni-combox__selector-scroll {
+		/* #ifndef APP-NVUE */
+		max-height: 200px;
+		box-sizing: border-box;
+		/* #endif */
+	}
+
+	.uni-combox__selector-empty,
+	.uni-combox__selector-item {
+		/* #ifndef APP-NVUE */
+		display: flex;
+		cursor: pointer;
+		/* #endif */
+		line-height: 36px;
+		font-size: 28upx;
+		text-align: center;
+		// border-bottom: solid 1px #DDDDDD;
+		padding: 0px 10px;
+	}
+
+	.uni-combox__selector-item:hover {
+		background-color: #f9f9f9;
+	}
+
+	.uni-combox__selector-empty:last-child,
+	.uni-combox__selector-item:last-child {
+		/* #ifndef APP-NVUE */
+		border-bottom: none;
+		/* #endif */
+	}
+
+	// picker 弹出层通用的指示小三角
+	.uni-popper__arrow,
+	.uni-popper__arrow::after {
+		position: absolute;
+		display: block;
+		width: 0;
+		height: 0;
+		border-color: transparent;
+		border-style: solid;
+		border-width: 6px;
+	}
+
+	.uni-popper__arrow {
+		filter: drop-shadow(0 2px 12px rgba(0, 0, 0, 0.03));
+		top: -6px;
+		left: 10%;
+		margin-right: 3px;
+		border-top-width: 0;
+		border-bottom-color: #EBEEF5;
+	}
+
+	.uni-popper__arrow::after {
+		content: " ";
+		top: 1px;
+		margin-left: -6px;
+		border-top-width: 0;
+		border-bottom-color: #fff;
+	}
+
+	.uni-combox__no-border {
+		border: none;
+	}
+</style>

+ 80 - 40
layout/components/authModal/selectUserType/studentInfoForm.vue

@@ -38,16 +38,17 @@
           <uni-datetime-picker type="date" return-type="timestamp" v-model="formData.birthday" />
         </uni-forms-item>
         <uni-forms-item name="schoolId" label="就读学校" required>
-          <uni-data-picker v-model="formData.schoolId" :localdata="schools" :clear-icon="false" popup-title="请选择就读学校" @change="getDepartmentList" :map="{ text: 'schoolName', value: 'schoolId' }"></uni-data-picker>
+          <uni-data-picker v-model="formData.schoolId" :localdata="selects?.schools" :clear-icon="false" popup-title="请选择就读学校" @change="getSelectData(0)" :map="{ text: 'name', value: 'schoolId' }"></uni-data-picker>
         </uni-forms-item>
-        <uni-forms-item name="schoolDepartmentName" label="所在院系" required>
-          <uni-data-picker v-model="formData.schoolDepartmentName" :localdata="schoolDepartmentList" :clear-icon="false" popup-title="请选择所在院系" :map="{ text: 'departmentTitle', value: 'schoolDepartmentId' }"></uni-data-picker>
+        <uni-forms-item name="schoolDeptId" label="所在院系" required>
+          <uni-data-picker v-model="formData.schoolDeptId" :localdata="selects?.dept" :clear-icon="false" popup-title="请选择所在院系" @change="getSelectData(2)" :map="{ text: 'name', value: 'id' }"></uni-data-picker>
         </uni-forms-item>
-        <uni-forms-item name="majorName" label="所学专业" required>
-          <uni-easyinput placeholder="请输入所学专业" v-model="formData.majorName" :inputBorder="false" type="text"></uni-easyinput>
+        <uni-forms-item name="majorId" label="所学专业" required>
+          <uni-data-picker v-model="formData.majorId" :localdata="selects?.major" :clear-icon="false" popup-title="请选择所学专业" @change="getSelectData(2)" :map="{ text: 'nameCn', value: 'id' }"></uni-data-picker>
         </uni-forms-item>
-        <uni-forms-item name="schoolClassName" label="所在班级" required>
-          <uni-easyinput placeholder="请填写所在班级" v-model="formData.schoolClassName" :inputBorder="false" type="text"></uni-easyinput>
+        <uni-forms-item name="schoolClassId" label="所在班级" required>
+          <searchComBox ref="schoolClassIdRef" v-model="formData.schoolClassId" :candidates="classList" itemTextName='schoolClassName' itemValueName='schoolClassId' labelKey='name' valueKey='id' placeholder="请选择所在班级"></searchComBox>
+
         </uni-forms-item>
         <uni-forms-item name="studentNo" label="学号" required>
           <uni-easyinput placeholder="请填写学号" v-model="formData.studentNo" :inputBorder="false" type="text"></uni-easyinput>
@@ -80,7 +81,8 @@ import { saveStudentSimpleInfo } from '@/api/user'
 import { showAuthModal } from '@/hooks/useModal'
 import { userStore } from '@/store/user'; const useUserStore = userStore()
 import { uploadFile } from '@/api/file'
-import { schoolList, departmentList } from '@/api/pickerData'
+import { getSchoolList, getDepartmentListBySchoolId, getMajorList } from '@/api/student'
+import searchComBox from '@/components/searchCombox'
 
 const baseInfoRef = ref()
 const formData = ref({ // 必填项目
@@ -90,10 +92,12 @@ const formData = ref({ // 必填项目
   phone: null,
   birthday: '1990-01-01',
   schoolId: null,
-  schoolDepartmentName: null,
-  majorName: null,
+  schoolDeptId: null,
+  majorId: null,
+  schoolClassId: null,
   schoolClassName: null,
   studentNo: null,
+  idCardNo: null,
   emergencyContactName: null,
   emergencyContactPhone: null,
 })
@@ -110,29 +114,55 @@ onMounted(() => {
   })
 })
 
-const schools = ref([])
-// // 学校下拉列表
-const getSchoolListData = async () => {
-  const res = await schoolList({current: 1, size: 9999})
-  schools.value = res?.data?.records?.length ? res.data.records : []
+// // 下拉列表 
+const selects = ref({})
+const classList = ref([])
+const getSelectData = async (type = 'default', init = false) => { // type: 0院系|1专业|2班级
+  const params = { ...(type !== 'default' && { type }) }
+  // 查院系用 schoolId 查班级用 parentId
+  if (type === 0) {
+    if (!formData.value?.schoolId) return
+    params.schoolId = formData.value.schoolId
+  }
+  if (type === 2) {
+    if (!formData.value?.schoolId && !formData.value?.schoolDeptId) return
+    if (formData.value?.schoolId) params.schoolId = formData.value.schoolId
+    if (formData.value?.schoolDeptId) params.parentId = formData.value.schoolDeptId
+  }
+  const api = {
+    default: getSchoolList,
+    0: getDepartmentListBySchoolId,
+    1: getMajorList,
+    2: getDepartmentListBySchoolId,
+  }
+  const res = await api[type](params)
+  if (type === 'default') {
+    selects.value.schools = res?.data?.length ? res.data : []
+  }
+  if (type === 0) {
+    if (!init) {
+      formData.value.schoolDeptId = null
+      formData.value.schoolClassId = null
+    }
+    selects.value.dept = res?.data?.length ? res.data : []
+  }
+  if (type === 1) {
+    selects.value.major = res?.data?.length ? res.data : []
+  }
+  if (type === 2) {
+    if (!init) formData.value.schoolClassId = null
+    classList.value = res?.data?.length ? res.data : []
+    schoolClassIdRef.value && schoolClassIdRef.value.setLabel()
+  }
 }
-getSchoolListData()
 
-const schoolDepartmentList = ref([])
-const getDepartmentList = async (event) => {
-  const e = event?.detail?.value?.length ? event.detail.value[0].value : ''
-  if (!e) return
-  
-  const query = {
-    page: { size: 9999,	current: 1	},
-    entity: { schoolId: e }
-  }
-  schoolDepartmentList.value = []
-  formData.value.schoolDepartmentName = null
-  const res = await departmentList(query)
-  const list = res?.data?.records?.length ? res.data.records : []
-  schoolDepartmentList.value = list.map(e => e.entity)
+const getSelection = async () => {
+  await getSelectData('default', true)
+  await getSelectData(0, true)
+  await getSelectData(1, true)
+  await getSelectData(2, true)
 }
+getSelection()
 
 const formRules = {
 	avatar:{
@@ -147,25 +177,25 @@ const formRules = {
   idCardNo: isValidIdCard18,
   phone: mobile,
   birthday:{
-		rules: [{required: true, errorMessage: '请选择就读学校' }]
+		rules: [{required: true, errorMessage: '请选择出生日期' }]
 	},
   schoolId:{
+		rules: [{required: true, errorMessage: '请选择就读学校' }]
+	},
+  schoolDeptId:{
 		rules: [{required: true, errorMessage: '请选择所在院系' }]
 	},
-  schoolDepartmentName:{
-		rules: [{required: true, errorMessage: '请输入所学专业' }]
+  majorId: {
+		rules: [{required: true, errorMessage: '请填写所在专业' }]
 	},
-  majorName: {
+  schoolClassId: {
 		rules: [{required: true, errorMessage: '请填写所在班级' }]
 	},
-  schoolClassName: {
-		rules: [{required: true, errorMessage: '请填写学号' }]
-	},
   studentNo: {
-		rules: [{required: true, errorMessage: '请填写紧急联系人姓名' }]
+		rules: [{required: true, errorMessage: '请填写学号' }]
 	},
   emergencyContactName: {
-		rules: [{required: true, errorMessage: '请填写紧急联系人手机号' }]
+		rules: [{required: true, errorMessage: '请填写紧急联系人姓名' }]
 	},
   emergencyContactPhone: mobile,
 }
@@ -220,11 +250,21 @@ const uploadPhotos = () => {
   })
 }
 
+const schoolClassIdRef = ref()
 const submit = async () => {
   const validate = await unref(baseInfoRef).validate()
   if (!validate) return uni.showToast({ title: '请将信息补充完整', icon: 'none' })
+  
+  let params = {...formData.value}
+
+  const schoolClassInput = schoolClassIdRef.value?.getOnInputValue()
+  const schoolClassObj = schoolClassIdRef.value?.getOnInputValueObj()
+  if (schoolClassInput === params.schoolClassId) {
+    params = {...params, ...schoolClassObj}
+  }
+
   try {
-    await saveStudentSimpleInfo(formData.value)
+    await saveStudentSimpleInfo(params)
     uni.showToast({ title: '保存成功', icon: 'none' })
     await useUserStore.getInfo()
   } catch (err) {

+ 2 - 0
pages/index/my.vue

@@ -89,6 +89,8 @@ onShow(() => {
     currentTabBar?.setData({ selected: 4 });
 })
 
+// showAuthModal('selectUserType') //测试 selectUserType
+
 const inputDialog = ref()
 const useUserStore = userStore()
 const baseInfo = computed(() => useUserStore?.baseInfo)

+ 74 - 44
pagesA/student/information.vue

@@ -12,16 +12,16 @@
         labelAlign="right"
       >
         <uni-forms-item name="schoolId" label="就读学校" required>
-          <uni-data-picker v-model="formData.schoolId" :localdata="schools" :clear-icon="false" popup-title="请选择就读学校" @change="getDepartmentList" :map="{ text: 'schoolName', value: 'schoolId' }"></uni-data-picker>
+          <uni-data-picker v-model="formData.schoolId" :localdata="selects?.schools" :clear-icon="false" popup-title="请选择就读学校" @change="getSelectData(0)" :map="{ text: 'name', value: 'schoolId' }"></uni-data-picker>
         </uni-forms-item>
-        <uni-forms-item name="schoolDepartmentName" label="所在院系" required>
-          <uni-data-picker v-model="formData.schoolDepartmentName" :localdata="schoolDepartmentList" :clear-icon="false" popup-title="请选择所在院系" :map="{ text: 'departmentTitle', value: 'departmentTitle' }"></uni-data-picker>
+        <uni-forms-item name="schoolDeptId" label="所在院系" required>
+          <uni-data-picker v-model="formData.schoolDeptId" :localdata="selects?.dept" :clear-icon="false" popup-title="请选择所在院系" @change="getSelectData(2)" :map="{ text: 'name', value: 'id' }"></uni-data-picker>
         </uni-forms-item>
-        <uni-forms-item name="majorName" label="所学专业" required>
-          <uni-easyinput placeholder="请输入所学专业" v-model="formData.majorName" :inputBorder="false" type="text"></uni-easyinput>
+        <uni-forms-item name="majorId" label="所学专业" required>
+          <uni-data-picker v-model="formData.majorId" :localdata="selects?.major" :clear-icon="false" popup-title="请选择所学专业" @change="getSelectData(2)" :map="{ text: 'nameCn', value: 'id' }"></uni-data-picker>
         </uni-forms-item>
-        <uni-forms-item name="schoolClassName" label="所在班级" required>
-          <uni-easyinput placeholder="请填写所在班级" v-model="formData.schoolClassName" :inputBorder="false" type="text"></uni-easyinput>
+        <uni-forms-item name="schoolClassId" label="所在班级" required>
+          <searchComBox ref="schoolClassIdRef" v-model="formData.schoolClassId" :candidates="classList" itemTextName='schoolClassName' itemValueName='schoolClassId' labelKey='name' valueKey='id' placeholder="请选择所在班级"></searchComBox>
         </uni-forms-item>
         <uni-forms-item name="studentNo" label="学号" required>
           <uni-easyinput placeholder="请填写学号" v-model="formData.studentNo" :inputBorder="false" type="text"></uni-easyinput>
@@ -48,13 +48,15 @@ import { ref, unref } from 'vue'
 import { mobile, isValidIdCard18 } from '@/utils/validate'
 import { saveStudentSimpleInfo, getStudentInfo } from '@/api/user'
 // import { userStore } from '@/store/user'; const useUserStore = userStore()
-import { schoolList, departmentList } from '@/api/pickerData'
+import { getSchoolList, getDepartmentListBySchoolId, getMajorList } from '@/api/student'
+import searchComBox from '@/components/searchCombox'
 
 const baseInfoRef = ref()
 const formData = ref({ // 必填项目
   schoolId: null,
-  schoolDepartmentName: null,
-  majorName: null,
+  schoolDeptId: null,
+  majorId: null,
+  schoolClassId: null,
   schoolClassName: null,
   studentNo: null,
   idCardNo: null,
@@ -66,66 +68,94 @@ const formData = ref({ // 必填项目
 const studentInfoFun = async () => {
   const { data } = await getStudentInfo()
   // 回显
-  formData.value = { ...formData.value, ...data }
-  getDepartmentList()
+  Object.keys(data).length && Object.keys(formData.value).length && Object.keys(formData.value).forEach(key => formData.value[key] = data[key])
+  // if (!formData.value?.schoolClassId && formData.value?.schoolClassName) formData.value.schoolClassId = formData.value.schoolClassName
+  await getSelectData('default', true)
+  await getSelectData(0, true)
+  await getSelectData(1, true)
+  await getSelectData(2, true)
 }
 studentInfoFun()
 
-const schools = ref([])
-// // 学校下拉列表
-const getSchoolListData = async () => {
-  const res = await schoolList({current: 1, size: 9999})
-  schools.value = res?.data?.records?.length ? res.data.records : []
-}
-getSchoolListData()
-
-const schoolDepartmentList = ref([])
-const getDepartmentList = async (e) => {
-  if (!formData.value?.schoolId) return
-  const query = {
-    page: { size: 9999,	current: 1	},
-    entity: { schoolId: formData.value.schoolId }
+// // 下拉列表 
+const selects = ref({})
+const classList = ref([])
+const getSelectData = async (type = 'default', init = false) => { // type: 0院系|1专业|2班级
+  const params = { ...(type !== 'default' && { type }) }
+  // 查院系用 schoolId 查班级用 parentId
+  if (type === 0) {
+    if (!formData.value?.schoolId) return
+    params.schoolId = formData.value.schoolId
+  }
+  if (type === 2) {
+    if (!formData.value?.schoolId && !formData.value?.schoolDeptId) return
+    if (formData.value?.schoolId) params.schoolId = formData.value.schoolId
+    if (formData.value?.schoolDeptId) params.parentId = formData.value.schoolDeptId
+  }
+  const api = {
+    default: getSchoolList,
+    0: getDepartmentListBySchoolId,
+    1: getMajorList,
+    2: getDepartmentListBySchoolId,
+  }
+  const res = await api[type](params)
+  if (type === 'default') {
+    selects.value.schools = res?.data?.length ? res.data : []
+  }
+  if (type === 0) {
+    if (!init) {
+      formData.value.schoolDeptId = null
+      formData.value.schoolClassId = null
+    }
+    selects.value.dept = res?.data?.length ? res.data : []
+  }
+  if (type === 1) {
+    selects.value.major = res?.data?.length ? res.data : []
+  }
+  if (type === 2) {
+    if (!init) formData.value.schoolClassId = null
+    classList.value = res?.data?.length ? res.data : []
+    schoolClassIdRef.value && schoolClassIdRef.value.setLabel()
   }
-  schoolDepartmentList.value = []
-  if (e) formData.value.schoolDepartmentName = null // 切换学校的时清院系
-  const res = await departmentList(query)
-  const list = res?.data?.records?.length ? res.data.records : []
-  schoolDepartmentList.value = list.map(e => e.entity)
 }
 
 const formRules = {
   idCardNo: isValidIdCard18,
   phone: mobile,
   schoolId:{
+		rules: [{required: true, errorMessage: '请选择就读学校' }]
+	},
+  schoolDeptId:{
 		rules: [{required: true, errorMessage: '请选择所在院系' }]
 	},
-  schoolDepartmentName:{
-		rules: [{required: true, errorMessage: '请输入所学专业' }]
+  majorId: {
+		rules: [{required: true, errorMessage: '请填写所在专业' }]
 	},
-  majorName: {
+  schoolClassId: {
 		rules: [{required: true, errorMessage: '请填写所在班级' }]
 	},
-  schoolClassName: {
-		rules: [{required: true, errorMessage: '请填写学号' }]
-	},
   studentNo: {
-		rules: [{required: true, errorMessage: '请填写紧急联系人姓名' }]
+		rules: [{required: true, errorMessage: '请填写学号' }]
 	},
   emergencyContactName: {
-		rules: [{required: true, errorMessage: '请填写紧急联系人手机号' }]
+		rules: [{required: true, errorMessage: '请填写紧急联系人姓名' }]
 	},
   emergencyContactPhone: mobile,
 }
 
+const schoolClassIdRef = ref()
 const submit = async () => {
   const validate = await unref(baseInfoRef).validate()
   if (!validate) return uni.showToast({ title: '请将信息补充完整', icon: 'none' })
-  // 学校名称
-  formData.value.schoolName = schools.value.find(e => e.schoolId === formData.value.schoolId)?.schoolName
-  
-  
+  let params = {...formData.value}
+
+  const schoolClassInput = schoolClassIdRef.value?.getOnInputValue()
+  const schoolClassObj = schoolClassIdRef.value?.getOnInputValueObj()
+  if (schoolClassInput === params.schoolClassId) {
+    params = {...params, ...schoolClassObj}
+  }
   try {
-    await saveStudentSimpleInfo(formData.value)
+    await saveStudentSimpleInfo(params)
     uni.showToast({
 			icon: 'success',
 			title: '保存成功'