Просмотр исходного кода

Merge branch 'iteration-20240403-apply' into online

lex 1 год назад
Родитель
Сommit
3f845d71ad
29 измененных файлов с 840 добавлено и 110 удалено
  1. BIN
      src/common/images/message-bg2.png
  2. BIN
      src/common/images/message-close.png
  3. 1 1
      src/components/m-img-code/index.tsx
  4. 17 3
      src/components/m-message-tip/index.module.less
  5. 11 2
      src/components/m-message-tip/index.tsx
  6. 1 1
      src/helpers/request.ts
  7. 1 1
      src/helpers/utils.ts
  8. 1 1
      src/router/router-root.ts
  9. 1 1
      src/styles/index.less
  10. 44 5
      src/views/creation/index-share.tsx
  11. BIN
      src/views/creation/login-change-model/images/icon-b-line.png
  12. BIN
      src/views/creation/login-change-model/images/icon-n-1.png
  13. BIN
      src/views/creation/login-change-model/images/icon-n-2.png
  14. BIN
      src/views/creation/login-change-model/images/message-close.png
  15. 169 0
      src/views/creation/login-change-model/index.module.less
  16. 166 0
      src/views/creation/login-change-model/index.tsx
  17. 27 7
      src/views/creation/login-model/index.tsx
  18. BIN
      src/views/student-register/images/new/banner-bg3.png
  19. BIN
      src/views/student-register/images/new/icon-n-3.png
  20. BIN
      src/views/student-register/images/new/icon-n-4.png
  21. BIN
      src/views/student-register/images/new/icon-n-5.png
  22. 5 5
      src/views/student-register/index.module.less
  23. 173 35
      src/views/student-register/index.tsx
  24. 6 0
      src/views/student-register/modal/select-student/index.module.less
  25. 4 2
      src/views/student-register/modal/select-student/index.tsx
  26. 4 2
      src/views/student-register/register-member/index.module.less
  27. 109 23
      src/views/student-register/register-member/index.tsx
  28. 3 1
      src/views/student-register/register-new/index.module.less
  29. 97 20
      src/views/student-register/register-new/index.tsx

BIN
src/common/images/message-bg2.png


BIN
src/common/images/message-close.png


+ 1 - 1
src/components/m-img-code/index.tsx

@@ -104,7 +104,7 @@ export default defineComponent({
         this.code = '';
         setTimeout(() => {
           this.updateIdentifyingCode();
-        }, 500);
+        }, 2000);
       }
     }
   },

+ 17 - 3
src/components/m-message-tip/index.module.less

@@ -1,8 +1,11 @@
 .wxPopupDialog {
   // position: relative;
   overflow: initial;
-
+  margin: 0 40px;
+  width: calc(100% - 75px) !important;
   // margin-top: -160px;
+  border-radius: 20px !important;
+
   &::before {
     position: absolute;
     content: ' ';
@@ -18,8 +21,8 @@
 }
 
 .popupContainer {
-  background: url('../../common/images/message-bg.png') no-repeat top center;
-  background-size: cover;
+  background: url('../../common/images/message-bg2.png') no-repeat top center;
+  background-size: contain;
   border-radius: 20px;
   overflow: hidden;
   padding-bottom: 20px;
@@ -62,4 +65,15 @@
     color: #FFFFFF;
     border: none;
   }
+
+  .iconClose {
+    position: absolute;
+    top: 16px;
+    right: 16px;
+    display: inline-block;
+    background: url('../../common/images/message-close.png') no-repeat top center;
+    background-size: cover;
+    width: 18px;
+    height: 18px;
+  }
 }

+ 11 - 2
src/components/m-message-tip/index.tsx

@@ -52,9 +52,14 @@ export default defineComponent({
     confirmButtonColor: {
       type: String,
       default: ''
+    },
+    /** 是否有关闭按钮 */
+    showCloseButton: {
+      type: Boolean,
+      default: true
     }
   },
-  emits: ['confirm', 'cancel'],
+  emits: ['confirm', 'cancel', 'close'],
   setup(props, { emit }) {
     const showPopup = ref(false);
     onMounted(() => {
@@ -78,10 +83,14 @@ export default defineComponent({
         <Popup
           v-model:show={showPopup.value}
           round
-          style={{ width: '88%', maxWidth: '520px' }}
+          style={{ width: '100%', maxWidth: '520px' }}
           closeOnClickOverlay={false}
           class={styles.wxPopupDialog}>
           <div class={styles.popupContainer}>
+            {props.showCloseButton && (
+              <i class={styles.iconClose} onClick={() => emit('close')}></i>
+            )}
+
             <p class={styles.title1} v-html={props.title}></p>
             <p
               class={styles.popupTips}

+ 1 - 1
src/helpers/request.ts

@@ -85,7 +85,7 @@ request.interceptors.response.use(
     }
     const data = await res.clone().json();
     // 999 为特殊code码
-    const otherCode = [999, 5435, 5436, 5437];
+    const otherCode = [999, 5435, 5436, 5437, 5439];
     if (
       data.code !== 200 &&
       data.errCode !== 0 &&

+ 1 - 1
src/helpers/utils.ts

@@ -110,7 +110,7 @@ export const getRandomKey = () => {
 
 export function checkPhone(phone: string) {
   const phoneRule =
-    /^((13[0-9])|(14(0|[5-7]|9))|(15([0-3]|[5-9]))|(16(2|[5-7]))|(17[0-8])|(18[0-9])|(19([0-3]|[5-9])))\d{8}$/;
+    /^((13[0-9])|(14(0|[5-7]|9))|(15([0-3]|[5-9]))|(16(2|[5-9]))|(17[0-8])|(18[0-9])|(19([0-3]|[5-9])))\d{8}$/;
   return phoneRule.test(phone);
 }
 

+ 1 - 1
src/router/router-root.ts

@@ -21,7 +21,7 @@ export default [
     name: 'register-member',
     component: () => import('@/views/student-register/register-member'),
     meta: {
-      title: '音乐数字课堂学生注册'
+      title: '音乐数字课堂学生报名'
     }
   },
   {

+ 1 - 1
src/styles/index.less

@@ -267,7 +267,7 @@ body {
 }
 
 .van-toast {
-  z-index: 9999 !important;
+  z-index: 99999 !important;
 }
 
 .fontBlod {

+ 44 - 5
src/views/creation/index-share.tsx

@@ -35,6 +35,7 @@ import { ACCESS_TOKEN } from '@/store/mutation-types';
 import MWxTip from '@/components/m-wx-tip';
 import { usePageVisibility } from '@vant/use';
 import videoBg from './images/video-bg.png';
+import LoginChangeModel from './login-change-model';
 
 export default defineComponent({
   name: 'creation-detail',
@@ -47,6 +48,8 @@ export default defineComponent({
       id: route.query.id,
       loginTag: false, // 是否登录标识
       loginStatus: false,
+      loginChangeState: false, // 切换账号
+      credential: {} as any,
       playType: '' as 'Audio' | 'Video' | '', // 播放类型
       musicDetail: {} as any,
       timer: null as any,
@@ -101,6 +104,7 @@ export default defineComponent({
 
     // 点赞
     const onStarChange = async () => {
+      await checkLogin();
       // 是否登录
       if (!state.loginTag) {
         state.loginStatus = true;
@@ -220,7 +224,7 @@ export default defineComponent({
       }
     };
 
-    const __init = async () => {
+    const checkLogin = async () => {
       try {
         // 判断是否登录
         const Authorization = storage.get(ACCESS_TOKEN) || '';
@@ -228,13 +232,24 @@ export default defineComponent({
           const res = await api_verification({
             token: Authorization
           });
+          console.log(res.data, 'res.data');
           state.loginTag = res.data;
           if (!res.data) {
             removeAuth();
             setLogout();
           }
         }
-
+      } catch (err) {
+        //
+        storage.remove(ACCESS_TOKEN);
+        removeAuth();
+        setLogout();
+        state.loginTag = false;
+      }
+    };
+    const __init = async () => {
+      await checkLogin();
+      try {
         const res = await api_openUserMusicDetail(state.id);
 
         if (res.code === 999) {
@@ -470,9 +485,33 @@ export default defineComponent({
           <LoginModel
             isRegister
             onClose={() => (state.loginStatus = false)}
-            onConfirm={async (val: boolean) => {
-              state.loginTag = val;
-              state.loginStatus = false;
+            onConfirm={async (val: any) => {
+              if (val.loginTag) {
+                state.loginTag = val.loginTag;
+                state.loginStatus = false;
+                const { data } = await api_openUserMusicDetail(state.id);
+                state.musicDetail = data;
+              } else {
+                state.credential = val.data;
+                state.loginChangeState = true;
+                state.loginStatus = false;
+              }
+            }}
+          />
+        </Popup>
+
+        <Popup
+          v-model:show={state.loginChangeState}
+          style={{ background: 'transparent', overflow: 'inherit' }}>
+          <LoginChangeModel
+            credential={state.credential}
+            onClose={() => {
+              state.credential = {};
+              state.loginChangeState = false;
+            }}
+            onConfirm={async (val: any) => {
+              state.loginTag = val.loginTag;
+              state.loginChangeState = false;
               const { data } = await api_openUserMusicDetail(state.id);
               state.musicDetail = data;
             }}

BIN
src/views/creation/login-change-model/images/icon-b-line.png


BIN
src/views/creation/login-change-model/images/icon-n-1.png


BIN
src/views/creation/login-change-model/images/icon-n-2.png


BIN
src/views/creation/login-change-model/images/message-close.png


+ 169 - 0
src/views/creation/login-change-model/index.module.less

@@ -0,0 +1,169 @@
+.loginChangeModel {
+  position: relative;
+  width: 306px;
+  background-color: #fff;
+  background: linear-gradient(180deg, #C0EEFF 0%, #FFFFFF 13%, #FFFFFF 100%);
+  border-radius: 20px;
+  border: 1px solid #979797;
+
+  .iconClose {
+    position: absolute;
+    top: 20px;
+    right: 20px;
+    display: inline-block;
+    background: url('./images/message-close.png') no-repeat top center;
+    background-size: cover;
+    width: 18px;
+    height: 18px;
+    z-index: 99;
+  }
+
+  .popupTitle {
+    position: relative;
+    padding-top: 20px;
+    padding-left: 22px;
+    margin-bottom: 16px;
+    font-weight: 500;
+    font-size: 20px;
+    color: #000000;
+    line-height: 28px;
+
+    span {
+      z-index: 1;
+      position: relative;
+    }
+
+    &::after {
+      position: absolute;
+      left: 22px;
+      bottom: 0;
+      display: inline-block;
+      content: '';
+      width: 80px;
+      height: 8px;
+      background: url('./images/icon-b-line.png') no-repeat center;
+      background-size: contain;
+    }
+  }
+}
+
+.selectStudent {
+  padding: 0 20px 0;
+  max-height: 400px;
+  min-height: 200px;
+  overflow-x: hidden;
+  overflow-y: auto;
+
+  .cell {
+    display: flex;
+    align-items: center;
+    padding: 12px 10px;
+    border-radius: 10px;
+    margin-bottom: 16px;
+
+    &:last-child {
+      margin-bottom: 0;
+    }
+
+    :global {
+      .van-radio {
+        flex-shrink: 0;
+      }
+    }
+  }
+
+  .cellSelected {
+    background: #EDF6FD;
+  }
+
+  .iconImage {
+    width: 18px;
+    height: 18px;
+    flex-shrink: 0;
+  }
+
+  .userInfo {
+    display: flex;
+    align-items: center;
+    flex: 1;
+
+    .userImg {
+      width: 42px;
+      height: 42px;
+      border-radius: 50%;
+      overflow: hidden;
+      margin: 0 10px;
+      flex-shrink: 0;
+    }
+  }
+
+  .usernames {
+    .name {
+      font-weight: 600;
+      font-size: 14px;
+      color: #131415;
+      line-height: 22px;
+
+      display: flex;
+      align-items: center;
+    }
+
+    .names {
+      max-width: 160px;
+      overflow: hidden;
+      white-space: nowrap;
+      text-overflow: ellipsis;
+    }
+
+    // .info {
+    //   padding: 2px 6px;
+    //   background: #E9ECEF;
+    //   border-radius: 11px;
+    //   margin-left: 4px;
+    //   font-weight: 500;
+    //   font-size: 11px;
+    //   color: #1D9FFF;
+    //   line-height: 16px;
+    // }
+
+    .schoolname {
+      padding-top: 4px;
+      font-weight: 400;
+      font-size: 13px;
+      color: #777777;
+      line-height: 18px;
+      max-width: 180px;
+      white-space: nowrap;
+      overflow: hidden;
+      text-overflow: ellipsis;
+    }
+  }
+}
+
+.addStudentBtn {
+  margin: 16px 20px 22px;
+
+  :global {
+    .van-button {
+      background: linear-gradient(135deg, #31C7FF 0%, #007AFE 100%);
+      font-weight: 600;
+      font-size: 16px;
+      color: #fff;
+      border: 0;
+    }
+
+    .van-button--disabled {
+      opacity: 0.6 !important;
+
+      &::before {
+        opacity: 0;
+      }
+    }
+
+    .van-button__text {
+      display: flex;
+      align-items: center;
+      justify-content: center;
+    }
+  }
+}

+ 166 - 0
src/views/creation/login-change-model/index.tsx

@@ -0,0 +1,166 @@
+import { defineComponent, onMounted, ref, watch } from 'vue';
+import styles from './index.module.less';
+import { Radio, RadioGroup, Image, Button } from 'vant';
+import checkBoxActive from './images/icon-n-1.png';
+import checkBoxDefault from './images/icon-n-2.png';
+import request from '@/helpers/request';
+import { storage } from '@/helpers/storage';
+import { ACCESS_TOKEN } from '@/store/mutation-types';
+import { setLogin } from '@/state';
+
+export default defineComponent({
+  name: 'login-change-model',
+  props: {
+    credential: {
+      type: Object,
+      default: () => ({})
+    }
+  },
+  emits: ['close', 'confirm'],
+  setup(props, { emit }) {
+    const radioChecked = ref();
+    const btnLoading = ref(false);
+    const list = ref([] as any);
+
+    watch(
+      () => props.credential,
+      () => {
+        getUserList();
+      }
+    );
+
+    const getUserList = async () => {
+      try {
+        if (!props.credential?.token) return;
+        const { data } = await request.post('/edu-app/open/user/getMultiUser', {
+          data: {
+            ...props.credential
+          }
+        });
+        const result = data || [];
+        const tempList = [] as any;
+        result.forEach((item: any) => {
+          tempList.push({
+            userId: item.studentId,
+            avatar: item.avatar,
+            nickname: item.nickname,
+            schoolName: item.schoolName,
+            token: item.token,
+            tokenExpireTime: item.tokenExpireTime
+          });
+        });
+        list.value = tempList;
+      } catch {
+        //
+      }
+    };
+
+    onMounted(async () => {
+      getUserList();
+    });
+    return () => (
+      <div class={styles.loginChangeModel}>
+        <i
+          class={styles.iconClose}
+          onClick={() => {
+            emit('close');
+          }}></i>
+        <div class={styles.popupTitle}>
+          <span>选择学生</span>
+        </div>
+        <RadioGroup class={styles.selectStudent} v-model={radioChecked.value}>
+          {list.value.map((item: any) => (
+            <div
+              class={[
+                styles.cell,
+                radioChecked.value === item.userId && styles.cellSelected
+              ]}
+              onClick={() => {
+                radioChecked.value = item.userId;
+                // emit('confirm', item);
+                // emit('close');
+              }}>
+              <Radio name={item.userId}>
+                {{
+                  icon: (props: any) => (
+                    <Image
+                      class={styles.iconImage}
+                      src={props.checked ? checkBoxActive : checkBoxDefault}
+                    />
+                  )
+                }}
+              </Radio>
+
+              <div class={styles.userInfo}>
+                <Image src={item.avatar} class={styles.userImg} fit="cover" />
+
+                <div class={styles.usernames}>
+                  <div class={styles.name}>
+                    <span class={styles.names}>{item.nickname}</span>
+                  </div>
+                  {item.schoolName && (
+                    <div class={styles.schoolname}>{item.schoolName}</div>
+                  )}
+                </div>
+              </div>
+            </div>
+          ))}
+        </RadioGroup>
+
+        <div class={styles.addStudentBtn}>
+          <Button
+            block
+            round
+            loading={btnLoading.value}
+            disabled={!radioChecked.value || btnLoading.value}
+            onClick={async () => {
+              btnLoading.value = true;
+              try {
+                const item = list.value.find(
+                  (item: any) => item.userId === radioChecked.value
+                );
+                if (!item.userId) return;
+                const forms: any = {
+                  username: props.credential.phone,
+                  client_id: 'cooleshow-student',
+                  client_secret: 'cooleshow-student',
+                  password: item.token,
+                  grant_type: 'password',
+                  loginType: 'TOKEN'
+                };
+                const result = await request.post('/edu-app/userlogin', {
+                  requestType: 'form',
+                  data: {
+                    ...forms
+                  }
+                });
+
+                storage.set(
+                  ACCESS_TOKEN,
+                  result.data.token_type + ' ' + result.data.access_token
+                );
+
+                const userCash = await request.get(
+                  '/edu-app/user/getUserInfo',
+                  {
+                    initRequest: true // 初始化接口
+                  }
+                );
+                setLogin(userCash.data);
+
+                emit('confirm', {
+                  loginTag: true
+                });
+                emit('close');
+              } finally {
+                //
+                btnLoading.value = false;
+              }
+            }}>
+            <span>确认</span>
+          </Button>
+        </div>
+      </div>
+    );
+  }
+});

+ 27 - 7
src/views/creation/login-model/index.tsx

@@ -49,20 +49,40 @@ export default defineComponent({
           autoRegister: props.isRegister
         };
 
-        const { data } = await request.post('/edu-app/userlogin', {
+        const result = await request.post('/edu-app/userlogin', {
           requestType: 'form',
           data: {
             ...forms
           }
         });
-        storage.set(ACCESS_TOKEN, data.token_type + ' ' + data.access_token);
 
-        const userCash = await request.get('/edu-app/user/getUserInfo', {
-          initRequest: true // 初始化接口
-        });
-        setLogin(userCash.data);
+        if (result.code === 5439) {
+          emit('confirm', {
+            loginTag: false,
+            data: { ...result.errorData, phone: state.username }
+          });
+
+          state.username = '';
+          state.password = '';
+          state.smsCode = '';
+          state.countDownStatus = true;
+        } else {
+          storage.set(
+            ACCESS_TOKEN,
+            result.data.token_type + ' ' + result.data.access_token
+          );
 
-        emit('confirm', true);
+          const userCash = await request.get('/edu-app/user/getUserInfo', {
+            initRequest: true // 初始化接口
+          });
+          setLogin(userCash.data);
+
+          emit('confirm', { loginTag: true });
+          state.username = '';
+          state.password = '';
+          state.smsCode = '';
+          state.countDownStatus = true;
+        }
       } catch (e: any) {
         //
         console.log(e);

BIN
src/views/student-register/images/new/banner-bg3.png


BIN
src/views/student-register/images/new/icon-n-3.png


BIN
src/views/student-register/images/new/icon-n-4.png


BIN
src/views/student-register/images/new/icon-n-5.png


+ 5 - 5
src/views/student-register/index.module.less

@@ -172,7 +172,7 @@
 
   &.studentSectionForm {
     padding: 12px 0;
-    background: linear-gradient(180deg, #DBF6FD 0%, #FFFFFF 20%);
+    background: linear-gradient(180deg, #DBF6FD 0%, #FFFFFF 10%);
   }
 
   &.noSendDay {
@@ -183,7 +183,7 @@
   .title3 {
     width: 212px;
     height: 22px;
-    background: url('./images/new/title-3.png') no-repeat center;
+    background: url('./images/new/title-7.png') no-repeat center;
     background-size: contain;
     margin: 0 auto;
   }
@@ -290,7 +290,7 @@
     font-weight: 600;
     font-size: 16px;
     color: #1189FF;
-    line-height: 22px;
+    // line-height: 22px;
     display: flex;
     align-items: center;
     justify-content: center;
@@ -409,7 +409,6 @@
   }
 
   .memberNumer {
-
     margin: 14px 12px 0;
     background: #E8F8FF;
     border-radius: 8px;
@@ -443,8 +442,9 @@
   // padding-left: 19px;
   // padding-right: 19px;
   padding: 5px 19px;
-  font-size: 15px;
+  font-size: 14px;
   font-weight: 500;
+  border-radius: 6px;
 }
 
 .radioItem {

+ 173 - 35
src/views/student-register/index.tsx

@@ -132,7 +132,7 @@ export default defineComponent({
       // bugGoods: false, // 是否购买AI
 
       isRegister: 'create' as 'create' | 'update' | '', // 是否注册学生
-      isTipRegister: true, // 是否显示名字不一致 - 默认显示
+      isTipRegister: false, // 是否显示名字不一致 - 默认显示
       isChangeSchool: false, // 是否切换学校
 
       registerType: '', // 报名类型
@@ -186,9 +186,10 @@ export default defineComponent({
 
     const otherParams = reactive({
       showOtherSchool: false,
+      showCloseButton: true, // 是否显示关闭按钮
       showOtherMessage: '',
       /**  limit 超限制,change 更换学生,nickname 名称不一致  */
-      otherType: '' as 'limit' | 'change' | 'nickname',
+      otherType: '' as 'limit' | 'change' | 'nickname' | 'member',
       showCancelButton: true,
       cancelButtonColor: '',
       cancelButtonText: '取消',
@@ -449,6 +450,9 @@ export default defineComponent({
       } else if (!studentInfo.extra.nickname) {
         status && showToast('请输入学生姓名');
         return true;
+      } else if (![0, 1].includes(studentInfo.extra.gender)) {
+        status && showToast('请选择性别');
+        return true;
       } else if (!studentInfo.extra.currentGradeNum) {
         status && showToast('请选择所在年级');
         return true;
@@ -477,6 +481,7 @@ export default defineComponent({
           '学生姓名与上次提交信息不一致,请确认修改学生信息或创建新的学生账号';
         otherParams.showOtherSchool = true;
         otherParams.showCancelButton = true;
+        otherParams.showCloseButton = true;
         otherParams.cancelButtonColor =
           'linear-gradient( 224deg, #3FE1E6 0%, #00CDD4 100%)';
         otherParams.cancelButtonText = '新建学生';
@@ -496,6 +501,7 @@ export default defineComponent({
         otherParams.showOtherMessage = `同一手机号最多创建${forms.multi_user_limit}个学生`;
         otherParams.showOtherSchool = true;
         otherParams.showCancelButton = false;
+        otherParams.showCloseButton = true;
         otherParams.confirmButtonColor =
           'linear-gradient( 305deg, #40C8FF 0%, #3192FF 100%)';
         otherParams.confirmButtonText = '我知道了';
@@ -506,16 +512,20 @@ export default defineComponent({
 
       // 判断是否为同一个学校
       if (
+        forms.studentItem.schoolId &&
         forms.studentItem.schoolId !== forms.registerDetails.schoolId &&
         !forms.isChangeSchool &&
         forms.isRegister === 'update'
       ) {
         otherParams.showOtherMessage = `您已绑定【${
+          forms.studentItem?.schoolName || ''
+        }】,提交后将更换到
+        <span style="color: #2B85FF">【${
           forms.registerDetails.schoolName || ''
-        }】,提交后将更换到【${
-          forms.studentItem?.schoolName
-        }】,是否确认提交?`;
+        }】</span>
+        ,是否确认提交?`;
         otherParams.showOtherSchool = true;
+        otherParams.showCloseButton = false;
         otherParams.showCancelButton = true;
         otherParams.cancelButtonColor = '';
         otherParams.cancelButtonText = '取消';
@@ -631,6 +641,45 @@ export default defineComponent({
       }
     };
 
+    const updateStudentInfo = async () => {
+      try {
+        const { extra, username } = studentInfo;
+        const registerResult = await request.post('/edu-app/student/register', {
+          data: {
+            schoolId: forms.schoolId,
+            clientType: 'STUDENT',
+            schoolVerify: true,
+            ...extra,
+            giftVipDay:
+              forms.detailVip.membershipDays || 0 + forms.giftVipDay || 0,
+            mobile: username,
+            newRegUser: forms.isRegister === 'create' ? true : false
+          }
+        });
+
+        if (registerResult.code !== 200) {
+          if (registerResult.code === 5436) {
+            forms.showTips = true;
+            forms.showMessage = '二维码已经失效,详情请咨询学校老师';
+            forms.showButton = false;
+          } else if (registerResult.code === 5435) {
+            forms.showTips = true;
+            forms.showMessage = registerResult.message;
+            forms.showButton = true;
+          } else if (registerResult.code === 5437) {
+            forms.showTips = true;
+            forms.showMessage = '团购时间已截止,感谢您的参与'; //result.message;
+            forms.showButton = false;
+          }
+          console.log('-----');
+          return false;
+        } else {
+          console.log('=====');
+          return true;
+        }
+      } catch {}
+    };
+
     // 登记成功之后购买
     const onRegisterSubmit = async () => {
       try {
@@ -644,6 +693,9 @@ export default defineComponent({
 
         // 传统方式
         if (forms.joinType === 'tradition') {
+          const updateStatus = await updateStudentInfo();
+          if (!updateStatus) return;
+
           setTimeout(() => {
             showToast('报名成功');
             // router.push('/download');
@@ -659,7 +711,17 @@ export default defineComponent({
         }
 
         if (schoolInfo.data.hasBuyCourse && vipList.length > 0) {
-          forms.dialogConfirmStatus = true;
+          // forms.dialogConfirmStatus = true;
+          otherParams.showOtherMessage = `该学员已购买会员,是否再次购买?`;
+          otherParams.showOtherSchool = true;
+          otherParams.showCloseButton = false;
+          otherParams.showCancelButton = true;
+          otherParams.cancelButtonColor = '';
+          otherParams.cancelButtonText = '取消';
+          otherParams.confirmButtonColor = '';
+          otherParams.confirmButtonText = '确定';
+          otherParams.otherType = 'member';
+          otherParams.messageAlign = 'center';
           return;
         }
 
@@ -755,6 +817,8 @@ export default defineComponent({
 
           // 判断是否有完成订单 并且选择 自备
           if (isFinal && forms.joinType === 'tradition') {
+            const studentResult = await updateStudentInfo();
+            if (!studentResult) return;
             setTimeout(() => {
               showToast('您已通过数字化方式报名成功');
             }, 100);
@@ -773,20 +837,19 @@ export default defineComponent({
             return true;
           }
           if (isPadding && forms.joinType === 'digitalize') {
-            // 会选判断逻辑 -
-            await request.get(
-              '/edu-app/userPaymentOrder/registerStatus/' + forms.schoolId
-            );
-            // const vipList = studentRegisterStore.getVip;
-
-            // if (schoolInfo.data.hasBuyCourse && vipList.length > 0) {
-            //   forms.dialogConfirmStatus = true;
-            //   return true;
-            // }
             // 最终确认,有待支付订单直接去支付,没有则才会创建订单
-            state.config = paddingConfig?.paymentConfig;
-            state.orderNo = paddingConfig?.orderNo;
-            await lastSubmit();
+            // state.config = paddingConfig?.paymentConfig;
+            // state.orderNo = paddingConfig?.orderNo;
+            // const updateStatus = await updateStudentInfo();
+            // if (!updateStatus) return;
+            // await lastSubmit();
+
+            // 为了处理,有待支付订单,然后后台改了金额,会导致金额不一致
+            forms.dialogConfig = paddingConfig;
+            const cancelStatus = await cancelPaymentOrder();
+            if (cancelStatus) {
+              await paymentContinue();
+            }
             return true;
           }
 
@@ -823,7 +886,10 @@ export default defineComponent({
         await request.post(
           '/edu-app/userPaymentOrder/cancelPayment/' + orderNo
         );
-      } catch {}
+        return true;
+      } catch {
+        return false;
+      }
     };
 
     const paymentContinue = async () => {
@@ -853,6 +919,10 @@ export default defineComponent({
           });
         });
         // 创建订单
+        const updateStatus = await updateStudentInfo();
+        console.log(updateStatus, 'updateStatus');
+        if (!updateStatus) return;
+
         const result = await request.post(
           '/edu-app/userPaymentOrder/executeOrder',
           {
@@ -1157,6 +1227,22 @@ export default defineComponent({
       } catch {}
     };
 
+    /** 手机号变更时清空验证码信息,用户信息 */
+    const phoneChangeEmptyInfo = () => {
+      studentInfo.password = '';
+      studentInfo.extra.nickname = '';
+      studentInfo.extra.currentGradeNum = '';
+      studentInfo.extra.currentClass = '';
+      studentInfo.extra.gender = 1;
+      forms.currentClassText = '';
+      forms.gradeNumText = '';
+      forms.studentList = []; // 手机号关联学生列表
+      forms.studentItem = {}; // 选择的学生
+      forms.isRegister = 'create'; // 是否注册学生
+      forms.isTipRegister = false; // 是否显示名字不一致 - 默认显示
+      forms.isChangeSchool = false; // 是否切换学校
+    };
+
     onMounted(async () => {
       try {
         // 获取支付类型
@@ -1244,7 +1330,10 @@ export default defineComponent({
                 class={styles.username}
                 v-model={studentInfo.username}
                 border={false}
-                maxlength={11}>
+                maxlength={11}
+                onUpdate:modelValue={() => {
+                  phoneChangeEmptyInfo();
+                }}>
                 {{
                   label: () => (
                     <div>
@@ -1741,7 +1830,7 @@ export default defineComponent({
         </Popup>
 
         {/* 已经购买过样品 */}
-        <MDialog
+        {/* <MDialog
           title="提示"
           v-model:show={forms.dialogConfirmStatus}
           message={'已购买会员,是否确认购买?'}
@@ -1758,7 +1847,7 @@ export default defineComponent({
               applyOver();
             }
           }}
-        />
+        /> */}
 
         <MDialog
           title="提示"
@@ -1785,6 +1874,9 @@ export default defineComponent({
               const paymentConfig = forms.dialogConfig;
               state.config = paymentConfig?.paymentConfig;
               state.orderNo = paymentConfig?.orderNo;
+
+              const updateStatus = await updateStudentInfo();
+              if (!updateStatus) return;
               await lastSubmit();
             }
           }}
@@ -1851,6 +1943,7 @@ export default defineComponent({
 
         <MMessageTip
           show={otherParams.showOtherSchool}
+          // showCloseButton={otherParams.showCloseButton}
           messageAlign={otherParams.messageAlign}
           message={otherParams.showOtherMessage}
           showCancelButton={otherParams.showCancelButton}
@@ -1858,16 +1951,32 @@ export default defineComponent({
           cancelButtonText={otherParams.cancelButtonText}
           confirmButtonColor={otherParams.confirmButtonColor}
           confirmButtonText={otherParams.confirmButtonText}
-          onCancel={() => {
+          onClose={() => (otherParams.showOtherSchool = false)}
+          onCancel={async () => {
             otherParams.showOtherSchool = false;
             if (otherParams.otherType === 'nickname') {
               forms.isRegister = 'create'; // 新建
               changeTipStatus(false, false);
               onSubmit();
-            } else if (otherParams.otherType === 'limit') {
+            } else if (otherParams.otherType === 'member') {
+              const updateStatus = await updateStudentInfo();
+              if (!updateStatus) return;
+              //取消支付,判断是否有结束时间,是否已经结束
+              if (forms.registerExpireTime && forms.activeOverStatus) {
+                applyOver();
+              }
+              //     onConfirm={async () => {
+              //   await paymentContinue();
+              // }}
+              // onCancel={() => {
+              //   //取消支付,判断是否有结束时间,是否已经结束
+              //   if (forms.registerExpireTime && forms.activeOverStatus) {
+              //     applyOver();
+              //   }
+              // }}
             }
           }}
-          onConfirm={() => {
+          onConfirm={async () => {
             otherParams.showOtherSchool = false;
             // 名字
             if (otherParams.otherType === 'nickname') {
@@ -1888,6 +1997,8 @@ export default defineComponent({
                   : true,
                 false
               );
+            } else if (otherParams.otherType === 'member') {
+              await paymentContinue();
             }
           }}
         />
@@ -1903,11 +2014,16 @@ export default defineComponent({
             list={forms.studentList}
             onClose={() => (forms.showSelectStudent = false)}
             onConfirm={(val: any) => {
-              forms.studentItem = val;
               if (val.userId) {
+                forms.studentItem = val;
                 const firstStudent = val;
                 studentInfo.extra.nickname = firstStudent.nickname;
                 const tempGrade: any = forms.gradeList || [];
+
+                studentInfo.extra.currentGradeNum = null;
+                forms.gradeNumText = '';
+                forms.instrumentCode = '';
+
                 tempGrade?.forEach((i: any) => {
                   if (i.value === firstStudent.currentGradeNum) {
                     forms.instrumentCode = i.instrumentCode;
@@ -1919,6 +2035,10 @@ export default defineComponent({
                     }
                   }
                 });
+
+                studentInfo.extra.currentClass = null;
+                forms.currentClassText = '';
+
                 forms.classList.forEach((i: any) => {
                   if (i.value === firstStudent.currentClass) {
                     forms.currentClassText = i.text;
@@ -1928,15 +2048,33 @@ export default defineComponent({
                 studentInfo.extra.gender = firstStudent.gender;
                 forms.isRegister = 'update';
                 changeTipStatus(true, false);
+
+                forms.showSelectStudent = false;
               } else {
-                forms.isRegister = 'create';
-                changeTipStatus(false, false);
-                studentInfo.extra.nickname = '';
-                studentInfo.extra.currentGradeNum = '';
-                studentInfo.extra.currentClass = '';
-                studentInfo.extra.gender = 1;
-                forms.currentClassText = '';
-                forms.gradeNumText = '';
+                // 判断新建学员是否上限了
+                if (forms.studentList.length >= forms.multi_user_limit) {
+                  otherParams.showOtherMessage = `同一手机号最多创建${forms.multi_user_limit}个学生`;
+                  otherParams.showOtherSchool = true;
+                  otherParams.showCancelButton = false;
+                  otherParams.showCloseButton = true;
+                  otherParams.confirmButtonColor =
+                    'linear-gradient( 305deg, #40C8FF 0%, #3192FF 100%)';
+                  otherParams.confirmButtonText = '我知道了';
+                  otherParams.otherType = 'limit';
+                  otherParams.messageAlign = 'center';
+                  return true;
+                } else {
+                  forms.studentItem = val;
+                  forms.isRegister = 'create';
+                  changeTipStatus(false, false);
+                  studentInfo.extra.nickname = '';
+                  studentInfo.extra.currentGradeNum = '';
+                  studentInfo.extra.currentClass = '';
+                  studentInfo.extra.gender = 1;
+                  forms.currentClassText = '';
+                  forms.gradeNumText = '';
+                  forms.showSelectStudent = false;
+                }
               }
             }}
           />

+ 6 - 0
src/views/student-register/modal/select-student/index.module.less

@@ -19,6 +19,12 @@
     padding: 12px 10px;
     border-radius: 10px;
     margin-bottom: 16px;
+
+    :global {
+      .van-radio {
+        flex-shrink: 0;
+      }
+    }
   }
 
   .cellSelected {

+ 4 - 2
src/views/student-register/modal/select-student/index.tsx

@@ -26,6 +26,8 @@ export default defineComponent({
       () => {
         if (props.studentItem && props.studentItem.userId) {
           radioChecked.value = props.studentItem.userId;
+        } else {
+          radioChecked.value = null;
         }
       }
     );
@@ -80,9 +82,9 @@ export default defineComponent({
             color="linear-gradient( 135deg, #31C7FF 0%, #007AFE 100%)"
             onClick={() => {
               //
-              radioChecked.value = null;
+              // radioChecked.value = null;
               emit('confirm', {});
-              emit('close');
+              // emit('close');
             }}>
             <i class={styles.iconAdd}></i>
             <span>新增学生</span>

+ 4 - 2
src/views/student-register/register-member/index.module.less

@@ -9,7 +9,7 @@
 
   .studentRegisterContainer {
     padding-top: 137px;
-    background: url('../images/new/banner-bg2.png') no-repeat top center;
+    background: url('../images/new/banner-bg3.png') no-repeat top center;
     background-size: contain;
   }
 }
@@ -24,7 +24,7 @@
 
   &.studentSectionForm {
     padding: 12px 0;
-    background: linear-gradient(180deg, #DBF6FD 0%, #FFFFFF 20%);
+    background: linear-gradient(180deg, #DBF6FD 0%, #FFFFFF 10%);
   }
 
   &.noSendDay {
@@ -252,6 +252,8 @@
   background: linear-gradient(135deg, #31C7FF 0%, #007AFE 100%);
   border-radius: 6px;
   margin-left: 12px;
+  font-size: 14px;
+  font-weight: 500;
 }
 
 .radioItem {

+ 109 - 23
src/views/student-register/register-member/index.tsx

@@ -93,7 +93,7 @@ export default defineComponent({
       studentList: [], // 手机号关联学生列表
       studentItem: {} as any, // 选择的学生
       isRegister: 'create' as 'create' | 'update' | '', // 是否注册学生
-      isTipRegister: true, // 是否显示名字不一致 - 默认显示
+      isTipRegister: false, // 是否显示名字不一致 - 默认显示
       isChangeSchool: false, // 是否切换学校
       gradeYear: null,
       schoolType: null,
@@ -110,6 +110,7 @@ export default defineComponent({
     });
     const otherParams = reactive({
       showOtherSchool: false,
+      showCloseButton: true, // 是否显示关闭按钮
       showOtherMessage: '',
       /**  limit 超限制,change 更换学生,nickname 名称不一致  */
       otherType: '' as 'limit' | 'change' | 'nickname',
@@ -205,6 +206,39 @@ export default defineComponent({
           forms.showMessage = '报名信息更新,请刷新后重新提交';
           forms.showButton = true;
         } else {
+          studentRegisterStore.setToken(
+            result.data.token_type + ' ' + result.data.access_token
+          );
+          setLoginInit();
+
+          const { extra, username } = studentInfo;
+          const registerResult = await request.post(
+            '/edu-app/student/register',
+            {
+              data: {
+                schoolId: forms.schoolId,
+                clientType: 'STUDENT',
+                schoolVerify: true,
+                ...extra,
+                mobile: username,
+                newRegUser: forms.isRegister === 'create' ? true : false
+              }
+            }
+          );
+
+          if (registerResult.code !== 200) {
+            if (registerResult.code === 5436) {
+              forms.showTips = true;
+              forms.showMessage = '二维码已经失效,详情请咨询学校老师';
+              forms.showButton = false;
+            } else if (registerResult.code === 5435) {
+              forms.showTips = true;
+              forms.showMessage = registerResult.message;
+              forms.showButton = true;
+            }
+            return;
+          }
+
           setTimeout(() => {
             showToast('报名成功');
             // router.push('/download');
@@ -225,21 +259,24 @@ export default defineComponent({
     };
 
     const checkForm = () => {
-      if (!studentInfo.extra.nickname) {
+      if (!checkPhone(studentInfo.username)) {
+        showToast('请输入正确的手机号码');
+        return true;
+      } else if (!studentInfo.password) {
+        showToast('请输入验证码');
+        return true;
+      } else if (!studentInfo.extra.nickname) {
         showToast('请输入学生姓名');
         return true;
+      } else if (![0, 1].includes(studentInfo.extra.gender)) {
+        showToast('请选择性别');
+        return true;
       } else if (!studentInfo.extra.currentGradeNum) {
         showToast('请选择所在年级');
         return true;
       } else if (!studentInfo.extra.currentClass) {
         showToast('请选择所在班级');
         return true;
-      } else if (!checkPhone(studentInfo.username)) {
-        showToast('请输入正确的手机号码');
-        return true;
-      } else if (!studentInfo.password) {
-        showToast('请输入验证码');
-        return true;
       }
       return false;
     };
@@ -280,7 +317,7 @@ export default defineComponent({
           changeTipStatus(true, false);
         } else {
           forms.isRegister = 'create';
-          changeTipStatus(true, false);
+          changeTipStatus(false, false);
           forms.studentItem = [];
         }
       } catch {
@@ -305,6 +342,7 @@ export default defineComponent({
           '学生姓名与上次提交信息不一致,请确认修改学生信息或创建新的学生账号';
         otherParams.showOtherSchool = true;
         otherParams.showCancelButton = true;
+        otherParams.showCloseButton = true;
         otherParams.cancelButtonColor =
           'linear-gradient( 224deg, #3FE1E6 0%, #00CDD4 100%)';
         otherParams.cancelButtonText = '新建学生';
@@ -324,6 +362,7 @@ export default defineComponent({
         otherParams.showOtherMessage = `同一手机号最多创建${forms.multi_user_limit}个学生`;
         otherParams.showOtherSchool = true;
         otherParams.showCancelButton = false;
+        otherParams.showCloseButton = true;
         otherParams.confirmButtonColor =
           'linear-gradient( 305deg, #40C8FF 0%, #3192FF 100%)';
         otherParams.confirmButtonText = '我知道了';
@@ -334,17 +373,19 @@ export default defineComponent({
 
       // 判断是否为同一个学校
       if (
+        forms.studentItem.schoolId &&
         forms.studentItem.schoolId !== forms.details.id &&
         !forms.isChangeSchool &&
         forms.isRegister === 'update'
       ) {
         otherParams.showOtherMessage = `您已绑定【${
+          forms.studentItem?.schoolName || ''
+        }】,提交后将更换到<span style="color: #2B85FF">【${
           forms.details.name || ''
-        }】,提交后将更换到【${
-          forms.studentItem?.schoolName
-        }】,是否确认提交?`;
+        }】</span>,是否确认提交?`;
         otherParams.showOtherSchool = true;
         otherParams.showCancelButton = true;
+        otherParams.showCloseButton = false;
         otherParams.cancelButtonColor = '';
         otherParams.cancelButtonText = '取消';
         otherParams.confirmButtonColor = '';
@@ -408,6 +449,22 @@ export default defineComponent({
         await getRegisterGoods();
       } catch {}
     });
+
+    /** 手机号变更时清空验证码信息,用户信息 */
+    const phoneChangeEmptyInfo = () => {
+      studentInfo.password = '';
+      studentInfo.extra.nickname = '';
+      studentInfo.extra.currentGradeNum = '';
+      studentInfo.extra.currentClass = '';
+      studentInfo.extra.gender = 1;
+      forms.currentClassText = '';
+      forms.gradeNumText = '';
+      forms.studentList = []; // 手机号关联学生列表
+      forms.studentItem = {}; // 选择的学生
+      forms.isRegister = 'create'; // 是否注册学生
+      forms.isTipRegister = false; // 是否显示名字不一致 - 默认显示
+      forms.isChangeSchool = false; // 是否切换学校
+    };
     return () => (
       <div class={styles.registerModal}>
         {/* {forms.giftVipDay ? (
@@ -442,7 +499,10 @@ export default defineComponent({
                 class={styles.username}
                 v-model={studentInfo.username}
                 border={false}
-                maxlength={11}>
+                maxlength={11}
+                onUpdate:modelValue={() => {
+                  phoneChangeEmptyInfo();
+                }}>
                 {{
                   label: () => (
                     <div>
@@ -502,7 +562,7 @@ export default defineComponent({
             class={[
               styles.studentSection,
               styles.studentSectionForm,
-              Number(forms.giftVipDay) <= 0 && styles.noSendDay
+              styles.noSendDay
             ]}>
             <div class={styles.title1}></div>
             <Form labelAlign="left" class={styles.registerForm}>
@@ -741,6 +801,7 @@ export default defineComponent({
 
         <MMessageTip
           show={otherParams.showOtherSchool}
+          // showCloseButton={otherParams.showCloseButton}
           messageAlign={otherParams.messageAlign}
           message={otherParams.showOtherMessage}
           showCancelButton={otherParams.showCancelButton}
@@ -748,6 +809,7 @@ export default defineComponent({
           cancelButtonText={otherParams.cancelButtonText}
           confirmButtonColor={otherParams.confirmButtonColor}
           confirmButtonText={otherParams.confirmButtonText}
+          onClose={() => (otherParams.showOtherSchool = false)}
           onCancel={() => {
             otherParams.showOtherSchool = false;
             if (otherParams.otherType === 'nickname') {
@@ -792,11 +854,15 @@ export default defineComponent({
             list={forms.studentList}
             onClose={() => (forms.showSelectStudent = false)}
             onConfirm={(val: any) => {
-              forms.studentItem = val;
               if (val.userId) {
+                forms.studentItem = val;
                 const firstStudent = val;
                 studentInfo.extra.nickname = firstStudent.nickname;
                 const tempGrade: any = gradeList.value[0] || [];
+
+                studentInfo.extra.currentGradeNum = '';
+                forms.gradeNumText = '';
+
                 tempGrade?.forEach((i: any) => {
                   if (i.value === firstStudent.currentGradeNum) {
                     // forms.instrumentCode = i.instrumentCode;
@@ -808,6 +874,9 @@ export default defineComponent({
                     // }
                   }
                 });
+
+                forms.currentClassText = '';
+                studentInfo.extra.currentClass = '';
                 classList.forEach((i: any) => {
                   if (i.value === firstStudent.currentClass) {
                     forms.currentClassText = i.text;
@@ -817,15 +886,32 @@ export default defineComponent({
                 studentInfo.extra.gender = firstStudent.gender;
                 forms.isRegister = 'update';
                 changeTipStatus(true, false);
+                forms.showSelectStudent = false;
               } else {
-                forms.isRegister = 'create';
-                changeTipStatus(false, false);
-                studentInfo.extra.nickname = '';
-                studentInfo.extra.currentGradeNum = '';
-                studentInfo.extra.currentClass = '';
-                studentInfo.extra.gender = 1;
-                forms.currentClassText = '';
-                forms.gradeNumText = '';
+                // 判断新建学员是否上限了
+                if (forms.studentList.length >= forms.multi_user_limit) {
+                  otherParams.showOtherMessage = `同一手机号最多创建${forms.multi_user_limit}个学生`;
+                  otherParams.showOtherSchool = true;
+                  otherParams.showCancelButton = false;
+                  otherParams.showCloseButton = true;
+                  otherParams.confirmButtonColor =
+                    'linear-gradient( 305deg, #40C8FF 0%, #3192FF 100%)';
+                  otherParams.confirmButtonText = '我知道了';
+                  otherParams.otherType = 'limit';
+                  otherParams.messageAlign = 'center';
+                  return true;
+                } else {
+                  forms.studentItem = val;
+                  forms.isRegister = 'create';
+                  changeTipStatus(false, false);
+                  studentInfo.extra.nickname = '';
+                  studentInfo.extra.currentGradeNum = '';
+                  studentInfo.extra.currentClass = '';
+                  studentInfo.extra.gender = 1;
+                  forms.currentClassText = '';
+                  forms.gradeNumText = '';
+                  forms.showSelectStudent = false;
+                }
               }
             }}
           />

+ 3 - 1
src/views/student-register/register-new/index.module.less

@@ -31,7 +31,7 @@
 
   &.studentSectionForm {
     padding: 12px 0;
-    background: linear-gradient(180deg, #DBF6FD 0%, #FFFFFF 20%);
+    background: linear-gradient(180deg, #DBF6FD 0%, #FFFFFF 10%);
   }
 
   &.noSendDay {
@@ -285,6 +285,8 @@
   background: linear-gradient(135deg, #31C7FF 0%, #007AFE 100%);
   border-radius: 6px;
   margin-left: 12px;
+  font-size: 14px;
+  font-weight: 500;
 }
 
 .radioItem {

+ 97 - 20
src/views/student-register/register-new/index.tsx

@@ -36,6 +36,7 @@ import vipGiftIcon from '../images/vip-gift-icon.png';
 // import agreeNo from '../images/agree-no.png';
 import MMessageTip from '@/components/m-message-tip';
 import SelectStudent from '../modal/select-student';
+import { setLoginInit } from '@/state';
 
 const classList: any = [];
 for (let i = 1; i <= 40; i++) {
@@ -95,7 +96,7 @@ export default defineComponent({
       studentList: [], // 手机号关联学生列表
       studentItem: {} as any, // 选择的学生
       isRegister: 'create' as 'create' | 'update' | '', // 是否注册学生
-      isTipRegister: true, // 是否显示名字不一致 - 默认显示
+      isTipRegister: false, // 是否显示名字不一致 - 默认显示
       isChangeSchool: false, // 是否切换学校
       details: {} as any,
       gradeYear: null,
@@ -111,6 +112,7 @@ export default defineComponent({
     });
     const otherParams = reactive({
       showOtherSchool: false,
+      showCloseButton: true, // 是否显示关闭按钮
       showOtherMessage: '',
       /**  limit 超限制,change 更换学生,nickname 名称不一致  */
       otherType: '' as 'limit' | 'change' | 'nickname',
@@ -134,8 +136,7 @@ export default defineComponent({
         currentClass: '',
         gender: 1,
         registerType: '', // 报名类型
-        giftVipDay: 0, // 赠送会员天数
-        clientType: 'TEACHER'
+        giftVipDay: 0 // 赠送会员天数
       },
       grant_type: 'password',
       loginType: 'SMS',
@@ -251,7 +252,7 @@ export default defineComponent({
           changeTipStatus(true, false);
         } else {
           forms.isRegister = 'create';
-          changeTipStatus(true, false);
+          changeTipStatus(false, false);
           forms.studentItem = [];
         }
       } catch {
@@ -279,6 +280,7 @@ export default defineComponent({
           '学生姓名与上次提交信息不一致,请确认修改学生信息或创建新的学生账号';
         otherParams.showOtherSchool = true;
         otherParams.showCancelButton = true;
+        otherParams.showCloseButton = true;
         otherParams.cancelButtonColor =
           'linear-gradient( 224deg, #3FE1E6 0%, #00CDD4 100%)';
         otherParams.cancelButtonText = '新建学生';
@@ -298,6 +300,7 @@ export default defineComponent({
         otherParams.showOtherMessage = `同一手机号最多创建${forms.multi_user_limit}个学生`;
         otherParams.showOtherSchool = true;
         otherParams.showCancelButton = false;
+        otherParams.showCloseButton = true;
         otherParams.confirmButtonColor =
           'linear-gradient( 305deg, #40C8FF 0%, #3192FF 100%)';
         otherParams.confirmButtonText = '我知道了';
@@ -308,17 +311,19 @@ export default defineComponent({
 
       // 判断是否为同一个学校
       if (
+        forms.studentItem.schoolId &&
         forms.studentItem.schoolId !== forms.details.id &&
         !forms.isChangeSchool &&
         forms.isRegister === 'update'
       ) {
         otherParams.showOtherMessage = `您已绑定【${
-          forms.details.name || ''
-        }】,提交后将更换到【${
-          forms.studentItem?.schoolName
-        }】,是否确认提交?`;
+          forms.studentItem?.schoolName || ''
+        }】,提交后将更换到
+        <span style="color: #2B85FF">【${forms.details.name || ''}】</span>
+        ,是否确认提交?`;
         otherParams.showOtherSchool = true;
         otherParams.showCancelButton = true;
+        otherParams.showCloseButton = false;
         otherParams.cancelButtonColor = '';
         otherParams.cancelButtonText = '取消';
         otherParams.confirmButtonColor = '';
@@ -374,9 +379,36 @@ export default defineComponent({
           forms.showMessage = '报名信息更新,请刷新后重新提交';
           forms.showButton = true;
         } else {
+          studentRegisterStore.setToken(
+            result.data.token_type + ' ' + result.data.access_token
+          );
+          setLoginInit();
+
+          const { extra, username } = studentInfo;
+          const registerResult = await request.post(
+            '/edu-app/student/register',
+            {
+              data: {
+                schoolId: forms.schoolId,
+                clientType: 'STUDENT',
+                ...extra,
+                mobile: username,
+                newRegUser: forms.isRegister === 'create' ? true : false
+              }
+            }
+          );
+
+          if (registerResult.code !== 200) {
+            if (result.code === 5435 || result.code === 5436) {
+              forms.showTips = true;
+              forms.showMessage = '报名信息更新,请刷新后重新提交';
+              forms.showButton = true;
+            }
+            return;
+          }
+
           setTimeout(() => {
             showToast('报名成功');
-            // router.push('/download');
           }, 100);
           setTimeout(() => {
             if (browser().weixin) {
@@ -403,6 +435,9 @@ export default defineComponent({
       } else if (!studentInfo.extra.nickname) {
         showToast('请输入学生姓名');
         return true;
+      } else if (![0, 1].includes(studentInfo.extra.gender)) {
+        showToast('请选择性别');
+        return true;
       } else if (!studentInfo.extra.currentGradeNum) {
         showToast('请选择所在年级');
         return true;
@@ -466,6 +501,22 @@ export default defineComponent({
         await getRegisterGoods();
       } catch {}
     });
+
+    /** 手机号变更时清空验证码信息,用户信息 */
+    const phoneChangeEmptyInfo = () => {
+      studentInfo.password = '';
+      studentInfo.extra.nickname = '';
+      studentInfo.extra.currentGradeNum = '';
+      studentInfo.extra.currentClass = '';
+      studentInfo.extra.gender = 1;
+      forms.currentClassText = '';
+      forms.gradeNumText = '';
+      forms.studentList = []; // 手机号关联学生列表
+      forms.studentItem = {}; // 选择的学生
+      forms.isRegister = 'create'; // 是否注册学生
+      forms.isTipRegister = false; // 是否显示名字不一致 - 默认显示
+      forms.isChangeSchool = false; // 是否切换学校
+    };
     return () => (
       <div class={styles.registerModal}>
         {/* {forms.giftVipDay ? (
@@ -501,7 +552,10 @@ export default defineComponent({
                 class={styles.username}
                 v-model={studentInfo.username}
                 border={false}
-                maxlength={11}>
+                maxlength={11}
+                onUpdate:modelValue={() => {
+                  phoneChangeEmptyInfo();
+                }}>
                 {{
                   label: () => (
                     <div>
@@ -560,7 +614,7 @@ export default defineComponent({
             class={[
               styles.studentSection,
               styles.studentSectionForm,
-              forms.giftVipDay <= 0 && styles.noSendDay
+              Number(forms.giftVipDay) > 0 && styles.noSendDay
             ]}>
             <div class={styles.title1}></div>
             <Form labelAlign="left" class={styles.registerForm}>
@@ -807,6 +861,7 @@ export default defineComponent({
 
         <MMessageTip
           show={otherParams.showOtherSchool}
+          // showCloseButton={otherParams.showCloseButton}
           messageAlign={otherParams.messageAlign}
           message={otherParams.showOtherMessage}
           showCancelButton={otherParams.showCancelButton}
@@ -814,6 +869,7 @@ export default defineComponent({
           cancelButtonText={otherParams.cancelButtonText}
           confirmButtonColor={otherParams.confirmButtonColor}
           confirmButtonText={otherParams.confirmButtonText}
+          onClose={() => (otherParams.showOtherSchool = false)}
           onCancel={() => {
             otherParams.showOtherSchool = false;
             if (otherParams.otherType === 'nickname') {
@@ -859,11 +915,13 @@ export default defineComponent({
             list={forms.studentList}
             onClose={() => (forms.showSelectStudent = false)}
             onConfirm={(val: any) => {
-              forms.studentItem = val;
               if (val.userId) {
+                forms.studentItem = val;
                 const firstStudent = val;
                 studentInfo.extra.nickname = firstStudent.nickname;
                 const tempGrade: any = gradeList.value[0] || [];
+                studentInfo.extra.currentGradeNum = '';
+                forms.gradeNumText = '';
                 tempGrade?.forEach((i: any) => {
                   if (i.value === firstStudent.currentGradeNum) {
                     // forms.instrumentCode = i.instrumentCode;
@@ -875,6 +933,8 @@ export default defineComponent({
                     // }
                   }
                 });
+                forms.currentClassText = '';
+                studentInfo.extra.currentClass = '';
                 classList.forEach((i: any) => {
                   if (i.value === firstStudent.currentClass) {
                     forms.currentClassText = i.text;
@@ -884,15 +944,32 @@ export default defineComponent({
                 studentInfo.extra.gender = firstStudent.gender;
                 forms.isRegister = 'update';
                 changeTipStatus(true, false);
+                forms.showSelectStudent = false;
               } else {
-                forms.isRegister = 'create';
-                changeTipStatus(false, false);
-                studentInfo.extra.nickname = '';
-                studentInfo.extra.currentGradeNum = '';
-                studentInfo.extra.currentClass = '';
-                studentInfo.extra.gender = 1;
-                forms.currentClassText = '';
-                forms.gradeNumText = '';
+                // 判断新建学员是否上限了
+                if (forms.studentList.length >= forms.multi_user_limit) {
+                  otherParams.showOtherMessage = `同一手机号最多创建${forms.multi_user_limit}个学生`;
+                  otherParams.showOtherSchool = true;
+                  otherParams.showCancelButton = false;
+                  otherParams.showCloseButton = true;
+                  otherParams.confirmButtonColor =
+                    'linear-gradient( 305deg, #40C8FF 0%, #3192FF 100%)';
+                  otherParams.confirmButtonText = '我知道了';
+                  otherParams.otherType = 'limit';
+                  otherParams.messageAlign = 'center';
+                  return true;
+                } else {
+                  forms.studentItem = val;
+                  forms.isRegister = 'create';
+                  changeTipStatus(false, false);
+                  studentInfo.extra.nickname = '';
+                  studentInfo.extra.currentGradeNum = '';
+                  studentInfo.extra.currentClass = '';
+                  studentInfo.extra.gender = 1;
+                  forms.currentClassText = '';
+                  forms.gradeNumText = '';
+                  forms.showSelectStudent = false;
+                }
               }
             }}
           />