Commit b67c5310efbf868acfbe907ee10f2099341977a3
1 parent
2934fa95
Exists in
master
feat: 修改同步
Showing
18 changed files
with
1705 additions
and
1169 deletions
 
Show diff stats
1.37 KB
| ... | ... | @@ -0,0 +1,159 @@ | 
| 1 | +const validateIdent = { | |
| 2 | + aIdentityCode_City: { // 城市代码列表 | |
| 3 | + 11: "北京", | |
| 4 | + 12: "天津", | |
| 5 | + 13: "河北", | |
| 6 | + 14: "山西", | |
| 7 | + 15: "内蒙古", | |
| 8 | + 21: "辽宁", | |
| 9 | + 22: "吉林", | |
| 10 | + 23: "黑龙江 ", | |
| 11 | + 31: "上海", | |
| 12 | + 32: "江苏", | |
| 13 | + 33: "浙江", | |
| 14 | + 34: "安徽", | |
| 15 | + 35: "福建", | |
| 16 | + 36: "江西", | |
| 17 | + 37: "山东", | |
| 18 | + 41: "河南", | |
| 19 | + 42: "湖北 ", | |
| 20 | + 43: "湖南", | |
| 21 | + 44: "广东", | |
| 22 | + 45: "广西", | |
| 23 | + 46: "海南", | |
| 24 | + 50: "重庆", | |
| 25 | + 51: "四川", | |
| 26 | + 52: "贵州", | |
| 27 | + 53: "云南", | |
| 28 | + 54: "西藏 ", | |
| 29 | + 61: "陕西", | |
| 30 | + 62: "甘肃", | |
| 31 | + 63: "青海", | |
| 32 | + 64: "宁夏", | |
| 33 | + 65: "新疆", | |
| 34 | + 71: "台湾", | |
| 35 | + 81: "香港", | |
| 36 | + 82: "澳门", | |
| 37 | + 91: "国外 " | |
| 38 | + }, | |
| 39 | + IdentityCode_isCardNo(card) { //检查号码是否符合规范,包括长度,类型 | |
| 40 | + var reg = /(^\d{15}$)|(^\d{17}(\d|X)$)/; //身份证号码为15位或者18位,15位时全为数字,18位前17位为数字,最后一位是校验位,可能为数字或字符X | |
| 41 | + if (reg.test(card) === false) { | |
| 42 | + return false; | |
| 43 | + } | |
| 44 | + return true; | |
| 45 | + }, | |
| 46 | + IdentityCode_checkProvince(card) { //取身份证前两位,校验省份 | |
| 47 | + var province = card.substr(0, 2); | |
| 48 | + if (validateIdent.aIdentityCode_City[province] == undefined) { | |
| 49 | + return false; | |
| 50 | + } | |
| 51 | + return true; | |
| 52 | + }, | |
| 53 | + IdentityCode_checkBirthday(card) { //检查生日是否正确,15位以'19'年份来进行补齐。 | |
| 54 | + var len = card.length; | |
| 55 | + //身份证15位时,次序为省(3位)市(3位)年(2位)月(2位)日(2位)校验位(3位),皆为数字 | |
| 56 | + if (len == '15') { | |
| 57 | + var re_fifteen = /^(\d{6})(\d{2})(\d{2})(\d{2})(\d{3})$/; | |
| 58 | + var arr_data = card.match(re_fifteen); // 正则取号码内所含出年月日数据 | |
| 59 | + var year = arr_data[2]; | |
| 60 | + var month = arr_data[3]; | |
| 61 | + var day = arr_data[4]; | |
| 62 | + var birthday = new Date('19' + year + '/' + month + '/' + day); | |
| 63 | + return validateIdent.IdentityCode_verifyBirthday('19' + year, month, day, birthday); | |
| 64 | + } | |
| 65 | + //身份证18位时,次序为省(3位)市(3位)年(4位)月(2位)日(2位)校验位(4位),校验位末尾可能为X | |
| 66 | + if (len == '18') { | |
| 67 | + var re_eighteen = /^(\d{6})(\d{4})(\d{2})(\d{2})(\d{3})([0-9]|X)$/; | |
| 68 | + var arr_data = card.match(re_eighteen); // 正则取号码内所含出年月日数据 | |
| 69 | + var year = arr_data[2]; | |
| 70 | + var month = arr_data[3]; | |
| 71 | + var day = arr_data[4]; | |
| 72 | + var birthday = new Date(year + '/' + month + '/' + day); | |
| 73 | + return validateIdent.IdentityCode_verifyBirthday(year, month, day, birthday); | |
| 74 | + } | |
| 75 | + return false; | |
| 76 | + }, | |
| 77 | + IdentityCode_verifyBirthday(year, month, day, birthday) { //校验日期 ,15位以'19'年份来进行补齐。 | |
| 78 | + var now = new Date(); | |
| 79 | + var now_year = now.getFullYear(); | |
| 80 | + //年月日是否合理 | |
| 81 | + if (birthday.getFullYear() == year && | |
| 82 | + (birthday.getMonth() + 1) == month && | |
| 83 | + birthday.getDate() == day) { | |
| 84 | + //判断年份的范围(3岁到150岁之间) | |
| 85 | + var time = now_year - year; | |
| 86 | + if (time >= 3 && time <= 150) { | |
| 87 | + return true; | |
| 88 | + } | |
| 89 | + return false; | |
| 90 | + } | |
| 91 | + return false; | |
| 92 | + }, | |
| 93 | + IdentityCode_checkParity(card) { //校验位的检测 | |
| 94 | + card = validateIdent.IdentityCode_changeFivteenToEighteen(card); // 15位转18位 | |
| 95 | + var len = card.length; | |
| 96 | + if (len == '18') { | |
| 97 | + var arrInt = new Array(7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2); | |
| 98 | + var arrCh = new Array('1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2'); | |
| 99 | + var cardTemp = 0, | |
| 100 | + i, valnum; | |
| 101 | + for (i = 0; i < 17; i++) { | |
| 102 | + cardTemp += card.substr(i, 1) * arrInt[i]; | |
| 103 | + } | |
| 104 | + valnum = arrCh[cardTemp % 11]; | |
| 105 | + if (valnum == card.substr(17, 1)) { | |
| 106 | + return true; | |
| 107 | + } | |
| 108 | + return false; | |
| 109 | + } | |
| 110 | + return false; | |
| 111 | + }, | |
| 112 | + IdentityCode_changeFivteenToEighteen(card) { //15位转18位身份证号 | |
| 113 | + if (card.length == '15') { | |
| 114 | + var arrInt = new Array(7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2); | |
| 115 | + var arrCh = new Array('1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2'); | |
| 116 | + var cardTemp = 0, | |
| 117 | + i; | |
| 118 | + card = card.substr(0, 6) + '19' + card.substr(6, card.length - 6); | |
| 119 | + for (i = 0; i < 17; i++) { | |
| 120 | + cardTemp += card.substr(i, 1) * arrInt[i]; | |
| 121 | + } | |
| 122 | + card += arrCh[cardTemp % 11]; | |
| 123 | + return card; | |
| 124 | + } | |
| 125 | + return card; | |
| 126 | + }, | |
| 127 | + IdentityCodeValid(card) { // 身份证号码检验主入口 | |
| 128 | + let pass = true; | |
| 129 | + let sex = '' | |
| 130 | + //是否为空 | |
| 131 | + if (pass && card === '') | |
| 132 | + pass = false; | |
| 133 | + //校验长度,类型 | |
| 134 | + if (pass && validateIdent.IdentityCode_isCardNo(card) === false) | |
| 135 | + pass = false; | |
| 136 | + //检查省份 | |
| 137 | + if (pass && validateIdent.IdentityCode_checkProvince(card) === false) | |
| 138 | + pass = false; | |
| 139 | + //校验生日 | |
| 140 | + if (pass && validateIdent.IdentityCode_checkBirthday(card) === false) | |
| 141 | + pass = false; | |
| 142 | + //检验位的检测 | |
| 143 | + if (pass && validateIdent.IdentityCode_checkParity(card) === false) | |
| 144 | + pass = false; | |
| 145 | + if (pass) { | |
| 146 | + var iCard = validateIdent.IdentityCode_changeFivteenToEighteen(card); | |
| 147 | + if (parseInt(iCard.charAt(16)) % 2 == 0) { | |
| 148 | + sex = "0"; // 女生 | |
| 149 | + } else { | |
| 150 | + sex = "1"; // 男生 | |
| 151 | + } | |
| 152 | + return true | |
| 153 | + } else { | |
| 154 | + return false | |
| 155 | + } | |
| 156 | + } | |
| 157 | +} | |
| 158 | + | |
| 159 | +export default validateIdent.IdentityCodeValid //导出 | |
| 0 | 160 | \ No newline at end of file | ... | ... | 
src/router/index.js
| 1 | 1 | import Vue from 'vue' | 
| 2 | 2 | import VueRouter from 'vue-router' | 
| 3 | 3 | import Home from '@/views/Home/Home.vue' | 
| 4 | +import HomeUserInfo from '@/views/Home/HomeUserInfo.vue' | |
| 4 | 5 | |
| 5 | 6 | import ServiceAbroadDetail from '@/views/Service/AbroadDetail.vue' | 
| 6 | 7 | import ServiceAbroadEvaluate from '@/views/Service/AbroadEvaluate.vue' | 
| ... | ... | @@ -55,7 +56,14 @@ const routes = [{ | 
| 55 | 56 | title: '红色网上游' | 
| 56 | 57 | } | 
| 57 | 58 | }, | 
| 58 | - | |
| 59 | + { | |
| 60 | + path: '/home_user_info', | |
| 61 | + name: 'HomeUserInfo', | |
| 62 | + component: HomeUserInfo, | |
| 63 | + meta: { | |
| 64 | + title: '红色网上游' | |
| 65 | + } | |
| 66 | + }, | |
| 59 | 67 | { | 
| 60 | 68 | path: '/abroad_detail', | 
| 61 | 69 | name: 'ServiceAbroadDetail', | ... | ... | 
src/views/Home/Home.vue
| ... | ... | @@ -17,18 +17,6 @@ | 
| 17 | 17 | </div> | 
| 18 | 18 | <HomeOrder></HomeOrder> | 
| 19 | 19 | <div class="function"> | 
| 20 | - <!-- <div class="item" @click="handleGroup"> | |
| 21 | - <div class="left"> | |
| 22 | - <van-icon class="icon" name="orders-o" /> | |
| 23 | - <span>集团权限</span> | |
| 24 | - </div> | |
| 25 | - <div class="pic"> | |
| 26 | - <img src="@/assets/home/bg2.png"/> | |
| 27 | - <span>已认证</span> | |
| 28 | - <van-icon name="arrow" /> | |
| 29 | - </div> | |
| 30 | - <van-icon name="arrow" /> | |
| 31 | - </div> --> | |
| 32 | 20 | <div class="item" @click="handleMyCard"> | 
| 33 | 21 | <div class="left"> | 
| 34 | 22 | <van-icon class="icon" name="discount" /> | 
| ... | ... | @@ -36,6 +24,13 @@ | 
| 36 | 24 | </div> | 
| 37 | 25 | <van-icon name="arrow" /> | 
| 38 | 26 | </div> | 
| 27 | + <div class="item" @click="handleMyInfo"> | |
| 28 | + <div class="left"> | |
| 29 | + <van-icon class="icon" name="user-circle-o" /> | |
| 30 | + <span>个人信息</span> | |
| 31 | + </div> | |
| 32 | + <van-icon name="arrow" /> | |
| 33 | + </div> | |
| 39 | 34 | <div class="item" @click="handelElder"> | 
| 40 | 35 | <div class="left"> | 
| 41 | 36 | <van-icon class="icon" name="friends-o" /> | 
| ... | ... | @@ -122,6 +117,10 @@ export default { | 
| 122 | 117 | handleMyCard () { | 
| 123 | 118 | this.$router.push({ name: 'CardBoxXST' }) | 
| 124 | 119 | }, | 
| 120 | + // 个人信息 | |
| 121 | + handleMyInfo () { | |
| 122 | + this.$router.push({ name: 'HomeUserInfo' }) | |
| 123 | + }, | |
| 125 | 124 | // 合伙人中心 | 
| 126 | 125 | handlePartner () { | 
| 127 | 126 | this.$toast('暂未开放,敬请期待!'); | 
| ... | ... | @@ -164,7 +163,7 @@ export default { | 
| 164 | 163 | } | 
| 165 | 164 | }, | 
| 166 | 165 | // 获取用户信息 | 
| 167 | - getUserInfo: function () { | |
| 166 | + getUserInfo () { | |
| 168 | 167 | this.mgop({ | 
| 169 | 168 | api: 'mgop.sz.hswsy.getPortalUserByNum', // 必须 | 
| 170 | 169 | host: 'https://mapi.zjzwfw.gov.cn/', | 
| ... | ... | @@ -196,7 +195,6 @@ export default { | 
| 196 | 195 | } | 
| 197 | 196 | } | 
| 198 | 197 | this.showChildList = true | 
| 199 | - | |
| 200 | 198 | }, | 
| 201 | 199 | onFail: err => { | 
| 202 | 200 | console.log('err', err) | 
| ... | ... | @@ -220,6 +218,7 @@ export default { | 
| 220 | 218 | //集团回调关闭页面 | 
| 221 | 219 | closeJT () { | 
| 222 | 220 | this.showSchool = false | 
| 221 | + this.getUserInfo() | |
| 223 | 222 | }, | 
| 224 | 223 | //查看是否有集团认证 | 
| 225 | 224 | getRZ () { | ... | ... | 
| ... | ... | @@ -0,0 +1,90 @@ | 
| 1 | +<template> | |
| 2 | + <div class="home_user_info"> | |
| 3 | + <van-cell-group> | |
| 4 | + <van-cell title="姓名" :value="nickName" /> | |
| 5 | + <!-- <van-popover v-model="showGenderPopover" trigger="click" :actions="actions" @select="onSelect"> | |
| 6 | + <template #reference> | |
| 7 | + <van-cell title="性别"> | |
| 8 | + {{gender==1?'男':gender==2?'女':'-'}} | |
| 9 | + </van-cell> | |
| 10 | + </template> | |
| 11 | + </van-popover> --> | |
| 12 | + | |
| 13 | + <van-cell title="身份证" :value="idCard" /> | |
| 14 | + <van-cell title="手机号" :value="phone" /> | |
| 15 | + <van-cell title="关注主学校" :value="schoolNamesChoose" /> | |
| 16 | + </van-cell-group> | |
| 17 | + | |
| 18 | + </div> | |
| 19 | +</template> | |
| 20 | +<script> | |
| 21 | +export default { | |
| 22 | + data () { | |
| 23 | + return { | |
| 24 | + nickName: '',//姓名 | |
| 25 | + gender: '',//性别 | |
| 26 | + idCard: '',//身份证 | |
| 27 | + phone: '',//手机号 | |
| 28 | + schoolNamesChoose: '',//学校 | |
| 29 | + showGenderPopover:false, | |
| 30 | + actions: [{ text: '选项一' }, { text: '选项二' }, { text: '选项三' }], | |
| 31 | + } | |
| 32 | + }, | |
| 33 | + mounted () { | |
| 34 | + this.centerNo = localStorage.getItem('centerNo'); | |
| 35 | + const userInfo = JSON.parse(sessionStorage.getItem('userInfo')) | |
| 36 | + this.nickName = userInfo.nickName | |
| 37 | + this.gender = userInfo.gender | |
| 38 | + this.idCard = userInfo.idCard || '-' | |
| 39 | + this.phone = userInfo.phone | |
| 40 | + this.schoolNamesChoose = sessionStorage.getItem('schoolNamesChoose') | |
| 41 | + }, | |
| 42 | + methods: { | |
| 43 | + onSelect(action) { | |
| 44 | + Toast(action.text); | |
| 45 | + }, | |
| 46 | + // 获取用户信息 | |
| 47 | + getUserInfo: function () { | |
| 48 | + this.$toast.loading({ | |
| 49 | + message: '加载中...', | |
| 50 | + duration: 0, | |
| 51 | + forbidClick: true | |
| 52 | + }) | |
| 53 | + this.mgop({ | |
| 54 | + api: 'mgop.sz.hswsy.getPortalUserByNum', // 必须 | |
| 55 | + host: 'https://mapi.zjzwfw.gov.cn/', | |
| 56 | + dataType: 'JSON', | |
| 57 | + type: 'GET', | |
| 58 | + appKey: 'fuxgnukl+2001895516+edccpx', // 必须 | |
| 59 | + headers: { | |
| 60 | + // 'isTestUrl': '1' | |
| 61 | + }, | |
| 62 | + data: { | |
| 63 | + "userNum": this.centerNo | |
| 64 | + }, | |
| 65 | + onSuccess: res => { | |
| 66 | + this.$toast.clear() | |
| 67 | + if (res.data.code == 200) { | |
| 68 | + const userInfo = res.data.data.userInfo | |
| 69 | + sessionStorage.setItem('userInfo', JSON.stringify(userInfo)) | |
| 70 | + } | |
| 71 | + }, | |
| 72 | + onFail: err => { | |
| 73 | + console.log('err', err) | |
| 74 | + } | |
| 75 | + }); | |
| 76 | + }, | |
| 77 | + } | |
| 78 | +} | |
| 79 | +</script> | |
| 80 | +<style lang="scss"> | |
| 81 | +.home_user_info { | |
| 82 | + height: 100%; | |
| 83 | + padding-top: 10px; | |
| 84 | + box-sizing: border-box; | |
| 85 | + background: rgb(247, 245, 251); | |
| 86 | + .van-cell { | |
| 87 | + padding: 30px 32px; | |
| 88 | + } | |
| 89 | +} | |
| 90 | +</style> | |
| 0 | 91 | \ No newline at end of file | ... | ... | 
| ... | ... | @@ -0,0 +1,731 @@ | 
| 1 | +.abroad_detail { | |
| 2 | + padding-bottom: 200px; | |
| 3 | + .header { | |
| 4 | + img { | |
| 5 | + width: 100%; | |
| 6 | + } | |
| 7 | + } | |
| 8 | + .countDown { | |
| 9 | + height: 130px; | |
| 10 | + width: 100%; | |
| 11 | + background-color: #201e2b; | |
| 12 | + .countDownTop { | |
| 13 | + height: 50%; | |
| 14 | + padding: 0 3vw; | |
| 15 | + box-sizing: border-box; | |
| 16 | + display: flex; | |
| 17 | + justify-content: space-between; | |
| 18 | + align-items: center; | |
| 19 | + color: #ffffff; | |
| 20 | + font-size: 32px; | |
| 21 | + .countDownTime { | |
| 22 | + font-size: 24px; | |
| 23 | + .countDownFont { | |
| 24 | + line-height: 34px; | |
| 25 | + color: #333333; | |
| 26 | + border-radius: 5px; | |
| 27 | + margin: 0 8px; | |
| 28 | + } | |
| 29 | + div { | |
| 30 | + width: 34px; | |
| 31 | + text-align: center; | |
| 32 | + display: inline-block; | |
| 33 | + background-color: #ffe9b1; | |
| 34 | + } | |
| 35 | + } | |
| 36 | + } | |
| 37 | + .countDownBottom { | |
| 38 | + height: 50%; | |
| 39 | + padding: 0 3vw; | |
| 40 | + box-sizing: border-box; | |
| 41 | + display: flex; | |
| 42 | + justify-content: space-between; | |
| 43 | + align-items: center; | |
| 44 | + color: #ffffff; | |
| 45 | + font-size: 24px; | |
| 46 | + .countDownBottomyellow { | |
| 47 | + display: inline-block; | |
| 48 | + height: 33px; | |
| 49 | + margin-right: 12px; | |
| 50 | + padding: 0 8px; | |
| 51 | + color: #333333; | |
| 52 | + font-size: 24px; | |
| 53 | + background-color: #ffe9b1; | |
| 54 | + border-radius: 4px; | |
| 55 | + } | |
| 56 | + .countDownBottomTime { | |
| 57 | + font-size: 2.8vw; | |
| 58 | + color: #ffffff; | |
| 59 | + opacity: 0.85; | |
| 60 | + } | |
| 61 | + .countDownAbout { | |
| 62 | + text-decoration: underline; | |
| 63 | + } | |
| 64 | + } | |
| 65 | + } | |
| 66 | + .uni_text { | |
| 67 | + width: 100%; | |
| 68 | + background: #fff; | |
| 69 | + padding: 24px 34px; | |
| 70 | + box-sizing: border-box; | |
| 71 | + .course_price { | |
| 72 | + font-size: 38px; | |
| 73 | + font-weight: bold; | |
| 74 | + color: red; | |
| 75 | + .redmini { | |
| 76 | + font-size: 25px; | |
| 77 | + } | |
| 78 | + .tint { | |
| 79 | + font-size: 25px; | |
| 80 | + font-weight: normal; | |
| 81 | + color: #909399; | |
| 82 | + margin-left: 2vw; | |
| 83 | + text-decoration: line-through; | |
| 84 | + } | |
| 85 | + } | |
| 86 | + .course_price_free { | |
| 87 | + font-size: 34px; | |
| 88 | + font-weight: bold; | |
| 89 | + color: red; | |
| 90 | + display: flex; | |
| 91 | + justify-content: space-between; | |
| 92 | + .des { | |
| 93 | + color: #333; | |
| 94 | + } | |
| 95 | + } | |
| 96 | + .course_coupons { | |
| 97 | + height: 70px; | |
| 98 | + font-size: 27px; | |
| 99 | + // color: #4092FF; | |
| 100 | + display: flex; | |
| 101 | + justify-content: space-between; | |
| 102 | + align-items: center; | |
| 103 | + .fontBlue { | |
| 104 | + color: #4092ff; | |
| 105 | + } | |
| 106 | + } | |
| 107 | + .course_name { | |
| 108 | + font-size: 34px; | |
| 109 | + font-weight: bold; | |
| 110 | + } | |
| 111 | + .course_info { | |
| 112 | + font-size: 24px; | |
| 113 | + color: #999; | |
| 114 | + margin-top: 16px; | |
| 115 | + } | |
| 116 | + .address { | |
| 117 | + font-size: 24px; | |
| 118 | + color: #999; | |
| 119 | + margin-top: 16px; | |
| 120 | + .icon { | |
| 121 | + color: #000; | |
| 122 | + } | |
| 123 | + } | |
| 124 | + .rate { | |
| 125 | + margin-top: 20px; | |
| 126 | + display: flex; | |
| 127 | + justify-content: space-between; | |
| 128 | + div>span { | |
| 129 | + font-size: 30px; | |
| 130 | + color: #ffcc00; | |
| 131 | + margin-left: 30px; | |
| 132 | + } | |
| 133 | + >span { | |
| 134 | + font-size: 26px; | |
| 135 | + } | |
| 136 | + } | |
| 137 | + .tag_box { | |
| 138 | + padding-top: 10px; | |
| 139 | + .tag { | |
| 140 | + display: inline-block; | |
| 141 | + margin-top: 10px; | |
| 142 | + margin-right: 12px; | |
| 143 | + color: #4092ff; | |
| 144 | + font-size: 24px; | |
| 145 | + border-radius: 8px; | |
| 146 | + border: 2px solid #4092ff; | |
| 147 | + padding: 2px 10px; | |
| 148 | + } | |
| 149 | + } | |
| 150 | + } | |
| 151 | + .custom_made { | |
| 152 | + height: 56px; | |
| 153 | + display: flex; | |
| 154 | + align-items: center; | |
| 155 | + justify-content: space-between; | |
| 156 | + padding: 0 24px; | |
| 157 | + box-sizing: border-box; | |
| 158 | + background: #4D9EFF; | |
| 159 | + font-size: 28px; | |
| 160 | + color: #fff; | |
| 161 | + p { | |
| 162 | + width: 610px; | |
| 163 | + } | |
| 164 | + } | |
| 165 | + .package { | |
| 166 | + padding: 18px 22px; | |
| 167 | + .package_title { | |
| 168 | + font-size: 28px; | |
| 169 | + color: #999; | |
| 170 | + } | |
| 171 | + .package_box { | |
| 172 | + display: flex; | |
| 173 | + white-space: nowrap; | |
| 174 | + margin-top: 22px; | |
| 175 | + .package_item { | |
| 176 | + position: relative; | |
| 177 | + width: 128px; | |
| 178 | + height: 152px; | |
| 179 | + border-radius: 12px; | |
| 180 | + border: 2px solid #dde3ef; | |
| 181 | + box-sizing: border-box; | |
| 182 | + display: inline-flex; | |
| 183 | + align-content: center; | |
| 184 | + justify-content: center; | |
| 185 | + flex-wrap: wrap; | |
| 186 | + vertical-align: top; | |
| 187 | + margin-right: 16px; | |
| 188 | + flex-shrink: 0; | |
| 189 | + &.active { | |
| 190 | + border-color: #3F92FF; | |
| 191 | + .select { | |
| 192 | + display: block; | |
| 193 | + } | |
| 194 | + } | |
| 195 | + p { | |
| 196 | + width: 100%; | |
| 197 | + margin: 0; | |
| 198 | + text-align: center; | |
| 199 | + } | |
| 200 | + .more_icon { | |
| 201 | + width: 36px; | |
| 202 | + margin-top: 10px; | |
| 203 | + } | |
| 204 | + .more_text { | |
| 205 | + font-size: 22px; | |
| 206 | + color: #fff; | |
| 207 | + margin-top: 22px; | |
| 208 | + } | |
| 209 | + .date { | |
| 210 | + font-size: 32px; | |
| 211 | + font-weight: bold; | |
| 212 | + } | |
| 213 | + .week { | |
| 214 | + font-size: 22px; | |
| 215 | + color: #999; | |
| 216 | + } | |
| 217 | + .price { | |
| 218 | + font-size: 28px; | |
| 219 | + color: #ff2b2b; | |
| 220 | + margin-top: 14px; | |
| 221 | + span { | |
| 222 | + font-size: 20px; | |
| 223 | + } | |
| 224 | + } | |
| 225 | + .index { | |
| 226 | + margin-right: 10px; | |
| 227 | + font-size: 26px; | |
| 228 | + font-weight: bold; | |
| 229 | + color: #333; | |
| 230 | + } | |
| 231 | + .name { | |
| 232 | + margin-top: 8px; | |
| 233 | + font-size: 26px; | |
| 234 | + white-space: nowrap; | |
| 235 | + } | |
| 236 | + .select { | |
| 237 | + display: none; | |
| 238 | + position: absolute; | |
| 239 | + bottom: 0; | |
| 240 | + right: 0; | |
| 241 | + width: 46px; | |
| 242 | + height: 48px; | |
| 243 | + } | |
| 244 | + } | |
| 245 | + .package_item_more { | |
| 246 | + background: #3f92ff; | |
| 247 | + border: 2px solid #3f92ff; | |
| 248 | + box-shadow: 6px 12px 16px 0px rgba(63, 146, 255, 0.29); | |
| 249 | + margin-right: 0; | |
| 250 | + } | |
| 251 | + .package_item_type { | |
| 252 | + width: auto; | |
| 253 | + height: 118px; | |
| 254 | + padding: 0 34px; | |
| 255 | + .price { | |
| 256 | + margin-top: 0; | |
| 257 | + } | |
| 258 | + } | |
| 259 | + } | |
| 260 | + .package_des { | |
| 261 | + margin-top: 28px; | |
| 262 | + font-size: 26px; | |
| 263 | + line-height: 40px; | |
| 264 | + color: #A9A9AA; | |
| 265 | + } | |
| 266 | + } | |
| 267 | + .notime { | |
| 268 | + width: 100%; | |
| 269 | + } | |
| 270 | + .content_box { | |
| 271 | + position: relative; | |
| 272 | + .content_all { | |
| 273 | + overflow: hidden; | |
| 274 | + height: 580px; | |
| 275 | + // font-size: 26px; | |
| 276 | + // line-height: 36px; | |
| 277 | + font-size: 31px !important; | |
| 278 | + line-height: 40px !important; | |
| 279 | + letter-spacing: 1.6px; | |
| 280 | + color: #666; | |
| 281 | + // padding-bottom: 130px; | |
| 282 | + img { | |
| 283 | + width: 100%; | |
| 284 | + } | |
| 285 | + } | |
| 286 | + /* 展开 */ | |
| 287 | + .open { | |
| 288 | + height: auto; | |
| 289 | + } | |
| 290 | + .extend_wrap { | |
| 291 | + display: flex; | |
| 292 | + align-items: center; | |
| 293 | + justify-content: center; | |
| 294 | + font-size: 26px; | |
| 295 | + padding: 40px 0; | |
| 296 | + color: #4092ff; | |
| 297 | + margin-top: -40px; | |
| 298 | + background: linear-gradient(180deg, rgba(255, 255, 255, 0.3) 0%, rgba(255, 255, 255, 0.8) 30%, rgba(255, 255, 255, 1) 100%); | |
| 299 | + width: 100%; | |
| 300 | + position: absolute; | |
| 301 | + bottom: 0; | |
| 302 | + left: 0; | |
| 303 | + } | |
| 304 | + } | |
| 305 | + .tag_item { | |
| 306 | + padding: 22px; | |
| 307 | + .tag_title { | |
| 308 | + font-size: 34px; | |
| 309 | + font-weight: bold; | |
| 310 | + margin-bottom: 32px; | |
| 311 | + } | |
| 312 | + .tag_text { | |
| 313 | + // font-size: 24px; | |
| 314 | + // line-height: 40px; | |
| 315 | + font-size: 28px !important; | |
| 316 | + line-height: 44px !important; | |
| 317 | + padding: 16px 0; | |
| 318 | + } | |
| 319 | + } | |
| 320 | + .cardCont { | |
| 321 | + // font-size: 24px; | |
| 322 | + font-size: 28px !important; | |
| 323 | + table { | |
| 324 | + border-radius: 5px; | |
| 325 | + width: 100%; | |
| 326 | + border: 1px solid #dde3ef; | |
| 327 | + td { | |
| 328 | + border: 1px solid #dde3ef; | |
| 329 | + text-align: center; | |
| 330 | + background: rgb(245, 246, 250); | |
| 331 | + } | |
| 332 | + .td_left { | |
| 333 | + width: 132px; | |
| 334 | + background: #fff; | |
| 335 | + box-sizing: border-box; | |
| 336 | + } | |
| 337 | + } | |
| 338 | + } | |
| 339 | + .courseContent { | |
| 340 | + li:not(:last-child) { | |
| 341 | + border-bottom: 1px solid #eee; | |
| 342 | + } | |
| 343 | + li:first-child { | |
| 344 | + .left { | |
| 345 | + color: #fa9b00; | |
| 346 | + border: 1px solid #fa9b00; | |
| 347 | + background-color: #fef4d9; | |
| 348 | + } | |
| 349 | + } | |
| 350 | + li:nth-child(3n + 1) { | |
| 351 | + .left { | |
| 352 | + color: #fa9b00; | |
| 353 | + border: 1px solid #fa9b00; | |
| 354 | + background-color: #fef4d9; | |
| 355 | + } | |
| 356 | + } | |
| 357 | + li:nth-child(3n-1) { | |
| 358 | + .left { | |
| 359 | + color: #fa008c; | |
| 360 | + border: 1px solid #fa008c; | |
| 361 | + background-color: #ffeffc; | |
| 362 | + } | |
| 363 | + } | |
| 364 | + li:nth-child(3n) { | |
| 365 | + .left { | |
| 366 | + color: #0076fa; | |
| 367 | + border: 1px solid #0076fa; | |
| 368 | + background-color: #efffff; | |
| 369 | + } | |
| 370 | + } | |
| 371 | + li { | |
| 372 | + position: relative; | |
| 373 | + margin-top: 20px; | |
| 374 | + padding-bottom: 10px; | |
| 375 | + .left { | |
| 376 | + position: absolute; | |
| 377 | + top: 0; | |
| 378 | + left: 0; | |
| 379 | + width: 120px; | |
| 380 | + font-size: 26px; | |
| 381 | + text-align: center; | |
| 382 | + border-radius: 3px; | |
| 383 | + padding: 3px; | |
| 384 | + box-sizing: border-box; | |
| 385 | + font-weight: 600; | |
| 386 | + } | |
| 387 | + h3 { | |
| 388 | + color: #202228; | |
| 389 | + // font-size: 32px; | |
| 390 | + font-size: 30px !important; | |
| 391 | + font-weight: 400; | |
| 392 | + margin: 0; | |
| 393 | + padding-left: 160px; | |
| 394 | + word-break: break-all; | |
| 395 | + } | |
| 396 | + .item { | |
| 397 | + margin-top: 10px; | |
| 398 | + img { | |
| 399 | + width: 100%; | |
| 400 | + } | |
| 401 | + p { | |
| 402 | + margin: 0; | |
| 403 | + margin-top: 10px; | |
| 404 | + color: #a7a7aa; | |
| 405 | + // font-size: 28px; | |
| 406 | + font-size: 31px !important; | |
| 407 | + b { | |
| 408 | + // font-size: 32px; | |
| 409 | + font-size: 35px !important; | |
| 410 | + font-weight: 400; | |
| 411 | + color: #000000; | |
| 412 | + margin-right: 10px; | |
| 413 | + } | |
| 414 | + span { | |
| 415 | + // font-size: 24px; | |
| 416 | + font-size: 27px !important; | |
| 417 | + } | |
| 418 | + } | |
| 419 | + } | |
| 420 | + } | |
| 421 | + } | |
| 422 | + .base { | |
| 423 | + padding: 28px 24px; | |
| 424 | + img { | |
| 425 | + width: 98px; | |
| 426 | + height: 98px; | |
| 427 | + display: inline-block; | |
| 428 | + vertical-align: top; | |
| 429 | + border-radius: 12px; | |
| 430 | + } | |
| 431 | + .center { | |
| 432 | + width: 550px; | |
| 433 | + display: inline-block; | |
| 434 | + margin-left: 20px; | |
| 435 | + .basename { | |
| 436 | + // font-size: 32px; | |
| 437 | + font-size: 35px !important; | |
| 438 | + font-weight: bold; | |
| 439 | + } | |
| 440 | + .address { | |
| 441 | + // font-size: 24px; | |
| 442 | + font-size: 27px !important; | |
| 443 | + margin-top: 12px; | |
| 444 | + } | |
| 445 | + .tag { | |
| 446 | + display: inline-block; | |
| 447 | + // font-size: 24px; | |
| 448 | + font-size: 26px !important; | |
| 449 | + margin-top: 14px; | |
| 450 | + background: #f5f6fa; | |
| 451 | + border-radius: 6px; | |
| 452 | + padding: 6px 20px; | |
| 453 | + } | |
| 454 | + } | |
| 455 | + } | |
| 456 | + .top_border { | |
| 457 | + border-top: 16px solid #f6f7fa; | |
| 458 | + ::v-deep.van-tab { | |
| 459 | + .van-tab__text { | |
| 460 | + font-size: 34px !important; | |
| 461 | + } | |
| 462 | + } | |
| 463 | + } | |
| 464 | + .popup_content { | |
| 465 | + width: 408px; | |
| 466 | + height: 346px; | |
| 467 | + overflow: hidden; | |
| 468 | + img { | |
| 469 | + display: block; | |
| 470 | + width: 86px; | |
| 471 | + height: 86px; | |
| 472 | + margin: 0 auto; | |
| 473 | + margin-top: 64px; | |
| 474 | + } | |
| 475 | + p:first-of-type { | |
| 476 | + text-align: center; | |
| 477 | + margin-top: 46px; | |
| 478 | + // font-size: 36px; | |
| 479 | + font-size: 39px !important; | |
| 480 | + } | |
| 481 | + p:last-of-type { | |
| 482 | + text-align: center; | |
| 483 | + margin-top: 16px; | |
| 484 | + // font-size: 26px; | |
| 485 | + font-size: 29px !important; | |
| 486 | + color: #999; | |
| 487 | + } | |
| 488 | + } | |
| 489 | + .Collection { | |
| 490 | + background-color: white; | |
| 491 | + position: fixed; | |
| 492 | + bottom: 0; | |
| 493 | + left: 0; | |
| 494 | + width: 100%; | |
| 495 | + padding: 28px 22px; | |
| 496 | + box-sizing: border-box; | |
| 497 | + padding-bottom: 50px; | |
| 498 | + z-index: 500; | |
| 499 | + box-shadow: 0px 4px 8px 0px rgba(0, 0, 0, 0.34); | |
| 500 | + .box1 { | |
| 501 | + width: 40%; | |
| 502 | + } | |
| 503 | + .box2 { | |
| 504 | + width: 60%; | |
| 505 | + } | |
| 506 | + .box { | |
| 507 | + display: inline-block; | |
| 508 | + vertical-align: middle; | |
| 509 | + color: #666666; | |
| 510 | + .icon { | |
| 511 | + display: inline-block; | |
| 512 | + width: 45%; | |
| 513 | + text-align: center; | |
| 514 | + // font-size: 24px; | |
| 515 | + font-size: 26px !important; | |
| 516 | + p { | |
| 517 | + // margin: 0; | |
| 518 | + color: #999999; | |
| 519 | + margin-top: 8px; | |
| 520 | + } | |
| 521 | + i { | |
| 522 | + font-size: 48px; | |
| 523 | + color: rgb(45, 45, 45); | |
| 524 | + font-weight: bold; | |
| 525 | + } | |
| 526 | + } | |
| 527 | + .icon.active { | |
| 528 | + color: 0ce39d; | |
| 529 | + i { | |
| 530 | + color: #0ce39d; | |
| 531 | + } | |
| 532 | + } | |
| 533 | + span { | |
| 534 | + display: inline-block; | |
| 535 | + width: 100%; | |
| 536 | + line-height: 92px; | |
| 537 | + box-sizing: border-box; | |
| 538 | + border-radius: 100px; | |
| 539 | + color: white; | |
| 540 | + // font-size: 32px; | |
| 541 | + font-size: 35px !important; | |
| 542 | + background: #4092ff; | |
| 543 | + text-align: center; | |
| 544 | + box-shadow: 0px 10px 40px 0px #a0c9ff; | |
| 545 | + b { | |
| 546 | + display: inline-block; | |
| 547 | + vertical-align: middle; | |
| 548 | + margin-left: 20px; | |
| 549 | + color: white; | |
| 550 | + } | |
| 551 | + i { | |
| 552 | + vertical-align: middle; | |
| 553 | + font-size: 44px; | |
| 554 | + font-weight: bold; | |
| 555 | + } | |
| 556 | + } | |
| 557 | + .disabled { | |
| 558 | + color: #999; | |
| 559 | + background: #edeced; | |
| 560 | + box-shadow: none; | |
| 561 | + } | |
| 562 | + } | |
| 563 | + } | |
| 564 | + .pintuan_about { | |
| 565 | + width: 592px; | |
| 566 | + box-sizing: border-box; | |
| 567 | + padding: 0 50px; | |
| 568 | + .about_img { | |
| 569 | + width: 112px; | |
| 570 | + margin: 0 auto; | |
| 571 | + margin-top: 30px; | |
| 572 | + display: block; | |
| 573 | + } | |
| 574 | + .about_title { | |
| 575 | + font-size: 34px; | |
| 576 | + font-weight: bold; | |
| 577 | + text-align: center; | |
| 578 | + } | |
| 579 | + .about_content { | |
| 580 | + font-size: 30px; | |
| 581 | + margin-top: 20px; | |
| 582 | + } | |
| 583 | + .about_know { | |
| 584 | + font-size: 32px; | |
| 585 | + text-align: center; | |
| 586 | + color: #3385ff; | |
| 587 | + margin-top: 60px; | |
| 588 | + margin-bottom: 44px; | |
| 589 | + } | |
| 590 | + } | |
| 591 | + .show_tip_title { | |
| 592 | + img { | |
| 593 | + width: 112px; | |
| 594 | + } | |
| 595 | + p { | |
| 596 | + margin-top: -20px; | |
| 597 | + margin-bottom: 20px; | |
| 598 | + } | |
| 599 | + } | |
| 600 | + .show_tip { | |
| 601 | + padding: 0 20px; | |
| 602 | + font-size: 28px; | |
| 603 | + letter-spacing: 1px; | |
| 604 | + text-align: left; | |
| 605 | + line-height: 64px; | |
| 606 | + color: rgb(153, 153, 153); | |
| 607 | + b { | |
| 608 | + color: #000; | |
| 609 | + } | |
| 610 | + } | |
| 611 | + .tip_checkbox { | |
| 612 | + font-size: 26px; | |
| 613 | + margin-top: 24px; | |
| 614 | + margin-bottom: 60px; | |
| 615 | + margin-left: 50px; | |
| 616 | + } | |
| 617 | +} | |
| 618 | + | |
| 619 | +.elder { | |
| 620 | + .abroad_detail { | |
| 621 | + .countDown { | |
| 622 | + height: auto; | |
| 623 | + .countDownTop { | |
| 624 | + display: block; | |
| 625 | + font-size: 40px; | |
| 626 | + .countDownTime { | |
| 627 | + font-size: 40px; | |
| 628 | + padding: 10px 0; | |
| 629 | + div { | |
| 630 | + width: 60px; | |
| 631 | + } | |
| 632 | + .countDownFont { | |
| 633 | + line-height: 60px; | |
| 634 | + } | |
| 635 | + } | |
| 636 | + } | |
| 637 | + .countDownBottom { | |
| 638 | + display: block; | |
| 639 | + font-size: 40px; | |
| 640 | + .countDownBottomyellow { | |
| 641 | + height: 60px; | |
| 642 | + font-size: 40px; | |
| 643 | + } | |
| 644 | + } | |
| 645 | + } | |
| 646 | + .uni_text { | |
| 647 | + .course_price { | |
| 648 | + font-size: 48px; | |
| 649 | + .redmini, | |
| 650 | + .tint { | |
| 651 | + font-size: 36px; | |
| 652 | + } | |
| 653 | + } | |
| 654 | + .course_name { | |
| 655 | + font-size: 44px; | |
| 656 | + } | |
| 657 | + .course_info { | |
| 658 | + font-size: 40px; | |
| 659 | + } | |
| 660 | + .address { | |
| 661 | + font-size: 40px; | |
| 662 | + } | |
| 663 | + .rate>span { | |
| 664 | + font-size: 36px; | |
| 665 | + } | |
| 666 | + .tag_box .tag { | |
| 667 | + font-size: 40px; | |
| 668 | + } | |
| 669 | + } | |
| 670 | + .package { | |
| 671 | + .package_title { | |
| 672 | + font-size: 44px; | |
| 673 | + } | |
| 674 | + .package_item { | |
| 675 | + .date { | |
| 676 | + font-size: 40px; | |
| 677 | + } | |
| 678 | + .week { | |
| 679 | + font-size: 34px; | |
| 680 | + } | |
| 681 | + .price { | |
| 682 | + font-size: 34px; | |
| 683 | + } | |
| 684 | + } | |
| 685 | + } | |
| 686 | + .content_box .content_all { | |
| 687 | + font-size: 40px !important; | |
| 688 | + line-height: 60px !important; | |
| 689 | + } | |
| 690 | + .tag_item { | |
| 691 | + .tag_title { | |
| 692 | + font-size: 44px; | |
| 693 | + } | |
| 694 | + .tag_text { | |
| 695 | + font-size: 40px !important; | |
| 696 | + line-height: 60px !important; | |
| 697 | + } | |
| 698 | + } | |
| 699 | + .base .center { | |
| 700 | + .basename { | |
| 701 | + font-size: 44px !important; | |
| 702 | + } | |
| 703 | + .address { | |
| 704 | + font-size: 40px !important; | |
| 705 | + } | |
| 706 | + } | |
| 707 | + .Collection .box { | |
| 708 | + span { | |
| 709 | + font-size: 44px !important; | |
| 710 | + } | |
| 711 | + .icon { | |
| 712 | + font-size: 40px !important; | |
| 713 | + } | |
| 714 | + } | |
| 715 | + .pintuan_about { | |
| 716 | + .about_title { | |
| 717 | + font-size: 44px; | |
| 718 | + } | |
| 719 | + .about_box { | |
| 720 | + height: 600px; | |
| 721 | + overflow: auto; | |
| 722 | + } | |
| 723 | + .about_content { | |
| 724 | + font-size: 36px; | |
| 725 | + } | |
| 726 | + .about_know { | |
| 727 | + font-size: 40px; | |
| 728 | + } | |
| 729 | + } | |
| 730 | + } | |
| 731 | +} | |
| 0 | 732 | \ No newline at end of file | ... | ... | 
src/views/Service/AbroadDetail.vue
| ... | ... | @@ -10,47 +10,19 @@ | 
| 10 | 10 | <img v-else src="@/assets/service/defCoure.jpg" alt="" /> | 
| 11 | 11 | </div> | 
| 12 | 12 | <!--倒计时--> | 
| 13 | - <div class="countDown" v-show="detailData.clusterTime && timeTamp * 1 > 0"> | |
| 14 | - <div class="countDownTop"> | |
| 15 | - <div>{{packageArr[0]?packageArr[0].day:''}} {{detailData.applyCount>=detailData.minPeopleCount?'报名截止时间:':'团期截止倒计时'}}</div> | |
| 16 | - <div v-if="detailData.applyCount>=detailData.minPeopleCount">{{detailData.periodOfValidity}}</div> | |
| 17 | - <div class="countDownTime" v-else> | |
| 18 | - <div class="countDownFont">{{ showTime.day }}</div> | |
| 19 | - 天 | |
| 20 | - <div class="countDownFont">{{ showTime.hour }}</div> | |
| 21 | - 时 | |
| 22 | - <div class="countDownFont">{{ showTime.minute }}</div> | |
| 23 | - 分 | |
| 24 | - <div class="countDownFont">{{ showTime.second }}</div> | |
| 25 | - 秒 | |
| 26 | - </div> | |
| 27 | - </div> | |
| 28 | - <div class="countDownBottom"> | |
| 29 | - <div> | |
| 30 | - <div class="countDownBottomyellow" v-show="detailData.minPeopleCount"> | |
| 31 | - {{ detailData.clusterName }} | |
| 32 | - </div> | |
| 33 | - <span v-if="detailData.applyCount>=detailData.minPeopleCount">已报名 {{detailData.applyCount}}/{{detailData.stockCount}}人</span> | |
| 34 | - <span v-else>最低成团数{{detailData.minPeopleCount}}人/已报名{{detailData.applyCount}}人</span> | |
| 35 | - <!-- 已报名:<span>{{ detailData.applyCount }}</span><span>/{{ detailData.stockCount }}</span> --> | |
| 36 | - </div> | |
| 37 | - <div class="countDownAbout" @click="showPintuanAbout=true">关于拼团?</div> | |
| 38 | - </div> | |
| 39 | - </div> | |
| 40 | - <div class="uni_text"> | |
| 41 | - <!-- <div class="course_price" v-if="detailData.showPrice!=0"> | |
| 42 | - <span>¥ {{ detailData.showPrice }}</span><span class="redmini">起</span><span class="tint">{{ detailData.productPrice }}</span> | |
| 13 | + <count-down v-if="detailData&&packageArr[packageActive]" :productId="detailData.id" :packageArr="packageArr" :day="packageArr[packageActive].day" :bindId="packageArr[packageActive].comboInfoList[packageTypeActive].bindId" :comboId="packageArr[packageActive].comboInfoList[packageTypeActive].id"></count-down> | |
| 14 | + | |
| 15 | + <div class="uni_text" v-if="initPackageArr"> | |
| 16 | + <!-- <div class="course_price" v-if="packageArr.length>0"> | |
| 17 | + <span>¥ {{ detailData.showPrice }}</span><span class="redmini">起/{{detailData.unitName}}</span><span class="tint">{{ detailData.productPrice }}</span> | |
| 43 | 18 | </div> | 
| 44 | 19 | <div class="course_price_free" v-else> | 
| 45 | 20 | <span>¥ {{ detailData.price }}</span> | 
| 46 | 21 | <span class="des">正在排期</span> | 
| 47 | 22 | </div> --> | 
| 48 | - <div class="course_coupons" v-if="proCoupon.length>0"> | |
| 49 | - <div> | |
| 50 | - <van-tag v-for="(item,index) in proCoupon" :key="index" color="#ffffff" text-color="#FF2B2B">{{proCouponHas?'已领取:':''}}{{item.title}}</van-tag> | |
| 51 | - </div> | |
| 52 | - <div @click="toCoupons" class="fontBlue">领取 ></div> | |
| 53 | - </div> | |
| 23 | + <!-- 优惠券 --> | |
| 24 | + <abroad-coupon v-if="detailData&¢erNo" :detailDataId="detailData.id" :centerNo="centerNo"></abroad-coupon> | |
| 25 | + | |
| 54 | 26 | <p class="course_name">{{ detailData.course_name }}</p> | 
| 55 | 27 | <p class="course_info">{{ detailData.course_info }}</p> | 
| 56 | 28 | <p class="address" v-if="detailData.provinceAddress"> | 
| ... | ... | @@ -63,15 +35,9 @@ | 
| 63 | 35 | detailData.addressDetail | 
| 64 | 36 | }} | 
| 65 | 37 | </p> | 
| 66 | - <div class="rate" @click="handleEvaluate"> | |
| 67 | - <div> | |
| 68 | - <van-rate v-model="evaluationData.evaluationScore" color="#FFCC00" :size="16" readonly /> | |
| 69 | - <span>{{ evaluationData.evaluationScore }}</span> | |
| 70 | - </div> | |
| 71 | - <span>共{{evaluationData.evaluationCount}}个客户评价 | |
| 72 | - <van-icon name="arrow" /> | |
| 73 | - </span> | |
| 74 | - </div> | |
| 38 | + <!-- 商品评价 --> | |
| 39 | + <abroad-evaluate v-if="courseId" :courseId="courseId"></abroad-evaluate> | |
| 40 | + <!-- 商品标签 --> | |
| 75 | 41 | <div class="tag_box"> | 
| 76 | 42 | <template v-for="(tag, index) in detailData.course_labels"> | 
| 77 | 43 | <span class="tag" v-if="tag != ''" :key="index">{{ tag }}</span> | 
| ... | ... | @@ -81,94 +47,39 @@ | 
| 81 | 47 | <div class="package top_border"> | 
| 82 | 48 | <p class="package_title">套餐类型/日期</p> | 
| 83 | 49 | <div class="package_box" v-if="packageArr.length>0"> | 
| 84 | - <div class="package_item" v-for="(item, index) in packageArr" :key="index" @click="checkDatePackage(item.date)"> | |
| 85 | - <p class="date">{{ item.day }}</p> | |
| 86 | - <p class="week">{{ item.week }}</p> | |
| 87 | - <!-- <p class="price"><span>¥</span>{{ item.marketPrice }}</p> --> | |
| 50 | + <div style="overflow:auto;"> | |
| 51 | + <div class="package_item" :class="packageActive==index?'active':''" v-for="(item, index) in packageArr" :key="index" @click="handlePackageDay(index)"> | |
| 52 | + <p class="date">{{ item.day }}</p> | |
| 53 | + <p class="week">{{ item.week }}</p> | |
| 54 | + <p class="price"><span>¥</span>{{ item.marketPrice }}<span class="des">起</span></p> | |
| 55 | + <img class="select" src="@/assets/service/select.png" alt="" /> | |
| 56 | + </div> | |
| 88 | 57 | </div> | 
| 89 | - <div class="package_item package_item_more" @click="checkDatePackage()" v-if="packageArr.length > 3"> | |
| 58 | + <div class="package_item package_item_more" @click="checkDatePackage()" v-if="packageArr.length>5"> | |
| 90 | 59 | <img class="more_icon" src="@/assets/service/more.png" alt="" /> | 
| 91 | 60 | <p class="more_text">查看更多</p> | 
| 92 | 61 | </div> | 
| 93 | 62 | </div> | 
| 63 | + <img class="notime" v-if="packageArr.length==0" src="@/assets/service/notime.png" alt=""> | |
| 94 | 64 | </div> | 
| 95 | - <img class="notime" v-if="packageArr.length==0" src="@/assets/service/notime.png" alt=""> | |
| 96 | - | |
| 97 | - <van-tabs class="tabs top_border" v-model="active" swipeable :ellipsis="false" color="#4092FF" scrollspy sticky> | |
| 98 | - <van-tab title="产品详情"> | |
| 99 | - <div class="tag_item" v-if="detailData.productFeatures"> | |
| 100 | - <p class="tag_title">产品特色</p> | |
| 101 | - <p class="tag_text" v-html="detailData.productFeatures"></p> | |
| 102 | - </div> | |
| 103 | - <div class="tag_item" v-if="detailData.productDescription"> | |
| 104 | - <p class="tag_title">产品描述</p> | |
| 105 | - <div class="content_box"> | |
| 106 | - <div class="content_all" :class="isOpen ? 'open' : ''"> | |
| 107 | - <p v-html="detailData.productDescription"></p> | |
| 108 | - </div> | |
| 109 | - </div> | |
| 110 | - </div> | |
| 111 | - <div class="tag_item" v-if=" | |
| 112 | - detailData.courseContentList && | |
| 113 | - detailData.courseContentList[0].content != '' | |
| 114 | - "> | |
| 115 | - <p class="tag_title">服务内容</p> | |
| 116 | - <ul class="courseContent"> | |
| 117 | - <li v-for="(n, i) in detailData.courseContentList" :key="n.id"> | |
| 118 | - <span class="left" v-if="n.title">{{ n.title }}</span> | |
| 119 | - <h3>{{ n.content }}</h3> | |
| 120 | - <div class="item" v-for="(k, j) in n.courseFileList" :key="i + '' + j"> | |
| 121 | - <div> | |
| 122 | - <video v-if="k.url && k.url.indexOf('.mp4') > -1" id="video" :src="k.url" poster="" controls="controls" windowlessvideo="true" playsinline="true" webkit-playsinline="true" x5-playsinline="true" x-webkit-airplay="allow" width="100%" height="260px" type="video/mp4"></video> | |
| 123 | - </div> | |
| 124 | - <div> | |
| 125 | - <img v-if="k.url && k.url.indexOf('.mp4') == -1" :src="k.url" /> | |
| 126 | - </div> | |
| 127 | - </div> | |
| 128 | - </li> | |
| 129 | - </ul> | |
| 130 | - </div> | |
| 131 | - <div class="tag_item" v-if="courseTable.length > 0 && showCourseTable"> | |
| 132 | - <p class="tag_title">课程表</p> | |
| 133 | - <div class="cardCont" v-for="(item, index) in courseTable" :key="index"> | |
| 134 | - <table cellspacing="0" cellpadding="8"> | |
| 135 | - <tbody v-html="item"></tbody> | |
| 136 | - </table> | |
| 65 | + <div class="package top_border" v-if="packageArr.length>0&&packageArr[packageActive].comboInfoList.length>1"> | |
| 66 | + <div class="package_box"> | |
| 67 | + <div style="overflow:auto;"> | |
| 68 | + <div class="package_item package_item_type" :class="packageTypeActive==index?'active':''" v-for="(item, index) in packageArr[packageActive].comboInfoList" :key="index" @click="packageTypeActive=index"> | |
| 69 | + <p class="price"><span class="index">套餐{{index+1}}</span><span>¥</span>{{ item.actualPrice }}</p> | |
| 70 | + <p class="name">{{item.comboName}}</p> | |
| 71 | + <img class="select" src="@/assets/service/select.png" alt="" /> | |
| 137 | 72 | </div> | 
| 138 | 73 | </div> | 
| 139 | - <div class="tag_item" v-if="detailData.extraService"> | |
| 140 | - <p class="tag_title">附送服务</p> | |
| 141 | - <p class="tag_text" v-html="detailData.extraService"></p> | |
| 142 | - </div> | |
| 143 | - <div class="tag_item" v-if="detailData.serviceGuarantees"> | |
| 144 | - <p class="tag_title">服务保障和承诺</p> | |
| 145 | - <p class="tag_text" v-html="detailData.serviceGuarantees"></p> | |
| 146 | - </div> | |
| 147 | - </van-tab> | |
| 148 | - <van-tab title="费用说明" v-if="detailData.feeDescription"> | |
| 149 | - <div class="tag_item"> | |
| 150 | - <p class="tag_title">费用说明</p> | |
| 151 | - <p class="tag_text" v-html="detailData.feeDescription"></p> | |
| 152 | - </div> | |
| 153 | - </van-tab> | |
| 154 | - <van-tab title="订购须知" v-if="detailData.notice"> | |
| 155 | - <div class="tag_item"> | |
| 156 | - <p class="tag_title">订购须知</p> | |
| 157 | - <p class="tag_text" v-html="detailData.notice"></p> | |
| 158 | - </div> | |
| 159 | - </van-tab> | |
| 160 | - </van-tabs> | |
| 161 | - <div class="base top_border" v-if="baseData"> | |
| 162 | - <img v-if="baseData.coverList.length > 0" :src="baseData.coverList[0].cover_url" alt="" /> | |
| 163 | - <div class="center"> | |
| 164 | - <p class="basename">{{ baseData.baseName }}</p> | |
| 165 | - <p class="address"> | |
| 166 | - <van-icon name="location-o" />{{ baseData.city }}{{ baseData.area | |
| 167 | - }}{{ baseData.address }} | |
| 168 | - </p> | |
| 169 | - <p class="tag">{{ baseData.baseLabel.join("/") }}</p> | |
| 170 | 74 | </div> | 
| 75 | + <!-- 套餐说明 --> | |
| 76 | + <p class="package_des" v-if="packageArr[packageActive]&&packageArr[packageActive].comboInfoList[packageTypeActive].comboDescrption">套餐说明<br>{{packageArr[packageActive].comboInfoList[packageTypeActive].comboDescrption}}</p> | |
| 171 | 77 | </div> | 
| 78 | + <!-- 商品详情 --> | |
| 79 | + <abroad-des v-if="detailData" :detailData="detailData"></abroad-des> | |
| 80 | + <!-- 基地信息 --> | |
| 81 | + <abroad-base v-if="detailData" :baseId="detailData.baseId"></abroad-base> | |
| 82 | + | |
| 172 | 83 | <div class="Collection"> | 
| 173 | 84 | <div class="box box1"> | 
| 174 | 85 | <div class="icon" @click="backHome"> | 
| ... | ... | @@ -186,23 +97,10 @@ | 
| 186 | 97 | </div> | 
| 187 | 98 | <div class="box box2"> | 
| 188 | 99 | <span v-if="packageArr.length > 0&&detailData.applyCount>=detailData.stockCount" class="disabled">已满团</span> | 
| 189 | - <span v-else-if="packageArr.length > 0" @click="checkDatePackage(packageArr[0].date)">去订购</span> | |
| 100 | + <span v-else-if="packageArr.length > 0" @click="checkDatePackage()">去订购</span> | |
| 190 | 101 | <span v-else class="disabled">拼团请咨询客服</span> | 
| 191 | 102 | </div> | 
| 192 | 103 | </div> | 
| 193 | - <van-popup v-model="showPintuanAbout" round> | |
| 194 | - <div class="pintuan_about"> | |
| 195 | - <img class="about_img" src="@/assets/service/tip.png" alt=""> | |
| 196 | - <p class="about_title">拼团规则说明</p> | |
| 197 | - <div class="about_box"> | |
| 198 | - <p class="about_content">1、拼团展示默认为最近活动档期,选择其它档期请时刻注意成团动态。</p> | |
| 199 | - <p class="about_content">2、在限时截止后,报名人数未达最低成团数,则结束本团活动,系统将在72小时内,全额退还!</p> | |
| 200 | - <p class="about_content">3、报名人数达到最低成团要求后,则拼团成功,凡在报名截止时间内未达最大限团人数,则可放心参与。</p> | |
| 201 | - <p class="about_content">4、已成团的活动,除特殊情况等不可抗拒因素外,活动如期举行。</p> | |
| 202 | - </div> | |
| 203 | - <p class="about_know" @click="showPintuanAbout=false">我知道了</p> | |
| 204 | - </div> | |
| 205 | - </van-popup> | |
| 206 | 104 | <van-dialog v-model="showTip" title="温馨提示" show-cancel-button confirm-button-color="#3385FF" cancel-button-color="#999" confirm-button-text="同意" cancel-button-text="再想想" @confirm="tipConfirm"> | 
| 207 | 105 | <div class="show_tip_title" slot="title"> | 
| 208 | 106 | <img src="@/assets/service/tip.png" alt=""> | 
| ... | ... | @@ -214,31 +112,25 @@ | 
| 214 | 112 | </div> | 
| 215 | 113 | </template> | 
| 216 | 114 | <script> | 
| 115 | +import AbroadDes from './component/AbroadDetail/AbroadDes'; | |
| 116 | +import AbroadBase from './component/AbroadDetail/AbroadBase'; | |
| 117 | +import AbroadEvaluate from './component/AbroadDetail/AbroadEvaluate'; | |
| 118 | +import CountDown from './component/AbroadDetail/CountDown'; | |
| 119 | +import AbroadCoupon from './component/AbroadDetail/AbroadCoupon'; | |
| 120 | +import './AbroadDetail.scss'; | |
| 217 | 121 | export default { | 
| 218 | 122 | name: "ServiceAbroadDetail", | 
| 219 | 123 | data () { | 
| 220 | 124 | return { | 
| 221 | - isOpen: true, | |
| 222 | 125 | courseId: "", | 
| 223 | 126 | detailData: "", | 
| 224 | - active: 0, | |
| 225 | - courseTable: [], //课程表 | |
| 226 | 127 | packageData: [], //未处理过格式的套餐表 | 
| 128 | + packageActive: 0, | |
| 129 | + packageTypeActive: 0, | |
| 227 | 130 | packageArr: [], //套餐时间价格 | 
| 228 | - evaluationData: '',//评价 | |
| 229 | - baseData: "", //基地信息 | |
| 131 | + initPackageArr: false,//packageArr已生成 | |
| 230 | 132 | showCourseTable: true, | 
| 231 | - showTime: { | |
| 232 | - day: "", | |
| 233 | - hour: "", | |
| 234 | - minute: "", | |
| 235 | - second: "", | |
| 236 | - }, | |
| 237 | - timeTamp: "", | |
| 238 | 133 | unionId: '', | 
| 239 | - proCoupon: [],//优惠券 | |
| 240 | - proCouponHas: false,//优惠券已领取 | |
| 241 | - showPintuanAbout: false, | |
| 242 | 134 | centerNo: '', | 
| 243 | 135 | showTip: false, | 
| 244 | 136 | PackageQuery: '', | 
| ... | ... | @@ -252,69 +144,42 @@ export default { | 
| 252 | 144 | this.GetCourseDetail(); | 
| 253 | 145 | }, | 
| 254 | 146 | methods: { | 
| 255 | - // 展开关闭院校简介 | |
| 256 | - extend_btn () { | |
| 257 | - this.isOpen = !this.isOpen; | |
| 258 | - }, | |
| 259 | - //倒计时计算 | |
| 260 | - timeDown () { | |
| 261 | - var clusterTime = Date.parse(new Date(this.detailData.clusterTime.replace(/\-/g, "/"))) + 60 * 60 * 24 * 1000; | |
| 262 | - var nowTime = Date.parse(new Date()); | |
| 263 | - let timeTamp = clusterTime / 1000 - nowTime / 1000; | |
| 264 | - // console.log(timeTamp) | |
| 265 | - this.timeTamp = timeTamp; | |
| 266 | - // console.log(timeTamp) | |
| 267 | - let k = this.calculateDiffTime(timeTamp); | |
| 268 | - // console.log(k) | |
| 147 | + // 点击套餐日期 | |
| 148 | + handlePackageDay (index) { | |
| 149 | + this.packageActive = index; | |
| 150 | + this.packageTypeActive = 0;//重置套餐类型选择 | |
| 151 | + //TODO 获取该日所包含的套餐 | |
| 269 | 152 | }, | 
| 270 | - calculateDiffTime (timeDiff) { | |
| 271 | - var day = parseInt(timeDiff / 86400); | |
| 272 | - var hour = parseInt((timeDiff % 86400) / 3600); | |
| 273 | - var minute = parseInt(((timeDiff % 86400) % 3600) / 60); | |
| 274 | - var second = parseInt((((timeDiff % 86400) % 3600) % 60) % 60); | |
| 275 | 153 | |
| 276 | - this.showTime = { | |
| 277 | - day, | |
| 278 | - hour, | |
| 279 | - minute, | |
| 280 | - second, | |
| 281 | - }; | |
| 282 | - day = day ? day + "天" : ""; | |
| 283 | - hour = hour ? hour + "时" : ""; | |
| 284 | - minute = minute ? minute + "分" : ""; | |
| 285 | - second = second ? second + "秒" : ""; | |
| 286 | - return day + hour + minute + second; | |
| 287 | - }, | |
| 288 | 154 | // 点击预约 | 
| 289 | - checkDatePackage (date) { | |
| 290 | - | |
| 291 | - if (this.packageArr[0].date == date) | |
| 292 | - if (this.detailData.applyCount >= this.detailData.stockCount && this.packageArr[0].date == date) { | |
| 293 | - this.$toast('已满团') | |
| 294 | - return; | |
| 295 | - } | |
| 296 | - let query = {}; | |
| 297 | - if (date || date === 0) { | |
| 298 | - query = { date: date }; | |
| 299 | - } | |
| 155 | + checkDatePackage () { | |
| 156 | + // if (this.packageArr[0].date == date) { | |
| 157 | + // if (this.detailData.applyCount >= this.detailData.stockCount && this.packageArr[0].date == date) { | |
| 158 | + // this.$toast('已满团') | |
| 159 | + // return; | |
| 160 | + // } | |
| 161 | + // } | |
| 162 | + const tagIndex = this.packageArr[this.packageActive].comboInfoList[this.packageTypeActive].tagIndex | |
| 163 | + console.log(this.packageArr[this.packageActive]) | |
| 164 | + let query = { date: this.packageArr[this.packageActive].date, Index1: tagIndex[0], Index2: tagIndex[1] }; | |
| 300 | 165 | this.PackageQuery = query | 
| 301 | 166 | const AbroadDetailTipChecked = sessionStorage.getItem('AbroadDetailTipChecked'); | 
| 302 | - if(AbroadDetailTipChecked){ | |
| 167 | + if (AbroadDetailTipChecked) { | |
| 303 | 168 | this.$router.push({ name: "ServiceDatePackage", query: query }); | 
| 304 | - }else{ | |
| 169 | + } else { | |
| 305 | 170 | this.showTip = true; | 
| 306 | 171 | } | 
| 307 | 172 | }, | 
| 308 | 173 | tipConfirm () { | 
| 309 | - if(this.tipChecked){ | |
| 310 | - sessionStorage.setItem('AbroadDetailTipChecked',1) | |
| 174 | + if (this.tipChecked) { | |
| 175 | + sessionStorage.setItem('AbroadDetailTipChecked', 1) | |
| 311 | 176 | } | 
| 312 | 177 | this.$router.push({ name: "ServiceDatePackage", query: this.PackageQuery }); | 
| 313 | 178 | }, | 
| 314 | - // 获取商品详情 | |
| 179 | + // 获取产品详情 | |
| 315 | 180 | GetCourseDetail () { | 
| 316 | 181 | if (!this.courseId) { | 
| 317 | - this.$toast.fail('商品id缺失,请从正确的途径访问') | |
| 182 | + this.$toast.fail('产品id缺失,请从正确的途径访问') | |
| 318 | 183 | return; | 
| 319 | 184 | } | 
| 320 | 185 | this.$toast.loading({ | 
| ... | ... | @@ -339,7 +204,7 @@ export default { | 
| 339 | 204 | this.$toast.clear(); | 
| 340 | 205 | if (res.data.data && res.data.data.id !== 0) { | 
| 341 | 206 | let detailData = res.data.data; | 
| 342 | - // console.log(detailData) | |
| 207 | + console.log('产品详情:', detailData) | |
| 343 | 208 | detailData.course_labels = detailData.course_labels?.split(","); | 
| 344 | 209 | this.detailData = detailData; | 
| 345 | 210 | localStorage.setItem( | 
| ... | ... | @@ -352,21 +217,6 @@ export default { | 
| 352 | 217 | }) | 
| 353 | 218 | ); | 
| 354 | 219 | this.getPackageData(); //获取套餐列表 | 
| 355 | - this.getOrderCoupon(); //获取商品可使用优惠券 | |
| 356 | - this.getEvaluationSummary();//获取评价 | |
| 357 | - let timer = setInterval(() => { | |
| 358 | - this.timeDown(); //倒计时 | |
| 359 | - }, 1000); | |
| 360 | - this.$once("hook:beforeDestroy", () => { | |
| 361 | - clearInterval(timer); //清理定时器 | |
| 362 | - }); | |
| 363 | - this.$nextTick(() => { | |
| 364 | - this.GetOneBase(detailData.baseId); //获取单个基地 | |
| 365 | - // this.setPackageArr();//设置套餐 | |
| 366 | - for (let i in detailData.courseScheduleList) { | |
| 367 | - this.getWeekCard(i); | |
| 368 | - } | |
| 369 | - }); | |
| 370 | 220 | } else { | 
| 371 | 221 | let message = res.data.message; | 
| 372 | 222 | if (!message) { | 
| ... | ... | @@ -380,82 +230,7 @@ export default { | 
| 380 | 230 | } | 
| 381 | 231 | }); | 
| 382 | 232 | }, | 
| 383 | - //获取商品可使用优惠券 | |
| 384 | - getOrderCoupon () { | |
| 385 | - this.mgop({ | |
| 386 | - api: 'mgop.sz.hswsy.orderCoupon', // 必须 | |
| 387 | - host: 'https://mapi.zjzwfw.gov.cn/', | |
| 388 | - dataType: 'JSON', | |
| 389 | - type: 'POST', | |
| 390 | - appKey: 'fuxgnukl+2001895516+edccpx', // 必须 | |
| 391 | - headers: { | |
| 392 | - // 'isTestUrl': '1' | |
| 393 | - }, | |
| 394 | - data: { | |
| 395 | - "proId": this.detailData.id, | |
| 396 | - "userId": this.centerNo, | |
| 397 | - }, | |
| 398 | - onSuccess: res => { | |
| 399 | - if (res.data.data) { | |
| 400 | - if (res.data.data.has.length > 0) { | |
| 401 | - this.proCoupon = res.data.data.has | |
| 402 | - localStorage.setItem("proCoupon", JSON.stringify(this.proCoupon)) | |
| 403 | - this.chooseDefaultUseCard(res.data.data.has)//设置默认选中的优惠券 | |
| 404 | - this.proCouponHas = true; | |
| 405 | - } else if (res.data.data.get.length > 0) { | |
| 406 | - this.proCoupon = { | |
| 407 | - title: '您有可领优惠券' | |
| 408 | - } | |
| 409 | - } | |
| 410 | - } | |
| 411 | - }, | |
| 412 | - onFail: err => { | |
| 413 | - console.log('err', err) | |
| 414 | - } | |
| 415 | - }); | |
| 416 | - }, | |
| 417 | - // 设置默认选中的优惠券 | |
| 418 | - chooseDefaultUseCard (has) { | |
| 419 | - if (has.length > 1) { | |
| 420 | - let useCard = has[0]; | |
| 421 | - for (let i in has) { | |
| 422 | - console.log(Number(has[i].couponPrice) > Number(useCard.couponPrice)) | |
| 423 | - if (Number(has[i].couponPrice) > Number(useCard.couponPrice)) { | |
| 424 | - useCard = has[i] | |
| 425 | - } | |
| 426 | - } | |
| 427 | - // console.log('useCard', useCard) | |
| 428 | - this.proCoupon = [useCard] | |
| 429 | - localStorage.setItem('useCard', JSON.stringify(useCard)) | |
| 430 | 233 | |
| 431 | - } else { | |
| 432 | - localStorage.setItem('useCard', JSON.stringify(this.proCoupon[0])) | |
| 433 | - } | |
| 434 | - }, | |
| 435 | - // 获取评价 | |
| 436 | - getEvaluationSummary () { | |
| 437 | - this.mgop({ | |
| 438 | - api: 'mgop.sz.hswsy.EvaluationSummary', // 必须 | |
| 439 | - host: 'https://mapi.zjzwfw.gov.cn/', | |
| 440 | - dataType: 'JSON', | |
| 441 | - type: 'GET', | |
| 442 | - appKey: 'fuxgnukl+2001895516+edccpx', // 必须 | |
| 443 | - headers: { | |
| 444 | - // 'isTestUrl': '1' | |
| 445 | - }, | |
| 446 | - data: { | |
| 447 | - "courseId": this.courseId, | |
| 448 | - }, | |
| 449 | - onSuccess: res => { | |
| 450 | - if (res.data.data) { | |
| 451 | - this.evaluationData = res.data.data | |
| 452 | - } | |
| 453 | - }, | |
| 454 | - onFail: err => { | |
| 455 | - console.log('err', err) | |
| 456 | - } | |
| 457 | - }); | |
| 458 | - }, | |
| 459 | 234 | // 获取套餐列表 | 
| 460 | 235 | getPackageData () { | 
| 461 | 236 | let startDate = this.Moment().format("YYYY-MM-DD"); | 
| ... | ... | @@ -475,6 +250,7 @@ export default { | 
| 475 | 250 | "endDate": endDate, | 
| 476 | 251 | }, | 
| 477 | 252 | onSuccess: res => { | 
| 253 | + console.log('套餐列表:', res.data.data); | |
| 478 | 254 | if (res.data.data) { | 
| 479 | 255 | let allPackage = res.data.data; | 
| 480 | 256 | let usefulPackage = []; | 
| ... | ... | @@ -483,7 +259,6 @@ export default { | 
| 483 | 259 | usefulPackage.push(allPackage[i]); | 
| 484 | 260 | } | 
| 485 | 261 | } | 
| 486 | - console.log(usefulPackage); | |
| 487 | 262 | this.packageData = usefulPackage; | 
| 488 | 263 | localStorage.setItem( | 
| 489 | 264 | "packageData", | 
| ... | ... | @@ -499,7 +274,7 @@ export default { | 
| 499 | 274 | }, | 
| 500 | 275 | // 设置套餐价格 | 
| 501 | 276 | setPackageArr () { | 
| 502 | - console.log(this.packageData); | |
| 277 | + console.log('含套餐的日期:', this.packageData); | |
| 503 | 278 | let packageArr = []; | 
| 504 | 279 | for (let i in this.packageData) { | 
| 505 | 280 | let packageDate = this.Moment( | 
| ... | ... | @@ -522,108 +297,30 @@ export default { | 
| 522 | 297 | : week == 0 | 
| 523 | 298 | ? "周日" | 
| 524 | 299 | : ""; | 
| 525 | - //超出部分不显示 | |
| 526 | - if (packageArr.length > 3) { | |
| 527 | - this.packageArr = packageArr; | |
| 528 | - return; | |
| 300 | + let comboInfoList = []; | |
| 301 | + let comboList = JSON.parse(JSON.stringify(this.packageData[i]?.comboList)) | |
| 302 | + // 为套餐添加下标 | |
| 303 | + let marketPrice = 999; | |
| 304 | + for (let j in comboList) { | |
| 305 | + for (let k in comboList[j].comboInfoList) { | |
| 306 | + comboList[j].comboInfoList[k].tagIndex = [j, k] | |
| 307 | + comboList[j].comboInfoList[k].bindId = comboList[j].id | |
| 308 | + if (comboList[j].comboInfoList[k].actualPrice < marketPrice) { | |
| 309 | + marketPrice = comboList[j].comboInfoList[k].actualPrice | |
| 310 | + } | |
| 311 | + } | |
| 312 | + comboInfoList.push(...comboList[j].comboInfoList) | |
| 529 | 313 | } | 
| 530 | 314 | packageArr.push({ | 
| 531 | 315 | day: packageDate.format("M/D"), | 
| 532 | 316 | date: packageDate.format("YYYY-MM-DD"), | 
| 533 | 317 | week: week, | 
| 534 | - marketPrice: this.packageData[i]?.comboList[0]?.actualPrice, | |
| 318 | + marketPrice: marketPrice, | |
| 319 | + comboInfoList: comboInfoList, | |
| 535 | 320 | }); | 
| 536 | 321 | } | 
| 537 | 322 | this.packageArr = packageArr; | 
| 538 | - }, | |
| 539 | - // 获取单个基地 | |
| 540 | - GetOneBase (baseId) { | |
| 541 | - this.mgop({ | |
| 542 | - api: 'mgop.sz.hswsy.GetOneBase', // 必须 | |
| 543 | - host: 'https://mapi.zjzwfw.gov.cn/', | |
| 544 | - dataType: 'JSON', | |
| 545 | - type: 'GET', | |
| 546 | - appKey: 'fuxgnukl+2001895516+edccpx', // 必须 | |
| 547 | - headers: { | |
| 548 | - // 'isTestUrl': '1' | |
| 549 | - }, | |
| 550 | - data: { | |
| 551 | - "id": baseId, | |
| 552 | - }, | |
| 553 | - onSuccess: res => { | |
| 554 | - if (res.data.data) { | |
| 555 | - this.baseData = res.data.data; | |
| 556 | - } | |
| 557 | - }, | |
| 558 | - onFail: err => { | |
| 559 | - console.log('err', err) | |
| 560 | - } | |
| 561 | - }); | |
| 562 | - }, | |
| 563 | - // 设置第几天的课程表 | |
| 564 | - getWeekCard (index) { | |
| 565 | - var data = this.detailData.courseScheduleList[index].courseScheduleList; | |
| 566 | - var morning = []; | |
| 567 | - var afternoon = []; | |
| 568 | - var night = []; | |
| 569 | - data.forEach(function (k, j) { | |
| 570 | - if (k.type == 1 && k.content != "") { | |
| 571 | - morning.push(k); | |
| 572 | - } else if (k.type == 2 && k.content != "") { | |
| 573 | - afternoon.push(k); | |
| 574 | - } else if (k.type == 3 && k.content != "") { | |
| 575 | - night.push(k); | |
| 576 | - } | |
| 577 | - }); | |
| 578 | - if (morning.length == 0 && afternoon.length == 0 && night.length == 0) { | |
| 579 | - this.showCourseTable = false; | |
| 580 | - } | |
| 581 | - var strMorning = "", | |
| 582 | - strAfternoon = "", | |
| 583 | - strNight = ""; | |
| 584 | - if (morning.length > 0) { | |
| 585 | - strMorning = `<tr> | |
| 586 | - <td class="td_left" rowspan="${morning.length}">上午</td> | |
| 587 | - <td style="text-align: left;">${morning[0].content ? morning[0].content : "无安排" | |
| 588 | - }</td> | |
| 589 | - </tr>`; | |
| 590 | - morning.forEach(function (k, j) { | |
| 591 | - if (j > 0) { | |
| 592 | - strMorning += `<tr> | |
| 593 | - <td style="text-align: left;">${k.content ? k.content : "无安排"}</td> | |
| 594 | - </tr>`; | |
| 595 | - } | |
| 596 | - }); | |
| 597 | - } | |
| 598 | - if (afternoon.length > 0) { | |
| 599 | - strAfternoon = `<tr> | |
| 600 | - <td class="td_left" rowspan="${afternoon.length}">下午</td> | |
| 601 | - <td style="text-align: left;">${afternoon[0].content ? afternoon[0].content : "无安排" | |
| 602 | - }</td> | |
| 603 | - </tr>`; | |
| 604 | - afternoon.forEach(function (k, j) { | |
| 605 | - if (j > 0) { | |
| 606 | - strAfternoon += `<tr> | |
| 607 | - <td style="text-align: left;">${k.content ? k.content : "无安排"}</td> | |
| 608 | - </tr>`; | |
| 609 | - } | |
| 610 | - }); | |
| 611 | - } | |
| 612 | - if (night.length > 0) { | |
| 613 | - strNight = `<tr> | |
| 614 | - <td class="td_left" rowspan="${night.length}">晚上</td> | |
| 615 | - <td style="text-align: left;">${night[0].content ? night[0].content : "无安排" | |
| 616 | - }</td> | |
| 617 | - </tr>`; | |
| 618 | - night.forEach(function (k, j) { | |
| 619 | - if (j > 0) { | |
| 620 | - strNight += `<tr> | |
| 621 | - <td style="text-align: left;">${k.content ? k.content : "无安排"}</td> | |
| 622 | - </tr>`; | |
| 623 | - } | |
| 624 | - }); | |
| 625 | - } | |
| 626 | - this.courseTable.push(strMorning + strAfternoon + strNight); | |
| 323 | + this.initPackageArr = true | |
| 627 | 324 | }, | 
| 628 | 325 | // 联系客服 | 
| 629 | 326 | contactService () { | 
| ... | ... | @@ -635,707 +332,13 @@ export default { | 
| 635 | 332 | backHome () { | 
| 636 | 333 | this.$router.push({ name: "ServiceKQ" }); | 
| 637 | 334 | }, | 
| 638 | - // 点击评价进入评价详情页 | |
| 639 | - handleEvaluate () { | |
| 640 | - this.$router.push({ name: "ServiceAbroadEvaluate", query: { courseId: this.courseId } }); | |
| 641 | - }, | |
| 642 | - //领券 | |
| 643 | - toCoupons () { | |
| 644 | - this.$router.push({ | |
| 645 | - name: "CardBoxXST", | |
| 646 | - }); | |
| 647 | - }, | |
| 648 | 335 | }, | 
| 336 | + components: { | |
| 337 | + AbroadDes, | |
| 338 | + AbroadBase, | |
| 339 | + AbroadEvaluate, | |
| 340 | + CountDown, | |
| 341 | + AbroadCoupon | |
| 342 | + } | |
| 649 | 343 | }; | 
| 650 | 344 | </script> | 
| 651 | -<style lang="scss"> | |
| 652 | -.abroad_detail { | |
| 653 | - padding-bottom: 200px; | |
| 654 | - .header { | |
| 655 | - img { | |
| 656 | - width: 100%; | |
| 657 | - } | |
| 658 | - } | |
| 659 | - .countDown { | |
| 660 | - height: 130px; | |
| 661 | - width: 100%; | |
| 662 | - background-color: #201e2b; | |
| 663 | - .countDownTop { | |
| 664 | - height: 50%; | |
| 665 | - padding: 0 3vw; | |
| 666 | - box-sizing: border-box; | |
| 667 | - display: flex; | |
| 668 | - justify-content: space-between; | |
| 669 | - align-items: center; | |
| 670 | - // color: blanchedalmond; | |
| 671 | - color: #ffffff; | |
| 672 | - font-size: 32px; | |
| 673 | - .countDownTime { | |
| 674 | - font-size: 24px; | |
| 675 | - .countDownFont { | |
| 676 | - line-height: 34px; | |
| 677 | - color: #333333; | |
| 678 | - border-radius: 5px; | |
| 679 | - margin: 0 8px; | |
| 680 | - } | |
| 681 | - div { | |
| 682 | - // color: red; | |
| 683 | - width: 34px; | |
| 684 | - text-align: center; | |
| 685 | - display: inline-block; | |
| 686 | - background-color: #ffe9b1; | |
| 687 | - } | |
| 688 | - } | |
| 689 | - } | |
| 690 | - .countDownBottom { | |
| 691 | - height: 50%; | |
| 692 | - padding: 0 3vw; | |
| 693 | - box-sizing: border-box; | |
| 694 | - display: flex; | |
| 695 | - justify-content: space-between; | |
| 696 | - align-items: center; | |
| 697 | - // color: blanchedalmond; | |
| 698 | - color: #ffffff; | |
| 699 | - font-size: 24px; | |
| 700 | - .countDownBottomyellow { | |
| 701 | - display: inline-block; | |
| 702 | - // width: 10vw; | |
| 703 | - height: 33px; | |
| 704 | - margin-right: 12px; | |
| 705 | - padding: 0 8px; | |
| 706 | - color: #333333; | |
| 707 | - font-size: 24px; | |
| 708 | - background-color: #ffe9b1; | |
| 709 | - border-radius: 4px; | |
| 710 | - } | |
| 711 | - .countDownBottomTime { | |
| 712 | - font-size: 2.8vw; | |
| 713 | - color: #ffffff; | |
| 714 | - opacity: 0.85; | |
| 715 | - } | |
| 716 | - .countDownAbout { | |
| 717 | - text-decoration: underline; | |
| 718 | - } | |
| 719 | - } | |
| 720 | - } | |
| 721 | - .uni_text { | |
| 722 | - width: 100%; | |
| 723 | - background: #fff; | |
| 724 | - padding: 24px 34px; | |
| 725 | - box-sizing: border-box; | |
| 726 | - .course_price { | |
| 727 | - font-size: 38px; | |
| 728 | - font-weight: bold; | |
| 729 | - color: red; | |
| 730 | - .redmini { | |
| 731 | - font-size: 25px; | |
| 732 | - } | |
| 733 | - .tint { | |
| 734 | - font-size: 25px; | |
| 735 | - font-weight: normal; | |
| 736 | - color: #909399; | |
| 737 | - margin-left: 2vw; | |
| 738 | - text-decoration: line-through; | |
| 739 | - } | |
| 740 | - } | |
| 741 | - .course_price_free { | |
| 742 | - font-size: 34px; | |
| 743 | - font-weight: bold; | |
| 744 | - color: red; | |
| 745 | - display: flex; | |
| 746 | - justify-content: space-between; | |
| 747 | - .des { | |
| 748 | - color: #333; | |
| 749 | - } | |
| 750 | - } | |
| 751 | - .course_coupons { | |
| 752 | - height: 70px; | |
| 753 | - font-size: 27px; | |
| 754 | - // color: #4092FF; | |
| 755 | - display: flex; | |
| 756 | - justify-content: space-between; | |
| 757 | - align-items: center; | |
| 758 | - .fontBlue { | |
| 759 | - color: #4092ff; | |
| 760 | - } | |
| 761 | - } | |
| 762 | - .course_name { | |
| 763 | - font-size: 34px; | |
| 764 | - font-weight: bold; | |
| 765 | - } | |
| 766 | - .course_info { | |
| 767 | - font-size: 24px; | |
| 768 | - color: #999; | |
| 769 | - margin-top: 16px; | |
| 770 | - } | |
| 771 | - .address { | |
| 772 | - font-size: 24px; | |
| 773 | - color: #999; | |
| 774 | - margin-top: 16px; | |
| 775 | - .icon { | |
| 776 | - color: #000; | |
| 777 | - } | |
| 778 | - } | |
| 779 | - .rate { | |
| 780 | - margin-top: 20px; | |
| 781 | - display: flex; | |
| 782 | - justify-content: space-between; | |
| 783 | - div > span { | |
| 784 | - font-size: 30px; | |
| 785 | - color: #ffcc00; | |
| 786 | - margin-left: 30px; | |
| 787 | - } | |
| 788 | - > span { | |
| 789 | - font-size: 26px; | |
| 790 | - } | |
| 791 | - } | |
| 792 | - .tag_box { | |
| 793 | - padding-top: 10px; | |
| 794 | - .tag { | |
| 795 | - display: inline-block; | |
| 796 | - margin-top: 10px; | |
| 797 | - margin-right: 12px; | |
| 798 | - color: #4092ff; | |
| 799 | - font-size: 24px; | |
| 800 | - border-radius: 8px; | |
| 801 | - border: 2px solid #4092ff; | |
| 802 | - padding: 2px 10px; | |
| 803 | - } | |
| 804 | - } | |
| 805 | - } | |
| 806 | - .package { | |
| 807 | - padding: 18px 22px; | |
| 808 | - .package_title { | |
| 809 | - font-size: 28px; | |
| 810 | - color: #999; | |
| 811 | - } | |
| 812 | - .package_box { | |
| 813 | - white-space: nowrap; | |
| 814 | - margin-top: 22px; | |
| 815 | - .package_item { | |
| 816 | - width: 128px; | |
| 817 | - height: 152px; | |
| 818 | - border-radius: 12px; | |
| 819 | - border: 2px solid #dde3ef; | |
| 820 | - box-sizing: border-box; | |
| 821 | - display: inline-flex; | |
| 822 | - align-content: center; | |
| 823 | - justify-content: center; | |
| 824 | - flex-wrap: wrap; | |
| 825 | - vertical-align: top; | |
| 826 | - margin-right: 16px; | |
| 827 | - p { | |
| 828 | - width: 100%; | |
| 829 | - margin: 0; | |
| 830 | - text-align: center; | |
| 831 | - } | |
| 832 | - .more_icon { | |
| 833 | - width: 36px; | |
| 834 | - margin-top: 10px; | |
| 835 | - } | |
| 836 | - .more_text { | |
| 837 | - font-size: 22px; | |
| 838 | - color: #fff; | |
| 839 | - margin-top: 22px; | |
| 840 | - } | |
| 841 | - .date { | |
| 842 | - font-size: 32px; | |
| 843 | - font-weight: bold; | |
| 844 | - } | |
| 845 | - .week { | |
| 846 | - font-size: 22px; | |
| 847 | - color: #999; | |
| 848 | - } | |
| 849 | - .price { | |
| 850 | - font-size: 28px; | |
| 851 | - color: #ff2b2b; | |
| 852 | - margin-top: 14px; | |
| 853 | - span { | |
| 854 | - font-size: 20px; | |
| 855 | - } | |
| 856 | - } | |
| 857 | - } | |
| 858 | - .package_item_more { | |
| 859 | - background: #3f92ff; | |
| 860 | - border: 2px solid #3f92ff; | |
| 861 | - box-shadow: 6px 12px 16px 0px rgba(63, 146, 255, 0.29); | |
| 862 | - margin-right: 0; | |
| 863 | - } | |
| 864 | - } | |
| 865 | - } | |
| 866 | - .notime { | |
| 867 | - width: 100%; | |
| 868 | - } | |
| 869 | - .content_box { | |
| 870 | - position: relative; | |
| 871 | - | |
| 872 | - .content_all { | |
| 873 | - overflow: hidden; | |
| 874 | - height: 580px; | |
| 875 | - // font-size: 26px; | |
| 876 | - // line-height: 36px; | |
| 877 | - font-size: 31px !important; | |
| 878 | - line-height: 40px !important; | |
| 879 | - letter-spacing: 1.6px; | |
| 880 | - color: #666; | |
| 881 | - // padding-bottom: 130px; | |
| 882 | - img { | |
| 883 | - width: 100%; | |
| 884 | - } | |
| 885 | - } | |
| 886 | - | |
| 887 | - /* 展开 */ | |
| 888 | - .open { | |
| 889 | - height: auto; | |
| 890 | - } | |
| 891 | - | |
| 892 | - .extend_wrap { | |
| 893 | - display: flex; | |
| 894 | - align-items: center; | |
| 895 | - justify-content: center; | |
| 896 | - font-size: 26px; | |
| 897 | - padding: 40px 0; | |
| 898 | - color: #4092ff; | |
| 899 | - margin-top: -40px; | |
| 900 | - background: linear-gradient( | |
| 901 | - 180deg, | |
| 902 | - rgba(255, 255, 255, 0.3) 0%, | |
| 903 | - rgba(255, 255, 255, 0.8) 30%, | |
| 904 | - rgba(255, 255, 255, 1) 100% | |
| 905 | - ); | |
| 906 | - width: 100%; | |
| 907 | - position: absolute; | |
| 908 | - bottom: 0; | |
| 909 | - left: 0; | |
| 910 | - } | |
| 911 | - } | |
| 912 | - | |
| 913 | - .tag_item { | |
| 914 | - padding: 22px; | |
| 915 | - .tag_title { | |
| 916 | - font-size: 34px; | |
| 917 | - font-weight: bold; | |
| 918 | - margin-bottom: 32px; | |
| 919 | - } | |
| 920 | - .tag_text { | |
| 921 | - // font-size: 24px; | |
| 922 | - // line-height: 40px; | |
| 923 | - font-size: 28px !important; | |
| 924 | - line-height: 44px !important; | |
| 925 | - padding: 16px 0; | |
| 926 | - } | |
| 927 | - } | |
| 928 | - .cardCont { | |
| 929 | - // font-size: 24px; | |
| 930 | - font-size: 28px !important; | |
| 931 | - table { | |
| 932 | - border-radius: 5px; | |
| 933 | - width: 100%; | |
| 934 | - border: 1px solid #dde3ef; | |
| 935 | - td { | |
| 936 | - border: 1px solid #dde3ef; | |
| 937 | - text-align: center; | |
| 938 | - background: rgb(245, 246, 250); | |
| 939 | - } | |
| 940 | - .td_left { | |
| 941 | - width: 132px; | |
| 942 | - background: #fff; | |
| 943 | - box-sizing: border-box; | |
| 944 | - } | |
| 945 | - } | |
| 946 | - } | |
| 947 | - .courseContent { | |
| 948 | - li:not(:last-child) { | |
| 949 | - border-bottom: 1px solid #eee; | |
| 950 | - } | |
| 951 | - li:first-child { | |
| 952 | - .left { | |
| 953 | - color: #fa9b00; | |
| 954 | - border: 1px solid #fa9b00; | |
| 955 | - background-color: #fef4d9; | |
| 956 | - } | |
| 957 | - } | |
| 958 | - li:nth-child(3n + 1) { | |
| 959 | - .left { | |
| 960 | - color: #fa9b00; | |
| 961 | - border: 1px solid #fa9b00; | |
| 962 | - background-color: #fef4d9; | |
| 963 | - } | |
| 964 | - } | |
| 965 | - li:nth-child(3n-1) { | |
| 966 | - .left { | |
| 967 | - color: #fa008c; | |
| 968 | - border: 1px solid #fa008c; | |
| 969 | - background-color: #ffeffc; | |
| 970 | - } | |
| 971 | - } | |
| 972 | - li:nth-child(3n) { | |
| 973 | - .left { | |
| 974 | - color: #0076fa; | |
| 975 | - border: 1px solid #0076fa; | |
| 976 | - background-color: #efffff; | |
| 977 | - } | |
| 978 | - } | |
| 979 | - li { | |
| 980 | - position: relative; | |
| 981 | - margin-top: 20px; | |
| 982 | - padding-bottom: 10px; | |
| 983 | - .left { | |
| 984 | - position: absolute; | |
| 985 | - top: 0; | |
| 986 | - left: 0; | |
| 987 | - width: 120px; | |
| 988 | - font-size: 26px; | |
| 989 | - text-align: center; | |
| 990 | - border-radius: 3px; | |
| 991 | - padding: 3px; | |
| 992 | - box-sizing: border-box; | |
| 993 | - font-weight: 600; | |
| 994 | - } | |
| 995 | - h3 { | |
| 996 | - color: #202228; | |
| 997 | - // font-size: 32px; | |
| 998 | - font-size: 30px !important; | |
| 999 | - font-weight: 400; | |
| 1000 | - margin: 0; | |
| 1001 | - padding-left: 160px; | |
| 1002 | - word-break: break-all; | |
| 1003 | - } | |
| 1004 | - .item { | |
| 1005 | - margin-top: 10px; | |
| 1006 | - img { | |
| 1007 | - width: 100%; | |
| 1008 | - } | |
| 1009 | - p { | |
| 1010 | - margin: 0; | |
| 1011 | - margin-top: 10px; | |
| 1012 | - color: #a7a7aa; | |
| 1013 | - // font-size: 28px; | |
| 1014 | - font-size: 31px !important; | |
| 1015 | - b { | |
| 1016 | - // font-size: 32px; | |
| 1017 | - font-size: 35px !important; | |
| 1018 | - font-weight: 400; | |
| 1019 | - color: #000000; | |
| 1020 | - margin-right: 10px; | |
| 1021 | - } | |
| 1022 | - span { | |
| 1023 | - // font-size: 24px; | |
| 1024 | - font-size: 27px !important; | |
| 1025 | - } | |
| 1026 | - } | |
| 1027 | - } | |
| 1028 | - } | |
| 1029 | - } | |
| 1030 | - .base { | |
| 1031 | - padding: 28px 24px; | |
| 1032 | - img { | |
| 1033 | - width: 98px; | |
| 1034 | - height: 98px; | |
| 1035 | - display: inline-block; | |
| 1036 | - vertical-align: top; | |
| 1037 | - border-radius: 12px; | |
| 1038 | - } | |
| 1039 | - .center { | |
| 1040 | - width: 550px; | |
| 1041 | - display: inline-block; | |
| 1042 | - margin-left: 20px; | |
| 1043 | - .basename { | |
| 1044 | - // font-size: 32px; | |
| 1045 | - font-size: 35px !important; | |
| 1046 | - font-weight: bold; | |
| 1047 | - } | |
| 1048 | - .address { | |
| 1049 | - // font-size: 24px; | |
| 1050 | - font-size: 27px !important; | |
| 1051 | - margin-top: 12px; | |
| 1052 | - } | |
| 1053 | - .tag { | |
| 1054 | - display: inline-block; | |
| 1055 | - // font-size: 24px; | |
| 1056 | - font-size: 26px !important; | |
| 1057 | - margin-top: 14px; | |
| 1058 | - background: #f5f6fa; | |
| 1059 | - border-radius: 6px; | |
| 1060 | - padding: 6px 20px; | |
| 1061 | - } | |
| 1062 | - } | |
| 1063 | - } | |
| 1064 | - .top_border { | |
| 1065 | - border-top: 16px solid #f6f7fa; | |
| 1066 | - ::v-deep .van-tab { | |
| 1067 | - .van-tab__text { | |
| 1068 | - font-size: 34px !important; | |
| 1069 | - } | |
| 1070 | - } | |
| 1071 | - } | |
| 1072 | - .popup_content { | |
| 1073 | - width: 408px; | |
| 1074 | - height: 346px; | |
| 1075 | - overflow: hidden; | |
| 1076 | - img { | |
| 1077 | - display: block; | |
| 1078 | - width: 86px; | |
| 1079 | - height: 86px; | |
| 1080 | - margin: 0 auto; | |
| 1081 | - margin-top: 64px; | |
| 1082 | - } | |
| 1083 | - p:first-of-type { | |
| 1084 | - text-align: center; | |
| 1085 | - margin-top: 46px; | |
| 1086 | - // font-size: 36px; | |
| 1087 | - font-size: 39px !important; | |
| 1088 | - } | |
| 1089 | - p:last-of-type { | |
| 1090 | - text-align: center; | |
| 1091 | - margin-top: 16px; | |
| 1092 | - // font-size: 26px; | |
| 1093 | - font-size: 29px !important; | |
| 1094 | - color: #999; | |
| 1095 | - } | |
| 1096 | - } | |
| 1097 | - .Collection { | |
| 1098 | - background-color: white; | |
| 1099 | - position: fixed; | |
| 1100 | - bottom: 0; | |
| 1101 | - left: 0; | |
| 1102 | - width: 100%; | |
| 1103 | - padding: 28px 22px; | |
| 1104 | - box-sizing: border-box; | |
| 1105 | - padding-bottom: 50px; | |
| 1106 | - z-index: 500; | |
| 1107 | - box-shadow: 0px 4px 8px 0px rgba(0, 0, 0, 0.34); | |
| 1108 | - .box1 { | |
| 1109 | - width: 40%; | |
| 1110 | - } | |
| 1111 | - .box2 { | |
| 1112 | - width: 60%; | |
| 1113 | - } | |
| 1114 | - .box { | |
| 1115 | - display: inline-block; | |
| 1116 | - vertical-align: middle; | |
| 1117 | - color: #666666; | |
| 1118 | - .icon { | |
| 1119 | - display: inline-block; | |
| 1120 | - width: 45%; | |
| 1121 | - text-align: center; | |
| 1122 | - // font-size: 24px; | |
| 1123 | - font-size: 26px !important; | |
| 1124 | - p { | |
| 1125 | - // margin: 0; | |
| 1126 | - color: #999999; | |
| 1127 | - margin-top: 8px; | |
| 1128 | - } | |
| 1129 | - i { | |
| 1130 | - font-size: 48px; | |
| 1131 | - color: rgb(45, 45, 45); | |
| 1132 | - font-weight: bold; | |
| 1133 | - } | |
| 1134 | - } | |
| 1135 | - .icon.active { | |
| 1136 | - color: 0ce39d; | |
| 1137 | - i { | |
| 1138 | - color: #0ce39d; | |
| 1139 | - } | |
| 1140 | - } | |
| 1141 | - span { | |
| 1142 | - display: inline-block; | |
| 1143 | - width: 100%; | |
| 1144 | - line-height: 92px; | |
| 1145 | - box-sizing: border-box; | |
| 1146 | - border-radius: 100px; | |
| 1147 | - color: white; | |
| 1148 | - // font-size: 32px; | |
| 1149 | - font-size: 35px !important; | |
| 1150 | - background: #4092ff; | |
| 1151 | - text-align: center; | |
| 1152 | - box-shadow: 0px 10px 40px 0px #a0c9ff; | |
| 1153 | - b { | |
| 1154 | - display: inline-block; | |
| 1155 | - vertical-align: middle; | |
| 1156 | - margin-left: 20px; | |
| 1157 | - color: white; | |
| 1158 | - } | |
| 1159 | - i { | |
| 1160 | - vertical-align: middle; | |
| 1161 | - font-size: 44px; | |
| 1162 | - font-weight: bold; | |
| 1163 | - } | |
| 1164 | - } | |
| 1165 | - .disabled { | |
| 1166 | - color: #999; | |
| 1167 | - background: #edeced; | |
| 1168 | - box-shadow: none; | |
| 1169 | - } | |
| 1170 | - } | |
| 1171 | - } | |
| 1172 | - .pintuan_about { | |
| 1173 | - width: 592px; | |
| 1174 | - box-sizing: border-box; | |
| 1175 | - padding: 0 50px; | |
| 1176 | - .about_img { | |
| 1177 | - width: 112px; | |
| 1178 | - margin: 0 auto; | |
| 1179 | - margin-top: 30px; | |
| 1180 | - display: block; | |
| 1181 | - } | |
| 1182 | - .about_title { | |
| 1183 | - font-size: 34px; | |
| 1184 | - font-weight: bold; | |
| 1185 | - text-align: center; | |
| 1186 | - } | |
| 1187 | - .about_content { | |
| 1188 | - font-size: 30px; | |
| 1189 | - margin-top: 20px; | |
| 1190 | - } | |
| 1191 | - .about_know { | |
| 1192 | - font-size: 32px; | |
| 1193 | - text-align: center; | |
| 1194 | - color: #3385ff; | |
| 1195 | - margin-top: 60px; | |
| 1196 | - margin-bottom: 44px; | |
| 1197 | - } | |
| 1198 | - } | |
| 1199 | - .show_tip_title { | |
| 1200 | - img { | |
| 1201 | - width: 112px; | |
| 1202 | - } | |
| 1203 | - p { | |
| 1204 | - margin-top: -20px; | |
| 1205 | - margin-bottom: 20px; | |
| 1206 | - } | |
| 1207 | - } | |
| 1208 | - .show_tip { | |
| 1209 | - padding: 0 20px; | |
| 1210 | - font-size: 28px; | |
| 1211 | - letter-spacing: 1px; | |
| 1212 | - text-align: left; | |
| 1213 | - line-height: 64px; | |
| 1214 | - color: rgb(153, 153, 153); | |
| 1215 | - b { | |
| 1216 | - color: #000; | |
| 1217 | - } | |
| 1218 | - } | |
| 1219 | - .tip_checkbox{ | |
| 1220 | - font-size: 26px; | |
| 1221 | - margin-top: 24px; | |
| 1222 | - margin-bottom: 60px; | |
| 1223 | - margin-left: 50px; | |
| 1224 | - } | |
| 1225 | -} | |
| 1226 | -</style> | |
| 1227 | -<style lang="scss"> | |
| 1228 | -.elder { | |
| 1229 | - .abroad_detail { | |
| 1230 | - .countDown { | |
| 1231 | - height: auto; | |
| 1232 | - .countDownTop { | |
| 1233 | - display: block; | |
| 1234 | - font-size: 40px; | |
| 1235 | - .countDownTime { | |
| 1236 | - font-size: 40px; | |
| 1237 | - padding: 10px 0; | |
| 1238 | - div { | |
| 1239 | - width: 60px; | |
| 1240 | - } | |
| 1241 | - .countDownFont { | |
| 1242 | - line-height: 60px; | |
| 1243 | - } | |
| 1244 | - } | |
| 1245 | - } | |
| 1246 | - .countDownBottom { | |
| 1247 | - display: block; | |
| 1248 | - font-size: 40px; | |
| 1249 | - .countDownBottomyellow { | |
| 1250 | - height: 60px; | |
| 1251 | - font-size: 40px; | |
| 1252 | - } | |
| 1253 | - } | |
| 1254 | - } | |
| 1255 | - .uni_text { | |
| 1256 | - .course_price { | |
| 1257 | - font-size: 48px; | |
| 1258 | - .redmini, | |
| 1259 | - .tint { | |
| 1260 | - font-size: 36px; | |
| 1261 | - } | |
| 1262 | - } | |
| 1263 | - .course_name { | |
| 1264 | - font-size: 44px; | |
| 1265 | - } | |
| 1266 | - .course_info { | |
| 1267 | - font-size: 40px; | |
| 1268 | - } | |
| 1269 | - .address { | |
| 1270 | - font-size: 40px; | |
| 1271 | - } | |
| 1272 | - .rate > span { | |
| 1273 | - font-size: 36px; | |
| 1274 | - } | |
| 1275 | - .tag_box .tag { | |
| 1276 | - font-size: 40px; | |
| 1277 | - } | |
| 1278 | - } | |
| 1279 | - .package { | |
| 1280 | - .package_title { | |
| 1281 | - font-size: 44px; | |
| 1282 | - } | |
| 1283 | - .package_item { | |
| 1284 | - .date { | |
| 1285 | - font-size: 40px; | |
| 1286 | - } | |
| 1287 | - .week { | |
| 1288 | - font-size: 34px; | |
| 1289 | - } | |
| 1290 | - .price { | |
| 1291 | - font-size: 34px; | |
| 1292 | - } | |
| 1293 | - } | |
| 1294 | - } | |
| 1295 | - .content_box .content_all { | |
| 1296 | - font-size: 40px !important; | |
| 1297 | - line-height: 60px !important; | |
| 1298 | - } | |
| 1299 | - .tag_item { | |
| 1300 | - .tag_title { | |
| 1301 | - font-size: 44px; | |
| 1302 | - } | |
| 1303 | - .tag_text { | |
| 1304 | - font-size: 40px !important; | |
| 1305 | - line-height: 60px !important; | |
| 1306 | - } | |
| 1307 | - } | |
| 1308 | - .base .center { | |
| 1309 | - .basename { | |
| 1310 | - font-size: 44px !important; | |
| 1311 | - } | |
| 1312 | - .address { | |
| 1313 | - font-size: 40px !important; | |
| 1314 | - } | |
| 1315 | - } | |
| 1316 | - .Collection .box { | |
| 1317 | - span { | |
| 1318 | - font-size: 44px !important; | |
| 1319 | - } | |
| 1320 | - .icon { | |
| 1321 | - font-size: 40px !important; | |
| 1322 | - } | |
| 1323 | - } | |
| 1324 | - .pintuan_about { | |
| 1325 | - .about_title { | |
| 1326 | - font-size: 44px; | |
| 1327 | - } | |
| 1328 | - .about_box { | |
| 1329 | - height: 600px; | |
| 1330 | - overflow: auto; | |
| 1331 | - } | |
| 1332 | - .about_content { | |
| 1333 | - font-size: 36px; | |
| 1334 | - } | |
| 1335 | - .about_know { | |
| 1336 | - font-size: 40px; | |
| 1337 | - } | |
| 1338 | - } | |
| 1339 | - } | |
| 1340 | -} | |
| 1341 | -</style> | |
| 1342 | 345 | \ No newline at end of file | ... | ... | 
src/views/Service/CheckOrder.vue
| ... | ... | @@ -6,7 +6,7 @@ | 
| 6 | 6 | <div> | 
| 7 | 7 | <p class="goods_title">{{showCourseData.course_name}}</p> | 
| 8 | 8 | <p class="package_name">套餐名称:{{selectCombo.comboName}}</p> | 
| 9 | - <p class="count">数量:x{{count}}</p> | |
| 9 | + <p class="count">数量:x{{count}}{{selectComboUnitName}}</p> | |
| 10 | 10 | </div> | 
| 11 | 11 | </div> | 
| 12 | 12 | <div class="bottom"> | 
| ... | ... | @@ -22,7 +22,7 @@ | 
| 22 | 22 | </div> | 
| 23 | 23 | </div> | 
| 24 | 24 | <div class="top_border"> | 
| 25 | - <contact-box :limit="count"></contact-box> | |
| 25 | + <contact-box :limit="count" :people="selectCombo.adultCount" :child="selectCombo.chilCount"></contact-box> | |
| 26 | 26 | </div> | 
| 27 | 27 | <div class="card top_border"> | 
| 28 | 28 | <p>服务承诺和保障</p> | 
| ... | ... | @@ -56,6 +56,7 @@ export default { | 
| 56 | 56 | useCard: '', | 
| 57 | 57 | orderDetail: '', | 
| 58 | 58 | selectCombo: '',//当前套餐信息 | 
| 59 | + selectComboUnitName:'',//套餐单位 人或份 | |
| 59 | 60 | showCourseData: '',//当前课程的信息 | 
| 60 | 61 | selectCombo: '',//已选择的套餐 | 
| 61 | 62 | userInfo: '',//支付用 | 
| ... | ... | @@ -76,6 +77,7 @@ export default { | 
| 76 | 77 | if (selectCombo) { | 
| 77 | 78 | this.selectCombo = JSON.parse(selectCombo) | 
| 78 | 79 | } | 
| 80 | + this.selectComboUnitName = sessionStorage.getItem('selectComboUnitName') | |
| 79 | 81 | |
| 80 | 82 | // 如果有优惠券,就展示 | 
| 81 | 83 | let useCard = localStorage.getItem('useCard') | 
| ... | ... | @@ -117,11 +119,20 @@ export default { | 
| 117 | 119 | // 出行人数量判断 | 
| 118 | 120 | let selectedContactArr = localStorage.getItem('selectedContactArr'); | 
| 119 | 121 | selectedContactArr = JSON.parse(selectedContactArr); | 
| 120 | - if (selectedContactArr.length != this.count) { | |
| 121 | - this.$toast.fail('请选择与购买商品数量相同的出行人数'); | |
| 122 | + let selAdult = 0; | |
| 123 | + let selChild = 0; | |
| 124 | + for(let i in selectedContactArr){ | |
| 125 | + if(selectedContactArr[i].userType==2){ | |
| 126 | + selAdult++ | |
| 127 | + }else{ | |
| 128 | + selChild++ | |
| 129 | + } | |
| 130 | + } | |
| 131 | + // 判断选择成人和学生数量是否匹配 | |
| 132 | + if(selAdult!=this.count*this.selectCombo.adultCount||selChild!=this.count*this.selectCombo.chilCount){ | |
| 133 | + this.$toast.fail('请选择正确数量的出行人'); | |
| 122 | 134 | return; | 
| 123 | 135 | } | 
| 124 | - | |
| 125 | 136 | // 协议勾选 | 
| 126 | 137 | if (!this.checked) { | 
| 127 | 138 | this.$toast.fail('请先阅读并同意用户协议'); | 
| ... | ... | @@ -163,7 +174,6 @@ export default { | 
| 163 | 174 | // 使用后移除优惠券,防止返回继续使用 | 
| 164 | 175 | localStorage.removeItem('useCard') | 
| 165 | 176 | this.$router.push({ name: 'ServiceOrderXST', query: { active: 1, showChatGroupUrl: 1 } }) | 
| 166 | - | |
| 167 | 177 | } else { | 
| 168 | 178 | // 使用后移除优惠券,防止返回继续使用 | 
| 169 | 179 | localStorage.removeItem('useCard') | ... | ... | 
src/views/Service/DatePackage.vue
| 1 | 1 | <template> | 
| 2 | - <div id="datePackage"> | |
| 2 | + <div id="datePackage" v-if="comboList"> | |
| 3 | 3 | <!-- <div class="tag_item"> | 
| 4 | 4 | <p class="tag_title">商品名称</p> | 
| 5 | 5 | <p class="package_name">{{showCourseData.course_name}}</p> | 
| 6 | 6 | </div> --> | 
| 7 | 7 | <div class="tag_item"> | 
| 8 | - <p class="tag_title">活动日期</p> | |
| 9 | - <p class="package_name" :class="date?'active':''" @click="showCalendar=true">{{date||'选择日期'}}</p> | |
| 8 | + <p class="tag_title">出行时间</p> | |
| 9 | + <p class="package_name" :class="date?'active':''" @click="showCalendar=true">{{date||'选择日期'}}<van-icon name="arrow" /></p> | |
| 10 | 10 | <van-calendar v-model="showCalendar" :default-date="defaultDate" @confirm="chooseDate" :show-confirm="false" color="#3F92FF" :formatter="formatCalendar" /> | 
| 11 | 11 | </div> | 
| 12 | - <div class="tag_item" v-if="comboList[active]"> | |
| 13 | - <p class="tag_title">成团情况<span class="pintuan_status" v-if="comboList[active].clusterName">{{comboList[active].clusterName}}</span></p> | |
| 14 | - <p class="package_name">最低拼团数 {{comboList[active].peopleCount}}人 已报名人数{{numOne}}/{{comboList[active].stockCount}}人</p> | |
| 12 | + <div class="tag_item" v-if="date"> | |
| 13 | + <p class="tag_title">行程选择</p> | |
| 14 | + <div class="period"> | |
| 15 | + <div class="period_item" :class="Index1==index?'active':''" v-for="(item,index) in comboList" :key="index" @click="choosePeriod(index)">行程{{index + 1}} :{{item.dateComboName}}</div> | |
| 16 | + </div> | |
| 15 | 17 | </div> | 
| 16 | - <div class="tag_item"> | |
| 17 | - <p class="tag_title">天数</p> | |
| 18 | - <p class="package_name">{{days}}天</p> | |
| 18 | + <div class="tag_item" v-if="comboList[Index1]"> | |
| 19 | + <p class="tag_title">成团情况<span class="pintuan_status" v-if="comboList[Index1].clusterName">{{comboList[Index1].clusterName}}</span></p> | |
| 20 | + <p class="package_name">最低拼团数 {{comboList[Index1].peopleCount}}{{comboList[Index1].unitName}} 已报名{{comboList[Index1].unitName}}数{{numOne}}/{{comboList[Index1].stockCount}}{{comboList[Index1].unitName}}</p> | |
| 19 | 21 | </div> | 
| 20 | 22 | <div class="tag_item" v-if="date"> | 
| 21 | - <p class="tag_title">套餐</p> | |
| 23 | + <p class="tag_title">套餐类型</p> | |
| 22 | 24 | <div class="period"> | 
| 23 | - <!-- <span class="period_item" :class="active==index?'active':''" v-for="(item,index) in comboList" :key="index" @click="choosePeriod(index)">{{item.comboName}} ¥{{item.actualPrice}}</span> --> | |
| 24 | - <div class="period_item" :class="active==index?'active':''" v-for="(item,index) in comboList" :key="index" @click="choosePeriod(index)">套餐{{index + 1}} :{{item.comboName}} ¥{{item.actualPrice}}</div> | |
| 25 | + <div class="period_item" :class="Index2==index?'active':''" v-for="(item,index) in comboList[Index1].comboInfoList" :key="index" @click="choosePeriod2(index)">套餐{{index + 1}} :{{item.comboName}} ¥{{item.actualPrice}}</div> | |
| 25 | 26 | </div> | 
| 26 | 27 | </div> | 
| 27 | 28 | <div class="tag_item"> | 
| 28 | 29 | <div class="tag_title tag_title_flex"> | 
| 29 | - <span>数量</span> | |
| 30 | + <span>请选择套餐数量</span> | |
| 30 | 31 | <div class="tag_title_right"> | 
| 31 | 32 | <span class="btn" @click="countReduce">-</span> | 
| 32 | 33 | <span class="count">{{count}}</span> | 
| ... | ... | @@ -35,20 +36,26 @@ | 
| 35 | 36 | </div> | 
| 36 | 37 | <div class="package_num"> | 
| 37 | 38 | <span>库存数量({{numSecond}} /</span> | 
| 38 | - <span class="tint">{{numOne+numSecond}})</span> | |
| 39 | + <span class="tint">{{numOne+numSecond}}{{comboList[Index1].unitName}})</span> | |
| 39 | 40 | </div> | 
| 40 | 41 | </div> | 
| 42 | + <p class="package_des" v-if="comboList[Index1].comboInfoList[Index2].comboDescrption">套餐说明<br>{{comboList[Index1].comboInfoList[Index2].comboDescrption}}</p> | |
| 41 | 43 | <div class="Collection"> | 
| 42 | 44 | <div class="box box1"> | 
| 43 | - <p v-if="active>-1&&comboList[active]"><span>¥</span>{{comboList[active].actualPrice*1000*count/1000}} <del>{{comboList[active].productPrice*1000*count/1000}}</del></p> | |
| 45 | + <p><span>¥</span>{{comboList[Index1].comboInfoList[Index2].actualPrice*1000*count/1000}} <del>{{comboList[Index1].comboInfoList[Index2].productPrice*1000*count/1000}}</del></p> | |
| 44 | 46 | </div> | 
| 45 | 47 | <div class="box box2"> | 
| 46 | 48 | <span @click="checkOrder()">去下单</span> | 
| 47 | 49 | </div> | 
| 48 | 50 | </div> | 
| 51 | + | |
| 52 | + <van-popup style="background: transparent;" get-container="body" v-model="showSchool" @close='closeSchool'> | |
| 53 | + <school-add @closeAdd='closeAdd'></school-add> | |
| 54 | + </van-popup> | |
| 49 | 55 | </div> | 
| 50 | 56 | </template> | 
| 51 | 57 | <script> | 
| 58 | +import schoolAdd from '@/views/Travel/component/schoolAdd' | |
| 52 | 59 | export default { | 
| 53 | 60 | name: 'ServiceDatePackage', | 
| 54 | 61 | data () { | 
| ... | ... | @@ -58,12 +65,14 @@ export default { | 
| 58 | 65 | packageData: '', | 
| 59 | 66 | showCourseData: '', | 
| 60 | 67 | comboList: '', | 
| 61 | - active: 0,//选中的排期 | |
| 68 | + Index1: 0,//选中的档期 | |
| 69 | + Index2: 0,//选中的套餐 | |
| 62 | 70 | showCalendar: false, | 
| 63 | 71 | count: 1, | 
| 64 | 72 | days: 1, | 
| 65 | 73 | numOne: 0, | 
| 66 | 74 | numSecond: 0, | 
| 75 | + showSchool: false | |
| 67 | 76 | } | 
| 68 | 77 | }, | 
| 69 | 78 | mounted () { | 
| ... | ... | @@ -93,7 +102,7 @@ export default { | 
| 93 | 102 | }, | 
| 94 | 103 | methods: { | 
| 95 | 104 | // 获取库存 | 
| 96 | - GetOrderPayCount () { | |
| 105 | + GetOrderPayCount (bindId) { | |
| 97 | 106 | let showCourseData = JSON.parse(localStorage.getItem('showCourseData')) | 
| 98 | 107 | this.mgop({ | 
| 99 | 108 | api: 'mgop.sz.hswsy.OrderPayCount', // 必须 | 
| ... | ... | @@ -105,6 +114,7 @@ export default { | 
| 105 | 114 | // 'isTestUrl': '1' | 
| 106 | 115 | }, | 
| 107 | 116 | data: { | 
| 117 | + "bindId":bindId, | |
| 108 | 118 | "productId": showCourseData.id, | 
| 109 | 119 | "startDate": this.date, | 
| 110 | 120 | }, | 
| ... | ... | @@ -147,12 +157,16 @@ export default { | 
| 147 | 157 | }, | 
| 148 | 158 | // 选择排期 | 
| 149 | 159 | choosePeriod (index) { | 
| 150 | - this.active = index; | |
| 151 | - this.days = this.packageData['0'].days ? this.packageData[index].days : 0 | |
| 152 | - let bindId = this.packageData['0'].comboList[index].id ? this.packageData['0'].comboList[index].id : '' | |
| 153 | - let dateBindComboId = this.packageData['0'].comboList[index].dateBindComboId | |
| 160 | + this.Index1 = index; | |
| 161 | + this.Index2 = 0; | |
| 162 | + let bindId = this.comboList[index].id | |
| 163 | + console.log(this.comboList[index]) | |
| 154 | 164 | this.GetOrderPayCount(bindId) | 
| 155 | - this.getSurplusComboCount(dateBindComboId) | |
| 165 | + this.getSurplusComboCount(bindId) | |
| 166 | + }, | |
| 167 | + // 选择套餐 | |
| 168 | + choosePeriod2 (index) { | |
| 169 | + this.Index2 = index; | |
| 156 | 170 | }, | 
| 157 | 171 | // 选择日期 | 
| 158 | 172 | chooseDate (date) { | 
| ... | ... | @@ -167,7 +181,8 @@ export default { | 
| 167 | 181 | return; | 
| 168 | 182 | } | 
| 169 | 183 | this.date = this.Moment(date, 'YYYY-MM-DD').format('YYYY-MM-DD') | 
| 170 | - this.active = 0; | |
| 184 | + this.Index1 = 0; | |
| 185 | + this.Index2 = 0; | |
| 171 | 186 | this.showCalendar = false; | 
| 172 | 187 | this.setComboList() | 
| 173 | 188 | }, | 
| ... | ... | @@ -176,21 +191,21 @@ export default { | 
| 176 | 191 | // console.log(day) | 
| 177 | 192 | for (let i in this.packageData) { | 
| 178 | 193 | if (this.Moment(day.date, 'YYYY-MM-DD').format('YYYY-MM-DD') == this.Moment(this.packageData[i].dayName, 'YYYY-MM-DD').format('YYYY-MM-DD')) { | 
| 179 | - day.bottomInfo = '¥' + this.packageData[i].comboList[0].actualPrice; | |
| 194 | + day.bottomInfo = '¥' + this.packageData[i].comboList[0].comboInfoList[0].actualPrice; | |
| 180 | 195 | } | 
| 181 | 196 | } | 
| 182 | 197 | return day; | 
| 183 | 198 | }, | 
| 184 | 199 | // 根据日期设置套餐 | 
| 185 | 200 | setComboList () { | 
| 186 | - let bindId = this.packageData['0'].comboList['0'].id ? this.packageData['0'].comboList['0'].id : '' | |
| 187 | - let dateBindComboId = this.packageData['0'].comboList['0'].dateBindComboId | |
| 188 | - this.days = this.packageData['0'].days ? this.packageData['0'].days : 0 | |
| 189 | - this.GetOrderPayCount(bindId) | |
| 190 | - this.getSurplusComboCount(dateBindComboId) | |
| 191 | 201 | for (let i in this.packageData) { | 
| 192 | 202 | if (this.Moment(this.packageData[i].dayName, 'YYYY-MM-DD').format(('YYYY-MM-DD')) == this.date) { | 
| 193 | - this.comboList = this.packageData[i].comboList; | |
| 203 | + let comboList = this.packageData[i].comboList; | |
| 204 | + this.comboList = comboList | |
| 205 | + let bindId = comboList[this.Index1].id | |
| 206 | + this.days = this.packageData[i].days | |
| 207 | + this.GetOrderPayCount(bindId) | |
| 208 | + this.getSurplusComboCount(bindId) | |
| 194 | 209 | break; | 
| 195 | 210 | } | 
| 196 | 211 | } | 
| ... | ... | @@ -206,20 +221,28 @@ export default { | 
| 206 | 221 | if (this.count > this.numSecond) { | 
| 207 | 222 | this.$toast('库存不足'); | 
| 208 | 223 | |
| 209 | - } | |
| 210 | - else if (!this.date) { | |
| 211 | - this.$toast('请选择日期'); | |
| 212 | - } else if (this.active == -1) { | |
| 213 | - this.$toast('请选择时间段'); | |
| 214 | 224 | } else { | 
| 215 | 225 | const query = { | 
| 216 | 226 | date: this.date, | 
| 217 | 227 | count: this.count | 
| 218 | 228 | } | 
| 219 | - localStorage.setItem('selectCombo', JSON.stringify(this.comboList[this.active])) | |
| 229 | + localStorage.setItem('selectCombo', JSON.stringify(this.comboList[this.Index1].comboInfoList[this.Index2])) | |
| 230 | + localStorage.setItem('selectComboBindId', JSON.stringify(this.comboList[this.Index1].id)) | |
| 231 | + localStorage.setItem('selectComboUnitName', this.comboList[this.Index1].unitName) | |
| 220 | 232 | this.$router.push({ name: 'ServiceCheckOrder', query: query }) | 
| 221 | 233 | } | 
| 222 | 234 | }, | 
| 235 | + closeSchool () { | |
| 236 | + if (sessionStorage.getItem('schoolNames') == 'undefined' || !sessionStorage.getItem('schoolNames')) { | |
| 237 | + // this.showSchool = true | |
| 238 | + } | |
| 239 | + }, | |
| 240 | + closeAdd () { | |
| 241 | + this.showSchool = false | |
| 242 | + } | |
| 243 | + }, | |
| 244 | + components: { | |
| 245 | + schoolAdd | |
| 223 | 246 | } | 
| 224 | 247 | } | 
| 225 | 248 | </script> | 
| ... | ... | @@ -244,6 +267,8 @@ export default { | 
| 244 | 267 | } | 
| 245 | 268 | } | 
| 246 | 269 | .package_name { | 
| 270 | + display: flex; | |
| 271 | + justify-content: space-between; | |
| 247 | 272 | font-size: 28px; | 
| 248 | 273 | width: 100%; | 
| 249 | 274 | background: #f5f6fa; | 
| ... | ... | @@ -312,6 +337,15 @@ export default { | 
| 312 | 337 | } | 
| 313 | 338 | } | 
| 314 | 339 | } | 
| 340 | + .package_des { | |
| 341 | + margin: 0 24px; | |
| 342 | + margin-top: 28px; | |
| 343 | + padding: 20px 0; | |
| 344 | + font-size: 26px; | |
| 345 | + line-height: 40px; | |
| 346 | + color: #a9a9aa; | |
| 347 | + border-top: 1px solid #e2e7ee; | |
| 348 | + } | |
| 315 | 349 | .Collection { | 
| 316 | 350 | background-color: white; | 
| 317 | 351 | position: fixed; | ... | ... | 
src/views/Service/SelectContact.vue
| ... | ... | @@ -31,10 +31,11 @@ | 
| 31 | 31 | </template> | 
| 32 | 32 | <script> | 
| 33 | 33 | import AddChildPopupGroup from '@/views/Home/component/AddChildPopupGroup' | 
| 34 | +import IdentityCodeValid from '@/common/validateIdent' | |
| 34 | 35 | export default { | 
| 35 | 36 | data () { | 
| 36 | 37 | return { | 
| 37 | - limit: '', | |
| 38 | + limit: '',//数量 | |
| 38 | 39 | hideParent: false, | 
| 39 | 40 | contactList: [], | 
| 40 | 41 | showAddChildPopupGroup: false | 
| ... | ... | @@ -43,7 +44,6 @@ export default { | 
| 43 | 44 | mounted () { | 
| 44 | 45 | this.limit = this.$route.query.limit; | 
| 45 | 46 | this.hideParent = this.$route.query.hideParent ? true : false; | 
| 46 | - console.log(this.hideParent) | |
| 47 | 47 | this.getContactList() | 
| 48 | 48 | }, | 
| 49 | 49 | methods: { | 
| ... | ... | @@ -120,23 +120,21 @@ export default { | 
| 120 | 120 | if ((!contactList[i].travelerIdCard || !contactList[i].gender) && !this.hideParent) { | 
| 121 | 121 | this.$toast('请先完善您选择的出行人信息') | 
| 122 | 122 | return; | 
| 123 | + } else if (!IdentityCodeValid(contactList[i].travelerIdCard)) { | |
| 124 | + this.$toast(`${contactList[i].travelerName}的身份证有误,请重新完善修改`) | |
| 125 | + return; | |
| 123 | 126 | } else { | 
| 124 | 127 | selectedArr.push({ | 
| 125 | 128 | travelerName: contactList[i].travelerName, | 
| 126 | 129 | travelerMobile: contactList[i].travelerMobile, | 
| 127 | 130 | travelerNum: contactList[i].travelerNum, | 
| 128 | - travelerIdCard:contactList[i].travelerIdCard, | |
| 131 | + travelerIdCard: contactList[i].travelerIdCard, | |
| 129 | 132 | userType: contactList[i].userType, | 
| 130 | 133 | }) | 
| 131 | 134 | } | 
| 132 | 135 | } | 
| 133 | 136 | } | 
| 134 | 137 | console.log(this.limit, selectedArr.length) | 
| 135 | - // 判断出行人数是否符合 | |
| 136 | - if (this.limit && this.limit != selectedArr.length) { | |
| 137 | - this.$toast(`请选择${this.limit}位出行人`) | |
| 138 | - return; | |
| 139 | - } | |
| 140 | 138 | // 判断是否选择学生 | 
| 141 | 139 | let hasStudent = false; | 
| 142 | 140 | for (let i in selectedArr) { | ... | ... | 
| ... | ... | @@ -0,0 +1,53 @@ | 
| 1 | +<template> | |
| 2 | + <div class="base_box"> | |
| 3 | + <div class="base top_border" v-if="baseData"> | |
| 4 | + <img v-if="baseData.coverList.length > 0" :src="baseData.coverList[0].cover_url" alt="" /> | |
| 5 | + <div class="center"> | |
| 6 | + <p class="basename">{{ baseData.baseName }}</p> | |
| 7 | + <p class="address"> | |
| 8 | + <van-icon name="location-o" />{{ baseData.city }}{{ baseData.area}}{{ baseData.address }} | |
| 9 | + </p> | |
| 10 | + <p class="tag">{{ baseData.baseLabel.join("/") }}</p> | |
| 11 | + </div> | |
| 12 | + </div> | |
| 13 | + </div> | |
| 14 | +</template> | |
| 15 | +<script> | |
| 16 | +export default { | |
| 17 | + props: ['baseId'], | |
| 18 | + data () { | |
| 19 | + return { | |
| 20 | + baseData: "", //基地信息 | |
| 21 | + } | |
| 22 | + }, | |
| 23 | + mounted () { | |
| 24 | + this.GetOneBase() | |
| 25 | + }, | |
| 26 | + methods: { | |
| 27 | + // 获取单个基地 | |
| 28 | + GetOneBase (baseId) { | |
| 29 | + this.mgop({ | |
| 30 | + api: 'mgop.sz.hswsy.GetOneBase', // 必须 | |
| 31 | + host: 'https://mapi.zjzwfw.gov.cn/', | |
| 32 | + dataType: 'JSON', | |
| 33 | + type: 'GET', | |
| 34 | + appKey: 'fuxgnukl+2001895516+edccpx', // 必须 | |
| 35 | + headers: { | |
| 36 | + // 'isTestUrl': '1' | |
| 37 | + }, | |
| 38 | + data: { | |
| 39 | + "id": baseId, | |
| 40 | + }, | |
| 41 | + onSuccess: res => { | |
| 42 | + if (res.data.data) { | |
| 43 | + this.baseData = res.data.data; | |
| 44 | + } | |
| 45 | + }, | |
| 46 | + onFail: err => { | |
| 47 | + console.log('err', err) | |
| 48 | + } | |
| 49 | + }); | |
| 50 | + }, | |
| 51 | + } | |
| 52 | +} | |
| 53 | +</script> | |
| 0 | 54 | \ No newline at end of file | ... | ... | 
src/views/Service/component/AbroadDetail/AbroadCoupon.vue
0 → 100644
| ... | ... | @@ -0,0 +1,82 @@ | 
| 1 | +<template> | |
| 2 | + <div class="course_coupons" v-if="proCoupon.length>0"> | |
| 3 | + <div> | |
| 4 | + <van-tag v-for="(item,index) in proCoupon" :key="index" color="#ffffff" text-color="#FF2B2B">{{proCouponHas?'已领取:':''}}{{item.title}}</van-tag> | |
| 5 | + </div> | |
| 6 | + <div @click="toCoupons" class="fontBlue">领取 ></div> | |
| 7 | + </div> | |
| 8 | +</template> | |
| 9 | +<script> | |
| 10 | +export default { | |
| 11 | + props: ['detailDataId', 'centerNo'], | |
| 12 | + data () { | |
| 13 | + return { | |
| 14 | + proCoupon: [],//优惠券 | |
| 15 | + proCouponHas: false,//优惠券已领取 | |
| 16 | + } | |
| 17 | + }, | |
| 18 | + mounted () { | |
| 19 | + this.getOrderCoupon() | |
| 20 | + }, | |
| 21 | + methods: { | |
| 22 | + //获取产品可使用优惠券 | |
| 23 | + getOrderCoupon () { | |
| 24 | + this.mgop({ | |
| 25 | + api: 'mgop.sz.hswsy.orderCoupon', // 必须 | |
| 26 | + host: 'https://mapi.zjzwfw.gov.cn/', | |
| 27 | + dataType: 'JSON', | |
| 28 | + type: 'POST', | |
| 29 | + appKey: 'fuxgnukl+2001895516+edccpx', // 必须 | |
| 30 | + headers: { | |
| 31 | + // 'isTestUrl': '1' | |
| 32 | + }, | |
| 33 | + data: { | |
| 34 | + "proId": this.detailDataId, | |
| 35 | + "userId": this.centerNo, | |
| 36 | + }, | |
| 37 | + onSuccess: res => { | |
| 38 | + if (res.data.data) { | |
| 39 | + if (res.data.data.has.length > 0) { | |
| 40 | + this.proCoupon = res.data.data.has | |
| 41 | + localStorage.setItem("proCoupon", JSON.stringify(this.proCoupon)) | |
| 42 | + this.chooseDefaultUseCard(res.data.data.has)//设置默认选中的优惠券 | |
| 43 | + this.proCouponHas = true; | |
| 44 | + } else if (res.data.data.get.length > 0) { | |
| 45 | + this.proCoupon = { | |
| 46 | + title: '您有可领优惠券' | |
| 47 | + } | |
| 48 | + } | |
| 49 | + } | |
| 50 | + }, | |
| 51 | + onFail: err => { | |
| 52 | + console.log('err', err) | |
| 53 | + } | |
| 54 | + }); | |
| 55 | + }, | |
| 56 | + // 设置默认选中的优惠券 | |
| 57 | + chooseDefaultUseCard (has) { | |
| 58 | + if (has.length > 1) { | |
| 59 | + let useCard = has[0]; | |
| 60 | + for (let i in has) { | |
| 61 | + console.log(Number(has[i].couponPrice) > Number(useCard.couponPrice)) | |
| 62 | + if (Number(has[i].couponPrice) > Number(useCard.couponPrice)) { | |
| 63 | + useCard = has[i] | |
| 64 | + } | |
| 65 | + } | |
| 66 | + // console.log('useCard', useCard) | |
| 67 | + this.proCoupon = [useCard] | |
| 68 | + sessionStorage.setItem('useCard', JSON.stringify(useCard)) | |
| 69 | + | |
| 70 | + } else { | |
| 71 | + sessionStorage.setItem('useCard', JSON.stringify(this.proCoupon[0])) | |
| 72 | + } | |
| 73 | + }, | |
| 74 | + //领券 | |
| 75 | + toCoupons () { | |
| 76 | + this.$router.push({ | |
| 77 | + name: "CardBoxXST", | |
| 78 | + }); | |
| 79 | + }, | |
| 80 | + } | |
| 81 | +} | |
| 82 | +</script> | |
| 0 | 83 | \ No newline at end of file | ... | ... | 
| ... | ... | @@ -0,0 +1,157 @@ | 
| 1 | +<template> | |
| 2 | + <div class="abroad_des"> | |
| 3 | + <van-tabs class="tabs top_border" v-model="active" swipeable :ellipsis="false" color="#4092FF" scrollspy sticky> | |
| 4 | + <van-tab title="产品详情"> | |
| 5 | + <div class="tag_item" v-if="detailData.productFeatures"> | |
| 6 | + <p class="tag_title">产品特色</p> | |
| 7 | + <p class="tag_text" v-html="detailData.productFeatures"></p> | |
| 8 | + </div> | |
| 9 | + <div class="tag_item" v-if="detailData.productDescription"> | |
| 10 | + <p class="tag_title">产品描述</p> | |
| 11 | + <div class="content_box"> | |
| 12 | + <div class="content_all" :class="isOpen ? 'open' : ''"> | |
| 13 | + <p v-html="detailData.productDescription"></p> | |
| 14 | + </div> | |
| 15 | + </div> | |
| 16 | + </div> | |
| 17 | + <div class="tag_item" v-if=" | |
| 18 | + detailData.courseContentList && | |
| 19 | + detailData.courseContentList[0].content != '' | |
| 20 | + "> | |
| 21 | + <p class="tag_title">服务内容</p> | |
| 22 | + <ul class="courseContent"> | |
| 23 | + <li v-for="(n, i) in detailData.courseContentList" :key="n.id"> | |
| 24 | + <span class="left" v-if="n.title">{{ n.title }}</span> | |
| 25 | + <h3>{{ n.content }}</h3> | |
| 26 | + <div class="item" v-for="(k, j) in n.courseFileList" :key="i + '' + j"> | |
| 27 | + <div> | |
| 28 | + <video v-if="k.url && k.url.indexOf('.mp4') > -1" id="video" :src="k.url" poster="" controls="controls" windowlessvideo="true" playsinline="true" webkit-playsinline="true" x5-playsinline="true" x-webkit-airplay="allow" width="100%" height="260px" type="video/mp4"></video> | |
| 29 | + </div> | |
| 30 | + <div> | |
| 31 | + <img v-if="k.url && k.url.indexOf('.mp4') == -1" :src="k.url" /> | |
| 32 | + </div> | |
| 33 | + </div> | |
| 34 | + </li> | |
| 35 | + </ul> | |
| 36 | + </div> | |
| 37 | + <div class="tag_item" v-if="courseTable.length > 0 && showCourseTable"> | |
| 38 | + <p class="tag_title">课程表</p> | |
| 39 | + <div class="cardCont" v-for="(item, index) in courseTable" :key="index"> | |
| 40 | + <table cellspacing="0" cellpadding="8"> | |
| 41 | + <tbody v-html="item"></tbody> | |
| 42 | + </table> | |
| 43 | + </div> | |
| 44 | + </div> | |
| 45 | + <div class="tag_item" v-if="detailData.extraService"> | |
| 46 | + <p class="tag_title">附送服务</p> | |
| 47 | + <p class="tag_text" v-html="detailData.extraService"></p> | |
| 48 | + </div> | |
| 49 | + <div class="tag_item" v-if="detailData.serviceGuarantees"> | |
| 50 | + <p class="tag_title">服务保障和承诺</p> | |
| 51 | + <p class="tag_text" v-html="detailData.serviceGuarantees"></p> | |
| 52 | + </div> | |
| 53 | + </van-tab> | |
| 54 | + <van-tab title="费用说明" v-if="detailData.feeDescription"> | |
| 55 | + <div class="tag_item"> | |
| 56 | + <p class="tag_title">费用说明</p> | |
| 57 | + <p class="tag_text" v-html="detailData.feeDescription"></p> | |
| 58 | + </div> | |
| 59 | + </van-tab> | |
| 60 | + <van-tab title="订购须知" v-if="detailData.notice"> | |
| 61 | + <div class="tag_item"> | |
| 62 | + <p class="tag_title">订购须知</p> | |
| 63 | + <p class="tag_text" v-html="detailData.notice"></p> | |
| 64 | + </div> | |
| 65 | + </van-tab> | |
| 66 | + </van-tabs> | |
| 67 | + </div> | |
| 68 | +</template> | |
| 69 | +<script> | |
| 70 | +export default { | |
| 71 | + props: ['detailData'], | |
| 72 | + data () { | |
| 73 | + return { | |
| 74 | + courseTable: [], //课程表 | |
| 75 | + active: 0, | |
| 76 | + isOpen: true, | |
| 77 | + showCourseTable:true | |
| 78 | + } | |
| 79 | + }, | |
| 80 | + mounted () { | |
| 81 | + for (let i in this.detailData.courseScheduleList) { | |
| 82 | + this.getWeekCard(i); | |
| 83 | + } | |
| 84 | + }, | |
| 85 | + methods: { | |
| 86 | + // 设置第几天的课程表 | |
| 87 | + getWeekCard (index) { | |
| 88 | + var data = this.detailData.courseScheduleList[index].courseScheduleList; | |
| 89 | + var morning = []; | |
| 90 | + var afternoon = []; | |
| 91 | + var night = []; | |
| 92 | + data.forEach(function (k, j) { | |
| 93 | + if (k.type == 1 && k.content != "") { | |
| 94 | + morning.push(k); | |
| 95 | + } else if (k.type == 2 && k.content != "") { | |
| 96 | + afternoon.push(k); | |
| 97 | + } else if (k.type == 3 && k.content != "") { | |
| 98 | + night.push(k); | |
| 99 | + } | |
| 100 | + }); | |
| 101 | + if (morning.length == 0 && afternoon.length == 0 && night.length == 0) { | |
| 102 | + this.showCourseTable = false; | |
| 103 | + } | |
| 104 | + var strMorning = "", | |
| 105 | + strAfternoon = "", | |
| 106 | + strNight = ""; | |
| 107 | + if (morning.length > 0) { | |
| 108 | + strMorning = `<tr> | |
| 109 | + <td class="td_left" rowspan="${morning.length}">上午</td> | |
| 110 | + <td style="text-align: left;">${morning[0].content ? morning[0].content : "无安排" | |
| 111 | + }</td> | |
| 112 | + </tr>`; | |
| 113 | + morning.forEach(function (k, j) { | |
| 114 | + if (j > 0) { | |
| 115 | + strMorning += `<tr> | |
| 116 | + <td style="text-align: left;">${k.content ? k.content : "无安排"}</td> | |
| 117 | + </tr>`; | |
| 118 | + } | |
| 119 | + }); | |
| 120 | + } | |
| 121 | + if (afternoon.length > 0) { | |
| 122 | + strAfternoon = `<tr> | |
| 123 | + <td class="td_left" rowspan="${afternoon.length}">下午</td> | |
| 124 | + <td style="text-align: left;">${afternoon[0].content ? afternoon[0].content : "无安排" | |
| 125 | + }</td> | |
| 126 | + </tr>`; | |
| 127 | + afternoon.forEach(function (k, j) { | |
| 128 | + if (j > 0) { | |
| 129 | + strAfternoon += `<tr> | |
| 130 | + <td style="text-align: left;">${k.content ? k.content : "无安排"}</td> | |
| 131 | + </tr>`; | |
| 132 | + } | |
| 133 | + }); | |
| 134 | + } | |
| 135 | + if (night.length > 0) { | |
| 136 | + strNight = `<tr> | |
| 137 | + <td class="td_left" rowspan="${night.length}">晚上</td> | |
| 138 | + <td style="text-align: left;">${night[0].content ? night[0].content : "无安排" | |
| 139 | + }</td> | |
| 140 | + </tr>`; | |
| 141 | + night.forEach(function (k, j) { | |
| 142 | + if (j > 0) { | |
| 143 | + strNight += `<tr> | |
| 144 | + <td style="text-align: left;">${k.content ? k.content : "无安排"}</td> | |
| 145 | + </tr>`; | |
| 146 | + } | |
| 147 | + }); | |
| 148 | + } | |
| 149 | + this.courseTable.push(strMorning + strAfternoon + strNight); | |
| 150 | + }, | |
| 151 | + // 展开关闭院校简介 | |
| 152 | + extend_btn () { | |
| 153 | + this.isOpen = !this.isOpen; | |
| 154 | + }, | |
| 155 | + } | |
| 156 | +} | |
| 157 | +</script> | |
| 0 | 158 | \ No newline at end of file | ... | ... | 
src/views/Service/component/AbroadDetail/AbroadEvaluate.vue
0 → 100644
| ... | ... | @@ -0,0 +1,56 @@ | 
| 1 | +<template> | |
| 2 | + <div class="abroad_evaluate"> | |
| 3 | + <div class="rate" @click="handleEvaluate"> | |
| 4 | + <div> | |
| 5 | + <van-rate v-model="evaluationData.evaluationScore" color="#FFCC00" :size="16" readonly /> | |
| 6 | + <span>{{ evaluationData.evaluationScore }}</span> | |
| 7 | + </div> | |
| 8 | + <span>共{{evaluationData.evaluationCount}}个客户评价 | |
| 9 | + <van-icon name="arrow" /> | |
| 10 | + </span> | |
| 11 | + </div> | |
| 12 | + </div> | |
| 13 | +</template> | |
| 14 | +<script> | |
| 15 | +export default { | |
| 16 | + props:['courseId'], | |
| 17 | + data(){ | |
| 18 | + return{ | |
| 19 | + evaluationData: '',//评价 | |
| 20 | + } | |
| 21 | + }, | |
| 22 | + mounted(){ | |
| 23 | + this.getEvaluationSummary() | |
| 24 | + }, | |
| 25 | + methods:{ | |
| 26 | + // 获取评价 | |
| 27 | + getEvaluationSummary () { | |
| 28 | + this.mgop({ | |
| 29 | + api: 'mgop.sz.hswsy.EvaluationSummary', // 必须 | |
| 30 | + host: 'https://mapi.zjzwfw.gov.cn/', | |
| 31 | + dataType: 'JSON', | |
| 32 | + type: 'GET', | |
| 33 | + appKey: 'fuxgnukl+2001895516+edccpx', // 必须 | |
| 34 | + headers: { | |
| 35 | + // 'isTestUrl': '1' | |
| 36 | + }, | |
| 37 | + data: { | |
| 38 | + "courseId": this.courseId, | |
| 39 | + }, | |
| 40 | + onSuccess: res => { | |
| 41 | + if (res.data.data) { | |
| 42 | + this.evaluationData = res.data.data | |
| 43 | + } | |
| 44 | + }, | |
| 45 | + onFail: err => { | |
| 46 | + console.log('err', err) | |
| 47 | + } | |
| 48 | + }); | |
| 49 | + }, | |
| 50 | + // 点击评价进入评价详情页 | |
| 51 | + handleEvaluate () { | |
| 52 | + this.$router.push({ name: "ServiceAbroadEvaluate", query: { courseId: this.courseId } }); | |
| 53 | + }, | |
| 54 | + } | |
| 55 | +} | |
| 56 | +</script> | |
| 0 | 57 | \ No newline at end of file | ... | ... | 
| ... | ... | @@ -0,0 +1,146 @@ | 
| 1 | +<template> | |
| 2 | + <div class="count_down"> | |
| 3 | + <div class="countDown" v-show="detailData.clusterTime "> | |
| 4 | + <div class="countDownTop"> | |
| 5 | + <div>{{day}} {{detailData.applyCount>=detailData.minPeopleCount?'报名截止时间:':'团期截止倒计时'}}</div> | |
| 6 | + <div v-if="detailData.applyCount>=detailData.minPeopleCount||timeTamp * 1 < 0">{{detailData.periodOfValidity}}</div> | |
| 7 | + <div class="countDownTime" v-else> | |
| 8 | + <div class="countDownFont">{{ showTime.day }}</div> | |
| 9 | + 天 | |
| 10 | + <div class="countDownFont">{{ showTime.hour }}</div> | |
| 11 | + 时 | |
| 12 | + <div class="countDownFont">{{ showTime.minute }}</div> | |
| 13 | + 分 | |
| 14 | + <div class="countDownFont">{{ showTime.second }}</div> | |
| 15 | + 秒 | |
| 16 | + </div> | |
| 17 | + </div> | |
| 18 | + <!-- <div class="countDownTop" v-else> | |
| 19 | + <div>{{day}}</div> | |
| 20 | + </div> --> | |
| 21 | + <div class="countDownBottom"> | |
| 22 | + <div> | |
| 23 | + <div class="countDownBottomyellow" v-show="detailData.minPeopleCount"> | |
| 24 | + {{ detailData.clusterName }} | |
| 25 | + </div> | |
| 26 | + <span v-if="detailData.applyCount>=detailData.minPeopleCount">已报名 {{detailData.applyCount}}/{{detailData.stockCount}}{{detailData.unitName}}</span> | |
| 27 | + <span v-else>最低成团数{{detailData.minPeopleCount}}{{detailData.unitName}}/已报名{{detailData.applyCount}}{{detailData.unitName}}</span> | |
| 28 | + <!-- 已报名:<span>{{ detailData.applyCount }}</span><span>/{{ detailData.stockCount }}</span> --> | |
| 29 | + </div> | |
| 30 | + <div class="countDownAbout" @click="showPintuanAbout=true">关于拼团?</div> | |
| 31 | + </div> | |
| 32 | + </div> | |
| 33 | + <van-popup v-model="showPintuanAbout" round> | |
| 34 | + <div class="pintuan_about"> | |
| 35 | + <img class="about_img" src="@/assets/service/tip.png" alt=""> | |
| 36 | + <p class="about_title">拼团规则说明</p> | |
| 37 | + <p class="about_content">1、拼团展示默认为最近活动档期,选择其它档期请时刻注意成团动态。</p> | |
| 38 | + <p class="about_content">2、在限时截止后,报名人数未达最低成团数,则结束本团活动,系统将在72小时内,全额退还!</p> | |
| 39 | + <p class="about_content">3、报名人数达到最低成团要求后,则拼团成功,凡在报名截止时间内未达最大限团人数,则可放心参与。</p> | |
| 40 | + <p class="about_content">4、已成团的活动,除特殊情况等不可抗拒因素外,活动如期举行。</p> | |
| 41 | + <p class="about_know" @click="showPintuanAbout=false">我知道了</p> | |
| 42 | + </div> | |
| 43 | + </van-popup> | |
| 44 | + </div> | |
| 45 | +</template> | |
| 46 | +<script> | |
| 47 | +export default { | |
| 48 | + props: ['day','productId', 'packageArr', 'bindId', 'comboId'], | |
| 49 | + data () { | |
| 50 | + return { | |
| 51 | + timeTamp: "", | |
| 52 | + showTime: { | |
| 53 | + day: "", | |
| 54 | + hour: "", | |
| 55 | + minute: "", | |
| 56 | + second: "", | |
| 57 | + }, | |
| 58 | + showPintuanAbout: false, | |
| 59 | + detailData: '' | |
| 60 | + } | |
| 61 | + }, | |
| 62 | + watch: { | |
| 63 | + bindId (oldVal, newVal) { | |
| 64 | + this.getDateInfoById() | |
| 65 | + }, | |
| 66 | + comboId (oldVal, newVal) { | |
| 67 | + this.getDateInfoById() | |
| 68 | + }, | |
| 69 | + }, | |
| 70 | + mounted () { | |
| 71 | + // console.log(this.detailData) | |
| 72 | + // console.log(this.packageArr) | |
| 73 | + this.getDateInfoById() | |
| 74 | + | |
| 75 | + }, | |
| 76 | + methods: { | |
| 77 | + // 根据选择的档期显示成团状态 | |
| 78 | + getDateInfoById () { | |
| 79 | + const productId = this.productId | |
| 80 | + const bindId = this.bindId | |
| 81 | + const comboId = this.comboId | |
| 82 | + // console.log(productId, bindId, comboId) | |
| 83 | + this.mgop({ | |
| 84 | + api: 'mgop.sz.hswsy.DateInfoById', // 必须 | |
| 85 | + host: 'https://mapi.zjzwfw.gov.cn/', | |
| 86 | + dataType: 'JSON', | |
| 87 | + type: 'GET', | |
| 88 | + appKey: 'fuxgnukl+2001895516+edccpx', // 必须 | |
| 89 | + headers: { | |
| 90 | + // 'isTestUrl': '1' | |
| 91 | + }, | |
| 92 | + data: { | |
| 93 | + "productId": productId, | |
| 94 | + "bindId": bindId, | |
| 95 | + "comboId": comboId, | |
| 96 | + }, | |
| 97 | + onSuccess: res => { | |
| 98 | + console.log('套餐列表:', res.data.data); | |
| 99 | + if (res.data.data) { | |
| 100 | + this.detailData = res.data.data | |
| 101 | + let timer = setInterval(() => { | |
| 102 | + this.timeDown(); //倒计时 | |
| 103 | + }, 1000); | |
| 104 | + this.$once("hook:beforeDestroy", () => { | |
| 105 | + clearInterval(timer); //清理定时器 | |
| 106 | + console.log('清理定时器') | |
| 107 | + }); | |
| 108 | + } | |
| 109 | + }, | |
| 110 | + onFail: err => { | |
| 111 | + console.log('err', err) | |
| 112 | + } | |
| 113 | + }); | |
| 114 | + }, | |
| 115 | + //倒计时计算 | |
| 116 | + timeDown () { | |
| 117 | + var clusterTime = Date.parse(new Date(this.detailData.clusterTime.replace(/\-/g, "/"))) + 60 * 60 * 24 * 1000; | |
| 118 | + var nowTime = Date.parse(new Date()); | |
| 119 | + let timeTamp = clusterTime / 1000 - nowTime / 1000; | |
| 120 | + // console.log(timeTamp) | |
| 121 | + this.timeTamp = timeTamp; | |
| 122 | + // console.log(timeTamp) | |
| 123 | + let k = this.calculateDiffTime(timeTamp); | |
| 124 | + // console.log(k) | |
| 125 | + }, | |
| 126 | + calculateDiffTime (timeDiff) { | |
| 127 | + var day = parseInt(timeDiff / 86400); | |
| 128 | + var hour = parseInt((timeDiff % 86400) / 3600); | |
| 129 | + var minute = parseInt(((timeDiff % 86400) % 3600) / 60); | |
| 130 | + var second = parseInt((((timeDiff % 86400) % 3600) % 60) % 60); | |
| 131 | + | |
| 132 | + this.showTime = { | |
| 133 | + day, | |
| 134 | + hour, | |
| 135 | + minute, | |
| 136 | + second, | |
| 137 | + }; | |
| 138 | + day = day ? day + "天" : ""; | |
| 139 | + hour = hour ? hour + "时" : ""; | |
| 140 | + minute = minute ? minute + "分" : ""; | |
| 141 | + second = second ? second + "秒" : ""; | |
| 142 | + return day + hour + minute + second; | |
| 143 | + }, | |
| 144 | + } | |
| 145 | +} | |
| 146 | +</script> | |
| 0 | 147 | \ No newline at end of file | ... | ... | 
src/views/Service/component/ContactBox.vue
| ... | ... | @@ -2,25 +2,26 @@ | 
| 2 | 2 | <div class="contact_box"> | 
| 3 | 3 | <div class="flex_box"> | 
| 4 | 4 | <p class="contact_title">出行人</p> | 
| 5 | - <span class="contact_count">需添加{{limit}}位出行人</span> | |
| 5 | + <span class="contact_count" v-if="people*limit">需添加{{child*limit}}位学生,{{people*limit}}位家长</span> | |
| 6 | + <span class="contact_count" v-else>只需添加{{child*limit}}位学生</span> | |
| 6 | 7 | <span class="contact_btn" @click="enterSelectContact">选择出行人</span> | 
| 7 | 8 | </div> | 
| 8 | 9 | <p class="tip"> | 
| 9 | - <van-icon class="icon" name="warning" /> | |
| 10 | + <van-icon class="icon" name="warning" /> | |
| 10 | 11 | 填写项须与出游所持证件保持一致 | 
| 11 | 12 | </p> | 
| 12 | - <div class="contact_item" v-for="(item,index) in selectedContactArr" :key="index"> | |
| 13 | - <van-icon class="close" name="close" @click="delContact(index)" /> | |
| 14 | - <div class="info"> | |
| 15 | - <p class="name">{{item.travelerName}}</p> | |
| 16 | - <p class="cardid">身份证{{item.travelerIdCard}}</p> | |
| 17 | - </div> | |
| 13 | + <div class="contact_item" v-for="(item,index) in selectedContactArr" :key="index"> | |
| 14 | + <van-icon class="close" name="close" @click="delContact(index)" /> | |
| 15 | + <div class="info"> | |
| 16 | + <p class="name">{{item.travelerName}}<span>{{item.userType==1?"学生":"家长"}}</span></p> | |
| 17 | + <p class="cardid">身份证{{item.travelerIdCard}}</p> | |
| 18 | 18 | </div> | 
| 19 | 19 | </div> | 
| 20 | + </div> | |
| 20 | 21 | </template> | 
| 21 | 22 | <script> | 
| 22 | 23 | export default { | 
| 23 | - props: ["limit"], | |
| 24 | + props: ["limit", "people", "child"], | |
| 24 | 25 | data () { | 
| 25 | 26 | return { | 
| 26 | 27 | selectedContactArr: [],//选择的出行人 | 
| ... | ... | @@ -42,7 +43,7 @@ export default { | 
| 42 | 43 | // 删除联系人 | 
| 43 | 44 | delContact (index) { | 
| 44 | 45 | this.selectedContactArr.splice(index, 1) | 
| 45 | - localStorage.setItem('selectedContactArr',JSON.stringify(this.selectedContactArr)) | |
| 46 | + localStorage.setItem('selectedContactArr', JSON.stringify(this.selectedContactArr)) | |
| 46 | 47 | } | 
| 47 | 48 | } | 
| 48 | 49 | } | 
| ... | ... | @@ -71,19 +72,19 @@ export default { | 
| 71 | 72 | color: #4092ff; | 
| 72 | 73 | font-weight: normal; | 
| 73 | 74 | } | 
| 74 | - .tip{ | |
| 75 | + .tip { | |
| 75 | 76 | padding: 0 22px; | 
| 76 | 77 | margin-bottom: 28px; | 
| 77 | 78 | color: #999; | 
| 78 | - .icon{ | |
| 79 | - color: #FF9604; | |
| 79 | + .icon { | |
| 80 | + color: #ff9604; | |
| 80 | 81 | } | 
| 81 | 82 | } | 
| 82 | 83 | .contact_item { | 
| 83 | 84 | display: flex; | 
| 84 | 85 | align-items: center; | 
| 85 | 86 | justify-content: space-between; | 
| 86 | - border-top: 2px solid #F2F4F9; | |
| 87 | + border-top: 2px solid #f2f4f9; | |
| 87 | 88 | width: 702px; | 
| 88 | 89 | margin: 0 auto; | 
| 89 | 90 | .close { | 
| ... | ... | @@ -98,6 +99,15 @@ export default { | 
| 98 | 99 | .name { | 
| 99 | 100 | font-size: 30px; | 
| 100 | 101 | font-weight: bold; | 
| 102 | + span { | |
| 103 | + display: inline-block; | |
| 104 | + padding: 0 4px; | |
| 105 | + margin-left: 10px; | |
| 106 | + font-size: 22px; | |
| 107 | + font-weight: normal; | |
| 108 | + color: #4092ff; | |
| 109 | + border: 1px solid #e6e9ef; | |
| 110 | + } | |
| 101 | 111 | } | 
| 102 | 112 | .cardid { | 
| 103 | 113 | margin-top: 6px; | ... | ... | 
src/views/Service/component/ServiceListFour.vue
| ... | ... | @@ -30,7 +30,7 @@ | 
| 30 | 30 | <div class="flex_box"> | 
| 31 | 31 | <div> | 
| 32 | 32 | <p class="address">{{item.cityAddress}}{{item.cityAddress&&item.areaAddress?'·':''}}{{item.areaAddress}}</p> | 
| 33 | - <p class="price free"> <span class="limit">{{item.minPeopleCount}}人成团</span></p> | |
| 33 | + <p class="price free"> <span class="limit">{{item.minPeopleCount}}{{item.unitName}}成团</span></p> | |
| 34 | 34 | </div> | 
| 35 | 35 | <div class="pintuan" :class="item.applyCount>=item.stockCount?'disabled':''"> | 
| 36 | 36 | <p>{{item.applyCount>=item.stockCount?'已满团':'拼团中'}}</p> | ... | ... | 
src/views/Service/component/ServiceListSecond.vue
| ... | ... | @@ -28,7 +28,7 @@ | 
| 28 | 28 | </template> | 
| 29 | 29 | </div> | 
| 30 | 30 | <div class="flex_box"> | 
| 31 | - <p class="price" v-if="item.showPrice>0"><span class="icon">¥</span>{{item.showPrice}}<span class="tint">起 </span><span class="limit">/{{item.minPeopleCount}}人成团</span></p> | |
| 31 | + <p class="price" v-if="item.showPrice>0"><span class="icon">¥</span>{{item.showPrice}}<span class="tint">起 </span><span class="limit">/{{item.minPeopleCount}}{{item.unitName}}成团</span></p> | |
| 32 | 32 | <p class="price free" v-else>¥{{item.price}}</p> | 
| 33 | 33 | <span class="count"> | 
| 34 | 34 | <van-icon name="eye-o" /> {{item.read_count}} | ... | ... | 
