瀏覽代碼

Merge branch 'iteration-20240403-apply' into dev

lex 1 年之前
父節點
當前提交
3a403ae775

+ 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);
 }
 

+ 39 - 4
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,
@@ -228,13 +231,20 @@ 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();
+      }
+      try {
         const res = await api_openUserMusicDetail(state.id);
 
         if (res.code === 999) {
@@ -470,9 +480,34 @@ export default defineComponent({
           <LoginModel
             isRegister
             onClose={() => (state.loginStatus = false)}
-            onConfirm={async (val: boolean) => {
-              state.loginTag = val;
-              state.loginStatus = false;
+            onConfirm={async (val: any) => {
+              console.log(val, 'val');
+              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;
             }}

二進制
src/views/creation/login-change-model/images/icon-b-line.png


二進制
src/views/creation/login-change-model/images/icon-n-1.png


二進制
src/views/creation/login-change-model/images/icon-n-2.png


二進制
src/views/creation/login-change-model/images/message-close.png


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

@@ -0,0 +1,159 @@
+.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 {
+      font-weight: 600;
+      font-size: 16px;
+      color: #1189FF;
+    }
+
+    .van-button__text {
+      display: flex;
+      align-items: center;
+      justify-content: center;
+    }
+  }
+}

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

@@ -0,0 +1,153 @@
+import { defineComponent, onMounted, ref } 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);
+
+    onMounted(async () => {
+      try {
+        const { data } = await request.post('/edu-app/open/user/getMultiUser', {
+          data: {
+            ...props.credential
+          }
+        });
+        const result = data || [];
+        result.forEach((item: any) => {
+          list.value.push({
+            userId: item.studentId,
+            avatar: item.avatar,
+            nickname: item.nickname,
+            schoolName: item.schoolName,
+            token: item.token,
+            tokenExpireTime: item.tokenExpireTime
+          });
+        });
+      } catch {
+        //
+      }
+    });
+    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}
+            color="linear-gradient( 135deg, #31C7FF 0%, #007AFE 100%)"
+            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>
+    );
+  }
+});

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

@@ -49,20 +49,31 @@ 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 }
+          });
+        } else {
+          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', true);
+          emit('confirm', { loginTag: true });
+        }
       } catch (e: any) {
         //
         console.log(e);

+ 137 - 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: '', // 报名类型
@@ -450,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;
@@ -509,17 +512,18 @@ 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">${
+        }】,提交后将更换到
+        <span style="color: #2B85FF">${
           forms.registerDetails.schoolName || ''
-        }</span>
-        ,是否确认提交?`;
+        }</span>
+        ,是否确认提交?`;
         otherParams.showOtherSchool = true;
         otherParams.showCloseButton = false;
         otherParams.showCancelButton = true;
@@ -637,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 {
@@ -650,6 +693,9 @@ export default defineComponent({
 
         // 传统方式
         if (forms.joinType === 'tradition') {
+          const updateStatus = await updateStudentInfo();
+          if (!updateStatus) return;
+
           setTimeout(() => {
             showToast('报名成功');
             // router.push('/download');
@@ -666,10 +712,7 @@ export default defineComponent({
 
         if (schoolInfo.data.hasBuyCourse && vipList.length > 0) {
           // forms.dialogConfirmStatus = true;
-
-          // 15907121011
-
-          otherParams.showOtherMessage = `该学员已购买会员,是否确认购买?`;
+          otherParams.showOtherMessage = `该学员已购买会员,是否再次购买?`;
           otherParams.showOtherSchool = true;
           otherParams.showCloseButton = false;
           otherParams.showCancelButton = true;
@@ -774,6 +817,8 @@ export default defineComponent({
 
           // 判断是否有完成订单 并且选择 自备
           if (isFinal && forms.joinType === 'tradition') {
+            const studentResult = await updateStudentInfo();
+            if (!studentResult) return;
             setTimeout(() => {
               showToast('您已通过数字化方式报名成功');
             }, 100);
@@ -792,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;
           }
 
@@ -842,7 +886,10 @@ export default defineComponent({
         await request.post(
           '/edu-app/userPaymentOrder/cancelPayment/' + orderNo
         );
-      } catch {}
+        return true;
+      } catch {
+        return false;
+      }
     };
 
     const paymentContinue = async () => {
@@ -872,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',
           {
@@ -1176,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 {
         // 获取支付类型
@@ -1263,7 +1330,10 @@ export default defineComponent({
                 class={styles.username}
                 v-model={studentInfo.username}
                 border={false}
-                maxlength={11}>
+                maxlength={11}
+                onUpdate:modelValue={() => {
+                  phoneChangeEmptyInfo();
+                }}>
                 {{
                   label: () => (
                     <div>
@@ -1804,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();
             }
           }}
@@ -1870,7 +1943,7 @@ export default defineComponent({
 
         <MMessageTip
           show={otherParams.showOtherSchool}
-          showCloseButton={otherParams.showCloseButton}
+          // showCloseButton={otherParams.showCloseButton}
           messageAlign={otherParams.messageAlign}
           message={otherParams.showOtherMessage}
           showCancelButton={otherParams.showCancelButton}
@@ -1879,13 +1952,15 @@ export default defineComponent({
           confirmButtonColor={otherParams.confirmButtonColor}
           confirmButtonText={otherParams.confirmButtonText}
           onClose={() => (otherParams.showOtherSchool = false)}
-          onCancel={() => {
+          onCancel={async () => {
             otherParams.showOtherSchool = false;
             if (otherParams.otherType === 'nickname') {
               forms.isRegister = 'create'; // 新建
               changeTipStatus(false, false);
               onSubmit();
             } else if (otherParams.otherType === 'member') {
+              const updateStatus = await updateStudentInfo();
+              if (!updateStatus) return;
               //取消支付,判断是否有结束时间,是否已经结束
               if (forms.registerExpireTime && forms.activeOverStatus) {
                 applyOver();
@@ -1939,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;
@@ -1955,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;
@@ -1964,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>

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

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

+ 101 - 21
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,
@@ -206,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');
@@ -226,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;
     };
@@ -337,15 +373,16 @@ 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">${
+        }】,提交后将更换到<span style="color: #2B85FF">${
           forms.details.name || ''
-        }</span>,是否确认提交?`;
+        }</span>,是否确认提交?`;
         otherParams.showOtherSchool = true;
         otherParams.showCancelButton = true;
         otherParams.showCloseButton = false;
@@ -412,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 ? (
@@ -446,7 +499,10 @@ export default defineComponent({
                 class={styles.username}
                 v-model={studentInfo.username}
                 border={false}
-                maxlength={11}>
+                maxlength={11}
+                onUpdate:modelValue={() => {
+                  phoneChangeEmptyInfo();
+                }}>
                 {{
                   label: () => (
                     <div>
@@ -745,7 +801,7 @@ export default defineComponent({
 
         <MMessageTip
           show={otherParams.showOtherSchool}
-          showCloseButton={otherParams.showCloseButton}
+          // showCloseButton={otherParams.showCloseButton}
           messageAlign={otherParams.messageAlign}
           message={otherParams.showOtherMessage}
           showCancelButton={otherParams.showCancelButton}
@@ -798,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;
@@ -814,6 +874,9 @@ export default defineComponent({
                     // }
                   }
                 });
+
+                forms.currentClassText = '';
+                studentInfo.extra.currentClass = '';
                 classList.forEach((i: any) => {
                   if (i.value === firstStudent.currentClass) {
                     forms.currentClassText = i.text;
@@ -823,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;
+                }
               }
             }}
           />

+ 2 - 0
src/views/student-register/register-new/index.module.less

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

+ 89 - 18
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,
@@ -135,8 +136,7 @@ export default defineComponent({
         currentClass: '',
         gender: 1,
         registerType: '', // 报名类型
-        giftVipDay: 0, // 赠送会员天数
-        clientType: 'TEACHER'
+        giftVipDay: 0 // 赠送会员天数
       },
       grant_type: 'password',
       loginType: 'SMS',
@@ -311,15 +311,16 @@ 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 || ''}</span>
-        ,是否确认提交?`;
+        }】,提交后将更换到
+        <span style="color: #2B85FF">${forms.details.name || ''}</span>
+        ,是否确认提交?`;
         otherParams.showOtherSchool = true;
         otherParams.showCancelButton = true;
         otherParams.showCloseButton = false;
@@ -378,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) {
@@ -407,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;
@@ -470,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 ? (
@@ -505,7 +552,10 @@ export default defineComponent({
                 class={styles.username}
                 v-model={studentInfo.username}
                 border={false}
-                maxlength={11}>
+                maxlength={11}
+                onUpdate:modelValue={() => {
+                  phoneChangeEmptyInfo();
+                }}>
                 {{
                   label: () => (
                     <div>
@@ -811,7 +861,7 @@ export default defineComponent({
 
         <MMessageTip
           show={otherParams.showOtherSchool}
-          showCloseButton={otherParams.showCloseButton}
+          // showCloseButton={otherParams.showCloseButton}
           messageAlign={otherParams.messageAlign}
           message={otherParams.showOtherMessage}
           showCancelButton={otherParams.showCancelButton}
@@ -865,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;
@@ -881,6 +933,8 @@ export default defineComponent({
                     // }
                   }
                 });
+                forms.currentClassText = '';
+                studentInfo.extra.currentClass = '';
                 classList.forEach((i: any) => {
                   if (i.value === firstStudent.currentClass) {
                     forms.currentClassText = i.text;
@@ -890,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;
+                }
               }
             }}
           />