import { Image, Cell, Tag, Button, Popup, showToast, Form, Field, CountDown, RadioGroup, Radio, Picker, closeToast, Popover, Area, CellGroup, showConfirmDialog } from 'vant'; import { computed, defineComponent, nextTick, onMounted, onUnmounted, reactive, ref } from 'vue'; import { setLogin, setLoginInit, setLogout } from '@/state'; import styles from './index.module.less'; import MSticky from '@/components/m-sticky'; // import MVideo from '@/components/m-video'; import { useRoute, useRouter } from 'vue-router'; import { useStudentRegisterStore } from '@/store/modules/student-register-store'; import request from '@/helpers/request'; import { browser, checkPhone, getUrlCode, moneyFormat } from '@/helpers/utils'; // import deepClone from '@/helpers/deep-clone'; import OWxTip from '@/components/m-wx-tip'; import { useCountDown } from '@vant/use'; import MImgCode from '@/components/m-img-code'; import { useInterval, useIntervalFn } from '@vueuse/core'; import MMessageTip from '@/components/m-message-tip'; import SelectStudent from '@/views/student-register/modal/select-student'; import { api_sysAreaQueryAllProvince } from '@/views/school-register/api'; import CodeDialog from '../modal/code-dialog'; import MSearch from '@/components/m-search'; import { removeAuth } from '@/views/student-register/layout/utils'; import { storage } from '@/helpers/storage'; import { ACCESS_TOKEN } from '@/store/mutation-types'; import { api_verification } from '@/views/creation/api'; const classList: any = []; for (let i = 1; i <= 40; i++) { classList.push({ text: i + '班', value: i }); } const GRADE_ENUM = { '1': '一年级', '2': '二年级', '3': '三年级', '4': '四年级', '5': '五年级', '6': '六年级', '7': '七年级', '8': '八年级', '9': '九年级' } as any; const getGradeList = (gradeYear?: string, instrumentCode?: string) => { let tempList: any = []; const five = [ { text: '一年级', value: 1, instrumentCode }, { text: '二年级', value: 2, instrumentCode }, { text: '三年级', value: 3, instrumentCode }, { text: '四年级', value: 4, instrumentCode }, { text: '五年级', value: 5, instrumentCode } ]; const one = [{ text: '六年级', value: 6, instrumentCode }]; const three = [ { text: '七年级', value: 7, instrumentCode }, { text: '八年级', value: 8, instrumentCode }, { text: '九年级', value: 9, instrumentCode } ]; if (gradeYear === 'FIVE_YEAR_SYSTEM') { tempList.push(...[...five]); } else if (gradeYear === 'SIX_YEAR_SYSTEM') { tempList.push(...[...five, ...one]); } else if (gradeYear === 'THREE_YEAR_SYSTEM') { tempList.push(...[...three]); } else if (gradeYear === 'FORE_YEAR_SYSTEM') { tempList.push(...[...one, ...three]); } else { tempList.push(...[...five, ...one, ...three]); } return tempList; }; export default defineComponent({ name: 'activation-register', setup() { const route = useRoute(); const studentRegisterStore = useStudentRegisterStore(); const router = useRouter(); // 初始化学校编号 // studentRegisterStore.setShoolId(route.query.sId as any); const countDownRef = ref(); const forms = reactive({ isLoginRegister: false, // 是否已经登录或已注册 schoolId: null as any, schoolAreaId: null, // 学校区域编号 activationCode: null as any, // 互通码 paymentType: '', // 支付类型 paymentChannel: '', multi_user_limit: 1, // 限制注册学生数量 // popupShow: false, registerDetails: {} as any, details: [] as any[], // schoolType: '', // 学校类型 gradeYear: '', // 学制 schoolInstrumentSetType: null as any, // bugGoods: false, // 是否购买AI isRegister: 'create' as 'create' | 'update' | '', // 是否注册学生 isDisabled: false, isTipRegister: false, // 是否显示名字不一致 - 默认显示 isChangeSchool: false, // 是否切换学校 schoolStatus: false, schoolPopupShow: false, schoolLoading: false, schoolPopupIndex: [] as any, schoolAreaList: [] as any, provinceCode: null, cityCode: null, regionCode: null, showResultPopup: false, reslutPopupType: '' as any, resultPopupContent: '', registerType: '', // 报名类型 detailVip: {} as any, giftVipDay: 0, // 赠送天数 submitLoading: false, // showMore: true, showTips: false, showButton: false, showMessage: '请使用微信扫描二维码', countDownStatus: true, countDownTime: 1000 * 120, // 倒计时时间 // modelValue: false, // 是否选中协议 imgCodeStatus: false, gradeNumText: '', currentClassText: '', schoolName: '', areaName: '', gradeStatus: false, classStatus: false, loading: false, showConfirmPopup: false, // 二次确认用户信息 showPicker: false, areaList: [] as any, tipStatus: true, dialogConfirmStatus: false, contract_sign: false, // 是否实名认证 countDownTimePay: 60 * 1000, dialogConfig: {} as any, showSelectStudent: false, // 选择学生 studentList: [], // 手机号关联学生列表 studentItem: {} as any, // 选择的学生 joinType: 'digitalize' as 'digitalize' | 'tradition', gradeList: [] as any, classList: [] as any, saveUserId: null as any, saveId: null as any, openId: null as any, code: null as any, registerExpireTime: null as any, // 结束时间 instrumentCode: null as any, // 乐器编码 activeOverTime: 0, // 活动结束时间 activeOverStatus: true, // 活动是否结束 默认已结束 gradePopupShow: false, gradePopupIndex: [] as any, // 年级下拉索引 classPopupShow: false, classPopupIndex: [] as any // 班级下拉索引 }); const otherParams = reactive({ showOtherSchool: false, showCloseButton: true, // 是否显示关闭按钮 showOtherMessage: '', /** limit 超限制,change 更换学生,nickname 名称不一致 member 会员购买, payment 支付方式 */ otherType: '' as 'limit' | 'change' | 'nickname' | 'member' | 'payment', showCancelButton: true, cancelButtonColor: '', cancelButtonText: '取消', showConfirmButton: true, confirmButtonColor: '', confirmButtonText: '确定', messageAlign: 'left' as 'center' | 'left' | 'right' }); const state = reactive({ showQrcode: false, qrCodeUrl: '', pay_channel: '', orderInfo: {} as any, // 订单信息 authShow: false, orderNo: null as any, config: {} as any, paymentStatus: false, orderTimer: null as any }); /* 新用户: autoRegister: true loginType: 'SMS' 已存在用户: autoRegister: false loginType: 'TOKEN' password: xxx */ const studentInfo = reactive({ autoRegister: true, multiUser: true, // 是否为多用户 client_id: 'cooleshow-student', client_secret: 'cooleshow-student', extra: { nickname: '', currentGradeNum: '' as any, currentClass: '' as any, gender: 1 as any, registerType: null as any, // 报名类型 giftVipDay: 0 // 赠送会员天数 }, grant_type: 'password', loginType: 'SMS', password: '', username: '' }); /** 报名结束提示 */ const applyOver = () => { forms.showTips = true; // forms.showMessage = '团购时间已截止,感谢您的参与'; forms.showMessage = '
报名已截止,感谢您的参与
'; forms.showButton = false; }; const onCodeSend = () => { forms.countDownStatus = false; nextTick(() => { countDownRef.value.start(); }); }; const onSendCode = () => { // 发送验证码 if (!checkPhone(studentInfo.username)) { return showToast('请输入正确的手机号码'); } forms.imgCodeStatus = true; }; const validatePhone = computed(() => { return checkPhone(studentInfo.username) ? true : false; }); const onFinished = () => { forms.countDownStatus = true; countDownRef.value.reset(); }; // 格式化提示状态 const changeTipStatus = (register: boolean, school: boolean) => { forms.isTipRegister = register; forms.isChangeSchool = school; }; const checkForm = (status = true) => { if (!checkPhone(studentInfo.username)) { status && showToast('请输入正确的手机号码'); return true; } else if (!studentInfo.password) { status && showToast('请输入验证码'); return true; } 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; } else if (!studentInfo.extra.currentClass) { status && showToast('请选择所在班级'); return true; } else if (!forms.activationCode) { status && showToast('请输入互通码'); return true; } return false; }; // const checkSubmit = () => { const { extra } = studentInfo; if ( forms.studentItem.nickname !== extra.nickname && forms.isTipRegister ) { otherParams.showOtherMessage = '学生姓名与上次提交信息不一致,请确认修改学生信息或创建新的学生账号'; otherParams.showOtherSchool = true; otherParams.showCancelButton = true; otherParams.showCloseButton = true; otherParams.cancelButtonColor = 'linear-gradient( 224deg, #3FE1E6 0%, #00CDD4 100%)'; otherParams.cancelButtonText = '新建学生'; otherParams.confirmButtonColor = 'linear-gradient( 305deg, #40C8FF 0%, #3192FF 100%)'; otherParams.confirmButtonText = '修改信息'; otherParams.otherType = 'nickname'; otherParams.messageAlign = 'left'; return true; } // 判断新建学员是否上限了 if ( forms.isRegister === 'create' && 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; } return false; }; /** * 登记成功之后购买 */ const onSubmit = async () => { forms.submitLoading = true; try { if (checkForm() || checkSubmit()) { forms.submitLoading = false; return; } const { extra, loginType, autoRegister, password, multiUser, ...res } = studentInfo; /* 新用户: autoRegister: true loginType: 'SMS' 已存在用户: autoRegister: false loginType: 'TOKEN' password: xxx */ let tLoginType = loginType, tAutoRegister = autoRegister, tPassword = password, tMultiUser = multiUser; if (forms.isRegister === 'update') { tLoginType = 'TOKEN'; tAutoRegister = false; tPassword = forms.studentItem.token; tMultiUser = false; } // 为了处理新注册学员,在次注册 if (forms.isLoginRegister) { await updateStudentInfo(); } else { const result = await request.post('/edu-app/userlogin', { requestType: 'form', data: { loginType: tLoginType, autoRegister: tAutoRegister, password: tPassword, multiUser: tMultiUser, ...res, extra: JSON.stringify({ ...extra, // giftVipDay: // forms.detailVip.membershipDays || 0 + forms.giftVipDay || 0, schoolId: forms.schoolId }) } }); if (result.code !== 200) { if (result.code === 5436) { forms.showTips = true; forms.showMessage = '二维码已经失效,详情请咨询学校老师'; forms.showButton = false; } else if (result.code === 5435) { forms.showTips = true; forms.showMessage = result.message; forms.showButton = true; } } else { forms.isLoginRegister = true; studentRegisterStore.setToken( result.data.token_type + ' ' + result.data.access_token ); setLoginInit(); // 获取用户信息 // const res = await request.get('/edu-app/user/getUserInfo', { // requestType: 'form' // }); // setLogin(res.data); await updateStudentInfo(); } } } catch { // 重置信息 - 如果是新建则不提示 changeTipStatus(forms.isRegister === 'create' ? false : true, false); } finally { forms.submitLoading = false; } }; const checkLogin = async () => { try { // 判断是否登录 const Authorization = storage.get(ACCESS_TOKEN) || ''; if (Authorization) { const res = await api_verification({ token: Authorization }); if (!res.data) { removeAuth(); setLogout(); return false; } else { return true; } } else { return false; } } catch (err) { // storage.remove(ACCESS_TOKEN); removeAuth(); setLogout(); return false; } }; const updateStudentInfo = async () => { try { if (forms.isLoginRegister) { const status = await checkLogin(); if (!status) { studentInfo.username = ''; phoneChangeEmptyInfo(); } } const { extra, username } = studentInfo; const registerResult = await request.post('/edu-app/student/register', { data: { clientType: 'STUDENT', ...extra, activationCode: forms.activationCode, schoolId: forms.schoolId, schoolAreaId: forms.schoolAreaId, // giftVipFlag: forms.registerDetails.giftVipFlag || false, // giftVipDay: forms.giftVipDay || 0, schoolVerify: false, // firstVipDay: forms.detailVip.membershipDays || 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; } else if ( registerResult.code === 5442 || registerResult.code === 5443 ) { forms.showResultPopup = true; forms.reslutPopupType = 'EXPIRED'; forms.resultPopupContent = registerResult.message; } // else if (registerResult.code === 5443) { // forms.showResultPopup = true; // forms.reslutPopupType = 'CANCELLED'; // forms.resultPopupContent = registerResult.message; // } return false; } else { forms.showResultPopup = true; forms.reslutPopupType = 'ACTIVATING'; return true; } } catch {} }; const getUserInfos = async () => { if ( studentInfo.password.length !== 6 || !checkPhone(studentInfo.username) ) { return; } try { // 15907120131; const { data } = await request.get( `/edu-app/open/student/studentInfo?mobile=${studentInfo.username}&code=${studentInfo.password}&type=REGISTER&activationCodeFlag=1` ); forms.studentList = data || []; if (forms.studentList.length > 0) { const firstStudent: any = forms.studentList[0]; forms.studentItem = firstStudent; studentInfo.extra.nickname = firstStudent.nickname; const tempArea = [] as any; if (firstStudent.provinceName) { tempArea.push(firstStudent.provinceName); forms.provinceCode = firstStudent.provinceCode; } if (firstStudent.cityName) { tempArea.push(firstStudent.cityName); forms.cityCode = firstStudent.cityCode; } if (firstStudent.regionName) { tempArea.push(firstStudent.regionName); forms.regionCode = firstStudent.regionCode; } forms.areaName = tempArea.join(' '); forms.schoolName = firstStudent.schoolName; forms.schoolId = firstStudent.schoolId; forms.schoolAreaId = firstStudent.schoolAreaId; const tempGrade: any = forms.gradeList || []; tempGrade?.forEach((i: any) => { if (i.value === firstStudent.currentGradeNum) { forms.instrumentCode = i.instrumentCode; forms.gradeNumText = i.text; studentInfo.extra.currentGradeNum = firstStudent.currentGradeNum; if (forms.schoolInstrumentSetType === 'CLASS') { forms.classList = i.classList; } } }); forms.classList.forEach((i: any) => { if (i.value === firstStudent.currentClass) { forms.currentClassText = i.text; studentInfo.extra.currentClass = firstStudent.currentClass; } }); studentInfo.extra.gender = firstStudent.gender; forms.isRegister = 'update'; changeTipStatus(true, false); } else { forms.isRegister = 'create'; changeTipStatus(false, false); forms.studentItem = []; } } catch { // } }; /** 手机号变更时清空验证码信息,用户信息 */ const phoneChangeEmptyInfo = () => { studentInfo.password = ''; studentInfo.extra.nickname = ''; studentInfo.extra.currentGradeNum = ''; studentInfo.extra.currentClass = ''; studentInfo.extra.gender = 1; forms.areaName = ''; forms.schoolName = ''; forms.currentClassText = ''; forms.gradeNumText = ''; forms.studentList = []; // 手机号关联学生列表 forms.studentItem = {}; // 选择的学生 forms.isRegister = 'create'; // 是否注册学生 forms.isTipRegister = false; // 是否显示名字不一致 - 默认显示 forms.isChangeSchool = false; // 是否切换学校 }; const formateArea = (area: any[]) => { const province_list: { [_: string]: string } = {}; const city_list: { [_: string]: string } = {}; const county_list: { [_: string]: string } = {}; area.forEach((item: any) => { province_list[item.code] = item.name; }); area.forEach((item: any) => { item.areas?.forEach((city: any) => { city_list[city.code] = city.name; }); }); area.forEach((item: any) => { item.areas?.forEach((city: any) => { city.areas?.forEach((county: any) => { county_list[county.code] = county.name; }); }); }); return { province_list, city_list, county_list }; }; const getAreaList = () => { api_sysAreaQueryAllProvince().then(res => { if (res?.code === 200) { forms.areaList = formateArea(res.data); } }); }; const getSchoolAreaList = async (name?: string) => { forms.schoolLoading = true; try { const { data } = await request.post('/edu-app/open/schoolArea/list', { data: { name, testFlag: true, provinceCode: forms.provinceCode, cityCode: forms.cityCode, regionCode: forms.regionCode } }); forms.schoolAreaList = data; } catch { // } forms.schoolLoading = false; }; // 格式化互通码 const maskMiddleDigits = (str: string) => { if (!str) { return ''; } let numPart = str.match(/\d+/); // 提取数字部分 if (numPart) { let start = str.indexOf(numPart[0]); // 数字部分的起始索引 let end = start + numPart[0].length; // 数字部分的结束索引 let maskedStr = str.substring(0, start) + '*'.repeat(numPart[0].length) + str.substring(end); return maskedStr; } return str; }; // 获取地区学校详情 const getSchoolAreaDetail = async () => { try { const { data } = await request.get( '/edu-app/open/schoolArea/detail/' + forms.schoolAreaId ); console.log(data, 'data'); if (data.school) { const schoolInfo = data.school || {}; const schoolInstrumentList = schoolInfo.schoolInstrumentList || []; forms.schoolInstrumentSetType = schoolInfo.instrumentSetType; if (schoolInfo.instrumentSetType === 'SCHOOL') { const instrumentCode = schoolInstrumentList[0]?.instrumentCode; forms.gradeList = getGradeList( schoolInfo.gradeYear, instrumentCode ); forms.classList = classList; } else if (schoolInfo.instrumentSetType === 'GRADE') { forms.gradeList = []; schoolInstrumentList.forEach((item: any) => { forms.gradeList.push({ text: GRADE_ENUM[item.gradeNum], value: item.gradeNum, instrumentId: item.instrumentId, instrumentCode: item.instrumentCode }); }); forms.gradeList.sort((a: any, b: any) => a.value - b.value); forms.classList = classList; } else if (schoolInfo.instrumentSetType === 'CLASS') { // 班级 const tempGradeList: any[] = []; schoolInstrumentList.forEach((item: any) => { if (!tempGradeList.includes(item.gradeNum)) { tempGradeList.push(item.gradeNum); } }); const lastGradeList: any[] = []; tempGradeList.forEach((temp: any) => { const list = { text: GRADE_ENUM[temp], value: temp, instrumentId: '', instrumentCode: '', instrumentName: '', classList: [] as any }; schoolInstrumentList.forEach((item: any) => { if (temp === item.gradeNum) { list.instrumentId = item.instrumentId; list.instrumentCode = item.instrumentCode; list.instrumentName = item.instrumentName; list.classList.push({ text: item.classNum + '班', value: item.classNum, instrumentCode: item.instrumentCode }); } }); // 排序班级 list.classList.sort((a: any, b: any) => a.value - b.value); lastGradeList.push(list); }); lastGradeList.sort((a: any, b: any) => a.value - b.value); forms.gradeList = lastGradeList; forms.classList = []; } else { forms.gradeList = getGradeList(schoolInfo.gradeYear); forms.classList = classList; } } else { forms.schoolInstrumentSetType = ''; forms.gradeList = getGradeList(); forms.classList = classList; } } catch { // } }; onMounted(async () => { try { storage.remove(ACCESS_TOKEN); removeAuth(); setLogout(); const code: any = route.query.code; if (code) { forms.activationCode = window.atob(code); } } catch { // } getAreaList(); try { // 获取支付类型 const { data } = await request.get( '/edu-app/open/paramConfig/queryByParamNameList', { requestType: 'form', params: { paramNames: 'multi_user_limit' } } ); if (data && Array.isArray(data)) { data.forEach((item: any) => { if (item.paramName === 'multi_user_limit') { forms.multi_user_limit = item.paramValue ? Number(item.paramValue) : 1; } }); } } catch {} forms.gradeList = getGradeList(); forms.classList = classList; }); return () => (请下载 【音乐数字课堂App】 ,使用手机号激活,实现音乐课堂互通互联
)} {forms.reslutPopupType === 'CANCELLED' && ({forms.resultPopupContent}
)} {forms.reslutPopupType === 'EXPIRED' && ({forms.resultPopupContent}
)}