shmily1213 преди 1 месец
родител
ревизия
528435b3f9

+ 6 - 2
src/api/modules/system.ts

@@ -1,5 +1,5 @@
 import flyio from "../flyio";
-import { ApiCaptchaResponse, ApiResponse, DictItem, ConfigItem } from "@/types";
+import { ApiCaptchaResponse, ApiResponse, DictItem, ConfigItem, System, ApiResponseList } from "@/types";
 import { SmsRequestDTO } from "@/types/user";
 
 /**
@@ -54,7 +54,11 @@ export function sendSms(params: SmsRequestDTO) {
  * @returns 
  */
 export function getProvinces() {
-  return flyio.get('/front/user/provinces') as Promise<ApiResponse<DictItem[]>>;
+  // return flyio.get('/front/user/provinces') as Promise<ApiResponse<DictItem[]>>;
+  const params = {
+    columns: 'id,full_name,parent_id,has_children'
+  }
+  return flyio.get('/system/area/list/tree', { params }) as Promise<ApiResponseList<System.ProvinceItem>>;
 }
 
 /**

+ 5 - 1
src/common/enum.ts

@@ -184,7 +184,11 @@ export enum EnumBindScene {
   /**
    * 登录绑定
    */
-  LOGIN_BIND = 'login_bind'
+  LOGIN_BIND = 'login_bind',
+  /**
+   * 老师或者代理商完善信息
+   */
+  IMPROVE = 'improve'
 }
 
 export enum EnumExamType {

+ 3 - 2
src/components/ie-picker/ie-picker.vue

@@ -123,6 +123,7 @@ const init = () => {
     matchValue.value = true;
     return;
   }
+
   if (modelValue.value !== null && modelValue.value !== undefined && modelValue.value !== '') {
     const index = props.list.findIndex(item => item[props.keyValue] == modelValue.value);
     if (index !== -1) {
@@ -132,8 +133,8 @@ const init = () => {
     } else {
       // 如果找不到匹配项,重置状态
       defaultIndex.value = [0];
-      label.value = props.placeholder;
-      matchValue.value = false;
+      label.value = modelValue.value + '';
+      matchValue.value = true;
     }
   } else {
     defaultIndex.value = [0];

+ 1 - 9
src/composables/useExam.ts

@@ -335,15 +335,7 @@ export const useExam = () => {
   }
   // 是否可以切换上一题
   const prevEnable = computed(() => {
-    // return currentIndex.value > 0;
-    if (currentQuestion.value) {
-      if (currentQuestion.value.isSubQuestion) {
-        return subQuestionIndex.value > 0;
-      } else {
-        return currentIndex.value > 0;
-      }
-    }
-    return false;
+    return virtualCurrentIndex.value > 0;
   });
   // 是否可以切换下一题
   const nextEnable = computed(() => {

+ 15 - 7
src/composables/useExamType.ts

@@ -1,7 +1,7 @@
 import { EnumDictName } from "@/common/enum";
 import { useDictStore } from "@/store/dictStore";
 import { useAppStore } from "@/store/appStore";
-import { DictItem } from "@/types";
+import { DictItem, System } from "@/types";
 import { getExamMajors, getExamTypes, getGraduateYears, getProvinces } from "@/api/modules/system";
 import { StudentExamInfo, UserInfo } from "@/types/user";
 const dictStore = useDictStore();
@@ -9,13 +9,13 @@ const appStore = useAppStore();
 
 export const useExamType = () => {
   const form = ref<Partial<Pick<StudentExamInfo, 'location' | 'examType' | 'endYear' | 'majorType'>>>({})
-  const provinceList = ref<DictItem[]>([]);
+  const provinceList = ref<System.ProvinceItem[]>([]);
   const examTypeList = ref<DictItem[]>([]);
   const examMajorList = ref<DictItem[]>([]);
   const endYearList = ref<DictItem[]>([]);
   const loadProvinceData = async () => {
-    const { data } = await getProvinces();
-    provinceList.value = data;
+    const { rows } = await getProvinces();
+    provinceList.value = rows;
   }
   const loadExamTypeData = async () => {
     if (form.value.location) {
@@ -43,12 +43,20 @@ export const useExamType = () => {
     }
   }
   watch(() => form.value.location, (val) => {
-    form.value.examType = '';
-    form.value.majorType = '';
-    form.value.endYear = undefined;
+    console.log('监听到省份数据', val)
+    if (examTypeList.value.length) {
+      form.value.examType = undefined;
+    }
+    if (examMajorList.value.length) {
+      form.value.majorType = '';
+    }
+    if (endYearList.value.length) {
+     form.value.endYear = undefined; 
+    }
     if (val) {
       loadExamTypeData();
     }
+    loadGraduateYearData();
   });
   watch(() => form.value.examType, (val) => {
     if (val) {

+ 1 - 1
src/hooks/useSms.ts

@@ -14,7 +14,7 @@ export const useSms = () => {
   const { setItem, getItem, removeItem } = useUniStore();
 
   // 状态常量定义
-  const SMS_COUNTDOWN_TIME = 60; // 倒计时时长(秒)
+  const SMS_COUNTDOWN_TIME = 5; // 倒计时时长(秒)
   const STORAGE_KEYS = {
     LAST_TIME: 'ie-smsLastTime',
     WAIT_TIME: 'ie-smsWaitTime'

+ 1 - 1
src/pagesMain/pages/index/components/index-popup.vue

@@ -18,7 +18,7 @@
               <view class="flex items-center px-42 bg-back rounded-15 h-104 box-border">
                 <view class="flex-shrink-0">所在省份</view>
                 <ie-picker ref="pickerRef" v-model="form.location" :list="provinceList" :customStyle="customStyle"
-                  placeholder="请选择" key-label="dictLabel" key-value="dictValue">
+                  placeholder="请选择" key-label="areaName" key-value="shortName">
                 </ie-picker>
               </view>
               <view class="mt-30 flex items-center px-42 bg-back rounded-15 h-104 box-border">

+ 1 - 1
src/pagesMain/pages/index/index.vue

@@ -89,7 +89,7 @@ onPageScroll((e) => {
 onShow(() => {
   setTimeout(() => {
     checkProvinceInfo();
-    checkTeacherInfo();
+    // checkTeacherInfo();
   }, 500);
   isHide.value = false;
   setTimeout(() => {

+ 10 - 10
src/pagesMain/pages/me/components/me-menu.vue

@@ -13,7 +13,7 @@
     <view class="-mt-10 rounded-8 py-20">
       <uv-cell-group :border="false">
         <uv-cell isLink :cellStyle="cellStyle"
-          @click="handleNavigate('/pagesSystem/pages/edit-student-profile/edit-student-profile', '基本资料')">
+          @click="handleEditInfo">
           <template #title>
             <view class="flex items-center gap-x-10">
               <ie-image src="/static/personal/icon_jibenziliao@2x.png" custom-class="w-34 h-34" />
@@ -22,15 +22,6 @@
           </template>
 
         </uv-cell>
-        <!-- <uv-cell isLink :cellStyle="cellStyle"
-          @click="handleNavigate('/pagesOther/pages/personal-center/change-pwd/change-pwd', '修改密码')">
-          <template #title>
-            <view class="flex items-center gap-x-10">
-              <ie-image src="/static/personal/icon_password@2x.png" custom-class="w-36 h-36" />
-              <text class="text-30 text-fore-subtitle">修改密码</text>
-            </view>
-          </template>
-        </uv-cell> -->
         <uv-cell isLink :cellStyle="cellStyle" @click="handleQuestion">
           <template #title>
             <view class="flex items-center gap-x-10">
@@ -104,6 +95,15 @@ const handleNavigate = async (pagePath: string, title: string) => {
     });
   }
 }
+const handleEditInfo = () => {
+  if (userStore.isStudent) {
+    handleNavigate('/pagesSystem/pages/edit-student-profile/edit-student-profile', '基本资料')
+  } else {
+    transferTo('/pagesSystem/pages/edit-teacher-profile/edit-teacher-profile', {
+      data: {}
+    });
+  }
+}
 const handleQuestion = async () => {
   transferTo('/pagesOther/pages/h5/h5', {
     data: {

+ 457 - 0
src/pagesSystem/pages/bind-profile/bind-profile copy.vue

@@ -0,0 +1,457 @@
+<template>
+  <ie-page bg-color="#F6F8FA" :safeAreaInsetBottom="false">
+    <ie-navbar title="完善信息"></ie-navbar>
+    <uv-form labelPosition="left" :model="form" labelWidth="70px" ref="formRef">
+      <content-card title="个人信息">
+        <uv-form-item label="姓名" prop="name" borderBottom required>
+          <uv-input v-model="form.nickName" border="none" placeholder="请输入姓名" placeholderClass="text-30"
+            font-size="30rpx" :custom-style="customStyle">
+          </uv-input>
+        </uv-form-item>
+        <uv-form-item label="所在省份" prop="location" borderBottom required>
+          <ie-picker ref="pickerRef" v-model="examTypeForm.location" :list="provinceList"
+            :placeholder="pickerPlaceholder" :custom-style="customStyle" key-label="dictLabel" key-value="dictValue"
+            :disabled="isProvinceDisabled">
+            <template v-if="isProvinceDisabled" #right>
+              <ie-image src="/static/image/icon-lock.png" custom-class="w-24 h-30" mode="aspectFill" />
+            </template>
+          </ie-picker>
+        </uv-form-item>
+        <uv-form-item label="考生类别" prop="examType" borderBottom required>
+          <ie-picker ref="pickerRef" v-model="examTypeForm.examType" :list="examTypeList" :disabled="isExamTypeDisabled"
+            :placeholder="pickerPlaceholder" :custom-style="customStyle" key-label="dictLabel" key-value="dictValue">
+            <template v-if="isExamTypeDisabled" #right>
+              <ie-image src="/static/image/icon-lock.png" custom-class="w-24 h-30" mode="aspectFill" />
+            </template>
+          </ie-picker>
+        </uv-form-item>
+        <uv-form-item v-if="examTypeForm.examType === 'VHS'" label="专业类别" prop="majorType" borderBottom required>
+          <ie-picker ref="pickerRef" v-model="examTypeForm.majorType" :list="examMajorList"
+            :disabled="!examTypeForm.examType" :placeholder="pickerPlaceholder" :custom-style="customStyle"
+            key-label="dictLabel" key-value="dictValue"></ie-picker>
+        </uv-form-item>
+        <uv-form-item label="单招年份" prop="year" required>
+          <ie-picker ref="pickerRef" v-model="examTypeForm.endYear" :list="endYearList"
+            :disabled="!examTypeForm.examType" :placeholder="pickerPlaceholder" :custom-style="customStyle"
+            key-label="dictLabel" key-value="dictValue"></ie-picker>
+        </uv-form-item>
+
+      </content-card>
+      <content-card title="邀请信息">
+        <uv-form-item label="邀请码" prop="form.inviteCode">
+          <uv-input v-model="form.inviteCode" border="none" placeholder="请输入邀请码(非必填)" font-size="30rpx"
+            :custom-style="customStyle">
+          </uv-input>
+        </uv-form-item>
+      </content-card>
+      <content-card v-if="showCulture" title="文化素质">
+        <uv-form-item label="语文" prop="form.scores.chinese" borderBottom :required="isBindMode">
+          <uv-input v-model.number="scoresForm.chinese" border="none" type="number" :placeholder="inputPlaceholder"
+            font-size="30rpx" :custom-style="customStyle">
+          </uv-input>
+        </uv-form-item>
+        <uv-form-item label="数学" prop="form.score.mathematics" borderBottom :required="isBindMode">
+          <uv-input v-model.number="scoresForm.mathematics" border="none" type="number" :placeholder="inputPlaceholder"
+            font-size="30rpx" :custom-style="customStyle">
+          </uv-input>
+        </uv-form-item>
+        <uv-form-item label="外语" prop="form.scores.foreign" borderBottom :required="isBindMode">
+          <uv-input v-model.number="scoresForm.foreign" border="none" type="number" :placeholder="inputPlaceholder"
+            font-size="30rpx" :custom-style="customStyle">
+          </uv-input>
+        </uv-form-item>
+        <uv-form-item label="物理" prop="form.scores.physics" borderBottom :required="isBindMode">
+          <uv-input v-model.number="scoresForm.physics" border="none" type="number" :placeholder="inputPlaceholder"
+            font-size="30rpx" :custom-style="customStyle">
+          </uv-input>
+        </uv-form-item>
+        <uv-form-item label="政治" prop="form.scores.political" :required="isBindMode">
+          <uv-input v-model.number="scoresForm.political" border="none" type="number" :placeholder="inputPlaceholder"
+            font-size="30rpx" :custom-style="customStyle">
+          </uv-input>
+        </uv-form-item>
+      </content-card>
+      <content-card v-if="isBindMode" title="学校信息">
+        <template #right>
+          <view class="text-26 text-primary underline" @click="handleNoSchool">没有我的学校班级?</view>
+        </template>
+        <uv-form-item label="学校名称" prop="form.name" borderBottom :required="isBindMode">
+          <ie-picker ref="pickerRef" v-model="form.schoolName" disabled :placeholder="pickerPlaceholder"
+            :custom-style="customStyle" :custom-label="form.schoolName" @click="handleSchoolSelect">
+            <template v-if="isSchoolDisabled" #right>
+              <ie-image src="/static/image/icon-lock.png" custom-class="w-24 h-30" mode="aspectFill" />
+            </template>
+          </ie-picker>
+        </uv-form-item>
+        <uv-form-item label="所在班级" prop="form.name" :required="isBindMode">
+          <ie-picker ref="pickerRef" v-model="form.classId" :list="classList" :disabled="!form.schoolId" title="选择班级"
+            placeholder="请选择" :custom-style="customStyle" key-label="name" key-value="classId"></ie-picker>
+        </uv-form-item>
+      </content-card>
+    </uv-form>
+    <ie-safe-toolbar :height="84" :shadow="false">
+      <view class="px-46 pt-24">
+        <ie-button @click="handleSubmit">确认提交</ie-button>
+      </view>
+    </ie-safe-toolbar>
+  </ie-page>
+</template>
+
+<script lang="ts" setup>
+import ContentCard from '../../components/content-card.vue';
+import { useUserStore } from '@/store/userStore';
+import { registry, improve, improveWithToken } from '@/api/modules/login';
+import { useTransferPage } from '@/hooks/useTransferPage';
+import { useExamType } from '@/composables/useExamType';
+import { useAppStore } from '@/store/appStore';
+import { BindCardInfo, CardInfo, ClassItem, LoginInfo, RegisterInfo, SchoolItem, Scores, UserInfo } from '@/types/user';
+
+import { getClassList } from '@/api/modules/user';
+import { EnumBindScene, EnumExamRecordType, EnumExamType } from '@/common/enum';
+type PrevDataInfo = {
+  cardInfo: CardInfo;
+  userInfo: UserInfo;
+  registerInfo: RegisterInfo;
+  scene: EnumBindScene;
+  token: string; // 绑定已有账号时需要 token
+}
+
+const { form: examTypeForm, examTypeList, examMajorList, provinceList, endYearList } = useExamType();
+const userStore = useUserStore();
+const { prevData, transferTo, transferBack } = useTransferPage();
+
+const form = ref<Partial<BindCardInfo>>({});
+const scoresForm = ref<Scores>({})
+const formRef = ref();
+const customStyle = {
+  paddingLeft: '26px'
+};
+
+const isBindMode = computed(() => [EnumBindScene.LOGIN_BIND, EnumBindScene.REGISTER_BIND].includes(prevData.value.scene));
+const isSchoolDisabled = computed(() => isBindMode.value && prevData.value.cardInfo.assignSchoolId);
+const isProvinceDisabled = computed(() => isBindMode.value && prevData.value.cardInfo.assignLocation);
+const isExamTypeDisabled = computed(() => (isBindMode.value && prevData.value.cardInfo.assignExamType) || !examTypeForm.value.location);
+const contactPhone = computed(() => userStore.orgInfo.contactPhone);
+const inputPlaceholder = computed(() => {
+  return isBindMode.value ? '请输入(提交后不可修改)' : '请输入';
+});
+const pickerPlaceholder = computed(() => {
+  return isBindMode.value ? '请选择(提交后不可修改)' : '请选择';
+});
+
+const classList = ref<ClassItem[]>([]);
+const showCulture = computed(() => {
+  return examTypeForm.value.examType === EnumExamType.OHS;
+});
+const handleNoSchool = () => {
+  if (!contactPhone.value) {
+    uni.$ie.showToast('请联系客服处理');
+    return;
+  }
+  uni.showActionSheet({
+    title: '联系客服处理',
+    itemList: [`拨打电话:${contactPhone.value}`],
+    success: (res) => {
+      uni.makePhoneCall({
+        phoneNumber: contactPhone.value
+      });
+    }
+  });
+}
+const handleSchoolSelect = () => {
+  // if (isSchoolDisabled.value || !examTypeForm.value.examType) {
+  //   return;
+  // }
+  transferTo('/pagesSystem/pages/school-select/school-select', {
+    data: {
+      examType: examTypeForm.value.examType,
+    }
+  }).then(res => {
+    if (res) {
+      const school = res as SchoolItem;
+      form.value.schoolId = school.id;
+      form.value.schoolName = school.name;
+      console.log(form.value)
+      form.value.classId = undefined;
+      classList.value = [];
+      handleGetClassList();
+    }
+  });
+}
+const handleGetClassList = () => {
+  if (!form.value.schoolId) {
+    return;
+  }
+  getClassList({ schoolId: form.value.schoolId }).then(res => {
+    classList.value = res.data;
+    console.log(classList.value)
+  });
+}
+
+
+const loginValidate = () => {
+  form.value = {
+    ...form.value,
+    ...examTypeForm.value,
+  }
+  const { nickName, location, examType, endYear } = form.value;
+  if (!nickName || nickName.trim() === '') {
+    uni.$ie.showToast('请输入姓名');
+    return false;
+  }
+  if (!location || location.trim() === '') {
+    uni.$ie.showToast('请选择省份');
+    return false;
+  }
+  if (!examType || examType.trim() === '') {
+    uni.$ie.showToast('请选择考生类别');
+    return false;
+  }
+  if (examType === 'VHS') {
+    if (!form.value.majorType) {
+      uni.$ie.showToast('请选择专业类别');
+      return false;
+    }
+  }
+  if (!endYear) {
+    uni.$ie.showToast('请选择毕业年份');
+    return false;
+  }
+  if (showCulture.value) {
+    if (isBindMode.value) {
+      if (!scoresForm.value.chinese || scoresForm.value.chinese < 0 || scoresForm.value.chinese > 100) {
+        uni.$ie.showToast('请输入正确的语文成绩');
+        return false;
+      }
+    }
+    if (isBindMode.value) {
+      if (!scoresForm.value.mathematics || scoresForm.value.mathematics < 0 || scoresForm.value.mathematics > 100) {
+        uni.$ie.showToast('请输入正确的数学成绩');
+        return false;
+      }
+    }
+    if (isBindMode.value) {
+      if (!scoresForm.value.foreign || scoresForm.value.foreign < 0 || scoresForm.value.foreign > 100) {
+        uni.$ie.showToast('请输入正确的外语成绩');
+        return false;
+      }
+    }
+    if (isBindMode.value) {
+      if (!scoresForm.value.physics || scoresForm.value.physics < 0 || scoresForm.value.physics > 100) {
+        uni.$ie.showToast('请输入正确的物理成绩');
+        return false;
+      }
+    }
+    if (isBindMode.value) {
+      if (!scoresForm.value.political || scoresForm.value.political < 0 || scoresForm.value.political > 100) {
+        uni.$ie.showToast('请输入正确的政治成绩');
+        return false;
+      }
+    }
+  }
+  if (isBindMode.value) {
+    if (!form.value.schoolId) {
+      uni.$ie.showToast('请选择学校');
+      return false;
+    }
+  }
+  if (isBindMode.value) {
+    if (!form.value.classId) {
+      uni.$ie.showToast('请选择班级');
+      return false;
+    }
+  }
+  return true;
+}
+const handleSubmit = async () => {
+  const valid = loginValidate();
+  if (valid) {
+    let params = {
+      ...form.value,
+      ...examTypeForm.value,
+      scores: scoresForm.value,
+    };
+
+    // 接下来补充注册登录信息
+    try {
+      if (prevData.value.scene === EnumBindScene.REGISTER) {
+        startRegister(params as BindCardInfo);
+      } else {
+        // startRegisterBind(params as BindCardInfo);
+        // params = {
+        //   ...params,
+        //   username: prevData.value.registerInfo.username,
+        //   password: prevData.value.registerInfo.password,
+        // };
+        console.log('初步提交信息:', params);
+        if (prevData.value.scene === EnumBindScene.LOGIN_BIND) {
+          startLoginBind(params as BindCardInfo);
+        } else {
+          startRegister(params as BindCardInfo);
+        }
+      }
+      // if (isBindMode.value) {
+      //   const { cardNo, password } = prevData.value;
+      //   params = {
+      //     ...params,
+      //     username: cardNo,
+      //     password,
+      //   }
+      //   console.log('params', params)
+      //   if (prevData.value.scene === 'card_improve') {
+      //     startRegister(params as BindCardInfo);
+      //   } else {
+      //     startRegisterBind(params as BindCardInfo)
+      //   }
+      // } else {
+      //   const { mobile, password, code, uuid } = prevData.value;
+      //   params = {
+      //     ...params,
+      //     mobile,
+      //     password,
+      //     code,
+      //     uuid,
+      //   }
+      //   startRegister(params as BindCardInfo);
+      // }
+    } catch (error) {
+      console.error(error)
+    }
+  }
+}
+
+const startLoginBind = async (params: BindCardInfo) => {
+  uni.$ie.showLoading();
+  const token = prevData.value.token;
+  await improveWithToken(params, token);
+  uni.$ie.hideLoading();
+  uni.$ie.showSuccess('绑定成功');
+  const userStore = useUserStore();
+  userStore.setToken(token);
+  setTimeout(() => {
+    userStore.getUserInfo();
+    goHome();
+  }, 50);
+}
+
+// const startRegisterBind = async (params: BindCardInfo) => {
+//   uni.$ie.showLoading();
+//   await improve(params);
+//   uni.$ie.hideLoading();
+//   uni.$ie.showSuccess('绑定成功');
+//   userStore.getUserInfo();
+//   goHome();
+// }
+
+const startRegister = async (params: BindCardInfo) => {
+  uni.$ie.showLoading();
+  const { token } = await registry(params);
+  if (token) {
+    const { success } = await userStore.login(token);
+    uni.$ie.hideLoading();
+    uni.$ie.showSuccess('登录成功');
+    if (success) {
+      goHome();
+    }
+  }
+}
+
+const goHome = () => {
+  setTimeout(() => {
+    transferTo('/pagesMain/pages/index/index', {
+      type: 'reLaunch'
+    });
+  }, 800);
+}
+
+const gatherInfo = () => {
+  console.log('数据预览:', prevData.value)
+  // const { scene, card, phone, code, uuid } = prevData.value;
+  let { cardInfo = {} as CardInfo, userInfo = {} as UserInfo, registerInfo = {} as RegisterInfo, scene, token } = prevData.value as PrevDataInfo;
+  form.value = {
+    code: registerInfo.code,
+    uuid: registerInfo.uuid,
+    mobile: registerInfo.mobile,
+    username: registerInfo.username,
+    password: registerInfo.password,
+  }
+  // 注册时,如果以游客身份使用过,则从临时信息中获取省份和考试类型
+  if (scene === EnumBindScene.REGISTER) {
+    console.log('自动填写临时信息:', userStore.tempInfo)
+    examTypeForm.value.location = userStore.tempInfo?.location;
+    setTimeout(() => {
+      examTypeForm.value.examType = userStore.tempInfo!.examType;
+    }, 0);
+  } else if ([EnumBindScene.LOGIN_BIND, EnumBindScene.REGISTER_BIND].includes(scene)) {
+    // 已有卡信息,补充信息
+    if (scene === EnumBindScene.LOGIN_BIND) {
+      form.value = {
+        ...form.value,
+        ...userInfo,
+      };
+    }
+    form.value = {
+      ...form.value,
+      schoolName: cardInfo.assignSchoolName,
+      schoolId: cardInfo.assignSchoolId,
+      classId: cardInfo.classId,
+      //
+      // code: registerInfo.code,
+      // uuid: registerInfo.uuid,
+      // mobile: registerInfo.mobile,
+      // username: registerInfo.username,
+      // password: registerInfo.password,
+    };
+    // 考生相关信息
+    examTypeForm.value.location = cardInfo.assignLocation || userInfo.location || '';
+    setTimeout(() => {
+      examTypeForm.value.examType = cardInfo.assignExamType || userInfo.examType || '';
+      examTypeForm.value.endYear = cardInfo.endYear || userInfo.endYear;
+    }, 0);
+    examTypeForm.value.majorType = userInfo.majorType || '';
+    // 
+    scoresForm.value = userInfo.scores || {};
+    handleGetClassList();
+  }
+  console.log('初始化整理的信息:')
+  console.log('form.value:', form.value)
+  console.log('examTypeForm.value:', examTypeForm.value)
+  console.log('scoresForm.value:', scoresForm.value)
+  // if (scene === EnumBindScene.LOGIN_BIND) {
+  // 未登录用户卡注册登录
+  // form.value = {
+  // nickName,
+  // scores,
+  // 下面 3 个属性卡的优先级更高
+  // location: assignLocation || location,
+  // examType: assignExamType || examType,
+  // endYear: cardEndYear || userEndYear,
+  // majorType: majorType || userMajorType,
+  // schoolId: assignSchoolId,
+  // schoolName: assignSchoolName,
+  // classId: classId,
+  // mobile: phone
+  // code
+  // };
+  // handleGetClassList();
+  // } else if (scene === 'phone_improve') {
+  // 已登录用户绑卡
+  // const { nickName, location, examType, endYear, scores } = userStore.userInfo;
+  // const { nickName, location, examType, endYear, scores } = prevData.value.userInfo;
+  // form.value = {
+  //   nickName,
+  //   location,
+  //   examType,
+  //   // endYear,
+  //   scores
+  // };
+  // scoresForm.value = scores;
+  // }
+}
+
+onLoad(() => {
+  gatherInfo();
+});
+</script>
+
+<style lang="scss" scoped></style>

+ 89 - 71
src/pagesSystem/pages/bind-profile/bind-profile.vue

@@ -10,7 +10,7 @@
         </uv-form-item>
         <uv-form-item label="所在省份" prop="location" borderBottom required>
           <ie-picker ref="pickerRef" v-model="examTypeForm.location" :list="provinceList"
-            :placeholder="pickerPlaceholder" :custom-style="customStyle" key-label="dictLabel" key-value="dictValue"
+            :placeholder="pickerPlaceholder" :custom-style="customStyle" key-label="areaName" key-value="shortName"
             :disabled="isProvinceDisabled">
             <template v-if="isProvinceDisabled" #right>
               <ie-image src="/static/image/icon-lock.png" custom-class="w-24 h-30" mode="aspectFill" />
@@ -19,7 +19,8 @@
         </uv-form-item>
         <uv-form-item label="考生类别" prop="examType" borderBottom required>
           <ie-picker ref="pickerRef" v-model="examTypeForm.examType" :list="examTypeList" :disabled="isExamTypeDisabled"
-            :placeholder="pickerPlaceholder" :custom-style="customStyle" key-label="dictLabel" key-value="dictValue">
+            :placeholder="pickerPlaceholder" :custom-style="customStyle" key-label="dictLabel" key-value="dictValue"
+            @click="handlePreCheck('examType')">
             <template v-if="isExamTypeDisabled" #right>
               <ie-image src="/static/image/icon-lock.png" custom-class="w-24 h-30" mode="aspectFill" />
             </template>
@@ -33,17 +34,18 @@
         <uv-form-item label="单招年份" prop="year" required>
           <ie-picker ref="pickerRef" v-model="examTypeForm.endYear" :list="endYearList"
             :disabled="!examTypeForm.examType" :placeholder="pickerPlaceholder" :custom-style="customStyle"
-            key-label="dictLabel" key-value="dictValue"></ie-picker>
+            key-label="dictLabel" key-value="dictValue" @click="handlePreCheck('endYear')"></ie-picker>
         </uv-form-item>
 
       </content-card>
-      <content-card title="邀请信息">
+      <content-card v-if="showInviteInfo" title="邀请信息">
         <uv-form-item label="邀请码" prop="form.inviteCode">
           <uv-input v-model="form.inviteCode" border="none" placeholder="请输入邀请码(非必填)" font-size="30rpx"
             :custom-style="customStyle">
           </uv-input>
         </uv-form-item>
       </content-card>
+
       <content-card v-if="showCulture" title="文化素质">
         <uv-form-item label="语文" prop="form.scores.chinese" borderBottom :required="isBindMode">
           <uv-input v-model.number="scoresForm.chinese" border="none" type="number" :placeholder="inputPlaceholder"
@@ -71,11 +73,12 @@
           </uv-input>
         </uv-form-item>
       </content-card>
-      <content-card v-if="isBindMode" title="学校信息">
-        <template #right>
+
+      <content-card v-if="showSchoolInfo" title="学校信息">
+        <template v-if="!isImproveMode" #right>
           <view class="text-26 text-primary underline" @click="handleNoSchool">没有我的学校班级?</view>
         </template>
-        <uv-form-item label="学校名称" prop="form.name" borderBottom :required="isBindMode">
+        <uv-form-item v-if="showSchoolName" label="学校名称" prop="form.name" borderBottom :required="isBindMode">
           <ie-picker ref="pickerRef" v-model="form.schoolName" disabled :placeholder="pickerPlaceholder"
             :custom-style="customStyle" :custom-label="form.schoolName" @click="handleSchoolSelect">
             <template v-if="isSchoolDisabled" #right>
@@ -83,10 +86,24 @@
             </template>
           </ie-picker>
         </uv-form-item>
-        <uv-form-item label="所在班级" prop="form.name" :required="isBindMode">
-          <ie-picker ref="pickerRef" v-model="form.classId" :list="classList" :disabled="!form.schoolId" title="选择班级"
-            placeholder="请选择" :custom-style="customStyle" key-label="name" key-value="classId"></ie-picker>
-        </uv-form-item>
+        <template v-if="showClassName">
+          <uv-form-item v-if="isImproveMode" label="所在班级" prop="form.name" :required="isBindMode">
+            <ie-picker ref="pickerRef" v-model="form.schoolClassName" :list="classList" title="选择班级" placeholder="请选择"
+              disabled :custom-style="customStyle" key-label="name" key-value="classId">
+              <template #right>
+                <ie-image src="/static/image/icon-lock.png" custom-class="w-24 h-30" mode="aspectFill" />
+              </template>
+            </ie-picker>
+          </uv-form-item>
+          <uv-form-item v-else label="所在班级" prop="form.name" :required="isBindMode">
+            <ie-picker ref="pickerRef" v-model="form.classId" :list="classList" :disabled="!form.schoolId" title="选择班级"
+              placeholder="请选择" :custom-style="customStyle" key-label="name" key-value="classId">
+              <template v-if="isClassDisabled" #right>
+                <ie-image src="/static/image/icon-lock.png" custom-class="w-24 h-30" mode="aspectFill" />
+              </template>
+            </ie-picker>
+          </uv-form-item>
+        </template>
       </content-card>
     </uv-form>
     <ie-safe-toolbar :height="84" :shadow="false">
@@ -107,7 +124,7 @@ import { useAppStore } from '@/store/appStore';
 import { BindCardInfo, CardInfo, ClassItem, LoginInfo, RegisterInfo, SchoolItem, Scores, UserInfo } from '@/types/user';
 
 import { getClassList } from '@/api/modules/user';
-import { EnumBindScene, EnumExamRecordType, EnumExamType } from '@/common/enum';
+import { EnumBindScene, EnumExamRecordType, EnumExamType, EnumUserType } from '@/common/enum';
 type PrevDataInfo = {
   cardInfo: CardInfo;
   userInfo: UserInfo;
@@ -128,9 +145,11 @@ const customStyle = {
 };
 
 const isBindMode = computed(() => [EnumBindScene.LOGIN_BIND, EnumBindScene.REGISTER_BIND].includes(prevData.value.scene));
-const isSchoolDisabled = computed(() => isBindMode.value && prevData.value.cardInfo.assignSchoolId);
-const isProvinceDisabled = computed(() => isBindMode.value && prevData.value.cardInfo.assignLocation);
-const isExamTypeDisabled = computed(() => (isBindMode.value && prevData.value.cardInfo.assignExamType) || !examTypeForm.value.location);
+const isImproveMode = computed(() => prevData.value.scene === EnumBindScene.IMPROVE);
+const isSchoolDisabled = computed(() => (isBindMode.value && !!prevData.value.cardInfo.assignSchoolId) || isImproveMode.value);
+const isClassDisabled = computed(() => (isBindMode.value && !!prevData.value.cardInfo.classId) || isImproveMode.value);
+const isProvinceDisabled = computed(() => isBindMode.value && !!prevData.value.cardInfo.assignLocation);
+const isExamTypeDisabled = computed(() => (isBindMode.value && !!prevData.value.cardInfo.assignExamType));
 const contactPhone = computed(() => userStore.orgInfo.contactPhone);
 const inputPlaceholder = computed(() => {
   return isBindMode.value ? '请输入(提交后不可修改)' : '请输入';
@@ -138,6 +157,16 @@ const inputPlaceholder = computed(() => {
 const pickerPlaceholder = computed(() => {
   return isBindMode.value ? '请选择(提交后不可修改)' : '请选择';
 });
+const showInviteInfo = computed(() => {
+  return !isImproveMode.value;
+})
+const showSchoolInfo = computed(() => {
+  return isBindMode.value || isImproveMode.value;
+})
+// 代理机构不显示学校
+const showSchoolName = computed(() => userStore.userInfo.userType !== EnumUserType.AGENT);
+// 代理机构不显示班级
+const showClassName = computed(() => userStore.userInfo.userType !== EnumUserType.AGENT);
 
 const classList = ref<ClassItem[]>([]);
 const showCulture = computed(() => {
@@ -159,9 +188,13 @@ const handleNoSchool = () => {
   });
 }
 const handleSchoolSelect = () => {
-  // if (isSchoolDisabled.value || !examTypeForm.value.examType) {
-  //   return;
-  // }
+  if (isSchoolDisabled.value || !examTypeForm.value.examType) {
+    return;
+  }
+  // 老师已有学校信息
+  if (isImproveMode.value) {
+    return;
+  }
   transferTo('/pagesSystem/pages/school-select/school-select', {
     data: {
       examType: examTypeForm.value.examType,
@@ -188,6 +221,34 @@ const handleGetClassList = () => {
   });
 }
 
+const handlePreCheck = (type: string) => {
+  switch (type) {
+    case 'examType': {
+      if (isExamTypeDisabled.value) {
+        return true;
+      }
+      const { location } = examTypeForm.value;
+      if (!location) {
+        uni.$ie.showToast('请选择省份');
+        return false;
+      }
+      return true;
+    }
+    case 'endYear': {
+      const { examType } = examTypeForm.value;
+      const result = handlePreCheck('examType');
+      if (!result) {
+        return false;
+      }
+      if (!examType) {
+        uni.$ie.showToast('请选择考生类别');
+        return false;
+      }
+      return true;
+    }
+  }
+}
+
 
 const loginValidate = () => {
   form.value = {
@@ -334,23 +395,15 @@ const startLoginBind = async (params: BindCardInfo) => {
   }, 50);
 }
 
-// const startRegisterBind = async (params: BindCardInfo) => {
-//   uni.$ie.showLoading();
-//   await improve(params);
-//   uni.$ie.hideLoading();
-//   uni.$ie.showSuccess('绑定成功');
-//   userStore.getUserInfo();
-//   goHome();
-// }
-
 const startRegister = async (params: BindCardInfo) => {
+  console.log(params, 1111)
   uni.$ie.showLoading();
   const { token } = await registry(params);
   if (token) {
-    const isLogin = await userStore.login(token);
+    const { success } = await userStore.login(token);
     uni.$ie.hideLoading();
     uni.$ie.showSuccess('登录成功');
-    if (isLogin) {
+    if (success) {
       goHome();
     }
   }
@@ -366,7 +419,6 @@ const goHome = () => {
 
 const gatherInfo = () => {
   console.log('数据预览:', prevData.value)
-  // const { scene, card, phone, code, uuid } = prevData.value;
   let { cardInfo = {} as CardInfo, userInfo = {} as UserInfo, registerInfo = {} as RegisterInfo, scene, token } = prevData.value as PrevDataInfo;
   form.value = {
     code: registerInfo.code,
@@ -395,58 +447,24 @@ const gatherInfo = () => {
       schoolName: cardInfo.assignSchoolName,
       schoolId: cardInfo.assignSchoolId,
       classId: cardInfo.classId,
-      //
-      // code: registerInfo.code,
-      // uuid: registerInfo.uuid,
-      // mobile: registerInfo.mobile,
-      // username: registerInfo.username,
-      // password: registerInfo.password,
     };
     // 考生相关信息
     examTypeForm.value.location = cardInfo.assignLocation || userInfo.location || '';
+    console.log(examTypeForm.value.location)
     setTimeout(() => {
-      examTypeForm.value.examType = cardInfo.assignExamType || userInfo.examType || '';
+      examTypeForm.value.examType = cardInfo.assignExamType || userInfo.examType || undefined;
       examTypeForm.value.endYear = cardInfo.endYear || userInfo.endYear;
     }, 0);
     examTypeForm.value.majorType = userInfo.majorType || '';
     // 
     scoresForm.value = userInfo.scores || {};
     handleGetClassList();
+  } else if (scene === EnumBindScene.IMPROVE) {
+    form.value = {
+      ...form.value,
+      ...userStore.userInfo
+    }
   }
-  console.log('初始化整理的信息:')
-  console.log('form.value:', form.value)
-  console.log('examTypeForm.value:', examTypeForm.value)
-  console.log('scoresForm.value:', scoresForm.value)
-  // if (scene === EnumBindScene.LOGIN_BIND) {
-  // 未登录用户卡注册登录
-  // form.value = {
-  // nickName,
-  // scores,
-  // 下面 3 个属性卡的优先级更高
-  // location: assignLocation || location,
-  // examType: assignExamType || examType,
-  // endYear: cardEndYear || userEndYear,
-  // majorType: majorType || userMajorType,
-  // schoolId: assignSchoolId,
-  // schoolName: assignSchoolName,
-  // classId: classId,
-  // mobile: phone
-  // code
-  // };
-  // handleGetClassList();
-  // } else if (scene === 'phone_improve') {
-  // 已登录用户绑卡
-  // const { nickName, location, examType, endYear, scores } = userStore.userInfo;
-  // const { nickName, location, examType, endYear, scores } = prevData.value.userInfo;
-  // form.value = {
-  //   nickName,
-  //   location,
-  //   examType,
-  //   // endYear,
-  //   scores
-  // };
-  // scoresForm.value = scores;
-  // }
 }
 
 onLoad(() => {

+ 102 - 0
src/pagesSystem/pages/edit-teacher-profile/edit-teacher-profile copy.vue

@@ -0,0 +1,102 @@
+<template>
+  <ie-page bg-color="#F6F8FA" :safeAreaInsetBottom="false">
+    <ie-navbar title="完善信息" custom-back @left-click="handleBack" />
+    <uv-form labelPosition="left" :model="examTypeForm" labelWidth="70px" ref="formRef">
+      <content-card title="个人信息">
+        <uv-form-item label="姓名" prop="name" borderBottom>
+          <uv-input v-model="form.nickName" border="none" placeholder="请输入姓名"
+            placeholderClass="text-30" font-size="30rpx" :custom-style="customStyle">
+          </uv-input>
+        </uv-form-item>
+        <uv-form-item label="所在省份" prop="location" borderBottom required>
+          <ie-picker ref="pickerRef" v-model="examTypeForm.location" :list="provinceList" placeholder="选择省份"
+            :custom-style="customStyle" key-label="dictLabel" key-value="dictValue"></ie-picker>
+        </uv-form-item>
+        <uv-form-item label="考生类别" prop="examType" borderBottom required>
+          <ie-picker ref="pickerRef" v-model="examTypeForm.examType" :list="examTypeList"
+            :disabled="!examTypeForm.location" placeholder="选择考生类别" :custom-style="customStyle" key-label="dictLabel"
+            key-value="dictValue"></ie-picker>
+        </uv-form-item>
+        <uv-form-item label="毕业年份" prop="year" required>
+          <ie-picker ref="pickerRef" v-model="examTypeForm.endYear" :list="endYearList"
+            :disabled="!examTypeForm.examType" placeholder="选择毕业年份" :custom-style="customStyle" key-label="dictLabel"
+            key-value="dictValue"></ie-picker>
+        </uv-form-item>
+      </content-card>
+    </uv-form>
+    <ie-safe-toolbar :height="84" :shadow="false">
+      <view class="px-30 py-16">
+        <ie-button @click="handleSubmit">确认提交</ie-button>
+      </view>
+    </ie-safe-toolbar>
+  </ie-page>
+</template>
+
+<script lang="ts" setup>
+import ContentCard from '@/pagesSystem/components/content-card.vue';
+import { useExamType } from '@/composables/useExamType';
+import { updateUserInfo } from '@/api/modules/login';
+import { useUserStore } from '@/store/userStore';
+import { UserInfo } from '@/types/user';
+import { useTransferPage } from '@/hooks/useTransferPage';
+const { prevData, transferTo, transferBack } = useTransferPage();
+const { form: examTypeForm, examTypeList, examMajorList, provinceList, endYearList } = useExamType();
+const userStore = useUserStore();
+const userInfo = computed(() => userStore.userInfo);
+const cardInfo = computed(() => userStore.card);
+const customStyle = {
+  paddingLeft: '26px'
+};
+type SchoolInfo = {
+  schoolName: string;
+  classId: number | null;
+  className: string;
+  schoolId: number | null;
+}
+type UserProfile = Pick<UserInfo, 'nickName' | 'phonenumber' | 'location' | 'endYear' | 'examType'> & SchoolInfo;
+const form = ref<UserProfile>({
+  ...userInfo.value,
+  schoolName: cardInfo.value?.schoolName || '',
+  classId: cardInfo.value?.classId || null,
+  className: cardInfo.value?.className || '',
+  schoolId: cardInfo.value?.schoolId || null
+});
+
+const handleBack = () => {
+  uni.$ie.showToast('请先完善信息');
+};
+const handleSubmit = async () => {
+  console.log('handleSubmit', examTypeForm.value)
+  const { location, examType, endYear } = examTypeForm.value;
+  if (!location) {
+    uni.$ie.showToast('请先选择所在省份');
+    return;
+  }
+  if (!examType) {
+    uni.$ie.showToast('请先选择考试类别');
+    return;
+  }
+  if (!endYear) {
+    uni.$ie.showToast('请先选择毕业年份');
+    return;
+  }
+  const params = {
+    ...userStore.userInfo,
+    location,
+    examType,
+    endYear,
+  } as UserInfo;
+  uni.$ie.showLoading();
+  await updateUserInfo(params);
+  await userStore.getUserInfo();
+  uni.$ie.hideLoading();
+  uni.$ie.showToast('保存成功');
+  setTimeout(() => {
+    transferTo('/pagesMain/pages/index/index', {
+      type: 'reLaunch'
+    });
+  }, 800);
+};
+</script>
+
+<style></style>

+ 188 - 23
src/pagesSystem/pages/edit-teacher-profile/edit-teacher-profile.vue

@@ -2,20 +2,99 @@
   <ie-page bg-color="#F6F8FA" :safeAreaInsetBottom="false">
     <ie-navbar title="完善信息" custom-back @left-click="handleBack" />
     <uv-form labelPosition="left" :model="examTypeForm" labelWidth="70px" ref="formRef">
-      <content-card title="基本信息">
+      <content-card title="个人信息">
+        <uv-form-item label="姓名" prop="name" borderBottom>
+          <uv-input v-model="form.nickName" border="none" placeholder="请输入姓名" placeholderClass="text-30"
+            font-size="30rpx" :custom-style="customStyle">
+          </uv-input>
+        </uv-form-item>
         <uv-form-item label="所在省份" prop="location" borderBottom required>
-          <ie-picker ref="pickerRef" v-model="examTypeForm.location" :list="provinceList" placeholder="选择省份"
-            :custom-style="customStyle" key-label="dictLabel" key-value="dictValue"></ie-picker>
+          <ie-picker ref="pickerRef" v-model="examTypeForm.location" :list="provinceList"
+            :placeholder="pickerPlaceholder" :custom-style="customStyle" key-label="areaName" key-value="shortName"
+            :disabled="disabledEdit">
+            <template v-if="disabledEdit" #right>
+              <ie-image src="/static/image/icon-lock.png" custom-class="w-24 h-30" mode="aspectFill" />
+            </template></ie-picker>
         </uv-form-item>
         <uv-form-item label="考生类别" prop="examType" borderBottom required>
           <ie-picker ref="pickerRef" v-model="examTypeForm.examType" :list="examTypeList"
-            :disabled="!examTypeForm.location" placeholder="选择考生类别" :custom-style="customStyle" key-label="dictLabel"
-            key-value="dictValue"></ie-picker>
+            :disabled="!examTypeForm.location || disabledEdit" :placeholder="pickerPlaceholder"
+            :custom-style="customStyle" key-label="dictLabel" key-value="dictValue">
+            <template v-if="disabledEdit" #right>
+              <ie-image src="/static/image/icon-lock.png" custom-class="w-24 h-30" mode="aspectFill" />
+            </template>
+          </ie-picker>
+        </uv-form-item>
+        <uv-form-item v-if="examTypeForm.examType === 'VHS'" label="专业类别" prop="majorType" borderBottom required>
+          <ie-picker ref="pickerRef" v-model="examTypeForm.majorType" :list="examMajorList"
+            :disabled="!examTypeForm.examType || disabledEdit" :placeholder="pickerPlaceholder"
+            :custom-style="customStyle" key-label="dictLabel" key-value="dictValue">
+            <template v-if="disabledEdit" #right>
+              <ie-image src="/static/image/icon-lock.png" custom-class="w-24 h-30" mode="aspectFill" />
+            </template></ie-picker>
         </uv-form-item>
-        <uv-form-item label="毕业年份" prop="year" required>
+        <uv-form-item label="单招年份" prop="year" required>
           <ie-picker ref="pickerRef" v-model="examTypeForm.endYear" :list="endYearList"
-            :disabled="!examTypeForm.examType" placeholder="选择毕业年份" :custom-style="customStyle" key-label="dictLabel"
-            key-value="dictValue"></ie-picker>
+            :disabled="!examTypeForm.examType || disabledEdit" :placeholder="pickerPlaceholder"
+            :custom-style="customStyle" key-label="dictLabel" key-value="dictValue">
+            <template v-if="disabledEdit" #right>
+              <ie-image src="/static/image/icon-lock.png" custom-class="w-24 h-30" mode="aspectFill" />
+            </template></ie-picker>
+        </uv-form-item>
+      </content-card>
+
+      <content-card v-if="showCulture" title="文化素质">
+        <uv-form-item label="语文" prop="form.scores.chinese" borderBottom :required="true">
+          <uv-input v-model.number="scoresForm.chinese" border="none" type="number" :placeholder="inputPlaceholder"
+            font-size="30rpx" :custom-style="customStyle" :readonly="disabledEdit">
+          </uv-input>
+        </uv-form-item>
+        <uv-form-item label="数学" prop="form.score.mathematics" borderBottom :required="true">
+          <uv-input v-model.number="scoresForm.mathematics" border="none" type="number" :placeholder="inputPlaceholder"
+            font-size="30rpx" :custom-style="customStyle" :readonly="disabledEdit">
+          </uv-input>
+          <ie-image v-if="disabledEdit" slot="right" src="/static/image/icon-lock.png" custom-class="w-24 h-30"
+            mode="aspectFill" />
+        </uv-form-item>
+        <uv-form-item label="外语" prop="form.scores.foreign" borderBottom :required="true">
+          <uv-input v-model.number="scoresForm.foreign" border="none" type="number" :placeholder="inputPlaceholder"
+            font-size="30rpx" :custom-style="customStyle" :readonly="disabledEdit">
+          </uv-input>
+          <ie-image v-if="disabledEdit" slot="right" src="/static/image/icon-lock.png" custom-class="w-24 h-30"
+            mode="aspectFill" />
+        </uv-form-item>
+        <uv-form-item label="物理" prop="form.scores.physics" borderBottom :required="true">
+          <uv-input v-model.number="scoresForm.physics" border="none" type="number" :placeholder="inputPlaceholder"
+            font-size="30rpx" :custom-style="customStyle" :readonly="disabledEdit">
+          </uv-input>
+          <ie-image v-if="disabledEdit" slot="right" src="/static/image/icon-lock.png" custom-class="w-24 h-30"
+            mode="aspectFill" />
+        </uv-form-item>
+        <uv-form-item label="政治" prop="form.scores.political" :required="true">
+          <uv-input v-model.number="scoresForm.political" border="none" type="number" :placeholder="inputPlaceholder"
+            font-size="30rpx" :custom-style="customStyle" :readonly="disabledEdit">
+          </uv-input>
+          <ie-image v-if="disabledEdit" slot="right" src="/static/image/icon-lock.png" custom-class="w-24 h-30"
+            mode="aspectFill" />
+        </uv-form-item>
+      </content-card>
+
+      <content-card v-if="showSchoolInfo" title="学校信息">
+        <uv-form-item label="学校名称" prop="form.name" borderBottom>
+          <ie-picker ref="pickerRef" v-model="form.schoolName" disabled :placeholder="pickerPlaceholder"
+            :custom-style="customStyle" :custom-label="form.schoolName">
+            <template #right>
+              <ie-image src="/static/image/icon-lock.png" custom-class="w-24 h-30" mode="aspectFill" />
+            </template>
+          </ie-picker>
+        </uv-form-item>
+        <uv-form-item label="所在班级" prop="form.name">
+          <ie-picker ref="pickerRef" v-model="form.schoolClassName" :list="classList" title="选择班级" placeholder="请选择"
+            disabled :custom-style="customStyle" key-label="name" key-value="classId">
+            <template #right>
+              <ie-image src="/static/image/icon-lock.png" custom-class="w-24 h-30" mode="aspectFill" />
+            </template>
+          </ie-picker>
         </uv-form-item>
       </content-card>
     </uv-form>
@@ -32,38 +111,123 @@ import ContentCard from '@/pagesSystem/components/content-card.vue';
 import { useExamType } from '@/composables/useExamType';
 import { updateUserInfo } from '@/api/modules/login';
 import { useUserStore } from '@/store/userStore';
-import { UserInfo } from '@/types/user';
+import { ClassItem, Scores, UserInfo } from '@/types/user';
 import { useTransferPage } from '@/hooks/useTransferPage';
+import { EnumExamType, EnumUserType } from '@/common/enum';
+import { getClassList } from '@/api/modules/user';
 const { prevData, transferTo, transferBack } = useTransferPage();
 const { form: examTypeForm, examTypeList, examMajorList, provinceList, endYearList } = useExamType();
 const userStore = useUserStore();
+const userInfo = computed(() => userStore.userInfo);
+
+const classList = ref<ClassItem[]>([]);
 const customStyle = {
   paddingLeft: '26px'
 };
+const inputPlaceholder = computed(() => {
+  return true ? '请输入(提交后不可修改)' : '请输入';
+});
+const pickerPlaceholder = computed(() => {
+  return true ? '请选择(提交后不可修改)' : '请选择';
+});
+
+const form = ref<UserInfo>({
+  ...userInfo.value,
+});
+const scoresForm = ref<Scores>({})
+examTypeForm.value.location = form.value.location;
+examTypeForm.value.examType = form.value.examType;
+examTypeForm.value.endYear = form.value.endYear;
+examTypeForm.value.majorType = form.value.majorType;
+scoresForm.value = form.value.scores || {}
+
+const disabledEdit = computed(() => {
+  return !!userInfo.value.location;
+})
+const showCulture = computed(() => {
+  return examTypeForm.value.examType === EnumExamType.OHS;
+});
+// 代理机构不显示学校
+const showSchoolInfo = computed(() => userStore.userInfo.userType !== EnumUserType.AGENT);
+
 const handleBack = () => {
+  if (disabledEdit.value) {
+    transferBack();
+    return;
+  }
   uni.$ie.showToast('请先完善信息');
 };
-const handleSubmit = async () => {
-  console.log('handleSubmit', examTypeForm.value)
-  const { location, examType, endYear } = examTypeForm.value;
-  if (!location) {
-    uni.$ie.showToast('请先选择所在省份');
-    return;
+const loginValidate = () => {
+  form.value = {
+    ...form.value,
+    ...examTypeForm.value,
   }
-  if (!examType) {
-    uni.$ie.showToast('请先选择考试类别');
-    return;
+  const { nickName, location, examType, endYear } = form.value;
+  if (!nickName || nickName.trim() === '') {
+    uni.$ie.showToast('请输入姓名');
+    return false;
+  }
+  if (!location || location.trim() === '') {
+    uni.$ie.showToast('请选择省份');
+    return false;
+  }
+  if (!examType || examType.trim() === '') {
+    uni.$ie.showToast('请选择考生类别');
+    return false;
+  }
+  if (examType === 'VHS') {
+    if (!form.value.majorType) {
+      uni.$ie.showToast('请选择专业类别');
+      return false;
+    }
   }
   if (!endYear) {
-    uni.$ie.showToast('请先选择毕业年份');
+    uni.$ie.showToast('请选择毕业年份');
+    return false;
+  }
+  if (showCulture.value) {
+    if (!scoresForm.value.chinese || scoresForm.value.chinese < 0 || scoresForm.value.chinese > 100) {
+      uni.$ie.showToast('请输入正确的语文成绩');
+      return false;
+    }
+    if (!scoresForm.value.mathematics || scoresForm.value.mathematics < 0 || scoresForm.value.mathematics > 100) {
+      uni.$ie.showToast('请输入正确的数学成绩');
+      return false;
+    }
+    if (!scoresForm.value.foreign || scoresForm.value.foreign < 0 || scoresForm.value.foreign > 100) {
+      uni.$ie.showToast('请输入正确的外语成绩');
+      return false;
+    }
+    if (!scoresForm.value.physics || scoresForm.value.physics < 0 || scoresForm.value.physics > 100) {
+      uni.$ie.showToast('请输入正确的物理成绩');
+      return false;
+    }
+    if (!scoresForm.value.political || scoresForm.value.political < 0 || scoresForm.value.political > 100) {
+      uni.$ie.showToast('请输入正确的政治成绩');
+      return false;
+    }
+  }
+  // if (!form.value.schoolName) {
+  //   uni.$ie.showToast('请选择学校');
+  //   return false;
+  // }
+  // if (!form.value.schoolClassName) {
+  //   uni.$ie.showToast('请选择班级');
+  //   return false;
+  // }
+  return true;
+}
+const handleSubmit = async () => {
+  console.log('handleSubmit', examTypeForm.value)
+  if (!loginValidate()) {
     return;
   }
   const params = {
     ...userStore.userInfo,
-    location,
-    examType,
-    endYear,
+    ...form.value,
+    scores: scoresForm.value,
   } as UserInfo;
+  console.log(params)
   uni.$ie.showLoading();
   await updateUserInfo(params);
   await userStore.getUserInfo();
@@ -75,6 +239,7 @@ const handleSubmit = async () => {
     });
   }, 800);
 };
+
 </script>
 
-<style></style>
+<style></style>

+ 31 - 6
src/pagesSystem/pages/login/login.vue

@@ -62,9 +62,9 @@ import { useTransferPage } from '@/hooks/useTransferPage';
 import { validatePhone } from '@/hooks/useValidation';
 import { useAppConfig } from '@/hooks/useAppConfig';
 import { verifyCard } from '@/api/modules/user';
-import { EnumBindScene, EnumSmsApiType } from '@/common/enum';
+import { EnumBindScene, EnumSmsApiType, EnumUserType } from '@/common/enum';
 import { login } from '@/api/modules/login';
-import { LoginRequestDTO, MobileLoginResponseDTO } from '@/types/user';
+import { LoginRequestDTO, MobileLoginResponseDTO, UserInfo } from '@/types/user';
 const { transferBack, transferTo } = useTransferPage();
 const userStore = useUserStore();
 const { isSmsCaptchaEnable } = useAppConfig();
@@ -196,7 +196,7 @@ const handleMobileLogin = async (params: LoginRequestDTO) => {
       }
     } else {
       if (res.token) {
-        userStore.login(res.token).then((success: boolean) => {
+        userStore.login(res.token).then(({ success, userInfo }) => {
           if (success) {
             transferBack(true);
           } else {
@@ -213,10 +213,30 @@ const handleCardLogin = (params: LoginRequestDTO) => {
   uni.$ie.showLoading();
   login(params).then(res => {
     if (res.token) {
-      userStore.login(res.token).then((success: boolean) => {
+      userStore.login(res.token).then(({ success, userInfo }) => {
         uni.$ie.hideLoading();
-        if (success) {
-          transferBack(true);
+        if (success && userInfo) {
+          console.log('登录成功', userInfo)
+          const needComplete = needCompleteInfo(userInfo);
+          if (needComplete) {
+            transferTo('/pagesSystem/pages/edit-teacher-profile/edit-teacher-profile');
+            // transferTo('/pagesSystem/pages/bind-profile/bind-profile', {
+            //   data: {
+            //     scene: EnumBindScene.IMPROVE,
+            //   }
+            // });
+            // transferTo('/pagesSystem/pages/phone-verify/phone-verify', {
+            //   data: {
+            //     scene: EnumBindScene.IMPROVE,
+            //     userInfo: userInfo,
+            //     cardInfo: {},
+            //     registerInfo: params
+            //   }
+            // });
+          } else {
+            transferBack(true);
+          }
+          // transferBack(true);
         } else {
           uni.$ie.showToast('登录失败')
         }
@@ -248,6 +268,11 @@ const handleCardLogin = (params: LoginRequestDTO) => {
 
 }
 
+const needCompleteInfo = (userInfo: UserInfo) => {
+  const { userType, location, examType, endYear } = userInfo;
+  return [EnumUserType.TEACHER, EnumUserType.AGENT].includes(userType) && (!location || !examType || !endYear);
+};
+
 const handleValid = (data: { code: string; uuid: string }) => {
   console.log(code.value, uuid.value);
   captchaRef.value.close();

+ 65 - 31
src/pagesSystem/pages/phone-verify/phone-verify.vue

@@ -65,21 +65,36 @@ const checkHasReg = async () => {
     if (code === 101) {
       console.log('用户不存在')
       console.log(params)
-      const submitInfo = {
-        scene: EnumBindScene.REGISTER_BIND,
-        userInfo: {},
-        cardInfo: prevData.value.cardInfo,
-        registerInfo: {
-          ...params,
-          // 此时注册信息需要替换为卡信息
-          username: prevData.value.registerInfo.username,
-          password: prevData.value.registerInfo.password,
-        }
-      };
-      // 账户不存在,执行注册操作
-      transferTo('/pagesSystem/pages/bind-profile/bind-profile', {
-        data: submitInfo
-      });
+      if (prevData.value.scene === EnumBindScene.IMPROVE) {
+        const submitInfo = {
+          scene: EnumBindScene.IMPROVE,
+          userInfo: prevData.value.userInfo,
+          cardInfo: prevData.value.cardInfo,
+          registerInfo: {
+            ...params
+          }
+        };
+        console.log('提交信息:', submitInfo)
+        transferTo('/pagesSystem/pages/bind-profile/bind-profile', {
+          data: submitInfo
+        });
+      } else {
+        const submitInfo = {
+          scene: EnumBindScene.REGISTER_BIND,
+          userInfo: {},
+          cardInfo: prevData.value.cardInfo,
+          registerInfo: {
+            ...params,
+            // 此时注册信息需要替换为卡信息
+            username: prevData.value.registerInfo.username,
+            password: prevData.value.registerInfo.password,
+          }
+        };
+        // 账户不存在,执行注册操作
+        transferTo('/pagesSystem/pages/bind-profile/bind-profile', {
+          data: submitInfo
+        });
+      }
     }
   } else {
     // 账户已存在,执行绑卡操作
@@ -94,22 +109,41 @@ const checkHasReg = async () => {
         uni.$ie.showToast('该手机号已绑定其他账号,请使用其他手机号');
         return;
       }
-      // 不是 vip 则可以绑定
-      const submitInfo = {
-        scene: EnumBindScene.LOGIN_BIND,
-        userInfo: data,
-        cardInfo: prevData.value.cardInfo,
-        registerInfo: {
-          ...params,
-          // 此时注册信息需要替换为卡信息
-          username: prevData.value.registerInfo.username,
-          password: prevData.value.registerInfo.password,
-        }
-      };
-      console.log('提交信息:', submitInfo)
-      transferTo('/pagesSystem/pages/bind-profile/bind-profile', {
-        data: submitInfo
-      });
+      console.log(111, prevData.value.scene)
+      if (prevData.value.scene === EnumBindScene.IMPROVE) {
+        const submitInfo = {
+          scene: EnumBindScene.IMPROVE,
+          userInfo: data,
+          cardInfo: prevData.value.cardInfo,
+          registerInfo: {
+            ...params,
+            // 此时注册信息需要替换为卡信息
+            username: prevData.value.registerInfo.username,
+            password: prevData.value.registerInfo.password,
+          }
+        };
+        console.log('提交信息:', submitInfo)
+        transferTo('/pagesSystem/pages/bind-profile/bind-profile', {
+          data: submitInfo
+        });
+      } else {
+        // 不是 vip 则可以绑定
+        const submitInfo = {
+          scene: EnumBindScene.LOGIN_BIND,
+          userInfo: data,
+          cardInfo: prevData.value.cardInfo,
+          registerInfo: {
+            ...params,
+            // 此时注册信息需要替换为卡信息
+            username: prevData.value.registerInfo.username,
+            password: prevData.value.registerInfo.password,
+          }
+        };
+        console.log('提交信息:', submitInfo)
+        transferTo('/pagesSystem/pages/bind-profile/bind-profile', {
+          data: submitInfo
+        });
+      }
     }
   }
 }

+ 1 - 8
src/store/appStore.ts

@@ -16,7 +16,6 @@ export const useAppStore = defineStore('ie-app', {
       statusBarHeight: 0,
       sysInfo: null as UniApp.GetSystemInfoResult | null,
       appConfig: [] as ConfigItem[],
-      provinceList: [] as DictItem[],
     }
   },
   getters: {
@@ -52,7 +51,6 @@ export const useAppStore = defineStore('ie-app', {
      */
     async loadPreloadData() {
       await this.loadConfig();
-      // await this.loadProvince();
     },
     /**
      * 加载参数配置
@@ -72,11 +70,6 @@ export const useAppStore = defineStore('ie-app', {
       });
       this.appConfig = list;
     },
-    async loadProvince() {
-      const { data } = await getProvinces();
-      this.provinceList = data;
-      console.log(data)
-    },
     /**
      * 获取应用配置项的值
      * @param key 配置项的 key
@@ -99,7 +92,7 @@ export const useAppStore = defineStore('ie-app', {
       setItem: uni.setStorageSync,
     },
     // 不需要持久化的
-    // 'appConfig', 'provinceList'
+    // 'appConfig'
     omit: [],
   }
 });

+ 11 - 4
src/store/userStore.ts

@@ -30,7 +30,7 @@ export const useUserStore = defineStore('ie-user', {
     isExamGuideShow: false,
     tempInfo: {
       location: '',
-      examType: '',
+      examType: undefined,
     },
     org: {
       ...config.defaultOrg,
@@ -120,10 +120,16 @@ export const useUserStore = defineStore('ie-user', {
       try {
         this.accessToken = token;
         await oldUserStore.SyncToken(token);
-        await this.getUserInfo();;
-        return Promise.resolve(true);
+        const userInfo = await this.getUserInfo();;
+        return Promise.resolve({
+          success: true,
+          userInfo: userInfo
+        });
       } catch (error) {
-        return Promise.resolve(false);
+        return Promise.resolve({
+          success: false,
+          userInfo: null
+        });
       }
     },
     checkLogin({ askToLogin = true }: CheckLoginOptions = {}): Promise<boolean> {
@@ -191,6 +197,7 @@ export const useUserStore = defineStore('ie-user', {
       if (org) {
         this.org = org;
       }
+      return data;
     },
     /**
      * 保存定向学校列表

+ 4 - 4
src/types/index.ts

@@ -2,8 +2,9 @@ import * as Study from "./study";
 import * as User from "./user";
 import * as News from "./news";
 import * as Transfer from "./transfer";
+import * as System from './system';
 import { VipCardInfo } from "./user";
-import { EnumReviewMode } from "@/common/enum";
+import { EnumExamMode, EnumExamType, EnumReviewMode } from "@/common/enum";
 
 /// 接口响应
 export interface ApiResponse<T> {
@@ -73,7 +74,6 @@ export interface AppStoreState {
   statusBarHeight: number;
   sysInfo: UniApp.GetSystemInfoResult | null;
   appConfig: ConfigItem[];
-  provinceList: DictItem[];
 }
 
 export interface DictStoreState {
@@ -89,7 +89,7 @@ export interface UserStoreState {
   isExamGuideShow: boolean;
   tempInfo?: {
     location: string;
-    examType: string;
+    examType?: EnumExamType;
   };
   org: {
     contactPhone: string;
@@ -126,4 +126,4 @@ export interface ConfigItem {
 
 
 
-export { Study, User, News, Transfer };
+export { Study, User, News, Transfer, System };

+ 6 - 0
src/types/system.ts

@@ -0,0 +1,6 @@
+export type ProvinceItem = {
+  areaId: number;
+  areaName: string;
+  provinceName: string;
+  children: ProvinceItem[]
+}

+ 9 - 3
src/types/user.ts

@@ -11,7 +11,7 @@ export interface StudentExamInfo {
   nickName: string;
   location: string;
   endYear: number;
-  examType: string;
+  examType?: EnumExamType;
   majorType?: string;
 }
 
@@ -57,7 +57,7 @@ export interface ClassItem {
 export interface CardInfo {
   agentId?: number;
   agentName?: string;
-  assignExamType?: string;
+  assignExamType?: EnumExamType;
   assignLocation?: string;
   assignSchoolId?: number;
   assignSchoolName?: string;
@@ -90,6 +90,8 @@ export interface RegisterInfo {
 
 export interface BindCardInfo extends RegisterInfo {
   cardNo?: string;
+  // 临时信息
+  schoolClassName?: string;
 }
 
 export interface Scores {
@@ -149,7 +151,11 @@ export interface UserInfo {
   userName: string;
   scores: Scores;
   userType: EnumUserType,
-  accountType: number
+  accountType: number,
+  schoolName: string;
+  schoolClassName: string;
+  classId?: number;
+  schoolId?: number;
 }
 
 export interface VipCardInfo {