Prechádzať zdrojové kódy

Merge branch 'iteration-20240403-apply' into jenkins-test

lex 1 rok pred
rodič
commit
fddefa5486

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

+ 31 - 3
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,
@@ -470,9 +473,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;
             }}

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


+ 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: 230px;
+      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);

+ 13 - 9
src/views/student-register/index.tsx

@@ -645,6 +645,7 @@ export default defineComponent({
           data: {
             schoolId: forms.schoolId,
             clientType: 'STUDENT',
+            schoolVerify: true,
             ...extra,
             giftVipDay:
               forms.detailVip.membershipDays || 0 + forms.giftVipDay || 0,
@@ -2071,11 +2072,11 @@ export default defineComponent({
                 const firstStudent = val;
                 studentInfo.extra.nickname = firstStudent.nickname;
                 const tempGrade: any = forms.gradeList || [];
-                if (!firstStudent.currentGradeNum) {
-                  studentInfo.extra.currentGradeNum = null;
-                  forms.gradeNumText = '';
-                  forms.instrumentCode = '';
-                }
+
+                studentInfo.extra.currentGradeNum = null;
+                forms.gradeNumText = '';
+                forms.instrumentCode = '';
+
                 tempGrade?.forEach((i: any) => {
                   if (i.value === firstStudent.currentGradeNum) {
                     forms.instrumentCode = i.instrumentCode;
@@ -2087,10 +2088,10 @@ export default defineComponent({
                     }
                   }
                 });
-                if (!firstStudent.currentClass) {
-                  studentInfo.extra.currentClass = null;
-                  forms.currentClassText = '';
-                }
+
+                studentInfo.extra.currentClass = null;
+                forms.currentClassText = '';
+
                 forms.classList.forEach((i: any) => {
                   if (i.value === firstStudent.currentClass) {
                     forms.currentClassText = i.text;
@@ -2100,6 +2101,8 @@ export default defineComponent({
                 studentInfo.extra.gender = firstStudent.gender;
                 forms.isRegister = 'update';
                 changeTipStatus(true, false);
+
+                forms.showSelectStudent = false;
               } else {
                 // 判断新建学员是否上限了
                 if (forms.studentList.length >= forms.multi_user_limit) {
@@ -2123,6 +2126,7 @@ export default defineComponent({
                   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>

+ 34 - 9
src/views/student-register/register-member/index.tsx

@@ -218,6 +218,7 @@ export default defineComponent({
               data: {
                 schoolId: forms.schoolId,
                 clientType: 'STUDENT',
+                schoolVerify: true,
                 ...extra,
                 mobile: username,
                 newRegUser: forms.isRegister === 'create' ? true : false
@@ -850,11 +851,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;
@@ -866,6 +871,9 @@ export default defineComponent({
                     // }
                   }
                 });
+
+                forms.currentClassText = '';
+                studentInfo.extra.currentClass = '';
                 classList.forEach((i: any) => {
                   if (i.value === firstStudent.currentClass) {
                     forms.currentClassText = i.text;
@@ -875,15 +883,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;
+                }
               }
             }}
           />

+ 30 - 9
src/views/student-register/register-new/index.tsx

@@ -912,11 +912,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;
@@ -928,6 +930,8 @@ export default defineComponent({
                     // }
                   }
                 });
+                forms.currentClassText = '';
+                studentInfo.extra.currentClass = '';
                 classList.forEach((i: any) => {
                   if (i.value === firstStudent.currentClass) {
                     forms.currentClassText = i.text;
@@ -937,15 +941,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;
+                }
               }
             }}
           />