会员+驾校联调 #8

Merged
qiushanhe merged 1 commits from dev-qsh into master 1 year ago
  1. 2
      src/components/liu-indexed-list/liu-indexed-list.vue
  2. 10
      src/jtools/api/login.js
  3. 4
      src/jtools/request/index.js
  4. 18
      src/pages/me/index.vue
  5. 56
      src/pages/me/school.vue
  6. 132
      src/pages/me/vip.vue

@ -353,6 +353,6 @@
} }
} }
.actived { .actived {
color: #05C341; color: #05C341 !important;
} }
</style> </style>

@ -27,7 +27,15 @@ export function logout() {
export function getInfo() { export function getInfo() {
return request({ return request({
url: 'driver-api/tdSysUser/info', url: 'driver-api/tdSysUser/queryUserMessage',
method: 'get', method: 'get',
}); });
}
export function bindSchool(data) {
return request({
url: 'driver-api/tdSysUser/bindSchool',
method: 'post',
data
});
} }

@ -26,7 +26,7 @@ function service(options = {}) {
if (res.data.code == 'E403') { if (res.data.code == 'E403') {
// 未登录 // 未登录
uni.showToast({ uni.showToast({
title: res.data.message, title: res?.data?.message || '请重新登录',
icon: 'none' icon: 'none'
}); });
useUserStore().logout() useUserStore().logout()
@ -34,7 +34,7 @@ function service(options = {}) {
resolved(res.data); resolved(res.data);
} else if(res.data.code != '0000') { } else if(res.data.code != '0000') {
uni.showToast({ uni.showToast({
title: res.data.message, title: res?.data?.message || '访问出错',
icon: 'none' icon: 'none'
}) })
resolved(res.data) resolved(res.data)

@ -10,7 +10,7 @@
<text class="mr10">{{ user.userName }}{{user.userId}}</text> <text class="mr10">{{ user.userName }}{{user.userId}}</text>
<image v-if="vipOn.length" src="/static/image/mine/vip.png" mode="widthFix" style="width: 18px;"></image> <image v-if="vipOn.length" src="/static/image/mine/vip.png" mode="widthFix" style="width: 18px;"></image>
</view> </view>
<view class="mt5 fs14 cor-666">陪您学车 {{ user.count }}</view> <view class="mt5 fs14 cor-666">陪您学车 {{ user.days }}</view>
</view> </view>
</view> </view>
<view class="info flex ai-c" v-else @tap="toLogin"> <view class="info flex ai-c" v-else @tap="toLogin">
@ -98,8 +98,7 @@ export default {
return useUserStore().isLogin return useUserStore().isLogin
}, },
user() { user() {
let userInfo = useUserStore().userInfo return useUserStore().userInfo
return { ...userInfo, count: this.dateDiff(userInfo.createTime) }
}, },
vipOn() { vipOn() {
return useUserStore().vipOnList return useUserStore().vipOnList
@ -192,19 +191,6 @@ export default {
handleLogout() { handleLogout() {
useUserStore().logout() useUserStore().logout()
}, },
dateDiff(end){
if(!end) {
return 1
}
today = new Date();
end = new Date(end);
if(end > today){
days = parseInt(Math.abs(end - today) / 1000 / 60 / 60 / 24);
}else{
days = parseInt(Math.abs(end - today) / 1000 / 60 / 60 / 24); // if
}
return days + 1;
},
} }
} }
</script> </script>

@ -1,45 +1,53 @@
<template> <template>
<view> <view>
<IndexList :dataList="dataList" nameKey="schoolName" v-model:current="current" @click="click"></IndexList> <IndexList :dataList="dataList" nameKey="schoolName" idKey="schoolId" v-model:current="current" @click="click"></IndexList>
</view> </view>
</template> </template>
<script> <script>
import IndexList from '@/components/liu-indexed-list/liu-indexed-list.vue' import IndexList from '@/components/liu-indexed-list/liu-indexed-list.vue'
import { bindSchool } from '@/jtools/api/login.js'
import useUserStore from '@/jtools/store/user.js'
export default { export default {
components: { components: {
IndexList IndexList
}, },
data() { data() {
return { return {
current: '1', current: useUserStore().userInfo.schoolId,
dataList: [{ dataList: []
id: '1',
schoolName: '爱尚学车驾校长安分校',
},{
id: '2',
schoolName: '八一驾校',
},{
id: '3',
schoolName: '八零驾校',
},{
id: '4',
schoolName: '畅通驾校',
},{
id: '5',
schoolName: '金灵驾校',
},{
id: '6',
schoolName: '通顺驾校',
}]
} }
}, },
created() {
this._getSchoolOptions()
},
methods: { methods: {
_getSchoolOptions() {
uni.request({
url: 'https://xueche.ahduima.com/duima/applet/school/list'
}).then(resp => {
if(resp.data.code == 200) {
this.dataList = resp.data.data
}
})
},
click() { click() {
// //
const {schoolId,schoolName,phone } = this.dataList.find(it=>it.schoolId == this.current)
// const params = {schoolId, schoolName, schoolPhone: phone}
uni.navigateBack() bindSchool(params).then(resp => {
if(resp.code == '0000') {
useUserStore().userInfo.schoolId = schoolId
useUserStore().userInfo.schoolName = schoolName
useUserStore().userInfo.schoolPhone = phone
uni.showToast({
title: '绑定驾校成功!',
icon: 'none'
})
//
uni.navigateBack()
}
})
} }
} }
} }

@ -2,34 +2,37 @@
<view class="flex fld-c p15"> <view class="flex fld-c p15">
<u-sticky> <u-sticky>
<view class="flex ai-c"> <view class="flex ai-c">
<view v-for="(item,index) in list" :key="index" class="km-item" :class="{ actived: index==current }" <view v-for="(item,index) in vipAllList" :key="index" class="km-item" :class="{ actived: index==current }"
@click="current=index"> @click="current=index">
{{ item.name }} {{ getKmTitle(item.subjects) }}
</view> </view>
</view> </view>
</u-sticky> </u-sticky>
<view class="mt15"> <view class="mt15">
<swiper class="swiper" :current="current" style="height: 120px;" :autoplay="false" :display-multiple-items="1.45" <swiper class="swiper" :current="current" style="height: 120px;" :autoplay="false" :display-multiple-items="1.45"
:disable-programmatic-animation="true" @change="onChange"> :disable-programmatic-animation="true" @change="onChange">
<swiper-item v-for="(item,index) in list" :key="index"> <swiper-item v-for="(item,index) in vipAllList" :key="index">
<view class="relative"> <view class="relative">
<image src="../../static/image/mine/vip_card.png" mode="widthFix" style="width:95%;"></image> <image src="../../static/image/mine/vip_card.png" mode="widthFix" style="width:95%;"></image>
<view class="vip-info"> <view class="vip-info">
<u-avatar class="br-p50 overflow-h" style="border: 3px solid #873E1D;" :size="35" mp-avatar></u-avatar> <u-avatar class="br-p50 overflow-h" style="border: 3px solid #873E1D;" :size="35" mp-avatar></u-avatar>
<view class="ml10"> <view class="ml10">
<view class="fs16 fwb" style="color: #7E4012;line-height: 16px;"> <view class="fs16 fwb" style="color: #7E4012;line-height: 16px;">
{{item.name}}尊享VIP {{item.memberName}}
</view> </view>
<view class="mt5 fs12" style="color: #7E4012;line-height: 12px;"> <view class="mt5 fs12" style="color: #7E4012;line-height: 12px;">
2024-12-12到期 {{getExpireText(item)}}
</view> </view>
</view> </view>
</view> </view>
<view class="corner"> <view v-if="vipHasOpened(item)" class="corner">
VIP已开通 VIP已开通
</view> </view>
<view class="renew"> <view v-if="vipHasOpened(item)" class="renew">
98元立即续费 {{item.price}}元立即续费
</view>
<view v-else class="buy">
立即充值
</view> </view>
</view> </view>
</swiper-item> </swiper-item>
@ -40,10 +43,10 @@
<view class="mt20"> <view class="mt20">
<swiper class="swiper" :current="current" style="height: 300px;" :autoplay="false" <swiper class="swiper" :current="current" style="height: 300px;" :autoplay="false"
:disable-programmatic-animation="true" @change="onChange"> :disable-programmatic-animation="true" @change="onChange">
<swiper-item v-for="(item,index) in list" :key="index"> <swiper-item v-for="(item,index) in vipAllList" :key="index">
<view v-if="index == 0 || index == 3" class="p15 br8 cor-fff"> <view v-if="index == 0 || index == 3" class="p15 br8 cor-fff">
<view class="fs18 cor-000 fwb"> <view class="fs18 cor-000 fwb">
3步轻松学{{item.name}} 3步轻松学{{getKmTitle(item.subjects)}}
</view> </view>
<view class="mt25 flex ai-c jc-sb"> <view class="mt25 flex ai-c jc-sb">
<view class="flex ai-c"> <view class="flex ai-c">
@ -57,7 +60,7 @@
</view> </view>
</view> </view>
</view> </view>
<view class="study"> <view class="study" @tap="to500(item)">
去学习 去学习
</view> </view>
</view> </view>
@ -73,7 +76,7 @@
</view> </view>
</view> </view>
</view> </view>
<view class="study"> <view class="study" @tap="toRealExam(item)">
去学习 去学习
</view> </view>
</view> </view>
@ -89,7 +92,7 @@
</view> </view>
</view> </view>
</view> </view>
<view class="study"> <view class="study" @tap="toSpecExam(item)">
去学习 去学习
</view> </view>
</view> </view>
@ -104,7 +107,7 @@
<image src="../../static/image/index/index_bg.png" mode="widthFix" style="flex: 1;border-radius: 33rpx;"></image> <image src="../../static/image/index/index_bg.png" mode="widthFix" style="flex: 1;border-radius: 33rpx;"></image>
<view class="ml18 text-center"> <view class="ml18 text-center">
<u-button :customStyle="{width:'200rpx',height:'66rpx',borderRadius: '33rpx'}" iconColor="#fff" <u-button :customStyle="{width:'200rpx',height:'66rpx',borderRadius: '33rpx'}" iconColor="#fff"
text="去看视频" color="linear-gradient(90deg, #E66501 0%, #F8A42C 100%)" icon="play-circle"> text="去看视频" color="linear-gradient(90deg, #E66501 0%, #F8A42C 100%)" icon="play-circle" @click="toPlaceLive(item)">
</u-button> </u-button>
<view class="cor-333 fs15 mt17">真实考场模拟</view> <view class="cor-333 fs15 mt17">真实考场模拟</view>
</view> </view>
@ -120,24 +123,92 @@
</template> </template>
<script> <script>
import useUserStore from '@/jtools/store/user'
export default { export default {
computed: {
vipAllList() {
return useUserStore().vipAllList.filter(it=>[1,2,3,4].includes(Number(it.subjects)))
},
vipOnList() {
return useUserStore().vipOnList
},
},
data() { data() {
return { return {
list: [{
name: '科一'
}, {
name: '科二'
}, {
name: '科三'
}, {
name: '科四'
}],
current: 0 current: 0
} }
}, },
methods: { methods: {
onChange(e) { onChange(e) {
this.current = e.detail.current this.current = e.detail.current
},
getKmTitle(km) {
return {
'1': '科一',
'2': '科二',
'3': '科三',
'4': '科四',
}[km]
},
getExpireText(item) {
const vipOn = this.vipOnList.find(it => it.memberId == item.memberId)
if(vipOn) {
return `${vipOn.endDate.split(' ')[0]}到期`
} else {
return '开通vip助您快速拿证'
}
},
vipHasOpened(item) {
return !!this.vipOnList.find(it => it.memberId == item.memberId)
},
// 500 item=> vip
to500(item) {
// vip
if(this.vipHasOpened(item)) {
//
} else {
uni.showToast({
title: `请先充值${this.getKmTitle(item.subjects)}vip`,
icon: 'none'
})
}
},
// item=> vip
toRealExam(item) {
// vip
if(this.vipHasOpened(item)) {
//
} else {
uni.showToast({
title: `请先充值${this.getKmTitle(item.subjects)}vip`,
icon: 'none'
})
}
},
// item=> vip
toSpecExam(item) {
// vip
if(this.vipHasOpened(item)) {
//
} else {
uni.showToast({
title: `请先充值${this.getKmTitle(item.subjects)}vip`,
icon: 'none'
})
}
},
// item=> vip
toPlaceLive(item) {
// vip
if(this.vipHasOpened(item)) {
//
} else {
uni.showToast({
title: `请先充值${this.getKmTitle(item.subjects)}vip`,
icon: 'none'
})
}
} }
} }
} }
@ -203,6 +274,21 @@
font-size: 12px; font-size: 12px;
color: #F6E99F; color: #F6E99F;
} }
.buy {
position: absolute;
left: 45%;
transform: translateX(-50%);
bottom: 15px;
display: flex;
align-items: center;
justify-content: center;
width: 200rpx;
height: 60rpx;
background: #873E1D;
border-radius: 30rpx;
font-size: 14px;
color: #F6E99F;
}
.study { .study {
display: flex; display: flex;

Loading…
Cancel
Save