|
@@ -8,27 +8,103 @@ import {
|
|
|
Icon,
|
|
|
Popup,
|
|
|
showConfirmDialog,
|
|
|
- showToast
|
|
|
+ showToast,
|
|
|
+ Form,
|
|
|
+ Field,
|
|
|
+ CountDown,
|
|
|
+ RadioGroup,
|
|
|
+ Radio,
|
|
|
+ Picker,
|
|
|
+ closeToast
|
|
|
} from 'vant';
|
|
|
-import { computed, defineComponent, onMounted, reactive } from 'vue';
|
|
|
+import {
|
|
|
+ computed,
|
|
|
+ defineComponent,
|
|
|
+ nextTick,
|
|
|
+ onMounted,
|
|
|
+ onUnmounted,
|
|
|
+ reactive,
|
|
|
+ ref
|
|
|
+} from 'vue';
|
|
|
+import qs from 'query-string';
|
|
|
+import {
|
|
|
+ state as baseState,
|
|
|
+ goWechatAuth,
|
|
|
+ setLogin,
|
|
|
+ setLoginInit
|
|
|
+} from '@/state';
|
|
|
import styles from './index.module.less';
|
|
|
import MSticky from '@/components/m-sticky';
|
|
|
-import MVideo from '@/components/m-video';
|
|
|
+// 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, moneyFormat } from '@/helpers/utils';
|
|
|
+import { browser, checkPhone, getUrlCode, moneyFormat } from '@/helpers/utils';
|
|
|
import deepClone from '@/helpers/deep-clone';
|
|
|
import OWxTip from '@/components/m-wx-tip';
|
|
|
import MDialog from '@/components/m-dialog';
|
|
|
-import f1 from './images/new/f-1.png';
|
|
|
-import f2 from './images/new/f-2.png';
|
|
|
-import f3 from './images/new/f-3.png';
|
|
|
-import iconTip2 from './images/new/icon-tip2.png';
|
|
|
-import functionBg from './images/new/function-bg.png';
|
|
|
-import giftTip from './images/new/gift-tip.png';
|
|
|
+// import f1 from './images/new/f-1.png';
|
|
|
+// import f2 from './images/new/f-2.png';
|
|
|
+// import f3 from './images/new/f-3.png';
|
|
|
+// import iconTip2 from './images/new/icon-tip2.png';
|
|
|
+// import functionBg from './images/new/function-bg.png';
|
|
|
+import giftTip from './images/new/icon-4.png';
|
|
|
+import iconGift from './images/new/icon-gift.png';
|
|
|
import dayjs from 'dayjs';
|
|
|
-import MMessageTip from '@/components/m-message-tip';
|
|
|
+// import MMessageTip from '@/components/m-message-tip';
|
|
|
+import { CurrentTime, useCountDown } from '@vant/use';
|
|
|
+import Payment from '../adapay/payment';
|
|
|
+import QrcodePayment from './qrcode-payment';
|
|
|
+import MImgCode from '@/components/m-img-code';
|
|
|
+import { beforeSubmit } from './order-state';
|
|
|
+import { useInterval, useIntervalFn } from '@vueuse/core';
|
|
|
+import MPopup from '@/components/m-popup';
|
|
|
+import UserAuth from './component/user-auth';
|
|
|
+
|
|
|
+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) => {
|
|
|
+ let tempList: any = [];
|
|
|
+ const five = [
|
|
|
+ { text: '一年级', value: 1 },
|
|
|
+ { text: '二年级', value: 2 },
|
|
|
+ { text: '三年级', value: 3 },
|
|
|
+ { text: '四年级', value: 4 },
|
|
|
+ { text: '五年级', value: 5 }
|
|
|
+ ];
|
|
|
+ const one = [{ text: '六年级', value: 6 }];
|
|
|
+ const three = [
|
|
|
+ { text: '七年级', value: 7 },
|
|
|
+ { text: '八年级', value: 8 },
|
|
|
+ { text: '九年级', value: 9 }
|
|
|
+ ];
|
|
|
+ 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: 'student-register',
|
|
@@ -38,22 +114,120 @@ export default defineComponent({
|
|
|
const router = useRouter();
|
|
|
// 初始化学校编号
|
|
|
studentRegisterStore.setShoolId(route.query.sId as any);
|
|
|
+ const countDownRef = ref();
|
|
|
const forms = reactive({
|
|
|
schoolId: route.query.sId as any,
|
|
|
paymentType: '', // 支付类型
|
|
|
- popupShow: false,
|
|
|
+ // popupShow: false,
|
|
|
details: [] as any[],
|
|
|
- schoolType: '', // 学校类型
|
|
|
+ // schoolType: '', // 学校类型
|
|
|
gradeYear: '', // 学制
|
|
|
- bugGoods: false, // 是否购买AI
|
|
|
+ // bugGoods: false, // 是否购买AI
|
|
|
registerType: '', // 报名类型
|
|
|
detailVip: {} as any,
|
|
|
giftVipDay: 0, // 赠送天数
|
|
|
submitLoading: false,
|
|
|
- showMore: true,
|
|
|
+ // showMore: true,
|
|
|
showTips: false,
|
|
|
showButton: false,
|
|
|
- showMessage: '请使用微信打开'
|
|
|
+ showMessage: '请使用微信打开',
|
|
|
+ countDownStatus: true,
|
|
|
+ countDownTime: 1000 * 120, // 倒计时时间
|
|
|
+ // modelValue: false, // 是否选中协议
|
|
|
+ imgCodeStatus: false,
|
|
|
+ gradeNumText: '',
|
|
|
+ currentClassText: '',
|
|
|
+ gradeStatus: false,
|
|
|
+ classStatus: false,
|
|
|
+ loading: false,
|
|
|
+ dialogStatus: false,
|
|
|
+ dialogMessage: '',
|
|
|
+ dialogConfirmStatus: false,
|
|
|
+ contract_sign: false, // 是否实名认证
|
|
|
+ countDownTimePay: 60 * 1000,
|
|
|
+ dialogConfig: {} as any,
|
|
|
+ showOtherSchool: false,
|
|
|
+ showOtherMessage: '',
|
|
|
+ joinType: '' as 'digitalize' | 'tradition',
|
|
|
+ gradeList: [] as any,
|
|
|
+ classList: [] as any,
|
|
|
+ saveId: null as any,
|
|
|
+ openId: null as any,
|
|
|
+ code: null as any,
|
|
|
+ intervalFnRef: null as any // 页面订时器
|
|
|
+ });
|
|
|
+
|
|
|
+ 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
|
|
|
+ });
|
|
|
+ const studentInfo = reactive({
|
|
|
+ autoRegister: true,
|
|
|
+ client_id: 'cooleshow-student',
|
|
|
+ client_secret: 'cooleshow-student',
|
|
|
+ extra: {
|
|
|
+ nickname: '',
|
|
|
+ currentGradeNum: '',
|
|
|
+ currentClass: '',
|
|
|
+ gender: 1,
|
|
|
+ registerType: null as any, // 报名类型
|
|
|
+ giftVipDay: 0 // 赠送会员天数
|
|
|
+ },
|
|
|
+ grant_type: 'password',
|
|
|
+ loginType: 'SMS',
|
|
|
+ password: '',
|
|
|
+ username: ''
|
|
|
+ });
|
|
|
+ // 页面定时
|
|
|
+ const pageTimer = useInterval(1000, { controls: true });
|
|
|
+ pageTimer.pause();
|
|
|
+
|
|
|
+ const countDown = useCountDown({
|
|
|
+ // 倒计时 60 秒
|
|
|
+ time: forms.countDownTimePay,
|
|
|
+ onChange(current: CurrentTime) {
|
|
|
+ forms.dialogMessage = `有待支付订单,请在${Math.ceil(
|
|
|
+ current.total / 1000
|
|
|
+ )}s后重试`;
|
|
|
+ },
|
|
|
+ onFinish() {
|
|
|
+ forms.dialogStatus = 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 orderType = computed(() => {
|
|
|
+ return state.orderInfo.orderType;
|
|
|
});
|
|
|
|
|
|
const getRegisterGoods = async () => {
|
|
@@ -69,22 +243,67 @@ export default defineComponent({
|
|
|
forms.details = deepClone(data.details || []);
|
|
|
if (forms.details.length > 0) {
|
|
|
forms.detailVip = forms.details[0];
|
|
|
- forms.giftVipDay = forms.details[0].membershipDays;
|
|
|
+ // forms.giftVipDay = forms.details[0].membershipDays;
|
|
|
}
|
|
|
- forms.bugGoods = data.bugGoods;
|
|
|
- forms.schoolType = data.schoolType;
|
|
|
+ forms.giftVipDay = data.giftVipDay || 0;
|
|
|
forms.gradeYear = data.gradeYear;
|
|
|
forms.registerType = data.registerType;
|
|
|
+ studentInfo.extra.registerType = data.registerType;
|
|
|
+
|
|
|
+ const schoolInstrumentList = data.schoolInstrumentList || [];
|
|
|
+
|
|
|
+ if (data.schoolInstrumentSetType === 'SCHOOL') {
|
|
|
+ forms.gradeList = getGradeList(data.gradeYear);
|
|
|
+ forms.classList = classList;
|
|
|
+ } else if (data.schoolInstrumentSetType === 'GRADE') {
|
|
|
+ schoolInstrumentList.forEach((item: any) => {
|
|
|
+ forms.gradeList.push({
|
|
|
+ text: GRADE_ENUM[item.gradeNum],
|
|
|
+ value: item.gradeNum,
|
|
|
+ instrumentId: item.instrumentId
|
|
|
+ });
|
|
|
+ });
|
|
|
+ forms.classList = classList;
|
|
|
+ } else if (data.schoolInstrumentSetType === '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,
|
|
|
+ children: [] as any
|
|
|
+ };
|
|
|
+ schoolInstrumentList.forEach((item: any) => {
|
|
|
+ if (item === item.gradeNum) {
|
|
|
+ list.children.push({
|
|
|
+ text: item.classNum + '班',
|
|
|
+ value: item.classNum
|
|
|
+ });
|
|
|
+ }
|
|
|
+ });
|
|
|
+
|
|
|
+ lastGradeList.push(list);
|
|
|
+ });
|
|
|
+ forms.gradeList = lastGradeList;
|
|
|
+ forms.classList = [];
|
|
|
+ }
|
|
|
if (browser().weixin) {
|
|
|
- if (
|
|
|
- data.schoolStatus === 0 &&
|
|
|
- forms.schoolId == '1770035687490105346'
|
|
|
- ) {
|
|
|
- forms.showTips = true;
|
|
|
- forms.showMessage = '团购时间已截止,感谢您的参与';
|
|
|
- forms.showButton = false;
|
|
|
- return;
|
|
|
- }
|
|
|
+ // if (
|
|
|
+ // data.schoolStatus === 0 &&
|
|
|
+ // forms.schoolId == '1770035687490105346'
|
|
|
+ // ) {
|
|
|
+ // forms.showTips = true;
|
|
|
+ // forms.showMessage = '团购时间已截止,感谢您的参与';
|
|
|
+ // forms.showButton = false;
|
|
|
+ // return;
|
|
|
+ // }
|
|
|
if (data.registerType !== 'BUG_GOODS' || data.schoolStatus === 0) {
|
|
|
forms.showTips = true;
|
|
|
forms.showMessage = '二维码已经失效,详情请咨询学校老师';
|
|
@@ -118,183 +337,978 @@ export default defineComponent({
|
|
|
};
|
|
|
});
|
|
|
|
|
|
- // 删除商品
|
|
|
- // const onGoodsRemove = (item: any) => {
|
|
|
- // showConfirmDialog({
|
|
|
- // message: '是否删除该商品',
|
|
|
- // confirmButtonColor: '#FF8633'
|
|
|
- // }).then(() => {
|
|
|
- // studentRegisterStore.deleteGoods(item.productSkuId);
|
|
|
- // });
|
|
|
- // };
|
|
|
+ const checkForm = () => {
|
|
|
+ if (!checkPhone(studentInfo.username)) {
|
|
|
+ showToast('请输入正确的手机号码');
|
|
|
+ return true;
|
|
|
+ } else if (!studentInfo.password) {
|
|
|
+ showToast('请输入验证码');
|
|
|
+ return true;
|
|
|
+ } else if (!studentInfo.extra.nickname) {
|
|
|
+ showToast('请输入学生姓名');
|
|
|
+ return true;
|
|
|
+ } else if (!studentInfo.extra.currentGradeNum) {
|
|
|
+ showToast('请选择所在年级');
|
|
|
+ return true;
|
|
|
+ } else if (!studentInfo.extra.currentClass) {
|
|
|
+ showToast('请选择所在班级');
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+ return false;
|
|
|
+ };
|
|
|
|
|
|
// 登记成功之后购买
|
|
|
- const onRegisterSubmit = async () => {
|
|
|
+ const onSubmit = async () => {
|
|
|
+ forms.submitLoading = true;
|
|
|
try {
|
|
|
- forms.submitLoading = true;
|
|
|
-
|
|
|
- // 检测token是否失效
|
|
|
- // const Authorization = storage.get(ACCESS_TOKEN) || '';
|
|
|
- // const authInfo = await request.post('/edu-app/open/user/verification', {
|
|
|
- // noAuthorization: true,
|
|
|
- // data: { token: Authorization }
|
|
|
- // });
|
|
|
- // // 判断当前token是否失效
|
|
|
- // if (!authInfo.data) {
|
|
|
- // storage.remove(ACCESS_TOKEN);
|
|
|
- // studentRegisterStore.deleteToken();
|
|
|
- // forms.popupRegister = true;
|
|
|
- // return;
|
|
|
- // }
|
|
|
-
|
|
|
- // // 请求是否有待支付订单,如果有则自动关闭
|
|
|
- // const status = await paymentOrderUnpaid();
|
|
|
- // if (status) return;
|
|
|
- // const schoolInfo = await request.get(
|
|
|
- // '/edu-app/userPaymentOrder/registerStatus/' + forms.schoolId
|
|
|
- // );
|
|
|
- // const vipList = studentRegisterStore.getVip;
|
|
|
-
|
|
|
- // if (schoolInfo.data.hasBuyCourse && vipList.length > 0) {
|
|
|
- // // setTimeout(() => {
|
|
|
- // // showToast('您已购买乐器AI学练工具,请勿重复购买');
|
|
|
- // // }, 100);
|
|
|
- // forms.dialogConfirmStatus = true;
|
|
|
- // return;
|
|
|
- // }
|
|
|
- // await paymentContinue();
|
|
|
-
|
|
|
- router.push({
|
|
|
- path: '/student-register-form',
|
|
|
- query: {
|
|
|
- schoolId: forms.schoolId
|
|
|
+ if (checkForm()) return;
|
|
|
+ const { extra, ...res } = studentInfo;
|
|
|
+ const result = await request.post('/edu-app/userlogin', {
|
|
|
+ requestType: 'form',
|
|
|
+ data: {
|
|
|
+ ...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 if (result.code === 5435) {
|
|
|
+ forms.showTips = true;
|
|
|
+ forms.showMessage = result.message;
|
|
|
+ forms.showButton = false;
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ studentRegisterStore.setToken(
|
|
|
+ result.data.token_type + ' ' + result.data.access_token
|
|
|
+ );
|
|
|
+ setLoginInit();
|
|
|
+
|
|
|
+ let joinType = 'NOT_REGISTER';
|
|
|
+ if (forms.joinType === 'digitalize') {
|
|
|
+ joinType = 'SELECT_INSTRUMENT';
|
|
|
+ }
|
|
|
+ if (forms.joinType === 'tradition') {
|
|
|
+ joinType = 'NOT_BUY_INSTRUMENT';
|
|
|
+ }
|
|
|
+ // 更新时间
|
|
|
+ await updateStat(
|
|
|
+ pageTimer.counter.value,
|
|
|
+ joinType,
|
|
|
+ result.data.userId,
|
|
|
+ forms.schoolId
|
|
|
+ );
|
|
|
+ pageTimer.counter.value = 0;
|
|
|
+
|
|
|
+ // 传统方式
|
|
|
+ if (forms.joinType === 'tradition') {
|
|
|
+ setTimeout(() => {
|
|
|
+ showToast('报名成功');
|
|
|
+ router.push('/download');
|
|
|
+ }, 100);
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 获取用户信息
|
|
|
+ const res = await request.get('/edu-app/user/getUserInfo', {
|
|
|
+ requestType: 'form'
|
|
|
+ });
|
|
|
+ setLogin(res.data);
|
|
|
+
|
|
|
+ await onRegisterSubmit();
|
|
|
+ }
|
|
|
} finally {
|
|
|
- forms.submitLoading = false;
|
|
|
+ }
|
|
|
+ forms.submitLoading = false;
|
|
|
+ };
|
|
|
+
|
|
|
+ // 登记成功之后购买
|
|
|
+ const onRegisterSubmit = async () => {
|
|
|
+ try {
|
|
|
+ // 请求是否有待支付订单,如果有则自动关闭
|
|
|
+ const status = await paymentOrderUnpaid();
|
|
|
+ if (status) return;
|
|
|
+ const schoolInfo = await request.get(
|
|
|
+ '/edu-app/userPaymentOrder/registerStatus/' + forms.schoolId
|
|
|
+ );
|
|
|
+ const vipList = studentRegisterStore.getVip;
|
|
|
+
|
|
|
+ if (schoolInfo.data.hasBuyCourse && vipList.length > 0) {
|
|
|
+ forms.dialogConfirmStatus = true;
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ await paymentContinue();
|
|
|
+ } 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`
|
|
|
+ );
|
|
|
+ if (data) {
|
|
|
+ if (!studentInfo.extra.nickname) {
|
|
|
+ studentInfo.extra.nickname = data.nickname;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (!studentInfo.extra.currentGradeNum) {
|
|
|
+ const tempGrade: any = forms.gradeList || [];
|
|
|
+ tempGrade?.forEach((i: any) => {
|
|
|
+ if (i.value === data.currentGradeNum) {
|
|
|
+ forms.gradeNumText = i.text;
|
|
|
+ studentInfo.extra.currentGradeNum = data.currentGradeNum;
|
|
|
+ }
|
|
|
+ });
|
|
|
+ }
|
|
|
+
|
|
|
+ if (!studentInfo.extra.currentClass) {
|
|
|
+ forms.classList.forEach((i: any) => {
|
|
|
+ if (i.value === data.currentClass) {
|
|
|
+ forms.currentClassText = i.text;
|
|
|
+ studentInfo.extra.currentClass = data.currentClass;
|
|
|
+ }
|
|
|
+ });
|
|
|
+ }
|
|
|
+ // if (!studentInfo.extra.gender) {
|
|
|
+ studentInfo.extra.gender =
|
|
|
+ studentInfo.extra.gender !== data.gender
|
|
|
+ ? data.gender
|
|
|
+ : studentInfo.extra.gender;
|
|
|
+ }
|
|
|
+ } catch {
|
|
|
+ //
|
|
|
+ }
|
|
|
+ };
|
|
|
+
|
|
|
+ // 查询未支付订单
|
|
|
+ const paymentOrderUnpaid = async () => {
|
|
|
+ let result = false;
|
|
|
+ try {
|
|
|
+ const { data } = await request.get('/edu-app/userPaymentOrder/unpaid');
|
|
|
+ // 判断是否有待支付订单
|
|
|
+
|
|
|
+ if (!data.id) return false;
|
|
|
+
|
|
|
+ // 判断是否可以取消订单
|
|
|
+ if (data.cancelPayment) {
|
|
|
+ await request.post(
|
|
|
+ '/edu-app/userPaymentOrder/cancelPayment/' + data.orderNo
|
|
|
+ );
|
|
|
+ return false;
|
|
|
+ } else {
|
|
|
+ forms.countDownTime = data.cancelTimes;
|
|
|
+ countDown.reset(Number(data.cancelTimes));
|
|
|
+ countDown.start();
|
|
|
+ forms.dialogMessage = `有待支付订单,请在${Math.ceil(
|
|
|
+ countDown.current.value.total / 1000
|
|
|
+ )}s后重试`;
|
|
|
+ forms.dialogStatus = true;
|
|
|
+ forms.dialogConfig = data;
|
|
|
+ result = true;
|
|
|
+ }
|
|
|
+ } catch {
|
|
|
+ //
|
|
|
+ }
|
|
|
+ return result;
|
|
|
+ };
|
|
|
+
|
|
|
+ const paymentContinue = async () => {
|
|
|
+ try {
|
|
|
+ const vipList = studentRegisterStore.getVip;
|
|
|
+ const goodsList = studentRegisterStore.getGoods;
|
|
|
+ const params: any[] = [];
|
|
|
+ vipList.forEach((vip: any) => {
|
|
|
+ params.push({
|
|
|
+ giftVipDay: vip.membershipDays,
|
|
|
+ goodsId: vip.goodsId,
|
|
|
+ goodsNum: 1,
|
|
|
+ goodsType: vip.goodsType,
|
|
|
+ paymentCashAmount: vip.currentPrice, // 现金支付金额
|
|
|
+ paymentCouponAmount: 0 // 优惠券金额
|
|
|
+ });
|
|
|
+ });
|
|
|
+
|
|
|
+ goodsList.forEach((goods: any) => {
|
|
|
+ params.push({
|
|
|
+ goodsId: goods.productId,
|
|
|
+ goodsNum: goods.quantity,
|
|
|
+ goodsType: 'INSTRUMENTS',
|
|
|
+ paymentCashAmount: goods.price, // 现金支付金额
|
|
|
+ paymentCouponAmount: 0, // 优惠券金额
|
|
|
+ goodsSkuId: goods.productSkuId
|
|
|
+ });
|
|
|
+ });
|
|
|
+ // 创建订单
|
|
|
+ const result = await request.post(
|
|
|
+ '/edu-app/userPaymentOrder/executeOrder',
|
|
|
+ {
|
|
|
+ // hideLoading: false,
|
|
|
+ data: {
|
|
|
+ buryId: forms.saveId,
|
|
|
+ registerType: forms.registerType,
|
|
|
+ paymentType: forms.paymentType,
|
|
|
+ bizId: forms.schoolId, // 乐团编号
|
|
|
+ orderType: 'SCHOOL_REGISTER',
|
|
|
+ paymentCashAmount: calcPrice.value.amount || 0,
|
|
|
+ paymentCouponAmount: 0,
|
|
|
+ goodsInfos: params,
|
|
|
+ orderName: '学生登记',
|
|
|
+ orderDesc: '学生登记'
|
|
|
+ }
|
|
|
+ }
|
|
|
+ );
|
|
|
+
|
|
|
+ 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 {
|
|
|
+ state.config = {
|
|
|
+ ...result.data.paymentConfig,
|
|
|
+ paymentType: result.data.paymentType
|
|
|
+ };
|
|
|
+ state.orderNo = result.data.orderNo;
|
|
|
+
|
|
|
+ await lastSubmit();
|
|
|
+ }
|
|
|
+ } catch (e: any) {
|
|
|
+ console.log(e, 'any');
|
|
|
}
|
|
|
};
|
|
|
|
|
|
+ const lastSubmit = async () => {
|
|
|
+ try {
|
|
|
+ const users = baseState.user.data;
|
|
|
+ // 判断是否需要实名认证, 姓名,卡号 - 参数设置可以控制
|
|
|
+ if (
|
|
|
+ forms.contract_sign &&
|
|
|
+ (!users?.account.realName || !users?.account.idCardNo)
|
|
|
+ ) {
|
|
|
+ state.authShow = true;
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ const { data } = await request.post(
|
|
|
+ '/edu-app/userPaymentOrder/updateReceiveAddress',
|
|
|
+ {
|
|
|
+ // hideLoading: false,
|
|
|
+ data: {
|
|
|
+ orderNo: state.orderNo,
|
|
|
+ orderType: 'SCHOOL_REGISTER'
|
|
|
+ }
|
|
|
+ }
|
|
|
+ );
|
|
|
+ state.pay_channel = data.paymentChannel;
|
|
|
+ if (data.status !== 'WAIT_PAY' && data.status !== 'PAYING') {
|
|
|
+ router.replace({
|
|
|
+ path: '/payment-result',
|
|
|
+ query: {
|
|
|
+ orderNo: state.orderNo
|
|
|
+ }
|
|
|
+ });
|
|
|
+ } else {
|
|
|
+ onCallback();
|
|
|
+ }
|
|
|
+ } catch {
|
|
|
+ //
|
|
|
+ }
|
|
|
+ };
|
|
|
+
|
|
|
+ /**
|
|
|
+ * @description 回调,判断是否有支付渠道,如果有则直接去支付
|
|
|
+ * @returns void
|
|
|
+ */
|
|
|
+ const onCallback = () => {
|
|
|
+ const pt = state.pay_channel;
|
|
|
+ // 判断是否有支付方式
|
|
|
+ if (pt) {
|
|
|
+ const payCode: string = beforeSubmit(state.pay_channel);
|
|
|
+ onConfirm({
|
|
|
+ payCode,
|
|
|
+ pay_channel: pt
|
|
|
+ });
|
|
|
+ } else {
|
|
|
+ if (orderType.value === 'VIP') {
|
|
|
+ state.paymentStatus = true;
|
|
|
+ } else {
|
|
|
+ // 直接去拉取微信支付
|
|
|
+ onConfirm({
|
|
|
+ payCode: 'payResult',
|
|
|
+ pay_channel: 'wx_pub'
|
|
|
+ });
|
|
|
+ }
|
|
|
+ }
|
|
|
+ };
|
|
|
+
|
|
|
+ const onConfirm = (val: any) => {
|
|
|
+ const config: any = state.config;
|
|
|
+ state.pay_channel = val.pay_channel;
|
|
|
+
|
|
|
+ const params = qs.stringify({
|
|
|
+ pay_channel: val.pay_channel,
|
|
|
+ wxAppId: config.wxAppId,
|
|
|
+ alipayAppId: config.alipayAppId,
|
|
|
+ paymentType: forms.paymentType,
|
|
|
+ body: config.body,
|
|
|
+ price: config.price,
|
|
|
+ orderNo: config.merOrderNo,
|
|
|
+ userId: config.userId
|
|
|
+ });
|
|
|
+
|
|
|
+ // console.log(params, state.config);
|
|
|
+ // return;
|
|
|
+ if (val.payCode === 'payResult') {
|
|
|
+ window.location.href =
|
|
|
+ window.location.origin + '/classroom-app/#/payResult?' + params;
|
|
|
+ } else {
|
|
|
+ state.qrCodeUrl =
|
|
|
+ window.location.origin + '/classroom-app/#/payDefine?' + params;
|
|
|
+ state.showQrcode = true;
|
|
|
+ state.paymentStatus = false;
|
|
|
+
|
|
|
+ setTimeout(() => {
|
|
|
+ getPaymentOrderStatus();
|
|
|
+ }, 300);
|
|
|
+ }
|
|
|
+ };
|
|
|
+
|
|
|
+ // 放弃支付时,则取消订单
|
|
|
+ const onBackOut = async () => {
|
|
|
+ try {
|
|
|
+ await request.post(
|
|
|
+ '/edu-app/userPaymentOrder/cancelPayment/' + state.orderNo
|
|
|
+ );
|
|
|
+ // router.back();
|
|
|
+ } catch {
|
|
|
+ //
|
|
|
+ }
|
|
|
+ };
|
|
|
+
|
|
|
+ // 轮询查询订单状态
|
|
|
+ const getPaymentOrderStatus = async () => {
|
|
|
+ // 循环查询订单
|
|
|
+ // const orderNo = state.orderNo
|
|
|
+ const orderTimer = setInterval(async () => {
|
|
|
+ // 判断是否在当前路由,如果不是则清除定时器
|
|
|
+ if (route.name != 'student-register-form') {
|
|
|
+ clearInterval(orderTimer);
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ state.orderTimer = orderTimer;
|
|
|
+ try {
|
|
|
+ const { data } = await request.post(
|
|
|
+ '/edu-app/open/userOrder/paymentStatus/' + state.orderNo,
|
|
|
+ {
|
|
|
+ hideLoading: true
|
|
|
+ }
|
|
|
+ );
|
|
|
+
|
|
|
+ if (data.status !== 'WAIT_PAY' && data.status !== 'PAYING') {
|
|
|
+ // 默认关闭支付二维码弹窗
|
|
|
+ state.showQrcode = false;
|
|
|
+ clearInterval(state.orderTimer);
|
|
|
+ setTimeout(() => {
|
|
|
+ router.replace({
|
|
|
+ path: '/payment-result',
|
|
|
+ query: {
|
|
|
+ orderNo: state.orderNo
|
|
|
+ }
|
|
|
+ });
|
|
|
+ }, 100);
|
|
|
+ }
|
|
|
+ } catch {
|
|
|
+ //
|
|
|
+ clearInterval(state.orderTimer);
|
|
|
+ }
|
|
|
+ }, 5000);
|
|
|
+ };
|
|
|
+ // 实名认证成功
|
|
|
+ const onAuthSuccess = () => {
|
|
|
+ //
|
|
|
+ state.authShow = false;
|
|
|
+ paymentContinue(); // 实名成功后自动支付
|
|
|
+ };
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 页面停留时间
|
|
|
+ * @param pageBrowseTime 停留时间
|
|
|
+ * @param joinType 加入方式
|
|
|
+ * @param userId 用户编号
|
|
|
+ * @param schoolId 学校编号
|
|
|
+ */
|
|
|
+ const updateStat = async (
|
|
|
+ pageBrowseTime = 10,
|
|
|
+ joinType?: string,
|
|
|
+ userId?: string,
|
|
|
+ schoolId?: string
|
|
|
+ ) => {
|
|
|
+ try {
|
|
|
+ const { data } = await request.post(
|
|
|
+ '/edu-app/open/studentRegisterPointRecord/update',
|
|
|
+ {
|
|
|
+ data: {
|
|
|
+ id: forms.saveId,
|
|
|
+ useTime: pageBrowseTime, // 固定10秒
|
|
|
+ joinType,
|
|
|
+ userId,
|
|
|
+ schoolId
|
|
|
+ }
|
|
|
+ }
|
|
|
+ );
|
|
|
+ forms.saveId = data;
|
|
|
+ } catch {
|
|
|
+ //
|
|
|
+ }
|
|
|
+ };
|
|
|
+
|
|
|
+ const getAppIdAndCode = async (url?: string) => {
|
|
|
+ try {
|
|
|
+ const { data } = await request.get(
|
|
|
+ '/edu-app/open/paramConfig/wechatAppId'
|
|
|
+ );
|
|
|
+ // 判断是否有微信appId
|
|
|
+ if (data) {
|
|
|
+ closeToast();
|
|
|
+ goWechatAuth(data, url);
|
|
|
+ }
|
|
|
+ } catch {
|
|
|
+ //
|
|
|
+ }
|
|
|
+ };
|
|
|
+
|
|
|
+ if (browser().weixin) {
|
|
|
+ //授权
|
|
|
+ const openId = sessionStorage.getItem('active-open-id');
|
|
|
+ forms.openId = openId;
|
|
|
+ const code = getUrlCode();
|
|
|
+ if (!code) {
|
|
|
+ const newUrl =
|
|
|
+ window.location.origin +
|
|
|
+ window.location.pathname +
|
|
|
+ '#' +
|
|
|
+ route.path +
|
|
|
+ '?' +
|
|
|
+ qs.stringify({
|
|
|
+ ...route.query
|
|
|
+ });
|
|
|
+ getAppIdAndCode(newUrl);
|
|
|
+ return '';
|
|
|
+ } else {
|
|
|
+ forms.code = code;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
onMounted(async () => {
|
|
|
try {
|
|
|
getRegisterGoods();
|
|
|
+ // 判断是否获取微信code码
|
|
|
+ if (!forms.code) return;
|
|
|
+ const { data } = await request.post(
|
|
|
+ '/edu-app/open/studentRegisterPointRecord/save',
|
|
|
+ {
|
|
|
+ data: {
|
|
|
+ code: forms.code,
|
|
|
+ schoolId: forms.schoolId,
|
|
|
+ openId: forms.openId
|
|
|
+ }
|
|
|
+ }
|
|
|
+ );
|
|
|
+ forms.saveId = data.id;
|
|
|
+ forms.openId = data.openId;
|
|
|
+ sessionStorage.setItem('active-open-id', data.openId);
|
|
|
+
|
|
|
+ // 间隔多少时间同步数据
|
|
|
+ forms.intervalFnRef = useIntervalFn(async () => {
|
|
|
+ // 页面时间恢复
|
|
|
+ pageTimer.counter.value = 0;
|
|
|
+ pageTimer.resume();
|
|
|
+ // 同步数据时先进行有效时间进行保存
|
|
|
+
|
|
|
+ await updateStat();
|
|
|
+ }, 5000);
|
|
|
} catch {}
|
|
|
});
|
|
|
|
|
|
+ onUnmounted(() => {
|
|
|
+ forms.intervalFnRef?.pause(); // 暂停回调
|
|
|
+ });
|
|
|
+
|
|
|
return () => (
|
|
|
<div class={styles['student-register']}>
|
|
|
<div class={styles.studentRegisterContainer}>
|
|
|
- <div class={styles.studentSection}>
|
|
|
+ <div
|
|
|
+ class={[styles.studentSection, styles.studentSectionForm]}
|
|
|
+ // style={{ display: 'none' }}
|
|
|
+ >
|
|
|
<div class={styles.title1}></div>
|
|
|
|
|
|
- <p class={styles.content}>
|
|
|
- 提供在乐器学练中的AI智能学练工具、数字化乐谱与课件,解决学生不会练习、家长无法辅导的乐器学练痛点,学生可实现自主学练,家长即时全面了解学练情况。
|
|
|
- </p>
|
|
|
- </div>
|
|
|
- <div class={[styles.studentSection, styles.truns]}>
|
|
|
- <div class={styles.trunList}>
|
|
|
- <div class={styles.trunItem}>
|
|
|
- <img src={f1} />
|
|
|
- <p>
|
|
|
- 随身云教练
|
|
|
- <br />
|
|
|
- 无需请老师
|
|
|
- </p>
|
|
|
- </div>
|
|
|
- <div class={styles.trunItem}>
|
|
|
- <img src={f2} />
|
|
|
- <p>
|
|
|
- 简单易操作
|
|
|
- <br />
|
|
|
- 学生都会练
|
|
|
- </p>
|
|
|
- </div>
|
|
|
- <div class={styles.trunItem}>
|
|
|
- <img src={f3} />
|
|
|
- <p>
|
|
|
- 练习可测评
|
|
|
- <br />
|
|
|
- 家长可省心
|
|
|
- </p>
|
|
|
+ <Form labelAlign="left" class={styles.registerForm}>
|
|
|
+ <Field
|
|
|
+ clearable={false}
|
|
|
+ label="联系方式(直接监护人)"
|
|
|
+ placeholder="请输入手机号码"
|
|
|
+ type="tel"
|
|
|
+ required
|
|
|
+ autocomplete="off"
|
|
|
+ inputAlign="right"
|
|
|
+ class={styles.username}
|
|
|
+ v-model={studentInfo.username}
|
|
|
+ border={false}
|
|
|
+ maxlength={11}>
|
|
|
+ {{
|
|
|
+ label: () => (
|
|
|
+ <div>
|
|
|
+ 联系方式
|
|
|
+ {/* (直接监护人) */}
|
|
|
+ <p class={styles.tips}>(直接监护人)</p>
|
|
|
+ </div>
|
|
|
+ )
|
|
|
+ }}
|
|
|
+ </Field>
|
|
|
+ <div class={['van-hairline--bottom', styles.fieldTipsGroup]}>
|
|
|
+ <div class={[styles.fieldTips]}>
|
|
|
+ 手机号是音乐数字课堂的唯一登录账户
|
|
|
+ </div>
|
|
|
</div>
|
|
|
- </div>
|
|
|
-
|
|
|
- <div class={styles.tipInfo}>
|
|
|
- <img src={iconTip2} />
|
|
|
- </div>
|
|
|
- </div>
|
|
|
|
|
|
- {/* <div class={styles.videoGroup}>
|
|
|
- <MVideo
|
|
|
- class={styles.videoB}
|
|
|
- src={'https://oss.dayaedu.com/daya/202105/SWmqmvW.mp4'}
|
|
|
- />
|
|
|
- </div> */}
|
|
|
+ <Field
|
|
|
+ center
|
|
|
+ clearable={false}
|
|
|
+ required
|
|
|
+ inputAlign="right"
|
|
|
+ label="验证码"
|
|
|
+ placeholder="请输入验证码"
|
|
|
+ autocomplete="off"
|
|
|
+ type="number"
|
|
|
+ v-model={studentInfo.password}
|
|
|
+ maxlength={6}
|
|
|
+ onUpdate:modelValue={(val: any) => {
|
|
|
+ getUserInfos();
|
|
|
+ }}>
|
|
|
+ {{
|
|
|
+ button: () =>
|
|
|
+ forms.countDownStatus ? (
|
|
|
+ <span
|
|
|
+ class={[
|
|
|
+ styles.codeText,
|
|
|
+ !validatePhone.value ? styles.codeTextDisabled : ''
|
|
|
+ ]}
|
|
|
+ onClick={onSendCode}>
|
|
|
+ 获取验证码
|
|
|
+ </span>
|
|
|
+ ) : (
|
|
|
+ <CountDown
|
|
|
+ ref={(el: any) => (countDownRef.value = el)}
|
|
|
+ auto-start={false}
|
|
|
+ class={styles.countDown}
|
|
|
+ time={forms.countDownTime}
|
|
|
+ onFinish={onFinished}
|
|
|
+ format="ss秒后重试"
|
|
|
+ />
|
|
|
+ )
|
|
|
+ }}
|
|
|
+ </Field>
|
|
|
+ <Field
|
|
|
+ clearable={false}
|
|
|
+ required
|
|
|
+ inputAlign="right"
|
|
|
+ label="学生姓名"
|
|
|
+ placeholder="请输入学生姓名"
|
|
|
+ autocomplete="off"
|
|
|
+ maxlength={14}
|
|
|
+ v-model={studentInfo.extra.nickname}
|
|
|
+ />
|
|
|
+ <Field
|
|
|
+ clearable={false}
|
|
|
+ required
|
|
|
+ inputAlign="right"
|
|
|
+ label="学生性别"
|
|
|
+ placeholder="请选择性别"
|
|
|
+ autocomplete="off"
|
|
|
+ // v-model={studentInfo.extra.nickname}
|
|
|
+ >
|
|
|
+ {{
|
|
|
+ input: () => (
|
|
|
+ <RadioGroup
|
|
|
+ checked-color="linear-gradient( 135deg, #31C7FF 0%, #007AFE 100%)"
|
|
|
+ v-model={studentInfo.extra.gender}
|
|
|
+ direction="horizontal">
|
|
|
+ <Tag
|
|
|
+ size="large"
|
|
|
+ type="primary"
|
|
|
+ color={
|
|
|
+ !(studentInfo.extra.gender === 1)
|
|
|
+ ? '#F5F6FA'
|
|
|
+ : 'linear-gradient( 135deg, #31C7FF 0%, #007AFE 100%)'
|
|
|
+ }
|
|
|
+ textColor={
|
|
|
+ !(studentInfo.extra.gender === 1) ? '#626264' : '#fff'
|
|
|
+ }
|
|
|
+ class={styles.radioSection}>
|
|
|
+ <Radio class={styles.radioItem} name={1}></Radio>男
|
|
|
+ </Tag>
|
|
|
+ <Tag
|
|
|
+ size="large"
|
|
|
+ type="primary"
|
|
|
+ color={
|
|
|
+ !(studentInfo.extra.gender === 0)
|
|
|
+ ? '#F5F6FA'
|
|
|
+ : 'linear-gradient( 135deg, #31C7FF 0%, #007AFE 100%)'
|
|
|
+ }
|
|
|
+ textColor={
|
|
|
+ !(studentInfo.extra.gender === 0) ? '#626264' : '#fff'
|
|
|
+ }
|
|
|
+ class={styles.radioSection}>
|
|
|
+ <Radio class={styles.radioItem} name={0}></Radio>女
|
|
|
+ </Tag>
|
|
|
+ </RadioGroup>
|
|
|
+ )
|
|
|
+ }}
|
|
|
+ </Field>
|
|
|
+ <Field
|
|
|
+ clearable={false}
|
|
|
+ required
|
|
|
+ inputAlign="right"
|
|
|
+ label="所在年级"
|
|
|
+ placeholder="请选择年级"
|
|
|
+ isLink
|
|
|
+ readonly
|
|
|
+ clickable={false}
|
|
|
+ modelValue={forms.gradeNumText}
|
|
|
+ onClick={() => (forms.gradeStatus = true)}
|
|
|
+ />
|
|
|
+ <Field
|
|
|
+ clearable={false}
|
|
|
+ required
|
|
|
+ inputAlign="right"
|
|
|
+ label="所在班级"
|
|
|
+ placeholder="请选择班级"
|
|
|
+ isLink
|
|
|
+ readonly
|
|
|
+ clickable={false}
|
|
|
+ modelValue={forms.currentClassText}
|
|
|
+ onClick={() => (forms.classStatus = true)}
|
|
|
+ />
|
|
|
+ {forms.giftVipDay > 0 ? (
|
|
|
+ <div class={styles.memberNumer}>
|
|
|
+ <img src={iconGift} class={styles.iconGift} />
|
|
|
|
|
|
+ <p>
|
|
|
+ 注册成功即可获得乐器AI学练工具
|
|
|
+ <span>{forms.giftVipDay || 0}</span>天有效期
|
|
|
+ </p>
|
|
|
+ </div>
|
|
|
+ ) : (
|
|
|
+ ''
|
|
|
+ )}
|
|
|
+ </Form>
|
|
|
+ </div>
|
|
|
<div class={styles.studentSection}>
|
|
|
<div class={styles.title2}></div>
|
|
|
|
|
|
- <div class={styles.functionGroup}>
|
|
|
- <img src={functionBg} />
|
|
|
+ <div class={styles.goodsGroup}>
|
|
|
+ <div
|
|
|
+ class={[
|
|
|
+ styles.goodsItem,
|
|
|
+ forms.joinType === 'digitalize' && styles.checked
|
|
|
+ ]}
|
|
|
+ onClick={() => (forms.joinType = 'digitalize')}>
|
|
|
+ <div class={styles.goodsInner}>
|
|
|
+ <i class={styles.proposalTip}></i>
|
|
|
+ 数字化方式
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <div
|
|
|
+ class={[
|
|
|
+ styles.goodsItem,
|
|
|
+ forms.joinType === 'tradition' && styles.checked
|
|
|
+ ]}
|
|
|
+ onClick={() => (forms.joinType = 'tradition')}>
|
|
|
+ <div class={styles.goodsInner}>传统方式</div>
|
|
|
+ </div>
|
|
|
</div>
|
|
|
</div>
|
|
|
|
|
|
- {forms.giftVipDay > 0 && (
|
|
|
- <div class={[styles.studentSection, styles.memberGroup]}>
|
|
|
- <p>
|
|
|
- 现在购买赠送会员有效期<span>{forms.giftVipDay || 0}</span>天
|
|
|
- </p>
|
|
|
+ {forms.joinType === 'digitalize' && (
|
|
|
+ <div class={[styles.goodsExtra]}>
|
|
|
+ <i class={styles.iconArrow}></i>
|
|
|
+ <Cell border={false} class={styles.goodsCell}>
|
|
|
+ {{
|
|
|
+ icon: () => (
|
|
|
+ <Image class={styles.img} src={forms.detailVip.goodsUrl} />
|
|
|
+ ),
|
|
|
+ title: () => (
|
|
|
+ <div class={styles.section}>
|
|
|
+ <div class={styles.sectionContent}>
|
|
|
+ <h2>
|
|
|
+ {forms.detailVip.goodsName}
|
|
|
+ <Tag class={styles.brandName}>
|
|
|
+ {forms.detailVip.brandName}
|
|
|
+ </Tag>
|
|
|
+ </h2>
|
|
|
+ <p class={[styles.model]}>
|
|
|
+ {/* 解决学生不会练、不知练的对错、家长无法辅导、无需再额外请老师 */}
|
|
|
+ {forms.detailVip.description}
|
|
|
+ </p>
|
|
|
+ <span class={styles.sendInstrument}>赠送课堂乐器</span>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ )
|
|
|
+ }}
|
|
|
+ </Cell>
|
|
|
+
|
|
|
+ {forms.detailVip.membershipDays ? (
|
|
|
+ <div class={styles.memberNumer}>
|
|
|
+ <img src={iconGift} class={styles.iconGift} />
|
|
|
+ <p>
|
|
|
+ 现在购买赠送乐器AI学练工具
|
|
|
+ <span>{forms.detailVip.membershipDays || 0}</span>天有效期
|
|
|
+ </p>
|
|
|
+ </div>
|
|
|
+ ) : (
|
|
|
+ ''
|
|
|
+ )}
|
|
|
</div>
|
|
|
)}
|
|
|
|
|
|
- <MSticky position="bottom">
|
|
|
- <div class={styles.paymentContainer}>
|
|
|
- <div class={styles.payemntPrice}>
|
|
|
- <img src={giftTip} class={styles.giftTip} />
|
|
|
- <div>
|
|
|
- <span class={styles.needPrice}>
|
|
|
- <i style="font-style: normal">¥ </i>
|
|
|
- <span>{moneyFormat(calcPrice.value.amount)}</span>
|
|
|
- <i style="font-style: normal">/年</i>
|
|
|
+ {forms.joinType === 'tradition' && (
|
|
|
+ <div class={styles.goodsTradition}>
|
|
|
+ <i class={styles.iconArrow}></i>
|
|
|
+
|
|
|
+ <div class={styles.goodsTitle}></div>
|
|
|
+ <div class={styles.steps}>
|
|
|
+ <div class={styles.step}>
|
|
|
+ <span class={styles.nums}>
|
|
|
+ <span class={styles.numInner}>1</span>
|
|
|
</span>
|
|
|
- {calcPrice.value.originAmount > calcPrice.value.amount ? (
|
|
|
- <del class={styles.allPrice}>
|
|
|
- ¥ {moneyFormat(calcPrice.value.originAmount)}
|
|
|
- </del>
|
|
|
- ) : (
|
|
|
- ''
|
|
|
- )}
|
|
|
+ <div class={styles.stepContent}>
|
|
|
+ <span>AI工具标准:</span>
|
|
|
+ 可以学练音乐教材中的乐曲,通过手机应用商店准备。
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <div class={styles.step}>
|
|
|
+ <span class={styles.nums}>
|
|
|
+ <span class={styles.numInner}>2</span>
|
|
|
+ </span>
|
|
|
+ <div class={styles.stepContent}>
|
|
|
+ <span>乐器标准:</span>
|
|
|
+ 管数不限,建议20管以上C调加嘴排箫(音域宽,能演奏更多复杂乐曲,不需要重复更换),黑色,要选择单一原调(调性多学生很难掌握),价格由学生根据自身情况确定。
|
|
|
+ </div>
|
|
|
</div>
|
|
|
- </div>
|
|
|
- <div
|
|
|
- class={styles.paymentBtn}
|
|
|
- onClick={() => {
|
|
|
- // const vipList = studentRegisterStore.getVip;
|
|
|
- // const goodsList = studentRegisterStore.getGoods;
|
|
|
- // if (vipList.length <= 0 && goodsList.length <= 0) {
|
|
|
- // setTimeout(() => {
|
|
|
- // showToast('请选择需要购买的商品');
|
|
|
- // }, 100);
|
|
|
- // return;
|
|
|
- // }
|
|
|
- onRegisterSubmit();
|
|
|
- }}>
|
|
|
- <Button
|
|
|
- round
|
|
|
- disabled={forms.submitLoading}
|
|
|
- loading={forms.submitLoading}>
|
|
|
- 下一步
|
|
|
- </Button>
|
|
|
</div>
|
|
|
</div>
|
|
|
- </MSticky>
|
|
|
- </div>
|
|
|
+ )}
|
|
|
+
|
|
|
+ {forms.joinType && (
|
|
|
+ <MSticky position="bottom">
|
|
|
+ <div class={styles.paymentContainer}>
|
|
|
+ {forms.joinType === 'digitalize' && (
|
|
|
+ <>
|
|
|
+ <div class={styles.payemntPrice}>
|
|
|
+ <img src={giftTip} class={styles.giftTip} />
|
|
|
+ <div>
|
|
|
+ <span class={styles.needPrice}>
|
|
|
+ <i style="font-style: normal">¥ </i>
|
|
|
+ <span>{moneyFormat(calcPrice.value.amount)}</span>
|
|
|
+ <i style="font-style: normal">/年</i>
|
|
|
+ </span>
|
|
|
+ {calcPrice.value.originAmount >
|
|
|
+ calcPrice.value.amount ? (
|
|
|
+ <del class={styles.allPrice}>
|
|
|
+ ¥ {moneyFormat(calcPrice.value.originAmount)}
|
|
|
+ </del>
|
|
|
+ ) : (
|
|
|
+ ''
|
|
|
+ )}
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <div
|
|
|
+ class={styles.paymentBtn}
|
|
|
+ onClick={() => {
|
|
|
+ onSubmit();
|
|
|
+ }}>
|
|
|
+ <Button
|
|
|
+ round
|
|
|
+ disabled={forms.submitLoading}
|
|
|
+ loading={forms.submitLoading}>
|
|
|
+ 立即支付
|
|
|
+ </Button>
|
|
|
+ </div>
|
|
|
+ </>
|
|
|
+ )}
|
|
|
|
|
|
- {/* <Popup v-model:show={forms.popupShow} class={styles.videoPopup}>
|
|
|
- {forms.popupShow && (
|
|
|
- <MVideo src={'https://oss.dayaedu.com/daya/202105/SWmqmvW.mp4'} />
|
|
|
+ {forms.joinType === 'tradition' && (
|
|
|
+ <div
|
|
|
+ class={styles.traditionBtn}
|
|
|
+ onClick={() => {
|
|
|
+ onSubmit();
|
|
|
+ }}>
|
|
|
+ <Button
|
|
|
+ round
|
|
|
+ disabled={forms.submitLoading}
|
|
|
+ loading={forms.submitLoading}>
|
|
|
+ 提交报名
|
|
|
+ </Button>
|
|
|
+ </div>
|
|
|
+ )}
|
|
|
+ </div>
|
|
|
+ </MSticky>
|
|
|
)}
|
|
|
- </Popup> */}
|
|
|
+ </div>
|
|
|
+
|
|
|
+ {forms.imgCodeStatus ? (
|
|
|
+ <MImgCode
|
|
|
+ v-model:value={forms.imgCodeStatus}
|
|
|
+ phone={studentInfo.username}
|
|
|
+ type="REGISTER"
|
|
|
+ onClose={() => {
|
|
|
+ forms.imgCodeStatus = false;
|
|
|
+ }}
|
|
|
+ onSendCode={onCodeSend}
|
|
|
+ />
|
|
|
+ ) : null}
|
|
|
+
|
|
|
+ {/* 年级 */}
|
|
|
+ <Popup
|
|
|
+ v-model:show={forms.gradeStatus}
|
|
|
+ position="bottom"
|
|
|
+ round
|
|
|
+ safeAreaInsetBottom
|
|
|
+ lazyRender={false}
|
|
|
+ class={'popupBottomSearch'}>
|
|
|
+ <Picker
|
|
|
+ showToolbar
|
|
|
+ columns={forms.gradeList}
|
|
|
+ onCancel={() => (forms.gradeStatus = false)}
|
|
|
+ onConfirm={(val: any) => {
|
|
|
+ const selectedOption = val.selectedOptions[0];
|
|
|
+ studentInfo.extra.currentGradeNum = selectedOption.value;
|
|
|
+ forms.gradeNumText = selectedOption.text;
|
|
|
+ forms.gradeStatus = false;
|
|
|
+ }}
|
|
|
+ />
|
|
|
+ </Popup>
|
|
|
+ {/* 班级 */}
|
|
|
+ <Popup
|
|
|
+ v-model:show={forms.classStatus}
|
|
|
+ position="bottom"
|
|
|
+ round
|
|
|
+ class={'popupBottomSearch'}>
|
|
|
+ <Picker
|
|
|
+ showToolbar
|
|
|
+ columns={forms.classList}
|
|
|
+ onCancel={() => (forms.classStatus = false)}
|
|
|
+ onConfirm={(val: any) => {
|
|
|
+ const selectedOption = val.selectedOptions[0];
|
|
|
+ studentInfo.extra.currentClass = selectedOption.value;
|
|
|
+ forms.currentClassText = selectedOption.text;
|
|
|
+ forms.classStatus = false;
|
|
|
+ }}
|
|
|
+ />
|
|
|
+ </Popup>
|
|
|
+
|
|
|
+ {/* 已经购买过样品 */}
|
|
|
+ <MDialog
|
|
|
+ title="提示"
|
|
|
+ v-model:show={forms.dialogConfirmStatus}
|
|
|
+ message={'已购买会员,是否确认购买?'}
|
|
|
+ primaryColor="#FF8057"
|
|
|
+ allowHtml={true}
|
|
|
+ confirmButtonText="确定"
|
|
|
+ showCancelButton
|
|
|
+ onConfirm={async () => {
|
|
|
+ await paymentContinue();
|
|
|
+ }}
|
|
|
+ />
|
|
|
+
|
|
|
+ <MDialog
|
|
|
+ title="提示"
|
|
|
+ v-model:show={forms.dialogStatus}
|
|
|
+ message={forms.dialogMessage}
|
|
|
+ allowHtml={true}
|
|
|
+ primaryColor="#FF8057"
|
|
|
+ confirmButtonText="继续支付"
|
|
|
+ onConfirm={async () => {
|
|
|
+ // const paymentConfig = forms.dialogConfig.paymentConfig;
|
|
|
+ // router.push({
|
|
|
+ // path: '/order-detail',
|
|
|
+ // query: {
|
|
|
+ // pm: 1, // h5乐团报名
|
|
|
+ // config: JSON.stringify(paymentConfig.paymentConfig),
|
|
|
+ // orderNo: paymentConfig.orderNo
|
|
|
+ // }
|
|
|
+ // });
|
|
|
+ // console.log(forms.dialogConfig, 'dialogConfig');
|
|
|
+
|
|
|
+ countDown.pause();
|
|
|
+ const paymentConfig = forms.dialogConfig.paymentConfig;
|
|
|
+ state.config = paymentConfig?.paymentConfig;
|
|
|
+ state.orderNo = paymentConfig?.orderNo;
|
|
|
+
|
|
|
+ await lastSubmit();
|
|
|
+ }}
|
|
|
+ onCancel={(val: any) => {
|
|
|
+ countDown.pause();
|
|
|
+ }}
|
|
|
+ />
|
|
|
+
|
|
|
+ <Popup
|
|
|
+ show={state.paymentStatus}
|
|
|
+ closeOnClickOverlay={false}
|
|
|
+ position="bottom"
|
|
|
+ round
|
|
|
+ closeOnPopstate
|
|
|
+ safeAreaInsetBottom
|
|
|
+ style={{ minHeight: '30%' }}>
|
|
|
+ <Payment
|
|
|
+ paymentConfig={state.orderInfo}
|
|
|
+ onClose={() => (state.paymentStatus = false)}
|
|
|
+ onBackOut={onBackOut}
|
|
|
+ onConfirm={(val: any) => onConfirm(val)}
|
|
|
+ />
|
|
|
+ </Popup>
|
|
|
+
|
|
|
+ <Popup
|
|
|
+ v-model:show={state.showQrcode}
|
|
|
+ round
|
|
|
+ onClose={() => {
|
|
|
+ // 二维码关闭时清除定时器
|
|
|
+ clearInterval(state.orderTimer);
|
|
|
+ }}>
|
|
|
+ <QrcodePayment
|
|
|
+ url={state.qrCodeUrl}
|
|
|
+ pay_channel={state.pay_channel}
|
|
|
+ orderType={orderType.value}
|
|
|
+ />
|
|
|
+ </Popup>
|
|
|
+
|
|
|
+ <MPopup v-model:modelValue={state.authShow}>
|
|
|
+ <UserAuth onSuccess={onAuthSuccess} hideHeader={!browser().isApp} />
|
|
|
+ </MPopup>
|
|
|
|
|
|
{/* 是否在微信中打开 */}
|
|
|
<OWxTip
|