lex-xin 4 years ago
parent
commit
0eea08ca2a

BIN
src/assets/images/level/signUpBg.png


+ 9 - 0
src/router/levelRouter.js

@@ -61,6 +61,15 @@ let levelRouter = [{
 		description: "报名",
 		weight: 7 // 页面权重
 	}
+}, {
+	path: "/smallProtocol",
+	name: "smallProtocol",
+	component: () =>
+		import( /* webpackChunkName: "SmallProtocol" */ "@/views/signup/SmallProtocol"),
+	meta: {
+		description: "协议",
+		weight: 3 // 页面权重
+	}
 }]
 
 export default levelRouter

+ 100 - 34
src/views/signup/SignUp.vue

@@ -2,19 +2,42 @@
     <div class="SignUp">
         <!-- <m-header /> -->
 		<div v-show="show" class="container" :style="backgroundImg">
-			<div class="title">
-				<h2>{{ baseInfo.posterTitle }}</h2>
-				<p>报名时间:{{ baseInfo.enrollStartTime }}~{{ baseInfo.enrollEndTime }}</p>
+			<h2>{{ baseInfo.posterTitle }}</h2>
+			<div class="section">
+				<div class="title" style="margin-top: 0">考试类型</div>
+				<div class="content">{{ baseInfo.examMode === "OFFLINE" ? "线下" : "线上" }}</div>
+
+				<div class="title">考试地址</div>
+				<div class="content" v-if="baseInfo.examMode === 'OFFLINE'">
+					<template v-if="baseInfo.examLocations">
+						<p v-for="(item, index) in baseInfo.examLocations" :key="index">
+							{{ item.address }}
+						</p>
+					</template>
+				</div>
+				<div class="content" v-else>线上网络教室</div>
+
+				<div class="title">考试简介</div>
+				<div class="content">{{ baseInfo.posterProfile }}</div>
+
+				<div class="title">报名时间</div>
+				<div class="content">{{ baseInfo.enrollTime }}</div>
+
+				<div class="title">预计考试日期</div>
+				<div class="content">{{ baseInfo.expectExamStartTime }}</div>
 			</div>
-			<m-button class="sign-btn" v-if="baseInfo.status === 'APPLYING'" @click="onSubmit" text="我要报名" />
+			<!-- <m-button class="sign-btn" @click="onSubmit" text="我要报名" /> -->
+			<van-button type="primary" :color="buttonColor" v-if="baseInfo.status === 'APPLYING'" @click="onSubmit" round block>我要报名</van-button>
+			<a class="protocol" @click="onProtocol" v-if="baseInfo.status === 'APPLYING'">协议协议</a>
+			<!-- <m-button class="sign-btn" v-if="baseInfo.status === 'APPLYING'" @click="onSubmit" text="我要报名" /> -->
 		</div>
     </div>
 </template>
 <script>
 // import MHeader from '@/components/MHeader'
-import MButton from '@/components/MButton'
+// import MButton from '@/components/MButton'
 import dayjs from 'dayjs'
-import _ from 'lodash'
+// import _ from 'lodash'
 import setLoading from '@/utils/loading'
 import { examinationBasicInfo } from './SignUpApi'
 // ETTING("SETTING", "设置中"),
@@ -27,7 +50,6 @@ import { examinationBasicInfo } from './SignUpApi'
 // CLOSE("CLOSE", "关闭")
 export default {
     name: 'SignUp',
-	components: { MButton },
     data () {
 		localStorage.removeItem('examId')
 		localStorage.removeItem('organId')
@@ -37,10 +59,12 @@ export default {
 			organId: query.organId,
 			show: false,
 			baseInfo: {}, // 基本信息
-			backgroundImg: null
+			backgroundImg: null,
+			buttonColor: null,
         }
     },
     mounted() {
+		localStorage.removeItem("Authorization")
 		this.__init()
     },
     methods: {
@@ -54,13 +78,21 @@ export default {
 					let tempData = res.data.data
 					this.baseInfo = {
 						posterTitle: tempData.posterTitle,
-						enrollStartTime: dayjs(tempData.enrollStartTime).format("YYYY.MM.DD"),
-						enrollEndTime: dayjs(tempData.enrollEndTime).format("YYYY.MM.DD"),
-						status: tempData.status
+						examMode: tempData.examMode,
+						enrollTime: dayjs(tempData.enrollStartTime).format("YYYY-MM-DD") + "~" + dayjs(tempData.enrollEndTime).format("YYYY-MM-DD"),
+						examLocationIdList: tempData.examLocationIdList,
+						expectExamStartTime: dayjs(tempData.expectExamStartTime).format("YYYY-MM-DD"),
+						status: tempData.status,
+						examLocations: tempData.examLocations, // 地址
+						posterProfile: tempData.posterProfile
 					}
-					// 设置背景图
-					this.backgroundImg = {
-						backgroundImage: `url(${tempData.posterBackgroundImg}) !important`
+					let poster = tempData.posterBackgroundImg ? JSON.parse(tempData.posterBackgroundImg) : ""
+					if(poster) {
+						// 设置背景图
+						this.backgroundImg = {
+							backgroundImage: `url(${poster.url}) !important`
+						}
+						this.buttonColor = poster.color
 					}
 				}
 			} catch(err) {
@@ -69,12 +101,19 @@ export default {
 			this.show = true
 			setLoading(false)
 		},
-		onSubmit: _.throttle(function() {
+		onSubmit() {
 			// console.log(show)
-			this.$router.replace({
-				path: '/signUpAccount'
+			this.$router.push({
+				path: '/signUpAccount',
+				query: {
+					examId: this.examId,
+					organId: this.organId
+				}
 			})
-		}, 500)
+		},
+		onProtocol() {
+			this.$router.push('/smallProtocol')
+		}
     }
 }
 </script>
@@ -90,26 +129,53 @@ export default {
 }
 .container {
 	min-height: 100vh;
-	background: url('../../assets/images/level/signup_bg.png') no-repeat center top;
-	background-size: cover;
-	.title {
-		text-align: center;
-		padding-top: .55rem;
-		h2 {
-			color: #007078;
-			font-size: .4rem;
-			font-weight: bold;
-		}
-		p {
-			color: #03838d;
+	background: url('../../assets/images/level/signUpBg.png') no-repeat center top #F3F4F8;
+	background-size: contain;
+	overflow: hidden;
+	h2 {
+		position: absolute;
+		padding-top: .4rem;
+		color: #ffffff;
+		font-size: .26rem;
+		font-weight: bold;
+		width: 2.1rem;
+		text-align: left;
+		margin-left: .16rem;
+	}
+	.section {
+		background: #ffffff;
+		margin: 2.2rem .16rem 0;
+		border-radius: .1rem;
+		padding: .22rem;
+		.title {
+			margin-top: .28rem;
 			font-size: .18rem;
+			color: #1A1A1A;
+		}
+		.content {
+			padding-top: .05rem;
+			color: #808080;
+			font-size: .16rem;
 		}
 	}
 
-	.sign-btn {
-		position: absolute;
-		bottom: .5rem;
-		width: 100%;
+	.protocol {
+		font-size: .14rem;
+		margin-bottom: .3rem;
+		text-align: center;
+		display: block;
+		color: #0091FF;
+	}
+	.van-button--primary {
+		margin: .35rem 0 .1rem;
+		background-color: var(--main-color);
+		border: 1px solid var(--main-color);
+		color: #FFFFFF;
+		font-size: .18rem;
+		height: .5rem;
+		line-height: .52rem;
+		width: 90%;
+		margin-left: 5%;
 	}
 }
 </style>

+ 2 - 1
src/views/signup/SignUpAccount.vue

@@ -39,7 +39,8 @@ export default {
     data () {
         const query = this.$route.query
         return {
-            organId: query.examId,
+            examId: query.examId,
+            organId: query.organId,
             patternPhone: patternPhone,
             form: {
                 phone: null,

+ 1 - 1
src/views/signup/SignUpApi.js

@@ -131,7 +131,7 @@ export function examRegistrationUpdate (data) {
     return axios({
         url: '/api-user/examRegistration/update',
         method: 'post',
-        data: qs.stringify(data)
+        data: data
     })
 }
 

+ 5 - 1
src/views/signup/SignUpBaseInfo.vue

@@ -81,6 +81,7 @@ export default {
         }
     },
     mounted() {
+        localStorage.removeItem("examRegistrationParams")
         // 插入token
         // let params = this.$route.query
         // if(params.Authorization) {
@@ -146,7 +147,10 @@ export default {
                 let result = res.data
                 if(result.code == 200) {
                     this.$router.push({
-                        path: '/signUpLevel'
+                        path: '/signUpLevel',
+                        query: {
+                            studentName: this.form.realName
+                        }
                     })
                 } else {
                     this.$toast(result.msg)

+ 179 - 45
src/views/signup/SignUpLevel.vue

@@ -47,9 +47,9 @@
             </template>
         </van-field>
         <div class="title">乐理知识</div>
-        <van-field required @click="onGetSheetList('examMusicTheory')" readonly clickable name="nation" label="专业级别" v-model="form.examMusicTheoryName" placeholder="请选择专业级别" is-link />
+        <van-field required @click="onGetSheetList('examMusicTheory')" readonly clickable name="nation" label="专业级别" v-model="formText.examMusicTheoryName" placeholder="请选择专业级别" is-link />
         <!-- <van-field readonly clickable name="nation" label="上次考级级别" placeholder="请选择" is-link /> -->
-        <van-field readonly :required="form.examMusicTheoryId ? true : false" clearable name="code" label="上次考级证书" >
+        <van-field readonly :required="form.examMusicTheoryId == 999 ? true : false" clearable name="code" label="上次考级证书" >
             <template #input>
                 <van-uploader
                     name="certificate2"
@@ -128,7 +128,7 @@ import MHeader from '@/components/MHeader'
 import MStep from '@/components/MStep'
 import setLoading from '@/utils/loading'
 import { patternPhone } from '@/utils/validateRules'
-import { getExamSubjects, getExamSubjectLevel, getExamSubjectSong, uploadFile, getTheoryLevelList, examRegistrationAdd, examRegistrationUpdate } from './SignUpApi'
+import { getExamSubjects, getExamSubjectLevel, getExamSubjectSong, uploadFile, getTheoryLevelList } from './SignUpApi'
 const levelToCN = {
     1: "一级",
     2: "二级",
@@ -147,9 +147,13 @@ export default {
     data () {
         const examId = localStorage.getItem('examId')
         const organId = localStorage.getItem('organId')
+        const examRegistrationParams = localStorage.getItem("examRegistrationParams") ? JSON.parse(localStorage.getItem("examRegistrationParams")) : null
+        const query = this.$route.query
         return {
             examId: examId,
             organId: organId,
+            examRegistrationParams: examRegistrationParams,
+            studentName: query.studentName,
             patternPhone: patternPhone,
             sheetForm: { // 上拉弹窗
                 currentType: null, // 当前选择的类型
@@ -176,12 +180,16 @@ export default {
             },
             form: {
                 subjectId: null,
-                levelId: null,
+                levelId: null, // 级别
+                examSubjectSongId: null, // 级别编号
                 adviserName: null, // 老师姓名
                 adviserPhone: null, // 联系电话
                 lastExamCertificateUrl: null,
                 lastMusicTheoryCertificateUrl: null,
                 examMusicTheoryId: null,
+                examMusicTheoryLevel: null,
+                levelFee: 0,// 级别费用
+                theoryLevelFee: 0, // 乐理费用
             },
             formText: {
                 subjectName: null,
@@ -218,6 +226,11 @@ export default {
         //     localStorage.setItem('userInfo', decodeURI(params.Authorization))
         // }
         this.__init()
+        if(this.examRegistrationParams) {
+            this.getRegisterInfo(this.examRegistrationParams)
+        } else {
+            this.getTheoryLevelList()
+        }
         // this.form.levelId = 1
         // this.practiceNum = 2
         // this.practiceSongIdList = ""
@@ -226,6 +239,116 @@ export default {
         // this.getExamSubjectSong()
     },
     methods: {
+        async getRegisterInfo(data) {
+            if(!data) { // 判断是否有数据
+                return
+            }
+            let form = this.form,
+                formText = this.formText
+            form.subjectId = data.subjectId // 报考专业专业
+            formText.subjectName = data.subjectName // 报考专业名称
+            form.levelFee = data.levelFee,// 级别费用
+            form.theoryLevelFee = data.theoryLevelFee, // 乐理费用
+            this.getExamSubjectLevel((tempList) => {
+                //
+                tempList.forEach(item => {
+                    if(item.level == data.level) {
+                        form.levelId = item.value
+                        form.examSubjectSongId = item.id
+                        formText.levelName = levelToCN[data.level]
+                        this.practiceNum = item.practiceNum
+                        this.practiceSongIdList = item.practiceSongIdList
+                        this.performNum = item.performNum
+                        this.performSongIdList = item.performSongIdList
+                    }
+                })
+
+                // 报考曲目
+                this.getExamSubjectSong()
+
+                const songJsonParse = data.songJson ? JSON.parse(data.songJson) : []
+                let tempPracticeArr = [],
+                    tempPracticeStr = [],
+                    tempPerformArr = [],
+                    tempPerformStr = []
+                songJsonParse.forEach(item => {
+                    if(item.type == "PERFORM") {
+                        tempPerformArr.push(item)
+                        tempPerformStr.push(item.songName + '-' + item.songAuthor)
+                        this.performNumSelectIds.push(item.id)
+                    } else if(item.type == "PRACTICE") {
+                        tempPracticeArr.push(item)
+                        tempPracticeStr.push(item.songName + '-' + item.songAuthor)
+                        this.practiceSelectIds.push(item.id)
+                    }
+                })
+                // 练习课 "PRACTICE"
+                this.practiceSelect = tempPracticeStr
+                if(this.practiceSongIdList) {
+                    this.practiceSelectList = tempPracticeArr
+                } else {
+                    tempPracticeArr.forEach(item => {
+                        item.name = item.songName
+                        item.author = item.songAuthor
+                        const urlList = item.uploadUrl ? item.uploadUrl.split(',') : []
+                        let tempUrl = []
+                        urlList.forEach(url => {
+                            tempUrl.push({
+                                url: url
+                            })
+                        })
+                        this.practiceUpload.push(tempUrl)
+                    })
+                    this.practiceSelectUploadList = tempPracticeArr
+                }
+                // 演奏课 "PERFORM"
+                this.performNumSelect = tempPerformStr
+                if(this.performSongIdList) {
+                    this.performNumSelectList = tempPerformArr
+                } else {
+                    tempPerformArr.forEach(item => {
+                        item.name = item.songName
+                        item.author = item.songAuthor
+                        const urlList = item.uploadUrl ? item.uploadUrl.split(',') : []
+                        let tempUrl = []
+                        urlList.forEach(url => {
+                            tempUrl.push({
+                                url: url
+                            })
+                        })
+                        this.performNumUpload.push(tempUrl)
+                    })
+                    this.performNumSelectUploadList = tempPerformArr
+                }
+            }) // 获取报考级别
+
+            // 上传证书(上次考级证书)
+            if(data.lastExamCertificateUrl) {
+                form.lastExamCertificateUrl = data.lastExamCertificateUrl
+                this.uploadCertificate = [{ url: data.lastExamCertificateUrl }]
+            }
+            // 乐理知识
+            this.getTheoryLevelList((tempList) => {
+                tempList.forEach(item => {
+                    if(!data.examMusicTheoryId && !data.examMusicTheoryLevel) {
+                        form.examMusicTheoryId = 999
+                        form.examMusicTheoryLevel = 999
+                        formText.examMusicTheoryName = "免考"
+                    } else if(item.level == data.examMusicTheoryLevel) {
+                        form.examMusicTheoryId = item.id
+                        form.examMusicTheoryLevel = item.level
+                        formText.examMusicTheoryName = item.text
+                    }
+                })
+            })
+
+            if(data.lastMusicTheoryCertificateUrl) {
+                form.lastMusicTheoryCertificateUrl = data.lastMusicTheoryCertificateUrl
+                this.uploadCertificate2 = [{ url: data.lastMusicTheoryCertificateUrl }]
+            }
+            form.adviserName = data.adviserName
+            form.adviserPhone = data.adviserPhone
+        },
         async __init() {
             setLoading(true)
             try {
@@ -241,17 +364,31 @@ export default {
                     })
                     this.examSubjectList = tempArr
                 }
-
+            } catch(err) {
+                //
+            }
+            setLoading(false)
+        },
+        async getTheoryLevelList(callBack) {
+            setLoading(true)
+            try {
                 const resTheory = await getTheoryLevelList({ examId: this.examId })
                 const resultTheory = resTheory.data
                 if(resultTheory.code == 200 && resultTheory.data.length > 0) {
-                    let tempArr2 = []
+                    let tempArr2 = [{
+                        id: 999,
+                        value: 999,
+                        text: "免考",
+                        level: 999,
+                        fee: 0
+                    }]
                     resultTheory.data.forEach(item => {
                         item.value = item.id
                         item.text = levelToCN[item.level]
                         tempArr2.push(item)
                     })
                     this.examMusicTheoryList = tempArr2
+                    callBack && callBack(tempArr2)
                 }
             } catch(err) {
                 //
@@ -307,14 +444,16 @@ export default {
                 return
             }
             if(sheetForm.currentType == "examSubject") {
-                if(form.subjectId != value.examSubjectId) {
-                    form.subjectId = value.examSubjectId
+                if(form.subjectId != value.id) {
+                    form.subjectId = value.id
                     formText.subjectName = value.name
                     this.examSubjectIndex = index
 
                     // 清除报考级别
                     form.levelId = null
                     formText.levelName = null
+                    form.examSubjectSongId = null
+                    form.levelFee = 0
                     this.levelIndex = 0
                     this.practiceNum = 0 // 练习曲数量
                     this.practiceSongIdList = null
@@ -325,6 +464,8 @@ export default {
                 sheetForm.sheetStatus = false
             } else if(sheetForm.currentType == 'level') {
                 form.levelId = value.value
+                form.examSubjectSongId = value.id
+                form.levelFee = value.registrationFee // 级别费用
                 formText.levelName = value.text
                 this.levelIndex = index
                 this.practiceNum = value.practiceNum
@@ -335,12 +476,14 @@ export default {
                 this.getExamSubjectSong()
             } else if(sheetForm.currentType == "examMusicTheory") {
                 form.examMusicTheoryId = value.value
-                form.examMusicTheoryName = value.text
+                form.theoryLevelFee = value.fee
+                form.examMusicTheoryLevel = value.level
+                formText.examMusicTheoryName = value.text
                 this.examMusicTheoryIndex = index
                 sheetForm.sheetStatus = false
             }
         },
-        async getExamSubjectLevel() {
+        async getExamSubjectLevel(callBack) {
             setLoading(true)
             try {
                 const form = this.form
@@ -354,23 +497,24 @@ export default {
                         tempArr.push(item)
                     })
                     this.levelList = tempArr
+                    callBack && callBack(tempArr)
                 }
             } catch(err) {
                 //
             }
             setLoading(false)
         },
-        async getExamSubjectSong() {
+        async getExamSubjectSong(callBack) {
             setLoading(true)
             try {
                 const form = this.form
                 const params = {
-                    // examSubjectId: form.subjectId,
-                    // examinationBasicId: this.examId,
-                    // level: form.levelId
-                    examSubjectId: 5,
-                    examinationBasicId: 6,
-                    level: 1
+                    examSubjectId: form.subjectId,
+                    examinationBasicId: this.examId,
+                    level: form.levelId
+                    // examSubjectId: 5,
+                    // examinationBasicId: 6,
+                    // level: 1
                 }
                 const res = await getExamSubjectSong(params)
                 const result = res.data
@@ -382,6 +526,8 @@ export default {
                         tempArr.push(item)
                     })
                     this.songList = tempArr
+
+                    callBack && callBack(tempArr)
                 }
             } catch(err) {
                 //
@@ -420,15 +566,6 @@ export default {
             }
             this.songSelectIndex = index
             sheetSong.status = true
-            // console.log(sheetSong)
-            // if(this.examSubjectList.length > 0) {
-            //     sheetForm.sheetStatus = true
-            //     sheetForm.columns = this.examSubjectList
-            //     sheetForm.index = this.examSubjectIndex
-            // } else {
-            //     this.$toast("暂无报考专业")
-            //     return
-            // }
         },
         onPracticeConfirm(value) {
             // 没有内容
@@ -563,12 +700,14 @@ export default {
                     const practiceUpload = this.practiceUpload
                     this.practiceSelectUploadList.forEach(item => {
                         let tempUrl = []
+                        console.log(item)
                         practiceUpload[item.index].forEach(item => {
                             tempUrl.push(item.url)
                         })
                         songJson.push({
                             songName: item.name,
                             songAuthor: item.author,
+                            index: item.index,
                             type: "PRACTICE",
                             uploadUrl: tempUrl.join(',')
                         })
@@ -594,6 +733,7 @@ export default {
                         songJson.push({
                             songName: item.name,
                             songAuthor: item.author,
+                            index: item.index,
                             type: "PERFORM",
                             uploadUrl: tempUrl.join(',')
                         })
@@ -603,35 +743,29 @@ export default {
                 let form = this.form,
                     formText = this.formText
                 let params = {
+                    studentName: this.studentName,
                     adviserName: form.adviserName,
                     adviserPhone: form.adviserPhone,
-                    examMusicTheoryId: form.examMusicTheoryId,
-                    examMusicTheoryLevel: formText.examMusicTheoryName,
-                    examSubjectSongId: form.subjectId,
+                    examMusicTheoryId: form.examMusicTheoryId == 999 ? null : form.examMusicTheoryId,
+                    examMusicTheoryLevel: form.examMusicTheoryLevel == 999 ? null : form.examMusicTheoryLevel,
                     examinationBasicId: this.examId,
                     lastExamCertificateUrl: form.lastExamCertificateUrl,
                     lastMusicTheoryCertificateUrl: form.lastMusicTheoryCertificateUrl,
                     level: form.levelId,
+                    examSubjectSongId: form.examSubjectSongId,
                     subjectId: form.subjectId, // 考级专业
+                    subjectName: formText.subjectName,
                     songJson: JSON.stringify(songJson),
-                    organId: this.organId
+                    organId: this.organId,
+                    levelFee: form.levelFee,
+                    theoryLevelFee: form.theoryLevelFee
                 }
                 console.log("参数", params)
-                const res = await examRegistrationAdd(params)
                 setLoading(false)
-                const result = res.data
-                if(result.code == 200) {
-                    const tempResult = result.data
-                    this.$router.push({
-                        path: '/signUpPayment',
-                        query: {
-                            examRegistrationId: tempResult.examRegister.id,
-                            payMap: JSON.stringify(tempResult.payMap)
-                        }
-                    })
-                } else {
-                    this.$toast(result.msg)
-                }
+                localStorage.setItem("examRegistrationParams", JSON.stringify(params))
+                this.$router.push({
+                    path: '/signUpPayment'
+                })
             } catch(err) {
                 //
             }
@@ -678,7 +812,7 @@ export default {
                 return false
             }
 
-            if(form.examMusicTheoryId > 1 && !form.lastMusicTheoryCertificateUrl) {
+            if(form.examMusicTheoryId == 999 && !form.lastMusicTheoryCertificateUrl) {
                 this.$toast('请上传考级证书')
                 return false
             }

+ 53 - 23
src/views/signup/SignUpPayment.vue

@@ -58,7 +58,7 @@ import MPayment from '@/components/MPayment'
 import dayjs from 'dayjs'
 import numeral from 'numeral'
 // import { changeTwoDecimal } from '@/utils/common'
-import { getExamRegistration, repay } from './SignUpApi'
+import { getExamRegistration, repay, examRegistrationAdd } from './SignUpApi'
 import setLoading from '@/utils/loading'
 const levelToCN = {
     1: "一级",
@@ -77,15 +77,15 @@ export default {
 	components: { MHeader, MStep, MPayment },
     data () {
         const query = this.$route.query
-        // const examId = localStorage.getItem('examId')
-        const payMap = query.payMap ? JSON.parse(query.payMap) : {}
+        const params = localStorage.getItem("examRegistrationParams") ? JSON.parse(localStorage.getItem("examRegistrationParams")) : null
         return {
             orderNo: query.orderNo,
             examRegistrationId: query.examRegistrationId,
             payMoney: 0,
             orderInfo: { fee: 0 },
+            params: params,
+            payMap: {},
             isStatus: false,
-            payMap: payMap,
 			payment: {}, // 支付对象
         }
     },
@@ -102,24 +102,22 @@ export default {
         async __init() {
             setLoading(true)
             try {
+                if(!this.examRegistrationId) {
+                    setLoading(false)
+                    if(this.params) {
+                        this.onParse(this.params)
+                    } else {
+                        window.history.go(-1)
+                    }
+                    return
+                }
                 const res = await getExamRegistration({ examRegistrationId: this.examRegistrationId })
                 setLoading(false)
                 const result = res.data
                 if(result.code == 200) {
                     //
                     const tempResult = result.data
-                    let fee = numeral(tempResult.theoryLevelFee).add(tempResult.levelFee)
-                    let number = fee.value()
-                    const tempLevel = tempResult.examMusicTheoryLevel ? levelToCN[tempResult.examMusicTheoryLevel] + `/${numeral(tempResult.theoryLevelFee).value()}元` : "无"
-                    const params = {
-                        studentName: tempResult.studentName,
-                        subjectName: tempResult.subjectName + `(${tempResult.level}/${numeral(tempResult.levelFee).value()}元)`,
-                        examMusicTheoryLevel: tempLevel,
-                        examStartTime: dayjs(tempResult.examStartTime).format("YYYY-MM-DD"),
-                        fee: numeral(number).format('0,0.00')
-                    }
-                    this.payMoney = number
-                    this.orderInfo = params
+                    this.onParse(tempResult)
                 } else {
                     this.$toast(result.msg)
                 }
@@ -127,24 +125,56 @@ export default {
                 //
             }
         },
+        onParse(tempResult) {
+            let fee = numeral(tempResult.theoryLevelFee).add(tempResult.levelFee)
+            let number = fee.value()
+            const tempLevel = tempResult.examMusicTheoryLevel ? levelToCN[tempResult.examMusicTheoryLevel] + `/${numeral(tempResult.theoryLevelFee).value()}元` : "免考"
+            const params = {
+                studentName: tempResult.studentName,
+                subjectName: tempResult.subjectName + `(${levelToCN[tempResult.level]}/${numeral(tempResult.levelFee).value()}元)`,
+                examMusicTheoryLevel: tempLevel,
+                examStartTime: dayjs(tempResult.examStartTime).format("YYYY-MM-DD"),
+                fee: numeral(number).format('0,0.00')
+            }
+            this.payMoney = number
+            this.orderInfo = params
+        },
         onChangeStatus(val) {
             this.isStatus = val
         },
         async onSubmit() {
-            setLoading(true)
             // 没有订单号说明是创建订单
-            if(!this.orderNo) {
-                setLoading(false)
-                this.onSubmitPay()
+            if(this.orderNo) {
+                this.onRePay()
                 return
+            } else {
+                this.onExamRegistration()
             }
-
+        },
+        async onExamRegistration() {
+            setLoading(true)
             // 有订单号说明重新支付
             try {
-                let res = await repay({ orderNo: this.orderNo })
+                let res = await examRegistrationAdd(this.params)
+                setLoading(false)
                 let result = res.data
-                console.log(result)
+                if(result.code == 200) {
+                    this.payMap = result.data.payMap
+                    this.onSubmitPay()
+                } else {
+                    this.$toast(result.msg)
+                }
+            } catch(err) {
+                //
+            }
+        },
+        async onRePay() {
+            setLoading(false)
+            // 有订单号说明重新支付
+            try {
+                let res = await repay({ orderNo: this.orderNo })
                 setLoading(false)
+                let result = res.data
                 if(result.code == 200) {
                     this.payMap = result.data
                     this.onSubmitPay()

+ 195 - 0
src/views/signup/SmallProtocol.vue

@@ -0,0 +1,195 @@
+<template>
+    <div class="privacy">
+        <m-header />
+        <div class="container">
+            <h1>用户隐私协议</h1>
+            <strong>发布日期:2019-11-22</strong><br />
+            <strong>最新更新日期:2019-11-22</strong><br />
+
+            深圳大雅乐盟网络教育股份有限公司(下称“大雅乐盟”或“本公司”)尤其重视儿童(即指未满14周岁的未成年人,下称“儿童用户”)的隐私和个人信息保护。《大雅乐盟儿童个人信息保护规则》(下称“本政策”)旨在向儿童用户及其监护人说明本公司如何收集、使用、处理、存储儿童个人信息以及为儿童用户或其监护人提供访问、删除、更正等处理事宜。在使用本公司提供的软件及相关服务前,请您务必仔细阅读并充分理解本政策,尤其是以加粗、下划线等标识的条款。<br />
+
+            <strong class="line">向儿童用户监护人特别提示:</strong>
+            <strong class="line">我们希望与您共同保护儿童用户的个人信息,教育和引导儿童提高个人信息保护意识和能力,教育儿童未经监护人的明确同意,不向任何网络服务方提供任何个人信息(包括儿童自身的个人信息以及监护人的个人信息)。请您务必与您的孩子共同仔细阅读后选择是否同意本政策,并保证您的孩子在您的同意和指导下使用本公司提供的软件及相关服务,以及提交个人信息。您点击同意本政策,或者您的孩子使用本公司提供的软件及相关服务,或提交个人信息的,即表示您同意并授权本公司按照本政策收集、使用、分享、转让、披露和存储您的孩子的个人信息;如果您不同意本政策的任何条款或内容的,请您立即要求您的孩子停止使用本公司提供的软件及相关服务。</strong><br />
+
+            <strong class="line">向儿童用户的特别提示:</strong><br />
+            <strong class="line">如果您是未满14周岁的未成年人,请通知您的监护人并与监护人共同阅读本政策,请务必征得监护人的同意、授权及指导后,使用本公司提供的软件及服务或者提交信息。您点击同意本政策、或者使用本公司提供的软件及相关服务,或者提交个人信息的,即表示您已获得监护人的同意和授权,您的监护人同意本公司按照本政策收集、使用、分享、转让、披露和存储您的个人信息;如果您的监护人不同意本政策的任何条款或内容的,请您立即停止使用本公司提供的软件及相关服务。</strong><br />
+
+            本公司收集、使用、共享和保护用户的个人信息,是在遵守国家法律法规规定的前提下,仅出于本政策所述的以下目的,遵循正当必要、知情同意、目的明确、安全保障、依法利用的原则收集、存储、使用、转移、披露儿童个人信息。<br />
+            如果您对本政策有任何疑问的,请通过本政策中公布的联系方式与本公司联系。<br />
+            <!-- 本公司联系方式:【】联系人:【】<br /> -->
+
+            <h2>一、本公司收集和使用儿童用户个人信息</h2>
+            个人信息是指以电子或者其他方式记录的能够单独或者与其他信息结合识别特定自然人身份或者反映特定自然人活动情况的各种信息。<br />
+            1. 用户账户信息:<br />
+            儿童用户使用本公司提供的软件及相关服务前,需要在本公司提供的软件注册账户,此时我们需要您主动填写和提供注册信息,包括姓名、性别、出生日期、所在学校、所在班级、手机号码、家庭住址、创建的用户名(ID)等信息,这些信息是本公司为儿童用户提供考勤、教学、排课、陪练、打分等服务所必要的,如果您不提供给本公司,您可能无法使用本公司提供的软件或相关服务。<br />
+
+            2. 用户使用本公司提供的软件及相关服务信息:<br />
+            儿童用户通过电脑、平板电脑或手机等智能设备访问本公司提供的软件及其相关服务时,服务器会自动记录儿童用户的登录IP地址、网络服务商、接入网络的方式、类型及状态、网络质量数据、使用的语言、设备类别、设备型号、设备识别码、操作系统、分辨率、访问日期及时间长度等信息,以及儿童用户登录和使用本公司提供的软件及相关服务时,儿童用户使用的设备所在的地理位置信息。<br />
+            儿童用户使用本公司提供的软件及相关服务参加直播教学、录播教学等课程时,我们会收集儿童用户提交的信息以及系统自动记录和存储的信息,包括但不限于视频、录像、音频、照片、截图以及这些信息产生时对应的日期、时间、地点等。<br />
+
+            3. 交易信息和付款信息:<br />
+            儿童用户使用本公司提供的软件及相关服务的过程中,购买课程或其他服务需要向本公司进行支付,<strong class="line">本公司建议由儿童用户的监护人完成支付交易的整个过程,如果支付交易是由儿童用户进行,则应当在向本公司提供支付信息之前,获得其监护人的同意、授权和指导。</strong>本公司会收集支付交易时使用的支付工具、支付账户、银行卡号、开户银行、支付状态信息,支付日期等信息。<strong class="line">如果您进行支付交易时直接跳转至第三方支付页面的,该第三方将会直接收集您的支付信息,此时您的支付信息的收集、使用、存储等规则将遵循该第三方的隐私政策,请您注意事先仔细查阅。</strong>如果您符合本公司相关服务协议里约定的退费情形,并要求退费时,本公司需要您提供姓名、银行卡号、开户银行等信息。<br />
+
+            4. 儿童用户因请假、打卡签到或其他原因通过电话、电子邮件或其他线上或线下渠道与本公司取得联系时,本公司会收集和处理该儿童用户向本公司提供或者反馈的信息,儿童用户的姓名、联系方式,以及本公司为了处理该儿童用户的请求而必须向其确认的事项,并可能会保留与儿童用户的通话、通信记录,以便本公司及时与该儿童用户或其监护人联系和沟通并处理。<br />
+
+            5. 本公司还可能为了改进本公司服务,提高教学和服务质量等需要,儿童用户或其监护人联系和沟通,并在此过程中收集沟通时提供的相关信息。<br />
+
+            6. 本公司在教学和服务过程中必要时向儿童发出与教学或服务有关的通知或推送。<br />
+
+            7. 检测和防止欺诈和IT安全威胁所需的信息:本公司收集检测,调查和预防欺诈,作弊、IT安全威胁、网络漏洞、黑客攻击、计算机病毒和其他违反用户协议和适用法律的行为所需的某些信息。此数据仅用于检测,调查,预防以及在适用的情况下对此类行为进行处理,并且仅在此目的所需的最短时间内存储。如果披露信息会影响本公司检测、调查、防止此类行为的机制,则可能无法向您披露为此目的而存储的特定信息。<br />
+
+            8. 如本公司要向儿童用户的个人信息用于本政策未载明的其他用途时,将事先获得儿童用户监护人的同意;如本公司将基于特定目的而收集的儿童用户个人信息用于其他目的时,将事先获得儿童用户监护人的同意。<br />
+
+            <strong class="line">本公司收集儿童用户的个人信息后,可能会通过技术手段对已经收集的儿童用户个人信息进行匿名化处理,使得儿童用户个人信息主体无法被识别,且处理后的信息不能被复原,此时经过匿名化处理后的个人信息不再属于用户个人信息。本公司可能会将匿名化处理信息用于测试本公司的IT系统,研究,数据分析,改进服务,以及开发新服务、新产品和功能,以及向第三方分享、转让、披露,此时无需另行获得儿童用户监护人的授权同意。</strong><br />
+
+            <h2>二、本公司共享、转让、披露儿童用户个人信息</h2>
+            1. 共享:<br />
+            1.1在获取儿童用户监护人的明确同意或授权的情况共享;<br />
+            1.2根据法律法规规定,或者按照政府主管部门的强制性要求;<br />
+            1.3为了向儿童用户提供教学或服务,本公司可能会与关联方分享,但是本公司只会分享必要的个人信息,且此时受用户服务协议或本隐私政策中所声明的收集和使用之目的的约束,本公司的关联方如要改变个人信息的处理目的,将再次征求儿童用户监护人的授权同意;<br />
+            1.4本公司还可以与提供与本公司提供的软件及相关服务相关的必要功能和支持服务的第三方(例如,提供或处理支付业务、网络定位服务、推送通知、电子邮件服务、税务和会计服务、分析服务)共享儿童用户的个人信息数据,此时本公司仅会处于合法、正当、必要、特定、明确的目的共享儿童用户的个人信息,并且只会共享提供服务所必要的信息,且此时本公司会与这些第三方主体签订保密协议,要求这些第三方主体按照相关法律法规规定、本政策及其他任何相关的保密和安全措施保护儿童用户的个人信息。<br />
+            2. 转让:<br />
+            2.1在获取儿童用户监护人的明确同意的情况下转让;<br />
+            2.2本公司发生合并、收购、资产转让或类似交易或者破产清算时,用户信息(包括儿童用户的个人信息)可能会被转让给相关方,此时本公司会要求这些受让方继续遵守本政策的约束,如果这些受让方变更用户信息的使用目的时,应重新获得儿童用户监护人的同意和授权;<br />
+            本公司向第三方转让儿童用户个人信息时,将自行或委托第三方机构进行安全评估。<br />
+            3. 披露:<br />
+            3.1在获取儿童用户监护人的要求或明确同意的情况下披露;<br />
+            3.2根据法律法规规定、法院或政府主管部门的强制性要求时;<br />
+            3.3本公司发生资本市场活动(例如IPO等)时,可能需要接受其他主体的尽职调查,此时本公司可能会根据尽职调查的需要将儿童用户的个人信息提供给必要的主体,但本公司会与实施调查的主体签订保密协议,要求这些第三方主体按照相关法律法规规定、本政策及其他任何相关的保密和安全措施来保护儿童用户的个人信息。<br />
+            4. 本公司在下列情形时,无需获得儿童用户监护人的授权同意,即可分享、转让、披露儿童用户的信息:<br />
+            4.1与国家安全、国防安全相关的;<br />
+            4.2与公共安全、公共卫生、重大公共利益相关的;<br />
+            4.3与犯罪侦查、起诉、审判和判决执行等司法或行政执法相关的;<br />
+            4.4为了维护儿童或其他个人的生命和财产等重大合法权利但又很难得到监护人同意的情况下;<br />
+            4.5儿童用户的监护人自行向社会公开的信息;<br />
+            4.6从合法公开渠道获得的信息,如新闻报道、政府信息公开等渠道。<br />
+
+            <h2>三、儿童用户个人信息的保护、存储、跨境传输</h2>
+            1. 本公司会努力采取各种符合业界标准的物理、电子和管理方面的安全措施来保护儿童用户的个人信息,防止儿童用户的个人信息遭到未经授权访问、公开披露、使用、修改、损坏或丢失。本公司会采取一切合理可行的措施,保护儿童用户的个人信息。<br />
+            2. 本公司会采取加密等措施存储儿童用户的个人信息,确保信息安全,并以最小授权为原则对本公司工作人员严格设置信息访问权限,控制儿童用户个人信息知悉范围。工作人员需要访问儿童个人信息的,应当经过本公司儿童个人信息保护负责人或者其授权的管理人员审批,并且记录访问情况,采取技术措施,避免违法复制、下载儿童个人信息。<br />
+            3. 本公司将会采取一切合理可行的措施,确保未收集无关的儿童用户个人信息,并只会在达成本政策所述目的所需的期限内存储和保留儿童用户的个人信息,不会超过本政策所述目的所必需的期限,除非需要延长保留期或受到法律的允许。<br />
+            4. 互联网并非绝对安全的环境,而且电子邮件、即时通讯、社交软件或其他服务软件等与其他用户交流的方式无法确定是否完全加密,因此本公司建议监护人教育和指导儿童使用此类工具时注意保护信息安全,并使用复杂密码,协助本公司保证儿童用户的账户安全。<br />
+            5. 互联网环境并非百分之白安全,本公司将尽力确保或担保用户发送给本公司的任何信息的安全性。如果本公司的物理、技术,或管理防护设施遭到破坏,导致信息被非授权访问、公开披露、篡改,或破坏,导致您的合法权益受损,本公司将承担相应的法律责任。<br />
+            6. 本公司发现儿童用户个人信息发生或可能发生泄露、毁损、灭失的,本公司将将立即启动应急预案,采取补救措施;造成或者可能造成严重后果的,会立即向有关主管部门报告,并将事件相关情况以邮件、信函、电话、推送通知等方式告知受影响的儿童用户及其监护人,难以逐一告知的,将会采取合理、有效的方式发布相关警示信息。包括但不限于安全事件的基本情况和可能的影响、本公司已采取或将要采取的处置措施、用户可自主防范和降低风险的建议、对用户的补救措施等。同时,本公司还将按照监管部门要求,主动上报个人信息安全事件的处置情况。<br />
+            7. 本公司将儿童用户的个人信息存储于中华人民共和国境内。如需跨境传输,本公司将依法征得儿童用户监护人的授权同意。<br />
+            8. 儿童用户提供的上述信息,将在该儿童用户使用本服务期间持续授权本公司使用。本公司停止运营软件或服务的,将会立即停止收集儿童用户个人信息,并删除持有的儿童用户个人信息,并将停止运营的通知及时通知儿童用户的监护人;当该儿童用户注销账号时,本公司将停止使用并删除上述信息。<br />
+
+            <h2>四、用户的权利及其实现的途径和方法</h2>
+            1. 更正<br />
+            儿童用户或其监护人一旦发现本公司收集、存储、使用、披露的儿童个人信息有错误的,有权要求本公司予以更正,本公司将会及时采取措施予以更正。<br />
+            2. 删除<br />
+            儿童用户或者其监护人要求本公司删除其收集、存储、使用、披露的儿童用户个人信息时,本公司将会及时采取措施予以删除,包括但不限于以下情形:<br />
+            2.1本公司违反法律、行政法规的规定或者双方的约定收集、存储、使用、转移、披露儿童个人信息的;<br />
+            2.2本公司超出目的范围或者必要期限收集、存储、使用、转移、披露儿童个人信息的;<br />
+            2.3儿童用户监护人撤回授权同意的;<br />
+            2.4儿童或者其监护人通过注销等方式终止使用本公司提供的软件及其相关服务的。<br />
+            3. 访问<br />
+            儿童用户及其监护人有权访问该儿童用户的个人信息,法律法规规定的例外情况除外。如果儿童用户及其简化人希望访问、编辑、更改该儿童用户的账户中的个人资料信息、更改密码、或关闭用户的账户等,均可以通过访问本公司提供的软件执行此类操作。如果儿童用户及其监护人无法通过本公司提供的软件访问这些个人信息,可以随时联系本公司。<br />
+            4. 在响应儿童用户及其监护人的上述请求时,为了保障安全,本公司可能要求提供书面请求,或以其他方式证明身份,本公司会验证用户身份后再处理该请求,并在30日内作出答复。在下列情形时,本公司无法响应儿童用户及其监护人的请求:<br />
+            4.1与国家安全、国防安全直接相关的;<br />
+            4.2与公共安全、公共卫生、重大公共利益直接相关的;<br />
+            4.3与犯罪侦查、起诉、审判、执行等直接相关的;<br />
+            4.4有充分的证据表明用户存在主观恶意或滥用权利的;<br />
+            4.5响应用户的请求可能导致用户或者其他个人、组织的合法权益受到严重损害的;<br />
+            4.6涉及商业秘密的。<br />
+
+            <h2>五、关于Cookie及同类技术</h2>
+            为了确保本公司提供的软件及相关服务的正常运转,本公司会在用户的电脑或移动设备上存储名为Cookie的小数据文件。Cookie通常包含标识符、站点名称以及一些号码和字符。本公司不会将Cookie用于本政策所述目的之外的任何用途,用户可根据自己的偏好管理或删除Cookie,有关详情请参见AboutCookies.org。用户可以通过更改设置清除电脑或移动设备上保存的所有Cookie。<br />
+
+            <h2>六、第三方链接及服务</h2>
+            <strong class="line">本政策仅适用于本公司收集的儿童用户个人信息,本政策不适用于儿童用户通过本公司提供的软件或服务而接入到第三方链接或服务时,该第三方收集和使用儿童用户个人信息的行为及其结果,此时应适用该第三方链接或服务的隐私政策。</strong><br />
+
+            <h2>七、本政策的更新</h2>
+            本公司可能会根据软件及其服务或教学的需要或者根据法律法规的规定修改本政策的全部或部分。如该等更新造成监护人及儿童用户在本政策下权利的实质减少或重大变更的,本公司将在更新生效前通过网站公告、推送通知、弹窗提示或其他方式进行通知。监护人如果不同意该等更新或变更的,可以选择停止使用本公司的软件及相关服务;如果儿童用户或其监护人继续使用本公司的软件及相关服务的,即表示监护人已充分阅读、理解并同意受该等更新或变更后的本政策的约束。<br />
+
+            <h2>八、本公司的联系方式</h2>
+            儿童用户或其监护人如有任何问题、意见或者建议,除本政策页首所述的联系方式以外,还可以通过以下方式与本公司联系。<br />
+            电子邮箱:dyme2002@dayaedu.com<br />
+            邮寄地址:武汉市武昌区汉街总部国际B座33A03<br />
+            联系电话:027-87718176<br />
+        </div>
+    </div>
+</template>
+
+<script>
+import MHeader from '@/components/MHeader'
+export default {
+    name: 'smallProtocol',
+    components: { MHeader },
+    mounted() {
+        document.title = '用户隐私协议'
+    }
+}
+</script>
+
+<style lang="less" scoped>
+    .privacy {
+        background: #fff;
+    }
+    header {
+        height: .40rem;
+        line-height: .40rem;
+        color: #000;
+        font-size: .17rem;
+        background: #fff;
+        box-shadow: 0px 1px 8px 0px rgba(0,0,0,0.07);
+        text-align: center;
+
+        .back {
+            width: .2rem;
+            height: .2rem;
+            position: absolute;
+            left: .12rem;
+            top: .1rem;
+        }
+    }
+    .container {
+        padding: .22rem .2rem .3rem;
+        font-size: .14rem;
+        h1 {
+            font-size: .16rem;
+            text-align: center;
+        }
+
+        h2 {
+            font-size: .16rem;
+            font-weight: bold;
+            padding-top: .15rem;
+        }
+        h3 {
+            font-size: .14rem;
+            font-weight: bold;
+        }
+
+        .signature {
+            display: flex;
+            padding-top: .5rem;
+            .sign {
+                flex: 1;
+                position: relative;
+            }
+            span {
+                display: block;
+                padding-left: .2rem;
+            }
+
+            .cachet {
+                position: absolute;
+                top: -.6rem;
+                left: 0;
+                width: 1.5rem;
+                height: 1.5rem;
+            }
+        }
+    }
+
+    .iInfo {
+        display: flex;
+        span {
+            flex: 1;
+        }
+    }
+    .line {
+        border-bottom: 1px solid #000;
+    }
+</style>

+ 2 - 2
vue.config.js

@@ -1,8 +1,8 @@
 const path = require('path')
 
-let targetUrl = 'http://kjtest.dayaedu.com'
+// let targetUrl = 'http://kjtest.dayaedu.com'
 // let targetUrl = 'http://192.168.3.28:8000/'
-// let targetUrl = 'http://192.168.3.139:8000' // 箭河
+let targetUrl = 'http://192.168.3.139:8000' // 箭河
 // let targetUrl = 'http://192.168.3.48:8000'
 // let version = '1.0.0'
 // webpack.prod.conf.js